1/* This file is generated by venus-protocol.  See vn_protocol_driver.h. */
2
3/*
4 * Copyright 2020 Google LLC
5 * SPDX-License-Identifier: MIT
6 */
7
8#ifndef VN_PROTOCOL_DRIVER_PIPELINE_H
9#define VN_PROTOCOL_DRIVER_PIPELINE_H
10
11#include "vn_instance.h"
12#include "vn_protocol_driver_structs.h"
13
14/* struct VkSpecializationMapEntry */
15
16static inline size_t
17vn_sizeof_VkSpecializationMapEntry(const VkSpecializationMapEntry *val)
18{
19    size_t size = 0;
20    size += vn_sizeof_uint32_t(&val->constantID);
21    size += vn_sizeof_uint32_t(&val->offset);
22    size += vn_sizeof_size_t(&val->size);
23    return size;
24}
25
26static inline void
27vn_encode_VkSpecializationMapEntry(struct vn_cs_encoder *enc, const VkSpecializationMapEntry *val)
28{
29    vn_encode_uint32_t(enc, &val->constantID);
30    vn_encode_uint32_t(enc, &val->offset);
31    vn_encode_size_t(enc, &val->size);
32}
33
34/* struct VkSpecializationInfo */
35
36static inline size_t
37vn_sizeof_VkSpecializationInfo(const VkSpecializationInfo *val)
38{
39    size_t size = 0;
40    size += vn_sizeof_uint32_t(&val->mapEntryCount);
41    if (val->pMapEntries) {
42        size += vn_sizeof_array_size(val->mapEntryCount);
43        for (uint32_t i = 0; i < val->mapEntryCount; i++)
44            size += vn_sizeof_VkSpecializationMapEntry(&val->pMapEntries[i]);
45    } else {
46        size += vn_sizeof_array_size(0);
47    }
48    size += vn_sizeof_size_t(&val->dataSize);
49    if (val->pData) {
50        size += vn_sizeof_array_size(val->dataSize);
51        size += vn_sizeof_blob_array(val->pData, val->dataSize);
52    } else {
53        size += vn_sizeof_array_size(0);
54    }
55    return size;
56}
57
58static inline void
59vn_encode_VkSpecializationInfo(struct vn_cs_encoder *enc, const VkSpecializationInfo *val)
60{
61    vn_encode_uint32_t(enc, &val->mapEntryCount);
62    if (val->pMapEntries) {
63        vn_encode_array_size(enc, val->mapEntryCount);
64        for (uint32_t i = 0; i < val->mapEntryCount; i++)
65            vn_encode_VkSpecializationMapEntry(enc, &val->pMapEntries[i]);
66    } else {
67        vn_encode_array_size(enc, 0);
68    }
69    vn_encode_size_t(enc, &val->dataSize);
70    if (val->pData) {
71        vn_encode_array_size(enc, val->dataSize);
72        vn_encode_blob_array(enc, val->pData, val->dataSize);
73    } else {
74        vn_encode_array_size(enc, 0);
75    }
76}
77
78/* struct VkPipelineShaderStageRequiredSubgroupSizeCreateInfo chain */
79
80static inline size_t
81vn_sizeof_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_pnext(const void *val)
82{
83    /* no known/supported struct */
84    return vn_sizeof_simple_pointer(NULL);
85}
86
87static inline size_t
88vn_sizeof_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_self(const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *val)
89{
90    size_t size = 0;
91    /* skip val->{sType,pNext} */
92    size += vn_sizeof_uint32_t(&val->requiredSubgroupSize);
93    return size;
94}
95
96static inline size_t
97vn_sizeof_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo(const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *val)
98{
99    size_t size = 0;
100
101    size += vn_sizeof_VkStructureType(&val->sType);
102    size += vn_sizeof_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_pnext(val->pNext);
103    size += vn_sizeof_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_self(val);
104
105    return size;
106}
107
108static inline void
109vn_encode_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
110{
111    /* no known/supported struct */
112    vn_encode_simple_pointer(enc, NULL);
113}
114
115static inline void
116vn_encode_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *val)
117{
118    /* skip val->{sType,pNext} */
119    vn_encode_uint32_t(enc, &val->requiredSubgroupSize);
120}
121
122static inline void
123vn_encode_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo(struct vn_cs_encoder *enc, const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *val)
124{
125    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO);
126    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO });
127    vn_encode_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_pnext(enc, val->pNext);
128    vn_encode_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_self(enc, val);
129}
130
131/* struct VkPipelineShaderStageCreateInfo chain */
132
133static inline size_t
134vn_sizeof_VkPipelineShaderStageCreateInfo_pnext(const void *val)
135{
136    const VkBaseInStructure *pnext = val;
137    size_t size = 0;
138
139    while (pnext) {
140        switch ((int32_t)pnext->sType) {
141        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO:
142            if (!vn_cs_renderer_protocol_has_extension(226 /* VK_EXT_subgroup_size_control */))
143                break;
144            size += vn_sizeof_simple_pointer(pnext);
145            size += vn_sizeof_VkStructureType(&pnext->sType);
146            size += vn_sizeof_VkPipelineShaderStageCreateInfo_pnext(pnext->pNext);
147            size += vn_sizeof_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_self((const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *)pnext);
148            return size;
149        default:
150            /* ignore unknown/unsupported struct */
151            break;
152        }
153        pnext = pnext->pNext;
154    }
155
156    return vn_sizeof_simple_pointer(NULL);
157}
158
159static inline size_t
160vn_sizeof_VkPipelineShaderStageCreateInfo_self(const VkPipelineShaderStageCreateInfo *val)
161{
162    size_t size = 0;
163    /* skip val->{sType,pNext} */
164    size += vn_sizeof_VkFlags(&val->flags);
165    size += vn_sizeof_VkShaderStageFlagBits(&val->stage);
166    size += vn_sizeof_VkShaderModule(&val->module);
167    if (val->pName) {
168        const size_t string_size = strlen(val->pName) + 1;
169        size += vn_sizeof_array_size(string_size);
170        size += vn_sizeof_char_array(val->pName, string_size);
171    } else {
172        size += vn_sizeof_array_size(0);
173    }
174    size += vn_sizeof_simple_pointer(val->pSpecializationInfo);
175    if (val->pSpecializationInfo)
176        size += vn_sizeof_VkSpecializationInfo(val->pSpecializationInfo);
177    return size;
178}
179
180static inline size_t
181vn_sizeof_VkPipelineShaderStageCreateInfo(const VkPipelineShaderStageCreateInfo *val)
182{
183    size_t size = 0;
184
185    size += vn_sizeof_VkStructureType(&val->sType);
186    size += vn_sizeof_VkPipelineShaderStageCreateInfo_pnext(val->pNext);
187    size += vn_sizeof_VkPipelineShaderStageCreateInfo_self(val);
188
189    return size;
190}
191
192static inline void
193vn_encode_VkPipelineShaderStageCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
194{
195    const VkBaseInStructure *pnext = val;
196
197    while (pnext) {
198        switch ((int32_t)pnext->sType) {
199        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO:
200            if (!vn_cs_renderer_protocol_has_extension(226 /* VK_EXT_subgroup_size_control */))
201                break;
202            vn_encode_simple_pointer(enc, pnext);
203            vn_encode_VkStructureType(enc, &pnext->sType);
204            vn_encode_VkPipelineShaderStageCreateInfo_pnext(enc, pnext->pNext);
205            vn_encode_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_self(enc, (const VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *)pnext);
206            return;
207        default:
208            /* ignore unknown/unsupported struct */
209            break;
210        }
211        pnext = pnext->pNext;
212    }
213
214    vn_encode_simple_pointer(enc, NULL);
215}
216
217static inline void
218vn_encode_VkPipelineShaderStageCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineShaderStageCreateInfo *val)
219{
220    /* skip val->{sType,pNext} */
221    vn_encode_VkFlags(enc, &val->flags);
222    vn_encode_VkShaderStageFlagBits(enc, &val->stage);
223    vn_encode_VkShaderModule(enc, &val->module);
224    if (val->pName) {
225        const size_t string_size = strlen(val->pName) + 1;
226        vn_encode_array_size(enc, string_size);
227        vn_encode_char_array(enc, val->pName, string_size);
228    } else {
229        vn_encode_array_size(enc, 0);
230    }
231    if (vn_encode_simple_pointer(enc, val->pSpecializationInfo))
232        vn_encode_VkSpecializationInfo(enc, val->pSpecializationInfo);
233}
234
235static inline void
236vn_encode_VkPipelineShaderStageCreateInfo(struct vn_cs_encoder *enc, const VkPipelineShaderStageCreateInfo *val)
237{
238    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO);
239    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO });
240    vn_encode_VkPipelineShaderStageCreateInfo_pnext(enc, val->pNext);
241    vn_encode_VkPipelineShaderStageCreateInfo_self(enc, val);
242}
243
244/* struct VkVertexInputBindingDescription */
245
246static inline size_t
247vn_sizeof_VkVertexInputBindingDescription(const VkVertexInputBindingDescription *val)
248{
249    size_t size = 0;
250    size += vn_sizeof_uint32_t(&val->binding);
251    size += vn_sizeof_uint32_t(&val->stride);
252    size += vn_sizeof_VkVertexInputRate(&val->inputRate);
253    return size;
254}
255
256static inline void
257vn_encode_VkVertexInputBindingDescription(struct vn_cs_encoder *enc, const VkVertexInputBindingDescription *val)
258{
259    vn_encode_uint32_t(enc, &val->binding);
260    vn_encode_uint32_t(enc, &val->stride);
261    vn_encode_VkVertexInputRate(enc, &val->inputRate);
262}
263
264/* struct VkVertexInputAttributeDescription */
265
266static inline size_t
267vn_sizeof_VkVertexInputAttributeDescription(const VkVertexInputAttributeDescription *val)
268{
269    size_t size = 0;
270    size += vn_sizeof_uint32_t(&val->location);
271    size += vn_sizeof_uint32_t(&val->binding);
272    size += vn_sizeof_VkFormat(&val->format);
273    size += vn_sizeof_uint32_t(&val->offset);
274    return size;
275}
276
277static inline void
278vn_encode_VkVertexInputAttributeDescription(struct vn_cs_encoder *enc, const VkVertexInputAttributeDescription *val)
279{
280    vn_encode_uint32_t(enc, &val->location);
281    vn_encode_uint32_t(enc, &val->binding);
282    vn_encode_VkFormat(enc, &val->format);
283    vn_encode_uint32_t(enc, &val->offset);
284}
285
286/* struct VkVertexInputBindingDivisorDescriptionEXT */
287
288static inline size_t
289vn_sizeof_VkVertexInputBindingDivisorDescriptionEXT(const VkVertexInputBindingDivisorDescriptionEXT *val)
290{
291    size_t size = 0;
292    size += vn_sizeof_uint32_t(&val->binding);
293    size += vn_sizeof_uint32_t(&val->divisor);
294    return size;
295}
296
297static inline void
298vn_encode_VkVertexInputBindingDivisorDescriptionEXT(struct vn_cs_encoder *enc, const VkVertexInputBindingDivisorDescriptionEXT *val)
299{
300    vn_encode_uint32_t(enc, &val->binding);
301    vn_encode_uint32_t(enc, &val->divisor);
302}
303
304/* struct VkPipelineVertexInputDivisorStateCreateInfoEXT chain */
305
306static inline size_t
307vn_sizeof_VkPipelineVertexInputDivisorStateCreateInfoEXT_pnext(const void *val)
308{
309    /* no known/supported struct */
310    return vn_sizeof_simple_pointer(NULL);
311}
312
313static inline size_t
314vn_sizeof_VkPipelineVertexInputDivisorStateCreateInfoEXT_self(const VkPipelineVertexInputDivisorStateCreateInfoEXT *val)
315{
316    size_t size = 0;
317    /* skip val->{sType,pNext} */
318    size += vn_sizeof_uint32_t(&val->vertexBindingDivisorCount);
319    if (val->pVertexBindingDivisors) {
320        size += vn_sizeof_array_size(val->vertexBindingDivisorCount);
321        for (uint32_t i = 0; i < val->vertexBindingDivisorCount; i++)
322            size += vn_sizeof_VkVertexInputBindingDivisorDescriptionEXT(&val->pVertexBindingDivisors[i]);
323    } else {
324        size += vn_sizeof_array_size(0);
325    }
326    return size;
327}
328
329static inline size_t
330vn_sizeof_VkPipelineVertexInputDivisorStateCreateInfoEXT(const VkPipelineVertexInputDivisorStateCreateInfoEXT *val)
331{
332    size_t size = 0;
333
334    size += vn_sizeof_VkStructureType(&val->sType);
335    size += vn_sizeof_VkPipelineVertexInputDivisorStateCreateInfoEXT_pnext(val->pNext);
336    size += vn_sizeof_VkPipelineVertexInputDivisorStateCreateInfoEXT_self(val);
337
338    return size;
339}
340
341static inline void
342vn_encode_VkPipelineVertexInputDivisorStateCreateInfoEXT_pnext(struct vn_cs_encoder *enc, const void *val)
343{
344    /* no known/supported struct */
345    vn_encode_simple_pointer(enc, NULL);
346}
347
348static inline void
349vn_encode_VkPipelineVertexInputDivisorStateCreateInfoEXT_self(struct vn_cs_encoder *enc, const VkPipelineVertexInputDivisorStateCreateInfoEXT *val)
350{
351    /* skip val->{sType,pNext} */
352    vn_encode_uint32_t(enc, &val->vertexBindingDivisorCount);
353    if (val->pVertexBindingDivisors) {
354        vn_encode_array_size(enc, val->vertexBindingDivisorCount);
355        for (uint32_t i = 0; i < val->vertexBindingDivisorCount; i++)
356            vn_encode_VkVertexInputBindingDivisorDescriptionEXT(enc, &val->pVertexBindingDivisors[i]);
357    } else {
358        vn_encode_array_size(enc, 0);
359    }
360}
361
362static inline void
363vn_encode_VkPipelineVertexInputDivisorStateCreateInfoEXT(struct vn_cs_encoder *enc, const VkPipelineVertexInputDivisorStateCreateInfoEXT *val)
364{
365    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT);
366    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT });
367    vn_encode_VkPipelineVertexInputDivisorStateCreateInfoEXT_pnext(enc, val->pNext);
368    vn_encode_VkPipelineVertexInputDivisorStateCreateInfoEXT_self(enc, val);
369}
370
371/* struct VkPipelineVertexInputStateCreateInfo chain */
372
373static inline size_t
374vn_sizeof_VkPipelineVertexInputStateCreateInfo_pnext(const void *val)
375{
376    const VkBaseInStructure *pnext = val;
377    size_t size = 0;
378
379    while (pnext) {
380        switch ((int32_t)pnext->sType) {
381        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
382            if (!vn_cs_renderer_protocol_has_extension(191 /* VK_EXT_vertex_attribute_divisor */))
383                break;
384            size += vn_sizeof_simple_pointer(pnext);
385            size += vn_sizeof_VkStructureType(&pnext->sType);
386            size += vn_sizeof_VkPipelineVertexInputStateCreateInfo_pnext(pnext->pNext);
387            size += vn_sizeof_VkPipelineVertexInputDivisorStateCreateInfoEXT_self((const VkPipelineVertexInputDivisorStateCreateInfoEXT *)pnext);
388            return size;
389        default:
390            /* ignore unknown/unsupported struct */
391            break;
392        }
393        pnext = pnext->pNext;
394    }
395
396    return vn_sizeof_simple_pointer(NULL);
397}
398
399static inline size_t
400vn_sizeof_VkPipelineVertexInputStateCreateInfo_self(const VkPipelineVertexInputStateCreateInfo *val)
401{
402    size_t size = 0;
403    /* skip val->{sType,pNext} */
404    size += vn_sizeof_VkFlags(&val->flags);
405    size += vn_sizeof_uint32_t(&val->vertexBindingDescriptionCount);
406    if (val->pVertexBindingDescriptions) {
407        size += vn_sizeof_array_size(val->vertexBindingDescriptionCount);
408        for (uint32_t i = 0; i < val->vertexBindingDescriptionCount; i++)
409            size += vn_sizeof_VkVertexInputBindingDescription(&val->pVertexBindingDescriptions[i]);
410    } else {
411        size += vn_sizeof_array_size(0);
412    }
413    size += vn_sizeof_uint32_t(&val->vertexAttributeDescriptionCount);
414    if (val->pVertexAttributeDescriptions) {
415        size += vn_sizeof_array_size(val->vertexAttributeDescriptionCount);
416        for (uint32_t i = 0; i < val->vertexAttributeDescriptionCount; i++)
417            size += vn_sizeof_VkVertexInputAttributeDescription(&val->pVertexAttributeDescriptions[i]);
418    } else {
419        size += vn_sizeof_array_size(0);
420    }
421    return size;
422}
423
424static inline size_t
425vn_sizeof_VkPipelineVertexInputStateCreateInfo(const VkPipelineVertexInputStateCreateInfo *val)
426{
427    size_t size = 0;
428
429    size += vn_sizeof_VkStructureType(&val->sType);
430    size += vn_sizeof_VkPipelineVertexInputStateCreateInfo_pnext(val->pNext);
431    size += vn_sizeof_VkPipelineVertexInputStateCreateInfo_self(val);
432
433    return size;
434}
435
436static inline void
437vn_encode_VkPipelineVertexInputStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
438{
439    const VkBaseInStructure *pnext = val;
440
441    while (pnext) {
442        switch ((int32_t)pnext->sType) {
443        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
444            if (!vn_cs_renderer_protocol_has_extension(191 /* VK_EXT_vertex_attribute_divisor */))
445                break;
446            vn_encode_simple_pointer(enc, pnext);
447            vn_encode_VkStructureType(enc, &pnext->sType);
448            vn_encode_VkPipelineVertexInputStateCreateInfo_pnext(enc, pnext->pNext);
449            vn_encode_VkPipelineVertexInputDivisorStateCreateInfoEXT_self(enc, (const VkPipelineVertexInputDivisorStateCreateInfoEXT *)pnext);
450            return;
451        default:
452            /* ignore unknown/unsupported struct */
453            break;
454        }
455        pnext = pnext->pNext;
456    }
457
458    vn_encode_simple_pointer(enc, NULL);
459}
460
461static inline void
462vn_encode_VkPipelineVertexInputStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineVertexInputStateCreateInfo *val)
463{
464    /* skip val->{sType,pNext} */
465    vn_encode_VkFlags(enc, &val->flags);
466    vn_encode_uint32_t(enc, &val->vertexBindingDescriptionCount);
467    if (val->pVertexBindingDescriptions) {
468        vn_encode_array_size(enc, val->vertexBindingDescriptionCount);
469        for (uint32_t i = 0; i < val->vertexBindingDescriptionCount; i++)
470            vn_encode_VkVertexInputBindingDescription(enc, &val->pVertexBindingDescriptions[i]);
471    } else {
472        vn_encode_array_size(enc, 0);
473    }
474    vn_encode_uint32_t(enc, &val->vertexAttributeDescriptionCount);
475    if (val->pVertexAttributeDescriptions) {
476        vn_encode_array_size(enc, val->vertexAttributeDescriptionCount);
477        for (uint32_t i = 0; i < val->vertexAttributeDescriptionCount; i++)
478            vn_encode_VkVertexInputAttributeDescription(enc, &val->pVertexAttributeDescriptions[i]);
479    } else {
480        vn_encode_array_size(enc, 0);
481    }
482}
483
484static inline void
485vn_encode_VkPipelineVertexInputStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineVertexInputStateCreateInfo *val)
486{
487    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO);
488    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO });
489    vn_encode_VkPipelineVertexInputStateCreateInfo_pnext(enc, val->pNext);
490    vn_encode_VkPipelineVertexInputStateCreateInfo_self(enc, val);
491}
492
493/* struct VkPipelineInputAssemblyStateCreateInfo chain */
494
495static inline size_t
496vn_sizeof_VkPipelineInputAssemblyStateCreateInfo_pnext(const void *val)
497{
498    /* no known/supported struct */
499    return vn_sizeof_simple_pointer(NULL);
500}
501
502static inline size_t
503vn_sizeof_VkPipelineInputAssemblyStateCreateInfo_self(const VkPipelineInputAssemblyStateCreateInfo *val)
504{
505    size_t size = 0;
506    /* skip val->{sType,pNext} */
507    size += vn_sizeof_VkFlags(&val->flags);
508    size += vn_sizeof_VkPrimitiveTopology(&val->topology);
509    size += vn_sizeof_VkBool32(&val->primitiveRestartEnable);
510    return size;
511}
512
513static inline size_t
514vn_sizeof_VkPipelineInputAssemblyStateCreateInfo(const VkPipelineInputAssemblyStateCreateInfo *val)
515{
516    size_t size = 0;
517
518    size += vn_sizeof_VkStructureType(&val->sType);
519    size += vn_sizeof_VkPipelineInputAssemblyStateCreateInfo_pnext(val->pNext);
520    size += vn_sizeof_VkPipelineInputAssemblyStateCreateInfo_self(val);
521
522    return size;
523}
524
525static inline void
526vn_encode_VkPipelineInputAssemblyStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
527{
528    /* no known/supported struct */
529    vn_encode_simple_pointer(enc, NULL);
530}
531
532static inline void
533vn_encode_VkPipelineInputAssemblyStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineInputAssemblyStateCreateInfo *val)
534{
535    /* skip val->{sType,pNext} */
536    vn_encode_VkFlags(enc, &val->flags);
537    vn_encode_VkPrimitiveTopology(enc, &val->topology);
538    vn_encode_VkBool32(enc, &val->primitiveRestartEnable);
539}
540
541static inline void
542vn_encode_VkPipelineInputAssemblyStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineInputAssemblyStateCreateInfo *val)
543{
544    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO);
545    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO });
546    vn_encode_VkPipelineInputAssemblyStateCreateInfo_pnext(enc, val->pNext);
547    vn_encode_VkPipelineInputAssemblyStateCreateInfo_self(enc, val);
548}
549
550/* struct VkPipelineTessellationDomainOriginStateCreateInfo chain */
551
552static inline size_t
553vn_sizeof_VkPipelineTessellationDomainOriginStateCreateInfo_pnext(const void *val)
554{
555    /* no known/supported struct */
556    return vn_sizeof_simple_pointer(NULL);
557}
558
559static inline size_t
560vn_sizeof_VkPipelineTessellationDomainOriginStateCreateInfo_self(const VkPipelineTessellationDomainOriginStateCreateInfo *val)
561{
562    size_t size = 0;
563    /* skip val->{sType,pNext} */
564    size += vn_sizeof_VkTessellationDomainOrigin(&val->domainOrigin);
565    return size;
566}
567
568static inline size_t
569vn_sizeof_VkPipelineTessellationDomainOriginStateCreateInfo(const VkPipelineTessellationDomainOriginStateCreateInfo *val)
570{
571    size_t size = 0;
572
573    size += vn_sizeof_VkStructureType(&val->sType);
574    size += vn_sizeof_VkPipelineTessellationDomainOriginStateCreateInfo_pnext(val->pNext);
575    size += vn_sizeof_VkPipelineTessellationDomainOriginStateCreateInfo_self(val);
576
577    return size;
578}
579
580static inline void
581vn_encode_VkPipelineTessellationDomainOriginStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
582{
583    /* no known/supported struct */
584    vn_encode_simple_pointer(enc, NULL);
585}
586
587static inline void
588vn_encode_VkPipelineTessellationDomainOriginStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineTessellationDomainOriginStateCreateInfo *val)
589{
590    /* skip val->{sType,pNext} */
591    vn_encode_VkTessellationDomainOrigin(enc, &val->domainOrigin);
592}
593
594static inline void
595vn_encode_VkPipelineTessellationDomainOriginStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineTessellationDomainOriginStateCreateInfo *val)
596{
597    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO);
598    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO });
599    vn_encode_VkPipelineTessellationDomainOriginStateCreateInfo_pnext(enc, val->pNext);
600    vn_encode_VkPipelineTessellationDomainOriginStateCreateInfo_self(enc, val);
601}
602
603/* struct VkPipelineTessellationStateCreateInfo chain */
604
605static inline size_t
606vn_sizeof_VkPipelineTessellationStateCreateInfo_pnext(const void *val)
607{
608    const VkBaseInStructure *pnext = val;
609    size_t size = 0;
610
611    while (pnext) {
612        switch ((int32_t)pnext->sType) {
613        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
614            size += vn_sizeof_simple_pointer(pnext);
615            size += vn_sizeof_VkStructureType(&pnext->sType);
616            size += vn_sizeof_VkPipelineTessellationStateCreateInfo_pnext(pnext->pNext);
617            size += vn_sizeof_VkPipelineTessellationDomainOriginStateCreateInfo_self((const VkPipelineTessellationDomainOriginStateCreateInfo *)pnext);
618            return size;
619        default:
620            /* ignore unknown/unsupported struct */
621            break;
622        }
623        pnext = pnext->pNext;
624    }
625
626    return vn_sizeof_simple_pointer(NULL);
627}
628
629static inline size_t
630vn_sizeof_VkPipelineTessellationStateCreateInfo_self(const VkPipelineTessellationStateCreateInfo *val)
631{
632    size_t size = 0;
633    /* skip val->{sType,pNext} */
634    size += vn_sizeof_VkFlags(&val->flags);
635    size += vn_sizeof_uint32_t(&val->patchControlPoints);
636    return size;
637}
638
639static inline size_t
640vn_sizeof_VkPipelineTessellationStateCreateInfo(const VkPipelineTessellationStateCreateInfo *val)
641{
642    size_t size = 0;
643
644    size += vn_sizeof_VkStructureType(&val->sType);
645    size += vn_sizeof_VkPipelineTessellationStateCreateInfo_pnext(val->pNext);
646    size += vn_sizeof_VkPipelineTessellationStateCreateInfo_self(val);
647
648    return size;
649}
650
651static inline void
652vn_encode_VkPipelineTessellationStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
653{
654    const VkBaseInStructure *pnext = val;
655
656    while (pnext) {
657        switch ((int32_t)pnext->sType) {
658        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
659            vn_encode_simple_pointer(enc, pnext);
660            vn_encode_VkStructureType(enc, &pnext->sType);
661            vn_encode_VkPipelineTessellationStateCreateInfo_pnext(enc, pnext->pNext);
662            vn_encode_VkPipelineTessellationDomainOriginStateCreateInfo_self(enc, (const VkPipelineTessellationDomainOriginStateCreateInfo *)pnext);
663            return;
664        default:
665            /* ignore unknown/unsupported struct */
666            break;
667        }
668        pnext = pnext->pNext;
669    }
670
671    vn_encode_simple_pointer(enc, NULL);
672}
673
674static inline void
675vn_encode_VkPipelineTessellationStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineTessellationStateCreateInfo *val)
676{
677    /* skip val->{sType,pNext} */
678    vn_encode_VkFlags(enc, &val->flags);
679    vn_encode_uint32_t(enc, &val->patchControlPoints);
680}
681
682static inline void
683vn_encode_VkPipelineTessellationStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineTessellationStateCreateInfo *val)
684{
685    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO);
686    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO });
687    vn_encode_VkPipelineTessellationStateCreateInfo_pnext(enc, val->pNext);
688    vn_encode_VkPipelineTessellationStateCreateInfo_self(enc, val);
689}
690
691/* struct VkPipelineViewportStateCreateInfo chain */
692
693static inline size_t
694vn_sizeof_VkPipelineViewportStateCreateInfo_pnext(const void *val)
695{
696    /* no known/supported struct */
697    return vn_sizeof_simple_pointer(NULL);
698}
699
700static inline size_t
701vn_sizeof_VkPipelineViewportStateCreateInfo_self(const VkPipelineViewportStateCreateInfo *val)
702{
703    size_t size = 0;
704    /* skip val->{sType,pNext} */
705    size += vn_sizeof_VkFlags(&val->flags);
706    size += vn_sizeof_uint32_t(&val->viewportCount);
707    if (val->pViewports) {
708        size += vn_sizeof_array_size(val->viewportCount);
709        for (uint32_t i = 0; i < val->viewportCount; i++)
710            size += vn_sizeof_VkViewport(&val->pViewports[i]);
711    } else {
712        size += vn_sizeof_array_size(0);
713    }
714    size += vn_sizeof_uint32_t(&val->scissorCount);
715    if (val->pScissors) {
716        size += vn_sizeof_array_size(val->scissorCount);
717        for (uint32_t i = 0; i < val->scissorCount; i++)
718            size += vn_sizeof_VkRect2D(&val->pScissors[i]);
719    } else {
720        size += vn_sizeof_array_size(0);
721    }
722    return size;
723}
724
725static inline size_t
726vn_sizeof_VkPipelineViewportStateCreateInfo(const VkPipelineViewportStateCreateInfo *val)
727{
728    size_t size = 0;
729
730    size += vn_sizeof_VkStructureType(&val->sType);
731    size += vn_sizeof_VkPipelineViewportStateCreateInfo_pnext(val->pNext);
732    size += vn_sizeof_VkPipelineViewportStateCreateInfo_self(val);
733
734    return size;
735}
736
737static inline void
738vn_encode_VkPipelineViewportStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
739{
740    /* no known/supported struct */
741    vn_encode_simple_pointer(enc, NULL);
742}
743
744static inline void
745vn_encode_VkPipelineViewportStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineViewportStateCreateInfo *val)
746{
747    /* skip val->{sType,pNext} */
748    vn_encode_VkFlags(enc, &val->flags);
749    vn_encode_uint32_t(enc, &val->viewportCount);
750    if (val->pViewports) {
751        vn_encode_array_size(enc, val->viewportCount);
752        for (uint32_t i = 0; i < val->viewportCount; i++)
753            vn_encode_VkViewport(enc, &val->pViewports[i]);
754    } else {
755        vn_encode_array_size(enc, 0);
756    }
757    vn_encode_uint32_t(enc, &val->scissorCount);
758    if (val->pScissors) {
759        vn_encode_array_size(enc, val->scissorCount);
760        for (uint32_t i = 0; i < val->scissorCount; i++)
761            vn_encode_VkRect2D(enc, &val->pScissors[i]);
762    } else {
763        vn_encode_array_size(enc, 0);
764    }
765}
766
767static inline void
768vn_encode_VkPipelineViewportStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineViewportStateCreateInfo *val)
769{
770    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO);
771    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO });
772    vn_encode_VkPipelineViewportStateCreateInfo_pnext(enc, val->pNext);
773    vn_encode_VkPipelineViewportStateCreateInfo_self(enc, val);
774}
775
776/* struct VkPipelineRasterizationConservativeStateCreateInfoEXT chain */
777
778static inline size_t
779vn_sizeof_VkPipelineRasterizationConservativeStateCreateInfoEXT_pnext(const void *val)
780{
781    /* no known/supported struct */
782    return vn_sizeof_simple_pointer(NULL);
783}
784
785static inline size_t
786vn_sizeof_VkPipelineRasterizationConservativeStateCreateInfoEXT_self(const VkPipelineRasterizationConservativeStateCreateInfoEXT *val)
787{
788    size_t size = 0;
789    /* skip val->{sType,pNext} */
790    size += vn_sizeof_VkFlags(&val->flags);
791    size += vn_sizeof_VkConservativeRasterizationModeEXT(&val->conservativeRasterizationMode);
792    size += vn_sizeof_float(&val->extraPrimitiveOverestimationSize);
793    return size;
794}
795
796static inline size_t
797vn_sizeof_VkPipelineRasterizationConservativeStateCreateInfoEXT(const VkPipelineRasterizationConservativeStateCreateInfoEXT *val)
798{
799    size_t size = 0;
800
801    size += vn_sizeof_VkStructureType(&val->sType);
802    size += vn_sizeof_VkPipelineRasterizationConservativeStateCreateInfoEXT_pnext(val->pNext);
803    size += vn_sizeof_VkPipelineRasterizationConservativeStateCreateInfoEXT_self(val);
804
805    return size;
806}
807
808static inline void
809vn_encode_VkPipelineRasterizationConservativeStateCreateInfoEXT_pnext(struct vn_cs_encoder *enc, const void *val)
810{
811    /* no known/supported struct */
812    vn_encode_simple_pointer(enc, NULL);
813}
814
815static inline void
816vn_encode_VkPipelineRasterizationConservativeStateCreateInfoEXT_self(struct vn_cs_encoder *enc, const VkPipelineRasterizationConservativeStateCreateInfoEXT *val)
817{
818    /* skip val->{sType,pNext} */
819    vn_encode_VkFlags(enc, &val->flags);
820    vn_encode_VkConservativeRasterizationModeEXT(enc, &val->conservativeRasterizationMode);
821    vn_encode_float(enc, &val->extraPrimitiveOverestimationSize);
822}
823
824static inline void
825vn_encode_VkPipelineRasterizationConservativeStateCreateInfoEXT(struct vn_cs_encoder *enc, const VkPipelineRasterizationConservativeStateCreateInfoEXT *val)
826{
827    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT);
828    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT });
829    vn_encode_VkPipelineRasterizationConservativeStateCreateInfoEXT_pnext(enc, val->pNext);
830    vn_encode_VkPipelineRasterizationConservativeStateCreateInfoEXT_self(enc, val);
831}
832
833/* struct VkPipelineRasterizationStateStreamCreateInfoEXT chain */
834
835static inline size_t
836vn_sizeof_VkPipelineRasterizationStateStreamCreateInfoEXT_pnext(const void *val)
837{
838    /* no known/supported struct */
839    return vn_sizeof_simple_pointer(NULL);
840}
841
842static inline size_t
843vn_sizeof_VkPipelineRasterizationStateStreamCreateInfoEXT_self(const VkPipelineRasterizationStateStreamCreateInfoEXT *val)
844{
845    size_t size = 0;
846    /* skip val->{sType,pNext} */
847    size += vn_sizeof_VkFlags(&val->flags);
848    size += vn_sizeof_uint32_t(&val->rasterizationStream);
849    return size;
850}
851
852static inline size_t
853vn_sizeof_VkPipelineRasterizationStateStreamCreateInfoEXT(const VkPipelineRasterizationStateStreamCreateInfoEXT *val)
854{
855    size_t size = 0;
856
857    size += vn_sizeof_VkStructureType(&val->sType);
858    size += vn_sizeof_VkPipelineRasterizationStateStreamCreateInfoEXT_pnext(val->pNext);
859    size += vn_sizeof_VkPipelineRasterizationStateStreamCreateInfoEXT_self(val);
860
861    return size;
862}
863
864static inline void
865vn_encode_VkPipelineRasterizationStateStreamCreateInfoEXT_pnext(struct vn_cs_encoder *enc, const void *val)
866{
867    /* no known/supported struct */
868    vn_encode_simple_pointer(enc, NULL);
869}
870
871static inline void
872vn_encode_VkPipelineRasterizationStateStreamCreateInfoEXT_self(struct vn_cs_encoder *enc, const VkPipelineRasterizationStateStreamCreateInfoEXT *val)
873{
874    /* skip val->{sType,pNext} */
875    vn_encode_VkFlags(enc, &val->flags);
876    vn_encode_uint32_t(enc, &val->rasterizationStream);
877}
878
879static inline void
880vn_encode_VkPipelineRasterizationStateStreamCreateInfoEXT(struct vn_cs_encoder *enc, const VkPipelineRasterizationStateStreamCreateInfoEXT *val)
881{
882    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT);
883    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT });
884    vn_encode_VkPipelineRasterizationStateStreamCreateInfoEXT_pnext(enc, val->pNext);
885    vn_encode_VkPipelineRasterizationStateStreamCreateInfoEXT_self(enc, val);
886}
887
888/* struct VkPipelineRasterizationDepthClipStateCreateInfoEXT chain */
889
890static inline size_t
891vn_sizeof_VkPipelineRasterizationDepthClipStateCreateInfoEXT_pnext(const void *val)
892{
893    /* no known/supported struct */
894    return vn_sizeof_simple_pointer(NULL);
895}
896
897static inline size_t
898vn_sizeof_VkPipelineRasterizationDepthClipStateCreateInfoEXT_self(const VkPipelineRasterizationDepthClipStateCreateInfoEXT *val)
899{
900    size_t size = 0;
901    /* skip val->{sType,pNext} */
902    size += vn_sizeof_VkFlags(&val->flags);
903    size += vn_sizeof_VkBool32(&val->depthClipEnable);
904    return size;
905}
906
907static inline size_t
908vn_sizeof_VkPipelineRasterizationDepthClipStateCreateInfoEXT(const VkPipelineRasterizationDepthClipStateCreateInfoEXT *val)
909{
910    size_t size = 0;
911
912    size += vn_sizeof_VkStructureType(&val->sType);
913    size += vn_sizeof_VkPipelineRasterizationDepthClipStateCreateInfoEXT_pnext(val->pNext);
914    size += vn_sizeof_VkPipelineRasterizationDepthClipStateCreateInfoEXT_self(val);
915
916    return size;
917}
918
919static inline void
920vn_encode_VkPipelineRasterizationDepthClipStateCreateInfoEXT_pnext(struct vn_cs_encoder *enc, const void *val)
921{
922    /* no known/supported struct */
923    vn_encode_simple_pointer(enc, NULL);
924}
925
926static inline void
927vn_encode_VkPipelineRasterizationDepthClipStateCreateInfoEXT_self(struct vn_cs_encoder *enc, const VkPipelineRasterizationDepthClipStateCreateInfoEXT *val)
928{
929    /* skip val->{sType,pNext} */
930    vn_encode_VkFlags(enc, &val->flags);
931    vn_encode_VkBool32(enc, &val->depthClipEnable);
932}
933
934static inline void
935vn_encode_VkPipelineRasterizationDepthClipStateCreateInfoEXT(struct vn_cs_encoder *enc, const VkPipelineRasterizationDepthClipStateCreateInfoEXT *val)
936{
937    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT);
938    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT });
939    vn_encode_VkPipelineRasterizationDepthClipStateCreateInfoEXT_pnext(enc, val->pNext);
940    vn_encode_VkPipelineRasterizationDepthClipStateCreateInfoEXT_self(enc, val);
941}
942
943/* struct VkPipelineRasterizationLineStateCreateInfoEXT chain */
944
945static inline size_t
946vn_sizeof_VkPipelineRasterizationLineStateCreateInfoEXT_pnext(const void *val)
947{
948    /* no known/supported struct */
949    return vn_sizeof_simple_pointer(NULL);
950}
951
952static inline size_t
953vn_sizeof_VkPipelineRasterizationLineStateCreateInfoEXT_self(const VkPipelineRasterizationLineStateCreateInfoEXT *val)
954{
955    size_t size = 0;
956    /* skip val->{sType,pNext} */
957    size += vn_sizeof_VkLineRasterizationModeEXT(&val->lineRasterizationMode);
958    size += vn_sizeof_VkBool32(&val->stippledLineEnable);
959    size += vn_sizeof_uint32_t(&val->lineStippleFactor);
960    size += vn_sizeof_uint16_t(&val->lineStipplePattern);
961    return size;
962}
963
964static inline size_t
965vn_sizeof_VkPipelineRasterizationLineStateCreateInfoEXT(const VkPipelineRasterizationLineStateCreateInfoEXT *val)
966{
967    size_t size = 0;
968
969    size += vn_sizeof_VkStructureType(&val->sType);
970    size += vn_sizeof_VkPipelineRasterizationLineStateCreateInfoEXT_pnext(val->pNext);
971    size += vn_sizeof_VkPipelineRasterizationLineStateCreateInfoEXT_self(val);
972
973    return size;
974}
975
976static inline void
977vn_encode_VkPipelineRasterizationLineStateCreateInfoEXT_pnext(struct vn_cs_encoder *enc, const void *val)
978{
979    /* no known/supported struct */
980    vn_encode_simple_pointer(enc, NULL);
981}
982
983static inline void
984vn_encode_VkPipelineRasterizationLineStateCreateInfoEXT_self(struct vn_cs_encoder *enc, const VkPipelineRasterizationLineStateCreateInfoEXT *val)
985{
986    /* skip val->{sType,pNext} */
987    vn_encode_VkLineRasterizationModeEXT(enc, &val->lineRasterizationMode);
988    vn_encode_VkBool32(enc, &val->stippledLineEnable);
989    vn_encode_uint32_t(enc, &val->lineStippleFactor);
990    vn_encode_uint16_t(enc, &val->lineStipplePattern);
991}
992
993static inline void
994vn_encode_VkPipelineRasterizationLineStateCreateInfoEXT(struct vn_cs_encoder *enc, const VkPipelineRasterizationLineStateCreateInfoEXT *val)
995{
996    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT);
997    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT });
998    vn_encode_VkPipelineRasterizationLineStateCreateInfoEXT_pnext(enc, val->pNext);
999    vn_encode_VkPipelineRasterizationLineStateCreateInfoEXT_self(enc, val);
1000}
1001
1002/* struct VkPipelineRasterizationProvokingVertexStateCreateInfoEXT chain */
1003
1004static inline size_t
1005vn_sizeof_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_pnext(const void *val)
1006{
1007    /* no known/supported struct */
1008    return vn_sizeof_simple_pointer(NULL);
1009}
1010
1011static inline size_t
1012vn_sizeof_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_self(const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT *val)
1013{
1014    size_t size = 0;
1015    /* skip val->{sType,pNext} */
1016    size += vn_sizeof_VkProvokingVertexModeEXT(&val->provokingVertexMode);
1017    return size;
1018}
1019
1020static inline size_t
1021vn_sizeof_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT *val)
1022{
1023    size_t size = 0;
1024
1025    size += vn_sizeof_VkStructureType(&val->sType);
1026    size += vn_sizeof_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_pnext(val->pNext);
1027    size += vn_sizeof_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_self(val);
1028
1029    return size;
1030}
1031
1032static inline void
1033vn_encode_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_pnext(struct vn_cs_encoder *enc, const void *val)
1034{
1035    /* no known/supported struct */
1036    vn_encode_simple_pointer(enc, NULL);
1037}
1038
1039static inline void
1040vn_encode_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_self(struct vn_cs_encoder *enc, const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT *val)
1041{
1042    /* skip val->{sType,pNext} */
1043    vn_encode_VkProvokingVertexModeEXT(enc, &val->provokingVertexMode);
1044}
1045
1046static inline void
1047vn_encode_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT(struct vn_cs_encoder *enc, const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT *val)
1048{
1049    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT);
1050    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT });
1051    vn_encode_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_pnext(enc, val->pNext);
1052    vn_encode_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_self(enc, val);
1053}
1054
1055/* struct VkPipelineRasterizationStateCreateInfo chain */
1056
1057static inline size_t
1058vn_sizeof_VkPipelineRasterizationStateCreateInfo_pnext(const void *val)
1059{
1060    const VkBaseInStructure *pnext = val;
1061    size_t size = 0;
1062
1063    while (pnext) {
1064        switch ((int32_t)pnext->sType) {
1065        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
1066            if (!vn_cs_renderer_protocol_has_extension(102 /* VK_EXT_conservative_rasterization */))
1067                break;
1068            size += vn_sizeof_simple_pointer(pnext);
1069            size += vn_sizeof_VkStructureType(&pnext->sType);
1070            size += vn_sizeof_VkPipelineRasterizationStateCreateInfo_pnext(pnext->pNext);
1071            size += vn_sizeof_VkPipelineRasterizationConservativeStateCreateInfoEXT_self((const VkPipelineRasterizationConservativeStateCreateInfoEXT *)pnext);
1072            return size;
1073        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
1074            if (!vn_cs_renderer_protocol_has_extension(29 /* VK_EXT_transform_feedback */))
1075                break;
1076            size += vn_sizeof_simple_pointer(pnext);
1077            size += vn_sizeof_VkStructureType(&pnext->sType);
1078            size += vn_sizeof_VkPipelineRasterizationStateCreateInfo_pnext(pnext->pNext);
1079            size += vn_sizeof_VkPipelineRasterizationStateStreamCreateInfoEXT_self((const VkPipelineRasterizationStateStreamCreateInfoEXT *)pnext);
1080            return size;
1081        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
1082            if (!vn_cs_renderer_protocol_has_extension(103 /* VK_EXT_depth_clip_enable */))
1083                break;
1084            size += vn_sizeof_simple_pointer(pnext);
1085            size += vn_sizeof_VkStructureType(&pnext->sType);
1086            size += vn_sizeof_VkPipelineRasterizationStateCreateInfo_pnext(pnext->pNext);
1087            size += vn_sizeof_VkPipelineRasterizationDepthClipStateCreateInfoEXT_self((const VkPipelineRasterizationDepthClipStateCreateInfoEXT *)pnext);
1088            return size;
1089        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
1090            if (!vn_cs_renderer_protocol_has_extension(260 /* VK_EXT_line_rasterization */))
1091                break;
1092            size += vn_sizeof_simple_pointer(pnext);
1093            size += vn_sizeof_VkStructureType(&pnext->sType);
1094            size += vn_sizeof_VkPipelineRasterizationStateCreateInfo_pnext(pnext->pNext);
1095            size += vn_sizeof_VkPipelineRasterizationLineStateCreateInfoEXT_self((const VkPipelineRasterizationLineStateCreateInfoEXT *)pnext);
1096            return size;
1097        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
1098            if (!vn_cs_renderer_protocol_has_extension(255 /* VK_EXT_provoking_vertex */))
1099                break;
1100            size += vn_sizeof_simple_pointer(pnext);
1101            size += vn_sizeof_VkStructureType(&pnext->sType);
1102            size += vn_sizeof_VkPipelineRasterizationStateCreateInfo_pnext(pnext->pNext);
1103            size += vn_sizeof_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_self((const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT *)pnext);
1104            return size;
1105        default:
1106            /* ignore unknown/unsupported struct */
1107            break;
1108        }
1109        pnext = pnext->pNext;
1110    }
1111
1112    return vn_sizeof_simple_pointer(NULL);
1113}
1114
1115static inline size_t
1116vn_sizeof_VkPipelineRasterizationStateCreateInfo_self(const VkPipelineRasterizationStateCreateInfo *val)
1117{
1118    size_t size = 0;
1119    /* skip val->{sType,pNext} */
1120    size += vn_sizeof_VkFlags(&val->flags);
1121    size += vn_sizeof_VkBool32(&val->depthClampEnable);
1122    size += vn_sizeof_VkBool32(&val->rasterizerDiscardEnable);
1123    size += vn_sizeof_VkPolygonMode(&val->polygonMode);
1124    size += vn_sizeof_VkFlags(&val->cullMode);
1125    size += vn_sizeof_VkFrontFace(&val->frontFace);
1126    size += vn_sizeof_VkBool32(&val->depthBiasEnable);
1127    size += vn_sizeof_float(&val->depthBiasConstantFactor);
1128    size += vn_sizeof_float(&val->depthBiasClamp);
1129    size += vn_sizeof_float(&val->depthBiasSlopeFactor);
1130    size += vn_sizeof_float(&val->lineWidth);
1131    return size;
1132}
1133
1134static inline size_t
1135vn_sizeof_VkPipelineRasterizationStateCreateInfo(const VkPipelineRasterizationStateCreateInfo *val)
1136{
1137    size_t size = 0;
1138
1139    size += vn_sizeof_VkStructureType(&val->sType);
1140    size += vn_sizeof_VkPipelineRasterizationStateCreateInfo_pnext(val->pNext);
1141    size += vn_sizeof_VkPipelineRasterizationStateCreateInfo_self(val);
1142
1143    return size;
1144}
1145
1146static inline void
1147vn_encode_VkPipelineRasterizationStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
1148{
1149    const VkBaseInStructure *pnext = val;
1150
1151    while (pnext) {
1152        switch ((int32_t)pnext->sType) {
1153        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
1154            if (!vn_cs_renderer_protocol_has_extension(102 /* VK_EXT_conservative_rasterization */))
1155                break;
1156            vn_encode_simple_pointer(enc, pnext);
1157            vn_encode_VkStructureType(enc, &pnext->sType);
1158            vn_encode_VkPipelineRasterizationStateCreateInfo_pnext(enc, pnext->pNext);
1159            vn_encode_VkPipelineRasterizationConservativeStateCreateInfoEXT_self(enc, (const VkPipelineRasterizationConservativeStateCreateInfoEXT *)pnext);
1160            return;
1161        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT:
1162            if (!vn_cs_renderer_protocol_has_extension(29 /* VK_EXT_transform_feedback */))
1163                break;
1164            vn_encode_simple_pointer(enc, pnext);
1165            vn_encode_VkStructureType(enc, &pnext->sType);
1166            vn_encode_VkPipelineRasterizationStateCreateInfo_pnext(enc, pnext->pNext);
1167            vn_encode_VkPipelineRasterizationStateStreamCreateInfoEXT_self(enc, (const VkPipelineRasterizationStateStreamCreateInfoEXT *)pnext);
1168            return;
1169        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT:
1170            if (!vn_cs_renderer_protocol_has_extension(103 /* VK_EXT_depth_clip_enable */))
1171                break;
1172            vn_encode_simple_pointer(enc, pnext);
1173            vn_encode_VkStructureType(enc, &pnext->sType);
1174            vn_encode_VkPipelineRasterizationStateCreateInfo_pnext(enc, pnext->pNext);
1175            vn_encode_VkPipelineRasterizationDepthClipStateCreateInfoEXT_self(enc, (const VkPipelineRasterizationDepthClipStateCreateInfoEXT *)pnext);
1176            return;
1177        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
1178            if (!vn_cs_renderer_protocol_has_extension(260 /* VK_EXT_line_rasterization */))
1179                break;
1180            vn_encode_simple_pointer(enc, pnext);
1181            vn_encode_VkStructureType(enc, &pnext->sType);
1182            vn_encode_VkPipelineRasterizationStateCreateInfo_pnext(enc, pnext->pNext);
1183            vn_encode_VkPipelineRasterizationLineStateCreateInfoEXT_self(enc, (const VkPipelineRasterizationLineStateCreateInfoEXT *)pnext);
1184            return;
1185        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT:
1186            if (!vn_cs_renderer_protocol_has_extension(255 /* VK_EXT_provoking_vertex */))
1187                break;
1188            vn_encode_simple_pointer(enc, pnext);
1189            vn_encode_VkStructureType(enc, &pnext->sType);
1190            vn_encode_VkPipelineRasterizationStateCreateInfo_pnext(enc, pnext->pNext);
1191            vn_encode_VkPipelineRasterizationProvokingVertexStateCreateInfoEXT_self(enc, (const VkPipelineRasterizationProvokingVertexStateCreateInfoEXT *)pnext);
1192            return;
1193        default:
1194            /* ignore unknown/unsupported struct */
1195            break;
1196        }
1197        pnext = pnext->pNext;
1198    }
1199
1200    vn_encode_simple_pointer(enc, NULL);
1201}
1202
1203static inline void
1204vn_encode_VkPipelineRasterizationStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineRasterizationStateCreateInfo *val)
1205{
1206    /* skip val->{sType,pNext} */
1207    vn_encode_VkFlags(enc, &val->flags);
1208    vn_encode_VkBool32(enc, &val->depthClampEnable);
1209    vn_encode_VkBool32(enc, &val->rasterizerDiscardEnable);
1210    vn_encode_VkPolygonMode(enc, &val->polygonMode);
1211    vn_encode_VkFlags(enc, &val->cullMode);
1212    vn_encode_VkFrontFace(enc, &val->frontFace);
1213    vn_encode_VkBool32(enc, &val->depthBiasEnable);
1214    vn_encode_float(enc, &val->depthBiasConstantFactor);
1215    vn_encode_float(enc, &val->depthBiasClamp);
1216    vn_encode_float(enc, &val->depthBiasSlopeFactor);
1217    vn_encode_float(enc, &val->lineWidth);
1218}
1219
1220static inline void
1221vn_encode_VkPipelineRasterizationStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineRasterizationStateCreateInfo *val)
1222{
1223    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO);
1224    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO });
1225    vn_encode_VkPipelineRasterizationStateCreateInfo_pnext(enc, val->pNext);
1226    vn_encode_VkPipelineRasterizationStateCreateInfo_self(enc, val);
1227}
1228
1229/* struct VkPipelineMultisampleStateCreateInfo chain */
1230
1231static inline size_t
1232vn_sizeof_VkPipelineMultisampleStateCreateInfo_pnext(const void *val)
1233{
1234    /* no known/supported struct */
1235    return vn_sizeof_simple_pointer(NULL);
1236}
1237
1238static inline size_t
1239vn_sizeof_VkPipelineMultisampleStateCreateInfo_self(const VkPipelineMultisampleStateCreateInfo *val)
1240{
1241    size_t size = 0;
1242    /* skip val->{sType,pNext} */
1243    size += vn_sizeof_VkFlags(&val->flags);
1244    size += vn_sizeof_VkSampleCountFlagBits(&val->rasterizationSamples);
1245    size += vn_sizeof_VkBool32(&val->sampleShadingEnable);
1246    size += vn_sizeof_float(&val->minSampleShading);
1247    if (val->pSampleMask) {
1248        size += vn_sizeof_array_size((val->rasterizationSamples + 31) / 32);
1249        size += vn_sizeof_VkSampleMask_array(val->pSampleMask, (val->rasterizationSamples + 31) / 32);
1250    } else {
1251        size += vn_sizeof_array_size(0);
1252    }
1253    size += vn_sizeof_VkBool32(&val->alphaToCoverageEnable);
1254    size += vn_sizeof_VkBool32(&val->alphaToOneEnable);
1255    return size;
1256}
1257
1258static inline size_t
1259vn_sizeof_VkPipelineMultisampleStateCreateInfo(const VkPipelineMultisampleStateCreateInfo *val)
1260{
1261    size_t size = 0;
1262
1263    size += vn_sizeof_VkStructureType(&val->sType);
1264    size += vn_sizeof_VkPipelineMultisampleStateCreateInfo_pnext(val->pNext);
1265    size += vn_sizeof_VkPipelineMultisampleStateCreateInfo_self(val);
1266
1267    return size;
1268}
1269
1270static inline void
1271vn_encode_VkPipelineMultisampleStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
1272{
1273    /* no known/supported struct */
1274    vn_encode_simple_pointer(enc, NULL);
1275}
1276
1277static inline void
1278vn_encode_VkPipelineMultisampleStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineMultisampleStateCreateInfo *val)
1279{
1280    /* skip val->{sType,pNext} */
1281    vn_encode_VkFlags(enc, &val->flags);
1282    vn_encode_VkSampleCountFlagBits(enc, &val->rasterizationSamples);
1283    vn_encode_VkBool32(enc, &val->sampleShadingEnable);
1284    vn_encode_float(enc, &val->minSampleShading);
1285    if (val->pSampleMask) {
1286        vn_encode_array_size(enc, (val->rasterizationSamples + 31) / 32);
1287        vn_encode_VkSampleMask_array(enc, val->pSampleMask, (val->rasterizationSamples + 31) / 32);
1288    } else {
1289        vn_encode_array_size(enc, 0);
1290    }
1291    vn_encode_VkBool32(enc, &val->alphaToCoverageEnable);
1292    vn_encode_VkBool32(enc, &val->alphaToOneEnable);
1293}
1294
1295static inline void
1296vn_encode_VkPipelineMultisampleStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineMultisampleStateCreateInfo *val)
1297{
1298    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO);
1299    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO });
1300    vn_encode_VkPipelineMultisampleStateCreateInfo_pnext(enc, val->pNext);
1301    vn_encode_VkPipelineMultisampleStateCreateInfo_self(enc, val);
1302}
1303
1304/* struct VkStencilOpState */
1305
1306static inline size_t
1307vn_sizeof_VkStencilOpState(const VkStencilOpState *val)
1308{
1309    size_t size = 0;
1310    size += vn_sizeof_VkStencilOp(&val->failOp);
1311    size += vn_sizeof_VkStencilOp(&val->passOp);
1312    size += vn_sizeof_VkStencilOp(&val->depthFailOp);
1313    size += vn_sizeof_VkCompareOp(&val->compareOp);
1314    size += vn_sizeof_uint32_t(&val->compareMask);
1315    size += vn_sizeof_uint32_t(&val->writeMask);
1316    size += vn_sizeof_uint32_t(&val->reference);
1317    return size;
1318}
1319
1320static inline void
1321vn_encode_VkStencilOpState(struct vn_cs_encoder *enc, const VkStencilOpState *val)
1322{
1323    vn_encode_VkStencilOp(enc, &val->failOp);
1324    vn_encode_VkStencilOp(enc, &val->passOp);
1325    vn_encode_VkStencilOp(enc, &val->depthFailOp);
1326    vn_encode_VkCompareOp(enc, &val->compareOp);
1327    vn_encode_uint32_t(enc, &val->compareMask);
1328    vn_encode_uint32_t(enc, &val->writeMask);
1329    vn_encode_uint32_t(enc, &val->reference);
1330}
1331
1332/* struct VkPipelineDepthStencilStateCreateInfo chain */
1333
1334static inline size_t
1335vn_sizeof_VkPipelineDepthStencilStateCreateInfo_pnext(const void *val)
1336{
1337    /* no known/supported struct */
1338    return vn_sizeof_simple_pointer(NULL);
1339}
1340
1341static inline size_t
1342vn_sizeof_VkPipelineDepthStencilStateCreateInfo_self(const VkPipelineDepthStencilStateCreateInfo *val)
1343{
1344    size_t size = 0;
1345    /* skip val->{sType,pNext} */
1346    size += vn_sizeof_VkFlags(&val->flags);
1347    size += vn_sizeof_VkBool32(&val->depthTestEnable);
1348    size += vn_sizeof_VkBool32(&val->depthWriteEnable);
1349    size += vn_sizeof_VkCompareOp(&val->depthCompareOp);
1350    size += vn_sizeof_VkBool32(&val->depthBoundsTestEnable);
1351    size += vn_sizeof_VkBool32(&val->stencilTestEnable);
1352    size += vn_sizeof_VkStencilOpState(&val->front);
1353    size += vn_sizeof_VkStencilOpState(&val->back);
1354    size += vn_sizeof_float(&val->minDepthBounds);
1355    size += vn_sizeof_float(&val->maxDepthBounds);
1356    return size;
1357}
1358
1359static inline size_t
1360vn_sizeof_VkPipelineDepthStencilStateCreateInfo(const VkPipelineDepthStencilStateCreateInfo *val)
1361{
1362    size_t size = 0;
1363
1364    size += vn_sizeof_VkStructureType(&val->sType);
1365    size += vn_sizeof_VkPipelineDepthStencilStateCreateInfo_pnext(val->pNext);
1366    size += vn_sizeof_VkPipelineDepthStencilStateCreateInfo_self(val);
1367
1368    return size;
1369}
1370
1371static inline void
1372vn_encode_VkPipelineDepthStencilStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
1373{
1374    /* no known/supported struct */
1375    vn_encode_simple_pointer(enc, NULL);
1376}
1377
1378static inline void
1379vn_encode_VkPipelineDepthStencilStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineDepthStencilStateCreateInfo *val)
1380{
1381    /* skip val->{sType,pNext} */
1382    vn_encode_VkFlags(enc, &val->flags);
1383    vn_encode_VkBool32(enc, &val->depthTestEnable);
1384    vn_encode_VkBool32(enc, &val->depthWriteEnable);
1385    vn_encode_VkCompareOp(enc, &val->depthCompareOp);
1386    vn_encode_VkBool32(enc, &val->depthBoundsTestEnable);
1387    vn_encode_VkBool32(enc, &val->stencilTestEnable);
1388    vn_encode_VkStencilOpState(enc, &val->front);
1389    vn_encode_VkStencilOpState(enc, &val->back);
1390    vn_encode_float(enc, &val->minDepthBounds);
1391    vn_encode_float(enc, &val->maxDepthBounds);
1392}
1393
1394static inline void
1395vn_encode_VkPipelineDepthStencilStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineDepthStencilStateCreateInfo *val)
1396{
1397    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO);
1398    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO });
1399    vn_encode_VkPipelineDepthStencilStateCreateInfo_pnext(enc, val->pNext);
1400    vn_encode_VkPipelineDepthStencilStateCreateInfo_self(enc, val);
1401}
1402
1403/* struct VkPipelineColorBlendAttachmentState */
1404
1405static inline size_t
1406vn_sizeof_VkPipelineColorBlendAttachmentState(const VkPipelineColorBlendAttachmentState *val)
1407{
1408    size_t size = 0;
1409    size += vn_sizeof_VkBool32(&val->blendEnable);
1410    size += vn_sizeof_VkBlendFactor(&val->srcColorBlendFactor);
1411    size += vn_sizeof_VkBlendFactor(&val->dstColorBlendFactor);
1412    size += vn_sizeof_VkBlendOp(&val->colorBlendOp);
1413    size += vn_sizeof_VkBlendFactor(&val->srcAlphaBlendFactor);
1414    size += vn_sizeof_VkBlendFactor(&val->dstAlphaBlendFactor);
1415    size += vn_sizeof_VkBlendOp(&val->alphaBlendOp);
1416    size += vn_sizeof_VkFlags(&val->colorWriteMask);
1417    return size;
1418}
1419
1420static inline void
1421vn_encode_VkPipelineColorBlendAttachmentState(struct vn_cs_encoder *enc, const VkPipelineColorBlendAttachmentState *val)
1422{
1423    vn_encode_VkBool32(enc, &val->blendEnable);
1424    vn_encode_VkBlendFactor(enc, &val->srcColorBlendFactor);
1425    vn_encode_VkBlendFactor(enc, &val->dstColorBlendFactor);
1426    vn_encode_VkBlendOp(enc, &val->colorBlendOp);
1427    vn_encode_VkBlendFactor(enc, &val->srcAlphaBlendFactor);
1428    vn_encode_VkBlendFactor(enc, &val->dstAlphaBlendFactor);
1429    vn_encode_VkBlendOp(enc, &val->alphaBlendOp);
1430    vn_encode_VkFlags(enc, &val->colorWriteMask);
1431}
1432
1433/* struct VkPipelineColorBlendStateCreateInfo chain */
1434
1435static inline size_t
1436vn_sizeof_VkPipelineColorBlendStateCreateInfo_pnext(const void *val)
1437{
1438    /* no known/supported struct */
1439    return vn_sizeof_simple_pointer(NULL);
1440}
1441
1442static inline size_t
1443vn_sizeof_VkPipelineColorBlendStateCreateInfo_self(const VkPipelineColorBlendStateCreateInfo *val)
1444{
1445    size_t size = 0;
1446    /* skip val->{sType,pNext} */
1447    size += vn_sizeof_VkFlags(&val->flags);
1448    size += vn_sizeof_VkBool32(&val->logicOpEnable);
1449    size += vn_sizeof_VkLogicOp(&val->logicOp);
1450    size += vn_sizeof_uint32_t(&val->attachmentCount);
1451    if (val->pAttachments) {
1452        size += vn_sizeof_array_size(val->attachmentCount);
1453        for (uint32_t i = 0; i < val->attachmentCount; i++)
1454            size += vn_sizeof_VkPipelineColorBlendAttachmentState(&val->pAttachments[i]);
1455    } else {
1456        size += vn_sizeof_array_size(0);
1457    }
1458    size += vn_sizeof_array_size(4);
1459    size += vn_sizeof_float_array(val->blendConstants, 4);
1460    return size;
1461}
1462
1463static inline size_t
1464vn_sizeof_VkPipelineColorBlendStateCreateInfo(const VkPipelineColorBlendStateCreateInfo *val)
1465{
1466    size_t size = 0;
1467
1468    size += vn_sizeof_VkStructureType(&val->sType);
1469    size += vn_sizeof_VkPipelineColorBlendStateCreateInfo_pnext(val->pNext);
1470    size += vn_sizeof_VkPipelineColorBlendStateCreateInfo_self(val);
1471
1472    return size;
1473}
1474
1475static inline void
1476vn_encode_VkPipelineColorBlendStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
1477{
1478    /* no known/supported struct */
1479    vn_encode_simple_pointer(enc, NULL);
1480}
1481
1482static inline void
1483vn_encode_VkPipelineColorBlendStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineColorBlendStateCreateInfo *val)
1484{
1485    /* skip val->{sType,pNext} */
1486    vn_encode_VkFlags(enc, &val->flags);
1487    vn_encode_VkBool32(enc, &val->logicOpEnable);
1488    vn_encode_VkLogicOp(enc, &val->logicOp);
1489    vn_encode_uint32_t(enc, &val->attachmentCount);
1490    if (val->pAttachments) {
1491        vn_encode_array_size(enc, val->attachmentCount);
1492        for (uint32_t i = 0; i < val->attachmentCount; i++)
1493            vn_encode_VkPipelineColorBlendAttachmentState(enc, &val->pAttachments[i]);
1494    } else {
1495        vn_encode_array_size(enc, 0);
1496    }
1497    vn_encode_array_size(enc, 4);
1498    vn_encode_float_array(enc, val->blendConstants, 4);
1499}
1500
1501static inline void
1502vn_encode_VkPipelineColorBlendStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineColorBlendStateCreateInfo *val)
1503{
1504    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO);
1505    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO });
1506    vn_encode_VkPipelineColorBlendStateCreateInfo_pnext(enc, val->pNext);
1507    vn_encode_VkPipelineColorBlendStateCreateInfo_self(enc, val);
1508}
1509
1510/* struct VkPipelineDynamicStateCreateInfo chain */
1511
1512static inline size_t
1513vn_sizeof_VkPipelineDynamicStateCreateInfo_pnext(const void *val)
1514{
1515    /* no known/supported struct */
1516    return vn_sizeof_simple_pointer(NULL);
1517}
1518
1519static inline size_t
1520vn_sizeof_VkPipelineDynamicStateCreateInfo_self(const VkPipelineDynamicStateCreateInfo *val)
1521{
1522    size_t size = 0;
1523    /* skip val->{sType,pNext} */
1524    size += vn_sizeof_VkFlags(&val->flags);
1525    size += vn_sizeof_uint32_t(&val->dynamicStateCount);
1526    if (val->pDynamicStates) {
1527        size += vn_sizeof_array_size(val->dynamicStateCount);
1528        size += vn_sizeof_VkDynamicState_array(val->pDynamicStates, val->dynamicStateCount);
1529    } else {
1530        size += vn_sizeof_array_size(0);
1531    }
1532    return size;
1533}
1534
1535static inline size_t
1536vn_sizeof_VkPipelineDynamicStateCreateInfo(const VkPipelineDynamicStateCreateInfo *val)
1537{
1538    size_t size = 0;
1539
1540    size += vn_sizeof_VkStructureType(&val->sType);
1541    size += vn_sizeof_VkPipelineDynamicStateCreateInfo_pnext(val->pNext);
1542    size += vn_sizeof_VkPipelineDynamicStateCreateInfo_self(val);
1543
1544    return size;
1545}
1546
1547static inline void
1548vn_encode_VkPipelineDynamicStateCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
1549{
1550    /* no known/supported struct */
1551    vn_encode_simple_pointer(enc, NULL);
1552}
1553
1554static inline void
1555vn_encode_VkPipelineDynamicStateCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineDynamicStateCreateInfo *val)
1556{
1557    /* skip val->{sType,pNext} */
1558    vn_encode_VkFlags(enc, &val->flags);
1559    vn_encode_uint32_t(enc, &val->dynamicStateCount);
1560    if (val->pDynamicStates) {
1561        vn_encode_array_size(enc, val->dynamicStateCount);
1562        vn_encode_VkDynamicState_array(enc, val->pDynamicStates, val->dynamicStateCount);
1563    } else {
1564        vn_encode_array_size(enc, 0);
1565    }
1566}
1567
1568static inline void
1569vn_encode_VkPipelineDynamicStateCreateInfo(struct vn_cs_encoder *enc, const VkPipelineDynamicStateCreateInfo *val)
1570{
1571    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO);
1572    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO });
1573    vn_encode_VkPipelineDynamicStateCreateInfo_pnext(enc, val->pNext);
1574    vn_encode_VkPipelineDynamicStateCreateInfo_self(enc, val);
1575}
1576
1577/* struct VkPipelineCreationFeedback */
1578
1579static inline size_t
1580vn_sizeof_VkPipelineCreationFeedback(const VkPipelineCreationFeedback *val)
1581{
1582    size_t size = 0;
1583    size += vn_sizeof_VkFlags(&val->flags);
1584    size += vn_sizeof_uint64_t(&val->duration);
1585    return size;
1586}
1587
1588static inline void
1589vn_encode_VkPipelineCreationFeedback(struct vn_cs_encoder *enc, const VkPipelineCreationFeedback *val)
1590{
1591    vn_encode_VkFlags(enc, &val->flags);
1592    vn_encode_uint64_t(enc, &val->duration);
1593}
1594
1595/* struct VkPipelineCreationFeedbackCreateInfo chain */
1596
1597static inline size_t
1598vn_sizeof_VkPipelineCreationFeedbackCreateInfo_pnext(const void *val)
1599{
1600    /* no known/supported struct */
1601    return vn_sizeof_simple_pointer(NULL);
1602}
1603
1604static inline size_t
1605vn_sizeof_VkPipelineCreationFeedbackCreateInfo_self(const VkPipelineCreationFeedbackCreateInfo *val)
1606{
1607    size_t size = 0;
1608    /* skip val->{sType,pNext} */
1609    size += vn_sizeof_simple_pointer(val->pPipelineCreationFeedback);
1610    if (val->pPipelineCreationFeedback)
1611        size += vn_sizeof_VkPipelineCreationFeedback(val->pPipelineCreationFeedback);
1612    size += vn_sizeof_uint32_t(&val->pipelineStageCreationFeedbackCount);
1613    if (val->pPipelineStageCreationFeedbacks) {
1614        size += vn_sizeof_array_size(val->pipelineStageCreationFeedbackCount);
1615        for (uint32_t i = 0; i < val->pipelineStageCreationFeedbackCount; i++)
1616            size += vn_sizeof_VkPipelineCreationFeedback(&val->pPipelineStageCreationFeedbacks[i]);
1617    } else {
1618        size += vn_sizeof_array_size(0);
1619    }
1620    return size;
1621}
1622
1623static inline size_t
1624vn_sizeof_VkPipelineCreationFeedbackCreateInfo(const VkPipelineCreationFeedbackCreateInfo *val)
1625{
1626    size_t size = 0;
1627
1628    size += vn_sizeof_VkStructureType(&val->sType);
1629    size += vn_sizeof_VkPipelineCreationFeedbackCreateInfo_pnext(val->pNext);
1630    size += vn_sizeof_VkPipelineCreationFeedbackCreateInfo_self(val);
1631
1632    return size;
1633}
1634
1635static inline void
1636vn_encode_VkPipelineCreationFeedbackCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
1637{
1638    /* no known/supported struct */
1639    vn_encode_simple_pointer(enc, NULL);
1640}
1641
1642static inline void
1643vn_encode_VkPipelineCreationFeedbackCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineCreationFeedbackCreateInfo *val)
1644{
1645    /* skip val->{sType,pNext} */
1646    if (vn_encode_simple_pointer(enc, val->pPipelineCreationFeedback))
1647        vn_encode_VkPipelineCreationFeedback(enc, val->pPipelineCreationFeedback);
1648    vn_encode_uint32_t(enc, &val->pipelineStageCreationFeedbackCount);
1649    if (val->pPipelineStageCreationFeedbacks) {
1650        vn_encode_array_size(enc, val->pipelineStageCreationFeedbackCount);
1651        for (uint32_t i = 0; i < val->pipelineStageCreationFeedbackCount; i++)
1652            vn_encode_VkPipelineCreationFeedback(enc, &val->pPipelineStageCreationFeedbacks[i]);
1653    } else {
1654        vn_encode_array_size(enc, 0);
1655    }
1656}
1657
1658static inline void
1659vn_encode_VkPipelineCreationFeedbackCreateInfo(struct vn_cs_encoder *enc, const VkPipelineCreationFeedbackCreateInfo *val)
1660{
1661    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO);
1662    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO });
1663    vn_encode_VkPipelineCreationFeedbackCreateInfo_pnext(enc, val->pNext);
1664    vn_encode_VkPipelineCreationFeedbackCreateInfo_self(enc, val);
1665}
1666
1667/* struct VkPipelineRenderingCreateInfo chain */
1668
1669static inline size_t
1670vn_sizeof_VkPipelineRenderingCreateInfo_pnext(const void *val)
1671{
1672    /* no known/supported struct */
1673    return vn_sizeof_simple_pointer(NULL);
1674}
1675
1676static inline size_t
1677vn_sizeof_VkPipelineRenderingCreateInfo_self(const VkPipelineRenderingCreateInfo *val)
1678{
1679    size_t size = 0;
1680    /* skip val->{sType,pNext} */
1681    size += vn_sizeof_uint32_t(&val->viewMask);
1682    size += vn_sizeof_uint32_t(&val->colorAttachmentCount);
1683    if (val->pColorAttachmentFormats) {
1684        size += vn_sizeof_array_size(val->colorAttachmentCount);
1685        size += vn_sizeof_VkFormat_array(val->pColorAttachmentFormats, val->colorAttachmentCount);
1686    } else {
1687        size += vn_sizeof_array_size(0);
1688    }
1689    size += vn_sizeof_VkFormat(&val->depthAttachmentFormat);
1690    size += vn_sizeof_VkFormat(&val->stencilAttachmentFormat);
1691    return size;
1692}
1693
1694static inline size_t
1695vn_sizeof_VkPipelineRenderingCreateInfo(const VkPipelineRenderingCreateInfo *val)
1696{
1697    size_t size = 0;
1698
1699    size += vn_sizeof_VkStructureType(&val->sType);
1700    size += vn_sizeof_VkPipelineRenderingCreateInfo_pnext(val->pNext);
1701    size += vn_sizeof_VkPipelineRenderingCreateInfo_self(val);
1702
1703    return size;
1704}
1705
1706static inline void
1707vn_encode_VkPipelineRenderingCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
1708{
1709    /* no known/supported struct */
1710    vn_encode_simple_pointer(enc, NULL);
1711}
1712
1713static inline void
1714vn_encode_VkPipelineRenderingCreateInfo_self(struct vn_cs_encoder *enc, const VkPipelineRenderingCreateInfo *val)
1715{
1716    /* skip val->{sType,pNext} */
1717    vn_encode_uint32_t(enc, &val->viewMask);
1718    vn_encode_uint32_t(enc, &val->colorAttachmentCount);
1719    if (val->pColorAttachmentFormats) {
1720        vn_encode_array_size(enc, val->colorAttachmentCount);
1721        vn_encode_VkFormat_array(enc, val->pColorAttachmentFormats, val->colorAttachmentCount);
1722    } else {
1723        vn_encode_array_size(enc, 0);
1724    }
1725    vn_encode_VkFormat(enc, &val->depthAttachmentFormat);
1726    vn_encode_VkFormat(enc, &val->stencilAttachmentFormat);
1727}
1728
1729static inline void
1730vn_encode_VkPipelineRenderingCreateInfo(struct vn_cs_encoder *enc, const VkPipelineRenderingCreateInfo *val)
1731{
1732    assert(val->sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO);
1733    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO });
1734    vn_encode_VkPipelineRenderingCreateInfo_pnext(enc, val->pNext);
1735    vn_encode_VkPipelineRenderingCreateInfo_self(enc, val);
1736}
1737
1738/* struct VkGraphicsPipelineCreateInfo chain */
1739
1740static inline size_t
1741vn_sizeof_VkGraphicsPipelineCreateInfo_pnext(const void *val)
1742{
1743    const VkBaseInStructure *pnext = val;
1744    size_t size = 0;
1745
1746    while (pnext) {
1747        switch ((int32_t)pnext->sType) {
1748        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO:
1749            if (!vn_cs_renderer_protocol_has_extension(193 /* VK_EXT_pipeline_creation_feedback */))
1750                break;
1751            size += vn_sizeof_simple_pointer(pnext);
1752            size += vn_sizeof_VkStructureType(&pnext->sType);
1753            size += vn_sizeof_VkGraphicsPipelineCreateInfo_pnext(pnext->pNext);
1754            size += vn_sizeof_VkPipelineCreationFeedbackCreateInfo_self((const VkPipelineCreationFeedbackCreateInfo *)pnext);
1755            return size;
1756        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO:
1757            if (!vn_cs_renderer_protocol_has_extension(45 /* VK_KHR_dynamic_rendering */))
1758                break;
1759            size += vn_sizeof_simple_pointer(pnext);
1760            size += vn_sizeof_VkStructureType(&pnext->sType);
1761            size += vn_sizeof_VkGraphicsPipelineCreateInfo_pnext(pnext->pNext);
1762            size += vn_sizeof_VkPipelineRenderingCreateInfo_self((const VkPipelineRenderingCreateInfo *)pnext);
1763            return size;
1764        default:
1765            /* ignore unknown/unsupported struct */
1766            break;
1767        }
1768        pnext = pnext->pNext;
1769    }
1770
1771    return vn_sizeof_simple_pointer(NULL);
1772}
1773
1774static inline size_t
1775vn_sizeof_VkGraphicsPipelineCreateInfo_self(const VkGraphicsPipelineCreateInfo *val)
1776{
1777    size_t size = 0;
1778    /* skip val->{sType,pNext} */
1779    size += vn_sizeof_VkFlags(&val->flags);
1780    size += vn_sizeof_uint32_t(&val->stageCount);
1781    if (val->pStages) {
1782        size += vn_sizeof_array_size(val->stageCount);
1783        for (uint32_t i = 0; i < val->stageCount; i++)
1784            size += vn_sizeof_VkPipelineShaderStageCreateInfo(&val->pStages[i]);
1785    } else {
1786        size += vn_sizeof_array_size(0);
1787    }
1788    size += vn_sizeof_simple_pointer(val->pVertexInputState);
1789    if (val->pVertexInputState)
1790        size += vn_sizeof_VkPipelineVertexInputStateCreateInfo(val->pVertexInputState);
1791    size += vn_sizeof_simple_pointer(val->pInputAssemblyState);
1792    if (val->pInputAssemblyState)
1793        size += vn_sizeof_VkPipelineInputAssemblyStateCreateInfo(val->pInputAssemblyState);
1794    size += vn_sizeof_simple_pointer(val->pTessellationState);
1795    if (val->pTessellationState)
1796        size += vn_sizeof_VkPipelineTessellationStateCreateInfo(val->pTessellationState);
1797    size += vn_sizeof_simple_pointer(val->pViewportState);
1798    if (val->pViewportState)
1799        size += vn_sizeof_VkPipelineViewportStateCreateInfo(val->pViewportState);
1800    size += vn_sizeof_simple_pointer(val->pRasterizationState);
1801    if (val->pRasterizationState)
1802        size += vn_sizeof_VkPipelineRasterizationStateCreateInfo(val->pRasterizationState);
1803    size += vn_sizeof_simple_pointer(val->pMultisampleState);
1804    if (val->pMultisampleState)
1805        size += vn_sizeof_VkPipelineMultisampleStateCreateInfo(val->pMultisampleState);
1806    size += vn_sizeof_simple_pointer(val->pDepthStencilState);
1807    if (val->pDepthStencilState)
1808        size += vn_sizeof_VkPipelineDepthStencilStateCreateInfo(val->pDepthStencilState);
1809    size += vn_sizeof_simple_pointer(val->pColorBlendState);
1810    if (val->pColorBlendState)
1811        size += vn_sizeof_VkPipelineColorBlendStateCreateInfo(val->pColorBlendState);
1812    size += vn_sizeof_simple_pointer(val->pDynamicState);
1813    if (val->pDynamicState)
1814        size += vn_sizeof_VkPipelineDynamicStateCreateInfo(val->pDynamicState);
1815    size += vn_sizeof_VkPipelineLayout(&val->layout);
1816    size += vn_sizeof_VkRenderPass(&val->renderPass);
1817    size += vn_sizeof_uint32_t(&val->subpass);
1818    size += vn_sizeof_VkPipeline(&val->basePipelineHandle);
1819    size += vn_sizeof_int32_t(&val->basePipelineIndex);
1820    return size;
1821}
1822
1823static inline size_t
1824vn_sizeof_VkGraphicsPipelineCreateInfo(const VkGraphicsPipelineCreateInfo *val)
1825{
1826    size_t size = 0;
1827
1828    size += vn_sizeof_VkStructureType(&val->sType);
1829    size += vn_sizeof_VkGraphicsPipelineCreateInfo_pnext(val->pNext);
1830    size += vn_sizeof_VkGraphicsPipelineCreateInfo_self(val);
1831
1832    return size;
1833}
1834
1835static inline void
1836vn_encode_VkGraphicsPipelineCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
1837{
1838    const VkBaseInStructure *pnext = val;
1839
1840    while (pnext) {
1841        switch ((int32_t)pnext->sType) {
1842        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO:
1843            if (!vn_cs_renderer_protocol_has_extension(193 /* VK_EXT_pipeline_creation_feedback */))
1844                break;
1845            vn_encode_simple_pointer(enc, pnext);
1846            vn_encode_VkStructureType(enc, &pnext->sType);
1847            vn_encode_VkGraphicsPipelineCreateInfo_pnext(enc, pnext->pNext);
1848            vn_encode_VkPipelineCreationFeedbackCreateInfo_self(enc, (const VkPipelineCreationFeedbackCreateInfo *)pnext);
1849            return;
1850        case VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO:
1851            if (!vn_cs_renderer_protocol_has_extension(45 /* VK_KHR_dynamic_rendering */))
1852                break;
1853            vn_encode_simple_pointer(enc, pnext);
1854            vn_encode_VkStructureType(enc, &pnext->sType);
1855            vn_encode_VkGraphicsPipelineCreateInfo_pnext(enc, pnext->pNext);
1856            vn_encode_VkPipelineRenderingCreateInfo_self(enc, (const VkPipelineRenderingCreateInfo *)pnext);
1857            return;
1858        default:
1859            /* ignore unknown/unsupported struct */
1860            break;
1861        }
1862        pnext = pnext->pNext;
1863    }
1864
1865    vn_encode_simple_pointer(enc, NULL);
1866}
1867
1868static inline void
1869vn_encode_VkGraphicsPipelineCreateInfo_self(struct vn_cs_encoder *enc, const VkGraphicsPipelineCreateInfo *val)
1870{
1871    /* skip val->{sType,pNext} */
1872    vn_encode_VkFlags(enc, &val->flags);
1873    vn_encode_uint32_t(enc, &val->stageCount);
1874    if (val->pStages) {
1875        vn_encode_array_size(enc, val->stageCount);
1876        for (uint32_t i = 0; i < val->stageCount; i++)
1877            vn_encode_VkPipelineShaderStageCreateInfo(enc, &val->pStages[i]);
1878    } else {
1879        vn_encode_array_size(enc, 0);
1880    }
1881    if (vn_encode_simple_pointer(enc, val->pVertexInputState))
1882        vn_encode_VkPipelineVertexInputStateCreateInfo(enc, val->pVertexInputState);
1883    if (vn_encode_simple_pointer(enc, val->pInputAssemblyState))
1884        vn_encode_VkPipelineInputAssemblyStateCreateInfo(enc, val->pInputAssemblyState);
1885    if (vn_encode_simple_pointer(enc, val->pTessellationState))
1886        vn_encode_VkPipelineTessellationStateCreateInfo(enc, val->pTessellationState);
1887    if (vn_encode_simple_pointer(enc, val->pViewportState))
1888        vn_encode_VkPipelineViewportStateCreateInfo(enc, val->pViewportState);
1889    if (vn_encode_simple_pointer(enc, val->pRasterizationState))
1890        vn_encode_VkPipelineRasterizationStateCreateInfo(enc, val->pRasterizationState);
1891    if (vn_encode_simple_pointer(enc, val->pMultisampleState))
1892        vn_encode_VkPipelineMultisampleStateCreateInfo(enc, val->pMultisampleState);
1893    if (vn_encode_simple_pointer(enc, val->pDepthStencilState))
1894        vn_encode_VkPipelineDepthStencilStateCreateInfo(enc, val->pDepthStencilState);
1895    if (vn_encode_simple_pointer(enc, val->pColorBlendState))
1896        vn_encode_VkPipelineColorBlendStateCreateInfo(enc, val->pColorBlendState);
1897    if (vn_encode_simple_pointer(enc, val->pDynamicState))
1898        vn_encode_VkPipelineDynamicStateCreateInfo(enc, val->pDynamicState);
1899    vn_encode_VkPipelineLayout(enc, &val->layout);
1900    vn_encode_VkRenderPass(enc, &val->renderPass);
1901    vn_encode_uint32_t(enc, &val->subpass);
1902    vn_encode_VkPipeline(enc, &val->basePipelineHandle);
1903    vn_encode_int32_t(enc, &val->basePipelineIndex);
1904}
1905
1906static inline void
1907vn_encode_VkGraphicsPipelineCreateInfo(struct vn_cs_encoder *enc, const VkGraphicsPipelineCreateInfo *val)
1908{
1909    assert(val->sType == VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO);
1910    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO });
1911    vn_encode_VkGraphicsPipelineCreateInfo_pnext(enc, val->pNext);
1912    vn_encode_VkGraphicsPipelineCreateInfo_self(enc, val);
1913}
1914
1915/* struct VkComputePipelineCreateInfo chain */
1916
1917static inline size_t
1918vn_sizeof_VkComputePipelineCreateInfo_pnext(const void *val)
1919{
1920    const VkBaseInStructure *pnext = val;
1921    size_t size = 0;
1922
1923    while (pnext) {
1924        switch ((int32_t)pnext->sType) {
1925        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO:
1926            if (!vn_cs_renderer_protocol_has_extension(193 /* VK_EXT_pipeline_creation_feedback */))
1927                break;
1928            size += vn_sizeof_simple_pointer(pnext);
1929            size += vn_sizeof_VkStructureType(&pnext->sType);
1930            size += vn_sizeof_VkComputePipelineCreateInfo_pnext(pnext->pNext);
1931            size += vn_sizeof_VkPipelineCreationFeedbackCreateInfo_self((const VkPipelineCreationFeedbackCreateInfo *)pnext);
1932            return size;
1933        default:
1934            /* ignore unknown/unsupported struct */
1935            break;
1936        }
1937        pnext = pnext->pNext;
1938    }
1939
1940    return vn_sizeof_simple_pointer(NULL);
1941}
1942
1943static inline size_t
1944vn_sizeof_VkComputePipelineCreateInfo_self(const VkComputePipelineCreateInfo *val)
1945{
1946    size_t size = 0;
1947    /* skip val->{sType,pNext} */
1948    size += vn_sizeof_VkFlags(&val->flags);
1949    size += vn_sizeof_VkPipelineShaderStageCreateInfo(&val->stage);
1950    size += vn_sizeof_VkPipelineLayout(&val->layout);
1951    size += vn_sizeof_VkPipeline(&val->basePipelineHandle);
1952    size += vn_sizeof_int32_t(&val->basePipelineIndex);
1953    return size;
1954}
1955
1956static inline size_t
1957vn_sizeof_VkComputePipelineCreateInfo(const VkComputePipelineCreateInfo *val)
1958{
1959    size_t size = 0;
1960
1961    size += vn_sizeof_VkStructureType(&val->sType);
1962    size += vn_sizeof_VkComputePipelineCreateInfo_pnext(val->pNext);
1963    size += vn_sizeof_VkComputePipelineCreateInfo_self(val);
1964
1965    return size;
1966}
1967
1968static inline void
1969vn_encode_VkComputePipelineCreateInfo_pnext(struct vn_cs_encoder *enc, const void *val)
1970{
1971    const VkBaseInStructure *pnext = val;
1972
1973    while (pnext) {
1974        switch ((int32_t)pnext->sType) {
1975        case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO:
1976            if (!vn_cs_renderer_protocol_has_extension(193 /* VK_EXT_pipeline_creation_feedback */))
1977                break;
1978            vn_encode_simple_pointer(enc, pnext);
1979            vn_encode_VkStructureType(enc, &pnext->sType);
1980            vn_encode_VkComputePipelineCreateInfo_pnext(enc, pnext->pNext);
1981            vn_encode_VkPipelineCreationFeedbackCreateInfo_self(enc, (const VkPipelineCreationFeedbackCreateInfo *)pnext);
1982            return;
1983        default:
1984            /* ignore unknown/unsupported struct */
1985            break;
1986        }
1987        pnext = pnext->pNext;
1988    }
1989
1990    vn_encode_simple_pointer(enc, NULL);
1991}
1992
1993static inline void
1994vn_encode_VkComputePipelineCreateInfo_self(struct vn_cs_encoder *enc, const VkComputePipelineCreateInfo *val)
1995{
1996    /* skip val->{sType,pNext} */
1997    vn_encode_VkFlags(enc, &val->flags);
1998    vn_encode_VkPipelineShaderStageCreateInfo(enc, &val->stage);
1999    vn_encode_VkPipelineLayout(enc, &val->layout);
2000    vn_encode_VkPipeline(enc, &val->basePipelineHandle);
2001    vn_encode_int32_t(enc, &val->basePipelineIndex);
2002}
2003
2004static inline void
2005vn_encode_VkComputePipelineCreateInfo(struct vn_cs_encoder *enc, const VkComputePipelineCreateInfo *val)
2006{
2007    assert(val->sType == VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO);
2008    vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO });
2009    vn_encode_VkComputePipelineCreateInfo_pnext(enc, val->pNext);
2010    vn_encode_VkComputePipelineCreateInfo_self(enc, val);
2011}
2012
2013static inline size_t vn_sizeof_vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2014{
2015    const VkCommandTypeEXT cmd_type = VK_COMMAND_TYPE_vkCreateGraphicsPipelines_EXT;
2016    const VkFlags cmd_flags = 0;
2017    size_t cmd_size = vn_sizeof_VkCommandTypeEXT(&cmd_type) + vn_sizeof_VkFlags(&cmd_flags);
2018
2019    cmd_size += vn_sizeof_VkDevice(&device);
2020    cmd_size += vn_sizeof_VkPipelineCache(&pipelineCache);
2021    cmd_size += vn_sizeof_uint32_t(&createInfoCount);
2022    if (pCreateInfos) {
2023        cmd_size += vn_sizeof_array_size(createInfoCount);
2024        for (uint32_t i = 0; i < createInfoCount; i++)
2025            cmd_size += vn_sizeof_VkGraphicsPipelineCreateInfo(&pCreateInfos[i]);
2026    } else {
2027        cmd_size += vn_sizeof_array_size(0);
2028    }
2029    cmd_size += vn_sizeof_simple_pointer(pAllocator);
2030    if (pAllocator)
2031        assert(false);
2032    if (pPipelines) {
2033        cmd_size += vn_sizeof_array_size(createInfoCount);
2034        for (uint32_t i = 0; i < createInfoCount; i++)
2035            cmd_size += vn_sizeof_VkPipeline(&pPipelines[i]);
2036    } else {
2037        cmd_size += vn_sizeof_array_size(0);
2038    }
2039
2040    return cmd_size;
2041}
2042
2043static inline void vn_encode_vkCreateGraphicsPipelines(struct vn_cs_encoder *enc, VkCommandFlagsEXT cmd_flags, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2044{
2045    const VkCommandTypeEXT cmd_type = VK_COMMAND_TYPE_vkCreateGraphicsPipelines_EXT;
2046
2047    vn_encode_VkCommandTypeEXT(enc, &cmd_type);
2048    vn_encode_VkFlags(enc, &cmd_flags);
2049
2050    vn_encode_VkDevice(enc, &device);
2051    vn_encode_VkPipelineCache(enc, &pipelineCache);
2052    vn_encode_uint32_t(enc, &createInfoCount);
2053    if (pCreateInfos) {
2054        vn_encode_array_size(enc, createInfoCount);
2055        for (uint32_t i = 0; i < createInfoCount; i++)
2056            vn_encode_VkGraphicsPipelineCreateInfo(enc, &pCreateInfos[i]);
2057    } else {
2058        vn_encode_array_size(enc, 0);
2059    }
2060    if (vn_encode_simple_pointer(enc, pAllocator))
2061        assert(false);
2062    if (pPipelines) {
2063        vn_encode_array_size(enc, createInfoCount);
2064        for (uint32_t i = 0; i < createInfoCount; i++)
2065            vn_encode_VkPipeline(enc, &pPipelines[i]);
2066    } else {
2067        vn_encode_array_size(enc, 0);
2068    }
2069}
2070
2071static inline size_t vn_sizeof_vkCreateGraphicsPipelines_reply(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2072{
2073    const VkCommandTypeEXT cmd_type = VK_COMMAND_TYPE_vkCreateGraphicsPipelines_EXT;
2074    size_t cmd_size = vn_sizeof_VkCommandTypeEXT(&cmd_type);
2075
2076    VkResult ret;
2077    cmd_size += vn_sizeof_VkResult(&ret);
2078    /* skip device */
2079    /* skip pipelineCache */
2080    /* skip createInfoCount */
2081    /* skip pCreateInfos */
2082    /* skip pAllocator */
2083    if (pPipelines) {
2084        cmd_size += vn_sizeof_array_size(createInfoCount);
2085        for (uint32_t i = 0; i < createInfoCount; i++)
2086            cmd_size += vn_sizeof_VkPipeline(&pPipelines[i]);
2087    } else {
2088        cmd_size += vn_sizeof_array_size(0);
2089    }
2090
2091    return cmd_size;
2092}
2093
2094static inline VkResult vn_decode_vkCreateGraphicsPipelines_reply(struct vn_cs_decoder *dec, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2095{
2096    VkCommandTypeEXT command_type;
2097    vn_decode_VkCommandTypeEXT(dec, &command_type);
2098    assert(command_type == VK_COMMAND_TYPE_vkCreateGraphicsPipelines_EXT);
2099
2100    VkResult ret;
2101    vn_decode_VkResult(dec, &ret);
2102    /* skip device */
2103    /* skip pipelineCache */
2104    /* skip createInfoCount */
2105    /* skip pCreateInfos */
2106    /* skip pAllocator */
2107    if (vn_peek_array_size(dec)) {
2108        const uint32_t iter_count = vn_decode_array_size(dec, createInfoCount);
2109        for (uint32_t i = 0; i < iter_count; i++)
2110            vn_decode_VkPipeline(dec, &pPipelines[i]);
2111    } else {
2112        vn_decode_array_size_unchecked(dec);
2113        pPipelines = NULL;
2114    }
2115
2116    return ret;
2117}
2118
2119static inline size_t vn_sizeof_vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2120{
2121    const VkCommandTypeEXT cmd_type = VK_COMMAND_TYPE_vkCreateComputePipelines_EXT;
2122    const VkFlags cmd_flags = 0;
2123    size_t cmd_size = vn_sizeof_VkCommandTypeEXT(&cmd_type) + vn_sizeof_VkFlags(&cmd_flags);
2124
2125    cmd_size += vn_sizeof_VkDevice(&device);
2126    cmd_size += vn_sizeof_VkPipelineCache(&pipelineCache);
2127    cmd_size += vn_sizeof_uint32_t(&createInfoCount);
2128    if (pCreateInfos) {
2129        cmd_size += vn_sizeof_array_size(createInfoCount);
2130        for (uint32_t i = 0; i < createInfoCount; i++)
2131            cmd_size += vn_sizeof_VkComputePipelineCreateInfo(&pCreateInfos[i]);
2132    } else {
2133        cmd_size += vn_sizeof_array_size(0);
2134    }
2135    cmd_size += vn_sizeof_simple_pointer(pAllocator);
2136    if (pAllocator)
2137        assert(false);
2138    if (pPipelines) {
2139        cmd_size += vn_sizeof_array_size(createInfoCount);
2140        for (uint32_t i = 0; i < createInfoCount; i++)
2141            cmd_size += vn_sizeof_VkPipeline(&pPipelines[i]);
2142    } else {
2143        cmd_size += vn_sizeof_array_size(0);
2144    }
2145
2146    return cmd_size;
2147}
2148
2149static inline void vn_encode_vkCreateComputePipelines(struct vn_cs_encoder *enc, VkCommandFlagsEXT cmd_flags, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2150{
2151    const VkCommandTypeEXT cmd_type = VK_COMMAND_TYPE_vkCreateComputePipelines_EXT;
2152
2153    vn_encode_VkCommandTypeEXT(enc, &cmd_type);
2154    vn_encode_VkFlags(enc, &cmd_flags);
2155
2156    vn_encode_VkDevice(enc, &device);
2157    vn_encode_VkPipelineCache(enc, &pipelineCache);
2158    vn_encode_uint32_t(enc, &createInfoCount);
2159    if (pCreateInfos) {
2160        vn_encode_array_size(enc, createInfoCount);
2161        for (uint32_t i = 0; i < createInfoCount; i++)
2162            vn_encode_VkComputePipelineCreateInfo(enc, &pCreateInfos[i]);
2163    } else {
2164        vn_encode_array_size(enc, 0);
2165    }
2166    if (vn_encode_simple_pointer(enc, pAllocator))
2167        assert(false);
2168    if (pPipelines) {
2169        vn_encode_array_size(enc, createInfoCount);
2170        for (uint32_t i = 0; i < createInfoCount; i++)
2171            vn_encode_VkPipeline(enc, &pPipelines[i]);
2172    } else {
2173        vn_encode_array_size(enc, 0);
2174    }
2175}
2176
2177static inline size_t vn_sizeof_vkCreateComputePipelines_reply(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2178{
2179    const VkCommandTypeEXT cmd_type = VK_COMMAND_TYPE_vkCreateComputePipelines_EXT;
2180    size_t cmd_size = vn_sizeof_VkCommandTypeEXT(&cmd_type);
2181
2182    VkResult ret;
2183    cmd_size += vn_sizeof_VkResult(&ret);
2184    /* skip device */
2185    /* skip pipelineCache */
2186    /* skip createInfoCount */
2187    /* skip pCreateInfos */
2188    /* skip pAllocator */
2189    if (pPipelines) {
2190        cmd_size += vn_sizeof_array_size(createInfoCount);
2191        for (uint32_t i = 0; i < createInfoCount; i++)
2192            cmd_size += vn_sizeof_VkPipeline(&pPipelines[i]);
2193    } else {
2194        cmd_size += vn_sizeof_array_size(0);
2195    }
2196
2197    return cmd_size;
2198}
2199
2200static inline VkResult vn_decode_vkCreateComputePipelines_reply(struct vn_cs_decoder *dec, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2201{
2202    VkCommandTypeEXT command_type;
2203    vn_decode_VkCommandTypeEXT(dec, &command_type);
2204    assert(command_type == VK_COMMAND_TYPE_vkCreateComputePipelines_EXT);
2205
2206    VkResult ret;
2207    vn_decode_VkResult(dec, &ret);
2208    /* skip device */
2209    /* skip pipelineCache */
2210    /* skip createInfoCount */
2211    /* skip pCreateInfos */
2212    /* skip pAllocator */
2213    if (vn_peek_array_size(dec)) {
2214        const uint32_t iter_count = vn_decode_array_size(dec, createInfoCount);
2215        for (uint32_t i = 0; i < iter_count; i++)
2216            vn_decode_VkPipeline(dec, &pPipelines[i]);
2217    } else {
2218        vn_decode_array_size_unchecked(dec);
2219        pPipelines = NULL;
2220    }
2221
2222    return ret;
2223}
2224
2225static inline size_t vn_sizeof_vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator)
2226{
2227    const VkCommandTypeEXT cmd_type = VK_COMMAND_TYPE_vkDestroyPipeline_EXT;
2228    const VkFlags cmd_flags = 0;
2229    size_t cmd_size = vn_sizeof_VkCommandTypeEXT(&cmd_type) + vn_sizeof_VkFlags(&cmd_flags);
2230
2231    cmd_size += vn_sizeof_VkDevice(&device);
2232    cmd_size += vn_sizeof_VkPipeline(&pipeline);
2233    cmd_size += vn_sizeof_simple_pointer(pAllocator);
2234    if (pAllocator)
2235        assert(false);
2236
2237    return cmd_size;
2238}
2239
2240static inline void vn_encode_vkDestroyPipeline(struct vn_cs_encoder *enc, VkCommandFlagsEXT cmd_flags, VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator)
2241{
2242    const VkCommandTypeEXT cmd_type = VK_COMMAND_TYPE_vkDestroyPipeline_EXT;
2243
2244    vn_encode_VkCommandTypeEXT(enc, &cmd_type);
2245    vn_encode_VkFlags(enc, &cmd_flags);
2246
2247    vn_encode_VkDevice(enc, &device);
2248    vn_encode_VkPipeline(enc, &pipeline);
2249    if (vn_encode_simple_pointer(enc, pAllocator))
2250        assert(false);
2251}
2252
2253static inline size_t vn_sizeof_vkDestroyPipeline_reply(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator)
2254{
2255    const VkCommandTypeEXT cmd_type = VK_COMMAND_TYPE_vkDestroyPipeline_EXT;
2256    size_t cmd_size = vn_sizeof_VkCommandTypeEXT(&cmd_type);
2257
2258    /* skip device */
2259    /* skip pipeline */
2260    /* skip pAllocator */
2261
2262    return cmd_size;
2263}
2264
2265static inline void vn_decode_vkDestroyPipeline_reply(struct vn_cs_decoder *dec, VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator)
2266{
2267    VkCommandTypeEXT command_type;
2268    vn_decode_VkCommandTypeEXT(dec, &command_type);
2269    assert(command_type == VK_COMMAND_TYPE_vkDestroyPipeline_EXT);
2270
2271    /* skip device */
2272    /* skip pipeline */
2273    /* skip pAllocator */
2274}
2275
2276static inline void vn_submit_vkCreateGraphicsPipelines(struct vn_instance *vn_instance, VkCommandFlagsEXT cmd_flags, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines, struct vn_instance_submit_command *submit)
2277{
2278    uint8_t local_cmd_data[VN_SUBMIT_LOCAL_CMD_SIZE];
2279    void *cmd_data = local_cmd_data;
2280    size_t cmd_size = vn_sizeof_vkCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
2281    if (cmd_size > sizeof(local_cmd_data)) {
2282        cmd_data = malloc(cmd_size);
2283        if (!cmd_data)
2284            cmd_size = 0;
2285    }
2286    const size_t reply_size = cmd_flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT ? vn_sizeof_vkCreateGraphicsPipelines_reply(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines) : 0;
2287
2288    struct vn_cs_encoder *enc = vn_instance_submit_command_init(vn_instance, submit, cmd_data, cmd_size, reply_size);
2289    if (cmd_size) {
2290        vn_encode_vkCreateGraphicsPipelines(enc, cmd_flags, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
2291        vn_instance_submit_command(vn_instance, submit);
2292        if (cmd_data != local_cmd_data)
2293            free(cmd_data);
2294    }
2295}
2296
2297static inline void vn_submit_vkCreateComputePipelines(struct vn_instance *vn_instance, VkCommandFlagsEXT cmd_flags, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines, struct vn_instance_submit_command *submit)
2298{
2299    uint8_t local_cmd_data[VN_SUBMIT_LOCAL_CMD_SIZE];
2300    void *cmd_data = local_cmd_data;
2301    size_t cmd_size = vn_sizeof_vkCreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
2302    if (cmd_size > sizeof(local_cmd_data)) {
2303        cmd_data = malloc(cmd_size);
2304        if (!cmd_data)
2305            cmd_size = 0;
2306    }
2307    const size_t reply_size = cmd_flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT ? vn_sizeof_vkCreateComputePipelines_reply(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines) : 0;
2308
2309    struct vn_cs_encoder *enc = vn_instance_submit_command_init(vn_instance, submit, cmd_data, cmd_size, reply_size);
2310    if (cmd_size) {
2311        vn_encode_vkCreateComputePipelines(enc, cmd_flags, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
2312        vn_instance_submit_command(vn_instance, submit);
2313        if (cmd_data != local_cmd_data)
2314            free(cmd_data);
2315    }
2316}
2317
2318static inline void vn_submit_vkDestroyPipeline(struct vn_instance *vn_instance, VkCommandFlagsEXT cmd_flags, VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator, struct vn_instance_submit_command *submit)
2319{
2320    uint8_t local_cmd_data[VN_SUBMIT_LOCAL_CMD_SIZE];
2321    void *cmd_data = local_cmd_data;
2322    size_t cmd_size = vn_sizeof_vkDestroyPipeline(device, pipeline, pAllocator);
2323    if (cmd_size > sizeof(local_cmd_data)) {
2324        cmd_data = malloc(cmd_size);
2325        if (!cmd_data)
2326            cmd_size = 0;
2327    }
2328    const size_t reply_size = cmd_flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT ? vn_sizeof_vkDestroyPipeline_reply(device, pipeline, pAllocator) : 0;
2329
2330    struct vn_cs_encoder *enc = vn_instance_submit_command_init(vn_instance, submit, cmd_data, cmd_size, reply_size);
2331    if (cmd_size) {
2332        vn_encode_vkDestroyPipeline(enc, cmd_flags, device, pipeline, pAllocator);
2333        vn_instance_submit_command(vn_instance, submit);
2334        if (cmd_data != local_cmd_data)
2335            free(cmd_data);
2336    }
2337}
2338
2339static inline VkResult vn_call_vkCreateGraphicsPipelines(struct vn_instance *vn_instance, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2340{
2341    VN_TRACE_FUNC();
2342
2343    struct vn_instance_submit_command submit;
2344    vn_submit_vkCreateGraphicsPipelines(vn_instance, VK_COMMAND_GENERATE_REPLY_BIT_EXT, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, &submit);
2345    struct vn_cs_decoder *dec = vn_instance_get_command_reply(vn_instance, &submit);
2346    if (dec) {
2347        const VkResult ret = vn_decode_vkCreateGraphicsPipelines_reply(dec, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
2348        vn_instance_free_command_reply(vn_instance, &submit);
2349        return ret;
2350    } else {
2351        return VK_ERROR_OUT_OF_HOST_MEMORY;
2352    }
2353}
2354
2355static inline void vn_async_vkCreateGraphicsPipelines(struct vn_instance *vn_instance, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2356{
2357    struct vn_instance_submit_command submit;
2358    vn_submit_vkCreateGraphicsPipelines(vn_instance, 0, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, &submit);
2359}
2360
2361static inline VkResult vn_call_vkCreateComputePipelines(struct vn_instance *vn_instance, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2362{
2363    VN_TRACE_FUNC();
2364
2365    struct vn_instance_submit_command submit;
2366    vn_submit_vkCreateComputePipelines(vn_instance, VK_COMMAND_GENERATE_REPLY_BIT_EXT, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, &submit);
2367    struct vn_cs_decoder *dec = vn_instance_get_command_reply(vn_instance, &submit);
2368    if (dec) {
2369        const VkResult ret = vn_decode_vkCreateComputePipelines_reply(dec, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
2370        vn_instance_free_command_reply(vn_instance, &submit);
2371        return ret;
2372    } else {
2373        return VK_ERROR_OUT_OF_HOST_MEMORY;
2374    }
2375}
2376
2377static inline void vn_async_vkCreateComputePipelines(struct vn_instance *vn_instance, VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
2378{
2379    struct vn_instance_submit_command submit;
2380    vn_submit_vkCreateComputePipelines(vn_instance, 0, device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, &submit);
2381}
2382
2383static inline void vn_call_vkDestroyPipeline(struct vn_instance *vn_instance, VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator)
2384{
2385    VN_TRACE_FUNC();
2386
2387    struct vn_instance_submit_command submit;
2388    vn_submit_vkDestroyPipeline(vn_instance, VK_COMMAND_GENERATE_REPLY_BIT_EXT, device, pipeline, pAllocator, &submit);
2389    struct vn_cs_decoder *dec = vn_instance_get_command_reply(vn_instance, &submit);
2390    if (dec) {
2391        vn_decode_vkDestroyPipeline_reply(dec, device, pipeline, pAllocator);
2392        vn_instance_free_command_reply(vn_instance, &submit);
2393    }
2394}
2395
2396static inline void vn_async_vkDestroyPipeline(struct vn_instance *vn_instance, VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator)
2397{
2398    struct vn_instance_submit_command submit;
2399    vn_submit_vkDestroyPipeline(vn_instance, 0, device, pipeline, pAllocator, &submit);
2400}
2401
2402#endif /* VN_PROTOCOL_DRIVER_PIPELINE_H */
2403