From ae019398cbc4e766f21c3e0bb5898aa95d35d93d Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 11 Sep 2026 16:39:43 +0100 Subject: [PATCH] Remove checks for shader debuggability * All APIs now support shader debugging by default and we assume/require all shaders in tests to be debuggable. --- util/test/rdtest/shared/Buffer_Truncation.py | 52 +++++----- util/test/rdtest/shared/Draw_Zoo.py | 15 ++- util/test/rdtest/testcase.py | 3 - .../D3D11/D3D11_AMD_Shader_Extensions.py | 14 +-- util/test/tests/D3D11/D3D11_CBuffer_Zoo.py | 66 ++++++------- .../D3D12/D3D12_AMD_Shader_Extensions.py | 14 +-- util/test/tests/D3D12/D3D12_CBuffer_Zoo.py | 90 +++++++++-------- util/test/tests/D3D12/D3D12_PrimitiveID.py | 8 -- .../tests/D3D12/D3D12_Resource_Mapping_Zoo.py | 7 -- .../tests/D3D12/D3D12_Shader_DebugData_Zoo.py | 97 ++++++++----------- .../tests/D3D12/D3D12_Shader_Debug_Zoo.py | 87 ++++++----------- .../tests/D3D12/D3D12_Shader_Linkage_Zoo.py | 8 -- util/test/tests/D3D12/D3D12_Vertex_UAV.py | 4 - util/test/tests/GL/GL_Shader_Debug_Zoo.py | 11 --- util/test/tests/Iter_Test.py | 15 ++- .../tests/Vulkan/VK_KHR_Buffer_Address.py | 7 -- util/test/tests/Vulkan/VK_Multi_View.py | 8 -- util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py | 12 --- 18 files changed, 202 insertions(+), 316 deletions(-) diff --git a/util/test/rdtest/shared/Buffer_Truncation.py b/util/test/rdtest/shared/Buffer_Truncation.py index d750863a2..1f664860c 100644 --- a/util/test/rdtest/shared/Buffer_Truncation.py +++ b/util/test/rdtest/shared/Buffer_Truncation.py @@ -120,40 +120,38 @@ class Buffer_Truncation(rdtest.TestCase): if not rdtest.value_compare(outcol.value.f32v[0:4], [0.0, 0.0, 0.0, 0.0]): raise rdtest.TestFailureException(f"expected outcol to be 0s, but got {outcol.value.f32v[0:4]}") - if self.controller.GetAPIProperties().shaderDebugging and pipe.GetShaderReflection( - rd.ShaderStage.Pixel).debugInfo.debuggable: - # Debug the shader - trace = self.controller.DebugPixel( - int(pipe.GetViewport(0).width / 2), - int(pipe.GetViewport(0).height / 2), - rd.DebugPixelInputs(), - ) + # Debug the shader + trace = self.controller.DebugPixel( + int(pipe.GetViewport(0).width / 2), + int(pipe.GetViewport(0).height / 2), + rd.DebugPixelInputs(), + ) - cycles, variables = self.process_trace(trace) + 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] + 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] + # 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' + 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] + 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 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]' + 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)}") + 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)}") rdtest.log.success("CBuffer value was truncated as expected") diff --git a/util/test/rdtest/shared/Draw_Zoo.py b/util/test/rdtest/shared/Draw_Zoo.py index d2d4b72ac..8c32ed80e 100644 --- a/util/test/rdtest/shared/Draw_Zoo.py +++ b/util/test/rdtest/shared/Draw_Zoo.py @@ -131,18 +131,15 @@ class Draw_Zoo(rdtest.TestCase): rdtest.log.success(f"Checked vertex out data in instance {inst}") - if self.props.shaderDebugging and refl.debugInfo.debuggable: - for vtx in range(num_verts): - if vtx in restarts: - continue + for vtx in range(num_verts): + if vtx in restarts: + continue - idx = vsout_ref[vtx]['idx'] + idx = vsout_ref[vtx]['idx'] - assert isinstance(idx, int) + assert isinstance(idx, int) - self.check_vertex_debug(vtx, idx, inst, postvs) - else: - rdtest.log.print('Not checking shader debugging, unsupported') + self.check_vertex_debug(vtx, idx, inst, postvs) for vert, coord in enumerate(ref_data.pixels[inst]): if coord[0] == 0 and coord[1] == 0: diff --git a/util/test/rdtest/testcase.py b/util/test/rdtest/testcase.py index 968705980..f34e4cdb8 100644 --- a/util/test/rdtest/testcase.py +++ b/util/test/rdtest/testcase.py @@ -1158,9 +1158,6 @@ class TestCase: def check_debug_pixel(self, x: int, y: int): pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - log.print("Skipping undebuggable shader.") - return # Debug the shader trace = self.controller.DebugPixel(x, y, rd.DebugPixelInputs()) diff --git a/util/test/tests/D3D11/D3D11_AMD_Shader_Extensions.py b/util/test/tests/D3D11/D3D11_AMD_Shader_Extensions.py index ce018bb14..ca2844415 100644 --- a/util/test/tests/D3D11/D3D11_AMD_Shader_Extensions.py +++ b/util/test/tests/D3D11/D3D11_AMD_Shader_Extensions.py @@ -80,17 +80,13 @@ class D3D11_AMD_Shader_Extensions(rdtest.TestCase): rdtest.log.success("compute shader disassembly is as expected") - if refl.debugInfo.debuggable: - self.set_event(self.find_action("Dispatch").eventId, False) + self.set_event(self.find_action("Dispatch").eventId, False) - trace = self.controller.DebugThread((0, 0, 0), (0, 0, 0)) + trace = self.controller.DebugThread((0, 0, 0), (0, 0, 0)) - cycles, variables = self.process_trace(trace) + cycles, variables = self.process_trace(trace) - if cycles < 3: - raise rdtest.TestFailureException(f"Compute shader has too few cycles {cycles}") - else: - raise rdtest.TestFailureException( - f"Compute shader is listed as non-debuggable: {refl.debugInfo.debugStatus}") + if cycles < 3: + raise rdtest.TestFailureException(f"Compute shader has too few cycles {cycles}") rdtest.log.success("compute shader debugged successfully") diff --git a/util/test/tests/D3D11/D3D11_CBuffer_Zoo.py b/util/test/tests/D3D11/D3D11_CBuffer_Zoo.py index ea89284d6..18ba41c0e 100644 --- a/util/test/tests/D3D11/D3D11_CBuffer_Zoo.py +++ b/util/test/tests/D3D11/D3D11_CBuffer_Zoo.py @@ -34,55 +34,53 @@ class D3D11_CBuffer_Zoo(rdtest.TestCase): rdtest.log.success("CBuffer variables are as expected") - if self.controller.GetAPIProperties().shaderDebugging and pipe.GetShaderReflection( - rd.ShaderStage.Pixel).debugInfo.debuggable: - trace = self.controller.DebugPixel( - int(pipe.GetViewport(0).width / 2.0), - int(pipe.GetViewport(0).height / 2.0), - rd.DebugPixelInputs(), - ) + trace = self.controller.DebugPixel( + int(pipe.GetViewport(0).width / 2.0), + int(pipe.GetViewport(0).height / 2.0), + rd.DebugPixelInputs(), + ) - debugVars: Dict[str, rd.ShaderVariable] = dict() + debugVars: Dict[str, rd.ShaderVariable] = dict() - for base in trace.constantBlocks: - for var in base.members: - debugVars[base.name + var.name] = var + for base in trace.constantBlocks: + for var in base.members: + debugVars[base.name + var.name] = var - cbufferVars: List[rd.ShaderVariable] = [] + cbufferVars: List[rd.ShaderVariable] = [] - for sourceVar in trace.sourceVars: - if sourceVar.variables[0].name not in debugVars.keys(): - continue + for sourceVar in trace.sourceVars: + if sourceVar.variables[0].name not in debugVars.keys(): + continue - eval = self.evaluate_source_var(sourceVar, debugVars) - cbufferVars.append(eval) + eval = self.evaluate_source_var(sourceVar, debugVars) + cbufferVars.append(eval) - cbufferVars = self.combine_source_vars(cbufferVars) + cbufferVars = self.combine_source_vars(cbufferVars) - assert len(cbufferVars) == 2 - assert cbufferVars[0].name == 'consts' - assert cbufferVars[1].name == 'packed_consts' - var_check = rdtest.ConstantBufferChecker(cbufferVars[0].members) - packed_check = rdtest.ConstantBufferChecker(cbufferVars[1].members) - self.check_cbuffer(var_check, packed_check) + assert len(cbufferVars) == 2 + assert cbufferVars[0].name == 'consts' + assert cbufferVars[1].name == 'packed_consts' + var_check = rdtest.ConstantBufferChecker(cbufferVars[0].members) + packed_check = rdtest.ConstantBufferChecker(cbufferVars[1].members) + self.check_cbuffer(var_check, packed_check) - rdtest.log.success("Debugged CBuffer variables are as expected") + rdtest.log.success("Debugged CBuffer variables are as expected") - cycles, variables = self.process_trace(trace) + cycles, variables = self.process_trace(trace) - output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) + output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None + assert output is not None - debugged = self.evaluate_source_var(output, variables) + 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]): - raise rdtest.TestFailureException( - f"Debugged output {debugged.value.f32v[0:4]} did not match expected {[542.1, 543.0, 544.0, 545.0]}") + if not rdtest.util.value_compare(debugged.value.f32v[0:4], [542.1, 543.0, 544.0, 545.0]): + raise rdtest.TestFailureException( + f"Debugged output {debugged.value.f32v[0:4]} did not match expected {[542.1, 543.0, 544.0, 545.0]}") - rdtest.log.success("Debugged output matched as expected") + rdtest.log.success("Debugged output matched as expected") - self.controller.FreeTrace(trace) + self.controller.FreeTrace(trace) self.check_pixel_value(pipe.GetOutputTargets()[0].resource, 0.5, 0.5, [542.1, 543.0, 544.0, 545.0]) diff --git a/util/test/tests/D3D12/D3D12_AMD_Shader_Extensions.py b/util/test/tests/D3D12/D3D12_AMD_Shader_Extensions.py index 1f4297cc8..6210250da 100644 --- a/util/test/tests/D3D12/D3D12_AMD_Shader_Extensions.py +++ b/util/test/tests/D3D12/D3D12_AMD_Shader_Extensions.py @@ -109,17 +109,13 @@ class D3D12_AMD_Shader_Extensions(rdtest.TestCase): rdtest.log.success("compute shader disassembly is as expected") - if refl.debugInfo.debuggable: - self.set_event(self.find_action("Dispatch").eventId, False) + self.set_event(self.find_action("Dispatch").eventId, False) - trace = self.controller.DebugThread((0, 0, 0), (0, 0, 0)) + trace = self.controller.DebugThread((0, 0, 0), (0, 0, 0)) - cycles, variables = self.process_trace(trace) + cycles, variables = self.process_trace(trace) - if cycles < 3: - raise rdtest.TestFailureException(f"Compute shader has too few cycles {cycles}") - else: - raise rdtest.TestFailureException( - f"Compute shader is listed as non-debuggable: {refl.debugInfo.debugStatus}") + if cycles < 3: + raise rdtest.TestFailureException(f"Compute shader has too few cycles {cycles}") rdtest.log.success("compute shader debugged successfully") diff --git a/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py b/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py index 65356157a..c680476d9 100644 --- a/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py +++ b/util/test/tests/D3D12/D3D12_CBuffer_Zoo.py @@ -154,69 +154,67 @@ class D3D12_CBuffer_Zoo(rdtest.TestCase): rdtest.log.success("Array cbuffer variables are as expected") - if self.controller.GetAPIProperties().shaderDebugging and pipe.GetShaderReflection( - rd.ShaderStage.Pixel).debugInfo.debuggable: - trace = self.controller.DebugPixel( - int(pipe.GetViewport(0).width / 2.0), - int(pipe.GetViewport(0).height / 2.0), - rd.DebugPixelInputs(), - ) + trace = self.controller.DebugPixel( + int(pipe.GetViewport(0).width / 2.0), + int(pipe.GetViewport(0).height / 2.0), + rd.DebugPixelInputs(), + ) - debugVars: Dict[str, rd.ShaderVariable] = dict() + debugVars: Dict[str, rd.ShaderVariable] = dict() - for base in trace.constantBlocks: - for var in base.members: - debugVars[base.name + var.name] = var + for base in trace.constantBlocks: + for var in base.members: + debugVars[base.name + var.name] = var - cbufferVars: List[rd.ShaderVariable] = [] + cbufferVars: List[rd.ShaderVariable] = [] - for sourceVar in trace.sourceVars: - if sourceVar.variables[0].name not in debugVars.keys(): - continue + for sourceVar in trace.sourceVars: + if sourceVar.variables[0].name not in debugVars.keys(): + continue - eval = self.evaluate_source_var(sourceVar, debugVars) - cbufferVars.append(eval) + eval = self.evaluate_source_var(sourceVar, debugVars) + cbufferVars.append(eval) - cbufferVars = self.combine_source_vars(cbufferVars) + cbufferVars = self.combine_source_vars(cbufferVars) - assert len(cbufferVars) == 5 - assert cbufferVars[0].name == 'consts' - assert cbufferVars[1].name == 'rootconsts' - assert cbufferVars[2].name == 'packed_consts' - assert cbufferVars[3].name == 'array_consts' - assert cbufferVars[4].name == 'hugespace' + assert len(cbufferVars) == 5 + assert cbufferVars[0].name == 'consts' + assert cbufferVars[1].name == 'rootconsts' + assert cbufferVars[2].name == 'packed_consts' + assert cbufferVars[3].name == 'array_consts' + assert cbufferVars[4].name == 'hugespace' - var_check = rdtest.ConstantBufferChecker(cbufferVars[0].members) - root_check = rdtest.ConstantBufferChecker(cbufferVars[1].members) - packed_check = rdtest.ConstantBufferChecker(cbufferVars[2].members) - arrays_check = rdtest.ConstantBufferChecker(cbufferVars[3].members) - huge_check = rdtest.ConstantBufferChecker(cbufferVars[4].members) + var_check = rdtest.ConstantBufferChecker(cbufferVars[0].members) + root_check = rdtest.ConstantBufferChecker(cbufferVars[1].members) + packed_check = rdtest.ConstantBufferChecker(cbufferVars[2].members) + arrays_check = rdtest.ConstantBufferChecker(cbufferVars[3].members) + huge_check = rdtest.ConstantBufferChecker(cbufferVars[4].members) - self.check_cbuffers(var_check, root_check, huge_check, packed_check) - rdtest.log.success("Debugged CBuffer variables are as expected") + self.check_cbuffers(var_check, root_check, huge_check, packed_check) + rdtest.log.success("Debugged CBuffer variables are as expected") - arrays_check.check('[0]').rows(0).cols(0).members({ - 'a' : lambda y : y.rows(1).cols(4).value([0.0, 1.0, 0.5, 0.5])}) - arrays_check.check('[1]').rows(0).cols(0).members({ - 'a' : lambda y : y.rows(1).cols(4).value([1.0, 2.0, 0.5, 0.5])}) - arrays_check.done() - rdtest.log.success("Array cbuffer variables are as expected") + arrays_check.check('[0]').rows(0).cols(0).members({ + 'a' : lambda y : y.rows(1).cols(4).value([0.0, 1.0, 0.5, 0.5])}) + arrays_check.check('[1]').rows(0).cols(0).members({ + 'a' : lambda y : y.rows(1).cols(4).value([1.0, 2.0, 0.5, 0.5])}) + arrays_check.done() + rdtest.log.success("Array cbuffer variables are as expected") - cycles, variables = self.process_trace(trace) + cycles, variables = self.process_trace(trace) - output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) + output = self.find_output_source_var(trace, rd.ShaderBuiltin.ColorOutput, 0) - assert output is not None + assert output is not None - debugged = self.evaluate_source_var(output, variables) + 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]): - raise rdtest.TestFailureException( - f"Debugged output {debugged.value.f32v[0:4]} did not match expected {[543.1, 546.0, 545.0, 546.0]}") + if not rdtest.util.value_compare(debugged.value.f32v[0:4], [543.1, 546.0, 545.0, 546.0]): + raise rdtest.TestFailureException( + f"Debugged output {debugged.value.f32v[0:4]} did not match expected {[543.1, 546.0, 545.0, 546.0]}") - rdtest.log.success("Debugged output matched as expected") + rdtest.log.success("Debugged output matched as expected") - self.controller.FreeTrace(trace) + self.controller.FreeTrace(trace) self.check_pixel_value(pipe.GetOutputTargets()[0].resource, 0.5, 0.5, [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 4c6bf62e7..f685efdf1 100644 --- a/util/test/tests/D3D12/D3D12_PrimitiveID.py +++ b/util/test/tests/D3D12/D3D12_PrimitiveID.py @@ -18,10 +18,6 @@ class D3D12_PrimitiveID(rdtest.TestCase): self.set_event(action.eventId, True) pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable shader at {action.eventId}.") - return True - pixel_inputs = rd.DebugPixelInputs() pixel_inputs.primitive = prim trace = self.controller.DebugPixel(x, y, pixel_inputs) @@ -70,10 +66,6 @@ class D3D12_PrimitiveID(rdtest.TestCase): return True def check_capture(self): - if not self.controller.GetAPIProperties().shaderDebugging: - rdtest.log.success("Shader debugging not enabled, skipping test") - return - success = True markers = ["SM5.0", "SM6.0"] diff --git a/util/test/tests/D3D12/D3D12_Resource_Mapping_Zoo.py b/util/test/tests/D3D12/D3D12_Resource_Mapping_Zoo.py index bae4eeb5d..575e90f6c 100644 --- a/util/test/tests/D3D12/D3D12_Resource_Mapping_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Resource_Mapping_Zoo.py @@ -8,10 +8,6 @@ class D3D12_Resource_Mapping_Zoo(rdtest.TestCase): def test_debug_pixel(self, x: int, y: int, test_name: str): pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable shader at {test_name}.") - return True - # Debug the shader trace = self.controller.DebugPixel(x, y, rd.DebugPixelInputs()) @@ -35,9 +31,6 @@ class D3D12_Resource_Mapping_Zoo(rdtest.TestCase): return True def check_capture(self): - if not self.controller.GetAPIProperties().shaderDebugging: - rdtest.log.success("Shader debugging not enabled, skipping test") - return if not self.check_capture_internal(): raise rdtest.TestFailureException("Some tests were not as expected") diff --git a/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py index 5ba6db5eb..43b6dbd70 100644 --- a/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_DebugData_Zoo.py @@ -74,10 +74,6 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): return varsToCheck def check_capture(self): - if not self.controller.GetAPIProperties().shaderDebugging: - rdtest.log.success("Shader debugging not enabled, skipping test") - return - failed = False shaderModels = [ @@ -97,58 +93,49 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): pipe = self.controller.GetPipelineState() - if pipe.GetShaderReflection(rd.ShaderStage.Vertex).debugInfo.debuggable: - # Debug the vertex shader - instId = 1 - 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 - if not rdtest.value_compare(actual, expected): + # Debug the vertex shader + instId = 1 + 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 + if not rdtest.value_compare(actual, expected): + failed = True + rdtest.log.error( + f"Vertex shader TRIANGLE output did not match expectation {actual} != {expected}") + + if not failed: + rdtest.log.success("Basic VS debugging was successful") + + # Look for MAT0 variable in the trace initial source variables + matched = True + varsToCheck: List[Tuple[str, str, rdtest.ScalarOrVectorValue]] = [] + varsToCheck.append((f"MAT0[0]", "float4", [1.0, 2.0, 3.0, 4.0])) + varsToCheck.append((f"MAT0[1]", "float4", [5.0, 6.0, 7.0, 8.0])) + varsToCheck.append((f"MAT0[2]", "float4", [9.0, 10.0, 11.0, 12.0])) + for name, varType, expectedValue in varsToCheck: + debuggedValue = None + try: + debuggedValue = self.get_source_shader_var_value(debug.trace.sourceVars, name, varType, variables) + except KeyError as ex: + matched = False + failed = True + except rdtest.TestFailureException as ex: + matched = False failed = True - rdtest.log.error( - f"Vertex shader TRIANGLE output did not match expectation {actual} != {expected}") - if not failed: - rdtest.log.success("Basic VS debugging was successful") + if debuggedValue is None: + raise rdtest.TestFailureException(f"Couldn't find source variable {name} type:{varType}") + if not rdtest.value_compare(expectedValue, debuggedValue): + matched = False + failed = True + rdtest.log.error(f"'{name}' {varType} debugger {debuggedValue} doesn't match expected {expectedValue}") - # Look for MAT0 variable in the trace initial source variables - matched = True - varsToCheck: List[Tuple[str, str, rdtest.ScalarOrVectorValue]] = [] - varsToCheck.append((f"MAT0[0]", "float4", [1.0, 2.0, 3.0, 4.0])) - varsToCheck.append((f"MAT0[1]", "float4", [5.0, 6.0, 7.0, 8.0])) - varsToCheck.append((f"MAT0[2]", "float4", [9.0, 10.0, 11.0, 12.0])) - for name, varType, expectedValue in varsToCheck: - debuggedValue = None - try: - debuggedValue = self.get_source_shader_var_value(debug.trace.sourceVars, name, varType, variables) - except KeyError as ex: - matched = False - failed = True - except rdtest.TestFailureException as ex: - matched = False - failed = True - - if debuggedValue is None: - raise rdtest.TestFailureException(f"Couldn't find source variable {name} type:{varType}") - if not rdtest.value_compare(expectedValue, debuggedValue): - matched = False - failed = True - rdtest.log.error(f"'{name}' {varType} debugger {debuggedValue} doesn't match expected {expectedValue}") - - if matched: - rdtest.log.success("VS MAT0 output source variable matched as expected") - - else: - rdtest.log.print(f"Ignoring undebuggable Vertex shader at {action.eventId} for {shaderModels[sm]}.") - - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable Pixel shader at {action.eventId} for {shaderModels[sm]}.") - rdtest.log.end_section(shaderModels[sm] + " tests") - continue + if matched: + rdtest.log.success("VS MAT0 output source variable matched as expected") # Loop over every test for test in range(action.numInstances): @@ -251,10 +238,6 @@ class D3D12_Shader_DebugData_Zoo(rdtest.TestCase): action = test_marker.nextAction self.set_event(action.eventId, False) pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Compute).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable Compute shader at {action.eventId} for {csShaderModels[sm]}.") - rdtest.log.end_section(section) - continue # Loop over every test for test in range(action.dispatchDimension[0]): diff --git a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py index 2c0528590..bf3adaf9c 100644 --- a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py @@ -31,10 +31,6 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): self.set_event(action.eventId, False) pipe = self.controller.GetPipelineState() csrefl = pipe.GetShaderReflection(rd.ShaderStage.Compute) - if not csrefl.debugInfo.debuggable: - rdtest.log.print(f"Compute shader is undebuggable at {action.eventId} for {test}.") - failed = True - continue rw = pipe.GetReadWriteResources(rd.ShaderStage.Compute) if len(rw) != 1: @@ -103,10 +99,6 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): return failed def check_capture(self): - if not self.controller.GetAPIProperties().shaderDebugging: - rdtest.log.success("Shader debugging not enabled, skipping test") - return - undefined_tests = [int(test) for test in self.find_action("Undefined tests: ").customName.split(" ")[2:]] failed = False @@ -138,22 +130,15 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): pipe = self.controller.GetPipelineState() - if pipe.GetShaderReflection(rd.ShaderStage.Vertex).debugInfo.debuggable: - postvs = self.get_postvs(action, rd.MeshDataStage.VSOut, instance=instId) + 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"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]}.") - - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable Pixel shader at {action.eventId} for {shaderModels[sm]}.") + success, err = self.check_vertex_debug(0, 0, instId, postvs, fatal=False) + if not success: + failed = True + rdtest.log.error(f"Basic VS debugging didn't match: {err}") continue + else: + rdtest.log.success("Basic VS debugging was successful") # Loop over every test for test in range(action.numInstances): @@ -243,40 +228,34 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): self.set_event(action.eventId, False) pipe = self.controller.GetPipelineState() - if pipe.GetShaderReflection(rd.ShaderStage.Vertex).debugInfo.debuggable: - # Debug the vertex shader - 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 failed: {err}") - continue - else: - rdtest.log.success(shaderModels[sm] + " VertexSample VS was debugged correctly") + # Debug the vertex shader + 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 failed: {err}") + continue else: - rdtest.log.print(f"Skipping undebuggable Vertex shader at {action.eventId} for {shaderModels[sm]}.") + rdtest.log.success(shaderModels[sm] + " VertexSample VS was debugged correctly") - if pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - # Debug the pixel shader - inputs = rd.DebugPixelInputs() - inputs.sample = 0 - 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) + # Debug the pixel shader + inputs = rd.DebugPixelInputs() + inputs.sample = 0 + 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) - # Validate the debug output result - try: - self.check_pixel_value(pipe.GetOutputTargets()[0].resource, 51, 51, debugged.value.f32v[0:4]) - except rdtest.TestFailureException as ex: - failed = True - rdtest.log.error(f"Vertex sample pixel shader output did not match. {ex!s}") + # Validate the debug output result + try: + self.check_pixel_value(pipe.GetOutputTargets()[0].resource, 51, 51, debugged.value.f32v[0:4]) + except rdtest.TestFailureException as ex: + failed = True + rdtest.log.error(f"Vertex sample pixel shader output did not match. {ex!s}") - rdtest.log.success("VertexSample PS was debugged correctly") - else: - rdtest.log.print(f"Skipping undebuggable Pixel shader at {action.eventId} for {shaderModels[sm]}.") + rdtest.log.success("VertexSample PS was debugged correctly") rdtest.log.end_section("VertexSample tests") @@ -326,10 +305,6 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): action = test_marker.nextAction self.set_event(action.eventId, False) pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Compute).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable Compute shader at {action.eventId} for {csShaderModels[sm]}.") - rdtest.log.end_section(section) - continue # Debug the shader for groupX in range(action.dispatchDimension[0]): diff --git a/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py index edfeda7ba..5a97bef23 100644 --- a/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_Linkage_Zoo.py @@ -6,10 +6,6 @@ class D3D12_Shader_Linkage_Zoo(rdtest.TestCase): demos_test_name = 'D3D12_Shader_Linkage_Zoo' def check_capture(self): - if not self.controller.GetAPIProperties().shaderDebugging: - rdtest.log.success("Shader debugging not enabled, skipping test") - return - failed = False test_marker = self.find_action("draw") @@ -21,10 +17,6 @@ class D3D12_Shader_Linkage_Zoo(rdtest.TestCase): self.set_event(action.eventId, False) pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable shader at {event_name}.") - continue - # Debug the shader trace = self.controller.DebugPixel(200, 150, rd.DebugPixelInputs()) diff --git a/util/test/tests/D3D12/D3D12_Vertex_UAV.py b/util/test/tests/D3D12/D3D12_Vertex_UAV.py index f62f12063..5781304f5 100644 --- a/util/test/tests/D3D12/D3D12_Vertex_UAV.py +++ b/util/test/tests/D3D12/D3D12_Vertex_UAV.py @@ -45,10 +45,6 @@ class D3D12_Vertex_UAV(rdtest.TestCase): rdtest.log.success(f"Quad overdraw is good on {name}") - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - rdtest.log.print("Skipping undebuggable shader.") - continue - # Debug the shader trace = self.controller.DebugPixel(50, 50, 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 23d04099f..f05280798 100644 --- a/util/test/tests/GL/GL_Shader_Debug_Zoo.py +++ b/util/test/tests/GL/GL_Shader_Debug_Zoo.py @@ -8,9 +8,6 @@ class GL_Shader_Debug_Zoo(rdtest.TestCase): def check_capture(self): assert self.controller is not None - if not self.controller.GetAPIProperties().shaderDebugging: - rdtest.log.success("Shader debugging not enabled, skipping test") - return failed = False @@ -29,14 +26,6 @@ class GL_Shader_Debug_Zoo(rdtest.TestCase): self.set_event(action.eventId, False) pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Vertex).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable shader at {test} in {child}.") - return - - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable shader at {test} in {child}.") - return - y = 1 inputs = rd.DebugPixelInputs() diff --git a/util/test/tests/Iter_Test.py b/util/test/tests/Iter_Test.py index 436021ce7..13f6b40ae 100644 --- a/util/test/tests/Iter_Test.py +++ b/util/test/tests/Iter_Test.py @@ -64,6 +64,10 @@ class Iter_Test(rdtest.TestCase): rdtest.log.print(f"{action.eventId} is not a debuggable action") return + if not refl.debugInfo.debuggable: + rdtest.log.print(f"Compute shader is not debuggable at {action.eventId}") + return + wgSize = action.dispatchDimension if any(dim == 0 for dim in wgSize): rdtest.log.print(f"Empty dispatch ({wgSize[0]}x{wgSize[1]}x{wgSize[2]}), skipping") @@ -103,6 +107,10 @@ class Iter_Test(rdtest.TestCase): rdtest.log.print(f"No vertex shader bound at {action.eventId}") return + if not refl.debugInfo.debuggable: + rdtest.log.print(f"Vertex shader is not debuggable at {action.eventId}") + return + if not (action.flags & rd.ActionFlags.Drawcall) and action.drawIndex == 0: rdtest.log.print(f"{action.eventId} is not a debuggable action") return @@ -255,10 +263,15 @@ class Iter_Test(rdtest.TestCase): pipe = self.controller.GetPipelineState() - if pipe.GetShader(rd.ShaderStage.Pixel) == rd.ResourceId.Null(): + refl = pipe.GetShaderReflection(rd.ShaderStage.Pixel) + if refl is None: rdtest.log.print(f"Nothing to debug. No pixel shader bound at {action.eventId}") return + if not refl.debugInfo.debuggable: + rdtest.log.print(f"Pixel shader is not debuggable at {action.eventId}") + return + inputs = rd.DebugPixelInputs() inputs.sample = 0 inputs.primitive = lastmod.primitiveID; diff --git a/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py b/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py index 9180818cd..29deaf0e4 100644 --- a/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py +++ b/util/test/tests/Vulkan/VK_KHR_Buffer_Address.py @@ -5,10 +5,6 @@ class VK_KHR_Buffer_Address(rdtest.TestCase): demos_test_name = 'VK_KHR_Buffer_Address' def check_capture(self): - if not self.controller.GetAPIProperties().shaderDebugging: - rdtest.log.success("Shader debugging not enabled, skipping test") - return - x = 100 y = 150 @@ -20,9 +16,6 @@ class VK_KHR_Buffer_Address(rdtest.TestCase): self.set_event(action.eventId, True) pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - raise rdtest.TestFailureException(f"Test {test_name} shader can not be debugged") - # Debug the pixel shader trace = self.controller.DebugPixel(x, y, rd.DebugPixelInputs()) diff --git a/util/test/tests/Vulkan/VK_Multi_View.py b/util/test/tests/Vulkan/VK_Multi_View.py index 6ab9e101c..fde472350 100644 --- a/util/test/tests/Vulkan/VK_Multi_View.py +++ b/util/test/tests/Vulkan/VK_Multi_View.py @@ -5,10 +5,6 @@ class VK_Multi_View(rdtest.TestCase): demos_test_name = 'VK_Multi_View' def check_capture(self): - if not self.controller.GetAPIProperties().shaderDebugging: - rdtest.log.success("Shader debugging not enabled, skipping test") - return - x = 200 y = 150 @@ -22,8 +18,6 @@ class VK_Multi_View(rdtest.TestCase): self.set_event(action.eventId, True) pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - raise rdtest.TestFailureException(f"Test {test_name} shader can not be debugged") for view in range(2): # Debug the pixel shader @@ -57,8 +51,6 @@ class VK_Multi_View(rdtest.TestCase): self.set_event(action.eventId, True) pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - raise rdtest.TestFailureException(f"Test {test_name} shader can not be debugged") for view in range(2): if view == 0: diff --git a/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py b/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py index d4c5107c5..784d68873 100644 --- a/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py +++ b/util/test/tests/Vulkan/VK_Shader_Debug_Zoo.py @@ -9,10 +9,6 @@ class VK_Shader_Debug_Zoo(rdtest.TestCase): slow_test = True def check_capture(self): - if not self.controller.GetAPIProperties().shaderDebugging: - rdtest.log.success("Shader debugging not enabled, skipping test") - return - failed = False for test_name in ["GLSL1 tests", "GLSL2 tests", "ASM tests"]: @@ -23,10 +19,6 @@ class VK_Shader_Debug_Zoo(rdtest.TestCase): self.set_event(section.eventId, False) pipe = self.controller.GetPipelineState() - if not pipe.GetShaderReflection(rd.ShaderStage.Pixel).debugInfo.debuggable: - rdtest.log.print(f"Skipping undebuggable shader at {child} in {test_name}.") - return - for test in range(section.numInstances): x = 4 * test + 1 y = 4 * child + 1 @@ -107,10 +99,6 @@ class VK_Shader_Debug_Zoo(rdtest.TestCase): self.set_event(action.eventId, False) pipe = self.controller.GetPipelineState() csrefl = pipe.GetShaderReflection(rd.ShaderStage.Compute) - if not csrefl.debugInfo.debuggable: - rdtest.log.print(f"Compute shader is undebuggable at {action.eventId} for {test}.") - failed = True - continue rw = pipe.GetReadWriteResources(rd.ShaderStage.Compute) if len(rw) != 1: