summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>2022-11-30 08:05:36 +0100
committerEric Engestrom <eric@engestrom.ch>2022-12-14 20:47:01 +0000
commit7fa84a47dfcb0a582efa7ab15d4f2cd867f3306e (patch)
treeb7f337f1537653e11af84732a464a2fe157b8ce8
parent5f387adc0262bb6b13127fe6a674180fdd9c93ee (diff)
downloadmesa-7fa84a47dfcb0a582efa7ab15d4f2cd867f3306e.tar.gz
radv: fix guardband if the polygon mode is points or lines
If points or lines are drawn using the polygon mode, the guardband should be adjusted for large points/lines. Cc: 22.3 mesa-stable Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20185> (cherry picked from commit 12f26b5e6d57a1fd03c1f1fb0ab8ccae657026ab)
-rw-r--r--.pick_status.json2
-rw-r--r--src/amd/vulkan/radv_cmd_buffer.c9
-rw-r--r--src/amd/vulkan/radv_private.h20
-rw-r--r--src/amd/vulkan/si_cmd_buffer.c10
4 files changed, 34 insertions, 7 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 568589cfa98..6a9c8792e60 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -3226,7 +3226,7 @@
"description": "radv: fix guardband if the polygon mode is points or lines",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": null
},
diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 156f0472fea..c8a08b38a04 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -2980,7 +2980,7 @@ radv_emit_guardband_state(struct radv_cmd_buffer *cmd_buffer)
}
si_write_guardband(cmd_buffer->cs, d->viewport.count, d->viewport.viewports, rast_prim,
- d->line_width);
+ d->polygon_mode, d->line_width);
cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_GUARDBAND;
}
@@ -6009,8 +6009,13 @@ radv_CmdSetPolygonModeEXT(VkCommandBuffer commandBuffer, VkPolygonMode polygonMo
{
RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
struct radv_cmd_state *state = &cmd_buffer->state;
+ unsigned polygon_mode = si_translate_fill(polygonMode);
- state->dynamic.polygon_mode = si_translate_fill(polygonMode);
+ if (radv_polygon_mode_is_points_or_lines(state->dynamic.polygon_mode) !=
+ radv_polygon_mode_is_points_or_lines(polygon_mode))
+ state->dirty |= RADV_CMD_DIRTY_GUARDBAND;
+
+ state->dynamic.polygon_mode = polygon_mode;
state->dirty |= RADV_CMD_DIRTY_DYNAMIC_POLYGON_MODE;
}
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index b53eca7ee38..87c573218f4 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1733,7 +1733,7 @@ void si_write_scissors(struct radeon_cmdbuf *cs, int count, const VkRect2D *scis
const VkViewport *viewports);
void si_write_guardband(struct radeon_cmdbuf *cs, int count, const VkViewport *viewports,
- unsigned rast_prim, float line_width);
+ unsigned rast_prim, unsigned polygon_mode, 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,
@@ -3027,6 +3027,24 @@ radv_rast_prim_is_points_or_lines(unsigned rast_prim)
return radv_rast_prim_is_point(rast_prim) || radv_rast_prim_is_line(rast_prim);
}
+static inline bool
+radv_polygon_mode_is_point(unsigned polygon_mode)
+{
+ return polygon_mode == V_028814_X_DRAW_POINTS;
+}
+
+static inline bool
+radv_polygon_mode_is_line(unsigned polygon_mode)
+{
+ return polygon_mode == V_028814_X_DRAW_LINES;
+}
+
+static inline bool
+radv_polygon_mode_is_points_or_lines(unsigned polygon_mode)
+{
+ return radv_polygon_mode_is_point(polygon_mode) || radv_polygon_mode_is_line(polygon_mode);
+}
+
static inline unsigned
radv_get_num_vertices_per_prim(const struct radv_pipeline_key *pipeline_key)
{
diff --git a/src/amd/vulkan/si_cmd_buffer.c b/src/amd/vulkan/si_cmd_buffer.c
index 047e814452e..b1d7bfaa177 100644
--- a/src/amd/vulkan/si_cmd_buffer.c
+++ b/src/amd/vulkan/si_cmd_buffer.c
@@ -745,8 +745,12 @@ si_write_scissors(struct radeon_cmdbuf *cs, int count, const VkRect2D *scissors,
void
si_write_guardband(struct radeon_cmdbuf *cs, int count, const VkViewport *viewports,
- unsigned rast_prim, float line_width)
+ unsigned rast_prim, unsigned polygon_mode, float line_width)
{
+ const bool draw_points =
+ radv_rast_prim_is_point(rast_prim) || radv_polygon_mode_is_point(polygon_mode);
+ const bool draw_lines =
+ radv_rast_prim_is_line(rast_prim) || radv_polygon_mode_is_line(polygon_mode);
int i;
float scale[3], translate[3], guardband_x = INFINITY, guardband_y = INFINITY;
float discard_x = 1.0f, discard_y = 1.0f;
@@ -767,12 +771,12 @@ si_write_guardband(struct radeon_cmdbuf *cs, int count, const VkViewport *viewpo
guardband_x = MIN2(guardband_x, (max_range - fabsf(translate[0])) / scale[0]);
guardband_y = MIN2(guardband_y, (max_range - fabsf(translate[1])) / scale[1]);
- if (radv_rast_prim_is_points_or_lines(rast_prim)) {
+ if (draw_points || draw_lines) {
/* When rendering wide points or lines, we need to be more conservative about when to
* discard them entirely. */
float pixels;
- if (rast_prim == V_028A6C_POINTLIST) {
+ if (draw_points) {
pixels = 8191.875f;
} else {
pixels = line_width;