From 702b685b074b696592fe4429e7f780ae67ff1f1e Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Fri, 15 Jul 2022 05:01:22 +0200 Subject: [PATCH] v3dv: add a dirty state for pending push constants UBO updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If we have 2 pipelines that consume the same push constant data but where one of them only uses direct access and the other has indirect access, a draw with the first pipeline would clear the dirty flag without updating the UBO and by the time we bind and draw with the second pipeline we won't upload the constants either because the first draw cleared the dirty flag. Reviewed-by: Alejandro PiƱeiro Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 3 ++- src/broadcom/vulkan/v3dv_private.h | 13 +++++++------ src/broadcom/vulkan/v3dv_uniforms.c | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 96ddcff6c1c..fc8de8e271e 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -3102,7 +3102,8 @@ v3dv_CmdPushConstants(VkCommandBuffer commandBuffer, cmd_buffer->state.push_constants_size = MAX2(offset + size, cmd_buffer->state.push_constants_size); - cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_PUSH_CONSTANTS; + cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_PUSH_CONSTANTS | + V3DV_CMD_DIRTY_PUSH_CONSTANTS_UBO; cmd_buffer->state.dirty_push_constants_stages |= stageFlags; } diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 723c924d17b..d6e160bc074 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -885,12 +885,13 @@ enum v3dv_cmd_dirty_bits { V3DV_CMD_DIRTY_DESCRIPTOR_SETS = 1 << 9, V3DV_CMD_DIRTY_COMPUTE_DESCRIPTOR_SETS = 1 << 10, V3DV_CMD_DIRTY_PUSH_CONSTANTS = 1 << 11, - V3DV_CMD_DIRTY_BLEND_CONSTANTS = 1 << 12, - V3DV_CMD_DIRTY_OCCLUSION_QUERY = 1 << 13, - V3DV_CMD_DIRTY_DEPTH_BIAS = 1 << 14, - V3DV_CMD_DIRTY_LINE_WIDTH = 1 << 15, - V3DV_CMD_DIRTY_VIEW_INDEX = 1 << 16, - V3DV_CMD_DIRTY_COLOR_WRITE_ENABLE = 1 << 17, + V3DV_CMD_DIRTY_PUSH_CONSTANTS_UBO = 1 << 12, + V3DV_CMD_DIRTY_BLEND_CONSTANTS = 1 << 13, + V3DV_CMD_DIRTY_OCCLUSION_QUERY = 1 << 14, + V3DV_CMD_DIRTY_DEPTH_BIAS = 1 << 15, + V3DV_CMD_DIRTY_LINE_WIDTH = 1 << 16, + V3DV_CMD_DIRTY_VIEW_INDEX = 1 << 17, + V3DV_CMD_DIRTY_COLOR_WRITE_ENABLE = 1 << 18, }; struct v3dv_dynamic_state { diff --git a/src/broadcom/vulkan/v3dv_uniforms.c b/src/broadcom/vulkan/v3dv_uniforms.c index 7afb7817ba7..425b84e0e1a 100644 --- a/src/broadcom/vulkan/v3dv_uniforms.c +++ b/src/broadcom/vulkan/v3dv_uniforms.c @@ -94,7 +94,7 @@ static void check_push_constants_ubo(struct v3dv_cmd_buffer *cmd_buffer, struct v3dv_pipeline *pipeline) { - if (!(cmd_buffer->state.dirty & V3DV_CMD_DIRTY_PUSH_CONSTANTS) || + if (!(cmd_buffer->state.dirty & V3DV_CMD_DIRTY_PUSH_CONSTANTS_UBO) || pipeline->layout->push_constant_size == 0) return; @@ -146,7 +146,7 @@ check_push_constants_ubo(struct v3dv_cmd_buffer *cmd_buffer, cmd_buffer->state.push_constants_data, cmd_buffer->state.push_constants_size); - cmd_buffer->state.dirty &= ~V3DV_CMD_DIRTY_PUSH_CONSTANTS; + cmd_buffer->state.dirty &= ~V3DV_CMD_DIRTY_PUSH_CONSTANTS_UBO; } /** V3D 4.x TMU configuration parameter 0 (texture) */