Selaa lähdekoodia

Set shader flags for dynamic resources (#3521)

Set shader flags for resource and sampler descriptor heap indexing based
on the CreateHandleFromHeap call and its ShaderHeap argument
Greg Roth 4 vuotta sitten
vanhempi
commit
62f390cb58

+ 5 - 0
include/dxc/DXIL/DxilConstants.h

@@ -1110,6 +1110,11 @@ namespace DXIL {
     // CreateHandleFromResource
     const unsigned kCreateHandleForLibResOpIdx = 1;
 
+    // CreateHandleFromHeap
+    const unsigned kCreateHandleFromHeapHeapIndexOpIdx = 1;
+    const unsigned kCreateHandleFromHeapSamplerHeapOpIdx = 2;
+    const unsigned kCreateHandleFromHeapNonUniformIndexOpIdx = 3;
+
     // TraceRay
     const unsigned kTraceRayRayDescOpIdx = 7;
     const unsigned kTraceRayPayloadOpIdx = 15;

+ 12 - 4
include/dxc/DXIL/DxilShaderFlags.h

@@ -120,11 +120,17 @@ namespace hlsl {
     void SetAtomicInt64OnGroupShared(bool flag) { m_bAtomicInt64OnGroupShared = flag; }
     bool GetAtomicInt64OnGroupShared() const { return m_bAtomicInt64OnGroupShared; }
 
+    void SetDerivativesInMeshAndAmpShaders(bool flag) { m_bDerivativesInMeshAndAmpShaders = flag; }
+    bool GetDerivativesInMeshAndAmpShaders() { return m_bDerivativesInMeshAndAmpShaders; }
+
     void SetAtomicInt64OnHeapResource(bool flag) { m_bAtomicInt64OnHeapResource = flag; }
     bool GetAtomicInt64OnHeapResource() const { return m_bAtomicInt64OnHeapResource; }
 
-    void SetDerivativesInMeshAndAmpShaders(bool flag) { m_bDerivativesInMeshAndAmpShaders = flag; }
-    bool GetDerivativesInMeshAndAmpShaders() { return m_bDerivativesInMeshAndAmpShaders; }
+    void SetResourceDescriptorHeapIndexing(bool flag) { m_bResourceDescriptorHeapIndexing = flag; }
+    bool GetResourceDescriptorHeapIndexing() const { return m_bResourceDescriptorHeapIndexing; }
+
+    void SetSamplerDescriptorHeapIndexing(bool flag) { m_bSamplerDescriptorHeapIndexing = flag; }
+    bool GetSamplerDescriptorHeapIndexing() const { return m_bSamplerDescriptorHeapIndexing; }
 
   private:
     unsigned m_bDisableOptimizations :1;   // D3D11_1_SB_GLOBAL_FLAG_SKIP_OPTIMIZATION
@@ -169,10 +175,12 @@ namespace hlsl {
 
     unsigned m_bDerivativesInMeshAndAmpShaders : 1; //SHADER_FEATURE_DERIVATIVES_IN_MESH_AND_AMPLIFICATION_SHADERS
 
+    unsigned m_bResourceDescriptorHeapIndexing : 1;  // SHADER_FEATURE_RESOURCE_DESCRIPTOR_HEAP_INDEXING
+    unsigned m_bSamplerDescriptorHeapIndexing : 1;  // SHADER_FEATURE_SAMPLER_DESCRIPTOR_HEAP_INDEXING
+
     unsigned m_bAtomicInt64OnHeapResource : 1; // SHADER_FEATURE_ATOMIC_INT64_ON_DESCRIPTOR_HEAP_RESOURCE
 
-    unsigned m_align0 : 1;        // align to 32 bit.
-    uint32_t m_align1;            // align to 64 bit.
+    uint32_t m_align1 : 31;            // align to 64 bit.
   };
 
 

+ 22 - 6
lib/DXIL/DxilShaderFlags.cpp

@@ -56,12 +56,12 @@ ShaderFlags::ShaderFlags():
 , m_bAtomicInt64OnTypedResource(false)
 , m_bAtomicInt64OnGroupShared(false)
 , m_bDerivativesInMeshAndAmpShaders(false)
+, m_bResourceDescriptorHeapIndexing(false)
+, m_bSamplerDescriptorHeapIndexing(false)
 , m_bAtomicInt64OnHeapResource(false)
-, m_align0(0)
 , m_align1(0)
 {
   // Silence unused field warnings
-  (void)m_align0;
   (void)m_align1;
 }
 
@@ -111,8 +111,10 @@ uint64_t ShaderFlags::GetFeatureInfo() const {
   Flags |= m_bSamplerFeedback ? hlsl::DXIL::ShaderFeatureInfo_SamplerFeedback : 0;
   Flags |= m_bAtomicInt64OnTypedResource ? hlsl::DXIL::ShaderFeatureInfo_AtomicInt64OnTypedResource : 0;
   Flags |= m_bAtomicInt64OnGroupShared ? hlsl::DXIL::ShaderFeatureInfo_AtomicInt64OnGroupShared : 0;
-  Flags |= m_bAtomicInt64OnHeapResource ? hlsl::DXIL::ShaderFeatureInfo_AtomicInt64OnHeapResource : 0;
   Flags |= m_bDerivativesInMeshAndAmpShaders ? hlsl::DXIL::ShaderFeatureInfo_DerivativesInMeshAndAmpShaders : 0;
+  Flags |= m_bResourceDescriptorHeapIndexing ? hlsl::DXIL::ShaderFeatureInfo_ResourceDescriptorHeapIndexing : 0;
+  Flags |= m_bSamplerDescriptorHeapIndexing ? hlsl::DXIL::ShaderFeatureInfo_SamplerDescriptorHeapIndexing : 0;
+  Flags |= m_bAtomicInt64OnHeapResource ? hlsl::DXIL::ShaderFeatureInfo_AtomicInt64OnHeapResource : 0;
 
   return Flags;
 }
@@ -169,8 +171,10 @@ uint64_t ShaderFlags::GetShaderFlagsRawForCollection() {
   Flags.SetSamplerFeedback(true);
   Flags.SetAtomicInt64OnTypedResource(true);
   Flags.SetAtomicInt64OnGroupShared(true);
-  Flags.SetAtomicInt64OnHeapResource(true);
   Flags.SetDerivativesInMeshAndAmpShaders(true);
+  Flags.SetResourceDescriptorHeapIndexing(true);
+  Flags.SetSamplerDescriptorHeapIndexing(true);
+  Flags.SetAtomicInt64OnHeapResource(true);
   return Flags.GetShaderFlagsRaw();
 }
 
@@ -348,8 +352,10 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
   bool hasRaytracingTier1_1 = false;
   bool hasAtomicInt64OnTypedResource = false;
   bool hasAtomicInt64OnGroupShared = false;
-  bool hasAtomicInt64OnHeapResource = false;
   bool hasDerivativesInMeshAndAmpShaders = false;
+  bool hasResourceDescriptorHeapIndexing = false;
+  bool hasSamplerDescriptorHeapIndexing = false;
+  bool hasAtomicInt64OnHeapResource = false;
 
   // Try to maintain compatibility with a v1.0 validator if that's what we have.
   uint32_t valMajor, valMinor;
@@ -501,6 +507,14 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
           if (pSM->IsAS() || pSM->IsMS())
             hasDerivativesInMeshAndAmpShaders = true;
         } break;
+        case DXIL::OpCode::CreateHandleFromHeap: {
+          ConstantInt *isSamplerVal = dyn_cast<ConstantInt>(
+                        CI->getArgOperand(DXIL::OperandIndex::kCreateHandleFromHeapSamplerHeapOpIdx));
+          if (isSamplerVal->getLimitedValue())
+            hasSamplerDescriptorHeapIndexing = true;
+          else
+            hasResourceDescriptorHeapIndexing = true;
+        }
         default:
           // Normal opcodes.
           break;
@@ -610,8 +624,10 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
   flag.SetRaytracingTier1_1(hasRaytracingTier1_1);
   flag.SetAtomicInt64OnTypedResource(hasAtomicInt64OnTypedResource);
   flag.SetAtomicInt64OnGroupShared(hasAtomicInt64OnGroupShared);
-  flag.SetAtomicInt64OnHeapResource(hasAtomicInt64OnHeapResource);
   flag.SetDerivativesInMeshAndAmpShaders(hasDerivativesInMeshAndAmpShaders);
+  flag.SetResourceDescriptorHeapIndexing(hasResourceDescriptorHeapIndexing);
+  flag.SetSamplerDescriptorHeapIndexing(hasSamplerDescriptorHeapIndexing);
+  flag.SetAtomicInt64OnHeapResource(hasAtomicInt64OnHeapResource);
 
   return flag;
 }

+ 3 - 4
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/atomic/atomic_i64_dynamic_resource.hlsl

@@ -1,10 +1,9 @@
 // RUN: %dxc -T lib_6_6 %s | FileCheck %s
 // Test atomic operations on dynamic resources
 
-// CHECK: RGInt64OnDescriptorHeapIndex
-// CHCK: Note: shader requires additional functionality:
-// CHCK: 64-bit Atomics on Typed Resources
-// CHCK: 64-bit Atomics on Heap Resources
+// CHECK: Note: shader requires additional functionality:
+// CHECK: 64-bit Atomics on Typed Resources
+// CHECK: 64-bit Atomics on Heap Resources
 
 [shader("raygeneration")]
 void RGInt64OnDescriptorHeapIndex()

+ 3 - 0
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/NonUniformDynamic.hlsl

@@ -3,6 +3,9 @@
 // RUN: %dxc -T cs_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKOD
 // RUN: %dxc -T cs_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKOD
 
+// CHECK: Note: shader requires additional functionality:
+// CHECK: Resource descriptor heap indexing
+
 // Make sure nonUniformIndex is true.
 // CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 %{{[0-9]+}}, i1 false, i1 true)
 // CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 %{{[0-9]+}}, i1 false, i1 true)

+ 3 - 0
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap.hlsl

@@ -3,6 +3,9 @@
 // RUN: %dxc -T ps_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 // RUN: %dxc -T ps_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 
+// CHECK: Note: shader requires additional functionality:
+// CHECK: Resource descriptor heap indexing
+
 // CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 %{{.*}}, i1 false, i1 false)
 // CHECK:call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %{{.*}}, %dx.types.ResourceProperties { i32 10, i32 265 })
 // CHECK-SAME: resource: TypedBuffer<F32>

+ 3 - 0
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap2.hlsl

@@ -3,6 +3,9 @@
 // RUN: %dxc -T ps_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 // RUN: %dxc -T ps_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 
+// CHECK: Note: shader requires additional functionality:
+// CHECK: Resource descriptor heap indexing
+
 // Make sure snorm/unorm and globallycoherent works.
 // CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218
 // CHECK:call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %{{.*}}, %dx.types.ResourceProperties { i32 4106, i32 270 })

+ 5 - 0
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap3.hlsl

@@ -3,6 +3,11 @@
 // RUN: %dxc -T ps_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 // RUN: %dxc -T ps_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 
+// CHECK: Note: shader requires additional functionality:
+// CHECK: Resource descriptor heap indexing
+// CHECK: Sampler descriptor heap indexing
+
+
 //CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 0, i1 false, i1 false)
 //CHECK:call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %{{.*}}, %dx.types.ResourceProperties { i32 2, i32 1033 })
 //CHECK-SAME: resource: Texture2D<F32>

+ 3 - 0
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap4.hlsl

@@ -3,6 +3,9 @@
 // RUN: %dxc -T ps_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 // RUN: %dxc -T ps_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 
+// CHECK: Note: shader requires additional functionality:
+// CHECK: Resource descriptor heap indexing
+
 //CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 0, i1 false, i1 false)
 //CHECK:call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %{{.*}}, %dx.types.ResourceProperties { i32 13, i32 4 })
 //CHECK-SAME: resource: CBuffer

+ 3 - 0
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/dynamic_res_global_for_lib.hlsl

@@ -3,6 +3,9 @@
 // RUN: %dxc -T lib_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 // RUN: %dxc -T lib_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 
+// CHECK: Note: shader requires additional functionality:
+// CHECK: Resource descriptor heap indexing
+
 // Make sure each entry get 2 createHandleFromHeap.
 // CHECK:define void
 // CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 %{{.*}}, i1 false, i1 false)

+ 3 - 0
tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/dynamic_res_global_for_lib2.hlsl

@@ -3,6 +3,9 @@
 // RUN: %dxc -T lib_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 // RUN: %dxc -T lib_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
 
+// CHECK: Note: shader requires additional functionality:
+// CHECK: Resource descriptor heap indexing
+
 // Make sure each entry get 2 createHandleFromHeap.
 // CHECK:define void
 // CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 %{{.*}}, i1 false, i1 false)