[llvm-branch-commits] [llvm] [DirectX] Add shader flags for heap resources (PR #216461)
Helena Kotas via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Aug 18 12:54:22 PDT 2026
https://github.com/hekota updated https://github.com/llvm/llvm-project/pull/216461
>From 46ded031905032fbde74a68ec9b6a2b7443a00a7 Mon Sep 17 00:00:00 2001
From: Helena Kotas <hekotas at microsoft.com>
Date: Sat, 15 Aug 2026 00:03:46 -0700
Subject: [PATCH 1/2] [DirectX] Add shader flags for heap resources
Fixes #213825
---
llvm/lib/Target/DirectX/DXILShaderFlags.cpp | 12 +++++-
.../DirectX/ShaderFlags/heap-resources.ll | 42 +++++++++++++++++++
2 files changed, 53 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
index 64d8dc33e3e60..b7c296b2bde6d 100644
--- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
+++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
@@ -274,6 +274,16 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF,
}
break;
}
+ case Intrinsic::dx_resource_handlefromheap: {
+ if (auto *ConstInt = dyn_cast<ConstantInt>(II->getArgOperand(1))) {
+ bool IsSamplerHeap = ConstInt->getValue().getBoolValue();
+ if (IsSamplerHeap)
+ CSF.SamplerDescriptorHeapIndexing = true;
+ else
+ CSF.ResourceDescriptorHeapIndexing = true;
+ }
+ break;
+ }
case Intrinsic::dx_resource_load_typedbuffer: {
dxil::ResourceTypeInfo &RTI =
DRTM[cast<TargetExtType>(II->getArgOperand(0)->getType())];
@@ -342,7 +352,7 @@ ModuleShaderFlags::gatherGlobalModuleFlags(const Module &M,
if (MMDI.ValidatorVersion < VersionTuple(1, 6)) {
NumUAVs++;
} else { // MMDI.ValidatorVersion >= VersionTuple(1, 6)
- uint32_t Size = UAV.getBinding().Size;
+ uint32_t Size = UAV.getSize();
uint32_t NewNum = NumUAVs + (Size == 0 ? ~0U : Size);
if (NewNum < NumUAVs)
NewNum = ~0U;
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
new file mode 100644
index 0000000000000..d7e15a65aea3a
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
@@ -0,0 +1,42 @@
+; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
+; RUN: llc %s -disable-dxil-remove-unused-resources --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+; This test makes sure that the shader flags 'Resource descriptor heap indexing'
+; is set when the shader uses CreateHandleFromHeap instruction on a resource
+; descriptor heap.
+
+target triple = "dxil-pc-shadermodel6.6-library"
+
+; CHECK: Combined Shader Flags for Module
+; CHECK-NEXT: Shader Flags Value: 0xc0000000
+
+; CHECK: Note: shader requires additional functionality:
+; CHECK: Resource descriptor heap indexing
+; CHECK: Sampler descriptor heap indexing
+;
+; CHECK: Function test_1 : 0x40000000
+define void @test_1() "hlsl.export" {
+ ; RWBuffer<float4> Buf = ResourceDescriptorHeap[3]
+ %typed = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0)
+ @llvm.dx.resource.handlefromheap.tdx.TypedBuffer_v4f32_1_0_0(i32 3, i1 false)
+ ret void
+}
+
+; CHECK: Function test_2 : 0x80000000
+define void @test_2() "hlsl.export" {
+ ; SamplerState Samp = ResourceDescriptorHeap[100];
+ %samp = call target("dx.Sampler", 0)
+ @llvm.dx.resource.handlefromheap.tdx.Sampler_0(i32 100, i1 true)
+ ret void
+}
+
+!dx.valver = !{!0}
+!0 = !{i32 1, i32 8}
+
+; DXC: - Name: SFI0
+; DXC-NEXT: Size: 8
+; DXC-NEXT: Flags:
+; DXC: ResourceDescriptorHeapIndexing: true
+; DXC: SamplerDescriptorHeapIndexing: true
+; DXC: NextUnusedBit: false
+
>From 2e1e167e8706a36c95267cd5c78592db9c8dd1ab Mon Sep 17 00:00:00 2001
From: Helena Kotas <hekotas at microsoft.com>
Date: Tue, 18 Aug 2026 12:54:00 -0700
Subject: [PATCH 2/2] code review feedback - update test comments
---
.../test/CodeGen/DirectX/ShaderFlags/heap-resources.ll | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
index d7e15a65aea3a..cc84d2f8574ad 100644
--- a/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/heap-resources.ll
@@ -1,9 +1,11 @@
; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
; RUN: llc %s -disable-dxil-remove-unused-resources --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
-; This test makes sure that the shader flags 'Resource descriptor heap indexing'
-; is set when the shader uses CreateHandleFromHeap instruction on a resource
-; descriptor heap.
+; This test makes sure that the shader flag 'Resource descriptor heap indexing'
+; is set when the shader uses CreateHandleFromHeap instruction to get a resource
+; from a resource descriptor heap, and that the shader flag `Sampler descriptor
+; heap indexing` is set when the shader uses the same instruction to get a sampler
+; from a sampler descriptor heap.
target triple = "dxil-pc-shadermodel6.6-library"
@@ -24,7 +26,7 @@ define void @test_1() "hlsl.export" {
; CHECK: Function test_2 : 0x80000000
define void @test_2() "hlsl.export" {
- ; SamplerState Samp = ResourceDescriptorHeap[100];
+ ; SamplerState Samp = SamplerDescriptorHeap[100];
%samp = call target("dx.Sampler", 0)
@llvm.dx.resource.handlefromheap.tdx.Sampler_0(i32 100, i1 true)
ret void
More information about the llvm-branch-commits
mailing list