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