v3dv: move push constant data to the command buffer state

Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17536>
This commit is contained in:
Iago Toral Quiroga 2022-07-13 12:44:45 +02:00 committed by Marge Bot
parent 41a0c89d9f
commit 005542f0e3
3 changed files with 26 additions and 21 deletions

View file

@ -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;

View file

@ -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

View file

@ -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: