diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 1c38458c052..96ddcff6c1c 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -2231,11 +2231,11 @@ v3dv_cmd_buffer_meta_state_push(struct v3dv_cmd_buffer *cmd_buffer, state->meta.has_descriptor_state = false; } - if (cmd_buffer->push_constants_size > 0) { - state->meta.push_constants_size = cmd_buffer->push_constants_size; - memcpy(state->meta.push_constants, cmd_buffer->push_constants_data, - cmd_buffer->push_constants_size); - cmd_buffer->push_constants_size = 0; + if (cmd_buffer->state.push_constants_size > 0) { + state->meta.push_constants_size = cmd_buffer->state.push_constants_size; + memcpy(state->meta.push_constants, cmd_buffer->state.push_constants_data, + cmd_buffer->state.push_constants_size); + cmd_buffer->state.push_constants_size = 0; } } @@ -2304,11 +2304,11 @@ v3dv_cmd_buffer_meta_state_pop(struct v3dv_cmd_buffer *cmd_buffer, * data. */ if (state->meta.push_constants_size > 0 && - cmd_buffer->push_constants_size > 0) { - memcpy(cmd_buffer->push_constants_data, state->meta.push_constants, + cmd_buffer->state.push_constants_size > 0) { + memcpy(cmd_buffer->state.push_constants_data, state->meta.push_constants, state->meta.push_constants_size); } - cmd_buffer->push_constants_size = state->meta.push_constants_size; + cmd_buffer->state.push_constants_size = state->meta.push_constants_size; state->meta.gfx.pipeline = NULL; state->meta.framebuffer = VK_NULL_HANDLE; @@ -3092,12 +3092,15 @@ v3dv_CmdPushConstants(VkCommandBuffer commandBuffer, { V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer); - if (!memcmp((uint8_t *) cmd_buffer->push_constants_data + offset, pValues, size)) + if (!memcmp((uint8_t *) cmd_buffer->state.push_constants_data + offset, + pValues, size)) { return; + } - memcpy((uint8_t *) cmd_buffer->push_constants_data + offset, pValues, size); - cmd_buffer->push_constants_size = - MAX2(offset + size, cmd_buffer->push_constants_size); + memcpy((uint8_t *) cmd_buffer->state.push_constants_data + offset, + pValues, size); + 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_push_constants_stages |= stageFlags; diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index b90454b1bd9..723c924d17b 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1279,6 +1279,14 @@ struct v3dv_cmd_buffer_state { */ bool tile_aligned_render_area; + /* FIXME: we have just one client-side BO for the push constants, + * independently of the stageFlags in vkCmdPushConstants, and the + * pipelineBindPoint in vkCmdBindPipeline. We could probably do more stage + * tunning in the future if it makes sense. + */ + uint32_t push_constants_size; + uint32_t push_constants_data[MAX_PUSH_CONSTANTS_SIZE / 4]; + uint32_t attachment_alloc_count; struct v3dv_cmd_buffer_attachment_state *attachments; @@ -1470,13 +1478,7 @@ struct v3dv_cmd_buffer { struct v3dv_cmd_buffer_state state; - /* FIXME: we have just one client-side and bo for the push constants, - * independently of the stageFlags in vkCmdPushConstants, and the - * pipelineBindPoint in vkCmdBindPipeline. We could probably do more stage - * tunning in the future if it makes sense. - */ - uint32_t push_constants_size; - uint32_t push_constants_data[MAX_PUSH_CONSTANTS_SIZE / 4]; + /* Buffer where we upload push constant data to resolve indirect indexing */ struct v3dv_cl_reloc push_constants_resource; /* Collection of Vulkan objects created internally by the driver (typically diff --git a/src/broadcom/vulkan/v3dv_uniforms.c b/src/broadcom/vulkan/v3dv_uniforms.c index 240d3ba7a3b..ca3afdf339b 100644 --- a/src/broadcom/vulkan/v3dv_uniforms.c +++ b/src/broadcom/vulkan/v3dv_uniforms.c @@ -123,7 +123,7 @@ check_push_constants_ubo(struct v3dv_cmd_buffer *cmd_buffer, memcpy(cmd_buffer->push_constants_resource.bo->map + cmd_buffer->push_constants_resource.offset, - cmd_buffer->push_constants_data, + cmd_buffer->state.push_constants_data, MAX_PUSH_CONSTANTS_SIZE); cmd_buffer->state.dirty &= ~V3DV_CMD_DIRTY_PUSH_CONSTANTS; @@ -489,7 +489,7 @@ v3dv_write_uniforms_wg_offsets(struct v3dv_cmd_buffer *cmd_buffer, break; case QUNIFORM_UNIFORM: - cl_aligned_u32(&uniforms, cmd_buffer->push_constants_data[data]); + cl_aligned_u32(&uniforms, cmd_buffer->state.push_constants_data[data]); break; case QUNIFORM_INLINE_UBO_0: