diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 4d3a93e21b..cf883dfe35 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -1032,6 +1032,7 @@ void RasterizerVulkan::UpdateDynamicStates() { } UpdateLogicOpEnable(regs); UpdateDepthClampEnable(regs); + UpdateLineRasterizationMode(regs); UpdateLineStippleEnable(regs); UpdateConservativeRasterizationMode(regs); UpdateAlphaToCoverageEnable(regs); @@ -1414,17 +1415,19 @@ void RasterizerVulkan::UpdateLineStippleEnable(Tegra::Engines::Maxwell3D::Regs& } void RasterizerVulkan::UpdateLineRasterizationMode(Tegra::Engines::Maxwell3D::Regs& regs) { - // if (!state_tracker.TouchLi()) { - // return; - // } - - // TODO: The maxwell emulator does not capture line rasters + if (!device.IsExtLineRasterizationSupported()) { + return; + } + if (!state_tracker.TouchLineRasterizationMode()) { + return; + } - // scheduler.Record([enable = regs.line](vk::CommandBuffer cmdbuf) { - // cmdbuf.SetConservativeRasterizationModeEXT( - // enable ? VK_CONSERVATIVE_RASTERIZATION_MODE_UNDERESTIMATE_EXT - // : VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT); - // }); + const VkLineRasterizationModeEXT mode = + regs.line_anti_alias_enable != 0 ? VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT + : VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT; + scheduler.Record([mode](vk::CommandBuffer cmdbuf) { + cmdbuf.SetLineRasterizationModeEXT(mode); + }); } void RasterizerVulkan::UpdateDepthBiasEnable(Tegra::Engines::Maxwell3D::Regs& regs) { diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.cpp b/src/video_core/renderer_vulkan/vk_state_tracker.cpp index 6af74cf0fc..79967d540a 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.cpp +++ b/src/video_core/renderer_vulkan/vk_state_tracker.cpp @@ -58,6 +58,7 @@ Flags MakeInvalidationFlags() { DepthClampEnable, AlphaToCoverageEnable, AlphaToOneEnable, + LineRasterizationMode, LogicOp, Blending, ColorMask, @@ -231,6 +232,7 @@ void SetupRasterModes(Tables &tables) { table[OFF(line_stipple_params)] = LineStippleParams; table[OFF(conservative_raster_enable)] = ConservativeRasterizationMode; + table[OFF(line_anti_alias_enable)] = LineRasterizationMode; } } // Anonymous namespace diff --git a/src/video_core/renderer_vulkan/vk_state_tracker.h b/src/video_core/renderer_vulkan/vk_state_tracker.h index afd99ad7b7..9af1efd2cf 100644 --- a/src/video_core/renderer_vulkan/vk_state_tracker.h +++ b/src/video_core/renderer_vulkan/vk_state_tracker.h @@ -54,6 +54,7 @@ enum : u8 { PrimitiveRestartEnable, RasterizerDiscardEnable, ConservativeRasterizationMode, + LineRasterizationMode, LineStippleEnable, LineStippleParams, DepthBiasEnable, @@ -271,6 +272,10 @@ public: return Exchange(Dirty::LogicOp, false); } + bool TouchLineRasterizationMode() { + return Exchange(Dirty::LineRasterizationMode, false); + } + bool ChangePrimitiveTopology(Maxwell::PrimitiveTopology new_topology) { const bool has_changed = current_topology != new_topology; current_topology = new_topology;