Mesa (master): turnip: use dirty bits for dynamic viewport/scissor state

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 9 15:06:21 UTC 2020


Module: Mesa
Branch: master
Commit: 009082dcfff5cbbce007d1b455ad33db1954c7aa
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=009082dcfff5cbbce007d1b455ad33db1954c7aa

Author: Jonathan Marek <jonathan at marek.ca>
Date:   Tue Apr  7 23:25:12 2020 -0400

turnip: use dirty bits for dynamic viewport/scissor state

CmdClearAttachments shader path will overwrite this state, so it needs to
be re-emitted with dirty bits in that case.

Signed-off-by: Jonathan Marek <jonathan at marek.ca>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3783>

---

 src/freedreno/vulkan/tu_cmd_buffer.c | 22 ++++++++++++++--------
 src/freedreno/vulkan/tu_private.h    |  2 ++
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c
index 3921da2451c..487db2a89ff 100644
--- a/src/freedreno/vulkan/tu_cmd_buffer.c
+++ b/src/freedreno/vulkan/tu_cmd_buffer.c
@@ -2310,12 +2310,10 @@ tu_CmdSetViewport(VkCommandBuffer commandBuffer,
                   const VkViewport *pViewports)
 {
    TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
-   struct tu_cs *draw_cs = &cmd->draw_cs;
 
    assert(firstViewport == 0 && viewportCount == 1);
-   tu6_emit_viewport(draw_cs, pViewports);
-
-   tu_cs_sanity_check(draw_cs);
+   cmd->state.dynamic.viewport.viewports[0] = pViewports[0];
+   cmd->state.dirty |= TU_CMD_DIRTY_DYNAMIC_VIEWPORT;
 }
 
 void
@@ -2325,12 +2323,10 @@ tu_CmdSetScissor(VkCommandBuffer commandBuffer,
                  const VkRect2D *pScissors)
 {
    TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
-   struct tu_cs *draw_cs = &cmd->draw_cs;
 
    assert(firstScissor == 0 && scissorCount == 1);
-   tu6_emit_scissor(draw_cs, pScissors);
-
-   tu_cs_sanity_check(draw_cs);
+   cmd->state.dynamic.scissor.scissors[0] = pScissors[0];
+   cmd->state.dirty |= TU_CMD_DIRTY_DYNAMIC_SCISSOR;
 }
 
 void
@@ -3431,6 +3427,16 @@ tu6_bind_draw_states(struct tu_cmd_buffer *cmd,
                                  dynamic->stencil_reference.back);
    }
 
+   if ((cmd->state.dirty & TU_CMD_DIRTY_DYNAMIC_VIEWPORT) &&
+       (pipeline->dynamic_state.mask & TU_DYNAMIC_VIEWPORT)) {
+      tu6_emit_viewport(cs, &cmd->state.dynamic.viewport.viewports[0]);
+   }
+
+   if ((cmd->state.dirty & TU_CMD_DIRTY_DYNAMIC_SCISSOR) &&
+       (pipeline->dynamic_state.mask & TU_DYNAMIC_SCISSOR)) {
+      tu6_emit_scissor(cs, &cmd->state.dynamic.scissor.scissors[0]);
+   }
+
    if (cmd->state.dirty &
        (TU_CMD_DIRTY_PIPELINE | TU_CMD_DIRTY_VERTEX_BUFFERS)) {
       for (uint32_t i = 0; i < pipeline->vi.count; i++) {
diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h
index 583c38a0a04..3de415304d8 100644
--- a/src/freedreno/vulkan/tu_private.h
+++ b/src/freedreno/vulkan/tu_private.h
@@ -850,6 +850,8 @@ enum tu_cmd_dirty_bits
    TU_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 17,
    TU_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK = 1 << 18,
    TU_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE = 1 << 19,
+   TU_CMD_DIRTY_DYNAMIC_VIEWPORT = 1 << 20,
+   TU_CMD_DIRTY_DYNAMIC_SCISSOR = 1 << 21,
 };
 
 struct tu_streamout_state {



More information about the mesa-commit mailing list