diff --git a/util/test/demos/d3d12/d3d12_cbuffer_zoo.cpp b/util/test/demos/d3d12/d3d12_cbuffer_zoo.cpp index 0b3f7d3e2..a99b1afed 100644 --- a/util/test/demos/d3d12/d3d12_cbuffer_zoo.cpp +++ b/util/test/demos/d3d12/d3d12_cbuffer_zoo.cpp @@ -327,8 +327,11 @@ float4 main() : SV_Target0 if(!Init()) return 3; - ID3DBlobPtr vsblob = Compile(D3DDefaultVertex, "main", "vs_5_0"); - ID3DBlobPtr psblob = Compile(pixel, "main", "ps_5_1"); + ID3DBlobPtr vs5blob = Compile(D3DDefaultVertex, "main", "vs_5_0"); + ID3DBlobPtr ps5blob = Compile(pixel, "main", "ps_5_1"); + + ID3DBlobPtr vs6blob = m_DXILSupport ? Compile(D3DDefaultVertex, "main", "vs_6_0") : NULL; + ID3DBlobPtr ps6blob = m_DXILSupport ? Compile(pixel, "main", "ps_6_0") : NULL; const size_t bindOffset = 16; @@ -370,8 +373,15 @@ float4 main() : SV_Target0 cbvParam(D3D12_SHADER_VISIBILITY_PIXEL, 999999999, 0), }); - ID3D12PipelineStatePtr pso = MakePSO().RootSig(sig).InputLayout().VS(vsblob).PS(psblob).RTVs( - {DXGI_FORMAT_R32G32B32A32_FLOAT}); + ID3D12PipelineStatePtr dxbcpso = + MakePSO().RootSig(sig).InputLayout().VS(vs5blob).PS(ps5blob).RTVs( + {DXGI_FORMAT_R32G32B32A32_FLOAT}); + + ID3D12PipelineStatePtr dxilpso = NULL; + + if(vs6blob && ps6blob) + dxilpso = MakePSO().RootSig(sig).InputLayout().VS(vs6blob).PS(ps6blob).RTVs( + {DXGI_FORMAT_R32G32B32A32_FLOAT}); ResourceBarrier(vb, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER); ResourceBarrier(cb, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER); @@ -400,7 +410,7 @@ float4 main() : SV_Target0 cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); IASetVertexBuffer(cmd, vb, sizeof(DefaultA2V), 0); - cmd->SetPipelineState(pso); + cmd->SetPipelineState(dxbcpso); cmd->SetGraphicsRootSignature(sig); cmd->SetGraphicsRootConstantBufferView( 0, cb->GetGPUVirtualAddress() + bindOffset * sizeof(Vec4f)); @@ -413,8 +423,17 @@ float4 main() : SV_Target0 OMSetRenderTargets(cmd, {offrtv}, {}); + setMarker(cmd, "DXBC Draw"); cmd->DrawInstanced(3, 1, 0, 0); + if(dxilpso) + { + cmd->SetPipelineState(dxilpso); + + setMarker(cmd, "DXIL Draw"); + cmd->DrawInstanced(3, 1, 0, 0); + } + ResourceBarrier(cmd, rtvtex, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); diff --git a/util/test/rdtest/testcase.py b/util/test/rdtest/testcase.py index 240aecee4..a2a5b4f4b 100644 --- a/util/test/rdtest/testcase.py +++ b/util/test/rdtest/testcase.py @@ -121,6 +121,9 @@ class ConstantBufferChecker: raise TestFailureException("Too many variables checked, {} has no matching data".format(name)) return ShaderVariableCheck(self._variables.pop(0), name) + def next_var(self): + return self._variables[0] + def done(self): if len(self._variables) != 0: raise TestFailureException("Not all variables checked, {} still remain".format(len(self._variables))) diff --git a/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py b/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py index 912509bfb..a63706ad7 100644 --- a/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py +++ b/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py @@ -5,16 +5,51 @@ class D3D12_CBuffer_Zoo(rdtest.TestCase): demos_test_name = 'D3D12_CBuffer_Zoo' def check_capture(self): - draw = self.find_draw("Draw") + draw = self.find_draw("DXBC Draw") self.check(draw is not None) - self.controller.SetFrameEvent(draw.eventId, False) + self.controller.SetFrameEvent(draw.next.eventId, False) pipe: rd.PipeState = self.controller.GetPipelineState() stage = rd.ShaderStage.Pixel + # Verify that the DXBC draw is first + disasm = self.controller.DisassembleShader(pipe.GetGraphicsPipelineObject(), pipe.GetShaderReflection(stage), + '') + + self.check('ps_5_1' in disasm) + + self.check_event() + + rdtest.log.success("DXBC draw is as expected") + + # Move to the DXIL draw + draw = self.find_draw("DXIL Draw") + + if draw is None: + rdtest.log.print("No DXIL draw to test") + return + + self.controller.SetFrameEvent(draw.next.eventId, False) + + pipe: rd.PipeState = self.controller.GetPipelineState() + + disasm = self.controller.DisassembleShader(pipe.GetGraphicsPipelineObject(), pipe.GetShaderReflection(stage), + '') + + self.check('ps_6_0' in disasm) + + self.check_event() + + rdtest.log.success("DXIL draw is as expected") + + def check_event(self): + pipe: rd.PipeState = self.controller.GetPipelineState() + + stage = rd.ShaderStage.Pixel + refl: rd.ShaderReflection = pipe.GetShaderReflection(stage) mapping: rd.ShaderBindpointMapping = pipe.GetBindpointMapping(stage) @@ -457,7 +492,9 @@ class D3D12_CBuffer_Zoo(rdtest.TestCase): # float4 gldummy4; var_check.check('gldummy4') - # empty_struct empty; - completely omitted + # empty_struct empty; - completely omitted on DXBC but present on DXIL + if var_check.next_var().name == 'empty': + var_check.check('empty') # nested_with_empty nested_empty; var_check.check('nested_empty').rows(0).cols(0).members({