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