Add shader debug test to D3D12_Descriptor_Indexing

Tweak test shader to exercise shader debug simulation of SM6.6 direct heap access
This commit is contained in:
Jake Turner
2026-04-14 13:23:12 +01:00
parent 05f773971c
commit 2361be9f36
2 changed files with 33 additions and 17 deletions
@@ -137,24 +137,25 @@ float4 main(v2f IN) : SV_Target0
if(t.tex == 0)
{
ret *= texArray1[t.binding].SampleLevel(sArray1[t.binding], uv.xy, 0);
ret *= texArray1[t.binding+1].SampleLevel(sArray1[t.binding+1], uv.xy, 0);
ret *= texArray1[t.binding+2].SampleLevel(sArray1[t.binding+2], uv.xy, 0);
ret += texArray1[t.binding].SampleLevel(sArray1[t.binding], uv.xy, 0);
ret += texArray1[t.binding+1].SampleLevel(sArray1[t.binding+1], uv.xy, 0);
ret += texArray1[t.binding+2].SampleLevel(sArray1[t.binding+2], uv.xy, 0);
}
else if(t.tex == 1)
{
ret *= texArray2[t.binding].SampleLevel(s, uv.xy, 0);
ret *= texArray2[t.binding+10].SampleLevel(s, uv.xy, 0);
ret *= texArray2[20].SampleLevel(s, uv.xy, 0);
ret += texArray2[t.binding].SampleLevel(s, uv.xy, 0);
ret += texArray2[t.binding+10].SampleLevel(s, uv.xy, 0);
ret += texArray2[20].SampleLevel(s, uv.xy, 0);
}
else if(t.tex == 2)
{
ret *= texArray3[t.binding].SampleLevel(s, uv.xy, 0);
ret += texArray3[t.binding].SampleLevel(s, uv.xy, 0);
}
uv *= 1.8f;
}
ret /= 100.0f;
return ret;
}
}
@@ -198,6 +199,9 @@ struct alias2
float4 main(v2f IN) : SV_Target0
{
StructuredBuffer<tex_ref> buf = ResourceDescriptorHeap[8];
int ZERO = floor(IN.uv.x/(IN.uv.x+1.0e-6f));
int ONE = ZERO + 1;
if(IN.uv.y < 0.1f)
{
SamplerState s = SamplerDescriptorHeap[0];
@@ -222,9 +226,9 @@ float4 main(v2f IN) : SV_Target0
Texture2D<float4> tex1 = ResourceDescriptorHeap[t.binding];
Texture2D<float4> tex2 = ResourceDescriptorHeap[t.binding+1];
Texture2D<float4> tex3 = ResourceDescriptorHeap[t.binding+2];
ret *= tex1.SampleLevel(s1, uv.xy, 0);
ret *= tex2.SampleLevel(s2, uv.xy, 0);
ret *= tex3.SampleLevel(s3, uv.xy, 0);
ret += tex1.SampleLevel(s1, uv.xy, 0);
ret += tex2.SampleLevel(s2, uv.xy, 0);
ret += tex3.SampleLevel(s3, uv.xy, 0);
RWStructuredBuffer<uint> uav = ResourceDescriptorHeap[10];
uav[0] = t.binding;
}
@@ -235,32 +239,33 @@ float4 main(v2f IN) : SV_Target0
SamplerState s3 = SamplerDescriptorHeap[21];
Texture2D<float4> tex1 = ResourceDescriptorHeap[40+t.binding];
Texture2D<float4> tex2 = ResourceDescriptorHeap[40+t.binding+10];
ConstantBuffer<CBuffer> cbv = ResourceDescriptorHeap[9];
ConstantBuffer<CBuffer> cbv = ResourceDescriptorHeap[ONE*9];
Texture2D<float4> tex3 = ResourceDescriptorHeap[cbv.tex_idx];
ret *= tex1.SampleLevel(s1, uv.xy, 0);
ret *= tex2.SampleLevel(s2, uv.xy, 0);
ret *= tex3.SampleLevel(s3, uv.xy, 0);
ret += tex1.SampleLevel(s1, uv.xy, 0);
ret += tex2.SampleLevel(s2, uv.xy, 0);
ret += tex3.SampleLevel(s3, uv.xy, 0);
}
else if(t.tex == 2)
{
SamplerState s = SamplerDescriptorHeap[25];
Texture2D<float4> tex = ResourceDescriptorHeap[80+t.binding];
ret *= tex.SampleLevel(s, uv.xy, 0);
ret += tex.SampleLevel(s, uv.xy, 0);
}
else if(t.tex == 3)
{
StructuredBuffer<alias1> alias1buf = ResourceDescriptorHeap[150+t.binding];
ret *= alias1buf[0].Color;
ret += alias1buf[0].Color;
}
else if(t.tex == 4)
{
StructuredBuffer<alias2> alias2buf = ResourceDescriptorHeap[150+t.binding];
ret *= alias2buf[0].Color;
ret += alias2buf[0].Color;
}
uv *= 1.8f;
}
ret /= 100.0f;
return ret;
}
}
@@ -490,6 +495,8 @@ float4 main(v2f IN) : SV_Target0
MakeSRV(smiley).CreateGPU(60);
MakeSRV(smiley).CreateGPU(99);
MakeSRV(smiley).CreateGPU(103);
// index 6 is the resource index from constBuf
MakeSRV(smiley).CreateGPU(6);
MakeCBV(constBuf).SizeBytes(256).CreateGPU(9);
if(namer)
namer->SetName(9, "constBuf");
@@ -153,6 +153,11 @@ class D3D12_Descriptor_Indexing(rdtest.TestCase):
rdtest.log.success("Dynamic usage is as expected for {}".format(sm))
v = pipe.GetViewport(0)
x = int(v.x) + int(v.width / 2)
y = int(v.y) + int(v.height // 2)
self.check_debug_pixel(x, y)
for sm in ["sm_6_6_heap"]:
base = self.find_action("Tests " + sm)
if base == None:
@@ -239,3 +244,7 @@ class D3D12_Descriptor_Indexing(rdtest.TestCase):
loc.logicalBindName, a.access.byteOffset))
rdtest.log.success("Dynamic usage is as expected for {}".format(sm))
v = pipe.GetViewport(0)
x = int(v.x) + int(v.width / 2)
y = int(v.y) + int(v.height // 2)
self.check_debug_pixel(x, y)