diff --git a/util/test/demos/d3d12/d3d12_shader_debugdata_zoo.cpp b/util/test/demos/d3d12/d3d12_shader_debugdata_zoo.cpp index c96d8f9a4..a7c76d27c 100644 --- a/util/test/demos/d3d12/d3d12_shader_debugdata_zoo.cpp +++ b/util/test/demos/d3d12/d3d12_shader_debugdata_zoo.cpp @@ -150,6 +150,13 @@ struct TestStruct testResult.x = testStruct.anon.a.x; testResult.y = testStruct.anon.b.x; } + else if(testIndex == 4) + { + testResult.x = intVal * 7; + testResult.y = intVal * 5; + SET_DATA(testIndex, testResult); + EARLY_RETURN; + } else { testResult = 0.4f; @@ -161,6 +168,8 @@ struct TestStruct std::string pixel = R"EOSHADER( +#define SET_DATA(INDEX, DATA) +#define EARLY_RETURN return testResult #define TEST_INDEX IN.tri )EOSHADER" + testDefines + R"EOSHADER( @@ -178,12 +187,19 @@ float4 main(v2f IN) : SV_Target0 std::string compute = R"EOSHADER( +RWStructuredBuffer bufOut : register(u0); + +void SetOutput(uint index, float4 data) +{ + bufOut[index] = data; +} + +#define SET_DATA(INDEX, DATA) SetOutput(INDEX, DATA) +#define EARLY_RETURN return #define TEST_INDEX inTestIndex )EOSHADER" + testDefines + R"EOSHADER( -RWStructuredBuffer bufOut : register(u0); - [numthreads(1,1,1)] void main(int inTestIndex: SV_GroupID) { @@ -191,7 +207,7 @@ void main(int inTestIndex: SV_GroupID) )EOSHADER" + testsBody + R"EOSHADER( - bufOut[testIndex] = testResult; + SetOutput(testIndex, testResult); } )EOSHADER"; diff --git a/util/test/rdtest/testcase.py b/util/test/rdtest/testcase.py index 5036ae0fe..4e08a57a0 100644 --- a/util/test/rdtest/testcase.py +++ b/util/test/rdtest/testcase.py @@ -706,7 +706,7 @@ class TestCase: raise KeyError("Couldn't find {} in debug vars".format(path)) - raise KeyError("Couldn't parse path {}".format(path)) + raise KeyError(f"Couldn't find '{path}' in debug vars or parse it") def evaluate_source_var(self, sourceVar: rd.SourceVariableMapping, debugVars) -> rd.ShaderVariable: diff --git a/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py index 2b90dfba0..032e97c0e 100644 --- a/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py @@ -125,7 +125,19 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): shaderSrcRaw = debugInfo.files[0].contents varsToCheck = self.parse_shader_source(shaderSrcRaw, realTestResult, test) for name, varType, expectedValue in varsToCheck: - debuggedValue = self.get_source_shader_var_value(trace.instInfo[-1].sourceVars, name, varType, variables) + debuggedValue = None + countInst = len(trace.instInfo) + for inst in range(countInst): + sourceVars = trace.instInfo[countInst-1-inst].sourceVars + try: + debuggedValue = self.get_source_shader_var_value(sourceVars, name, varType, variables) + except KeyError as ex: + continue + except rdtest.TestFailureException as ex: + continue + break + if debuggedValue is None: + raise rdtest.TestFailureException(f"Couldn't find source variable {name} {varType}") if not rdtest.value_compare(expectedValue, debuggedValue): raise rdtest.TestFailureException(f"'{name}' {varType} debugger {debuggedValue} doesn't match expected {expectedValue}") rdtest.log.success(f"{len(varsToCheck)} source variables matched as expected") @@ -184,7 +196,19 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): varsToCheck = self.parse_shader_source(shaderSrcRaw, realTestResult, test) try: for name, varType, expectedValue in varsToCheck: - debuggedValue = self.get_source_shader_var_value(trace.instInfo[-1].sourceVars, name, varType, variables) + debuggedValue = None + countInst = len(trace.instInfo) + for inst in range(countInst): + sourceVars = trace.instInfo[countInst-1-inst].sourceVars + try: + debuggedValue = self.get_source_shader_var_value(sourceVars, name, varType, variables) + except KeyError as ex: + continue + except rdtest.TestFailureException as ex: + continue + break + if debuggedValue is None: + raise rdtest.TestFailureException(f"Couldn't find source variable {name} {varType}") if not rdtest.value_compare(expectedValue, debuggedValue): raise rdtest.TestFailureException(f"'{name}' {varType} debugger {debuggedValue} doesn't match expected {expectedValue}") rdtest.log.success(f"{len(varsToCheck)} source variables matched as expected")