From e18ea02a2b102db8fca4fa8440eee97be2a20c0c Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Sat, 13 Jan 2024 08:50:49 +0000 Subject: [PATCH] D3D12 Pixel History Test add some drawcall stress tests 1000 drawcalls of 1 instance of 1 triangle 1 drawcall of 1000 instances of 1 triangle Python tests verify the count of modifications is correct, the modifications are self-consistent and the picked texture value matches the final modifications tex after value --- util/test/demos/d3d12/d3d12_pixel_history.cpp | 19 +++++++++++++++ util/test/tests/D3D12/D3D12_Pixel_History.py | 23 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/util/test/demos/d3d12/d3d12_pixel_history.cpp b/util/test/demos/d3d12/d3d12_pixel_history.cpp index 0838526df..c91fcf883 100644 --- a/util/test/demos/d3d12/d3d12_pixel_history.cpp +++ b/util/test/demos/d3d12/d3d12_pixel_history.cpp @@ -217,6 +217,14 @@ float4 main(v2f vertIn, uint primId : SV_PrimitiveID, uint sampleId : SV_SampleI {Vec3f(-0.7f, 0.5f, 0.33f), Vec4f(1.0f, 1.0f, 0.0f, 1.0f), Vec2f(0.0f, 1.0f)}, {Vec3f(-0.6f, 0.3f, 0.33f), Vec4f(1.0f, 1.0f, 0.0f, 1.0f), Vec2f(0.0f, 0.0f)}, {Vec3f(-0.8f, 0.3f, 0.33f), Vec4f(1.0f, 1.0f, 0.0f, 1.0f), Vec2f(1.0f, 0.0f)}, + // 1000 draws of 1 triangle + {Vec3f(-0.7f, 0.0f, 0.33f), Vec4f(0.5f, 1.0f, 0.0f, 1.0f), Vec2f(0.0f, 1.0f)}, + {Vec3f(-0.8f, 0.2f, 0.33f), Vec4f(0.5f, 1.0f, 0.0f, 1.0f), Vec2f(1.0f, 0.0f)}, + {Vec3f(-0.6f, 0.2f, 0.33f), Vec4f(0.5f, 1.0f, 0.0f, 1.0f), Vec2f(0.0f, 0.0f)}, + // 1000 instances of 1 triangle + {Vec3f(-0.7f, 0.6f, 0.33f), Vec4f(1.0f, 0.5f, 0.0f, 1.0f), Vec2f(0.0f, 1.0f)}, + {Vec3f(-0.8f, 0.8f, 0.33f), Vec4f(1.0f, 0.5f, 0.0f, 1.0f), Vec2f(1.0f, 0.0f)}, + {Vec3f(-0.6f, 0.8f, 0.33f), Vec4f(1.0f, 0.5f, 0.0f, 1.0f), Vec2f(0.0f, 0.0f)}, }; ID3D12ResourcePtr vb = MakeBuffer().Data(VBData); @@ -608,6 +616,17 @@ float4 main(v2f vertIn, uint primId : SV_PrimitiveID, uint sampleId : SV_SampleI cmd->OMSetDepthBounds(0.4f, 0.6f); cmd->DrawInstanced(3, 1, 66, 0); + pushMarker(cmd, "Stress Test"); + pushMarker(cmd, "Lots of Drawcalls"); + setMarker(cmd, "1000 Draws"); + cmd->SetPipelineState(pass.depthWritePipe); + for(int d = 0; d < 1000; ++d) + cmd->DrawInstanced(3, 1, 72, 0); + popMarker(cmd); + setMarker(cmd, "1000 Instances"); + cmd->DrawInstanced(3, 1000, 75, 0); + popMarker(cmd); + // Add a marker so we can easily locate this draw setMarker(cmd, "Test Begin"); diff --git a/util/test/tests/D3D12/D3D12_Pixel_History.py b/util/test/tests/D3D12/D3D12_Pixel_History.py index 5f81fff12..a096578a7 100644 --- a/util/test/tests/D3D12/D3D12_Pixel_History.py +++ b/util/test/tests/D3D12/D3D12_Pixel_History.py @@ -96,6 +96,7 @@ class D3D12_Pixel_History(rdtest.TestCase): depth_16bit_test_eid = self.find_action("Depth 16-bit Test", begin_renderpass_eid).next.eventId depth_bounds_prep_eid = self.find_action("Depth Bounds Prep", begin_renderpass_eid).next.eventId depth_bounds_clip_eid = self.find_action("Depth Bounds Clip", begin_renderpass_eid).next.eventId + one_thousand_instances_action = self.find_action("1000 Instances", begin_renderpass_eid) # For pixel 110, 100, inside the red triangle with stencil value 0x55 x, y = 110, 100 @@ -274,6 +275,28 @@ class D3D12_Pixel_History(rdtest.TestCase): self.check_events(events, modifs, False) self.check_pixel_value(tex, x, y, get_post_mod_color(modifs[-1]), sub=sub, cast=rt.typeCast) + # For pixel 60, 130 inside the light green triangle which is 1000 draws of 1 instance of 1 triangle + rdtest.log.print("Testing Lots of Drawcalls") + self.controller.SetFrameEvent(one_thousand_instances_action.eventId, True) + x, y = 60, 130 + rdtest.log.print("Testing pixel {}, {}".format(x, y)) + modifs: List[rd.PixelModification] = self.controller.PixelHistory(tex, x, y, sub, rt.typeCast) + self.check_pixel_value(tex, x, y, get_post_mod_color(modifs[-1]), sub=sub, cast=rt.typeCast) + countEvents = 1 + 1000 + self.check(len(modifs) == countEvents, "Expected {} events, got {}".format(countEvents, len(modifs))) + self.check_modifs_consistent(modifs) + + # For pixel 60, 50 inside the orange triangle which is 1 draws of 1000 instances of 1 triangle + rdtest.log.print("Testing Lots of Instances") + self.controller.SetFrameEvent(one_thousand_instances_action.next.eventId, True) + x, y = 60, 50 + rdtest.log.print("Testing pixel {}, {}".format(x, y)) + modifs: List[rd.PixelModification] = self.controller.PixelHistory(tex, x, y, sub, rt.typeCast) + self.check_pixel_value(tex, x, y, get_post_mod_color(modifs[-1]), sub=sub, cast=rt.typeCast) + countEvents = 1 + 255 + self.check(len(modifs) == countEvents, "Expected {} events, got {}".format(countEvents, len(modifs))) + self.check_modifs_consistent(modifs) + def multisampled_image_test(self, pass_name: str): begin_pass_action = self.find_action(pass_name) if begin_pass_action is None: