From 009082dcfff5cbbce007d1b455ad33db1954c7aa Mon Sep 17 00:00:00 2001 From: Jonathan Marek Date: Tue, 7 Apr 2020 23:25:12 -0400 Subject: [PATCH] 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 Part-of: --- 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 3921da2..487db2a 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 583c38a..3de4153 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 { -- 2.7.4