From 04af66d71f2cbaf54495d60c3be568ffcb905dea Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 11 Sep 2026 16:19:32 +0100 Subject: [PATCH] Check for failed ShaderDebugTrace centrally * We don't expect the debug to fail entirely and if it does we can throw a test failure --- util/test/rdtest/shared/Buffer_Truncation.py | 54 +++++++++---------- util/test/rdtest/shared/Groupshared.py | 3 -- util/test/rdtest/shared/Subgroup_Zoo.py | 10 ---- util/test/rdtest/testcase.py | 12 ++--- .../D3D11/D3D11_AMD_Shader_Extensions.py | 5 -- .../tests/D3D11/D3D11_Shader_Debug_Zoo.py | 5 -- .../tests/D3D11/D3D11_Shader_Linkage_Zoo.py | 4 -- .../D3D12/D3D12_AMD_Shader_Extensions.py | 5 -- .../tests/D3D12/D3D12_Shader_Linkage_Zoo.py | 4 -- util/test/tests/D3D12/D3D12_Vertex_UAV.py | 3 -- util/test/tests/GL/GL_Shader_Debug_Zoo.py | 6 --- util/test/tests/Iter_Test.py | 11 ---- .../test/tests/Vulkan/VK_Graphics_Pipeline.py | 3 -- .../tests/Vulkan/VK_KHR_Buffer_Address.py | 3 -- util/test/tests/Vulkan/VK_Multi_Entry.py | 3 -- util/test/tests/Vulkan/VK_Multi_View.py | 6 --- util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py | 6 --- 17 files changed, 29 insertions(+), 114 deletions(-) diff --git a/util/test/rdtest/shared/Buffer_Truncation.py b/util/test/rdtest/shared/Buffer_Truncation.py index c4a88ebfa..d750863a2 100644 --- a/util/test/rdtest/shared/Buffer_Truncation.py +++ b/util/test/rdtest/shared/Buffer_Truncation.py @@ -129,35 +129,31 @@ class Buffer_Truncation(rdtest.TestCase): rd.DebugPixelInputs(), ) - if trace.debugger is None: - self.controller.FreeTrace(trace) - raise rdtest.TestFailureException("Shader did not debug at all") + cycles, variables = self.process_trace(trace) + + cbuf_sourceVars = [s for s in trace.sourceVars if s.variables[0].type == rd.DebugVariableType.Constant and s.rows > 0] + + # Vulkan style, one source var for the cbuffer + if len(cbuf_sourceVars) == 1: + debugged_cb = trace.constantBlocks[0] + + assert debugged_cb.members[0].name == 'padding' + assert debugged_cb.members[1].name == 'outcol' + + if not rdtest.value_compare(debugged_cb.members[1].value.f32v[0:4], [0.0, 0.0, 0.0, 0.0]): + raise rdtest.TestFailureException(f"expected outcol to be 0s, but got {debugged_cb.members[1].value.f32v[0:4]}") + # D3D style, one source var for each member mapping to a register + elif len(cbuf_sourceVars) == 17: + debugged_cb = trace.constantBlocks[0].members[16] + + assert all(['consts.padding[' in c.name for c in cbuf_sourceVars[0:16]]) + assert cbuf_sourceVars[16].name == 'consts.outcol' + + assert cbuf_sourceVars[16].variables[0].name == 'cb0[16]' or cbuf_sourceVars[16].variables[0].name == 'consts[16]' + + if not rdtest.value_compare(debugged_cb.value.f32v[0:4], [0.0, 0.0, 0.0, 0.0]): + raise rdtest.TestFailureException(f"expected outcol to be 0s, but got {debugged_cb.members[1].value.f32v[0:4]}") else: - cycles, variables = self.process_trace(trace) - - cbuf_sourceVars = [s for s in trace.sourceVars if s.variables[0].type == rd.DebugVariableType.Constant and s.rows > 0] - - # Vulkan style, one source var for the cbuffer - if len(cbuf_sourceVars) == 1: - debugged_cb = trace.constantBlocks[0] - - assert debugged_cb.members[0].name == 'padding' - assert debugged_cb.members[1].name == 'outcol' - - if not rdtest.value_compare(debugged_cb.members[1].value.f32v[0:4], [0.0, 0.0, 0.0, 0.0]): - raise rdtest.TestFailureException(f"expected outcol to be 0s, but got {debugged_cb.members[1].value.f32v[0:4]}") - # D3D style, one source var for each member mapping to a register - elif len(cbuf_sourceVars) == 17: - debugged_cb = trace.constantBlocks[0].members[16] - - assert all(['consts.padding[' in c.name for c in cbuf_sourceVars[0:16]]) - assert cbuf_sourceVars[16].name == 'consts.outcol' - - assert cbuf_sourceVars[16].variables[0].name == 'cb0[16]' or cbuf_sourceVars[16].variables[0].name == 'consts[16]' - - if not rdtest.value_compare(debugged_cb.value.f32v[0:4], [0.0, 0.0, 0.0, 0.0]): - raise rdtest.TestFailureException(f"expected outcol to be 0s, but got {debugged_cb.members[1].value.f32v[0:4]}") - else: - raise rdtest.TestFailureException(f"Unexpected number of constant buffer source vars {len(cbuf_sourceVars)}") + raise rdtest.TestFailureException(f"Unexpected number of constant buffer source vars {len(cbuf_sourceVars)}") rdtest.log.success("CBuffer value was truncated as expected") diff --git a/util/test/rdtest/shared/Groupshared.py b/util/test/rdtest/shared/Groupshared.py index 16e8ea388..49432a8f4 100644 --- a/util/test/rdtest/shared/Groupshared.py +++ b/util/test/rdtest/shared/Groupshared.py @@ -13,9 +13,6 @@ class Groupshared(rdtest.TestCase): try: _, variables = self.process_trace(trace) - if trace.debugger is None: - raise rdtest.TestFailureException(f"Test {test} at {action.eventId} got no debug result at {x},{y},{z}") - # Find the source variable 'outval' at the highest instruction index name = 'outval' debugged = None diff --git a/util/test/rdtest/shared/Subgroup_Zoo.py b/util/test/rdtest/shared/Subgroup_Zoo.py index d031ed2d9..8e41f9f54 100644 --- a/util/test/rdtest/shared/Subgroup_Zoo.py +++ b/util/test/rdtest/shared/Subgroup_Zoo.py @@ -23,9 +23,6 @@ class Subgroup_Zoo(rdtest.TestCase): try: _, variables = self.process_trace(trace) - if trace.debugger is None: - raise rdtest.TestFailureException(f"Test {test} at {action.eventId} got no debug result at {x},{y},{z}") - # Find the source variable 'testResult' at the highest instruction index name = 'testResult' debugged = None @@ -186,13 +183,6 @@ class Subgroup_Zoo(rdtest.TestCase): inputs.view = view trace = self.controller.DebugPixel(x, y, inputs) - if trace.debugger is None: - self.controller.FreeTrace(trace) - rdtest.log.error( - f"Test {idx} at {action.eventId} got no debug result at {x},{y}") - failed = True - continue - _, variables = self.process_trace(trace) output_sourcevar = self.find_output_source_var( diff --git a/util/test/rdtest/testcase.py b/util/test/rdtest/testcase.py index afe39c750..968705980 100644 --- a/util/test/rdtest/testcase.py +++ b/util/test/rdtest/testcase.py @@ -652,9 +652,6 @@ class TestCase: if view >= 0: ctx += f" view {view}" - if debug.trace.debugger is None: - raise TestFailureException(f"Couldn't debug {ctx}") - cycles, variables = self.process_trace(debug.trace) postvs_vtx = vtx @@ -918,7 +915,8 @@ class TestCase: return ret def generate_full_trace(self, trace: rd.ShaderDebugTrace) -> List[rd.ShaderDebugState]: - assert trace.debugger is not None + if trace.debugger is None: + raise TestFailureException("Couldn't debug shader at all") allStates: List[rd.ShaderDebugState] = [] allChanges: List[List[rd.ShaderVariableChange]] = [] @@ -933,7 +931,8 @@ class TestCase: return allStates def process_trace(self, trace: rd.ShaderDebugTrace, validate: bool = True): - assert trace.debugger is not None + if trace.debugger is None: + raise TestFailureException("Couldn't debug shader at all") variables: Dict[str, rd.ShaderVariable] = {} cycles = 0 @@ -1165,9 +1164,6 @@ class TestCase: # Debug the shader trace = self.controller.DebugPixel(x, y, rd.DebugPixelInputs()) - if trace.debugger is None: - self.controller.FreeTrace(trace) - raise TestFailureException(f"Pixel shader could not be debugged at {x},{y}.") _, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) diff --git a/util/test/tests/D3D11/D3D11_AMD_Shader_Extensions.py b/util/test/tests/D3D11/D3D11_AMD_Shader_Extensions.py index 10821d329..ce018bb14 100644 --- a/util/test/tests/D3D11/D3D11_AMD_Shader_Extensions.py +++ b/util/test/tests/D3D11/D3D11_AMD_Shader_Extensions.py @@ -85,11 +85,6 @@ class D3D11_AMD_Shader_Extensions(rdtest.TestCase): trace = self.controller.DebugThread((0, 0, 0), (0, 0, 0)) - if trace.debugger is None: - self.controller.FreeTrace(trace) - - raise rdtest.TestFailureException("Couldn't debug compute shader") - cycles, variables = self.process_trace(trace) if cycles < 3: diff --git a/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py b/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py index f948fadd1..cc617917e 100644 --- a/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py +++ b/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py @@ -27,11 +27,6 @@ class D3D11_Shader_Debug_Zoo(rdtest.TestCase): # Debug the shader trace = self.controller.DebugPixel(4 * test, 4 * idx, rd.DebugPixelInputs()) - if trace.debugger is None: - rdtest.log.error(f"Test {test} failed to debug.") - self.controller.FreeTrace(trace) - continue - cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) diff --git a/util/test/tests/D3D11/D3D11_Shader_Linkage_Zoo.py b/util/test/tests/D3D11/D3D11_Shader_Linkage_Zoo.py index 60082f064..bc1c6da71 100644 --- a/util/test/tests/D3D11/D3D11_Shader_Linkage_Zoo.py +++ b/util/test/tests/D3D11/D3D11_Shader_Linkage_Zoo.py @@ -19,10 +19,6 @@ class D3D11_Shader_Linkage_Zoo(rdtest.TestCase): # Debug the shader trace = self.controller.DebugPixel(200, 150, rd.DebugPixelInputs()) - if trace.debugger is None: - failed = True - rdtest.log.error(f"Test {event_name} could not be debugged.") - continue cycles, variables = self.process_trace(trace) diff --git a/util/test/tests/D3D12/D3D12_AMD_Shader_Extensions.py b/util/test/tests/D3D12/D3D12_AMD_Shader_Extensions.py index 9c85cb396..1f4297cc8 100644 --- a/util/test/tests/D3D12/D3D12_AMD_Shader_Extensions.py +++ b/util/test/tests/D3D12/D3D12_AMD_Shader_Extensions.py @@ -114,11 +114,6 @@ class D3D12_AMD_Shader_Extensions(rdtest.TestCase): trace = self.controller.DebugThread((0, 0, 0), (0, 0, 0)) - if trace.debugger is None: - self.controller.FreeTrace(trace) - - raise rdtest.TestFailureException("Couldn't debug compute shader") - cycles, variables = self.process_trace(trace) if cycles < 3: diff --git a/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py index 68c2207e1..edfeda7ba 100644 --- a/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py @@ -27,10 +27,6 @@ class D3D12_Shader_Linkage_Zoo(rdtest.TestCase): # Debug the shader trace = self.controller.DebugPixel(200, 150, rd.DebugPixelInputs()) - if trace.debugger is None: - failed = True - rdtest.log.error(f"Test {event_name} could not be debugged.") - continue cycles, variables = self.process_trace(trace) diff --git a/util/test/tests/D3D12/D3D12_Vertex_UAV.py b/util/test/tests/D3D12/D3D12_Vertex_UAV.py index 6031118c4..f62f12063 100644 --- a/util/test/tests/D3D12/D3D12_Vertex_UAV.py +++ b/util/test/tests/D3D12/D3D12_Vertex_UAV.py @@ -51,9 +51,6 @@ class D3D12_Vertex_UAV(rdtest.TestCase): # Debug the shader trace = self.controller.DebugPixel(50, 50, rd.DebugPixelInputs()) - if trace.debugger is None: - raise rdtest.TestFailureException(f"Pixel shader at {name} could not be debugged.") - self.controller.FreeTrace(trace) cycles, variables = self.process_trace(trace) diff --git a/util/test/tests/GL/GL_Shader_Debug_Zoo.py b/util/test/tests/GL/GL_Shader_Debug_Zoo.py index f57af1b61..23d04099f 100644 --- a/util/test/tests/GL/GL_Shader_Debug_Zoo.py +++ b/util/test/tests/GL/GL_Shader_Debug_Zoo.py @@ -52,12 +52,6 @@ class GL_Shader_Debug_Zoo(rdtest.TestCase): rdtest.log.print(f"debugging {x},{y}") - if trace.debugger is None: - failed = True - rdtest.log.error(f"Test {test} in sub-section {child} did not debug pixel") - self.controller.FreeTrace(trace) - continue - _, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) diff --git a/util/test/tests/Iter_Test.py b/util/test/tests/Iter_Test.py index 6b43353e5..436021ce7 100644 --- a/util/test/tests/Iter_Test.py +++ b/util/test/tests/Iter_Test.py @@ -83,11 +83,6 @@ class Iter_Test(rdtest.TestCase): rdtest.log.print(f"Debug Thread Workgroup:{wgSize} groupid:{groupid} threadid:{threadid}") trace = self.controller.DebugThread(groupid, threadid) - if trace.debugger is None: - self.controller.FreeTrace(trace) - rdtest.log.print("No debug result") - return - try: cycles, variables = self.process_trace(trace) except rdtest.TestFailureException as err: @@ -269,12 +264,6 @@ class Iter_Test(rdtest.TestCase): inputs.primitive = lastmod.primitiveID; trace = self.controller.DebugPixel(x, y, inputs) - if trace.debugger is None: - self.controller.FreeTrace(trace) - - rdtest.log.print("No debug result") - return - try: cycles, variables = self.process_trace(trace) except rdtest.TestFailureException as err: diff --git a/util/test/tests/Vulkan/VK_Graphics_Pipeline.py b/util/test/tests/Vulkan/VK_Graphics_Pipeline.py index 4ec3afd9f..532cc8355 100644 --- a/util/test/tests/Vulkan/VK_Graphics_Pipeline.py +++ b/util/test/tests/Vulkan/VK_Graphics_Pipeline.py @@ -99,9 +99,6 @@ class VK_Graphics_Pipeline(rdtest.TestCase): inputs.primitive = 0 trace = self.controller.DebugPixel(200, 150, inputs) - if trace.debugger is None: - raise rdtest.TestFailureException("No pixel debug result") - cycles, variables = self.process_trace(trace) output_sourcevar = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) diff --git a/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py b/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py index 14225e01c..9180818cd 100644 --- a/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py +++ b/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py @@ -25,9 +25,6 @@ class VK_KHR_Buffer_Address(rdtest.TestCase): # Debug the pixel shader trace = self.controller.DebugPixel(x, y, rd.DebugPixelInputs()) - if trace.debugger is None: - self.controller.FreeTrace(trace) - raise rdtest.TestFailureException(f"Test {test_name} did not debug at all") cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) diff --git a/util/test/tests/Vulkan/VK_Multi_Entry.py b/util/test/tests/Vulkan/VK_Multi_Entry.py index 09b5baf2a..99bdfd542 100644 --- a/util/test/tests/Vulkan/VK_Multi_Entry.py +++ b/util/test/tests/Vulkan/VK_Multi_Entry.py @@ -63,9 +63,6 @@ class VK_Multi_Entry(rdtest.TestCase): assert len(refl.readOnlyResources) == 1 - if trace.debugger is None: - raise rdtest.TestFailureException("No pixel debug result") - cycles, variables = self.process_trace(trace) output_sourcevar = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) diff --git a/util/test/tests/Vulkan/VK_Multi_View.py b/util/test/tests/Vulkan/VK_Multi_View.py index ac46179a3..6ab9e101c 100644 --- a/util/test/tests/Vulkan/VK_Multi_View.py +++ b/util/test/tests/Vulkan/VK_Multi_View.py @@ -30,9 +30,6 @@ class VK_Multi_View(rdtest.TestCase): inputs = rd.DebugPixelInputs() inputs.view = view trace = self.controller.DebugPixel(x, y, inputs) - if trace.debugger is None: - self.controller.FreeTrace(trace) - raise rdtest.TestFailureException(f"Test {test_name} view {view} did not debug at all") cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) @@ -73,9 +70,6 @@ class VK_Multi_View(rdtest.TestCase): inputs = rd.DebugPixelInputs() inputs.view = view trace = self.controller.DebugPixel(x, y, inputs) - if trace.debugger is None: - self.controller.FreeTrace(trace) - raise rdtest.TestFailureException(f"Test {test_name} view {view} did not debug at all") cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) diff --git a/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py b/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py index d7e0258fc..d4c5107c5 100644 --- a/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py +++ b/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py @@ -34,12 +34,6 @@ class VK_Shader_Debug_Zoo(rdtest.TestCase): # Debug the shader trace = self.controller.DebugPixel(x, y, rd.DebugPixelInputs()) - if trace.debugger is None: - failed = True - rdtest.log.error(f"Test {test} in sub-section {child} did not debug at all") - self.controller.FreeTrace(trace) - continue - _, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0)