• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 Google LLC
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include "vkr_descriptor_set.h"
7 
8 #include "vkr_descriptor_set_gen.h"
9 
10 static void
vkr_dispatch_vkGetDescriptorSetLayoutSupport(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetDescriptorSetLayoutSupport * args)11 vkr_dispatch_vkGetDescriptorSetLayoutSupport(
12    UNUSED struct vn_dispatch_context *dispatch,
13    struct vn_command_vkGetDescriptorSetLayoutSupport *args)
14 {
15    vn_replace_vkGetDescriptorSetLayoutSupport_args_handle(args);
16    vkGetDescriptorSetLayoutSupport(args->device, args->pCreateInfo, args->pSupport);
17 }
18 
19 static void
vkr_dispatch_vkCreateDescriptorSetLayout(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateDescriptorSetLayout * args)20 vkr_dispatch_vkCreateDescriptorSetLayout(
21    struct vn_dispatch_context *dispatch,
22    struct vn_command_vkCreateDescriptorSetLayout *args)
23 {
24    vkr_descriptor_set_layout_create_and_add(dispatch->data, args);
25 }
26 
27 static void
vkr_dispatch_vkDestroyDescriptorSetLayout(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyDescriptorSetLayout * args)28 vkr_dispatch_vkDestroyDescriptorSetLayout(
29    struct vn_dispatch_context *dispatch,
30    struct vn_command_vkDestroyDescriptorSetLayout *args)
31 {
32    vkr_descriptor_set_layout_destroy_and_remove(dispatch->data, args);
33 }
34 
35 static void
vkr_dispatch_vkCreateDescriptorPool(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateDescriptorPool * args)36 vkr_dispatch_vkCreateDescriptorPool(struct vn_dispatch_context *dispatch,
37                                     struct vn_command_vkCreateDescriptorPool *args)
38 {
39    struct vkr_descriptor_pool *pool =
40       vkr_descriptor_pool_create_and_add(dispatch->data, args);
41    if (!pool)
42       return;
43 
44    pool->flags = args->pCreateInfo->flags;
45 
46    list_inithead(&pool->descriptor_sets);
47 }
48 
49 static void
vkr_dispatch_vkDestroyDescriptorPool(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyDescriptorPool * args)50 vkr_dispatch_vkDestroyDescriptorPool(struct vn_dispatch_context *dispatch,
51                                      struct vn_command_vkDestroyDescriptorPool *args)
52 {
53    struct vkr_context *ctx = dispatch->data;
54    struct vkr_descriptor_pool *pool =
55       vkr_descriptor_pool_from_handle(args->descriptorPool);
56 
57    if (!pool)
58       return;
59 
60    vkr_context_remove_objects(ctx, &pool->descriptor_sets);
61 
62    vkr_descriptor_pool_destroy_and_remove(ctx, args);
63 }
64 
65 static void
vkr_dispatch_vkResetDescriptorPool(struct vn_dispatch_context * dispatch,struct vn_command_vkResetDescriptorPool * args)66 vkr_dispatch_vkResetDescriptorPool(struct vn_dispatch_context *dispatch,
67                                    struct vn_command_vkResetDescriptorPool *args)
68 {
69    struct vkr_context *ctx = dispatch->data;
70 
71    struct vkr_descriptor_pool *pool =
72       vkr_descriptor_pool_from_handle(args->descriptorPool);
73    if (!pool) {
74       vkr_cs_decoder_set_fatal(&ctx->decoder);
75       return;
76    }
77 
78    vn_replace_vkResetDescriptorPool_args_handle(args);
79    args->ret = vkResetDescriptorPool(args->device, args->descriptorPool, args->flags);
80 
81    vkr_context_remove_objects(ctx, &pool->descriptor_sets);
82    list_inithead(&pool->descriptor_sets);
83 }
84 
85 static void
vkr_dispatch_vkAllocateDescriptorSets(struct vn_dispatch_context * dispatch,struct vn_command_vkAllocateDescriptorSets * args)86 vkr_dispatch_vkAllocateDescriptorSets(struct vn_dispatch_context *dispatch,
87                                       struct vn_command_vkAllocateDescriptorSets *args)
88 {
89    struct vkr_context *ctx = dispatch->data;
90    struct vkr_device *dev = vkr_device_from_handle(args->device);
91    struct vkr_descriptor_pool *pool =
92       vkr_descriptor_pool_from_handle(args->pAllocateInfo->descriptorPool);
93    struct object_array arr;
94    VkResult result;
95 
96    if (!pool) {
97       vkr_cs_decoder_set_fatal(&ctx->decoder);
98       return;
99    }
100 
101    result = vkr_descriptor_set_create_array(ctx, args, &arr);
102    if (result != VK_SUCCESS) {
103       if (!(pool->flags & VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT))
104          vkr_log("Warning: vkAllocateDescriptorSets failed(%u)", result);
105       return;
106    }
107 
108    vkr_descriptor_set_add_array(ctx, dev, pool, &arr);
109 }
110 
111 static void
vkr_dispatch_vkFreeDescriptorSets(struct vn_dispatch_context * dispatch,struct vn_command_vkFreeDescriptorSets * args)112 vkr_dispatch_vkFreeDescriptorSets(struct vn_dispatch_context *dispatch,
113                                   struct vn_command_vkFreeDescriptorSets *args)
114 {
115    struct vkr_context *ctx = dispatch->data;
116    struct list_head free_list;
117 
118    /* args->pDescriptorSets is marked noautovalidity="true" */
119    if (args->descriptorSetCount && !args->pDescriptorSets) {
120       vkr_cs_decoder_set_fatal(&ctx->decoder);
121       return;
122    }
123 
124    vkr_descriptor_set_destroy_driver_handles(ctx, args, &free_list);
125    vkr_context_remove_objects(ctx, &free_list);
126 
127    args->ret = VK_SUCCESS;
128 }
129 
130 static void
vkr_dispatch_vkUpdateDescriptorSets(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkUpdateDescriptorSets * args)131 vkr_dispatch_vkUpdateDescriptorSets(UNUSED struct vn_dispatch_context *dispatch,
132                                     struct vn_command_vkUpdateDescriptorSets *args)
133 {
134    vn_replace_vkUpdateDescriptorSets_args_handle(args);
135    vkUpdateDescriptorSets(args->device, args->descriptorWriteCount,
136                           args->pDescriptorWrites, args->descriptorCopyCount,
137                           args->pDescriptorCopies);
138 }
139 
140 static void
vkr_dispatch_vkCreateDescriptorUpdateTemplate(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateDescriptorUpdateTemplate * args)141 vkr_dispatch_vkCreateDescriptorUpdateTemplate(
142    struct vn_dispatch_context *dispatch,
143    struct vn_command_vkCreateDescriptorUpdateTemplate *args)
144 {
145    vkr_descriptor_update_template_create_and_add(dispatch->data, args);
146 }
147 
148 static void
vkr_dispatch_vkDestroyDescriptorUpdateTemplate(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyDescriptorUpdateTemplate * args)149 vkr_dispatch_vkDestroyDescriptorUpdateTemplate(
150    struct vn_dispatch_context *dispatch,
151    struct vn_command_vkDestroyDescriptorUpdateTemplate *args)
152 {
153    vkr_descriptor_update_template_destroy_and_remove(dispatch->data, args);
154 }
155 
156 void
vkr_context_init_descriptor_set_layout_dispatch(struct vkr_context * ctx)157 vkr_context_init_descriptor_set_layout_dispatch(struct vkr_context *ctx)
158 {
159    struct vn_dispatch_context *dispatch = &ctx->dispatch;
160 
161    dispatch->dispatch_vkGetDescriptorSetLayoutSupport =
162       vkr_dispatch_vkGetDescriptorSetLayoutSupport;
163    dispatch->dispatch_vkCreateDescriptorSetLayout =
164       vkr_dispatch_vkCreateDescriptorSetLayout;
165    dispatch->dispatch_vkDestroyDescriptorSetLayout =
166       vkr_dispatch_vkDestroyDescriptorSetLayout;
167 }
168 
169 void
vkr_context_init_descriptor_pool_dispatch(struct vkr_context * ctx)170 vkr_context_init_descriptor_pool_dispatch(struct vkr_context *ctx)
171 {
172    struct vn_dispatch_context *dispatch = &ctx->dispatch;
173 
174    dispatch->dispatch_vkCreateDescriptorPool = vkr_dispatch_vkCreateDescriptorPool;
175    dispatch->dispatch_vkDestroyDescriptorPool = vkr_dispatch_vkDestroyDescriptorPool;
176    dispatch->dispatch_vkResetDescriptorPool = vkr_dispatch_vkResetDescriptorPool;
177 }
178 
179 void
vkr_context_init_descriptor_set_dispatch(struct vkr_context * ctx)180 vkr_context_init_descriptor_set_dispatch(struct vkr_context *ctx)
181 {
182    struct vn_dispatch_context *dispatch = &ctx->dispatch;
183 
184    dispatch->dispatch_vkAllocateDescriptorSets = vkr_dispatch_vkAllocateDescriptorSets;
185    dispatch->dispatch_vkFreeDescriptorSets = vkr_dispatch_vkFreeDescriptorSets;
186    dispatch->dispatch_vkUpdateDescriptorSets = vkr_dispatch_vkUpdateDescriptorSets;
187 }
188 
189 void
vkr_context_init_descriptor_update_template_dispatch(struct vkr_context * ctx)190 vkr_context_init_descriptor_update_template_dispatch(struct vkr_context *ctx)
191 {
192    struct vn_dispatch_context *dispatch = &ctx->dispatch;
193 
194    dispatch->dispatch_vkCreateDescriptorUpdateTemplate =
195       vkr_dispatch_vkCreateDescriptorUpdateTemplate;
196    dispatch->dispatch_vkDestroyDescriptorUpdateTemplate =
197       vkr_dispatch_vkDestroyDescriptorUpdateTemplate;
198    dispatch->dispatch_vkUpdateDescriptorSetWithTemplate = NULL;
199 }
200