瀏覽代碼

Merged PR 67: Fix reflection of raytracing acceleration structure resource.

Tex Riddell 7 年之前
父節點
當前提交
912e1bc819

+ 4 - 0
include/dxc/dxcapi.h

@@ -271,6 +271,10 @@ IDxcAssembler : public IUnknown {
     ) = 0;
 };
 
+// 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.

+ 5 - 2
lib/HLSL/DxilContainerReflection.cpp

@@ -1236,8 +1236,10 @@ static D3D_SHADER_INPUT_TYPE ResourceToShaderInputType(DxilResourceBase *RB) {
   case DxilResource::Kind::TextureCube:
   case DxilResource::Kind::TextureCubeArray:
     return R->IsRW() ? D3D_SIT_UAV_RWTYPED : D3D_SIT_TEXTURE;
+  case DxilResource::Kind::RTAccelerationStructure:
+    return (D3D_SHADER_INPUT_TYPE)D3D_SIT_RTACCELERATIONSTRUCTURE;
   default:
-    return (D3D_SHADER_INPUT_TYPE)0;
+    return (D3D_SHADER_INPUT_TYPE)-1;
   }
 }
 
@@ -2258,7 +2260,7 @@ void DxilLibraryReflection::AddResourceDependencies() {
   }
   UINT resIndex = 0;
   for (auto &resource : m_Resources) {
-    switch (resource.Type) {
+    switch ((UINT32)resource.Type) {
     case D3D_SIT_CBUFFER:
       AddResourceUseToFunctions(m_pDxilModule->GetCBuffer(resource.uID), resIndex);
       break;
@@ -2266,6 +2268,7 @@ void DxilLibraryReflection::AddResourceDependencies() {
     case D3D_SIT_TEXTURE:
     case D3D_SIT_STRUCTURED:
     case D3D_SIT_BYTEADDRESS:
+    case D3D_SIT_RTACCELERATIONSTRUCTURE:
       AddResourceUseToFunctions(m_pDxilModule->GetSRV(resource.uID), resIndex);
       break;
     case D3D_SIT_UAV_RWTYPED:

+ 49 - 0
tools/clang/test/CodeGenHLSL/quick-test/d3dreflect/raytracing_traceray.hlsl

@@ -0,0 +1,49 @@
+// RUN: %dxc -T lib_6_3 %s | %D3DReflect %s | FileCheck %s
+
+struct Payload {
+   float2 t;
+   int3 t2;
+};
+
+RaytracingAccelerationStructure Acc;
+
+uint RayFlags;
+uint InstanceInclusionMask;
+uint RayContributionToHitGroupIndex;
+uint MultiplierForGeometryContributionToHitGroupIndex;
+uint MissShaderIndex;
+
+
+float4 emit(inout float2 f2, RayDesc Ray:R, inout Payload p )  {
+  TraceRay(Acc,RayFlags,InstanceInclusionMask,
+           RayContributionToHitGroupIndex,
+           MultiplierForGeometryContributionToHitGroupIndex,MissShaderIndex, Ray, p);
+
+   return 2.6;
+}
+
+
+
+// CHECK: ID3D12LibraryReflection:
+// CHECK:   D3D12_LIBRARY_DESC:
+// CHECK:     Flags: 0
+// CHECK:     FunctionCount: 1
+// CHECK:   ID3D12FunctionReflection:
+// CHECK:     D3D12_FUNCTION_DESC: Name: \01?emit@@YA?AV?$vector@M$03@@AIAV?$vector@M$01@@URayDesc@@UPayload@@@Z
+// CHECK:       Shader Version: Library 6.3
+// CHECK:       Flags: 0
+// CHECK:       ConstantBuffers: 1
+// CHECK:       BoundResources: 2
+// CHECK:       FunctionParameterCount: 0
+// CHECK:       HasReturn: FALSE
+// CHECK:     Bound Resources:
+// CHECK:       D3D12_SHADER_BUFFER_DESC: Name: Acc
+// CHECK:         Type: D3D_SIT_RTACCELERATIONSTRUCTURE
+// CHECK:         uID: 0
+// CHECK:         BindCount: 1
+// CHECK:         BindPoint: 4294967295
+// CHECK:         Space: 0
+// CHECK:         ReturnType: D3D_RETURN_TYPE_SINT
+// CHECK:         Dimension: D3D_SRV_DIMENSION_UNKNOWN
+// CHECK:         NumSamples (or stride): 4294967295
+// CHECK:         uFlags: 0

+ 64 - 0
tools/clang/test/CodeGenHLSL/quick-test/d3dreflect/raytracing_traceray_readback.hlsl

@@ -0,0 +1,64 @@
+// RUN: %dxc -T lib_6_3 %s | %D3DReflect %s | FileCheck %s
+
+struct Payload {
+   float4 abc;
+   float4 color;
+};
+
+RWTexture2D<float4> RTOutput : register(u0);
+RaytracingAccelerationStructure scene : register(t0);
+
+int2 viewportDims;
+float3 invView[4];
+float tanHalfFovY;
+
+[shader("raygeneration")]
+void RayGenTestMain()
+{
+    uint2 LaunchIndex = DispatchRaysIndex();
+    float2 d = ((LaunchIndex.xy / (float2)viewportDims) * 2.f - 1.f);
+    float aspectRatio = (float)viewportDims.x / (float)viewportDims.y;
+
+    RayDesc ray;
+    ray.Origin = invView[3].xyz;
+    ray.Direction = normalize((d.x * invView[0].xyz * tanHalfFovY * aspectRatio) + (-d.y * invView[1].xyz * tanHalfFovY) - invView[2].xyz);
+    ray.TMin = 0;
+    ray.TMax = 100000;
+
+    Payload payload;
+    payload.color = float4(0.0f, 1.0f, 0.0f, 1.0f);
+    TraceRay(scene, 0 /*rayFlags*/, 0xFF /*rayMask*/, 0 /*sbtRecordOffset*/, 1 /*sbtRecordStride*/, 0 /*missIndex*/, ray, payload);
+    RTOutput[LaunchIndex.xy] = payload.color;
+}
+
+
+// CHECK: ID3D12LibraryReflection:
+// CHECK:   D3D12_LIBRARY_DESC:
+// CHECK:     Flags: 0
+// CHECK:     FunctionCount: 1
+// CHECK:   ID3D12FunctionReflection:
+// CHECK:     D3D12_FUNCTION_DESC: Name: \01?RayGenTestMain@@YAXXZ
+// CHECK:       Shader Version: RayGeneration 6.3
+// CHECK:       Flags: 0
+// CHECK:       ConstantBuffers: 1
+// CHECK:       BoundResources: 3
+// CHECK:       FunctionParameterCount: 0
+// CHECK:       HasReturn: FALSE
+// CHECK:     Constant Buffers:
+// CHECK:       ID3D12ShaderReflectionConstantBuffer:
+// CHECK:         D3D12_SHADER_BUFFER_DESC: Name: $Globals
+// CHECK:           Type: D3D_CT_CBUFFER
+// CHECK:           Size: 80
+// CHECK:           uFlags: 0
+// CHECK:           Num Variables: 3
+// CHECK:     Bound Resources:
+// CHECK:       D3D12_SHADER_BUFFER_DESC: Name: scene
+// CHECK:         Type: D3D_SIT_RTACCELERATIONSTRUCTURE
+// CHECK:         uID: 0
+// CHECK:         BindCount: 1
+// CHECK:         BindPoint: 0
+// CHECK:         Space: 0
+// CHECK:         ReturnType: D3D_RETURN_TYPE_SINT
+// CHECK:         Dimension: D3D_SRV_DIMENSION_UNKNOWN
+// CHECK:         NumSamples (or stride): 4294967295
+// CHECK:         uFlags: 0

+ 6 - 2
tools/clang/test/CodeGenHLSL/quick-test/raytracing_traceray_readback.hlsl

@@ -1,7 +1,11 @@
 // RUN: %dxc -T lib_6_3 %s | FileCheck %s
 
 // Make sure we don't store the initial value (must load from payload after TraceRay)
-// CHECK-NOT: call void @dx.op.textureStore.f32(i32 67, %dx.types.Handle {{.*}}, i32 {{.*}}, i32 {{.*}}, i32 undef, float 0.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+00, i8 15)
+// CHECK: define void @"\01?RayGenTestMain@@YAXXZ"()
+// CHECK: call void @dx.op.textureStore.f32(i32 67,
+// CHECK-NOT: float 0.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+00
+// CHECK: , i8 15)
+// CHECK: ret void
 
 struct Payload {
    float4 abc;
@@ -18,7 +22,7 @@ float tanHalfFovY;
 [shader("raygeneration")]
 void RayGenTestMain()
 {
-    uint2 LaunchIndex = RayDispatchIndex();
+    uint2 LaunchIndex = DispatchRaysIndex();
     float2 d = ((LaunchIndex.xy / (float2)viewportDims) * 2.f - 1.f);
     float aspectRatio = (float)viewportDims.x / (float)viewportDims.y;
 

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

@@ -45,7 +45,7 @@ LPCSTR ToString(D3D_CBUFFER_TYPE CBType) {
   }
 }
 LPCSTR ToString(D3D_SHADER_INPUT_TYPE Type) {
-  switch (Type) {
+  switch ((UINT32)Type) {
   case D3D_SIT_CBUFFER: return "D3D_SIT_CBUFFER";
   case D3D_SIT_TBUFFER: return "D3D_SIT_TBUFFER";
   case D3D_SIT_TEXTURE: return "D3D_SIT_TEXTURE";
@@ -58,6 +58,7 @@ 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";
   default: return nullptr;
   }
 }

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

@@ -17,6 +17,7 @@
 #include <ostream>
 #include <iomanip>
 #include "dxc/Support/WinIncludes.h"
+#include "dxc/dxcapi.h"
 #include <d3d12shader.h>
 #include "dxc/HLSL/DxilContainer.h"