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