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