xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_descriptor_set.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
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