blob: 5ec209f4a96e7de1d5a9cb0b3c16da115d44003c [file] [log] [blame] [edit]
/*
* Copyright 2020 Google LLC
* SPDX-License-Identifier: MIT
*/
#include "vkr_descriptor_set.h"
#include "vkr_descriptor_set_gen.h"
static void
vkr_dispatch_vkGetDescriptorSetLayoutSupport(
UNUSED struct vn_dispatch_context *dispatch,
struct vn_command_vkGetDescriptorSetLayoutSupport *args)
{
struct vkr_device *dev = vkr_device_from_handle(args->device);
struct vn_device_proc_table *vk = &dev->proc_table;
vn_replace_vkGetDescriptorSetLayoutSupport_args_handle(args);
vk->GetDescriptorSetLayoutSupport(args->device, args->pCreateInfo, args->pSupport);
}
static void
vkr_dispatch_vkCreateDescriptorSetLayout(
struct vn_dispatch_context *dispatch,
struct vn_command_vkCreateDescriptorSetLayout *args)
{
vkr_descriptor_set_layout_create_and_add(dispatch->data, args);
}
static void
vkr_dispatch_vkDestroyDescriptorSetLayout(
struct vn_dispatch_context *dispatch,
struct vn_command_vkDestroyDescriptorSetLayout *args)
{
vkr_descriptor_set_layout_destroy_and_remove(dispatch->data, args);
}
static void
vkr_dispatch_vkCreateDescriptorPool(struct vn_dispatch_context *dispatch,
struct vn_command_vkCreateDescriptorPool *args)
{
struct vkr_descriptor_pool *pool =
vkr_descriptor_pool_create_and_add(dispatch->data, args);
if (!pool)
return;
pool->flags = args->pCreateInfo->flags;
list_inithead(&pool->descriptor_sets);
}
static void
vkr_dispatch_vkDestroyDescriptorPool(struct vn_dispatch_context *dispatch,
struct vn_command_vkDestroyDescriptorPool *args)
{
struct vkr_context *ctx = dispatch->data;
struct vkr_descriptor_pool *pool =
vkr_descriptor_pool_from_handle(args->descriptorPool);
if (!pool)
return;
vkr_descriptor_pool_release(ctx, pool);
vkr_descriptor_pool_destroy_and_remove(ctx, args);
}
static void
vkr_dispatch_vkResetDescriptorPool(struct vn_dispatch_context *dispatch,
struct vn_command_vkResetDescriptorPool *args)
{
struct vkr_device *dev = vkr_device_from_handle(args->device);
struct vn_device_proc_table *vk = &dev->proc_table;
struct vkr_context *ctx = dispatch->data;
struct vkr_descriptor_pool *pool =
vkr_descriptor_pool_from_handle(args->descriptorPool);
if (!pool) {
vkr_context_set_fatal(ctx);
return;
}
vn_replace_vkResetDescriptorPool_args_handle(args);
args->ret = vk->ResetDescriptorPool(args->device, args->descriptorPool, args->flags);
vkr_descriptor_pool_release(ctx, pool);
list_inithead(&pool->descriptor_sets);
}
static void
vkr_dispatch_vkAllocateDescriptorSets(struct vn_dispatch_context *dispatch,
struct vn_command_vkAllocateDescriptorSets *args)
{
struct vkr_context *ctx = dispatch->data;
struct vkr_device *dev = vkr_device_from_handle(args->device);
struct vkr_descriptor_pool *pool =
vkr_descriptor_pool_from_handle(args->pAllocateInfo->descriptorPool);
struct object_array arr;
VkResult result;
if (!pool) {
vkr_context_set_fatal(ctx);
return;
}
result = vkr_descriptor_set_create_array(ctx, args, &arr);
if (result != VK_SUCCESS) {
if (!(pool->flags & VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT))
vkr_log("Warning: vkAllocateDescriptorSets failed(%u)", result);
return;
}
vkr_descriptor_set_add_array(ctx, dev, pool, &arr);
}
static void
vkr_dispatch_vkFreeDescriptorSets(struct vn_dispatch_context *dispatch,
struct vn_command_vkFreeDescriptorSets *args)
{
struct vkr_context *ctx = dispatch->data;
struct list_head free_list;
/* args->pDescriptorSets is marked noautovalidity="true" */
if (args->descriptorSetCount && !args->pDescriptorSets) {
vkr_context_set_fatal(ctx);
return;
}
vkr_descriptor_set_destroy_driver_handles(ctx, args, &free_list);
vkr_context_remove_objects(ctx, &free_list);
args->ret = VK_SUCCESS;
}
static void
vkr_dispatch_vkUpdateDescriptorSets(UNUSED struct vn_dispatch_context *dispatch,
struct vn_command_vkUpdateDescriptorSets *args)
{
struct vkr_device *dev = vkr_device_from_handle(args->device);
struct vn_device_proc_table *vk = &dev->proc_table;
vn_replace_vkUpdateDescriptorSets_args_handle(args);
vk->UpdateDescriptorSets(args->device, args->descriptorWriteCount,
args->pDescriptorWrites, args->descriptorCopyCount,
args->pDescriptorCopies);
}
static void
vkr_dispatch_vkCreateDescriptorUpdateTemplate(
struct vn_dispatch_context *dispatch,
struct vn_command_vkCreateDescriptorUpdateTemplate *args)
{
vkr_descriptor_update_template_create_and_add(dispatch->data, args);
}
static void
vkr_dispatch_vkDestroyDescriptorUpdateTemplate(
struct vn_dispatch_context *dispatch,
struct vn_command_vkDestroyDescriptorUpdateTemplate *args)
{
vkr_descriptor_update_template_destroy_and_remove(dispatch->data, args);
}
void
vkr_context_init_descriptor_set_layout_dispatch(struct vkr_context *ctx)
{
struct vn_dispatch_context *dispatch = &ctx->dispatch;
dispatch->dispatch_vkGetDescriptorSetLayoutSupport =
vkr_dispatch_vkGetDescriptorSetLayoutSupport;
dispatch->dispatch_vkCreateDescriptorSetLayout =
vkr_dispatch_vkCreateDescriptorSetLayout;
dispatch->dispatch_vkDestroyDescriptorSetLayout =
vkr_dispatch_vkDestroyDescriptorSetLayout;
}
void
vkr_context_init_descriptor_pool_dispatch(struct vkr_context *ctx)
{
struct vn_dispatch_context *dispatch = &ctx->dispatch;
dispatch->dispatch_vkCreateDescriptorPool = vkr_dispatch_vkCreateDescriptorPool;
dispatch->dispatch_vkDestroyDescriptorPool = vkr_dispatch_vkDestroyDescriptorPool;
dispatch->dispatch_vkResetDescriptorPool = vkr_dispatch_vkResetDescriptorPool;
}
void
vkr_context_init_descriptor_set_dispatch(struct vkr_context *ctx)
{
struct vn_dispatch_context *dispatch = &ctx->dispatch;
dispatch->dispatch_vkAllocateDescriptorSets = vkr_dispatch_vkAllocateDescriptorSets;
dispatch->dispatch_vkFreeDescriptorSets = vkr_dispatch_vkFreeDescriptorSets;
dispatch->dispatch_vkUpdateDescriptorSets = vkr_dispatch_vkUpdateDescriptorSets;
}
void
vkr_context_init_descriptor_update_template_dispatch(struct vkr_context *ctx)
{
struct vn_dispatch_context *dispatch = &ctx->dispatch;
dispatch->dispatch_vkCreateDescriptorUpdateTemplate =
vkr_dispatch_vkCreateDescriptorUpdateTemplate;
dispatch->dispatch_vkDestroyDescriptorUpdateTemplate =
vkr_dispatch_vkDestroyDescriptorUpdateTemplate;
dispatch->dispatch_vkUpdateDescriptorSetWithTemplate = NULL;
}