Mesa (master): v3dv: better tracking of dirty push constant state

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Apr 16 12:43:28 UTC 2021


Module: Mesa
Branch: master
Commit: 6c80b084f26dfe60e86c80dcc10da3544244b79e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6c80b084f26dfe60e86c80dcc10da3544244b79e

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Fri Apr 16 12:50:00 2021 +0200

v3dv: better tracking of dirty push constant state

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10283>

---

 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



More information about the mesa-commit mailing list