| /* |
| * Copyright 2020 Google LLC |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #include "vkr_image.h" |
| |
| #include "vkr_image_gen.h" |
| #include "vkr_physical_device.h" |
| |
| static void |
| vkr_dispatch_vkCreateImage(struct vn_dispatch_context *dispatch, |
| struct vn_command_vkCreateImage *args) |
| { |
| /* XXX If VkExternalMemoryImageCreateInfo is chained by the app, all is |
| * good. If it is not chained, we might still bind an external memory to |
| * the image, because vkr_dispatch_vkAllocateMemory makes any HOST_VISIBLE |
| * memory external. That is a spec violation. |
| * |
| * The discussions in vkr_dispatch_vkCreateBuffer are applicable to both |
| * buffers and images. Additionally, drivers usually use |
| * VkExternalMemoryImageCreateInfo to pick a well-defined image layout for |
| * interoperability with foreign queues. However, a well-defined layout |
| * might not exist for some images. When it does, it might still require a |
| * dedicated allocation or might have a degraded performance. |
| * |
| * On the other hand, binding an external memory to an image created |
| * without VkExternalMemoryImageCreateInfo usually works. Yes, it will |
| * explode if the external memory is accessed by foreign queues due to the |
| * lack of a well-defined image layout. But we never end up in that |
| * situation because the app does not consider the memory external. |
| */ |
| |
| vkr_image_create_and_add(dispatch->data, args); |
| } |
| |
| static void |
| vkr_dispatch_vkDestroyImage(struct vn_dispatch_context *dispatch, |
| struct vn_command_vkDestroyImage *args) |
| { |
| vkr_image_destroy_and_remove(dispatch->data, args); |
| } |
| |
| static void |
| vkr_dispatch_vkGetImageMemoryRequirements( |
| UNUSED struct vn_dispatch_context *dispatch, |
| struct vn_command_vkGetImageMemoryRequirements *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkGetImageMemoryRequirements_args_handle(args); |
| vk->GetImageMemoryRequirements(args->device, args->image, args->pMemoryRequirements); |
| } |
| |
| static void |
| vkr_dispatch_vkGetImageMemoryRequirements2( |
| UNUSED struct vn_dispatch_context *dispatch, |
| struct vn_command_vkGetImageMemoryRequirements2 *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkGetImageMemoryRequirements2_args_handle(args); |
| vk->GetImageMemoryRequirements2(args->device, args->pInfo, args->pMemoryRequirements); |
| } |
| |
| static void |
| vkr_dispatch_vkGetImageSparseMemoryRequirements( |
| UNUSED struct vn_dispatch_context *dispatch, |
| struct vn_command_vkGetImageSparseMemoryRequirements *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkGetImageSparseMemoryRequirements_args_handle(args); |
| vk->GetImageSparseMemoryRequirements(args->device, args->image, |
| args->pSparseMemoryRequirementCount, |
| args->pSparseMemoryRequirements); |
| } |
| |
| static void |
| vkr_dispatch_vkGetImageSparseMemoryRequirements2( |
| UNUSED struct vn_dispatch_context *dispatch, |
| struct vn_command_vkGetImageSparseMemoryRequirements2 *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkGetImageSparseMemoryRequirements2_args_handle(args); |
| vk->GetImageSparseMemoryRequirements2(args->device, args->pInfo, |
| args->pSparseMemoryRequirementCount, |
| args->pSparseMemoryRequirements); |
| } |
| |
| static void |
| vkr_dispatch_vkBindImageMemory(UNUSED struct vn_dispatch_context *dispatch, |
| struct vn_command_vkBindImageMemory *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkBindImageMemory_args_handle(args); |
| args->ret = |
| vk->BindImageMemory(args->device, args->image, args->memory, args->memoryOffset); |
| } |
| |
| static void |
| vkr_dispatch_vkBindImageMemory2(UNUSED struct vn_dispatch_context *dispatch, |
| struct vn_command_vkBindImageMemory2 *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkBindImageMemory2_args_handle(args); |
| args->ret = vk->BindImageMemory2(args->device, args->bindInfoCount, args->pBindInfos); |
| } |
| |
| static void |
| vkr_dispatch_vkGetImageSubresourceLayout( |
| UNUSED struct vn_dispatch_context *dispatch, |
| struct vn_command_vkGetImageSubresourceLayout *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkGetImageSubresourceLayout_args_handle(args); |
| vk->GetImageSubresourceLayout(args->device, args->image, args->pSubresource, |
| args->pLayout); |
| } |
| |
| static void |
| vkr_dispatch_vkGetImageDrmFormatModifierPropertiesEXT( |
| UNUSED struct vn_dispatch_context *dispatch, |
| struct vn_command_vkGetImageDrmFormatModifierPropertiesEXT *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkGetImageDrmFormatModifierPropertiesEXT_args_handle(args); |
| args->ret = vk->GetImageDrmFormatModifierPropertiesEXT(args->device, args->image, |
| args->pProperties); |
| } |
| |
| static void |
| vkr_dispatch_vkCreateImageView(struct vn_dispatch_context *dispatch, |
| struct vn_command_vkCreateImageView *args) |
| { |
| vkr_image_view_create_and_add(dispatch->data, args); |
| } |
| |
| static void |
| vkr_dispatch_vkDestroyImageView(struct vn_dispatch_context *dispatch, |
| struct vn_command_vkDestroyImageView *args) |
| { |
| vkr_image_view_destroy_and_remove(dispatch->data, args); |
| } |
| |
| static void |
| vkr_dispatch_vkCreateSampler(struct vn_dispatch_context *dispatch, |
| struct vn_command_vkCreateSampler *args) |
| { |
| vkr_sampler_create_and_add(dispatch->data, args); |
| } |
| |
| static void |
| vkr_dispatch_vkDestroySampler(struct vn_dispatch_context *dispatch, |
| struct vn_command_vkDestroySampler *args) |
| { |
| vkr_sampler_destroy_and_remove(dispatch->data, args); |
| } |
| |
| static void |
| vkr_dispatch_vkCreateSamplerYcbcrConversion( |
| struct vn_dispatch_context *dispatch, |
| struct vn_command_vkCreateSamplerYcbcrConversion *args) |
| { |
| vkr_sampler_ycbcr_conversion_create_and_add(dispatch->data, args); |
| } |
| |
| static void |
| vkr_dispatch_vkDestroySamplerYcbcrConversion( |
| struct vn_dispatch_context *dispatch, |
| struct vn_command_vkDestroySamplerYcbcrConversion *args) |
| { |
| vkr_sampler_ycbcr_conversion_destroy_and_remove(dispatch->data, args); |
| } |
| |
| static void |
| vkr_dispatch_vkGetDeviceImageMemoryRequirements( |
| UNUSED struct vn_dispatch_context *ctx, |
| struct vn_command_vkGetDeviceImageMemoryRequirements *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkGetDeviceImageMemoryRequirements_args_handle(args); |
| vk->GetDeviceImageMemoryRequirements(args->device, args->pInfo, |
| args->pMemoryRequirements); |
| } |
| |
| static void |
| vkr_dispatch_vkGetDeviceImageSparseMemoryRequirements( |
| UNUSED struct vn_dispatch_context *ctx, |
| struct vn_command_vkGetDeviceImageSparseMemoryRequirements *args) |
| { |
| struct vkr_device *dev = vkr_device_from_handle(args->device); |
| struct vn_device_proc_table *vk = &dev->proc_table; |
| |
| vn_replace_vkGetDeviceImageSparseMemoryRequirements_args_handle(args); |
| vk->GetDeviceImageSparseMemoryRequirements(args->device, args->pInfo, |
| args->pSparseMemoryRequirementCount, |
| args->pSparseMemoryRequirements); |
| } |
| |
| void |
| vkr_context_init_image_dispatch(struct vkr_context *ctx) |
| { |
| struct vn_dispatch_context *dispatch = &ctx->dispatch; |
| |
| dispatch->dispatch_vkCreateImage = vkr_dispatch_vkCreateImage; |
| dispatch->dispatch_vkDestroyImage = vkr_dispatch_vkDestroyImage; |
| dispatch->dispatch_vkGetImageMemoryRequirements = |
| vkr_dispatch_vkGetImageMemoryRequirements; |
| dispatch->dispatch_vkGetImageMemoryRequirements2 = |
| vkr_dispatch_vkGetImageMemoryRequirements2; |
| dispatch->dispatch_vkGetImageSparseMemoryRequirements = |
| vkr_dispatch_vkGetImageSparseMemoryRequirements; |
| dispatch->dispatch_vkGetImageSparseMemoryRequirements2 = |
| vkr_dispatch_vkGetImageSparseMemoryRequirements2; |
| dispatch->dispatch_vkBindImageMemory = vkr_dispatch_vkBindImageMemory; |
| dispatch->dispatch_vkBindImageMemory2 = vkr_dispatch_vkBindImageMemory2; |
| dispatch->dispatch_vkGetImageSubresourceLayout = |
| vkr_dispatch_vkGetImageSubresourceLayout; |
| |
| dispatch->dispatch_vkGetImageDrmFormatModifierPropertiesEXT = |
| vkr_dispatch_vkGetImageDrmFormatModifierPropertiesEXT; |
| dispatch->dispatch_vkGetDeviceImageMemoryRequirements = |
| vkr_dispatch_vkGetDeviceImageMemoryRequirements; |
| dispatch->dispatch_vkGetDeviceImageSparseMemoryRequirements = |
| vkr_dispatch_vkGetDeviceImageSparseMemoryRequirements; |
| } |
| |
| void |
| vkr_context_init_image_view_dispatch(struct vkr_context *ctx) |
| { |
| struct vn_dispatch_context *dispatch = &ctx->dispatch; |
| |
| dispatch->dispatch_vkCreateImageView = vkr_dispatch_vkCreateImageView; |
| dispatch->dispatch_vkDestroyImageView = vkr_dispatch_vkDestroyImageView; |
| } |
| |
| void |
| vkr_context_init_sampler_dispatch(struct vkr_context *ctx) |
| { |
| struct vn_dispatch_context *dispatch = &ctx->dispatch; |
| |
| dispatch->dispatch_vkCreateSampler = vkr_dispatch_vkCreateSampler; |
| dispatch->dispatch_vkDestroySampler = vkr_dispatch_vkDestroySampler; |
| } |
| |
| void |
| vkr_context_init_sampler_ycbcr_conversion_dispatch(struct vkr_context *ctx) |
| { |
| struct vn_dispatch_context *dispatch = &ctx->dispatch; |
| |
| dispatch->dispatch_vkCreateSamplerYcbcrConversion = |
| vkr_dispatch_vkCreateSamplerYcbcrConversion; |
| dispatch->dispatch_vkDestroySamplerYcbcrConversion = |
| vkr_dispatch_vkDestroySamplerYcbcrConversion; |
| } |