diff --git a/util/test/rdtest/shared/Subgroup_Zoo.py b/util/test/rdtest/shared/Subgroup_Zoo.py index 925bc9edd..b42740088 100644 --- a/util/test/rdtest/shared/Subgroup_Zoo.py +++ b/util/test/rdtest/shared/Subgroup_Zoo.py @@ -154,49 +154,15 @@ class Subgroup_Zoo(rdtest.TestCase): for view in range(pipe.MultiviewBroadcastCount()): postvs = self.get_postvs( - action, rd.MeshDataStage.VSOut, first_index=0, num_indices=action.numIndices, instance=inst) + action, rd.MeshDataStage.VSOut, first_index=0, num_indices=action.numIndices, instance=inst, view = view) for vtx in range(action.numIndices): - trace = self.controller.DebugVertex(vtx, inst, vtx, view) - - if trace.debugger is None: - self.controller.FreeTrace(trace) - - rdtest.log.error( - f"Test {idx} at {action.eventId} got no debug result at {vtx} inst {inst} view {view}") + success, err = self.check_vertex_debug(vtx, idx, inst, postvs, fatal=False) + if not success: failed = True + rdtest.log.error(f"Test {idx} at {action.eventId}: {err}") continue - _, variables = self.process_trace(trace) - - for var in trace.sourceVars: - if var.name == 'vertdata': - name = var.name - - if var.name not in postvs[vtx].keys(): - rdtest.log.error( - f"Don't have expected output for {var.name}") - failed = True - continue - - real = postvs[vtx][name] - assert rdtest.is_vector(real) - debugged = self.evaluate_source_var( - var, variables) - - if debugged.columns != 4 or len(real) != 4: - rdtest.log.error( - f"Vertex output is not the right size ({len(real)} vs {debugged.columns})") - failed = True - continue - - if not rdtest.value_compare(real, debugged.value.f32v[0:4], eps=5.0E-06): - rdtest.log.error( - f"Test {idx} at {action.eventId} debugged vertex value {debugged.value.f32v[0:4]} at {vtx} instance {inst} view {view} does not match output {real}") - failed = True - - self.controller.FreeTrace(trace) - # check some assorted pixel outputs target = pipe.GetOutputTargets()[0].resource diff --git a/util/test/rdtest/testcase.py b/util/test/rdtest/testcase.py index 10e4c33ed..9d7121d02 100644 --- a/util/test/rdtest/testcase.py +++ b/util/test/rdtest/testcase.py @@ -535,22 +535,22 @@ class TestCase: *, view=-1, eps=util.FLT_EPSILON, + fatal=True, single_postvs=False, ignore_uninit=False, name_retry: Callable[[str], str] | None = None - ): - trace = self.controller.DebugVertex(vtx, inst, idx, max(0, view)) - - ctx = f"vertex {vtx} (idx {idx}) instance {inst}" - if view >= 0: - ctx += f" view {view}" - - if trace.debugger is None: - self.controller.FreeTrace(trace) - - raise TestFailureException(f"Couldn't debug {ctx}") - + ) -> Tuple[bool, str]: + trace = None try: + trace = self.controller.DebugVertex(vtx, inst, idx, max(0, view)) + + ctx = f"vertex {vtx} (idx {idx}) instance {inst}" + if view >= 0: + ctx += f" view {view}" + + if trace.debugger is None: + raise TestFailureException(f"Couldn't debug {ctx}") + cycles, variables = self.process_trace(trace) postvs_vtx = vtx @@ -601,8 +601,14 @@ class TestCase: f"Debugged value {name} at {ctx}: {debugged} doesn't exactly match postvs output {expect}. {diff_amt} difference") log.success(f'Successfully debugged vertex {ctx} in {cycles} cycles') + except TestFailureException as ex: + if not fatal: + return False, ex.message + raise ex finally: - self.controller.FreeTrace(trace) + if trace is not None: + self.controller.FreeTrace(trace) + return True, "" def run(self): self.capture_filename = self.get_capture() diff --git a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py index c016f8314..56babe23b 100644 --- a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py @@ -133,25 +133,20 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): rdtest.log.print(f"Skipping Graphics tests for {sectionName}") continue action = test_marker.nextAction + assert action is not None self.controller.SetFrameEvent(action.eventId, False) pipe = self.controller.GetPipelineState() if pipe.GetShaderReflection(rd.ShaderStage.Vertex).debugInfo.debuggable: - # Debug the vertex shader - trace = self.controller.DebugVertex(0, instId, 0, 0) - cycles, variables = self.process_trace(trace) - output = self.find_output_source_var(trace, rd.ShaderBuiltin.Undefined, 4) - assert output is not None - debugged = self.evaluate_source_var(output, variables) - self.controller.FreeTrace(trace) - actual = debugged.value.u32v[0] - expected = instId - if not rdtest.value_compare(actual, expected): + postvs = self.get_postvs(action, rd.MeshDataStage.VSOut, instance=instId) + + success, err = self.check_vertex_debug(0, 0, instId, postvs, fatal=False) + if not success: failed = True - rdtest.log.error( - f"Vertex shader TRIANGLE output did not match expectation {actual} != {expected}") - if not failed: + rdtest.log.error(f"Basic VS debugging didn't match: {err}") + continue + else: rdtest.log.success("Basic VS debugging was successful") else: rdtest.log.print(f"Ignoring undebuggable Vertex shader at {action.eventId} for {shaderModels[sm]}.") @@ -244,26 +239,19 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): rdtest.log.print(f"Skipping Vertex Sample tests for {shaderModels[sm]}") continue action = test_marker.nextAction + assert action is not None self.controller.SetFrameEvent(action.eventId, False) pipe = self.controller.GetPipelineState() if pipe.GetShaderReflection(rd.ShaderStage.Vertex).debugInfo.debuggable: # Debug the vertex shader - trace = self.controller.DebugVertex(0, 0, 0, 0) - cycles, variables = self.process_trace(trace) - output = self.find_output_source_var(trace, rd.ShaderBuiltin.Undefined, 1) - assert output is not None - debugged = self.evaluate_source_var(output, variables) - self.controller.FreeTrace(trace) - - actual = debugged.value.f32v[0:4] - expected = [0.3, 0.5, 0.8, 1.0] - if not rdtest.value_compare(actual, expected): + success, err = self.check_vertex_debug(0, 0, 0, self.get_postvs(action, rd.MeshDataStage.VSOut), fatal=False) + if not success: failed = True rdtest.log.error( - f"{shaderModels[sm]} Vertex shader color output did not match expectation {actual} != {expected}") - - if not failed: + f"{shaderModels[sm]} Vertex shader failed: {err}") + continue + else: rdtest.log.success(shaderModels[sm] + " VertexSample VS was debugged correctly") else: rdtest.log.print(f"Skipping undebuggable Vertex shader at {action.eventId} for {shaderModels[sm]}.") @@ -294,30 +282,12 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): test_marker = self.find_action("Banned") action = test_marker.nextAction + assert action is not None self.controller.SetFrameEvent(action.eventId, False) pipe = self.controller.GetPipelineState() - # Debug the vertex shader - trace = self.controller.DebugVertex(0, 0, 0, 0) - - cycles, variables = self.process_trace(trace) - - output = self.find_output_source_var(trace, rd.ShaderBuiltin.Position, 0) - - assert output is not None - - debugged = self.evaluate_source_var(output, variables) - - self.controller.FreeTrace(trace) - - actual = debugged.value.f32v[0:4] - expected = [-0.5, -0.5, 0.0, 1.0] - if not rdtest.value_compare(actual, expected): - failed = True - rdtest.log.error(f"Banned signature vertex shader position did not match expectation {actual} != {expected}") - - if not failed: - rdtest.log.success("Banned signature VS was debugged correctly") + # Debug the banned vertex shader + self.check_vertex_debug(0, 0, 0, self.get_postvs(action, rd.MeshDataStage.VSOut), fatal=False) # Debug the pixel shader inputs = rd.DebugPixelInputs() diff --git a/util/test/tests/GL/GL_Shader_Debug_Zoo.py b/util/test/tests/GL/GL_Shader_Debug_Zoo.py index 93a253eb2..32bde62fb 100644 --- a/util/test/tests/GL/GL_Shader_Debug_Zoo.py +++ b/util/test/tests/GL/GL_Shader_Debug_Zoo.py @@ -102,11 +102,10 @@ class GL_Shader_Debug_Zoo(rdtest.TestCase): postvs = self.get_postvs(action, rd.MeshDataStage.VSOut, first_index=vtx, num_indices=1, instance=inst) - try: - self.check_vertex_debug(vtx, idx, inst, postvs, single_postvs=True, name_retry = lambda x: x.replace(".", "Block.")) - except rdtest.TestFailureException as err: + success, err = self.check_vertex_debug(vtx, idx, inst, postvs, fatal=False, single_postvs=True, name_retry = lambda x: x.replace(".", "Block.")) + if not success: failed = True - rdtest.log.error(f"Error debugging vertex at test {test} in sub-section {child}: {err.message}") + rdtest.log.error(f"Error debugging vertex at test {test} in sub-section {child}: {err}") continue rdtest.log.success(f"Test {test} vertex in sub-section {child} matched as expected") diff --git a/util/test/tests/Iter_Test.py b/util/test/tests/Iter_Test.py index 06a9ae364..cf0153cc6 100644 --- a/util/test/tests/Iter_Test.py +++ b/util/test/tests/Iter_Test.py @@ -157,10 +157,9 @@ class Iter_Test(rdtest.TestCase): postvs = self.get_postvs(action, rd.MeshDataStage.VSOut, first_index=vtx, num_indices=1, instance=inst) - try: - self.check_vertex_debug(vtx, idx, inst, postvs, eps=5.0E-06, single_postvs=True, ignore_uninit=True) - except rdtest.TestFailureException as err: - rdtest.log.error(f"Error debugging at EID {action.eventId}: {err.message}") + success, err = self.check_vertex_debug(vtx, idx, inst, postvs, fatal=False, eps=5.0E-06, single_postvs=True, ignore_uninit=True) + if not success: + rdtest.log.error(f"Error debugging at EID {action.eventId}: {err}") return def pixel_debug(self, action: rd.ActionDescription):