Skip to content

Commit 62f390c

Browse files
author
Greg Roth
authored
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
1 parent 3f9db44 commit 62f390c

11 files changed

Lines changed: 65 additions & 14 deletions

File tree

include/dxc/DXIL/DxilConstants.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,6 +1110,11 @@ namespace DXIL {
11101110
// CreateHandleFromResource
11111111
const unsigned kCreateHandleForLibResOpIdx = 1;
11121112

1113+
// CreateHandleFromHeap
1114+
const unsigned kCreateHandleFromHeapHeapIndexOpIdx = 1;
1115+
const unsigned kCreateHandleFromHeapSamplerHeapOpIdx = 2;
1116+
const unsigned kCreateHandleFromHeapNonUniformIndexOpIdx = 3;
1117+
11131118
// TraceRay
11141119
const unsigned kTraceRayRayDescOpIdx = 7;
11151120
const unsigned kTraceRayPayloadOpIdx = 15;

include/dxc/DXIL/DxilShaderFlags.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,17 @@ namespace hlsl {
120120
void SetAtomicInt64OnGroupShared(bool flag) { m_bAtomicInt64OnGroupShared = flag; }
121121
bool GetAtomicInt64OnGroupShared() const { return m_bAtomicInt64OnGroupShared; }
122122

123+
void SetDerivativesInMeshAndAmpShaders(bool flag) { m_bDerivativesInMeshAndAmpShaders = flag; }
124+
bool GetDerivativesInMeshAndAmpShaders() { return m_bDerivativesInMeshAndAmpShaders; }
125+
123126
void SetAtomicInt64OnHeapResource(bool flag) { m_bAtomicInt64OnHeapResource = flag; }
124127
bool GetAtomicInt64OnHeapResource() const { return m_bAtomicInt64OnHeapResource; }
125128

126-
void SetDerivativesInMeshAndAmpShaders(bool flag) { m_bDerivativesInMeshAndAmpShaders = flag; }
127-
bool GetDerivativesInMeshAndAmpShaders() { return m_bDerivativesInMeshAndAmpShaders; }
129+
void SetResourceDescriptorHeapIndexing(bool flag) { m_bResourceDescriptorHeapIndexing = flag; }
130+
bool GetResourceDescriptorHeapIndexing() const { return m_bResourceDescriptorHeapIndexing; }
131+
132+
void SetSamplerDescriptorHeapIndexing(bool flag) { m_bSamplerDescriptorHeapIndexing = flag; }
133+
bool GetSamplerDescriptorHeapIndexing() const { return m_bSamplerDescriptorHeapIndexing; }
128134

129135
private:
130136
unsigned m_bDisableOptimizations :1; // D3D11_1_SB_GLOBAL_FLAG_SKIP_OPTIMIZATION
@@ -169,10 +175,12 @@ namespace hlsl {
169175

170176
unsigned m_bDerivativesInMeshAndAmpShaders : 1; //SHADER_FEATURE_DERIVATIVES_IN_MESH_AND_AMPLIFICATION_SHADERS
171177

178+
unsigned m_bResourceDescriptorHeapIndexing : 1; // SHADER_FEATURE_RESOURCE_DESCRIPTOR_HEAP_INDEXING
179+
unsigned m_bSamplerDescriptorHeapIndexing : 1; // SHADER_FEATURE_SAMPLER_DESCRIPTOR_HEAP_INDEXING
180+
172181
unsigned m_bAtomicInt64OnHeapResource : 1; // SHADER_FEATURE_ATOMIC_INT64_ON_DESCRIPTOR_HEAP_RESOURCE
173182

174-
unsigned m_align0 : 1; // align to 32 bit.
175-
uint32_t m_align1; // align to 64 bit.
183+
uint32_t m_align1 : 31; // align to 64 bit.
176184
};
177185

178186

lib/DXIL/DxilShaderFlags.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ ShaderFlags::ShaderFlags():
5656
, m_bAtomicInt64OnTypedResource(false)
5757
, m_bAtomicInt64OnGroupShared(false)
5858
, m_bDerivativesInMeshAndAmpShaders(false)
59+
, m_bResourceDescriptorHeapIndexing(false)
60+
, m_bSamplerDescriptorHeapIndexing(false)
5961
, m_bAtomicInt64OnHeapResource(false)
60-
, m_align0(0)
6162
, m_align1(0)
6263
{
6364
// Silence unused field warnings
64-
(void)m_align0;
6565
(void)m_align1;
6666
}
6767

@@ -111,8 +111,10 @@ uint64_t ShaderFlags::GetFeatureInfo() const {
111111
Flags |= m_bSamplerFeedback ? hlsl::DXIL::ShaderFeatureInfo_SamplerFeedback : 0;
112112
Flags |= m_bAtomicInt64OnTypedResource ? hlsl::DXIL::ShaderFeatureInfo_AtomicInt64OnTypedResource : 0;
113113
Flags |= m_bAtomicInt64OnGroupShared ? hlsl::DXIL::ShaderFeatureInfo_AtomicInt64OnGroupShared : 0;
114-
Flags |= m_bAtomicInt64OnHeapResource ? hlsl::DXIL::ShaderFeatureInfo_AtomicInt64OnHeapResource : 0;
115114
Flags |= m_bDerivativesInMeshAndAmpShaders ? hlsl::DXIL::ShaderFeatureInfo_DerivativesInMeshAndAmpShaders : 0;
115+
Flags |= m_bResourceDescriptorHeapIndexing ? hlsl::DXIL::ShaderFeatureInfo_ResourceDescriptorHeapIndexing : 0;
116+
Flags |= m_bSamplerDescriptorHeapIndexing ? hlsl::DXIL::ShaderFeatureInfo_SamplerDescriptorHeapIndexing : 0;
117+
Flags |= m_bAtomicInt64OnHeapResource ? hlsl::DXIL::ShaderFeatureInfo_AtomicInt64OnHeapResource : 0;
116118

117119
return Flags;
118120
}
@@ -169,8 +171,10 @@ uint64_t ShaderFlags::GetShaderFlagsRawForCollection() {
169171
Flags.SetSamplerFeedback(true);
170172
Flags.SetAtomicInt64OnTypedResource(true);
171173
Flags.SetAtomicInt64OnGroupShared(true);
172-
Flags.SetAtomicInt64OnHeapResource(true);
173174
Flags.SetDerivativesInMeshAndAmpShaders(true);
175+
Flags.SetResourceDescriptorHeapIndexing(true);
176+
Flags.SetSamplerDescriptorHeapIndexing(true);
177+
Flags.SetAtomicInt64OnHeapResource(true);
174178
return Flags.GetShaderFlagsRaw();
175179
}
176180

@@ -348,8 +352,10 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
348352
bool hasRaytracingTier1_1 = false;
349353
bool hasAtomicInt64OnTypedResource = false;
350354
bool hasAtomicInt64OnGroupShared = false;
351-
bool hasAtomicInt64OnHeapResource = false;
352355
bool hasDerivativesInMeshAndAmpShaders = false;
356+
bool hasResourceDescriptorHeapIndexing = false;
357+
bool hasSamplerDescriptorHeapIndexing = false;
358+
bool hasAtomicInt64OnHeapResource = false;
353359

354360
// Try to maintain compatibility with a v1.0 validator if that's what we have.
355361
uint32_t valMajor, valMinor;
@@ -501,6 +507,14 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
501507
if (pSM->IsAS() || pSM->IsMS())
502508
hasDerivativesInMeshAndAmpShaders = true;
503509
} break;
510+
case DXIL::OpCode::CreateHandleFromHeap: {
511+
ConstantInt *isSamplerVal = dyn_cast<ConstantInt>(
512+
CI->getArgOperand(DXIL::OperandIndex::kCreateHandleFromHeapSamplerHeapOpIdx));
513+
if (isSamplerVal->getLimitedValue())
514+
hasSamplerDescriptorHeapIndexing = true;
515+
else
516+
hasResourceDescriptorHeapIndexing = true;
517+
}
504518
default:
505519
// Normal opcodes.
506520
break;
@@ -610,8 +624,10 @@ ShaderFlags ShaderFlags::CollectShaderFlags(const Function *F,
610624
flag.SetRaytracingTier1_1(hasRaytracingTier1_1);
611625
flag.SetAtomicInt64OnTypedResource(hasAtomicInt64OnTypedResource);
612626
flag.SetAtomicInt64OnGroupShared(hasAtomicInt64OnGroupShared);
613-
flag.SetAtomicInt64OnHeapResource(hasAtomicInt64OnHeapResource);
614627
flag.SetDerivativesInMeshAndAmpShaders(hasDerivativesInMeshAndAmpShaders);
628+
flag.SetResourceDescriptorHeapIndexing(hasResourceDescriptorHeapIndexing);
629+
flag.SetSamplerDescriptorHeapIndexing(hasSamplerDescriptorHeapIndexing);
630+
flag.SetAtomicInt64OnHeapResource(hasAtomicInt64OnHeapResource);
615631

616632
return flag;
617633
}

tools/clang/test/HLSLFileCheck/hlsl/intrinsics/atomic/atomic_i64_dynamic_resource.hlsl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
// RUN: %dxc -T lib_6_6 %s | FileCheck %s
22
// Test atomic operations on dynamic resources
33

4-
// CHECK: RGInt64OnDescriptorHeapIndex
5-
// CHCK: Note: shader requires additional functionality:
6-
// CHCK: 64-bit Atomics on Typed Resources
7-
// CHCK: 64-bit Atomics on Heap Resources
4+
// CHECK: Note: shader requires additional functionality:
5+
// CHECK: 64-bit Atomics on Typed Resources
6+
// CHECK: 64-bit Atomics on Heap Resources
87

98
[shader("raygeneration")]
109
void RGInt64OnDescriptorHeapIndex()

tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/NonUniformDynamic.hlsl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// RUN: %dxc -T cs_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKOD
44
// RUN: %dxc -T cs_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKOD
55

6+
// CHECK: Note: shader requires additional functionality:
7+
// CHECK: Resource descriptor heap indexing
8+
69
// Make sure nonUniformIndex is true.
710
// CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 %{{[0-9]+}}, i1 false, i1 true)
811
// CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 %{{[0-9]+}}, i1 false, i1 true)

tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap.hlsl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// RUN: %dxc -T ps_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
44
// RUN: %dxc -T ps_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
55

6+
// CHECK: Note: shader requires additional functionality:
7+
// CHECK: Resource descriptor heap indexing
8+
69
// CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 %{{.*}}, i1 false, i1 false)
710
// CHECK:call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %{{.*}}, %dx.types.ResourceProperties { i32 10, i32 265 })
811
// CHECK-SAME: resource: TypedBuffer<F32>

tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap2.hlsl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// RUN: %dxc -T ps_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
44
// RUN: %dxc -T ps_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
55

6+
// CHECK: Note: shader requires additional functionality:
7+
// CHECK: Resource descriptor heap indexing
8+
69
// Make sure snorm/unorm and globallycoherent works.
710
// CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218
811
// CHECK:call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %{{.*}}, %dx.types.ResourceProperties { i32 4106, i32 270 })

tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap3.hlsl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
// RUN: %dxc -T ps_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
44
// RUN: %dxc -T ps_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
55

6+
// CHECK: Note: shader requires additional functionality:
7+
// CHECK: Resource descriptor heap indexing
8+
// CHECK: Sampler descriptor heap indexing
9+
10+
611
//CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 0, i1 false, i1 false)
712
//CHECK:call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %{{.*}}, %dx.types.ResourceProperties { i32 2, i32 1033 })
813
//CHECK-SAME: resource: Texture2D<F32>

tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/createFromHeap4.hlsl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// RUN: %dxc -T ps_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
44
// RUN: %dxc -T ps_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
55

6+
// CHECK: Note: shader requires additional functionality:
7+
// CHECK: Resource descriptor heap indexing
8+
69
//CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 0, i1 false, i1 false)
710
//CHECK:call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %{{.*}}, %dx.types.ResourceProperties { i32 13, i32 4 })
811
//CHECK-SAME: resource: CBuffer

tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/dynamic_res_global_for_lib.hlsl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// RUN: %dxc -T lib_6_6 -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
44
// RUN: %dxc -T lib_6_6 -Od -Zi %s | %FileCheck %s -check-prefixes=CHECK,CHECKZI
55

6+
// CHECK: Note: shader requires additional functionality:
7+
// CHECK: Resource descriptor heap indexing
8+
69
// Make sure each entry get 2 createHandleFromHeap.
710
// CHECK:define void
811
// CHECK:call %dx.types.Handle @dx.op.createHandleFromHeap(i32 218, i32 %{{.*}}, i1 false, i1 false)

0 commit comments

Comments
 (0)