diff options
Diffstat (limited to 'src/venus/vkr_buffer.c')
-rw-r--r-- | src/venus/vkr_buffer.c | 90 |
1 files changed, 61 insertions, 29 deletions
diff --git a/src/venus/vkr_buffer.c b/src/venus/vkr_buffer.c index f28c6566..9e466f83 100644 --- a/src/venus/vkr_buffer.c +++ b/src/venus/vkr_buffer.c @@ -12,29 +12,32 @@ static void vkr_dispatch_vkCreateBuffer(struct vn_dispatch_context *dispatch, struct vn_command_vkCreateBuffer *args) { - struct vkr_context *ctx = dispatch->data; - - struct vkr_device *dev = vkr_device_from_handle(args->device); - -#ifdef FORCE_ENABLE_DMABUF - VkExternalMemoryBufferCreateInfo local_external_info; - if (dev->physical_device->EXT_external_memory_dma_buf) { - VkExternalMemoryBufferCreateInfo *external_info = vkr_find_pnext( - args->pCreateInfo->pNext, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO); - if (external_info) { - external_info->handleTypes |= VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT; - } else { - local_external_info = (const VkExternalMemoryBufferCreateInfo){ - .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO, - .pNext = args->pCreateInfo->pNext, - .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT, - }; - ((VkBufferCreateInfo *)args->pCreateInfo)->pNext = &local_external_info; - } - } -#endif - - vkr_buffer_create_and_add(ctx, args); + /* XXX If VkExternalMemoryBufferCreateInfo is chained by the app, all is + * good. If it is not chained, we might still bind an external memory to + * the buffer, because vkr_dispatch_vkAllocateMemory makes any HOST_VISIBLE + * memory external. That is a spec violation. + * + * We could unconditionally chain VkExternalMemoryBufferCreateInfo. Or we + * could call vkGetPhysicalDeviceExternalBufferProperties and fail + * vkCreateBuffer if the buffer does not support external memory. But we + * would still end up with spec violation either way, while having a higher + * chance of causing compatibility issues. + * + * In practice, drivers usually ignore VkExternalMemoryBufferCreateInfo, or + * use it to filter out memory types in VkMemoryRequirements that do not + * support external memory. Binding an external memory to a buffer created + * without VkExternalMemoryBufferCreateInfo usually works. + * + * To formalize this, we are potentially looking for an extension that + * supports exporting memories without making them external. Because they + * are not external, they can be bound to buffers created without + * VkExternalMemoryBufferCreateInfo. And because they are not external, we + * need something that is not vkGetPhysicalDeviceExternalBufferProperties + * to determine the exportability. See + * vkr_physical_device_init_memory_properties as well. + */ + + vkr_buffer_create_and_add(dispatch->data, args); } static void @@ -49,8 +52,11 @@ vkr_dispatch_vkGetBufferMemoryRequirements( UNUSED struct vn_dispatch_context *dispatch, struct vn_command_vkGetBufferMemoryRequirements *args) { + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + vn_replace_vkGetBufferMemoryRequirements_args_handle(args); - vkGetBufferMemoryRequirements(args->device, args->buffer, args->pMemoryRequirements); + vk->GetBufferMemoryRequirements(args->device, args->buffer, args->pMemoryRequirements); } static void @@ -58,25 +64,34 @@ vkr_dispatch_vkGetBufferMemoryRequirements2( UNUSED struct vn_dispatch_context *dispatch, struct vn_command_vkGetBufferMemoryRequirements2 *args) { + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + vn_replace_vkGetBufferMemoryRequirements2_args_handle(args); - vkGetBufferMemoryRequirements2(args->device, args->pInfo, args->pMemoryRequirements); + vk->GetBufferMemoryRequirements2(args->device, args->pInfo, args->pMemoryRequirements); } static void vkr_dispatch_vkBindBufferMemory(UNUSED struct vn_dispatch_context *dispatch, struct vn_command_vkBindBufferMemory *args) { + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + vn_replace_vkBindBufferMemory_args_handle(args); args->ret = - vkBindBufferMemory(args->device, args->buffer, args->memory, args->memoryOffset); + vk->BindBufferMemory(args->device, args->buffer, args->memory, args->memoryOffset); } static void vkr_dispatch_vkBindBufferMemory2(UNUSED struct vn_dispatch_context *dispatch, struct vn_command_vkBindBufferMemory2 *args) { + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + vn_replace_vkBindBufferMemory2_args_handle(args); - args->ret = vkBindBufferMemory2(args->device, args->bindInfoCount, args->pBindInfos); + args->ret = vk->BindBufferMemory2(args->device, args->bindInfoCount, args->pBindInfos); } static void @@ -85,9 +100,10 @@ vkr_dispatch_vkGetBufferOpaqueCaptureAddress( struct vn_command_vkGetBufferOpaqueCaptureAddress *args) { struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; vn_replace_vkGetBufferOpaqueCaptureAddress_args_handle(args); - args->ret = dev->GetBufferOpaqueCaptureAddress(args->device, args->pInfo); + args->ret = vk->GetBufferOpaqueCaptureAddress(args->device, args->pInfo); } static void @@ -95,9 +111,10 @@ vkr_dispatch_vkGetBufferDeviceAddress(UNUSED struct vn_dispatch_context *dispatc struct vn_command_vkGetBufferDeviceAddress *args) { struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; vn_replace_vkGetBufferDeviceAddress_args_handle(args); - args->ret = dev->GetBufferDeviceAddress(args->device, args->pInfo); + args->ret = vk->GetBufferDeviceAddress(args->device, args->pInfo); } static void @@ -114,6 +131,19 @@ vkr_dispatch_vkDestroyBufferView(struct vn_dispatch_context *dispatch, vkr_buffer_view_destroy_and_remove(dispatch->data, args); } +static void +vkr_dispatch_vkGetDeviceBufferMemoryRequirements( + UNUSED struct vn_dispatch_context *ctx, + struct vn_command_vkGetDeviceBufferMemoryRequirements *args) +{ + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + + vn_replace_vkGetDeviceBufferMemoryRequirements_args_handle(args); + vk->GetDeviceBufferMemoryRequirements(args->device, args->pInfo, + args->pMemoryRequirements); +} + void vkr_context_init_buffer_dispatch(struct vkr_context *ctx) { @@ -130,6 +160,8 @@ vkr_context_init_buffer_dispatch(struct vkr_context *ctx) dispatch->dispatch_vkGetBufferOpaqueCaptureAddress = vkr_dispatch_vkGetBufferOpaqueCaptureAddress; dispatch->dispatch_vkGetBufferDeviceAddress = vkr_dispatch_vkGetBufferDeviceAddress; + dispatch->dispatch_vkGetDeviceBufferMemoryRequirements = + vkr_dispatch_vkGetDeviceBufferMemoryRequirements; } void |