Browse Source

Refactor resource creation in resources exec test (#3349)

Various resources have been created inconsistently with the shader
representation. After running out of bandaids, this refactors that code
to give the caller the tools necessary to create the resources
correctly.
Greg Roth 4 years ago
parent
commit
cb3b54fdc8
1 changed files with 114 additions and 43 deletions
  1. 114 43
      tools/clang/unittests/HLSL/ExecutionTest.cpp

+ 114 - 43
tools/clang/unittests/HLSL/ExecutionTest.cpp

@@ -969,57 +969,119 @@ public:
     *ppSampHeap = pSampHeap;
     *ppSampHeap = pSampHeap;
   }
   }
 
 
-  // Create Resource views for <pDevice> given the SRV and UAV information provided
-  // using some reasonable defaults
-  void CreateDefaultResourceViews(ID3D12Device *pDevice, D3D12_CPU_DESCRIPTOR_HANDLE heapStart,
-                                  int numElements,
-                                  const CComPtr<ID3D12Resource> pSRVResources[], int NumSRVs,
-                                  const CComPtr<ID3D12Resource> pUAVResources[], int NumUAVs) {
-
-    CD3DX12_CPU_DESCRIPTOR_HANDLE baseHandle(heapStart);
+  void CreateSRV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &baseHandle,
+                 DXGI_FORMAT format, D3D12_SRV_DIMENSION viewDimension, UINT numElements, UINT stride,
+                 const CComPtr<ID3D12Resource> pResource) {
     UINT descriptorSize = pDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
     UINT descriptorSize = pDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
-
-    // Create SRVs
+    // Create SRV
     D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
     D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
-    srvDesc.Format = DXGI_FORMAT_UNKNOWN;
-    srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
+    srvDesc.Format = format;
+    srvDesc.ViewDimension = viewDimension;
     srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
     srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
-    srvDesc.Buffer.FirstElement = 0;
-    srvDesc.Buffer.NumElements = numElements;
-    srvDesc.Buffer.StructureByteStride = sizeof(float);
-    for (int i = 0; i < NumSRVs - 1; i++) {
-      pDevice->CreateShaderResourceView(pSRVResources[i], &srvDesc, baseHandle);
-      baseHandle = baseHandle.Offset(descriptorSize);
+    switch (viewDimension) {
+    case D3D12_SRV_DIMENSION_BUFFER:
+      srvDesc.Buffer.FirstElement = 0;
+      srvDesc.Buffer.NumElements = numElements;
+      srvDesc.Buffer.StructureByteStride = stride;
+      if (format == DXGI_FORMAT_R32_TYPELESS && stride == 0)
+        srvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_RAW;
+      else
+        srvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;
+      break;
+    case D3D12_SRV_DIMENSION_TEXTURE1D:
+      srvDesc.Texture1D.MostDetailedMip = 0;
+      srvDesc.Texture1D.MipLevels = 1;
+      srvDesc.Texture1D.ResourceMinLODClamp = 0;
+      break;
+    case D3D12_SRV_DIMENSION_TEXTURE2D:
+      srvDesc.Texture2D.MostDetailedMip = 0;
+      srvDesc.Texture2D.MipLevels = 1;
+      srvDesc.Texture2D.PlaneSlice = 0;
+      srvDesc.Texture2D.ResourceMinLODClamp = 0;
+      break;
     }
     }
+    pDevice->CreateShaderResourceView(pResource, &srvDesc, baseHandle);
+    baseHandle.Offset(descriptorSize);
+  }
+
 
 
-    srvDesc.Format = DXGI_FORMAT_R32_FLOAT;
-    srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
-    srvDesc.Texture2D.MostDetailedMip = 0;
-    srvDesc.Texture2D.MipLevels = 1;
-    srvDesc.Texture2D.PlaneSlice = 0;
-    srvDesc.Texture2D.ResourceMinLODClamp = 0;
-    pDevice->CreateShaderResourceView(pSRVResources[NumSRVs - 1], &srvDesc, baseHandle);
-    baseHandle = baseHandle.Offset(descriptorSize);
+  void CreateRawSRV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                    UINT numElements, const CComPtr<ID3D12Resource> pResource) {
+    CreateSRV(pDevice, heapStart, DXGI_FORMAT_R32_TYPELESS, D3D12_SRV_DIMENSION_BUFFER, numElements, 0, pResource);
+  }
+
+  void CreateStructSRV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                       UINT numElements, UINT stride, const CComPtr<ID3D12Resource> pResource) {
+    CreateSRV(pDevice, heapStart, DXGI_FORMAT_UNKNOWN, D3D12_SRV_DIMENSION_BUFFER, numElements, stride, pResource);
+  }
+
+  void CreateTypedSRV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                      UINT numElements, DXGI_FORMAT format, const CComPtr<ID3D12Resource> pResource) {
+    CreateSRV(pDevice, heapStart, format, D3D12_SRV_DIMENSION_BUFFER, numElements, 0, pResource);
+  }
+
+  void CreateTex1DSRV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                      UINT numElements, DXGI_FORMAT format, const CComPtr<ID3D12Resource> pResource) {
+    CreateSRV(pDevice, heapStart, format, D3D12_SRV_DIMENSION_TEXTURE1D, numElements, 0, pResource);
+  }
+
+  void CreateTex2DSRV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                      UINT numElements, DXGI_FORMAT format, const CComPtr<ID3D12Resource> pResource) {
+    CreateSRV(pDevice, heapStart, format, D3D12_SRV_DIMENSION_TEXTURE2D, numElements, 0, pResource);
+  }
 
 
-    // Create UAVs
+  void CreateUAV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &baseHandle,
+                 DXGI_FORMAT format, D3D12_UAV_DIMENSION viewDimension, UINT numElements, UINT stride,
+                 const CComPtr<ID3D12Resource> pResource) {
+    UINT descriptorSize = pDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
     D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {};
     D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {};
-    uavDesc.Format = DXGI_FORMAT_UNKNOWN;
-    uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
-    uavDesc.Buffer.FirstElement = 0;
-    uavDesc.Buffer.NumElements = numElements;
-    uavDesc.Buffer.StructureByteStride = sizeof(float);
-    uavDesc.Buffer.CounterOffsetInBytes = 0;
-    uavDesc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
-    for (int i = 0; i < NumUAVs - 1; i++) {
-      pDevice->CreateUnorderedAccessView(pUAVResources[i], nullptr, &uavDesc, baseHandle);
-      baseHandle = baseHandle.Offset(descriptorSize);
+    uavDesc.Format = format;
+    uavDesc.ViewDimension = viewDimension;
+    switch (viewDimension) {
+    case D3D12_UAV_DIMENSION_BUFFER:
+      uavDesc.Buffer.FirstElement = 0;
+      uavDesc.Buffer.NumElements = numElements;
+      uavDesc.Buffer.StructureByteStride = stride;
+      if (format == DXGI_FORMAT_R32_TYPELESS && stride == 0)
+        uavDesc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_RAW;
+      else
+        uavDesc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
+      break;
+    case D3D12_UAV_DIMENSION_TEXTURE1D:
+      uavDesc.Texture1D.MipSlice = 0;
+      break;
+    case D3D12_UAV_DIMENSION_TEXTURE2D:
+      uavDesc.Texture2D.MipSlice = 0;
+      uavDesc.Texture2D.PlaneSlice = 0;
+      break;
     }
     }
+    pDevice->CreateUnorderedAccessView(pResource, nullptr, &uavDesc, baseHandle);
+    baseHandle.Offset(descriptorSize);
+  }
 
 
-    uavDesc.Format = DXGI_FORMAT_R32_FLOAT;
-    uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1D;
-    uavDesc.Texture1D.MipSlice = 0;
-    pDevice->CreateUnorderedAccessView(pUAVResources[NumUAVs - 1], nullptr, &uavDesc, baseHandle);
+  void CreateRawUAV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                    UINT numElements, const CComPtr<ID3D12Resource> pResource) {
+    CreateUAV(pDevice, heapStart, DXGI_FORMAT_R32_TYPELESS, D3D12_UAV_DIMENSION_BUFFER, numElements, 0, pResource);
+  }
 
 
+  void CreateStructUAV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                       UINT numElements, UINT stride, const CComPtr<ID3D12Resource> pResource) {
+    CreateUAV(pDevice, heapStart, DXGI_FORMAT_UNKNOWN, D3D12_UAV_DIMENSION_BUFFER, numElements, stride, pResource);
+  }
+
+  void CreateTypedUAV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                      UINT numElements, DXGI_FORMAT format, const CComPtr<ID3D12Resource> pResource) {
+    CreateUAV(pDevice, heapStart, format, D3D12_UAV_DIMENSION_BUFFER, numElements, 0, pResource);
+  }
+
+  void CreateTex1DUAV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                      UINT numElements, DXGI_FORMAT format, const CComPtr<ID3D12Resource> pResource) {
+    CreateUAV(pDevice, heapStart, format, D3D12_UAV_DIMENSION_TEXTURE1D, numElements, 0, pResource);
+  }
+
+  void CreateTex2DUAV(ID3D12Device *pDevice, CD3DX12_CPU_DESCRIPTOR_HANDLE &heapStart,
+                 UINT numElements, DXGI_FORMAT format, const CComPtr<ID3D12Resource> pResource) {
+    CreateUAV(pDevice, heapStart, format, D3D12_UAV_DIMENSION_TEXTURE2D, numElements, 0, pResource);
   }
   }
 
 
   // Create Samplers for <pDevice> given the filter and border color information provided
   // Create Samplers for <pDevice> given the filter and border color information provided
