vulkan: handle enqueueing CmdPushDescriptorSet2KHR

implementation from lavapipe. again, no CTS for this...

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Acked-by: Konstantin Seurer <konstantin.seurer@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28682>
This commit is contained in:
Alyssa Rosenzweig 2024-06-19 13:03:45 -04:00 committed by Marge Bot
parent b39efbc422
commit a4fd4812fa
2 changed files with 134 additions and 3 deletions

View file

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

View file

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