@@ -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}
0 commit comments