Mesa (main): anv: Include viewport size in scissor rectangle
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Nov 3 18:01:34 UTC 2021
Module: Mesa
Branch: main
Commit: 732cfa525f431b6f5b47e2623645cf14716b4bdf
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=732cfa525f431b6f5b47e2623645cf14716b4bdf
Author: Vadym Shovkoplias <vadym.shovkoplias at globallogic.com>
Date: Thu Oct 28 16:03:11 2021 +0300
anv: Include viewport size in scissor rectangle
Prevent drawing outside the viewport when viewport size
is smaller than framebuffer size.
v2: (Jason Ekstrand)
- re-emit scissor on viewport change
- do the same calculations for other platforms
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5515
Signed-off-by: Vadym Shovkoplias <vadym.shovkoplias at globallogic.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13594>
---
src/intel/vulkan/genX_cmd_buffer.c | 3 ++-
src/intel/vulkan/gfx7_cmd_buffer.c | 13 +++++++++----
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
index 6b4ff925f35..8f51f08e3d0 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -3758,7 +3758,8 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
}
if (cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_DYNAMIC_SCISSOR |
- ANV_CMD_DIRTY_RENDER_TARGETS))
+ ANV_CMD_DIRTY_RENDER_TARGETS |
+ ANV_CMD_DIRTY_DYNAMIC_VIEWPORT))
gfx7_cmd_buffer_emit_scissor(cmd_buffer);
genX(cmd_buffer_flush_dynamic_state)(cmd_buffer);
diff --git a/src/intel/vulkan/gfx7_cmd_buffer.c b/src/intel/vulkan/gfx7_cmd_buffer.c
index b092bd8c377..5ddc9022015 100644
--- a/src/intel/vulkan/gfx7_cmd_buffer.c
+++ b/src/intel/vulkan/gfx7_cmd_buffer.c
@@ -51,6 +51,8 @@ gfx7_cmd_buffer_emit_scissor(struct anv_cmd_buffer *cmd_buffer)
struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
uint32_t count = cmd_buffer->state.gfx.dynamic.scissor.count;
const VkRect2D *scissors = cmd_buffer->state.gfx.dynamic.scissor.scissors;
+ const VkViewport *viewports =
+ cmd_buffer->state.gfx.dynamic.viewport.viewports;
/* Wa_1409725701:
* "The viewport-specific state used by the SF unit (SCISSOR_RECT) is
@@ -64,6 +66,7 @@ gfx7_cmd_buffer_emit_scissor(struct anv_cmd_buffer *cmd_buffer)
for (uint32_t i = 0; i < count; i++) {
const VkRect2D *s = &scissors[i];
+ const VkViewport *vp = &viewports[i];
/* Since xmax and ymax are inclusive, we have to have xmax < xmin or
* ymax < ymin for empty clips. In case clip x, y, width height are all
@@ -79,10 +82,12 @@ gfx7_cmd_buffer_emit_scissor(struct anv_cmd_buffer *cmd_buffer)
const int max = 0xffff;
- uint32_t y_min = s->offset.y;
- uint32_t x_min = s->offset.x;
- uint32_t y_max = s->offset.y + s->extent.height - 1;
- uint32_t x_max = s->offset.x + s->extent.width - 1;
+ uint32_t y_min = MAX2(s->offset.y, MIN2(vp->y, vp->y + vp->height));
+ uint32_t x_min = MAX2(s->offset.x, vp->x);
+ uint32_t y_max = MIN2(s->offset.y + s->extent.height - 1,
+ MAX2(vp->y, vp->y + vp->height) - 1);
+ uint32_t x_max = MIN2(s->offset.x + s->extent.width - 1,
+ vp->x + vp->width - 1);
/* Do this math using int64_t so overflow gets clamped correctly. */
if (cmd_buffer->level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
More information about the mesa-commit
mailing list