diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 94c723bf4c8..9ef883a05f8 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -2118,8 +2118,12 @@ radv_get_pa_su_sc_mode_cntl(const struct radv_cmd_buffer *cmd_buffer) VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT); if (gfx_level >= GFX10) { - pa_su_sc_mode_cntl |= - S_028814_KEEP_TOGETHER_ENABLE(d->vk.rs.polygon_mode != V_028814_X_DRAW_TRIANGLES); + /* Ensure that SC processes the primitive group in the same order as PA produced them. Needed + * when either POLY_MODE or PERPENDICULAR_ENDCAP_ENA is set. + */ + pa_su_sc_mode_cntl |= S_028814_KEEP_TOGETHER_ENABLE( + d->vk.rs.polygon_mode != V_028814_X_DRAW_TRIANGLES || + d->vk.rs.line.mode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT); } return pa_su_sc_mode_cntl; @@ -4242,6 +4246,19 @@ radv_emit_msaa_state(struct radv_cmd_buffer *cmd_buffer) S_028A48_MSAA_ENABLE(rasterization_samples > 1)); } +static void +radv_emit_line_rasterization_mode(struct radv_cmd_buffer *cmd_buffer) +{ + const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic; + + /* The DX10 diamond test is unnecessary with Vulkan and it decreases line rasterization + * performance. + */ + radeon_set_context_reg(cmd_buffer->cs, R_028BDC_PA_SC_LINE_CNTL, + S_028BDC_PERPENDICULAR_ENDCAP_ENA( + d->vk.rs.line.mode == VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT)); +} + static void radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer, bool pipeline_is_dirty) { @@ -4292,7 +4309,8 @@ radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer, bool pip if (states & (RADV_CMD_DIRTY_DYNAMIC_CULL_MODE | RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE | RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE | RADV_CMD_DIRTY_DYNAMIC_POLYGON_MODE | - RADV_CMD_DIRTY_DYNAMIC_PROVOKING_VERTEX_MODE)) + RADV_CMD_DIRTY_DYNAMIC_PROVOKING_VERTEX_MODE | + RADV_CMD_DIRTY_DYNAMIC_LINE_RASTERIZATION_MODE)) radv_emit_culling(cmd_buffer); if (states & (RADV_CMD_DIRTY_DYNAMIC_PROVOKING_VERTEX_MODE | @@ -4356,6 +4374,9 @@ radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer, bool pip RADV_CMD_DIRTY_DYNAMIC_COLOR_BLEND_EQUATION)) radv_emit_color_blend(cmd_buffer); + if (states & RADV_CMD_DIRTY_DYNAMIC_LINE_RASTERIZATION_MODE) + radv_emit_line_rasterization_mode(cmd_buffer); + if (states & (RADV_CMD_DIRTY_DYNAMIC_RASTERIZATION_SAMPLES | RADV_CMD_DIRTY_DYNAMIC_LINE_RASTERIZATION_MODE)) radv_emit_rasterization_samples(cmd_buffer); diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index b4f7321c8df..556342e82e5 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -1623,7 +1623,7 @@ radv_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice, case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: { VkPhysicalDeviceLineRasterizationFeaturesEXT *features = (VkPhysicalDeviceLineRasterizationFeaturesEXT *)ext; - features->rectangularLines = false; + features->rectangularLines = true; features->bresenhamLines = true; features->smoothLines = false; features->stippledRectangularLines = false; diff --git a/src/amd/vulkan/si_cmd_buffer.c b/src/amd/vulkan/si_cmd_buffer.c index 06ab5f15d7d..5e540764a05 100644 --- a/src/amd/vulkan/si_cmd_buffer.c +++ b/src/amd/vulkan/si_cmd_buffer.c @@ -620,11 +620,6 @@ si_emit_graphics(struct radv_device *device, struct radeon_cmdbuf *cs) } } - /* The DX10 diamond test is unnecessary with Vulkan and it decreases line rasterization - * performance. - */ - radeon_set_context_reg(cs, R_028BDC_PA_SC_LINE_CNTL, 0); - if (physical_device->rad_info.gfx_level >= GFX11) { radeon_set_context_reg(cs, R_028C54_PA_SC_BINNER_CNTL_2, 0); radeon_set_context_reg(cs, R_028620_PA_RATE_CNTL,