mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-05 01:20:42 +00:00
Add test of flow control constructs in D3D11 shader debugging
This commit is contained in:
@@ -680,6 +680,113 @@ float4 main(v2f IN) : SV_Target0
|
||||
return float4(0.4f, 0.4f, 0.4f, 0.4f);
|
||||
}
|
||||
|
||||
)EOSHADER";
|
||||
|
||||
std::string flowPixel = R"EOSHADER(
|
||||
|
||||
float4 main(v2f IN) : SV_Target0
|
||||
{
|
||||
uint zero = IN.tri;
|
||||
|
||||
float4 ret = float4(0,0,0,0);
|
||||
|
||||
// test multiple ifs
|
||||
if(zero < 5)
|
||||
{
|
||||
ret.w += 2.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.w += 4.0f;
|
||||
}
|
||||
|
||||
if(zero > 1)
|
||||
{
|
||||
ret.w += 8.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.w += 16.0f;
|
||||
}
|
||||
|
||||
// test nested ifs
|
||||
if(zero < 5)
|
||||
{
|
||||
if(zero > 1)
|
||||
{
|
||||
ret.z += 2.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.z += 4.0f;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(zero < 10)
|
||||
{
|
||||
ret.z += 8.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret.z += 16.0f;
|
||||
}
|
||||
}
|
||||
|
||||
// test loops
|
||||
ret.y = 1.0f;
|
||||
for(uint i=0; i < zero + 5; i++)
|
||||
{
|
||||
ret.y += 1.0f;
|
||||
}
|
||||
|
||||
for(uint j=0; j < zero; j++)
|
||||
{
|
||||
ret.y += 100.0f;
|
||||
}
|
||||
|
||||
for(uint k=0; k < zero + 2; k++)
|
||||
{
|
||||
for(uint l=0; l < zero + 3; l++)
|
||||
{
|
||||
ret.y += 10.0f;
|
||||
}
|
||||
}
|
||||
|
||||
// test switches
|
||||
switch(zero)
|
||||
{
|
||||
// fallthrough
|
||||
case 1:
|
||||
case 0:
|
||||
ret.x += 1.0f;
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
ret.x += 2.0f;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch(zero+4)
|
||||
{
|
||||
// fallthrough
|
||||
case 1:
|
||||
case 0:
|
||||
ret.x += 4.0f;
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
ret.x += 8.0f;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
)EOSHADER";
|
||||
|
||||
std::string msaaPixel = R"EOSHADER(
|
||||
@@ -769,10 +876,11 @@ float4 main(v2f IN, uint samp : SV_SampleIndex) : SV_Target0
|
||||
|
||||
ID3D11VertexShaderPtr vs = CreateVS(vsblob);
|
||||
ID3D11PixelShaderPtr ps = CreatePS(psblob);
|
||||
ID3D11PixelShaderPtr flowps = CreatePS(Compile(common + flowPixel, "main", "ps_5_0"));
|
||||
|
||||
static const uint32_t texDim = AlignUp(numTests, 64U) * 4;
|
||||
|
||||
ID3D11Texture2DPtr fltTex = MakeTexture(DXGI_FORMAT_R32G32B32A32_FLOAT, texDim, 4).RTV();
|
||||
ID3D11Texture2DPtr fltTex = MakeTexture(DXGI_FORMAT_R32G32B32A32_FLOAT, texDim, 8).RTV();
|
||||
ID3D11RenderTargetViewPtr fltRT = MakeRTV(fltTex);
|
||||
|
||||
float triWidth = 8.0f / float(texDim);
|
||||
@@ -888,8 +996,14 @@ float4 main(v2f IN, uint samp : SV_SampleIndex) : SV_Target0
|
||||
ctx->OMSetRenderTargetsAndUnorderedAccessViews(1, &fltRT.GetInterfacePtr(), NULL, 1, 2, uavs,
|
||||
NULL);
|
||||
|
||||
setMarker("Main Test");
|
||||
ctx->DrawInstanced(3, numTests, 0, 0);
|
||||
|
||||
RSSetViewport({0.0f, 4.0f, (float)texDim, 4.0f, 0.0f, 1.0f});
|
||||
ctx->PSSetShader(flowps, NULL, 0);
|
||||
setMarker("Flow Test");
|
||||
ctx->DrawInstanced(3, 1, 0, 0);
|
||||
|
||||
ctx->OMSetRenderTargets(1, &msaaRT.GetInterfacePtr(), NULL);
|
||||
|
||||
RSSetViewport({0.0f, 0.0f, 8.0f, 8.0f, 0.0f, 1.0f});
|
||||
@@ -897,6 +1011,7 @@ float4 main(v2f IN, uint samp : SV_SampleIndex) : SV_Target0
|
||||
ctx->IASetInputLayout(defaultLayout);
|
||||
ctx->VSSetShader(vsmsaa, NULL, 0);
|
||||
ctx->PSSetShader(psmsaa, NULL, 0);
|
||||
setMarker("MSAA Test");
|
||||
ctx->Draw(3, 0);
|
||||
|
||||
Present();
|
||||
|
||||
@@ -8,7 +8,7 @@ class D3D11_Shader_Debug_Zoo(rdtest.TestCase):
|
||||
|
||||
def check_capture(self):
|
||||
# Jump to the action
|
||||
action = self.find_action("Draw")
|
||||
action = self.find_action("Main Test").next
|
||||
|
||||
self.controller.SetFrameEvent(action.eventId, False)
|
||||
|
||||
@@ -41,8 +41,35 @@ class D3D11_Shader_Debug_Zoo(rdtest.TestCase):
|
||||
rdtest.log.success("Test {} matched as expected".format(test))
|
||||
rdtest.log.end_section("General tests")
|
||||
|
||||
rdtest.log.begin_section("Flow tests")
|
||||
action = self.find_action("Flow Test").next
|
||||
self.controller.SetFrameEvent(action.eventId, False)
|
||||
pipe: rd.PipeState = self.controller.GetPipelineState()
|
||||
|
||||
# Debug the shader
|
||||
trace: rd.ShaderDebugTrace = self.controller.DebugPixel(0, 4, rd.ReplayController.NoPreference,
|
||||
rd.ReplayController.NoPreference)
|
||||
|
||||
cycles, variables = self.process_trace(trace)
|
||||
|
||||
output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0)
|
||||
|
||||
debugged = self.evaluate_source_var(output, variables)
|
||||
|
||||
try:
|
||||
self.check_pixel_value(pipe.GetOutputTargets()[0].resourceId, 0, 4, debugged.value.f32v[0:4])
|
||||
self.check_pixel_value(pipe.GetOutputTargets()[0].resourceId, 0, 4, [9.0, 66.0, 4.0, 18.0])
|
||||
except rdtest.TestFailureException as ex:
|
||||
raise rdtest.TestFailureException("Flow test did not match. {}".format(str(ex)))
|
||||
finally:
|
||||
self.controller.FreeTrace(trace)
|
||||
|
||||
rdtest.log.success("Flow test matched as expected")
|
||||
|
||||
rdtest.log.end_section("Flow tests")
|
||||
|
||||
rdtest.log.begin_section("MSAA tests")
|
||||
action = action.next
|
||||
action = self.find_action("MSAA Test").next
|
||||
self.controller.SetFrameEvent(action.eventId, False)
|
||||
pipe: rd.PipeState = self.controller.GetPipelineState()
|
||||
for test in range(4):
|
||||
|
||||
Reference in New Issue
Block a user