From 5bbb7de51434f3811bd2a698a3a2ea3138db71e5 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 25 Aug 2022 09:47:24 +0200 Subject: [PATCH] radv: split emitting guardband into a separate helper This will be used to emit guardband separately from scissor. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 6 ++++-- src/amd/vulkan/radv_private.h | 5 ++++- src/amd/vulkan/si_cmd_buffer.c | 30 +++++++++++++++++++++--------- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 762c0612e09..9bd65735d0c 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -1564,8 +1564,10 @@ radv_write_scissors(struct radv_cmd_buffer *cmd_buffer, struct radeon_cmdbuf *cs } si_write_scissors(cs, count, cmd_buffer->state.dynamic.scissor.scissors, - cmd_buffer->state.dynamic.viewport.viewports, rast_prim, - cmd_buffer->state.dynamic.line_width); + cmd_buffer->state.dynamic.viewport.viewports); + + si_write_guardband(cs, count, cmd_buffer->state.dynamic.viewport.viewports, rast_prim, + cmd_buffer->state.dynamic.line_width); } static void diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 037bfd2a852..06c29745a08 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1685,7 +1685,10 @@ void si_emit_compute(struct radv_device *device, struct radeon_cmdbuf *cs); void cik_create_gfx_config(struct radv_device *device); void si_write_scissors(struct radeon_cmdbuf *cs, int count, const VkRect2D *scissors, - const VkViewport *viewports, unsigned rast_prim, float line_width); + const VkViewport *viewports); + +void si_write_guardband(struct radeon_cmdbuf *cs, int count, const VkViewport *viewports, + unsigned rast_prim, float line_width); uint32_t si_get_ia_multi_vgt_param(struct radv_cmd_buffer *cmd_buffer, bool instanced_draw, bool indirect_draw, bool count_from_stream_output, diff --git a/src/amd/vulkan/si_cmd_buffer.c b/src/amd/vulkan/si_cmd_buffer.c index 1c7dd8f37f8..fc2140737f0 100644 --- a/src/amd/vulkan/si_cmd_buffer.c +++ b/src/amd/vulkan/si_cmd_buffer.c @@ -715,12 +715,10 @@ si_intersect_scissor(const VkRect2D *a, const VkRect2D *b) void si_write_scissors(struct radeon_cmdbuf *cs, int count, const VkRect2D *scissors, - const VkViewport *viewports, unsigned rast_prim, float line_width) + const VkViewport *viewports) { int i; - float scale[3], translate[3], guardband_x = INFINITY, guardband_y = INFINITY; - float discard_x = 1.0f, discard_y = 1.0f; - const float max_range = 32767.0f; + if (!count) return; @@ -729,6 +727,25 @@ si_write_scissors(struct radeon_cmdbuf *cs, int count, const VkRect2D *scissors, VkRect2D viewport_scissor = si_scissor_from_viewport(viewports + i); VkRect2D scissor = si_intersect_scissor(&scissors[i], &viewport_scissor); + radeon_emit(cs, S_028250_TL_X(scissor.offset.x) | S_028250_TL_Y(scissor.offset.y) | + S_028250_WINDOW_OFFSET_DISABLE(1)); + radeon_emit(cs, S_028254_BR_X(scissor.offset.x + scissor.extent.width) | + S_028254_BR_Y(scissor.offset.y + scissor.extent.height)); + } +} + +void +si_write_guardband(struct radeon_cmdbuf *cs, int count, const VkViewport *viewports, + unsigned rast_prim, float line_width) +{ + int i; + float scale[3], translate[3], guardband_x = INFINITY, guardband_y = INFINITY; + float discard_x = 1.0f, discard_y = 1.0f; + const float max_range = 32767.0f; + if (!count) + return; + + for (i = 0; i < count; i++) { radv_get_viewport_xform(viewports + i, scale, translate); scale[0] = fabsf(scale[0]); scale[1] = fabsf(scale[1]); @@ -741,11 +758,6 @@ si_write_scissors(struct radeon_cmdbuf *cs, int count, const VkRect2D *scissors, guardband_x = MIN2(guardband_x, (max_range - fabsf(translate[0])) / scale[0]); guardband_y = MIN2(guardband_y, (max_range - fabsf(translate[1])) / scale[1]); - radeon_emit(cs, S_028250_TL_X(scissor.offset.x) | S_028250_TL_Y(scissor.offset.y) | - S_028250_WINDOW_OFFSET_DISABLE(1)); - radeon_emit(cs, S_028254_BR_X(scissor.offset.x + scissor.extent.width) | - S_028254_BR_Y(scissor.offset.y + scissor.extent.height)); - if (radv_rast_prim_is_points_or_lines(rast_prim)) { /* When rendering wide points or lines, we need to be more conservative about when to * discard them entirely. */