From a4fd4812fa9223d9ab1087ffcc53d9a9f50effc2 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 19 Jun 2024 13:03:45 -0400 Subject: [PATCH] vulkan: handle enqueueing CmdPushDescriptorSet2KHR implementation from lavapipe. again, no CTS for this... Signed-off-by: Alyssa Rosenzweig Acked-by: Konstantin Seurer Part-of: --- src/vulkan/runtime/vk_cmd_enqueue.c | 133 ++++++++++++++++++++++++++++ src/vulkan/util/vk_cmd_queue_gen.py | 4 +- 2 files changed, 134 insertions(+), 3 deletions(-) diff --git a/src/vulkan/runtime/vk_cmd_enqueue.c b/src/vulkan/runtime/vk_cmd_enqueue.c index 80396b72801..f04f1a8ae0d 100644 --- a/src/vulkan/runtime/vk_cmd_enqueue.c +++ b/src/vulkan/runtime/vk_cmd_enqueue.c @@ -748,3 +748,136 @@ VKAPI_ATTR void VKAPI_CALL vk_cmd_enqueue_CmdPushConstants2KHR( list_addtail(&cmd->cmd_link, &cmd_buffer->cmd_queue.cmds); } + +static void +vk_free_cmd_push_descriptor_set2_khr(struct vk_cmd_queue *queue, + struct vk_cmd_queue_entry *cmd) +{ + ralloc_free(cmd->driver_data); +} + +VKAPI_ATTR void VKAPI_CALL vk_cmd_enqueue_CmdPushDescriptorSet2KHR( + VkCommandBuffer commandBuffer, + const VkPushDescriptorSetInfoKHR* pPushDescriptorSetInfo) +{ + VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, commandBuffer); + struct vk_cmd_queue_entry *cmd = vk_zalloc(cmd_buffer->cmd_queue.alloc, vk_cmd_queue_type_sizes[VK_CMD_PUSH_DESCRIPTOR_SET2_KHR], 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + + cmd->type = VK_CMD_PUSH_DESCRIPTOR_SET2_KHR; + cmd->driver_free_cb = vk_free_cmd_push_descriptor_set2_khr; + + void *ctx = cmd->driver_data = ralloc_context(NULL); + if (pPushDescriptorSetInfo) { + cmd->u.push_descriptor_set2_khr.push_descriptor_set_info = vk_zalloc(cmd_buffer->cmd_queue.alloc, sizeof(VkPushDescriptorSetInfoKHR), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + + memcpy((void*)cmd->u.push_descriptor_set2_khr.push_descriptor_set_info, pPushDescriptorSetInfo, sizeof(VkPushDescriptorSetInfoKHR)); + VkPushDescriptorSetInfoKHR *tmp_dst1 = (void *) cmd->u.push_descriptor_set2_khr.push_descriptor_set_info; (void) tmp_dst1; + VkPushDescriptorSetInfoKHR *tmp_src1 = (void *) pPushDescriptorSetInfo; (void) tmp_src1; + + const VkBaseInStructure *pnext = tmp_dst1->pNext; + if (pnext) { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO: + if (pnext) { + tmp_dst1->pNext = rzalloc(ctx, VkPipelineLayoutCreateInfo); + + memcpy((void*)tmp_dst1->pNext, pnext, sizeof(VkPipelineLayoutCreateInfo)); + VkPipelineLayoutCreateInfo *tmp_dst2 = (void *) tmp_dst1->pNext; (void) tmp_dst2; + VkPipelineLayoutCreateInfo *tmp_src2 = (void *) pnext; (void) tmp_src2; + if (tmp_src2->pSetLayouts) { + tmp_dst2->pSetLayouts = rzalloc_array_size(ctx, sizeof(*tmp_dst2->pSetLayouts), tmp_dst2->setLayoutCount); + + memcpy((void*)tmp_dst2->pSetLayouts, tmp_src2->pSetLayouts, sizeof(*tmp_dst2->pSetLayouts) * tmp_dst2->setLayoutCount); + } + if (tmp_src2->pPushConstantRanges) { + tmp_dst2->pPushConstantRanges = rzalloc_array_size(ctx, sizeof(*tmp_dst2->pPushConstantRanges), tmp_dst2->pushConstantRangeCount); + + memcpy((void*)tmp_dst2->pPushConstantRanges, tmp_src2->pPushConstantRanges, sizeof(*tmp_dst2->pPushConstantRanges) * tmp_dst2->pushConstantRangeCount); + } + + } else { + tmp_dst1->pNext = NULL; + } + break; + } + } + if (tmp_src1->pDescriptorWrites) { + tmp_dst1->pDescriptorWrites = vk_zalloc(cmd_buffer->cmd_queue.alloc, sizeof(*tmp_dst1->pDescriptorWrites) * tmp_dst1->descriptorWriteCount, 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + + memcpy((void*)tmp_dst1->pDescriptorWrites, tmp_src1->pDescriptorWrites, sizeof(*tmp_dst1->pDescriptorWrites) * tmp_dst1->descriptorWriteCount); + for (unsigned i = 0; i < tmp_src1->descriptorWriteCount; i++) { + VkWriteDescriptorSet *dstwrite = (void*)&tmp_dst1->pDescriptorWrites[i]; + const VkWriteDescriptorSet *write = &tmp_src1->pDescriptorWrites[i]; + switch (write->descriptorType) { + case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK: { + const VkWriteDescriptorSetInlineUniformBlock *uniform_data = vk_find_struct_const(write->pNext, WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK); + assert(uniform_data); + VkWriteDescriptorSetInlineUniformBlock *dst = rzalloc(ctx, VkWriteDescriptorSetInlineUniformBlock); + memcpy((void*)dst, uniform_data, sizeof(*uniform_data)); + dst->pData = ralloc_size(ctx, uniform_data->dataSize); + memcpy((void*)dst->pData, uniform_data->pData, uniform_data->dataSize); + dstwrite->pNext = dst; + break; + } + + case VK_DESCRIPTOR_TYPE_SAMPLER: + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: + dstwrite->pImageInfo = rzalloc_array(ctx, VkDescriptorImageInfo, write->descriptorCount); + { + VkDescriptorImageInfo *arr = (void*)dstwrite->pImageInfo; + typed_memcpy(arr, write->pImageInfo, write->descriptorCount); + } + break; + + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: + dstwrite->pTexelBufferView = rzalloc_array(ctx, VkBufferView, write->descriptorCount); + { + VkBufferView *arr = (void*)dstwrite->pTexelBufferView; + typed_memcpy(arr, write->pTexelBufferView, write->descriptorCount); + } + break; + + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: + dstwrite->pBufferInfo = rzalloc_array(ctx, VkDescriptorBufferInfo, write->descriptorCount); + { + VkDescriptorBufferInfo *arr = (void*)dstwrite->pBufferInfo; + typed_memcpy(arr, write->pBufferInfo, write->descriptorCount); + } + break; + + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: { + const VkWriteDescriptorSetAccelerationStructureKHR *accel_structs = + vk_find_struct_const(write->pNext, WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR); + + uint32_t accel_structs_size = sizeof(VkAccelerationStructureKHR) * accel_structs->accelerationStructureCount; + VkWriteDescriptorSetAccelerationStructureKHR *write_accel_structs = + rzalloc_size(ctx, sizeof(VkWriteDescriptorSetAccelerationStructureKHR) + accel_structs_size); + + write_accel_structs->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR; + write_accel_structs->accelerationStructureCount = accel_structs->accelerationStructureCount; + write_accel_structs->pAccelerationStructures = (void *)&write_accel_structs[1]; + memcpy((void *)write_accel_structs->pAccelerationStructures, accel_structs->pAccelerationStructures, accel_structs_size); + + dstwrite->pNext = write_accel_structs; + break; + } + + default: + break; + } + } + } + } + + list_addtail(&cmd->cmd_link, &cmd_buffer->cmd_queue.cmds); +} diff --git a/src/vulkan/util/vk_cmd_queue_gen.py b/src/vulkan/util/vk_cmd_queue_gen.py index 8aacc30c726..86cb47572e8 100644 --- a/src/vulkan/util/vk_cmd_queue_gen.py +++ b/src/vulkan/util/vk_cmd_queue_gen.py @@ -56,12 +56,10 @@ MANUAL_COMMANDS = [ 'CmdPushDescriptorSetWithTemplate2KHR', 'CmdPushDescriptorSetWithTemplateKHR', 'CmdPushConstants2KHR', + 'CmdPushDescriptorSet2KHR', ] NO_ENQUEUE_COMMANDS = [ - # pData's size cannot be calculated from the xml - 'CmdPushDescriptorSet2KHR', - # These don't return void 'CmdSetPerformanceMarkerINTEL', 'CmdSetPerformanceStreamMarkerINTEL',