diff --git a/src/broadcom/vulkan/v3dv_descriptor_set.c b/src/broadcom/vulkan/v3dv_descriptor_set.c index 625a80f0456..e20de489e63 100644 --- a/src/broadcom/vulkan/v3dv_descriptor_set.c +++ b/src/broadcom/vulkan/v3dv_descriptor_set.c @@ -64,6 +64,15 @@ v3dv_CreatePipelineLayout(VkDevice _device, } } + layout->push_constant_size = 0; + for (unsigned i = 0; i < pCreateInfo->pushConstantRangeCount; ++i) { + const VkPushConstantRange *range = pCreateInfo->pPushConstantRanges + i; + layout->push_constant_size = + MAX2(layout->push_constant_size, range->offset + range->size); + } + + layout->push_constant_size = align(layout->push_constant_size, 4096); + layout->dynamic_offset_count = dynamic_offset_count; *pPipelineLayout = v3dv_pipeline_layout_to_handle(layout); diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index be7290e9a87..4fc44ff294d 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -822,6 +822,8 @@ struct v3dv_pipeline_layout { uint32_t num_sets; uint32_t dynamic_offset_count; + + uint32_t push_constant_size; }; struct v3dv_descriptor_map { diff --git a/src/broadcom/vulkan/v3dv_uniforms.c b/src/broadcom/vulkan/v3dv_uniforms.c index 70151cf3192..e80ee4a431e 100644 --- a/src/broadcom/vulkan/v3dv_uniforms.c +++ b/src/broadcom/vulkan/v3dv_uniforms.c @@ -96,7 +96,8 @@ get_descriptor(struct v3dv_descriptor_state *descriptor_state, static void check_push_constants_ubo(struct v3dv_cmd_buffer *cmd_buffer) { - if (!(cmd_buffer->state.dirty & V3DV_CMD_DIRTY_PUSH_CONSTANTS)) + if (!(cmd_buffer->state.dirty & V3DV_CMD_DIRTY_PUSH_CONSTANTS) || + cmd_buffer->state.pipeline->layout->push_constant_size == 0) return; if (cmd_buffer->push_constants_descriptor.bo == NULL) {