xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_buffer.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1 /*
2  * Copyright 2020 Google LLC
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include "vkr_buffer.h"
7 
8 #include "vkr_buffer_gen.h"
9 #include "vkr_physical_device.h"
10 
11 static void
vkr_dispatch_vkCreateBuffer(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateBuffer * args)12 vkr_dispatch_vkCreateBuffer(struct vn_dispatch_context *dispatch,
13                             struct vn_command_vkCreateBuffer *args)
14 {
15    /* XXX If VkExternalMemoryBufferCreateInfo is chained by the app, all is
16     * good.  If it is not chained, we might still bind an external memory to
17     * the buffer, because vkr_dispatch_vkAllocateMemory makes any HOST_VISIBLE
18     * memory external.  That is a spec violation.
19     *
20     * We could unconditionally chain VkExternalMemoryBufferCreateInfo.  Or we
21     * could call vkGetPhysicalDeviceExternalBufferProperties and fail
22     * vkCreateBuffer if the buffer does not support external memory.  But we
23     * would still end up with spec violation either way, while having a higher
24     * chance of causing compatibility issues.
25     *
26     * In practice, drivers usually ignore VkExternalMemoryBufferCreateInfo, or
27     * use it to filter out memory types in VkMemoryRequirements that do not
28     * support external memory.  Binding an external memory to a buffer created
29     * without VkExternalMemoryBufferCreateInfo usually works.
30     *
31     * To formalize this, we are potentially looking for an extension that
32     * supports exporting memories without making them external.  Because they
33     * are not external, they can be bound to buffers created without
34     * VkExternalMemoryBufferCreateInfo.  And because they are not external, we
35     * need something that is not vkGetPhysicalDeviceExternalBufferProperties
36     * to determine the exportability.  See
37     * vkr_physical_device_init_memory_properties as well.
38     */
39 
40    vkr_buffer_create_and_add(dispatch->data, args);
41 }
42 
43 static void
vkr_dispatch_vkDestroyBuffer(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyBuffer * args)44 vkr_dispatch_vkDestroyBuffer(struct vn_dispatch_context *dispatch,
45                              struct vn_command_vkDestroyBuffer *args)
46 {
47    vkr_buffer_destroy_and_remove(dispatch->data, args);
48 }
49 
50 static void
vkr_dispatch_vkGetBufferMemoryRequirements(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferMemoryRequirements * args)51 vkr_dispatch_vkGetBufferMemoryRequirements(
52    UNUSED struct vn_dispatch_context *dispatch,
53    struct vn_command_vkGetBufferMemoryRequirements *args)
54 {
55    struct vkr_device *dev = vkr_device_from_handle(args->device);
56    struct vn_device_proc_table *vk = &dev->proc_table;
57 
58    vn_replace_vkGetBufferMemoryRequirements_args_handle(args);
59    vk->GetBufferMemoryRequirements(args->device, args->buffer, args->pMemoryRequirements);
60 }
61 
62 static void
vkr_dispatch_vkGetBufferMemoryRequirements2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferMemoryRequirements2 * args)63 vkr_dispatch_vkGetBufferMemoryRequirements2(
64    UNUSED struct vn_dispatch_context *dispatch,
65    struct vn_command_vkGetBufferMemoryRequirements2 *args)
66 {
67    struct vkr_device *dev = vkr_device_from_handle(args->device);
68    struct vn_device_proc_table *vk = &dev->proc_table;
69 
70    vn_replace_vkGetBufferMemoryRequirements2_args_handle(args);
71    vk->GetBufferMemoryRequirements2(args->device, args->pInfo, args->pMemoryRequirements);
72 }
73 
74 static void
vkr_dispatch_vkBindBufferMemory(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindBufferMemory * args)75 vkr_dispatch_vkBindBufferMemory(UNUSED struct vn_dispatch_context *dispatch,
76                                 struct vn_command_vkBindBufferMemory *args)
77 {
78    struct vkr_device *dev = vkr_device_from_handle(args->device);
79    struct vn_device_proc_table *vk = &dev->proc_table;
80 
81    vn_replace_vkBindBufferMemory_args_handle(args);
82    args->ret =
83       vk->BindBufferMemory(args->device, args->buffer, args->memory, args->memoryOffset);
84 }
85 
86 static void
vkr_dispatch_vkBindBufferMemory2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindBufferMemory2 * args)87 vkr_dispatch_vkBindBufferMemory2(UNUSED struct vn_dispatch_context *dispatch,
88                                  struct vn_command_vkBindBufferMemory2 *args)
89 {
90    struct vkr_device *dev = vkr_device_from_handle(args->device);
91    struct vn_device_proc_table *vk = &dev->proc_table;
92 
93    vn_replace_vkBindBufferMemory2_args_handle(args);
94    args->ret = vk->BindBufferMemory2(args->device, args->bindInfoCount, args->pBindInfos);
95 }
96 
97 static void
vkr_dispatch_vkGetBufferOpaqueCaptureAddress(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferOpaqueCaptureAddress * args)98 vkr_dispatch_vkGetBufferOpaqueCaptureAddress(
99    UNUSED struct vn_dispatch_context *dispatch,
100    struct vn_command_vkGetBufferOpaqueCaptureAddress *args)
101 {
102    struct vkr_device *dev = vkr_device_from_handle(args->device);
103    struct vn_device_proc_table *vk = &dev->proc_table;
104 
105    vn_replace_vkGetBufferOpaqueCaptureAddress_args_handle(args);
106    args->ret = vk->GetBufferOpaqueCaptureAddress(args->device, args->pInfo);
107 }
108 
109 static void
vkr_dispatch_vkGetBufferDeviceAddress(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetBufferDeviceAddress * args)110 vkr_dispatch_vkGetBufferDeviceAddress(UNUSED struct vn_dispatch_context *dispatch,
111                                       struct vn_command_vkGetBufferDeviceAddress *args)
112 {
113    struct vkr_device *dev = vkr_device_from_handle(args->device);
114    struct vn_device_proc_table *vk = &dev->proc_table;
115 
116    vn_replace_vkGetBufferDeviceAddress_args_handle(args);
117    args->ret = vk->GetBufferDeviceAddress(args->device, args->pInfo);
118 }
119 
120 static void
vkr_dispatch_vkCreateBufferView(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateBufferView * args)121 vkr_dispatch_vkCreateBufferView(struct vn_dispatch_context *dispatch,
122                                 struct vn_command_vkCreateBufferView *args)
123 {
124    vkr_buffer_view_create_and_add(dispatch->data, args);
125 }
126 
127 static void
vkr_dispatch_vkDestroyBufferView(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyBufferView * args)128 vkr_dispatch_vkDestroyBufferView(struct vn_dispatch_context *dispatch,
129                                  struct vn_command_vkDestroyBufferView *args)
130 {
131    vkr_buffer_view_destroy_and_remove(dispatch->data, args);
132 }
133 
134 static void
vkr_dispatch_vkGetDeviceBufferMemoryRequirements(UNUSED struct vn_dispatch_context * ctx,struct vn_command_vkGetDeviceBufferMemoryRequirements * args)135 vkr_dispatch_vkGetDeviceBufferMemoryRequirements(
136    UNUSED struct vn_dispatch_context *ctx,
137    struct vn_command_vkGetDeviceBufferMemoryRequirements *args)
138 {
139    struct vkr_device *dev = vkr_device_from_handle(args->device);
140    struct vn_device_proc_table *vk = &dev->proc_table;
141 
142    vn_replace_vkGetDeviceBufferMemoryRequirements_args_handle(args);
143    vk->GetDeviceBufferMemoryRequirements(args->device, args->pInfo,
144                                          args->pMemoryRequirements);
145 }
146 
147 void
vkr_context_init_buffer_dispatch(struct vkr_context * ctx)148 vkr_context_init_buffer_dispatch(struct vkr_context *ctx)
149 {
150    struct vn_dispatch_context *dispatch = &ctx->dispatch;
151 
152    dispatch->dispatch_vkCreateBuffer = vkr_dispatch_vkCreateBuffer;
153    dispatch->dispatch_vkDestroyBuffer = vkr_dispatch_vkDestroyBuffer;
154    dispatch->dispatch_vkGetBufferMemoryRequirements =
155       vkr_dispatch_vkGetBufferMemoryRequirements;
156    dispatch->dispatch_vkGetBufferMemoryRequirements2 =
157       vkr_dispatch_vkGetBufferMemoryRequirements2;
158    dispatch->dispatch_vkBindBufferMemory = vkr_dispatch_vkBindBufferMemory;
159    dispatch->dispatch_vkBindBufferMemory2 = vkr_dispatch_vkBindBufferMemory2;
160    dispatch->dispatch_vkGetBufferOpaqueCaptureAddress =
161       vkr_dispatch_vkGetBufferOpaqueCaptureAddress;
162    dispatch->dispatch_vkGetBufferDeviceAddress = vkr_dispatch_vkGetBufferDeviceAddress;
163    dispatch->dispatch_vkGetDeviceBufferMemoryRequirements =
164       vkr_dispatch_vkGetDeviceBufferMemoryRequirements;
165 }
166 
167 void
vkr_context_init_buffer_view_dispatch(struct vkr_context * ctx)168 vkr_context_init_buffer_view_dispatch(struct vkr_context *ctx)
169 {
170    struct vn_dispatch_context *dispatch = &ctx->dispatch;
171 
172    dispatch->dispatch_vkCreateBufferView = vkr_dispatch_vkCreateBufferView;
173    dispatch->dispatch_vkDestroyBufferView = vkr_dispatch_vkDestroyBufferView;
174 }
175