Mesa (main): v3dv: add a dirty state for pending push constants UBO updates

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 19 06:10:00 UTC 2022


Module: Mesa
Branch: main
Commit: 702b685b074b696592fe4429e7f780ae67ff1f1e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=702b685b074b696592fe4429e7f780ae67ff1f1e

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Fri Jul 15 05:01:22 2022 +0200

v3dv: add a dirty state for pending push constants UBO updates

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 <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17536>

---

 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) */



More information about the mesa-commit mailing list