xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_image.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1 /*
2  * Copyright 2020 Google LLC
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include "vkr_image.h"
7 
8 #include "vkr_image_gen.h"
9 #include "vkr_physical_device.h"
10 
11 static void
vkr_dispatch_vkCreateImage(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateImage * args)12 vkr_dispatch_vkCreateImage(struct vn_dispatch_context *dispatch,
13                            struct vn_command_vkCreateImage *args)
14 {
15    /* XXX If VkExternalMemoryImageCreateInfo is chained by the app, all is
16     * good.  If it is not chained, we might still bind an external memory to
17     * the image, because vkr_dispatch_vkAllocateMemory makes any HOST_VISIBLE
18     * memory external.  That is a spec violation.
19     *
20     * The discussions in vkr_dispatch_vkCreateBuffer are applicable to both
21     * buffers and images.  Additionally, drivers usually use
22     * VkExternalMemoryImageCreateInfo to pick a well-defined image layout for
23     * interoperability with foreign queues.  However, a well-defined layout
24     * might not exist for some images.  When it does, it might still require a
25     * dedicated allocation or might have a degraded performance.
26     *
27     * On the other hand, binding an external memory to an image created
28     * without VkExternalMemoryImageCreateInfo usually works.  Yes, it will
29     * explode if the external memory is accessed by foreign queues due to the
30     * lack of a well-defined image layout.  But we never end up in that
31     * situation because the app does not consider the memory external.
32     */
33 
34    vkr_image_create_and_add(dispatch->data, args);
35 }
36 
37 static void
vkr_dispatch_vkDestroyImage(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyImage * args)38 vkr_dispatch_vkDestroyImage(struct vn_dispatch_context *dispatch,
39                             struct vn_command_vkDestroyImage *args)
40 {
41    vkr_image_destroy_and_remove(dispatch->data, args);
42 }
43 
44 static void
vkr_dispatch_vkGetImageMemoryRequirements(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageMemoryRequirements * args)45 vkr_dispatch_vkGetImageMemoryRequirements(
46    UNUSED struct vn_dispatch_context *dispatch,
47    struct vn_command_vkGetImageMemoryRequirements *args)
48 {
49    struct vkr_device *dev = vkr_device_from_handle(args->device);
50    struct vn_device_proc_table *vk = &dev->proc_table;
51 
52    vn_replace_vkGetImageMemoryRequirements_args_handle(args);
53    vk->GetImageMemoryRequirements(args->device, args->image, args->pMemoryRequirements);
54 }
55 
56 static void
vkr_dispatch_vkGetImageMemoryRequirements2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageMemoryRequirements2 * args)57 vkr_dispatch_vkGetImageMemoryRequirements2(
58    UNUSED struct vn_dispatch_context *dispatch,
59    struct vn_command_vkGetImageMemoryRequirements2 *args)
60 {
61    struct vkr_device *dev = vkr_device_from_handle(args->device);
62    struct vn_device_proc_table *vk = &dev->proc_table;
63 
64    vn_replace_vkGetImageMemoryRequirements2_args_handle(args);
65    vk->GetImageMemoryRequirements2(args->device, args->pInfo, args->pMemoryRequirements);
66 }
67 
68 static void
vkr_dispatch_vkGetImageSparseMemoryRequirements(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageSparseMemoryRequirements * args)69 vkr_dispatch_vkGetImageSparseMemoryRequirements(
70    UNUSED struct vn_dispatch_context *dispatch,
71    struct vn_command_vkGetImageSparseMemoryRequirements *args)
72 {
73    struct vkr_device *dev = vkr_device_from_handle(args->device);
74    struct vn_device_proc_table *vk = &dev->proc_table;
75 
76    vn_replace_vkGetImageSparseMemoryRequirements_args_handle(args);
77    vk->GetImageSparseMemoryRequirements(args->device, args->image,
78                                         args->pSparseMemoryRequirementCount,
79                                         args->pSparseMemoryRequirements);
80 }
81 
82 static void
vkr_dispatch_vkGetImageSparseMemoryRequirements2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageSparseMemoryRequirements2 * args)83 vkr_dispatch_vkGetImageSparseMemoryRequirements2(
84    UNUSED struct vn_dispatch_context *dispatch,
85    struct vn_command_vkGetImageSparseMemoryRequirements2 *args)
86 {
87    struct vkr_device *dev = vkr_device_from_handle(args->device);
88    struct vn_device_proc_table *vk = &dev->proc_table;
89 
90    vn_replace_vkGetImageSparseMemoryRequirements2_args_handle(args);
91    vk->GetImageSparseMemoryRequirements2(args->device, args->pInfo,
92                                          args->pSparseMemoryRequirementCount,
93                                          args->pSparseMemoryRequirements);
94 }
95 
96 static void
vkr_dispatch_vkBindImageMemory(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindImageMemory * args)97 vkr_dispatch_vkBindImageMemory(UNUSED struct vn_dispatch_context *dispatch,
98                                struct vn_command_vkBindImageMemory *args)
99 {
100    struct vkr_device *dev = vkr_device_from_handle(args->device);
101    struct vn_device_proc_table *vk = &dev->proc_table;
102 
103    vn_replace_vkBindImageMemory_args_handle(args);
104    args->ret =
105       vk->BindImageMemory(args->device, args->image, args->memory, args->memoryOffset);
106 }
107 
108 static void
vkr_dispatch_vkBindImageMemory2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindImageMemory2 * args)109 vkr_dispatch_vkBindImageMemory2(UNUSED struct vn_dispatch_context *dispatch,
110                                 struct vn_command_vkBindImageMemory2 *args)
111 {
112    struct vkr_device *dev = vkr_device_from_handle(args->device);
113    struct vn_device_proc_table *vk = &dev->proc_table;
114 
115    vn_replace_vkBindImageMemory2_args_handle(args);
116    args->ret = vk->BindImageMemory2(args->device, args->bindInfoCount, args->pBindInfos);
117 }
118 
119 static void
vkr_dispatch_vkGetImageSubresourceLayout(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageSubresourceLayout * args)120 vkr_dispatch_vkGetImageSubresourceLayout(
121    UNUSED struct vn_dispatch_context *dispatch,
122    struct vn_command_vkGetImageSubresourceLayout *args)
123 {
124    struct vkr_device *dev = vkr_device_from_handle(args->device);
125    struct vn_device_proc_table *vk = &dev->proc_table;
126 
127    vn_replace_vkGetImageSubresourceLayout_args_handle(args);
128    vk->GetImageSubresourceLayout(args->device, args->image, args->pSubresource,
129                                  args->pLayout);
130 }
131 
132 static void
vkr_dispatch_vkGetImageDrmFormatModifierPropertiesEXT(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageDrmFormatModifierPropertiesEXT * args)133 vkr_dispatch_vkGetImageDrmFormatModifierPropertiesEXT(
134    UNUSED struct vn_dispatch_context *dispatch,
135    struct vn_command_vkGetImageDrmFormatModifierPropertiesEXT *args)
136 {
137    struct vkr_device *dev = vkr_device_from_handle(args->device);
138    struct vn_device_proc_table *vk = &dev->proc_table;
139 
140    vn_replace_vkGetImageDrmFormatModifierPropertiesEXT_args_handle(args);
141    args->ret = vk->GetImageDrmFormatModifierPropertiesEXT(args->device, args->image,
142                                                           args->pProperties);
143 }
144 
145 static void
vkr_dispatch_vkCreateImageView(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateImageView * args)146 vkr_dispatch_vkCreateImageView(struct vn_dispatch_context *dispatch,
147                                struct vn_command_vkCreateImageView *args)
148 {
149    vkr_image_view_create_and_add(dispatch->data, args);
150 }
151 
152 static void
vkr_dispatch_vkDestroyImageView(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyImageView * args)153 vkr_dispatch_vkDestroyImageView(struct vn_dispatch_context *dispatch,
154                                 struct vn_command_vkDestroyImageView *args)
155 {
156    vkr_image_view_destroy_and_remove(dispatch->data, args);
157 }
158 
159 static void
vkr_dispatch_vkCreateSampler(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateSampler * args)160 vkr_dispatch_vkCreateSampler(struct vn_dispatch_context *dispatch,
161                              struct vn_command_vkCreateSampler *args)
162 {
163    vkr_sampler_create_and_add(dispatch->data, args);
164 }
165 
166 static void
vkr_dispatch_vkDestroySampler(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroySampler * args)167 vkr_dispatch_vkDestroySampler(struct vn_dispatch_context *dispatch,
168                               struct vn_command_vkDestroySampler *args)
169 {
170    vkr_sampler_destroy_and_remove(dispatch->data, args);
171 }
172 
173 static void
vkr_dispatch_vkCreateSamplerYcbcrConversion(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateSamplerYcbcrConversion * args)174 vkr_dispatch_vkCreateSamplerYcbcrConversion(
175    struct vn_dispatch_context *dispatch,
176    struct vn_command_vkCreateSamplerYcbcrConversion *args)
177 {
178    vkr_sampler_ycbcr_conversion_create_and_add(dispatch->data, args);
179 }
180 
181 static void
vkr_dispatch_vkDestroySamplerYcbcrConversion(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroySamplerYcbcrConversion * args)182 vkr_dispatch_vkDestroySamplerYcbcrConversion(
183    struct vn_dispatch_context *dispatch,
184    struct vn_command_vkDestroySamplerYcbcrConversion *args)
185 {
186    vkr_sampler_ycbcr_conversion_destroy_and_remove(dispatch->data, args);
187 }
188 
189 static void
vkr_dispatch_vkGetDeviceImageMemoryRequirements(UNUSED struct vn_dispatch_context * ctx,struct vn_command_vkGetDeviceImageMemoryRequirements * args)190 vkr_dispatch_vkGetDeviceImageMemoryRequirements(
191    UNUSED struct vn_dispatch_context *ctx,
192    struct vn_command_vkGetDeviceImageMemoryRequirements *args)
193 {
194    struct vkr_device *dev = vkr_device_from_handle(args->device);
195    struct vn_device_proc_table *vk = &dev->proc_table;
196 
197    vn_replace_vkGetDeviceImageMemoryRequirements_args_handle(args);
198    vk->GetDeviceImageMemoryRequirements(args->device, args->pInfo,
199                                         args->pMemoryRequirements);
200 }
201 
202 static void
vkr_dispatch_vkGetDeviceImageSparseMemoryRequirements(UNUSED struct vn_dispatch_context * ctx,struct vn_command_vkGetDeviceImageSparseMemoryRequirements * args)203 vkr_dispatch_vkGetDeviceImageSparseMemoryRequirements(
204    UNUSED struct vn_dispatch_context *ctx,
205    struct vn_command_vkGetDeviceImageSparseMemoryRequirements *args)
206 {
207    struct vkr_device *dev = vkr_device_from_handle(args->device);
208    struct vn_device_proc_table *vk = &dev->proc_table;
209 
210    vn_replace_vkGetDeviceImageSparseMemoryRequirements_args_handle(args);
211    vk->GetDeviceImageSparseMemoryRequirements(args->device, args->pInfo,
212                                               args->pSparseMemoryRequirementCount,
213                                               args->pSparseMemoryRequirements);
214 }
215 
216 void
vkr_context_init_image_dispatch(struct vkr_context * ctx)217 vkr_context_init_image_dispatch(struct vkr_context *ctx)
218 {
219    struct vn_dispatch_context *dispatch = &ctx->dispatch;
220 
221    dispatch->dispatch_vkCreateImage = vkr_dispatch_vkCreateImage;
222    dispatch->dispatch_vkDestroyImage = vkr_dispatch_vkDestroyImage;
223    dispatch->dispatch_vkGetImageMemoryRequirements =
224       vkr_dispatch_vkGetImageMemoryRequirements;
225    dispatch->dispatch_vkGetImageMemoryRequirements2 =
226       vkr_dispatch_vkGetImageMemoryRequirements2;
227    dispatch->dispatch_vkGetImageSparseMemoryRequirements =
228       vkr_dispatch_vkGetImageSparseMemoryRequirements;
229    dispatch->dispatch_vkGetImageSparseMemoryRequirements2 =
230       vkr_dispatch_vkGetImageSparseMemoryRequirements2;
231    dispatch->dispatch_vkBindImageMemory = vkr_dispatch_vkBindImageMemory;
232    dispatch->dispatch_vkBindImageMemory2 = vkr_dispatch_vkBindImageMemory2;
233    dispatch->dispatch_vkGetImageSubresourceLayout =
234       vkr_dispatch_vkGetImageSubresourceLayout;
235 
236    dispatch->dispatch_vkGetImageDrmFormatModifierPropertiesEXT =
237       vkr_dispatch_vkGetImageDrmFormatModifierPropertiesEXT;
238    dispatch->dispatch_vkGetDeviceImageMemoryRequirements =
239       vkr_dispatch_vkGetDeviceImageMemoryRequirements;
240    dispatch->dispatch_vkGetDeviceImageSparseMemoryRequirements =
241       vkr_dispatch_vkGetDeviceImageSparseMemoryRequirements;
242 }
243 
244 void
vkr_context_init_image_view_dispatch(struct vkr_context * ctx)245 vkr_context_init_image_view_dispatch(struct vkr_context *ctx)
246 {
247    struct vn_dispatch_context *dispatch = &ctx->dispatch;
248 
249    dispatch->dispatch_vkCreateImageView = vkr_dispatch_vkCreateImageView;
250    dispatch->dispatch_vkDestroyImageView = vkr_dispatch_vkDestroyImageView;
251 }
252 
253 void
vkr_context_init_sampler_dispatch(struct vkr_context * ctx)254 vkr_context_init_sampler_dispatch(struct vkr_context *ctx)
255 {
256    struct vn_dispatch_context *dispatch = &ctx->dispatch;
257 
258    dispatch->dispatch_vkCreateSampler = vkr_dispatch_vkCreateSampler;
259    dispatch->dispatch_vkDestroySampler = vkr_dispatch_vkDestroySampler;
260 }
261 
262 void
vkr_context_init_sampler_ycbcr_conversion_dispatch(struct vkr_context * ctx)263 vkr_context_init_sampler_ycbcr_conversion_dispatch(struct vkr_context *ctx)
264 {
265    struct vn_dispatch_context *dispatch = &ctx->dispatch;
266 
267    dispatch->dispatch_vkCreateSamplerYcbcrConversion =
268       vkr_dispatch_vkCreateSamplerYcbcrConversion;
269    dispatch->dispatch_vkDestroySamplerYcbcrConversion =
270       vkr_dispatch_vkDestroySamplerYcbcrConversion;
271 }
272