Browse Source

Fixes failures in two execution tests that used SRVs (#1175)

Longform explanation:
Views/descriptors over resources may specify some non-default properties.

The prior implementation was trying to check values and infer whether
they had been set or were forcibly needed. For starters, this wasn't
always properly initialized, so results were not consistent. Guessing
at this point is a bad idea in any case, so the new implementation
keeps track of whether anything was in fact specified (and if so, values
should have been initialized by the reader, although that is still WIP
for some cases).
Marcelo Lopez Ruiz 7 years ago
parent
commit
8e71204325

+ 16 - 11
tools/clang/unittests/HLSL/ShaderOpTest.cpp

@@ -321,8 +321,7 @@ void ShaderOpTest::CreateDescriptorHeaps() {
       }
       else if (0 == _stricmp(D.Kind, "SRV")) {
         D3D12_SHADER_RESOURCE_VIEW_DESC *pSrvDesc = nullptr;
-        if (D.SrvDesc.Format != DXGI_FORMAT_UNKNOWN ||
-            D.SrvDesc.ViewDimension == D3D12_SRV_DIMENSION_BUFFER) {
+        if (D.SrvDescPresent) {
           pSrvDesc = &D.SrvDesc;
         }
         m_pDevice->CreateShaderResourceView(Data.Resource, pSrvDesc, cpuHandle);
@@ -1534,16 +1533,16 @@ HRESULT ShaderOpParser::ReadAttrUINT64(IXmlReader *pReader, LPCWSTR pAttrName, U
 
 HRESULT ShaderOpParser::ReadAttrUINT(IXmlReader *pReader, LPCWSTR pAttrName, UINT *pValue, UINT defaultValue) {
   UINT64 u64;
-  CHECK_HR(ReadAttrUINT64(pReader, pAttrName, &u64, defaultValue));
+  HRESULT hrRead = CHECK_HR_RET(ReadAttrUINT64(pReader, pAttrName, &u64, defaultValue));
   CHECK_HR(UInt64ToUInt(u64, pValue));
-  return S_OK;
+  return hrRead;
 }
 
 HRESULT ShaderOpParser::ReadAttrUINT16(IXmlReader *pReader, LPCWSTR pAttrName, UINT16 *pValue, UINT16 defaultValue) {
   UINT64 u64;
-  CHECK_HR(ReadAttrUINT64(pReader, pAttrName, &u64, defaultValue));
+  HRESULT hrRead = CHECK_HR_RET(ReadAttrUINT64(pReader, pAttrName, &u64, defaultValue));
   CHECK_HR(UInt64ToUInt16(u64, pValue));
-  return S_OK;
+  return hrRead;
 }
 
 void ShaderOpParser::ReadElementContentStr(IXmlReader *pReader, LPCSTR *ppValue) {
@@ -1577,6 +1576,7 @@ void ShaderOpParser::ParseDescriptor(IXmlReader *pReader, ShaderOpDescriptor *pD
   CHECK_HR(ReadAttrStr(pReader, L"CounterName", &pDesc->CounterName));
   CHECK_HR(ReadAttrStr(pReader, L"Kind", &pDesc->Kind));
   bool isSRV = pDesc->Kind && 0 == _stricmp(pDesc->Kind, "SRV");
+  pDesc->SrvDescPresent = false;
   DXGI_FORMAT *pFormat;
   if (isSRV) {
     // D3D12_SHADER_RESOURCE_VIEW_DESC
@@ -1590,20 +1590,25 @@ void ShaderOpParser::ParseDescriptor(IXmlReader *pReader, ShaderOpDescriptor *pD
   CHECK_HR(hrFormat);
   if (isSRV) {
     pDesc->SrvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
-    CHECK_HR(ReadAttrSRV_DIMENSION(pReader, L"Dimension", &pDesc->SrvDesc.ViewDimension));
+    pDesc->SrvDescPresent |= S_OK ==
+      CHECK_HR_RET(ReadAttrSRV_DIMENSION(pReader, L"Dimension", &pDesc->SrvDesc.ViewDimension));
     switch (pDesc->SrvDesc.ViewDimension) {
     case D3D12_SRV_DIMENSION_BUFFER:
-      CHECK_HR(ReadAttrUINT64(pReader, L"FirstElement", &pDesc->SrvDesc.Buffer.FirstElement));
+      pDesc->SrvDescPresent |= S_OK ==
+        CHECK_HR_RET(ReadAttrUINT64(pReader, L"FirstElement", &pDesc->SrvDesc.Buffer.FirstElement));
       LPCSTR pFlags;
-      CHECK_HR(ReadAttrStr(pReader, L"Flags", &pFlags));
+      pDesc->SrvDescPresent |= S_OK ==
+        CHECK_HR_RET(ReadAttrStr(pReader, L"Flags", &pFlags));
       if (pFlags && *pFlags && 0 == _stricmp(pFlags, "RAW")) {
         pDesc->SrvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_RAW;
       }
       else {
         pDesc->SrvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;
       }
-      CHECK_HR(ReadAttrUINT(pReader, L"NumElements", &pDesc->SrvDesc.Buffer.NumElements));
-      CHECK_HR(ReadAttrUINT(pReader, L"StructureByteStride", &pDesc->SrvDesc.Buffer.StructureByteStride));
+      pDesc->SrvDescPresent |= S_OK ==
+        CHECK_HR_RET(ReadAttrUINT(pReader, L"NumElements", &pDesc->SrvDesc.Buffer.NumElements));
+      pDesc->SrvDescPresent |= S_OK ==
+        CHECK_HR_RET(ReadAttrUINT(pReader, L"StructureByteStride", &pDesc->SrvDesc.Buffer.StructureByteStride));
       break;
     default:
       CHECK_HR(E_NOTIMPL);

+ 1 - 0
tools/clang/unittests/HLSL/ShaderOpTest.h

@@ -120,6 +120,7 @@ public:
   LPCSTR  Kind;         // One of UAV,SRV,CBV
   // Other fields to customize mapping can be added here.
   D3D12_SHADER_RESOURCE_VIEW_DESC   SrvDesc;
+  bool                              SrvDescPresent;
   D3D12_UNORDERED_ACCESS_VIEW_DESC  UavDesc;
 };