Allow setting a capture context if tests are run in UI

* This means we can keep the UI in sync with things like resource replacements.
This commit is contained in:
baldurk committed 2026-09-11 21:17:18 +01:00
1 parent 01893b9896
commit ff7e147b39
7 files changed
+63 -36

No files matched your search

+12
View File
@@ -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)
+15
View File
@@ -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
@@ -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
@@ -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
+11 -11
View File
@@ -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
@@ -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])
+9 -9
View File
@@ -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]):