/* * 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; }