blob: 080b442500b39548163ffa4698812ffa4d6f18b6 [file] [log] [blame]
/*
* 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;
}