From 191597b27c1cbddfb3fb104bfa4c3bd7a89464f1 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 11 Sep 2026 17:41:07 +0100 Subject: [PATCH] Don't allow find_*_source_var to return None * Almost all callers expect a return value, so better to raise an exception inside and make it non-optional return --- util/test/rdtest/shared/Subgroup_Zoo.py | 5 ----- util/test/rdtest/testcase.py | 17 +++++++++++++---- util/test/tests/D3D11/D3D11_CBuffer_Zoo.py | 2 -- util/test/tests/D3D11/D3D11_PrimitiveID.py | 7 ++++--- util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py | 6 ------ .../tests/D3D11/D3D11_Shader_Linkage_Zoo.py | 2 -- util/test/tests/D3D12/D3D12_CBuffer_Zoo.py | 2 -- util/test/tests/D3D12/D3D12_PrimitiveID.py | 9 +++++---- .../tests/D3D12/D3D12_Resource_Mapping_Zoo.py | 2 -- .../tests/D3D12/D3D12_Shader_DebugData_Zoo.py | 10 +++++----- util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py | 7 +------ .../tests/D3D12/D3D12_Shader_Linkage_Zoo.py | 2 -- util/test/tests/D3D12/D3D12_Vertex_UAV.py | 2 -- util/test/tests/GL/GL_Shader_Debug_Zoo.py | 2 -- util/test/tests/Iter_Test.py | 6 +++--- util/test/tests/Vulkan/VK_Graphics_Pipeline.py | 3 --- util/test/tests/Vulkan/VK_KHR_Buffer_Address.py | 2 +- util/test/tests/Vulkan/VK_Multi_Entry.py | 3 --- util/test/tests/Vulkan/VK_Multi_View.py | 4 ++-- util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py | 2 -- 20 files changed, 34 insertions(+), 61 deletions(-) diff --git a/util/test/rdtest/shared/Subgroup_Zoo.py b/util/test/rdtest/shared/Subgroup_Zoo.py index 8e41f9f54..d7eac2533 100644 --- a/util/test/rdtest/shared/Subgroup_Zoo.py +++ b/util/test/rdtest/shared/Subgroup_Zoo.py @@ -188,11 +188,6 @@ class Subgroup_Zoo(rdtest.TestCase): output_sourcevar = self.find_output_source_var( trace, rd.ShaderBuiltin.ColorOutput, 0) - if output_sourcevar is None: - rdtest.log.error("No output variable found") - failed = True - continue - debugged = self.evaluate_source_var( output_sourcevar, variables) diff --git a/util/test/rdtest/testcase.py b/util/test/rdtest/testcase.py index f34e4cdb8..d1be3256b 100644 --- a/util/test/rdtest/testcase.py +++ b/util/test/rdtest/testcase.py @@ -979,19 +979,30 @@ class TestCase: return vars[0] + def has_input_source_var(self, trace: rd.ShaderDebugTrace, builtin: rd.ShaderBuiltin, reg_index: int = -1): + refl = self.controller.GetPipelineState().GetShaderReflection(trace.stage) + sig_index = self.get_sig_index(refl.inputSignature, builtin, reg_index) + return self.find_source_var(trace.sourceVars, sig_index, rd.DebugVariableType.Input) is not None + def find_input_source_var(self, trace: rd.ShaderDebugTrace, builtin: rd.ShaderBuiltin, reg_index: int = -1): refl = self.controller.GetPipelineState().GetShaderReflection(trace.stage) sig_index = self.get_sig_index(refl.inputSignature, builtin, reg_index) - return self.find_source_var(trace.sourceVars, sig_index, rd.DebugVariableType.Input) + ret = self.find_source_var(trace.sourceVars, sig_index, rd.DebugVariableType.Input) + if ret is None: + raise TestFailureException(f"Couldn't find input source var {builtin!s} / {reg_index}") + return ret def find_output_source_var(self, trace: rd.ShaderDebugTrace, builtin: rd.ShaderBuiltin, reg_index: int = -1): refl = self.controller.GetPipelineState().GetShaderReflection(trace.stage) sig_index = self.get_sig_index(refl.outputSignature, builtin, reg_index) - return self.find_source_var(trace.sourceVars, sig_index, rd.DebugVariableType.Variable) + ret = self.find_source_var(trace.sourceVars, sig_index, rd.DebugVariableType.Variable) + if ret is None: + raise TestFailureException(f"Couldn't find input source var {builtin!s} / {reg_index}") + return ret def get_debug_var(self, debugVars: Dict[str, rd.ShaderVariable], path: str) -> rd.ShaderVariable: # first look for exact match @@ -1164,8 +1175,6 @@ class TestCase: _, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - if output is None: - raise TestFailureException(f"Couldn't find colour output source variable") debugged = self.evaluate_source_var(output, variables) self.controller.FreeTrace(trace) diff --git a/util/test/tests/D3D11/D3D11_CBuffer_Zoo.py b/util/test/tests/D3D11/D3D11_CBuffer_Zoo.py index 18ba41c0e..1f1333517 100644 --- a/util/test/tests/D3D11/D3D11_CBuffer_Zoo.py +++ b/util/test/tests/D3D11/D3D11_CBuffer_Zoo.py @@ -70,8 +70,6 @@ class D3D11_CBuffer_Zoo(rdtest.TestCase): output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None - debugged = self.evaluate_source_var(output, variables) if not rdtest.util.value_compare(debugged.value.f32v[0:4], [542.1, 543.0, 544.0, 545.0]): diff --git a/util/test/tests/D3D11/D3D11_PrimitiveID.py b/util/test/tests/D3D11/D3D11_PrimitiveID.py index 2c5dbfdd2..e88bcb1f6 100644 --- a/util/test/tests/D3D11/D3D11_PrimitiveID.py +++ b/util/test/tests/D3D11/D3D11_PrimitiveID.py @@ -25,13 +25,14 @@ class D3D11_PrimitiveID(rdtest.TestCase): _, variables = self.process_trace(trace) # Find the SV_PrimitiveID variable - primInput = self.find_input_source_var(trace, rd.ShaderBuiltin.PrimitiveIndex) - if primInput is None: + if not self.has_input_source_var(trace, rd.ShaderBuiltin.PrimitiveIndex): # If we didn't find it, then we should be expecting a 0 if len(expected_prim) != 1 or expected_prim[0] != 0: rdtest.log.error(f"Expected prim {expected_prim!s} at {x},{y} did not match actual prim {prim}.") return False else: + primInput = self.find_input_source_var(trace, rd.ShaderBuiltin.PrimitiveIndex) + # Look up the matching register in the inputs, and see if the expected value matches inputs = list(trace.inputs) primValue = [var for var in inputs if var.name == primInput.variables[0].name][0] @@ -43,7 +44,7 @@ class D3D11_PrimitiveID(rdtest.TestCase): # since we're testing overlapping primitives in a single action if expected_output is not None: output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None + debugged = self.evaluate_source_var(output, variables) if list(debugged.value.f32v[0:4]) != expected_output: rdtest.log.error(f"Expected value {expected_output} at {x},{y} did not match actual {debugged.value.f32v[0:4]}.") diff --git a/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py b/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py index cc617917e..5b0b38b43 100644 --- a/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py +++ b/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py @@ -31,8 +31,6 @@ class D3D11_Shader_Debug_Zoo(rdtest.TestCase): output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None - debugged = self.evaluate_source_var(output, variables) try: @@ -62,8 +60,6 @@ class D3D11_Shader_Debug_Zoo(rdtest.TestCase): output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None - debugged = self.evaluate_source_var(output, variables) try: @@ -99,8 +95,6 @@ class D3D11_Shader_Debug_Zoo(rdtest.TestCase): output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None - debugged = self.evaluate_source_var(output, variables) # Validate the debug output result diff --git a/util/test/tests/D3D11/D3D11_Shader_Linkage_Zoo.py b/util/test/tests/D3D11/D3D11_Shader_Linkage_Zoo.py index bc1c6da71..4d248c7c7 100644 --- a/util/test/tests/D3D11/D3D11_Shader_Linkage_Zoo.py +++ b/util/test/tests/D3D11/D3D11_Shader_Linkage_Zoo.py @@ -24,8 +24,6 @@ class D3D11_Shader_Linkage_Zoo(rdtest.TestCase): output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None - debugged = self.evaluate_source_var(output, variables) try: diff --git a/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py b/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py index c680476d9..30d29bd73 100644 --- a/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py +++ b/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py @@ -204,8 +204,6 @@ class D3D12_CBuffer_Zoo(rdtest.TestCase): output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None - debugged = self.evaluate_source_var(output, variables) if not rdtest.util.value_compare(debugged.value.f32v[0:4], [543.1, 546.0, 545.0, 546.0]): diff --git a/util/test/tests/D3D12/D3D12_PrimitiveID.py b/util/test/tests/D3D12/D3D12_PrimitiveID.py index f685efdf1..08f277ec3 100644 --- a/util/test/tests/D3D12/D3D12_PrimitiveID.py +++ b/util/test/tests/D3D12/D3D12_PrimitiveID.py @@ -24,14 +24,15 @@ class D3D12_PrimitiveID(rdtest.TestCase): cycles, variables = self.process_trace(trace) - # Find the SV_PrimitiveID variable - primInput = self.find_input_source_var(trace, rd.ShaderBuiltin.PrimitiveIndex) - if primInput is None: + # Find the SV_PrimitiveID variable, optionally + if not self.has_input_source_var(trace, rd.ShaderBuiltin.PrimitiveIndex): # If we didn't find it, then we should be expecting a 0 if len(expected_prim) != 1 or expected_prim[0] != 0: rdtest.log.error(f"Expected prim {expected_prim!s} at {x},{y} did not match actual prim {prim}.") return False else: + primInput = self.find_input_source_var(trace, rd.ShaderBuiltin.PrimitiveIndex) + # Look up the matching register in the inputs, and see if the expected value matches inputs = list(trace.inputs) primInputName = primInput.variables[0].name @@ -54,7 +55,7 @@ class D3D12_PrimitiveID(rdtest.TestCase): # since we're testing overlapping primitives in a single action if expected_output is not None: output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None + debugged = self.evaluate_source_var(output, variables) if list(debugged.value.f32v[0:4]) != expected_output: rdtest.log.error(f"Expected value {expected_output} at {x},{y} did not match actual {debugged.value.f32v[0:4]}.") diff --git a/util/test/tests/D3D12/D3D12_Resource_Mapping_Zoo.py b/util/test/tests/D3D12/D3D12_Resource_Mapping_Zoo.py index 575e90f6c..8ea26afe4 100644 --- a/util/test/tests/D3D12/D3D12_Resource_Mapping_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Resource_Mapping_Zoo.py @@ -14,8 +14,6 @@ class D3D12_Resource_Mapping_Zoo(rdtest.TestCase): cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - - assert output is not None debugged = self.evaluate_source_var(output, variables) diff --git a/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py index 43b6dbd70..29daa4cee 100644 --- a/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py @@ -67,7 +67,7 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): for row in range(rows): var = (f"{name}.row{row}", f"{type}3", value) varsToCheck.append(var) - + if not foundStart or not foundEnd: raise rdtest.TestFailureException("Couldn't find TEST_DEBUG_VAR_START and TEST_DEBUG_VAR_END") @@ -98,7 +98,7 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): with self.debug_vertex(0, instId, 0, 0) as debug: cycles, variables = self.process_trace(debug.trace) output = self.find_output_source_var(debug.trace, rd.ShaderBuiltin.Undefined, 1) - assert output is not None + debugged = self.evaluate_source_var(output, variables) actual = debugged.value.u32v[0] expected = instId @@ -143,7 +143,7 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): trace = self.controller.DebugPixel(4 * test, 0, rd.DebugPixelInputs()) cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None + debugged = self.evaluate_source_var(output, variables) try: @@ -201,7 +201,7 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): matched = False failed = True break - + if debuggedValue is None: raise rdtest.TestFailureException(f"Couldn't find source variable {name} type:{varType}") if not rdtest.value_compare(expectedValue, debuggedValue): @@ -220,7 +220,7 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): self.controller.FreeTrace(trace) rdtest.log.success(f"Test {test} matched as expected") - + rdtest.log.end_section(shaderModels[sm] + " tests") csShaderModels = ["cs_6_0"] diff --git a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py index bf3adaf9c..eb7c816d7 100644 --- a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py @@ -149,8 +149,6 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None - debugged = self.evaluate_source_var(output, variables) self.controller.FreeTrace(trace) @@ -200,8 +198,6 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None - debugged = self.evaluate_source_var(output, variables) self.controller.FreeTrace(trace) @@ -244,7 +240,7 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): trace = self.controller.DebugPixel(51, 51, inputs) cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None + debugged = self.evaluate_source_var(output, variables) self.controller.FreeTrace(trace) @@ -276,7 +272,6 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None debugged = self.evaluate_source_var(output, variables) self.controller.FreeTrace(trace) diff --git a/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py index 5a97bef23..6d5837efa 100644 --- a/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py @@ -24,8 +24,6 @@ class D3D12_Shader_Linkage_Zoo(rdtest.TestCase): output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None - debugged = self.evaluate_source_var(output, variables) try: diff --git a/util/test/tests/D3D12/D3D12_Vertex_UAV.py b/util/test/tests/D3D12/D3D12_Vertex_UAV.py index 5781304f5..7787c6208 100644 --- a/util/test/tests/D3D12/D3D12_Vertex_UAV.py +++ b/util/test/tests/D3D12/D3D12_Vertex_UAV.py @@ -51,8 +51,6 @@ class D3D12_Vertex_UAV(rdtest.TestCase): cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - - assert output is not None debugged = self.evaluate_source_var(output, variables) diff --git a/util/test/tests/GL/GL_Shader_Debug_Zoo.py b/util/test/tests/GL/GL_Shader_Debug_Zoo.py index f05280798..d7429fc17 100644 --- a/util/test/tests/GL/GL_Shader_Debug_Zoo.py +++ b/util/test/tests/GL/GL_Shader_Debug_Zoo.py @@ -44,8 +44,6 @@ class GL_Shader_Debug_Zoo(rdtest.TestCase): _, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - - assert output is not None debugged = self.evaluate_source_var(output, variables) diff --git a/util/test/tests/Iter_Test.py b/util/test/tests/Iter_Test.py index 13f6b40ae..10f2dead9 100644 --- a/util/test/tests/Iter_Test.py +++ b/util/test/tests/Iter_Test.py @@ -297,9 +297,9 @@ class Iter_Test(rdtest.TestCase): else: rdtest.log.print(f"At event {lastmod.eventId} the target is index {output_index}") - output_sourcevar = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, output_index) + try: + output_sourcevar = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, output_index) - if output_sourcevar is not None: debugged = self.evaluate_source_var(output_sourcevar, variables) self.controller.FreeTrace(trace) @@ -328,7 +328,7 @@ class Iter_Test(rdtest.TestCase): f"Debugged value {debugged.name} at EID {lastmod.eventId} {x},{y}: {diff_amt} difference. {debuggedValue} doesn't exactly match history shader output {historyValue}") rdtest.log.success(f'Successfully debugged pixel in {cycles} cycles, result matches') - else: + except rdtest.TestFailureException: # This could be an application error - undefined but seen in the wild rdtest.log.error(f"At EID {lastmod.eventId} No output variable declared for index {output_index}") diff --git a/util/test/tests/Vulkan/VK_Graphics_Pipeline.py b/util/test/tests/Vulkan/VK_Graphics_Pipeline.py index 532cc8355..002d8695e 100644 --- a/util/test/tests/Vulkan/VK_Graphics_Pipeline.py +++ b/util/test/tests/Vulkan/VK_Graphics_Pipeline.py @@ -103,9 +103,6 @@ class VK_Graphics_Pipeline(rdtest.TestCase): output_sourcevar = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - if output_sourcevar is None: - raise rdtest.TestFailureException("Couldn't get colour output value") - debugged = self.evaluate_source_var(output_sourcevar, variables) self.controller.FreeTrace(trace) diff --git a/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py b/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py index 29deaf0e4..fd97dc723 100644 --- a/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py +++ b/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py @@ -21,7 +21,7 @@ class VK_KHR_Buffer_Address(rdtest.TestCase): cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None + debugged = self.evaluate_source_var(output, variables) self.check_pixel_value(pipe.GetOutputTargets()[0].resource, x, y, debugged.value.f32v[0:4]) self.controller.FreeTrace(trace) diff --git a/util/test/tests/Vulkan/VK_Multi_Entry.py b/util/test/tests/Vulkan/VK_Multi_Entry.py index 99bdfd542..bff3eef51 100644 --- a/util/test/tests/Vulkan/VK_Multi_Entry.py +++ b/util/test/tests/Vulkan/VK_Multi_Entry.py @@ -67,9 +67,6 @@ class VK_Multi_Entry(rdtest.TestCase): output_sourcevar = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - if output_sourcevar is None: - raise rdtest.TestFailureException("Couldn't get colour output value") - debugged = self.evaluate_source_var(output_sourcevar, variables) self.controller.FreeTrace(trace) diff --git a/util/test/tests/Vulkan/VK_Multi_View.py b/util/test/tests/Vulkan/VK_Multi_View.py index fde472350..cbb8253cd 100644 --- a/util/test/tests/Vulkan/VK_Multi_View.py +++ b/util/test/tests/Vulkan/VK_Multi_View.py @@ -27,7 +27,7 @@ class VK_Multi_View(rdtest.TestCase): cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None + debugged = self.evaluate_source_var(output, variables) slice = view + 1 sub = rd.Subresource(0, slice, 0) @@ -65,7 +65,7 @@ class VK_Multi_View(rdtest.TestCase): cycles, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None + debugged = self.evaluate_source_var(output, variables) slice = view + 1 sub = rd.Subresource(0, slice, 0) diff --git a/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py b/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py index 784d68873..070267ca9 100644 --- a/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py +++ b/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py @@ -29,8 +29,6 @@ class VK_Shader_Debug_Zoo(rdtest.TestCase): _, variables = self.process_trace(trace) output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - - assert output is not None debugged = self.evaluate_source_var(output, variables)