@@ -8040,8 +8102,17 @@ void ExecutionTest::RunResourceTest(ID3D12Device *pDevice, const char *pShader,
       pCommandList->SetComputeRootDescriptorTable(1, pSampHeap->GetGPUDescriptorHandleForHeapStart());
       pCommandList->SetComputeRootDescriptorTable(1, pSampHeap->GetGPUDescriptorHandleForHeapStart());
     }
     }
   }
   }
-  CreateDefaultResourceViews(pDevice, pResHeap->GetCPUDescriptorHandleForHeapStart(), valueSize,
-                             pSRVResources, NumSRVs, pUAVResources, NumUAVs);
+  CD3DX12_CPU_DESCRIPTOR_HANDLE baseHandle(pResHeap->GetCPUDescriptorHandleForHeapStart());
+  // Create SRVs
+  CreateRawSRV(pDevice, baseHandle, valueSize, pSRVResources[0]);
+  CreateStructSRV(pDevice, baseHandle, valueSize, sizeof(float), pSRVResources[1]);
+  CreateTex2DSRV(pDevice, baseHandle, valueSize, DXGI_FORMAT_R32_FLOAT, pSRVResources[2]);
+  // Create UAVs
+  CreateRawUAV(pDevice, baseHandle, valueSize, pUAVResources[0]);
+  CreateStructUAV(pDevice, baseHandle, valueSize, sizeof(float), pUAVResources[1]);
+  CreateTypedUAV(pDevice, baseHandle, valueSize, DXGI_FORMAT_R32_FLOAT, pUAVResources[2]);
+  CreateTex1DUAV(pDevice, baseHandle, valueSize, DXGI_FORMAT_R32_FLOAT, pUAVResources[3]);
+
   D3D12_FILTER filters[] = {D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT, D3D12_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT};
   D3D12_FILTER filters[] = {D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT, D3D12_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT};
   float borderColors[] = {30.0, 31.0};
   float borderColors[] = {30.0, 31.0};
   CreateDefaultSamplers(pDevice, pSampHeap->GetCPUDescriptorHandleForHeapStart(),
   CreateDefaultSamplers(pDevice, pSampHeap->GetCPUDescriptorHandleForHeapStart(),