Browse Source

Fix header/reflection for RTAS/FeedbackTexture (#2549)

- Make header no longer conflict with officially added shader input types
- Replace uses with last enum +1/+2 to make compatible with prev SDKs
- Add reflection Test for FeedbackTexture2D[Array]
Tex Riddell 5 years ago
parent
commit
0513758aee

+ 0 - 4
include/dxc/dxcapi.h

@@ -299,10 +299,6 @@ IDxcAssembler : public IUnknown {
   DECLARE_CROSS_PLATFORM_UUIDOF(IDxcAssembler)
 };
 
-// D3D_SIT_RTACCELERATIONSTRUCTURE is an additional value for D3D_SHADER_INPUT_TYPE,
-// in order to fit it in to ID3D12LibraryReflection.
-static const UINT32 D3D_SIT_RTACCELERATIONSTRUCTURE = 12; // (D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER + 1)
-
 struct __declspec(uuid("d2c21b26-8350-4bdc-976a-331ce6f4c54c"))
 IDxcContainerReflection : public IUnknown {
   virtual HRESULT STDMETHODCALLTYPE Load(_In_ IDxcBlob *pContainer) = 0; // Container to load.

+ 6 - 1
lib/HLSL/DxilContainerReflection.cpp

@@ -1394,7 +1394,10 @@ static D3D_SHADER_INPUT_TYPE ResourceToShaderInputType(DxilResourceBase *RB) {
   case DxilResource::Kind::TextureCubeArray:
     return isUAV ? D3D_SIT_UAV_RWTYPED : D3D_SIT_TEXTURE;
   case DxilResource::Kind::RTAccelerationStructure:
-    return (D3D_SHADER_INPUT_TYPE)D3D_SIT_RTACCELERATIONSTRUCTURE;
+    return (D3D_SHADER_INPUT_TYPE)(D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER + 1);  // D3D_SIT_RTACCELERATIONSTRUCTURE
+  case DxilResource::Kind::FeedbackTexture2D:
+  case DxilResource::Kind::FeedbackTexture2DArray:
+    return (D3D_SHADER_INPUT_TYPE)(D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER + 2);  // D3D_SIT_UAV_FEEDBACKTEXTURE
   default:
     return (D3D_SHADER_INPUT_TYPE)-1;
   }
@@ -1431,8 +1434,10 @@ static D3D_SRV_DIMENSION ResourceToDimension(DxilResourceBase *RB) {
   case DxilResource::Kind::Texture1DArray:
     return D3D_SRV_DIMENSION_TEXTURE1DARRAY;
   case DxilResource::Kind::Texture2D:
+  case DxilResource::Kind::FeedbackTexture2D:
     return D3D_SRV_DIMENSION_TEXTURE2D;
   case DxilResource::Kind::Texture2DArray:
+  case DxilResource::Kind::FeedbackTexture2DArray:
     return D3D_SRV_DIMENSION_TEXTURE2DARRAY;
   case DxilResource::Kind::Texture2DMS:
     return D3D_SRV_DIMENSION_TEXTURE2DMS;

+ 112 - 0
tools/clang/test/HLSLFileCheck/hlsl/objects/FeedbackTexture/feedback-reflect.hlsl

@@ -0,0 +1,112 @@
+// RUN: %dxc -E main -T ps_6_5 %s | %D3DReflect %s | FileCheck %s
+
+// Test reflection for FeedbackTexture2D[Array]
+
+FeedbackTexture2D<SAMPLER_FEEDBACK_MIN_MIP> feedbackMinMip;
+FeedbackTexture2D<SAMPLER_FEEDBACK_MIP_REGION_USED> feedbackMipRegionUsed;
+FeedbackTexture2DArray<SAMPLER_FEEDBACK_MIN_MIP> feedbackMinMipArray;
+FeedbackTexture2DArray<SAMPLER_FEEDBACK_MIP_REGION_USED> feebackMipRegionUsedArray;
+Texture2D<float> texture2D;
+Texture2DArray<float> texture2DArray;
+SamplerState samp;
+
+float main() : SV_Target
+{
+    float2 coords2D = float2(1, 2);
+    float3 coords2DArray = float3(1, 2, 3);
+    float clamp = 4;
+    float bias = 0.5F;
+    float lod = 6;
+    float2 ddx = float2(1.0F / 32, 2.0F / 32);
+    float2 ddy = float2(3.0F / 32, 4.0F / 32);
+
+    float idx = 0;  // Make each coord set unique
+    
+    feedbackMinMip.WriteSamplerFeedback(texture2D, samp, coords2D + (10 * idx++), clamp);
+    feedbackMipRegionUsed.WriteSamplerFeedback(texture2D, samp, coords2D + (10 * idx++));
+    feedbackMinMipArray.WriteSamplerFeedback(texture2DArray, samp, coords2DArray + (10 * idx++));
+    feebackMipRegionUsedArray.WriteSamplerFeedback(texture2DArray, samp, coords2DArray + (10 * idx++));
+
+    return 0;
+}
+
+// CHECK: ID3D12ShaderReflection:
+// CHECK-NEXT:   D3D12_SHADER_BUFFER_DESC:
+// CHECK-NEXT:     Shader Version: Pixel 6.5
+// CHECK-NEXT:     Creator: <nullptr>
+// CHECK-NEXT:     Flags: 0
+// CHECK-NEXT:     ConstantBuffers: 0
+// CHECK-NEXT:     BoundResources: 7
+// CHECK-NEXT:     InputParameters: 0
+// CHECK-NEXT:     OutputParameters: 1
+// CHECK-NEXT:   Bound Resources:
+// CHECK-NEXT:     D3D12_SHADER_BUFFER_DESC: Name: samp
+// CHECK-NEXT:       Type: D3D_SIT_SAMPLER
+// CHECK-NEXT:       uID: 0
+// CHECK-NEXT:       BindCount: 1
+// CHECK-NEXT:       BindPoint: 0
+// CHECK-NEXT:       Space: 0
+// CHECK-NEXT:       ReturnType: <unknown: 0>
+// CHECK-NEXT:       Dimension: D3D_SRV_DIMENSION_UNKNOWN
+// CHECK-NEXT:       NumSamples (or stride): 0
+// CHECK-NEXT:       uFlags: 0
+// CHECK-NEXT:     D3D12_SHADER_BUFFER_DESC: Name: texture2D
+// CHECK-NEXT:       Type: D3D_SIT_TEXTURE
+// CHECK-NEXT:       uID: 0
+// CHECK-NEXT:       BindCount: 1
+// CHECK-NEXT:       BindPoint: 0
+// CHECK-NEXT:       Space: 0
+// CHECK-NEXT:       ReturnType: D3D_RETURN_TYPE_FLOAT
+// CHECK-NEXT:       Dimension: D3D_SRV_DIMENSION_TEXTURE2D
+// CHECK-NEXT:       NumSamples (or stride): 4294967295
+// CHECK-NEXT:       uFlags: 0
+// CHECK-NEXT:     D3D12_SHADER_BUFFER_DESC: Name: texture2DArray
+// CHECK-NEXT:       Type: D3D_SIT_TEXTURE
+// CHECK-NEXT:       uID: 1
+// CHECK-NEXT:       BindCount: 1
+// CHECK-NEXT:       BindPoint: 1
+// CHECK-NEXT:       Space: 0
+// CHECK-NEXT:       ReturnType: D3D_RETURN_TYPE_FLOAT
+// CHECK-NEXT:       Dimension: D3D_SRV_DIMENSION_TEXTURE2DARRAY
+// CHECK-NEXT:       NumSamples (or stride): 4294967295
+// CHECK-NEXT:       uFlags: 0
+// CHECK-NEXT:     D3D12_SHADER_BUFFER_DESC: Name: feedbackMinMip
+// CHECK-NEXT:       Type: D3D_SIT_UAV_FEEDBACKTEXTURE
+// CHECK-NEXT:       uID: 0
+// CHECK-NEXT:       BindCount: 1
+// CHECK-NEXT:       BindPoint: 0
+// CHECK-NEXT:       Space: 0
+// CHECK-NEXT:       ReturnType: D3D_RETURN_TYPE_MIXED
+// CHECK-NEXT:       Dimension: D3D_SRV_DIMENSION_TEXTURE2D
+// CHECK-NEXT:       NumSamples (or stride): 4294967295
+// CHECK-NEXT:       uFlags: 0
+// CHECK-NEXT:     D3D12_SHADER_BUFFER_DESC: Name: feedbackMipRegionUsed
+// CHECK-NEXT:       Type: D3D_SIT_UAV_FEEDBACKTEXTURE
+// CHECK-NEXT:       uID: 1
+// CHECK-NEXT:       BindCount: 1
+// CHECK-NEXT:       BindPoint: 1
+// CHECK-NEXT:       Space: 0
+// CHECK-NEXT:       ReturnType: D3D_RETURN_TYPE_MIXED
+// CHECK-NEXT:       Dimension: D3D_SRV_DIMENSION_TEXTURE2D
+// CHECK-NEXT:       NumSamples (or stride): 4294967295
+// CHECK-NEXT:       uFlags: 0
+// CHECK-NEXT:     D3D12_SHADER_BUFFER_DESC: Name: feedbackMinMipArray
+// CHECK-NEXT:       Type: D3D_SIT_UAV_FEEDBACKTEXTURE
+// CHECK-NEXT:       uID: 2
+// CHECK-NEXT:       BindCount: 1
+// CHECK-NEXT:       BindPoint: 2
+// CHECK-NEXT:       Space: 0
+// CHECK-NEXT:       ReturnType: D3D_RETURN_TYPE_MIXED
+// CHECK-NEXT:       Dimension: D3D_SRV_DIMENSION_TEXTURE2DARRAY
+// CHECK-NEXT:       NumSamples (or stride): 4294967295
+// CHECK-NEXT:       uFlags: 0
+// CHECK-NEXT:     D3D12_SHADER_BUFFER_DESC: Name: feebackMipRegionUsedArray
+// CHECK-NEXT:       Type: D3D_SIT_UAV_FEEDBACKTEXTURE
+// CHECK-NEXT:       uID: 3
+// CHECK-NEXT:       BindCount: 1
+// CHECK-NEXT:       BindPoint: 3
+// CHECK-NEXT:       Space: 0
+// CHECK-NEXT:       ReturnType: D3D_RETURN_TYPE_MIXED
+// CHECK-NEXT:       Dimension: D3D_SRV_DIMENSION_TEXTURE2DARRAY
+// CHECK-NEXT:       NumSamples (or stride): 4294967295
+// CHECK-NEXT:       uFlags: 0

+ 2 - 1
tools/clang/unittests/HLSL/D3DReflectionDumper.cpp

@@ -58,7 +58,8 @@ LPCSTR ToString(D3D_SHADER_INPUT_TYPE Type) {
   case D3D_SIT_UAV_APPEND_STRUCTURED: return "D3D_SIT_UAV_APPEND_STRUCTURED";
   case D3D_SIT_UAV_CONSUME_STRUCTURED: return "D3D_SIT_UAV_CONSUME_STRUCTURED";
   case D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER: return "D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER";
-  case D3D_SIT_RTACCELERATIONSTRUCTURE: return "D3D_SIT_RTACCELERATIONSTRUCTURE";
+  case (D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER + 1): return "D3D_SIT_RTACCELERATIONSTRUCTURE";
+  case (D3D_SIT_UAV_RWSTRUCTURED_WITH_COUNTER + 2): return "D3D_SIT_UAV_FEEDBACKTEXTURE";
   default: return nullptr;
   }
 }