From 82c84df204ee177cc31cbc5df4b3b4b20af84e52 Mon Sep 17 00:00:00 2001 From: crueter Date: Mon, 14 Jul 2025 02:00:41 -0400 Subject: [PATCH] [vk] reorganize and properly categorize stipple and conraster Signed-off-by: crueter --- .../renderer_vulkan/vk_graphics_pipeline.cpp | 4 ++-- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 9 +++++---- src/video_core/renderer_vulkan/vk_scheduler.h | 1 + .../renderer_vulkan/vk_state_tracker.cpp | 16 ++++++++++++---- .../renderer_vulkan/vk_state_tracker.h | 4 +++- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp index 6f0148f789..0d07e89b6b 100644 --- a/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp +++ b/src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp @@ -806,12 +806,12 @@ void GraphicsPipeline::MakePipeline(VkRenderPass render_pass) { .pAttachments = cb_attachments.data(), .blendConstants = {} }; - static_vector dynamic_states{ + static_vector dynamic_states{ VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_DEPTH_BIAS, VK_DYNAMIC_STATE_BLEND_CONSTANTS, VK_DYNAMIC_STATE_DEPTH_BOUNDS, VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, VK_DYNAMIC_STATE_STENCIL_REFERENCE, - VK_DYNAMIC_STATE_LINE_WIDTH, VK_DYNAMIC_STATE_LINE_STIPPLE, + VK_DYNAMIC_STATE_LINE_WIDTH, }; if (key.state.extended_dynamic_state) { static constexpr std::array extended{ diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 32ba995fd0..33b90a1ec9 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -935,7 +935,8 @@ void RasterizerVulkan::UpdateDynamicStates() { UpdateDepthBounds(regs); UpdateStencilFaces(regs); UpdateLineWidth(regs); - // UpdateLineStipple(regs); // TODO + // TODO: updating line stipple causes the cmdbuf to die + // UpdateLineStipple(regs); const u8 dynamic_state = Settings::values.dyna_state.GetValue(); @@ -1353,7 +1354,7 @@ void RasterizerVulkan::UpdateConservativeRasterizationMode(Tegra::Engines::Maxwe scheduler.Record([enable = regs.conservative_raster_enable](vk::CommandBuffer cmdbuf) { cmdbuf.SetConservativeRasterizationModeEXT( - enable ? VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT + enable ? VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT : VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT); }); } @@ -1371,12 +1372,12 @@ void RasterizerVulkan::UpdateLineStippleEnable(Tegra::Engines::Maxwell3D::Regs& void RasterizerVulkan::UpdateLineStipple(Tegra::Engines::Maxwell3D::Regs& regs) { - if (!state_tracker.TouchLineStippleEnable()) { + if (!state_tracker.TouchLineStipple()) { return; } scheduler.Record([params = regs.line_stipple_params](vk::CommandBuffer cmdbuf) { - cmdbuf.SetLineStippleEXT(params.factor, u16(params.pattern)); + cmdbuf.SetLineStippleEXT(params.factor, static_cast(params.pattern)); }); } diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index 51e7ab1e1d..54ab8ba52b 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -153,6 +153,7 @@ private: TypedCommand& operator=(TypedCommand&&) = delete; void Execute(vk::CommandBuffer cmdbuf, vk::CommandBuffer upload_cmdbuf) const override { + command(cmdbuf, upload_cmdbuf); } diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index 73931f103e..242d03cf24 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp @@ -52,7 +52,6 @@ Flags MakeInvalidationFlags() { VertexInput, StateEnable, PrimitiveRestartEnable, - LineStippleParams, DepthBiasEnable, LogicOpEnable, DepthClampEnable, @@ -61,6 +60,9 @@ Flags MakeInvalidationFlags() { ColorMask, BlendEquations, BlendEnable, + ConservativeRasterizationMode, + LineStippleEnable, + LineStippleParams, }; Flags flags{}; for (const int flag : INVALIDATION_FLAGS) { @@ -140,14 +142,12 @@ void SetupDirtyStateEnable(Tables& tables) { setup(OFF(stencil_enable), StencilTestEnable); setup(OFF(primitive_restart.enabled), PrimitiveRestartEnable); setup(OFF(rasterize_enable), RasterizerDiscardEnable); - setup(OFF(conservative_raster_enable), ConservativeRasterizationMode); - setup(OFF(line_stipple_enable), LineStippleEnable); - setup(OFF(line_stipple_params), LineStippleParams); setup(OFF(polygon_offset_point_enable), DepthBiasEnable); setup(OFF(polygon_offset_line_enable), DepthBiasEnable); setup(OFF(polygon_offset_fill_enable), DepthBiasEnable); setup(OFF(logic_op.enable), LogicOpEnable); setup(OFF(viewport_clip_control.geometry_clip), DepthClampEnable); + setup(OFF(line_stipple_enable), LineStippleEnable); } void SetupDirtyDepthCompareOp(Tables& tables) { @@ -220,6 +220,13 @@ void SetupDirtyVertexBindings(Tables& tables) { tables[1][OFF(vertex_streams) + i * NUM(vertex_streams[0]) + divisor_offset] = flag; } } + +void SetupRasterModes(Tables &tables) { + auto& table = tables[0]; + + table[OFF(line_stipple_params)] = LineStippleParams; + table[OFF(conservative_raster_enable)] = ConservativeRasterizationMode; +} } // Anonymous namespace void StateTracker::SetupTables(Tegra::Control::ChannelState& channel_state) { @@ -242,6 +249,7 @@ void StateTracker::SetupTables(Tegra::Control::ChannelState& channel_state) { SetupDirtyVertexAttributes(tables); SetupDirtyVertexBindings(tables); SetupDirtySpecialOps(tables); + SetupRasterModes(tables); } void StateTracker::ChangeChannel(Tegra::Control::ChannelState& channel_state) { diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index 91f8752ea3..a78d2113fb 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -211,7 +211,9 @@ public: return Exchange(Dirty::ConservativeRasterizationMode, false); } - bool TouchLineStippleEnable() { return Exchange(Dirty::ConservativeRasterizationMode, false); } + bool TouchLineStippleEnable() { return Exchange(Dirty::LineStippleEnable, false); } + + bool TouchLineStipple() { return Exchange(Dirty::LineStippleParams, false); } bool TouchDepthBiasEnable() { return Exchange(Dirty::DepthBiasEnable, false); }