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 struct vkr_context *ctx = dispatch->data;
16
17 struct vkr_device *dev = vkr_device_from_handle(args->device);
18
19 #ifdef FORCE_ENABLE_DMABUF
20 /* Do not chain VkExternalMemoryImageCreateInfo with optimal tiling, so that
21 * guest Venus can pass memory requirement cts with dedicated allocation.
22 */
23 VkExternalMemoryImageCreateInfo local_external_info;
24 if (args->pCreateInfo->tiling != VK_IMAGE_TILING_OPTIMAL &&
25 dev->physical_device->EXT_external_memory_dma_buf) {
26 VkExternalMemoryImageCreateInfo *external_info = vkr_find_pnext(
27 args->pCreateInfo->pNext, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO);
28 if (external_info) {
29 external_info->handleTypes |= VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
30 } else {
31 local_external_info = (const VkExternalMemoryImageCreateInfo){
32 .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
33 .pNext = args->pCreateInfo->pNext,
34 .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
35 };
36 ((VkImageCreateInfo *)args->pCreateInfo)->pNext = &local_external_info;
37 }
38 }
39 #endif
40
41 vkr_image_create_and_add(ctx, args);
42 }
43
44 static void
vkr_dispatch_vkDestroyImage(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyImage * args)45 vkr_dispatch_vkDestroyImage(struct vn_dispatch_context *dispatch,
46 struct vn_command_vkDestroyImage *args)
47 {
48 vkr_image_destroy_and_remove(dispatch->data, args);
49 }
50
51 static void
vkr_dispatch_vkGetImageMemoryRequirements(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageMemoryRequirements * args)52 vkr_dispatch_vkGetImageMemoryRequirements(
53 UNUSED struct vn_dispatch_context *dispatch,
54 struct vn_command_vkGetImageMemoryRequirements *args)
55 {
56 vn_replace_vkGetImageMemoryRequirements_args_handle(args);
57 vkGetImageMemoryRequirements(args->device, args->image, args->pMemoryRequirements);
58 }
59
60 static void
vkr_dispatch_vkGetImageMemoryRequirements2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageMemoryRequirements2 * args)61 vkr_dispatch_vkGetImageMemoryRequirements2(
62 UNUSED struct vn_dispatch_context *dispatch,
63 struct vn_command_vkGetImageMemoryRequirements2 *args)
64 {
65 vn_replace_vkGetImageMemoryRequirements2_args_handle(args);
66 vkGetImageMemoryRequirements2(args->device, args->pInfo, args->pMemoryRequirements);
67 }
68
69 static void
vkr_dispatch_vkGetImageSparseMemoryRequirements(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageSparseMemoryRequirements * args)70 vkr_dispatch_vkGetImageSparseMemoryRequirements(
71 UNUSED struct vn_dispatch_context *dispatch,
72 struct vn_command_vkGetImageSparseMemoryRequirements *args)
73 {
74 vn_replace_vkGetImageSparseMemoryRequirements_args_handle(args);
75 vkGetImageSparseMemoryRequirements(args->device, args->image,
76 args->pSparseMemoryRequirementCount,
77 args->pSparseMemoryRequirements);
78 }
79
80 static void
vkr_dispatch_vkGetImageSparseMemoryRequirements2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageSparseMemoryRequirements2 * args)81 vkr_dispatch_vkGetImageSparseMemoryRequirements2(
82 UNUSED struct vn_dispatch_context *dispatch,
83 struct vn_command_vkGetImageSparseMemoryRequirements2 *args)
84 {
85 vn_replace_vkGetImageSparseMemoryRequirements2_args_handle(args);
86 vkGetImageSparseMemoryRequirements2(args->device, args->pInfo,
87 args->pSparseMemoryRequirementCount,
88 args->pSparseMemoryRequirements);
89 }
90
91 static void
vkr_dispatch_vkBindImageMemory(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindImageMemory * args)92 vkr_dispatch_vkBindImageMemory(UNUSED struct vn_dispatch_context *dispatch,
93 struct vn_command_vkBindImageMemory *args)
94 {
95 vn_replace_vkBindImageMemory_args_handle(args);
96 args->ret =
97 vkBindImageMemory(args->device, args->image, args->memory, args->memoryOffset);
98 }
99
100 static void
vkr_dispatch_vkBindImageMemory2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkBindImageMemory2 * args)101 vkr_dispatch_vkBindImageMemory2(UNUSED struct vn_dispatch_context *dispatch,
102 struct vn_command_vkBindImageMemory2 *args)
103 {
104 vn_replace_vkBindImageMemory2_args_handle(args);
105 args->ret = vkBindImageMemory2(args->device, args->bindInfoCount, args->pBindInfos);
106 }
107
108 static void
vkr_dispatch_vkGetImageSubresourceLayout(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageSubresourceLayout * args)109 vkr_dispatch_vkGetImageSubresourceLayout(
110 UNUSED struct vn_dispatch_context *dispatch,
111 struct vn_command_vkGetImageSubresourceLayout *args)
112 {
113 vn_replace_vkGetImageSubresourceLayout_args_handle(args);
114 vkGetImageSubresourceLayout(args->device, args->image, args->pSubresource,
115 args->pLayout);
116 }
117
118 static void
vkr_dispatch_vkGetImageDrmFormatModifierPropertiesEXT(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetImageDrmFormatModifierPropertiesEXT * args)119 vkr_dispatch_vkGetImageDrmFormatModifierPropertiesEXT(
120 UNUSED struct vn_dispatch_context *dispatch,
121 struct vn_command_vkGetImageDrmFormatModifierPropertiesEXT *args)
122 {
123 struct vkr_device *dev = vkr_device_from_handle(args->device);
124
125 vn_replace_vkGetImageDrmFormatModifierPropertiesEXT_args_handle(args);
126 args->ret = dev->get_image_drm_format_modifier_properties(args->device, args->image,
127 args->pProperties);
128 }
129
130 static void
vkr_dispatch_vkCreateImageView(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateImageView * args)131 vkr_dispatch_vkCreateImageView(struct vn_dispatch_context *dispatch,
132 struct vn_command_vkCreateImageView *args)
133 {
134 vkr_image_view_create_and_add(dispatch->data, args);
135 }
136
137 static void
vkr_dispatch_vkDestroyImageView(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyImageView * args)138 vkr_dispatch_vkDestroyImageView(struct vn_dispatch_context *dispatch,
139 struct vn_command_vkDestroyImageView *args)
140 {
141 vkr_image_view_destroy_and_remove(dispatch->data, args);
142 }
143
144 static void
vkr_dispatch_vkCreateSampler(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateSampler * args)145 vkr_dispatch_vkCreateSampler(struct vn_dispatch_context *dispatch,
146 struct vn_command_vkCreateSampler *args)
147 {
148 vkr_sampler_create_and_add(dispatch->data, args);
149 }
150
151 static void
vkr_dispatch_vkDestroySampler(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroySampler * args)152 vkr_dispatch_vkDestroySampler(struct vn_dispatch_context *dispatch,
153 struct vn_command_vkDestroySampler *args)
154 {
155 vkr_sampler_destroy_and_remove(dispatch->data, args);
156 }
157
158 static void
vkr_dispatch_vkCreateSamplerYcbcrConversion(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateSamplerYcbcrConversion * args)159 vkr_dispatch_vkCreateSamplerYcbcrConversion(
160 struct vn_dispatch_context *dispatch,
161 struct vn_command_vkCreateSamplerYcbcrConversion *args)
162 {
163 vkr_sampler_ycbcr_conversion_create_and_add(dispatch->data, args);
164 }
165
166 static void
vkr_dispatch_vkDestroySamplerYcbcrConversion(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroySamplerYcbcrConversion * args)167 vkr_dispatch_vkDestroySamplerYcbcrConversion(
168 struct vn_dispatch_context *dispatch,
169 struct vn_command_vkDestroySamplerYcbcrConversion *args)
170 {
171 vkr_sampler_ycbcr_conversion_destroy_and_remove(dispatch->data, args);
172 }
173
174 void
vkr_context_init_image_dispatch(struct vkr_context * ctx)175 vkr_context_init_image_dispatch(struct vkr_context *ctx)
176 {
177 struct vn_dispatch_context *dispatch = &ctx->dispatch;
178
179 dispatch->dispatch_vkCreateImage = vkr_dispatch_vkCreateImage;
180 dispatch->dispatch_vkDestroyImage = vkr_dispatch_vkDestroyImage;
181 dispatch->dispatch_vkGetImageMemoryRequirements =
182 vkr_dispatch_vkGetImageMemoryRequirements;
183 dispatch->dispatch_vkGetImageMemoryRequirements2 =
184 vkr_dispatch_vkGetImageMemoryRequirements2;
185 dispatch->dispatch_vkGetImageSparseMemoryRequirements =
186 vkr_dispatch_vkGetImageSparseMemoryRequirements;
187 dispatch->dispatch_vkGetImageSparseMemoryRequirements2 =
188 vkr_dispatch_vkGetImageSparseMemoryRequirements2;
189 dispatch->dispatch_vkBindImageMemory = vkr_dispatch_vkBindImageMemory;
190 dispatch->dispatch_vkBindImageMemory2 = vkr_dispatch_vkBindImageMemory2;
191 dispatch->dispatch_vkGetImageSubresourceLayout =
192 vkr_dispatch_vkGetImageSubresourceLayout;
193
194 dispatch->dispatch_vkGetImageDrmFormatModifierPropertiesEXT =
195 vkr_dispatch_vkGetImageDrmFormatModifierPropertiesEXT;
196 }
197
198 void
vkr_context_init_image_view_dispatch(struct vkr_context * ctx)199 vkr_context_init_image_view_dispatch(struct vkr_context *ctx)
200 {
201 struct vn_dispatch_context *dispatch = &ctx->dispatch;
202
203 dispatch->dispatch_vkCreateImageView = vkr_dispatch_vkCreateImageView;
204 dispatch->dispatch_vkDestroyImageView = vkr_dispatch_vkDestroyImageView;
205 }
206
207 void
vkr_context_init_sampler_dispatch(struct vkr_context * ctx)208 vkr_context_init_sampler_dispatch(struct vkr_context *ctx)
209 {
210 struct vn_dispatch_context *dispatch = &ctx->dispatch;
211
212 dispatch->dispatch_vkCreateSampler = vkr_dispatch_vkCreateSampler;
213 dispatch->dispatch_vkDestroySampler = vkr_dispatch_vkDestroySampler;
214 }
215
216 void
vkr_context_init_sampler_ycbcr_conversion_dispatch(struct vkr_context * ctx)217 vkr_context_init_sampler_ycbcr_conversion_dispatch(struct vkr_context *ctx)
218 {
219 struct vn_dispatch_context *dispatch = &ctx->dispatch;
220
221 dispatch->dispatch_vkCreateSamplerYcbcrConversion =
222 vkr_dispatch_vkCreateSamplerYcbcrConversion;
223 dispatch->dispatch_vkDestroySamplerYcbcrConversion =
224 vkr_dispatch_vkDestroySamplerYcbcrConversion;
225 }
226