• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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