diff --git a/util/test/rdtest/testcase.py b/util/test/rdtest/testcase.py index 3832aae9b..643bc7ef4 100644 --- a/util/test/rdtest/testcase.py +++ b/util/test/rdtest/testcase.py @@ -323,6 +323,18 @@ class TestCase: self.cur_event = eid self.controller.SetFrameEvent(eid, force) + def replace_resource(self, original: rd.ResourceId, replacement: rd.ResourceId): + self.controller.ReplaceResource(original, replacement) + ctx = util.get_capture_context() + if ctx is not None: + ctx.RegisterReplacement(original, replacement) + + def remove_replacement(self, id: rd.ResourceId): + self.controller.RemoveReplacement(id) + ctx = util.get_capture_context() + if ctx is not None: + ctx.UnregisterReplacement(id) + def pixel_history(self, tex: rd.ResourceId, x: int, y: int, sub: rd.Subresource, cast: rd.CompType): return HistoryContext(self, tex, x, y, sub, cast) diff --git a/util/test/rdtest/util.py b/util/test/rdtest/util.py index efa44266b..fd9409dde 100644 --- a/util/test/rdtest/util.py +++ b/util/test/rdtest/util.py @@ -89,6 +89,21 @@ def set_demos_binary(path: str): else: _demos_bin = os.path.abspath(path) +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + import qrenderdoc + +def set_capture_context(ctx: qrenderdoc.CaptureContext): + global _capture_context + _capture_context = ctx + + +_capture_context: qrenderdoc.CaptureContext | None = None + +def get_capture_context() -> qrenderdoc.CaptureContext | None: + return _capture_context + def set_remote_server(server: RemoteServer | None): global _remote_server diff --git a/util/test/tests/D3D11/D3D11_Shader_Editing.py b/util/test/tests/D3D11/D3D11_Shader_Editing.py index 3c578bdfb..9a0f929b3 100644 --- a/util/test/tests/D3D11/D3D11_Shader_Editing.py +++ b/util/test/tests/D3D11/D3D11_Shader_Editing.py @@ -98,8 +98,8 @@ class D3D11_Shader_Editing(rdtest.TestCase): nochangeVS = newShader[0] # Edit both Pixel shaders - self.controller.ReplaceResource(psrefl1.resourceId, ps1) - self.controller.ReplaceResource(psrefl2.resourceId, ps2) + self.replace_resource(psrefl1.resourceId, ps1) + self.replace_resource(psrefl2.resourceId, ps2) # Refresh the replay if it didn't happen already self.set_event(eid, True) @@ -111,7 +111,7 @@ class D3D11_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after Pixel editing") # Now "edit" the VS but don't change it. We should still get the same values - self.controller.ReplaceResource(vsrefl.resourceId, nochangeVS) + self.replace_resource(vsrefl.resourceId, nochangeVS) self.set_event(eid, True) # Triangles have green and blue channel @@ -121,7 +121,7 @@ class D3D11_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after no-op vertex editing") # Change the VS to one that has ofpset the triangles off-centre - self.controller.ReplaceResource(vsrefl.resourceId, offsetVS) + self.replace_resource(vsrefl.resourceId, offsetVS) self.set_event(eid, True) # Original sample positions are now the clear color @@ -135,7 +135,7 @@ class D3D11_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after ofpset vertex editing") # Now undo the first ps edit - self.controller.RemoveReplacement(psrefl1.resourceId) + self.remove_replacement(psrefl1.resourceId) self.set_event(eid, True) # Original sample positions are still the clear color @@ -149,7 +149,7 @@ class D3D11_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after removing first Pixel edit") # Now undo the first VS edit - self.controller.RemoveReplacement(vsrefl.resourceId) + self.remove_replacement(vsrefl.resourceId) self.set_event(eid, True) # The right triangle is the edited colour, but they are back in the original positions @@ -159,7 +159,7 @@ class D3D11_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after removing vertex edit") # finally undo the second ps edit - self.controller.RemoveReplacement(psrefl2.resourceId) + self.remove_replacement(psrefl2.resourceId) self.set_event(eid, True) # We should be back to where we started diff --git a/util/test/tests/D3D12/D3D12_Shader_Editing.py b/util/test/tests/D3D12/D3D12_Shader_Editing.py index ba7d4b7d4..473eeacff 100644 --- a/util/test/tests/D3D12/D3D12_Shader_Editing.py +++ b/util/test/tests/D3D12/D3D12_Shader_Editing.py @@ -91,8 +91,8 @@ class D3D12_Shader_Editing(rdtest.TestCase): nochangeVS = newShader[0] # Edit both Pixel shaders - self.controller.ReplaceResource(psrefl1.resourceId, ps1) - self.controller.ReplaceResource(psrefl2.resourceId, ps2) + self.replace_resource(psrefl1.resourceId, ps1) + self.replace_resource(psrefl2.resourceId, ps2) # Refresh the replay if it didn't happen already self.set_event(eid, True) @@ -104,7 +104,7 @@ class D3D12_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after Pixel editing") # Now "edit" the VS but don't change it. We should still get the same values - self.controller.ReplaceResource(vsrefl.resourceId, nochangeVS) + self.replace_resource(vsrefl.resourceId, nochangeVS) self.set_event(eid, True) # Triangles have green and blue channel @@ -114,7 +114,7 @@ class D3D12_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after no-op vertex editing") # Change the VS to one that has ofpset the triangles off-centre - self.controller.ReplaceResource(vsrefl.resourceId, offsetVS) + self.replace_resource(vsrefl.resourceId, offsetVS) self.set_event(eid, True) # Original sample positions are now the clear color @@ -128,7 +128,7 @@ class D3D12_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after ofpset vertex editing") # Now undo the first ps edit - self.controller.RemoveReplacement(psrefl1.resourceId) + self.remove_replacement(psrefl1.resourceId) self.set_event(eid, True) # Original sample positions are still the clear color @@ -142,7 +142,7 @@ class D3D12_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after removing first Pixel edit") # Now undo the first VS edit - self.controller.RemoveReplacement(vsrefl.resourceId) + self.remove_replacement(vsrefl.resourceId) self.set_event(eid, True) # The right triangle is the edited colour, but they are back in the original positions @@ -152,7 +152,7 @@ class D3D12_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after removing vertex edit") # finally undo the second ps edit - self.controller.RemoveReplacement(psrefl2.resourceId) + self.remove_replacement(psrefl2.resourceId) self.set_event(eid, True) # We should be back to where we started diff --git a/util/test/tests/GL/GL_Shader_Editing.py b/util/test/tests/GL/GL_Shader_Editing.py index d15830d91..1466cf8b7 100644 --- a/util/test/tests/GL/GL_Shader_Editing.py +++ b/util/test/tests/GL/GL_Shader_Editing.py @@ -131,8 +131,8 @@ class GL_Shader_Editing(rdtest.TestCase): sepFS = newShader[0] # Edit both fragment shaders - self.controller.ReplaceResource(fixedrefl.resourceId, fixedFS) - self.controller.ReplaceResource(dynamicrefl.resourceId, dynamicFS) + self.replace_resource(fixedrefl.resourceId, fixedFS) + self.replace_resource(dynamicrefl.resourceId, dynamicFS) # Refresh the replay if it didn't happen already self.set_event(self.get_last_action().eventId, True) @@ -145,7 +145,7 @@ class GL_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after fragment editing") # Now "edit" the VS but don't change it. We should still get the same values - self.controller.ReplaceResource(vsrefl.resourceId, nochangeVS) + self.replace_resource(vsrefl.resourceId, nochangeVS) self.set_event(self.get_last_action().eventId, True) # Triangles have green propagated across to the blue channel @@ -156,7 +156,7 @@ class GL_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after no-op vertex editing") # Change the VS to one that has offset the triangles off-centre - self.controller.ReplaceResource(vsrefl.resourceId, offsetVS) + self.replace_resource(vsrefl.resourceId, offsetVS) self.set_event(self.get_last_action().eventId, True) # Original sample positions are now the clear color @@ -172,7 +172,7 @@ class GL_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after offset vertex editing") # Now undo the first FS edit - self.controller.RemoveReplacement(fixedrefl.resourceId) + self.remove_replacement(fixedrefl.resourceId) self.set_event(self.get_last_action().eventId, True) # Original sample positions are still the clear color @@ -188,7 +188,7 @@ class GL_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after removing first fragment edit") # Now undo the first VS edit - self.controller.RemoveReplacement(vsrefl.resourceId) + self.remove_replacement(vsrefl.resourceId) self.set_event(self.get_last_action().eventId, True) # Only the lower triangle is the edited colour, but they are back in the original positions @@ -199,7 +199,7 @@ class GL_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after removing vertex edit") # finally undo the second FS edit - self.controller.RemoveReplacement(dynamicrefl.resourceId) + self.remove_replacement(dynamicrefl.resourceId) self.set_event(self.get_last_action().eventId, True) # We should be back to where we started @@ -216,27 +216,27 @@ class GL_Shader_Editing(rdtest.TestCase): # Only looking at bottom left triangle, it should be green self.check_pixel_value(tex, 0.75, 0.75, [0.0, 1.0, 0.0, 1.0]) - self.controller.ReplaceResource(fsseprefl.resourceId, sepFS) + self.replace_resource(fsseprefl.resourceId, sepFS) self.set_event(self.get_last_action().eventId, True) # Now it should be green-blue self.check_pixel_value(tex, 0.75, 0.75, [0.0, 1.0, 1.0, 1.0]) - self.controller.ReplaceResource(vsseprefl.resourceId, sepVS) + self.replace_resource(vsseprefl.resourceId, sepVS) self.set_event(self.get_last_action().eventId, True) # Now it should be green-blue and offset self.check_pixel_value(tex, 0.75, 0.75, [0.2, 0.2, 0.2, 1.0]) self.check_pixel_value(tex, 0.95, 0.55, [0.0, 1.0, 1.0, 1.0]) - self.controller.RemoveReplacement(fsseprefl.resourceId) + self.remove_replacement(fsseprefl.resourceId) self.set_event(self.get_last_action().eventId, True) # Now it should be back to green and offset self.check_pixel_value(tex, 0.75, 0.75, [0.2, 0.2, 0.2, 1.0]) self.check_pixel_value(tex, 0.95, 0.55, [0.0, 1.0, 0.0, 1.0]) - self.controller.RemoveReplacement(vsseprefl.resourceId) + self.remove_replacement(vsseprefl.resourceId) self.set_event(self.get_last_action().eventId, True) # We should be back to where we started diff --git a/util/test/tests/Vulkan/VK_Graphics_Pipeline.py b/util/test/tests/Vulkan/VK_Graphics_Pipeline.py index bd403fd8b..73cd4fa55 100644 --- a/util/test/tests/Vulkan/VK_Graphics_Pipeline.py +++ b/util/test/tests/Vulkan/VK_Graphics_Pipeline.py @@ -139,7 +139,7 @@ class VK_Graphics_Pipeline(rdtest.TestCase): if len(newShader[1]) != 0: raise rdtest.TestFailureException(f"Failed to compile edited shader: {newShader[1]}") - self.controller.ReplaceResource(vsrefl.resourceId, newShader[0]) + self.replace_resource(vsrefl.resourceId, newShader[0]) # Refresh the replay if it didn't happen already self.set_event(last_action.eventId, True) @@ -149,5 +149,5 @@ class VK_Graphics_Pipeline(rdtest.TestCase): rdtest.log.success("Edited shader had the right triangle output") - self.controller.RemoveReplacement(vsrefl.resourceId) + self.remove_replacement(vsrefl.resourceId) self.controller.FreeTargetResource(newShader[0]) diff --git a/util/test/tests/Vulkan/VK_Shader_Editing.py b/util/test/tests/Vulkan/VK_Shader_Editing.py index b3be8e926..069fb7ae6 100644 --- a/util/test/tests/Vulkan/VK_Shader_Editing.py +++ b/util/test/tests/Vulkan/VK_Shader_Editing.py @@ -96,8 +96,8 @@ class VK_Shader_Editing(rdtest.TestCase): nochangeVS = newShader[0] # Edit both fragment shaders - self.controller.ReplaceResource(fsrefl1.resourceId, FS1) - self.controller.ReplaceResource(fsrefl2.resourceId, FS2) + self.replace_resource(fsrefl1.resourceId, FS1) + self.replace_resource(fsrefl2.resourceId, FS2) # Refresh the replay if it didn't happen already self.set_event(eid, True) @@ -109,7 +109,7 @@ class VK_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after fragment editing") # Now "edit" the VS but don't change it. We should still get the same values - self.controller.ReplaceResource(vsrefl.resourceId, nochangeVS) + self.replace_resource(vsrefl.resourceId, nochangeVS) self.set_event(eid, True) # Triangles have green and blue channel @@ -119,7 +119,7 @@ class VK_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after no-op vertex editing") # Change the VS to one that has offset the triangles off-centre - self.controller.ReplaceResource(vsrefl.resourceId, offsetVS) + self.replace_resource(vsrefl.resourceId, offsetVS) self.set_event(eid, True) # Original sample positions are now the clear color @@ -133,7 +133,7 @@ class VK_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after offset vertex editing") # Now undo the first FS edit - self.controller.RemoveReplacement(fsrefl1.resourceId) + self.remove_replacement(fsrefl1.resourceId) self.set_event(eid, True) # Original sample positions are still the clear color @@ -147,7 +147,7 @@ class VK_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after removing first fragment edit") # Now undo the first VS edit - self.controller.RemoveReplacement(vsrefl.resourceId) + self.remove_replacement(vsrefl.resourceId) self.set_event(eid, True) # The right triangle is the edited colour, but they are back in the original positions @@ -157,7 +157,7 @@ class VK_Shader_Editing(rdtest.TestCase): rdtest.log.success("Values are as expected after removing vertex edit") # finally undo the second FS edit - self.controller.RemoveReplacement(fsrefl2.resourceId) + self.remove_replacement(fsrefl2.resourceId) self.set_event(eid, True) # We should be back to where we started @@ -209,7 +209,7 @@ class VK_Shader_Editing(rdtest.TestCase): raise rdtest.TestFailureException(f"Failed to compile edited compute shader: {newShader[1]}") nochangeCS = newShader[0] - self.controller.ReplaceResource(csrefl.resourceId, nochangeCS) + self.replace_resource(csrefl.resourceId, nochangeCS) self.set_event(eid, False) uints = struct.unpack_from('=4L', self.controller.GetBufferData(bufout, 0, 0), 0) if not rdtest.value_compare(uints, [777, 888, 999, 1110]): @@ -255,7 +255,7 @@ void main() raise rdtest.TestFailureException(f"Failed to compile edited compute shader: {newShader[1]}") CS1 = newShader[0] - self.controller.ReplaceResource(csrefl.resourceId, CS1) + self.replace_resource(csrefl.resourceId, CS1) self.set_event(eid, False) uints = struct.unpack_from('=4L', self.controller.GetBufferData(bufout, 0, 0), 0) if not rdtest.value_compare(uints, [1110, 999, 888, 777]):