From 6c80b084f26dfe60e86c80dcc10da3544244b79e Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Fri, 16 Apr 2021 12:50:00 +0200 Subject: [PATCH] v3dv: better tracking of dirty push constant state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Alejandro PiƱeiro Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 21 ++++++++++++++++----- src/broadcom/vulkan/v3dv_private.h | 1 + 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 9ccc1a12c87..388cfce8c04 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -3749,12 +3749,12 @@ update_gfx_uniform_state(struct v3dv_cmd_buffer *cmd_buffer, has_new_descriptors && (cmd_buffer->state.dirty_descriptor_stages & VK_SHADER_STAGE_FRAGMENT_BIT); - const bool has_new_descriptors_vs = - has_new_descriptors && - (cmd_buffer->state.dirty_descriptor_stages & VK_SHADER_STAGE_VERTEX_BIT); + const bool has_new_push_constants_fs = + has_new_push_constants && + (cmd_buffer->state.dirty_push_constants_stages & VK_SHADER_STAGE_FRAGMENT_BIT); const bool needs_fs_update = has_new_pipeline || - has_new_push_constants || + has_new_push_constants_fs || has_new_descriptors_fs; if (needs_fs_update) { @@ -3765,9 +3765,17 @@ update_gfx_uniform_state(struct v3dv_cmd_buffer *cmd_buffer, v3dv_write_uniforms(cmd_buffer, pipeline, fs_variant); } + const bool has_new_descriptors_vs = + has_new_descriptors && + (cmd_buffer->state.dirty_descriptor_stages & VK_SHADER_STAGE_VERTEX_BIT); + + const bool has_new_push_constants_vs = + has_new_push_constants && + (cmd_buffer->state.dirty_push_constants_stages & VK_SHADER_STAGE_VERTEX_BIT); + const bool needs_vs_update = has_new_viewport || has_new_pipeline || - has_new_push_constants || + has_new_push_constants_vs || has_new_descriptors_vs; if (needs_vs_update) { @@ -3962,6 +3970,7 @@ emit_gl_shader_state(struct v3dv_cmd_buffer *cmd_buffer) V3DV_CMD_DIRTY_DESCRIPTOR_SETS | V3DV_CMD_DIRTY_PUSH_CONSTANTS); cmd_buffer->state.dirty_descriptor_stages &= ~VK_SHADER_STAGE_ALL_GRAPHICS; + cmd_buffer->state.dirty_push_constants_stages &= ~VK_SHADER_STAGE_ALL_GRAPHICS; } static void @@ -4861,6 +4870,7 @@ v3dv_CmdPushConstants(VkCommandBuffer commandBuffer, memcpy((uint8_t *) cmd_buffer->push_constants_data + offset, pValues, size); cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_PUSH_CONSTANTS; + cmd_buffer->state.dirty_push_constants_stages |= stageFlags; } void @@ -5195,6 +5205,7 @@ cmd_buffer_emit_pre_dispatch(struct v3dv_cmd_buffer *cmd_buffer) cmd_buffer->state.dirty &= ~(V3DV_CMD_DIRTY_COMPUTE_PIPELINE | V3DV_CMD_DIRTY_COMPUTE_DESCRIPTOR_SETS); cmd_buffer->state.dirty_descriptor_stages &= ~VK_SHADER_STAGE_COMPUTE_BIT; + cmd_buffer->state.dirty_push_constants_stages &= ~VK_SHADER_STAGE_COMPUTE_BIT; } #define V3D_CSD_CFG012_WG_COUNT_SHIFT 16 diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index e20be3cc2b3..78dafc92923 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1061,6 +1061,7 @@ struct v3dv_cmd_buffer_state { uint32_t dirty; VkShaderStageFlagBits dirty_descriptor_stages; + VkShaderStageFlagBits dirty_push_constants_stages; /* Current clip window. We use this to check whether we have an active * scissor, since in that case we can't use TLB clears and need to fallback