diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index 0c9e51e6336..36253894fb2 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -2908,13 +2908,11 @@ tu_CmdSetScissor(VkCommandBuffer commandBuffer, const VkRect2D *pScissors) { TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); - struct tu_cs cs; memcpy(&cmd->state.scissor[firstScissor], pScissors, scissorCount * sizeof(*pScissors)); cmd->state.max_scissor = MAX2(cmd->state.max_scissor, firstScissor + scissorCount); - cs = tu_cmd_dynamic_state(cmd, VK_DYNAMIC_STATE_SCISSOR, 1 + 2 * cmd->state.max_scissor); - tu6_emit_scissor(&cs, cmd->state.scissor, cmd->state.max_scissor); + cmd->state.dirty |= TU_CMD_DIRTY_SCISSORS; } VKAPI_ATTR void VKAPI_CALL @@ -5044,6 +5042,11 @@ tu6_draw_common(struct tu_cmd_buffer *cmd, cmd->state.z_negative_one_to_one); } + if (dirty & TU_CMD_DIRTY_SCISSORS) { + struct tu_cs cs = tu_cmd_dynamic_state(cmd, VK_DYNAMIC_STATE_SCISSOR, 1 + 2 * cmd->state.max_scissor); + tu6_emit_scissor(&cs, cmd->state.scissor, cmd->state.max_scissor); + } + if (dirty & TU_CMD_DIRTY_BLEND) { struct tu_cs cs = tu_cmd_dynamic_state(cmd, TU_DYNAMIC_STATE_BLEND, 8 + 3 * cmd->state.pipeline->blend.num_rts); diff --git a/src/freedreno/vulkan/tu_cmd_buffer.h b/src/freedreno/vulkan/tu_cmd_buffer.h index b5ee6c24ee0..e9d00b828dd 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.h +++ b/src/freedreno/vulkan/tu_cmd_buffer.h @@ -65,10 +65,11 @@ enum tu_cmd_dirty_bits TU_CMD_DIRTY_VS_PARAMS = BIT(9), TU_CMD_DIRTY_PC_RASTER_CNTL = BIT(10), TU_CMD_DIRTY_VIEWPORTS = BIT(11), - TU_CMD_DIRTY_BLEND = BIT(12), - TU_CMD_DIRTY_PATCH_CONTROL_POINTS = BIT(13), + TU_CMD_DIRTY_SCISSORS = BIT(12), + TU_CMD_DIRTY_BLEND = BIT(13), + TU_CMD_DIRTY_PATCH_CONTROL_POINTS = BIT(14), /* all draw states were disabled and need to be re-enabled: */ - TU_CMD_DIRTY_DRAW_STATE = BIT(14) + TU_CMD_DIRTY_DRAW_STATE = BIT(15) }; /* There are only three cache domains we have to care about: the CCU, or