From 8e4b44aed769748e938bf48e2263761531b1c372 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 29 Jun 2022 13:19:12 +0100 Subject: [PATCH] Add test of integer offsets on texture sample for D3D shader debug --- .../demos/d3d11/d3d11_shader_debug_zoo.cpp | 5 + util/test/demos/d3d12/d3d12_helpers.cpp | 13 +++ util/test/demos/d3d12/d3d12_helpers.h | 1 + .../demos/d3d12/d3d12_shader_debug_zoo.cpp | 94 +++++++++++++++++-- .../tests/D3D12/D3D12_Shader_Debug_Zoo.py | 4 +- 5 files changed, 108 insertions(+), 9 deletions(-) diff --git a/util/test/demos/d3d11/d3d11_shader_debug_zoo.cpp b/util/test/demos/d3d11/d3d11_shader_debug_zoo.cpp index 2adc7fae1..22d3c9443 100644 --- a/util/test/demos/d3d11/d3d11_shader_debug_zoo.cpp +++ b/util/test/demos/d3d11/d3d11_shader_debug_zoo.cpp @@ -723,6 +723,11 @@ float4 main(v2f IN) : SV_Target0 return typedrwtest[uint(zero)].wzwy; } #endif + if(IN.tri == 88) + { + float2 uv = posone * float2(0.55f, 0.48f); + return smiley.Sample(linearwrap, uv, int2(4, 3)); + } return float4(0.4f, 0.4f, 0.4f, 0.4f); } diff --git a/util/test/demos/d3d12/d3d12_helpers.cpp b/util/test/demos/d3d12/d3d12_helpers.cpp index 9fc4820ab..c1a6b8c27 100644 --- a/util/test/demos/d3d12/d3d12_helpers.cpp +++ b/util/test/demos/d3d12/d3d12_helpers.cpp @@ -156,6 +156,19 @@ D3D12_ROOT_PARAMETER1 cbvParam(D3D12_SHADER_VISIBILITY vis, UINT space, UINT reg return ret; } +D3D12_ROOT_PARAMETER1 srvParam(D3D12_SHADER_VISIBILITY vis, UINT space, UINT reg) +{ + D3D12_ROOT_PARAMETER1 ret; + + ret.ShaderVisibility = vis; + ret.ParameterType = D3D12_ROOT_PARAMETER_TYPE_SRV; + ret.Descriptor.RegisterSpace = space; + ret.Descriptor.ShaderRegister = reg; + ret.Descriptor.Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE; + + return ret; +} + D3D12_ROOT_PARAMETER1 uavParam(D3D12_SHADER_VISIBILITY vis, UINT space, UINT reg) { D3D12_ROOT_PARAMETER1 ret; diff --git a/util/test/demos/d3d12/d3d12_helpers.h b/util/test/demos/d3d12/d3d12_helpers.h index 330576320..57e73b171 100644 --- a/util/test/demos/d3d12/d3d12_helpers.h +++ b/util/test/demos/d3d12/d3d12_helpers.h @@ -265,6 +265,7 @@ private: }; D3D12_ROOT_PARAMETER1 cbvParam(D3D12_SHADER_VISIBILITY vis, UINT space, UINT reg); +D3D12_ROOT_PARAMETER1 srvParam(D3D12_SHADER_VISIBILITY vis, UINT space, UINT reg); D3D12_ROOT_PARAMETER1 uavParam(D3D12_SHADER_VISIBILITY vis, UINT space, UINT reg); D3D12_ROOT_PARAMETER1 constParam(D3D12_SHADER_VISIBILITY vis, UINT space, UINT reg, UINT num); diff --git a/util/test/demos/d3d12/d3d12_shader_debug_zoo.cpp b/util/test/demos/d3d12/d3d12_shader_debug_zoo.cpp index 0348700aa..3c58f5db9 100644 --- a/util/test/demos/d3d12/d3d12_shader_debug_zoo.cpp +++ b/util/test/demos/d3d12/d3d12_shader_debug_zoo.cpp @@ -156,6 +156,7 @@ ByteAddressBuffer byterotest : register(t1); StructuredBuffer structrotest : register(t2); Texture2D dimtex : register(t3); Texture2DMS dimtexms : register(t4); +Texture2D smiley : register(t5); RWByteAddressBuffer byterwtest : register(u1); RWStructuredBuffer structrwtest : register(u2); @@ -700,6 +701,11 @@ float4 main(v2f IN) : SV_Target0 { return rgb_srv[0]; } + if(IN.tri == 77) + { + float2 uv = posone * float2(0.55f, 0.48f); + return smiley.Sample(linearclamp, uv, int2(4, 3)); + } return float4(0.4f, 0.4f, 0.4f, 0.4f); } @@ -776,8 +782,8 @@ float4 main(v2f IN, uint samp : SV_SampleIndex) : SV_Target0 ID3D12RootSignaturePtr sig = MakeSig( { - tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 0, 5, 0), - tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 0, 1, 2, 5), + tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 0, 6, 0), + tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 0, 1, 2, 10), tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 100, 5, 20), tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 0, 4, 3, 30), }, @@ -791,7 +797,7 @@ float4 main(v2f IN, uint samp : SV_SampleIndex) : SV_Target0 .RTVs({DXGI_FORMAT_R32G32B32A32_FLOAT}); // Recompile the same PS with SM 5.1 to test shader debugging with the different bytecode - psblob = Compile(common + pixel, "main", "ps_5_1"); + psblob = Compile(common + "\n#define SM_5_1 1\n" + pixel, "main", "ps_5_1"); ID3D12PipelineStatePtr pso_5_1 = MakePSO() .RootSig(sig) .InputLayout(inputLayout) @@ -851,11 +857,85 @@ float4 main(v2f IN, uint samp : SV_SampleIndex) : SV_Target0 ID3D12ResourcePtr msTex = MakeTexture(DXGI_FORMAT_R32_FLOAT, 16, 16).Multisampled(4).RTV(); MakeSRV(msTex).CreateGPU(4); + Texture rgba8; + LoadXPM(SmileyTexture, rgba8); + + ID3D12ResourcePtr smiley = MakeTexture(DXGI_FORMAT_R8G8B8A8_UNORM, 48, 48) + .Mips(1) + .InitialState(D3D12_RESOURCE_STATE_COPY_DEST); + + ID3D12ResourcePtr uploadBuf = MakeBuffer().Size(1024 * 1024).Upload(); + ID3D12ResourcePtr constBuf = MakeBuffer().Size(256).Upload(); + ID3D12ResourcePtr outUAV = MakeBuffer().Size(256).UAV(); + { + byte *mapptr = NULL; + constBuf->Map(0, NULL, (void **)&mapptr); + uint32_t value = 6; + memcpy(mapptr, &value, sizeof(uint32_t)); + constBuf->Unmap(0, NULL); + } + + { + D3D12_PLACED_SUBRESOURCE_FOOTPRINT layout = {}; + + D3D12_RESOURCE_DESC desc = smiley->GetDesc(); + + dev->GetCopyableFootprints(&desc, 0, 1, 0, &layout, NULL, NULL, NULL); + + byte *srcptr = (byte *)rgba8.data.data(); + byte *mapptr = NULL; + uploadBuf->Map(0, NULL, (void **)&mapptr); + + ID3D12GraphicsCommandListPtr cmd = GetCommandBuffer(); + + Reset(cmd); + + { + D3D12_TEXTURE_COPY_LOCATION dst, src; + + dst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dst.pResource = smiley; + dst.SubresourceIndex = 0; + + byte *dstptr = mapptr + layout.Offset; + + for(UINT row = 0; row < rgba8.height; row++) + { + memcpy(dstptr, srcptr, rgba8.width * sizeof(uint32_t)); + srcptr += rgba8.width * sizeof(uint32_t); + dstptr += layout.Footprint.RowPitch; + } + + src.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + src.pResource = uploadBuf; + src.PlacedFootprint = layout; + + cmd->CopyTextureRegion(&dst, 0, 0, 0, &src, NULL); + + D3D12_RESOURCE_BARRIER b = {}; + b.Transition.pResource = smiley; + b.Transition.Subresource = 0; + b.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; + b.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE | + D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE; + cmd->ResourceBarrier(1, &b); + } + + cmd->Close(); + + uploadBuf->Unmap(0, NULL); + + Submit({cmd}); + GPUSync(); + } + + MakeSRV(smiley).CreateGPU(5); + ID3D12ResourcePtr rawBuf2 = MakeBuffer().Size(1024).UAV(); D3D12ViewCreator uavView1 = MakeUAV(rawBuf2).Format(DXGI_FORMAT_R32_TYPELESS).ByteAddressed().FirstElement(4).NumElements(12); - D3D12_CPU_DESCRIPTOR_HANDLE uav1cpu = uavView1.CreateClearCPU(5); - D3D12_GPU_DESCRIPTOR_HANDLE uav1gpu = uavView1.CreateGPU(5); + D3D12_CPU_DESCRIPTOR_HANDLE uav1cpu = uavView1.CreateClearCPU(10); + D3D12_GPU_DESCRIPTOR_HANDLE uav1gpu = uavView1.CreateGPU(10); uint16_t narrowdata[32]; for(size_t i = 0; i < ARRAY_COUNT(narrowdata); i++) @@ -886,8 +966,8 @@ float4 main(v2f IN, uint samp : SV_SampleIndex) : SV_Target0 .FirstElement(3) .NumElements(5) .StructureStride(11 * sizeof(float)); - D3D12_CPU_DESCRIPTOR_HANDLE uav2cpu = uavView2.CreateClearCPU(6); - D3D12_GPU_DESCRIPTOR_HANDLE uav2gpu = uavView2.CreateGPU(6); + D3D12_CPU_DESCRIPTOR_HANDLE uav2cpu = uavView2.CreateClearCPU(11); + D3D12_GPU_DESCRIPTOR_HANDLE uav2gpu = uavView2.CreateGPU(11); // need to create non-structured version for clearing uavView2 = MakeUAV(structBuf2).Format(DXGI_FORMAT_R32_UINT); diff --git a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py index bd8b07082..a9d7b9795 100644 --- a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py @@ -103,7 +103,7 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): failed = True rdtest.log.error( "Vertex shader color output did not match expectation ({}). {}".format(str(debugged.value.f32v[0:4]), - str(ex))) + str([0.3, 0.5, 0.8, 1.0]))) rdtest.log.success("VertexSample VS was debugged correctly") @@ -147,7 +147,7 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): rdtest.log.error( "Banned signature vertex shader position did not match expectation ({}). {}".format( str(debugged.value.f32v[0:4]), - str(ex))) + str([-0.5, -0.5, 0.0, 1.0]))) rdtest.log.success("Banned signature VS was debugged correctly")