radv: add support for rectangularLines

dEQP-VK.*rectangular_line* pass on NAVI21.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21287>
This commit is contained in:
Samuel Pitoiset 2023-02-10 13:24:25 +01:00 committed by Marge Bot
parent 3368c0e6f2
commit 685f08f91d
3 changed files with 25 additions and 9 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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,