aboutsummaryrefslogtreecommitdiff
path: root/src/venus/vkr_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/venus/vkr_buffer.c')
-rw-r--r--src/venus/vkr_buffer.c90
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