From e012c82168f6655c3ec250e3350b9d144522217f Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 6 Feb 2020 14:13:06 +0000 Subject: [PATCH] Update tests to use new interfaces --- util/test/rdtest/testcase.py | 29 ++++++++++ .../tests/D3D11/D3D11_Shader_Debug_Zoo.py | 11 +++- .../tests/D3D12/D3D12_Shader_Debug_Zoo.py | 11 +++- util/test/tests/Iter_Test.py | 56 +++++++++++++++---- 4 files changed, 91 insertions(+), 16 deletions(-) diff --git a/util/test/rdtest/testcase.py b/util/test/rdtest/testcase.py index 8984eea44..069b53d09 100644 --- a/util/test/rdtest/testcase.py +++ b/util/test/rdtest/testcase.py @@ -396,6 +396,35 @@ class TestCase: log.success("Backbuffer is identical to reference") + def process_trace(self, trace: rd.ShaderDebugTrace): + variables = {} + cycles = 0 + while True: + states = self.controller.ContinueDebug(trace.debugger) + if len(states) == 0: + break + + for state in states: + for change in state.changes: + variables[change.after.name] = change.after + + cycles = states[-1].stepIndex + + return cycles, variables + + def evalute_source_var(self, sourceVar: rd.SourceVariableMapping, debugVars): + debugged = rd.ShaderVariable() + debugged.name = sourceVar.name + debugged.rowMajor = True + debugged.type = sourceVar.type + debugged.rows = sourceVar.rows + debugged.columns = sourceVar.columns + fv = [0.0] * 16 + for i, debugVar in enumerate(sourceVar.variables): + fv[i] = debugVars[debugVar.name].value.fv[debugVar.component] + debugged.value.fv = fv + return debugged + def check_export(self, capture_filename): recomp_path = util.get_tmp_path('recompressed.rdc') conv_zipxml_path = util.get_tmp_path('conv.zip.xml') diff --git a/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py b/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py index 49232f14b..89eaa5a39 100644 --- a/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py +++ b/util/test/tests/D3D11/D3D11_Shader_Debug_Zoo.py @@ -1,4 +1,5 @@ import renderdoc as rd +from typing import List import rdtest @@ -21,10 +22,16 @@ class D3D11_Shader_Debug_Zoo(rdtest.TestCase): trace: rd.ShaderDebugTrace = self.controller.DebugPixel(4 * test, 0, rd.ReplayController.NoPreference, rd.ReplayController.NoPreference) - last_state: rd.ShaderDebugState = trace.states[-1] + sourceVars: List[rd.SourceVariableMapping] = list(trace.sourceVars) + + cycles, variables = self.process_trace(trace) + + output = [x for x in sourceVars if x.builtin == rd.ShaderBuiltin.ColorOutput and x.offset == 0][0] + + debugged = self.evalute_source_var(output, variables) try: - self.check_pixel_value(pipe.GetOutputTargets()[0].resourceId, 4 * test, 0, last_state.outputs[0].value.fv[0:4], 0.0) + self.check_pixel_value(pipe.GetOutputTargets()[0].resourceId, 4 * test, 0, debugged.value.fv[0:4], 0.0) except rdtest.TestFailureException as ex: failed = True rdtest.log.error("Test {} did not match. {}".format(test, str(ex))) diff --git a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py index f7c6b7421..96d6389b6 100644 --- a/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py +++ b/util/test/tests/D3D12/D3D12_Shader_Debug_Zoo.py @@ -1,4 +1,5 @@ import renderdoc as rd +from typing import List import rdtest @@ -30,10 +31,16 @@ class D3D12_Shader_Debug_Zoo(rdtest.TestCase): trace: rd.ShaderDebugTrace = self.controller.DebugPixel(4 * test, 0, rd.ReplayController.NoPreference, rd.ReplayController.NoPreference) - last_state: rd.ShaderDebugState = trace.states[-1] + sourceVars: List[rd.SourceVariableMapping] = list(trace.sourceVars) + + cycles, variables = self.process_trace(trace) + + output = [x for x in sourceVars if x.builtin == rd.ShaderBuiltin.ColorOutput and x.offset == 0][0] + + debugged = self.evalute_source_var(output, variables) try: - self.check_pixel_value(pipe.GetOutputTargets()[0].resourceId, 4 * test, 0, last_state.outputs[0].value.fv[0:4], 0.0) + self.check_pixel_value(pipe.GetOutputTargets()[0].resourceId, 4 * test, 0, debugged.value.fv[0:4], 0.0) except rdtest.TestFailureException as ex: failed = True rdtest.log.error("Test {} did not match. {}".format(test, str(ex))) diff --git a/util/test/tests/Iter_Test.py b/util/test/tests/Iter_Test.py index e37df9f4b..8fc9681fa 100644 --- a/util/test/tests/Iter_Test.py +++ b/util/test/tests/Iter_Test.py @@ -2,6 +2,7 @@ import rdtest import os import random import struct +from typing import List import renderdoc as rd @@ -93,9 +94,25 @@ class Iter_Test(rdtest.TestCase): rdtest.log.print("Debugging vtx %d idx %d (inst %d)" % (vtx, idx, inst)) - trace = self.controller.DebugVertex(vtx, inst, idx, draw.instanceOffset, draw.vertexOffset) + trace: rd.ShaderDebugTrace = self.controller.DebugVertex(vtx, inst, idx, draw.instanceOffset, draw.vertexOffset) - rdtest.log.success('Successfully debugged vertex in {} cycles'.format(len(trace.states))) + if trace.debugger is None: + self.controller.FreeTrace(trace) + + rdtest.log.print("No debug result") + return + + last_state: rd.ShaderDebugState = self.controller.ContinueDebug(trace.debugger)[-1] + + while True: + states = self.controller.ContinueDebug(trace.debugger) + if len(states) == 0: + break + last_state = states[-1] + + rdtest.log.success('Successfully debugged vertex in {} cycles'.format(last_state.stepIndex)) + + self.controller.FreeTrace(trace) def pixel_debug(self, draw: rd.DrawcallDescription): pipe: rd.PipeState = self.controller.GetPipelineState() @@ -141,7 +158,7 @@ class Iter_Test(rdtest.TestCase): lastmod: rd.PixelModification = None - for i in range(len(history)-1, 0, -1): + for i in reversed(range(len(history))): mod = history[i] draw = self.find_draw('', mod.eventId) @@ -167,24 +184,39 @@ class Iter_Test(rdtest.TestCase): trace = self.controller.DebugPixel(x, y, 0, lastmod.primitiveID) - if draw.outputs[0] == rd.ResourceId.Null(): - rdtest.log.success('Successfully debugged pixel in {} cycles, skipping result check due to no output'.format(len(trace.states))) - elif draw.numInstances == 1: - lastState: rd.ShaderDebugState = trace.states[-1] + if trace.debugger is None: + self.controller.FreeTrace(trace) + rdtest.log.print("No debug result") + return + + sourceVars: List[rd.SourceVariableMapping] = list(trace.sourceVars) + + cycles, variables = self.process_trace(trace) + + if draw.outputs[0] == rd.ResourceId.Null(): + rdtest.log.success('Successfully debugged pixel in {} cycles, skipping result check due to no output'.format(cycles)) + self.controller.FreeTrace(trace) + elif (draw.flags & rd.DrawFlags.Instanced) and draw.numInstances > 1: + rdtest.log.success('Successfully debugged pixel in {} cycles, skipping result check due to instancing'.format(cycles)) + self.controller.FreeTrace(trace) + else: output_index = [o.resourceId for o in self.controller.GetPipelineState().GetOutputTargets()].index(target) rdtest.log.print("At event {} the target is index {}".format(lastmod.eventId, output_index)) - debugged: rd.ShaderVariable = lastState.outputs[output_index] + output = \ + [x for x in sourceVars if x.builtin == rd.ShaderBuiltin.ColorOutput and x.offset == output_index][0] + + debugged = self.evalute_source_var(output, variables) + + self.controller.FreeTrace(trace) debuggedValue = [debugged.value.f.x, debugged.value.f.y, debugged.value.f.z, debugged.value.f.w] - if not rdtest.value_compare(lastmod.shaderOut.col.floatValue, [debugged.value.f.x, debugged.value.f.y, debugged.value.f.z, debugged.value.f.w]): + if not rdtest.value_compare(lastmod.shaderOut.col.floatValue, debuggedValue): raise rdtest.TestFailureException("Debugged value {}: {} doesn't match history shader output {}".format(debugged.name, debuggedValue, lastmod.shaderOut.col.floatValue)) - rdtest.log.success('Successfully debugged pixel in {} cycles, result matches'.format(len(trace.states))) - else: - rdtest.log.success('Successfully debugged pixel in {} cycles, skipping result check due to instancing'.format(len(trace.states))) + rdtest.log.success('Successfully debugged pixel in {} cycles, result matches'.format(cycles)) self.controller.SetFrameEvent(draw.eventId, True)