From cb7f148020790af2c518c50e985270a4342e5239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= Date: Wed, 4 Mar 2020 15:38:55 +0100 Subject: [PATCH] v3dv/descriptor: take into account pPushConstantRanges Push constant tests were still working without taking this into account because we can't really fine graine how much we allocate for them. For now we only use them to know if we should allocate/fill the ubo for push constants or not. Part-of: --- src/broadcom/vulkan/v3dv_descriptor_set.c | 9 +++++++++ src/broadcom/vulkan/v3dv_private.h | 2 ++ src/broadcom/vulkan/v3dv_uniforms.c | 3 ++- 3 files changed, 13 insertions(+), 1 deletion(-) 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) {