diff --git a/tools/clang/lib/Sema/SemaHLSL.cpp b/tools/clang/lib/Sema/SemaHLSL.cpp index a78485f87..e396017e4 100644 --- a/tools/clang/lib/Sema/SemaHLSL.cpp +++ b/tools/clang/lib/Sema/SemaHLSL.cpp @@ -3508,6 +3508,8 @@ private: TypeSourceInfo *float4TypeSourceInfo = m_context->getTrivialTypeSourceInfo(float4Type, NoLoc); m_objectTypeLazyInitMask = 0; unsigned effectKindIndex = 0; + const auto *SM = + hlsl::ShaderModel::GetByName(m_sema->getLangOpts().HLSLProfile.c_str()); for (unsigned i = 0; i < _countof(g_ArBasicKindsAsTypes); i++) { ArBasicKind kind = g_ArBasicKindsAsTypes[i]; @@ -3566,14 +3568,18 @@ private: recordDecl = DeclareRayQueryType(*m_context); } else if (kind == AR_OBJECT_HEAP_RESOURCE) { recordDecl = DeclareResourceType(*m_context, /*bSampler*/false); - // create Resource ResourceDescriptorHeap; - DeclareBuiltinGlobal("ResourceDescriptorHeap", - m_context->getRecordType(recordDecl), *m_context); + if (SM->IsSM66Plus()) { + // create Resource ResourceDescriptorHeap; + DeclareBuiltinGlobal("ResourceDescriptorHeap", + m_context->getRecordType(recordDecl), *m_context); + } } else if (kind == AR_OBJECT_HEAP_SAMPLER) { recordDecl = DeclareResourceType(*m_context, /*bSampler*/true); - // create Resource SamplerDescriptorHeap; - DeclareBuiltinGlobal("SamplerDescriptorHeap", - m_context->getRecordType(recordDecl), *m_context); + if (SM->IsSM66Plus()) { + // create Resource SamplerDescriptorHeap; + DeclareBuiltinGlobal("SamplerDescriptorHeap", + m_context->getRecordType(recordDecl), *m_context); + } } else if (kind == AR_OBJECT_FEEDBACKTEXTURE2D) { diff --git a/tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/redefine_heap_vars.hlsl b/tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/redefine_heap_vars.hlsl new file mode 100644 index 000000000..5fdfb4437 --- /dev/null +++ b/tools/clang/test/HLSLFileCheck/hlsl/intrinsics/createHandleFromHeap/redefine_heap_vars.hlsl @@ -0,0 +1,25 @@ +// RUN: %dxc -T ps_6_5 %s | %FileCheck %s +// RUN: %dxc -T ps_6_6 %s | %FileCheck %s -check-prefix=FAIL + +// Make sure that global heap variable redeclaration fails +// on 6.6 and passes on previous shader models + +// FAIL: error: redefinition of 'ResourceDescriptorHeap' with a different type: 'Texture2D []' vs '.Resource' +// FAIL: error: redefinition of 'SamplerDescriptorHeap' with a different type: 'SamplerState []' vs '.Sampler' + +// Verify that feature bits aren't set and the shader produce roughly reasonable code +// CHECK-NOT: Resource descriptor heap indexing +// CHECK-NOT: Sampler descriptor heap indexing +// CHECK: @main +// CHECK: @dx.op.sample.f32 + +Texture2D ResourceDescriptorHeap[] : register(t0); +SamplerState SamplerDescriptorHeap[] : register(s0); + +uint ID; +float main(float4 pos: SV_Position): SV_Target { + Texture2D tex = ResourceDescriptorHeap[ID]; + SamplerState samp = SamplerDescriptorHeap[ID]; + return tex.Sample(samp, pos.xy); +} +