From 1cddf59165f6b1783542e3ba364b1891317cdb9f Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 6 Feb 2024 16:09:31 +0100 Subject: [PATCH] radv: get the pipeline layout info from the push constant token with DGC They must be compatible and this allows us to remove some pipeline references (useful for experimenting pipeline binds). Signed-off-by: Samuel Pitoiset Part-of: --- .../vulkan/radv_device_generated_commands.c | 23 +++++++++++-------- src/amd/vulkan/radv_private.h | 2 ++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/amd/vulkan/radv_device_generated_commands.c b/src/amd/vulkan/radv_device_generated_commands.c index b33271f41fb..bc660ff80f7 100644 --- a/src/amd/vulkan/radv_device_generated_commands.c +++ b/src/amd/vulkan/radv_device_generated_commands.c @@ -130,8 +130,9 @@ radv_get_sequence_size(const struct radv_indirect_command_layout *layout, struct /* One PKT3_SET_SH_REG writing all inline push constants. */ *cmd_size += (3 * util_bitcount64(layout->push_constant_mask)) * 4; } - if (need_copy) - *upload_size += align(pipeline->push_constant_size + 16 * pipeline->dynamic_offset_count, 16); + if (need_copy) { + *upload_size += align(layout->push_constant_size + 16 * layout->dynamic_offset_count, 16); + } } if (device->sqtt.bo) { @@ -1535,13 +1536,17 @@ radv_CreateIndirectCommandsLayoutNV(VkDevice _device, const VkIndirectCommandsLa if (pCreateInfo->pTokens[i].vertexDynamicStride) layout->vbo_offsets[pCreateInfo->pTokens[i].vertexBindingUnit] |= DGC_DYNAMIC_STRIDE; break; - case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV: + case VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV: { + RADV_FROM_HANDLE(radv_pipeline_layout, pipeline_layout, pCreateInfo->pTokens[i].pushconstantPipelineLayout); for (unsigned j = pCreateInfo->pTokens[i].pushconstantOffset / 4, k = 0; k < pCreateInfo->pTokens[i].pushconstantSize / 4; ++j, ++k) { layout->push_constant_mask |= 1ull << j; layout->push_constant_offsets[j] = pCreateInfo->pTokens[i].offset + k * 4; } + layout->push_constant_size = pipeline_layout->push_constant_size; + layout->dynamic_offset_count = pipeline_layout->dynamic_offset_count; break; + } case VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV: layout->draw_mesh_tasks = true; layout->draw_params_offset = pCreateInfo->pTokens[i].offset; @@ -1825,7 +1830,7 @@ radv_prepare_dgc(struct radv_cmd_buffer *cmd_buffer, const VkGeneratedCommandsIn .stream_addr = stream_addr, }; - upload_size = pipeline->push_constant_size + 16 * pipeline->dynamic_offset_count + + upload_size = layout->push_constant_size + 16 * layout->dynamic_offset_count + sizeof(layout->push_constant_offsets) + ARRAY_SIZE(pipeline->shaders) * 12; if (!layout->push_constant_mask) upload_size = 0; @@ -1878,19 +1883,19 @@ radv_prepare_dgc(struct radv_cmd_buffer *cmd_buffer, const VkGeneratedCommandsIn params.push_constant_shader_cnt = idx; - params.const_copy_size = pipeline->push_constant_size + 16 * pipeline->dynamic_offset_count; + params.const_copy_size = layout->push_constant_size + 16 * layout->dynamic_offset_count; params.push_constant_mask = layout->push_constant_mask; memcpy(upload_data, layout->push_constant_offsets, sizeof(layout->push_constant_offsets)); upload_data = (char *)upload_data + sizeof(layout->push_constant_offsets); - memcpy(upload_data, cmd_buffer->push_constants, pipeline->push_constant_size); - upload_data = (char *)upload_data + pipeline->push_constant_size; + memcpy(upload_data, cmd_buffer->push_constants, layout->push_constant_size); + upload_data = (char *)upload_data + layout->push_constant_size; struct radv_descriptor_state *descriptors_state = radv_get_descriptors_state(cmd_buffer, pGeneratedCommandsInfo->pipelineBindPoint); - memcpy(upload_data, descriptors_state->dynamic_buffers, 16 * pipeline->dynamic_offset_count); - upload_data = (char *)upload_data + 16 * pipeline->dynamic_offset_count; + memcpy(upload_data, descriptors_state->dynamic_buffers, 16 * layout->dynamic_offset_count); + upload_data = (char *)upload_data + 16 * layout->dynamic_offset_count; } radv_buffer_init(&token_buffer, cmd_buffer->device, cmd_buffer->upload.upload_bo, upload_size, upload_offset); diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 8bf3b5d9c4b..dc270cd4f04 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -3280,6 +3280,8 @@ struct radv_indirect_command_layout { uint64_t push_constant_mask; uint32_t push_constant_offsets[MAX_PUSH_CONSTANTS_SIZE / 4]; + uint32_t push_constant_size; + uint32_t dynamic_offset_count; uint32_t ibo_type_32; uint32_t ibo_type_8;