Update D3D12 cbuffer test to check DXIL

This commit is contained in:
baldurk
2020-06-19 14:46:00 +01:00
parent d6ef32c5d0
commit ab5c527489
3 changed files with 67 additions and 8 deletions
+24 -5
View File
@@ -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);
+3
View File
@@ -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)))
+40 -3
View File
@@ -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({