mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
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:
parent
b39efbc422
commit
a4fd4812fa
2 changed files with 134 additions and 3 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue