-
Notifications
You must be signed in to change notification settings - Fork 0
/
vkDocs.xml
4583 lines (4583 loc) · 737 KB
/
vkDocs.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<docs>
<types>
<type name="PFN_vkAllocationFunction" summary="Application-defined memory allocation function.">
<specification />
<description>
<para>[[vkAllocationFunction_return_rules]] If pname:pfnAllocation is unable to allocate the requested memory, it must: return `NULL`. If the allocation was successful, it must: return a valid pointer to memory allocation containing at least pname:size bytes, and with the pointer value being a multiple of pname:alignment.</para>
<para>[NOTE] .Note ==== Correct Vulkan operation cannot: be assumed if the application does not follow these rules.</para>
<para>For example, pname:pfnAllocation (or pname:pfnReallocation) could cause termination of running Vulkan instance(s) on a failed allocation for debugging purposes, either directly or indirectly. In these circumstances, it cannot: be assumed that any part of any affected VkInstance objects are going to operate correctly (even flink:vkDestroyInstance), and the application must: ensure it cleans up properly via other means (e.g. process termination). ====</para>
<para>If pname:pfnAllocation returns `NULL`, and if the implementation is unable to continue correct processing of the current command without the requested allocation, it must: treat this as a run-time error, and generate ename:VK_ERROR_OUT_OF_HOST_MEMORY at the appropriate time for the command in which the condition was detected, as described in <<fundamentals-errorcodes, Return Codes>>.</para>
<para>If the implementation is able to continue correct processing of the current command without the requested allocation, then it may: do so, and must: not generate ename:VK_ERROR_OUT_OF_HOST_MEMORY as a result of this failed allocation.</para>
</description>
<members>
<member name="pUserData">pname:pUserData is the value specified for slink:VkAllocationCallbacks::pname:pUserData in the allocator specified by the application.</member>
<member name="size">pname:size is the size in bytes of the requested allocation.</member>
<member name="alignment">pname:alignment is the requested alignment of the allocation in bytes and must: be a power of two.</member>
<member name="allocationScope">pname:allocationScope is a elink:VkSystemAllocationScope value specifying the allocation scope of the lifetime of the allocation, as described <<memory-host-allocation-scope,here>>.</member>
</members>
</type>
<type name="PFN_vkDebugReportCallbackEXT" summary="Application-defined debug report callback function.">
<specification />
<description>
<para>The callback returns a basetype:VkBool32 that indicates to the calling layer if the Vulkan call should: be aborted or not. Applications should: always return ename:VK_FALSE so that they see the same behavior with and without validation layers enabled.</para>
<para>If the application returns ename:VK_TRUE from its callback and the Vulkan call being aborted returns a elink:VkResult, the layer will return ename:VK_ERROR_VALIDATION_FAILED_EXT.</para>
</description>
<members>
<member name="flags">pname:flags indicates the ename:VkDebugReportFlagBitsEXT that triggered this callback.</member>
<member name="objectType">pname:objectType is a elink:VkDebugReportObjectTypeEXT specifying the type of object being used or created at the time the event was triggered.</member>
<member name="object">pname:object gives the object where the issue was detected. pname:object may be ename:VK_NULL_HANDLE if there is no object associated with the event.</member>
<member name="location">pname:location is a component (layer, driver, loader) defined value that indicates the _location_ of the trigger. This is an optional value.</member>
<member name="messageCode">pname:messageCode is a layer-defined value indicating what test triggered this callback.</member>
<member name="pLayerPrefix">pname:pLayerPrefix is the abbreviation of the component making the callback. pname:pLayerPrefix is only valid for the duration of the callback.</member>
<member name="pMessage">pname:pMessage is a null-terminated string detailing the trigger conditions. pname:pMessage is only valid for the duration of the callback.</member>
<member name="pUserData">pname:pUserData is the user data given when the DebugReportCallback was created.</member>
</members>
</type>
<type name="PFN_vkFreeFunction" summary="Application-defined memory free function.">
<specification />
<description>
<para>pname:pMemory may: be `NULL`, which the callback must: handle safely. If pname:pMemory is non-`NULL`, it must: be a pointer previously allocated by pname:pfnAllocation or pname:pfnReallocation. The application should: free this memory.</para>
</description>
<members>
<member name="pUserData">pname:pUserData is the value specified for slink:VkAllocationCallbacks::pname:pUserData in the allocator specified by the application.</member>
<member name="pMemory">pname:pMemory is the allocation to be freed.</member>
</members>
</type>
<type name="PFN_vkInternalAllocationNotification" summary="Application-defined memory allocation notification function.">
<specification />
<description>
<para>This is a purely informational callback.</para>
</description>
<members>
<member name="pUserData">pname:pUserData is the value specified for slink:VkAllocationCallbacks::pname:pUserData in the allocator specified by the application.</member>
<member name="size">pname:size is the requested size of an allocation.</member>
<member name="allocationType">pname:allocationType is the requested type of an allocation.</member>
<member name="allocationScope">pname:allocationScope is a elink:VkSystemAllocationScope value specifying the allocation scope of the lifetime of the allocation, as described <<memory-host-allocation-scope,here>>.</member>
</members>
</type>
<type name="PFN_vkInternalFreeNotification" summary="Application-defined memory free notification function.">
<specification />
<description />
<members>
<member name="pUserData">pname:pUserData is the value specified for slink:VkAllocationCallbacks::pname:pUserData in the allocator specified by the application.</member>
<member name="size">pname:size is the requested size of an allocation.</member>
<member name="allocationType">pname:allocationType is the requested type of an allocation.</member>
<member name="allocationScope">pname:allocationScope is a elink:VkSystemAllocationScope value specifying the allocation scope of the lifetime of the allocation, as described <<memory-host-allocation-scope,here>>.</member>
</members>
</type>
<type name="PFN_vkReallocationFunction" summary="Application-defined memory reallocation function.">
<specification />
<description>
<para>pname:pfnReallocation must: return an allocation with enough space for pname:size bytes, and the contents of the original allocation from bytes zero to [eq]#min(original size, new size) - 1# must: be preserved in the returned allocation. If pname:size is larger than the old size, the contents of the additional space are undefined. If satisfying these requirements involves creating a new allocation, then the old allocation should: be freed.</para>
<para>If pname:pOriginal is `NULL`, then pname:pfnReallocation must: behave equivalently to a call to tlink:PFN_vkAllocationFunction with the same parameter values (without pname:pOriginal).</para>
<para>If pname:size is zero, then pname:pfnReallocation must: behave equivalently to a call to tlink:PFN_vkFreeFunction with the same pname:pUserData parameter value, and pname:pMemory equal to pname:pOriginal.</para>
<para>If pname:pOriginal is non-`NULL`, the implementation must: ensure that pname:alignment is equal to the pname:alignment used to originally allocate pname:pOriginal.</para>
<para>If this function fails and pname:pOriginal is non-`NULL` the application must: not free the old allocation.</para>
<para>pname:pfnReallocation must: follow the same <<vkAllocationFunction_return_rules, rules for return values as tname:PFN_vkAllocationFunction>>.</para>
</description>
<members>
<member name="pUserData">pname:pUserData is the value specified for slink:VkAllocationCallbacks::pname:pUserData in the allocator specified by the application.</member>
<member name="pOriginal">pname:pOriginal must: be either `NULL` or a pointer previously returned by pname:pfnReallocation or pname:pfnAllocation of the same allocator.</member>
<member name="size">pname:size is the size in bytes of the requested allocation.</member>
<member name="alignment">pname:alignment is the requested alignment of the allocation in bytes and must: be a power of two.</member>
<member name="allocationScope">pname:allocationScope is a elink:VkSystemAllocationScope value specifying the allocation scope of the lifetime of the allocation, as described <<memory-host-allocation-scope,here>>.</member>
</members>
</type>
<type name="PFN_vkVoidFunction" summary="Dummy function pointer type returned by queries.">
<specification />
<description />
<members />
</type>
<type name="VkAccessFlagBits" summary="Bitmask specifying memory access types that will participate in a memory dependency.">
<specification />
<description>
<para>Certain access types are only performed by a subset of pipeline stages. Any synchronization command that takes both stage masks and access masks uses both to define the <<synchronization-dependencies-access-scopes, access scopes>> - only the specified access types performed by the specified stages are included in the access scope. An application must: not specify an access flag in a synchronization command if it does not include a pipeline stage in the corresponding stage mask that is able to perform accesses of that type. The following table lists, for each access flag, which pipeline stages can: perform that type of access.</para>
<para>.Supported access types [cols="50,50",options="header"] |==== |Access flag | Supported pipeline stages |ename:VK_ACCESS_INDIRECT_COMMAND_READ_BIT | ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |ename:VK_ACCESS_INDEX_READ_BIT | ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |ename:VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |ename:VK_ACCESS_UNIFORM_READ_BIT | ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, or ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |ename:VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |ename:VK_ACCESS_SHADER_READ_BIT | ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, or ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |ename:VK_ACCESS_SHADER_WRITE_BIT | ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, or ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |ename:VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, or ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, or ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |ename:VK_ACCESS_TRANSFER_READ_BIT | ename:VK_PIPELINE_STAGE_TRANSFER_BIT |ename:VK_ACCESS_TRANSFER_WRITE_BIT | ename:VK_PIPELINE_STAGE_TRANSFER_BIT |ename:VK_ACCESS_HOST_READ_BIT | ename:VK_PIPELINE_STAGE_HOST_BIT |ename:VK_ACCESS_HOST_WRITE_BIT | ename:VK_PIPELINE_STAGE_HOST_BIT |ename:VK_ACCESS_MEMORY_READ_BIT | N/A |ename:VK_ACCESS_MEMORY_WRITE_BIT | N/A |ename:VK_ACCESS_COMMAND_PROCESS_READ_BIT_NVX | ename:VK_PIPELINE_STAGE_COMMAND_PROCESS_BIT_NVX |ename:VK_ACCESS_COMMAND_PROCESS_WRITE_BIT_NVX | ename:VK_PIPELINE_STAGE_COMMAND_PROCESS_BIT_NVX |====</para>
<para>If a memory object does not have the ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT property, then flink:vkFlushMappedMemoryRanges must: be called in order to guarantee that writes to the memory object from the host are made visible to the ename:VK_ACCESS_HOST_WRITE_BIT <<synchronization-access-types, access type>>, where it can: be further made available to the device by <<synchronization, synchronization commands>>. Similarly, flink:vkInvalidateMappedMemoryRanges must: be called to guarantee that writes which are visible to the ename:VK_ACCESS_HOST_READ_BIT <<synchronization-access-types, access type>> are made visible to host operations.</para>
<para>If the memory object does have the ename:VK_MEMORY_PROPERTY_HOST_COHERENT_BIT property flag, writes to the memory object from the host are automatically made visible to the ename:VK_ACCESS_HOST_WRITE_BIT <<synchronization-access-types,access type>>. Similarly, writes made visible to the ename:VK_ACCESS_HOST_READ_BIT <<synchronization-access-types, access type>> are automatically made visible to the host.</para>
<para>.Note [NOTE] ==== The flink:vkQueueSubmit command <<synchronization-submission-host-writes, automatically guarantees that host writes flushed to ename:VK_ACCESS_HOST_WRITE_BIT are made available>> if they were flushed before the command executed, so in most cases an explicit memory barrier is not needed for this case. In the few circumstances where a submit does not occur between the host write and the device read access, writes can: be made available by using an explicit memory barrier. ====</para>
<para>=== Framebuffer Region Dependencies</para>
<para><<synchronization-pipeline-stages, Pipeline stages>> that operate on, or with respect to, the framebuffer are collectively the _framebuffer-space_ pipeline stages. These stages are:</para>
<para>* ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT * ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT * ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT * ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT</para>
<para>For these pipeline stages, an execution or memory dependency from the first set of operations to the second set can: either be a single _framebuffer-global_ dependency, or split into multiple _framebuffer-local_ dependencies. A dependency with non-framebuffer-space pipeline stages is neither framebuffer-global nor framebuffer-local.</para>
<para>A _framebuffer region_ is a set of sample (x, y, layer, sample) coordinates that is a subset of the entire framebuffer.</para>
<para>A single framebuffer-local dependency guarantees that only for a single framebuffer region, the first set of operations and availability operations happen-before visibility operations and the second set of operations. No ordering guarantees are made between framebuffer regions for a framebuffer-local dependency.</para>
<para>A framebuffer-global dependency guarantees that the first set of operations for all framebuffer regions happens-before the second set of operations for any framebuffer region.</para>
<para>.Note [NOTE] ==== Since fragment invocations are not specified to run in any particular groupings, the size of a framebuffer region is implementation-dependent, not known to the application, and must: be assumed to be no larger than a single sample. ====</para>
<para>If a synchronization command includes a pname:dependencyFlags parameter, and specifies the ename:VK_DEPENDENCY_BY_REGION_BIT flag, then it defines framebuffer-local dependencies for the framebuffer-space pipeline stages in that synchronization command, for all framebuffer regions. If no pname:dependencyFlags parameter is included, or the ename:VK_DEPENDENCY_BY_REGION_BIT flag is not specified, then a framebuffer-global dependency is specified for those stages. The ename:VK_DEPENDENCY_BY_REGION_BIT flag does not affect the dependencies between non-framebuffer-space pipeline stages, nor does it affect the dependencies between framebuffer-space and non-framebuffer-space pipeline stages.</para>
<para>.Note [NOTE] ==== Framebuffer-local dependencies are more optimal for most architectures; particularly tile-based architectures - which can keep framebuffer-regions entirely in on-chip registers and thus avoid external bandwidth across such a dependency. Including a framebuffer-global dependency in your rendering will usually force all implementations to flush data to memory, or to a higher level cache, breaking any potential locality optimizations. ====</para>
<para>=== View-Local Dependencies</para>
<para>In a render pass instance that has <<renderpass-multiview,multiview>> enabled, dependencies can be either view-local or view-global.</para>
<para>A view-local dependency only includes operations from a single <<renderpass-multiview-view-local,source view>> from the source subpass in the first synchronization scope, and only includes operations from a single <<renderpass-multiview-view-local,destination view>> from the destination subpass in the second synchronization scope. A view-global dependency includes all views in the view mask of the source and destination subpasses in the corresponding synchronization scopes.</para>
<para>If a synchronization command includes a pname:dependencyFlags parameter and specifies the ename:VK_DEPENDENCY_VIEW_LOCAL_BIT_KHX flag, then it defines view-local dependencies for that synchronization command, for all views. If no pname:dependencyFlags parameter is included or the ename:VK_DEPENDENCY_VIEW_LOCAL_BIT_KHX flag is not specified, then a view-global dependency is specified.</para>
<para>=== Device-Local Dependencies</para>
<para>Dependencies can: be either device-local or non-device-local. A device-local dependency acts as multiple separate dependencies, one for each physical device that executes the synchronization command, where each dependency only includes operations from that physical device in both synchronization scopes. A non-device-local dependency is a single dependency where both synchronization scopes include operations from all physical devices that participate in the synchronization command. For subpass dependencies, all physical devices in the slink:VkDeviceGroupRenderPassBeginInfoKHX::pname:deviceMask participate in the dependency, and for pipeline barriers all physical devices that are set in the command buffer's current device mask participate in the dependency.</para>
<para>If a synchronization command includes a pname:dependencyFlags parameter and specifies the ename:VK_DEPENDENCY_DEVICE_GROUP_BIT_KHX flag, then it defines a non-device-local dependency for that synchronization command. If no pname:dependencyFlags parameter is included or the ename:VK_DEPENDENCY_DEVICE_GROUP_BIT_KHX flag is not specified, then it defines device-local dependencies for that synchronization command, for all participating physical devices.</para>
<para>Semaphore and event dependencies are device-local and only execute on the one physical device that performs the dependency.</para>
<para>== Implicit Synchronization Guarantees</para>
<para>A small number of implicit ordering guarantees are provided by Vulkan, ensuring that the order in which commands are submitted is meaningful, and avoiding unnecessary complexity in common operations.</para>
<para>_Submission order_ is a fundamental ordering in Vulkan, giving meaning to the order in which <<fundamentals-queueoperation-command-types, action and synchronization commands>> are recorded and submitted to a single queue. Explicit and implicit ordering guarantees between commands in Vulkan all work on the premise that this ordering is meaningful.</para>
<para>Submission order for any given set of commands is based on the order in which they were recorded to command buffers and then submitted. This order is determined as follows:</para>
<para>. The initial order is determined by the order in which flink:vkQueueSubmit commands are executed on the host, for a single queue, from first to last. . The order in which slink:VkSubmitInfo structures are specified in the pname:pSubmits parameter of flink:vkQueueSubmit, from lowest index to highest. . The order in which command buffers are specified in the pname:pCommandBuffers member of slink:VkSubmitInfo, from lowest index to highest. . The order in which commands were recorded to a command buffer on the host, from first to last: ** For commands recorded outside a render pass, this includes all other commands recorded outside a renderpass, including flink:vkCmdBeginRenderPass and flink:vkCmdEndRenderPass commands; it does not directly include commands inside a render pass. ** For commands recorded inside a render pass, this includes all other commands recorded inside the same subpass, including the flink:vkCmdBeginRenderPass and flink:vkCmdEndRenderPass commands that delimit the same renderpass instance; it does not include commands recorded to other subpasses.</para>
<para><<fundamentals-queueoperation-command-types, Action and synchronization commands>> recorded to a command buffer execute the ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT pipeline stage in <<synchronization-submission-order, submission order>> - forming an implicit execution dependency between this stage in each command.</para>
<para><<fundamentals-queueoperation-command-types, State commands>> do not execute any operations on the device, instead they set the state of the command buffer when they execute on the host, in the order that they are recorded. <<fundamentals-queueoperation-command-types, Action commands>> consume the current state of the command buffer when they are recorded, and will execute state changes on the device as required to match the recorded state.</para>
<para><<queries-order, Query commands>>, <<drawing-primitive-order, the order of primitives passing through the graphics pipeline>> and <<synchronization-image-barrier-layout-transition-order, image layout transitions as part of an image memory barrier>> provide additional guarantees based on submission order.</para>
<para>Execution of <<synchronization-pipeline-stages-order, pipeline stages>> within a given command also has a loose ordering, dependent only on a single command.</para>
<para>== Fences</para>
</description>
<members>
<member name="VK_ACCESS_INDIRECT_COMMAND_READ_BIT">ename:VK_ACCESS_INDIRECT_COMMAND_READ_BIT: Read access to an indirect command structure read as part of an indirect drawing or dispatch command.</member>
<member name="VK_ACCESS_INDEX_READ_BIT">ename:VK_ACCESS_INDEX_READ_BIT: Read access to an index buffer as part of an indexed drawing command, bound by flink:vkCmdBindIndexBuffer.</member>
<member name="VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT">ename:VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT: Read access to a vertex buffer as part of a drawing command, bound by flink:vkCmdBindVertexBuffers.</member>
<member name="VK_ACCESS_UNIFORM_READ_BIT">ename:VK_ACCESS_UNIFORM_READ_BIT: Read access to a <<descriptorsets-uniformbuffer, uniform buffer>>.</member>
<member name="VK_ACCESS_INPUT_ATTACHMENT_READ_BIT">ename:VK_ACCESS_INPUT_ATTACHMENT_READ_BIT: Read access to an <<renderpass, input attachment>> within a renderpass during fragment shading.</member>
<member name="VK_ACCESS_SHADER_READ_BIT">ename:VK_ACCESS_SHADER_READ_BIT: Read access to a <<descriptorsets-storagebuffer, storage buffer>>, <<descriptorsets-uniformtexelbuffer, uniform texel buffer>>, <<descriptorsets-storagetexelbuffer, storage texel buffer>>, <<descriptorsets-sampledimage, sampled image>>, or <<descriptorsets-storageimage, storage image>>.</member>
<member name="VK_ACCESS_SHADER_WRITE_BIT">ename:VK_ACCESS_SHADER_WRITE_BIT: Write access to a <<descriptorsets-storagebuffer, storage buffer>>, <<descriptorsets-storagetexelbuffer, storage texel buffer>>, or <<descriptorsets-storageimage, storage image>>.</member>
<member name="VK_ACCESS_COLOR_ATTACHMENT_READ_BIT">ename:VK_ACCESS_COLOR_ATTACHMENT_READ_BIT: Read access to a <<renderpass, color attachment>>, such as via <<framebuffer-blending, blending>>, <<framebuffer-logicop, logic operations>>, or via certain <<renderpass-load-store-ops, subpass load operations>>.</member>
<member name="VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT">ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT: Write access to a <<renderpass, color or resolve attachment>> during a <<renderpass, render pass>> or via certain <<renderpass-load-store-ops, subpass load and store operations>>.</member>
<member name="VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT">ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT: Read access to a <<renderpass, depth/stencil attachment>>, via <<fragops-ds-state, depth or stencil operations>> or via certain <<renderpass-load-store-ops, subpass load operations>>.</member>
<member name="VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT">ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT: Write access to a <<renderpass, depth/stencil attachment>>, via <<fragops-ds-state, depth or stencil operations>> or via certain <<renderpass-load-store-ops, subpass load and store operations>>.</member>
<member name="VK_ACCESS_TRANSFER_READ_BIT">ename:VK_ACCESS_TRANSFER_READ_BIT: Read access to an image or buffer in a <<copies, copy>> operation.</member>
<member name="VK_ACCESS_TRANSFER_WRITE_BIT">ename:VK_ACCESS_TRANSFER_WRITE_BIT: Write access to an image or buffer in a <<clears, clear>> or <<copies, copy>> operation.</member>
<member name="VK_ACCESS_HOST_READ_BIT">ename:VK_ACCESS_HOST_READ_BIT: Read access by a host operation. Accesses of this type are not performed through a resource, but directly on memory.</member>
<member name="VK_ACCESS_HOST_WRITE_BIT">ename:VK_ACCESS_HOST_WRITE_BIT: Write access by a host operation. Accesses of this type are not performed through a resource, but directly on memory.</member>
<member name="VK_ACCESS_MEMORY_READ_BIT">ename:VK_ACCESS_MEMORY_READ_BIT: Read access via non-specific entities. These entities include the Vulkan device and host, but may: also include entities external to the Vulkan device or otherwise not part of the core Vulkan pipeline. When included in a destination access mask, makes all available writes visible to all future read accesses on entities known to the Vulkan device.</member>
<member name="VK_ACCESS_MEMORY_WRITE_BIT">ename:VK_ACCESS_MEMORY_WRITE_BIT: Write access via non-specific entities. These entities include the Vulkan device and host, but may: also include entities external to the Vulkan device or otherwise not part of the core Vulkan pipeline. When included in a source access mask, all writes that are performed by entities known to the Vulkan device are made available. When included in a destination access mask, makes all available writes visible to all future write accesses on entities known to the Vulkan device.</member>
<member name="VK_ACCESS_COMMAND_PROCESS_READ_BIT_NVX">ename:VK_ACCESS_COMMAND_PROCESS_READ_BIT_NVX: Reads from sname:VkBuffer inputs to flink:vkCmdProcessCommandsNVX.</member>
<member name="VK_ACCESS_COMMAND_PROCESS_WRITE_BIT_NVX">ename:VK_ACCESS_COMMAND_PROCESS_WRITE_BIT_NVX: Writes to the target command buffer in flink:vkCmdProcessCommandsNVX.</member>
</members>
</type>
<type name="VkAcquireNextImageInfoKHX" summary="Structure specifying parameters of the acquire.">
<specification />
<description>
<para>If flink:vkAcquireNextImageKHR is used, the device mask is considered to include all physical devices in the logical device.</para>
<para>.Valid Usage **** * If pname:semaphore is not dlink:VK_NULL_HANDLE it must: be unsignaled * If pname:fence is not dlink:VK_NULL_HANDLE it must: be unsignaled and must: not be associated with any other queue command that has not yet completed execution on that queue * pname:deviceMask must: be a valid device mask * pname:deviceMask must: not be zero ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="swapchain">pname:swapchain is the swapchain from which an image is being acquired.</member>
<member name="timeout">pname:timeout indicates how long the function waits, in nanoseconds, if no image is available.</member>
<member name="semaphore">pname:semaphore is code:VK_NULL_HANDLE or a semaphore to signal.</member>
<member name="fence">pname:fence is code:VK_NULL_HANDLE or a fence to signal.</member>
<member name="deviceMask">pname:deviceMask is a mask of physical devices for which the swapchain image will be ready to use when the semaphore or fence is signaled.</member>
</members>
</type>
<type name="VkAllocationCallbacks" summary="Structure containing callback function pointers for memory allocation.">
<specification />
<description>
<para>.Valid Usage **** * pname:pfnAllocation must: be a pointer to a valid user-defined tlink:PFN_vkAllocationFunction * pname:pfnReallocation must: be a pointer to a valid user-defined tlink:PFN_vkReallocationFunction * pname:pfnFree must: be a pointer to a valid user-defined tlink:PFN_vkFreeFunction * If either of pname:pfnInternalAllocation or pname:pfnInternalFree is not `NULL`, both must: be valid callbacks ****</para>
</description>
<members>
<member name="pUserData">pname:pUserData is a value to be interpreted by the implementation of the callbacks. When any of the callbacks in sname:VkAllocationCallbacks are called, the Vulkan implementation will pass this value as the first parameter to the callback. This value can: vary each time an allocator is passed into a command, even when the same object takes an allocator in multiple commands.</member>
<member name="pfnAllocation">pname:pfnAllocation is a pointer to an application-defined memory allocation function of type tlink:PFN_vkAllocationFunction.</member>
<member name="pfnReallocation">pname:pfnReallocation is a pointer to an application-defined memory reallocation function of type tlink:PFN_vkReallocationFunction.</member>
<member name="pfnFree">pname:pfnFree is a pointer to an application-defined memory free function of type tlink:PFN_vkFreeFunction.</member>
<member name="pfnInternalAllocation">pname:pfnInternalAllocation is a pointer to an application-defined function that is called by the implementation when the implementation makes internal allocations, and it is of type tlink:PFN_vkInternalAllocationNotification.</member>
<member name="pfnInternalFree">pname:pfnInternalFree is a pointer to an application-defined function that is called by the implementation when the implementation frees internal allocations, and it is of type tlink:PFN_vkInternalFreeNotification.</member>
</members>
</type>
<type name="VkAndroidSurfaceCreateInfoKHR" summary="Structure specifying parameters of a newly created Android surface object.">
<specification />
<description>
<para>.Valid Usage **** * pname:window must: point to a valid Android code:ANativeWindow. ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="flags">pname:flags is reserved for future use.</member>
<member name="window">pname:window is a pointer to the code:ANativeWindow to associate the surface with.</member>
</members>
</type>
<type name="VkApplicationInfo" summary="Structure specifying application info.">
<specification />
<description>
<para>.Valid Usage **** * pname:apiVersion must: be zero, or otherwise it must: be a version that the implementation supports, or supports an effective substitute for ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="pApplicationName">pname:pApplicationName is a pointer to a null-terminated UTF-8 string containing the name of the application.</member>
<member name="applicationVersion">pname:applicationVersion is an unsigned integer variable containing the developer-supplied version number of the application.</member>
<member name="pEngineName">pname:pEngineName is a pointer to a null-terminated UTF-8 string containing the name of the engine (if any) used to create the application.</member>
<member name="engineVersion">pname:engineVersion is an unsigned integer variable containing the developer-supplied version number of the engine used to create the application.</member>
<member name="apiVersion">pname:apiVersion is the version of the Vulkan API against which the application expects to run, encoded as described in the <<fundamentals-versionnum,API Version Numbers and Semantics>> section. If pname:apiVersion is 0 the implementation must: ignore it, otherwise if the implementation does not support the requested pname:apiVersion it must: return ename:VK_ERROR_INCOMPATIBLE_DRIVER. The patch version number specified in pname:apiVersion is ignored when creating an instance object. Only the major and minor versions of the instance must: match those requested in pname:apiVersion.</member>
</members>
</type>
<type name="VkAttachmentDescription" summary="Structure specifying an attachment description.">
<specification />
<description />
<members>
<member name="flags">pname:flags is a bitmask describing additional properties of the attachment. Bits which can: be set include: + --</member>
</members>
</type>
<type name="VkAttachmentDescriptionFlagBits" summary="Bitmask specifying additional properties of an attachment.">
<specification />
<description />
<members />
</type>
<type name="VkAttachmentLoadOp" summary="Specify how contents of an attachment are treated at the beginning of a subpass.">
<specification />
<description />
<members />
</type>
<type name="VkAttachmentReference" summary="Structure specifying an attachment reference.">
<specification />
<description>
<para>.Valid Usage **** * pname:layout must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED or ename:VK_IMAGE_LAYOUT_PREINITIALIZED ****</para>
</description>
<members>
<member name="attachment">pname:attachment is the index of the attachment of the render pass, and corresponds to the index of the corresponding element in the pname:pAttachments array of the sname:VkRenderPassCreateInfo structure. If any color or depth/stencil attachments are ename:VK_ATTACHMENT_UNUSED, then no writes occur for those attachments.</member>
<member name="layout">pname:layout is a elink:VkImageLayout value specifying the layout the attachment uses during the subpass.</member>
</members>
</type>
<type name="VkAttachmentStoreOp" summary="Specify how contents of an attachment are treated at the end of a subpass.">
<specification />
<description>
<para>If the attachment uses a color format, then pname:loadOp and pname:storeOp are used, and pname:stencilLoadOp and pname:stencilStoreOp are ignored. If the format has depth and/or stencil components, pname:loadOp and pname:storeOp apply only to the depth data, while pname:stencilLoadOp and pname:stencilStoreOp define how the stencil data is handled. pname:loadOp and pname:stencilLoadOp define the _load operations_ that execute as part of the first subpass that uses the attachment. pname:storeOp and pname:stencilStoreOp define the _store operations_ that execute as part of the last subpass that uses the attachment.</para>
<para>The load operation for each value in an attachment used by a subpass happens-before any command recorded into that subpass reads from that value. Load operations for attachments with a depth/stencil format execute in the ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT pipeline stage. Load operations for attachments with a color format execute in the ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage.</para>
<para>Store operations for each value in an attachment used by a subpass happen-after any command recorded into that subpass writes to that value. Store operations for attachments with a depth/stencil format execute in the ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT pipeline stage. Store operations for attachments with a color format execute in the ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT pipeline stage.</para>
<para>If an attachment is not used by any subpass, then pname:loadOp, pname:storeOp, pname:stencilStoreOp, and pname:stencilLoadOp are ignored, and the attachment's memory contents will not be modified by execution of a render pass instance.</para>
<para>The load and store operations apply on the first and last use of each view in the render pass, respectively. If a view index of an attachment is not included in the view mask in any subpass that uses it, then the load and store operations are ignored, and the attachment's memory contents will not be modified by execution of a render pass instance.</para>
<para>During a render pass instance, input/color attachments with color formats that have a component size of 8, 16, or 32 bits must: be represented in the attachment's format throughout the instance. Attachments with other floating- or fixed-point color formats, or with depth components may: be represented in a format with a precision higher than the attachment format, but must: be represented with the same range. When such a component is loaded via the pname:loadOp, it will be converted into an implementation-dependent format used by the render pass. Such components must: be converted from the render pass format, to the format of the attachment, before they are resolved or stored at the end of a render pass instance via pname:storeOp. Conversions occur as described in <<fundamentals-numerics,Numeric Representation and Computation>> and <<fundamentals-fixedconv, Fixed-Point Data Conversions>>.</para>
<para>If pname:flags includes ename:VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT, then the attachment is treated as if it shares physical memory with another attachment in the same render pass. This information limits the ability of the implementation to reorder certain operations (like layout transitions and the pname:loadOp) such that it is not improperly reordered against other uses of the same physical memory via a different attachment. This is described in more detail below.</para>
<para>.Valid Usage **** * pname:finalLayout must: not be ename:VK_IMAGE_LAYOUT_UNDEFINED or ename:VK_IMAGE_LAYOUT_PREINITIALIZED ****</para>
</description>
<members />
</type>
<type name="VkBindBufferMemoryInfoKHX" summary="Structure specifying how to bind a buffer to memory.">
<specification>
<para>sname:VkBindBufferMemoryInfoKHX contains members corresponding to the parameters to flink:vkBindBufferMemory, as well as new members to control peer memory bindings.</para>
</specification>
<description>
<para>If pname:deviceIndexCount is greater than zero, then on device index [eq]#i# the buffer is attached to the instance of memory on the physical device with device index [eq]#pDeviceIndices[i]#.</para>
<para>If pname:deviceIndexCount is zero and the memory comes from a memory heap with the ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHX bit set, then it is as if pname:pDeviceIndices contains consecutive indices from zero to the number of physical devices in the logical device, minus one. In other words, by default each physical device attaches to its own instance of the memory.</para>
<para>If pname:deviceIndexCount is zero and the memory comes from a memory heap without the ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHX bit set, then it is as if pname:pDeviceIndices contains an array of zeros. In other words, by default each physical device attaches to instance zero.</para>
<para>.Valid Usage **** * All valid usage rules from flink:vkBindBufferMemory apply to the identically named members of sname:VkBindBufferMemoryInfoKHX * pname:deviceIndexCount must: either be zero or equal to the number of physical devices in the logical device * All elements of pname:pDeviceIndices must: be valid device indices * All instances of memory that are bound to must: have been allocated ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="buffer">pname:buffer is the buffer to be attached to memory.</member>
<member name="memory">pname:memory is a sname:VkDeviceMemory object describing the device memory to attach.</member>
<member name="memoryOffset">pname:memoryOffset is the start offset of the region of pname:memory which is to be bound to the buffer. The number of bytes returned in the sname:VkMemoryRequirements::pname:size member in pname:memory, starting from pname:memoryOffset bytes, will be bound to the specified buffer.</member>
<member name="deviceIndexCount">pname:deviceIndexCount is the number of elements in pname:pDeviceIndices.</member>
<member name="pDeviceIndices">pname:pDeviceIndices is a pointer to an array of device indices.</member>
</members>
</type>
<type name="VkBindImageMemoryInfoKHX" summary="Structure specifying how to bind an image to memory.">
<specification>
<para>sname:VkBindImageMemoryInfoKHX contains members corresponding to the parameters to flink:vkBindImageMemory, as well as new members to control peer memory bindings.</para>
</specification>
<description>
<para>If pname:deviceIndexCount is greater than zero, then on device index [eq]#i# the image is attached to the instance of memory on the physical device with device index [eq]#pDeviceIndices[i]#.</para>
<para>Let [eq]#N# be the number of physical devices in the logical device. If pname:SFRRectCount is greater than zero, then pname:pSFRRects is an array of [eq]#N^2^# rectangles, where the image region specified by the rectangle at element [eq]#i*N+j# in resource instance [eq]#i# is bound to memory instance [eq]#j#. The blocks of memory that are bound to each sparse image block region use an offset in memory, relative to pname:memoryOffset, computed as if the whole image were being bound to a contiguous range of memory. In other words, horizontally adjacent image blocks use consecutive blocks of memory, vertically adjacent image blocks are separated by the number of bytes per block multiplied by the width in blocks of the image, and the block at [eq]#(0,0)# corresponds to memory starting at pname:memoryOffset.</para>
<para>If pname:SFRRectCount and pname:deviceIndexCount are zero and the memory comes from a memory heap with the ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHX bit set, then it is as if pname:pDeviceIndices contains consecutive indices from zero to the number of physical devices in the logical device, minus one. In other words, by default each physical device attaches to its own instance of the memory.</para>
<para>If pname:SFRRectCount and pname:deviceIndexCount are zero and the memory comes from a memory heap without the ename:VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHX bit set, then it is as if pname:pDeviceIndices contains an array of zeros. In other words, by default each physical device attaches to instance zero.</para>
<para>.Valid Usage **** * All valid usage rules from flink:vkBindImageMemory apply to the identically named members of sname:VkBindImageMemoryInfoKHX * At least one of pname:deviceIndexCount and pname:SFRRectCount must: be zero. * pname:deviceIndexCount must: either be zero or equal to the number of physical devices in the logical device * All elements of pname:pDeviceIndices must: be valid device indices. * pname:SFRRectCount must: either be zero or equal to the number of physical devices in the logical device squared * If pname:SFRRectCount is not zero, then pname:image must: have been created with the ename:VK_IMAGE_CREATE_BIND_SFR_BIT_KHX bit set. * All elements of pname:pSFRRects must: be valid rectangles contained within the dimensions of the image * Elements of pname:pSFRRects that correspond to the same instance of the image must: not overlap and their union must: cover the entire image. * For each element of pname:pSFRRects: ** pname:offset.x must: be a multiple of the sparse image block width (sname:VkSparseImageFormatProperties::pname:imageGranularity.width) of the image ** pname:extent.width must: either be a multiple of the sparse image block width of the image, or else pname:extent.width + pname:offset.x must: equal the width of the image subresource ** pname:offset.y must: be a multiple of the sparse image block height (sname:VkSparseImageFormatProperties::pname:imageGranularity.height) of the image ** pname:extent.height must: either be a multiple of the sparse image block height of the image, or else pname:extent.height + pname:offset.y must: equal the height of the image subresource * All instances of memory that are bound must: have been allocated * If pname:image was created with a valid swapchain handle in slink:VkImageSwapchainCreateInfoKHX::pname:swapchain, then the image must: be bound to memory from that swapchain (using slink:VkBindImageMemorySwapchainInfoKHX). ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="image">pname:image is the image to be attached to memory.</member>
<member name="memory">pname:memory is a sname:VkDeviceMemory object describing the device memory to attach.</member>
<member name="memoryOffset">pname:memoryOffset is the start offset of the region of pname:memory which is to be bound to the image. If pname:SFRRectCount is zero, the number of bytes returned in the sname:VkMemoryRequirements::pname:size member in pname:memory, starting from pname:memoryOffset bytes, will be bound to the specified image.</member>
<member name="deviceIndexCount">pname:deviceIndexCount is the number of elements in pname:pDeviceIndices.</member>
<member name="pDeviceIndices">pname:pDeviceIndices is a pointer to an array of device indices.</member>
<member name="SFRRectCount">pname:SFRRectCount is the number of elements in pname:pSFRRects.</member>
<member name="pSFRRects">pname:pSFRRects is a pointer to an array of rectangles describing which regions of the image are attached to each instance of memory.</member>
</members>
</type>
<type name="VkBindImageMemorySwapchainInfoKHX" summary="Structure specifying swapchain image memory to bind to.">
<specification>
<para>If the pname:pNext list of slink:VkBindImageMemoryInfoKHX includes a sname:VkBindImageMemorySwapchainInfoKHX structure, then that structure includes a swapchain handle and image index indicating that the image will be bound to memory from that swapchain.</para>
</specification>
<description>
<para>If pname:swapchain is not `NULL`, the pname:swapchain and pname:imageIndex are used to determine the memory that the image is bound to, instead of pname:memory and pname:memoryOffset.</para>
<para>Memory can: be bound to a swapchain and use the pname:pDeviceIndices or pname:pSFRRects members of slink:VkBindImageMemoryInfoKHX.</para>
<para>.Valid Usage **** * At least one of pname:swapchain and slink:VkBindImageMemoryInfoKHX::pname:memory must: be dlink:VK_NULL_HANDLE * pname:imageIndex must: be less than the number of images in pname:swapchain ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="swapchain">pname:swapchain is dlink:VK_NULL_HANDLE or a swapchain handle.</member>
<member name="imageIndex">pname:imageIndex is an image index within pname:swapchain.</member>
</members>
</type>
<type name="VkBindSparseInfo" summary="Structure specifying a sparse binding operation.">
<specification />
<description />
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="waitSemaphoreCount">pname:waitSemaphoreCount is the number of semaphores upon which to wait before executing the sparse binding operations for the batch.</member>
<member name="pWaitSemaphores">pname:pWaitSemaphores is a pointer to an array of semaphores upon which to wait on before the sparse binding operations for this batch begin execution. If semaphores to wait on are provided, they define a <<synchronization-semaphores-waiting, semaphore wait operation>>.</member>
<member name="bufferBindCount">pname:bufferBindCount is the number of sparse buffer bindings to perform in the batch.</member>
<member name="pBufferBinds">pname:pBufferBinds is a pointer to an array of slink:VkSparseBufferMemoryBindInfo structures.</member>
<member name="imageOpaqueBindCount">pname:imageOpaqueBindCount is the number of opaque sparse image bindings to perform.</member>
<member name="pImageOpaqueBinds">pname:pImageOpaqueBinds is a pointer to an array of slink:VkSparseImageOpaqueMemoryBindInfo structures, indicating opaque sparse image bindings to perform.</member>
<member name="imageBindCount">pname:imageBindCount is the number of sparse image bindings to perform.</member>
<member name="pImageBinds">pname:pImageBinds is a pointer to an array of slink:VkSparseImageMemoryBindInfo structures, indicating sparse image bindings to perform.</member>
<member name="signalSemaphoreCount">pname:signalSemaphoreCount is the number of semaphores to be signaled once the sparse binding operations specified by the structure have completed execution.</member>
<member name="pSignalSemaphores">pname:pSignalSemaphores is a pointer to an array of semaphores which will be signaled when the sparse binding operations for this batch have completed execution. If semaphores to be signaled are provided, they define a <<synchronization-semaphores-signaling, semaphore signal operation>>.</member>
</members>
</type>
<type name="VkBlendFactor" summary="Framebuffer blending factors.">
<specification />
<description>
<para>The semantics of each enum value is described in the table below:</para>
<para>.Blend Factors [width="100%",options="header",align="center",cols="59%,28%,13%"] |==== |VkBlendFactor | RGB Blend Factors [eq]#(S~r~,S~g~,S~b~)# or [eq]#(D~r~,D~g~,D~b~)# | Alpha Blend Factor ([eq]#S~a~# or [eq]#D~a~#) |ename:VK_BLEND_FACTOR_ZERO | [eq]#(0,0,0)# | [eq]#0# |ename:VK_BLEND_FACTOR_ONE | [eq]#(1,1,1)# | [eq]#1# |ename:VK_BLEND_FACTOR_SRC_COLOR | [eq]#(R~s0~,G~s0~,B~s0~)# | [eq]#A~s0~# |ename:VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR | [eq]#(1-R~s0~,1-G~s0~,1-B~s0~)# | [eq]#1-A~s0~# |ename:VK_BLEND_FACTOR_DST_COLOR | [eq]#(R~d~,G~d~,B~d~)# | [eq]#A~d~# |ename:VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR | [eq]#(1-R~d~,1-G~d~,1-B~d~)# | [eq]#1-A~d~# |ename:VK_BLEND_FACTOR_SRC_ALPHA | [eq]#(A~s0~,A~s0~,A~s0~)# | [eq]#A~s0~# |ename:VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA | [eq]#(1-A~s0~,1-A~s0~,1-A~s0~)# | [eq]#1-A~s0~# |ename:VK_BLEND_FACTOR_DST_ALPHA | [eq]#(A~d~,A~d~,A~d~)# | [eq]#A~d~# |ename:VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA | [eq]#(1-A~d~,1-A~d~,1-A~d~)# | [eq]#1-A~d~# |ename:VK_BLEND_FACTOR_CONSTANT_COLOR | [eq]#(R~c~,G~c~,B~c~)# | [eq]#A~c~# |ename:VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR | [eq]#(1-R~c~,1-G~c~,1-B~c~)# | [eq]#1-A~c~# |ename:VK_BLEND_FACTOR_CONSTANT_ALPHA | [eq]#(A~c~,A~c~,A~c~)# | [eq]#A~c~# |ename:VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA | [eq]#(1-A~c~,1-A~c~,1-A~c~)# | [eq]#1-A~c~# |ename:VK_BLEND_FACTOR_SRC_ALPHA_SATURATE | [eq]#(f,f,f)#; [eq]#f = min(A~s0~,1-A~d~)# | [eq]#1# |ename:VK_BLEND_FACTOR_SRC1_COLOR | [eq]#(R~s1~,G~s1~,B~s1~)# | [eq]#A~s1~# |ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR | [eq]#(1-R~s1~,1-G~s1~,1-B~s1~)# | [eq]#1-A~s1~# |ename:VK_BLEND_FACTOR_SRC1_ALPHA | [eq]#(A~s1~,A~s1~,A~s1~)# | [eq]#A~s1~# |ename:VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA | [eq]#(1-A~s1~,1-A~s1~,1-A~s1~)# | [eq]#1-A~s1~# |====</para>
<para>In this table, the following conventions are used:</para>
<para>* [eq]#R~s0~,G~s0~,B~s0~# and [eq]#A~s0~# represent the first source color R, G, B, and A components, respectively, for the fragment output location corresponding to the color attachment being blended. * [eq]#R~s1~,G~s1~,B~s1~# and [eq]#A~s1~# represent the second source color R, G, B, and A components, respectively, used in dual source blending modes, for the fragment output location corresponding to the color attachment being blended. * [eq]#R~d~,G~d~,B~d~# and [eq]#A~d~# represent the R, G, B, and A components of the destination color. That is, the color currently in the corresponding color attachment for this fragment/sample. * [eq]#R~c~,G~c~,B~c~# and [eq]#A~c~# represent the blend constant R, G, B, and A components, respectively.</para>
</description>
<members />
</type>
<type name="VkBlendOp" summary="Framebuffer blending operations.">
<specification />
<description>
<para><<<</para>
<para>The semantics of each enum value is described in the table below:</para>
<para>.Blend Operations [width="100%",cols="45%,30%,25%",options="header",align="center"] |==== |VkBlendOp | RGB Components | Alpha Component</para>
<para>|ename:VK_BLEND_OP_ADD | [eq]#R = R~s0~ {times} S~r~ + R~d~ {times} D~r~# + [eq]#G = G~s0~ {times} S~g~ + G~d~ {times} D~g~# + [eq]#B = B~s0~ {times} S~b~ + B~d~ {times} D~b~# | [eq]#A = A~s0~ {times} S~a~ + A~d~ {times} D~a~#</para>
<para>|ename:VK_BLEND_OP_SUBTRACT | [eq]#R = R~s0~ {times} S~r~ - R~d~ {times} D~r~# + [eq]#G = G~s0~ {times} S~g~ - G~d~ {times} D~g~# + [eq]#B = B~s0~ {times} S~b~ - B~d~ {times} D~b~# | [eq]#A = A~s0~ {times} S~a~ - A~d~ {times} D~a~#</para>
<para>|ename:VK_BLEND_OP_REVERSE_SUBTRACT | [eq]#R = R~d~ {times} D~r~ - R~s0~ {times} S~r~# + [eq]#G = G~d~ {times} D~g~ - G~s0~ {times} S~g~# + [eq]#B = B~d~ {times} D~b~ - B~s0~ {times} S~b~# | [eq]#A = A~d~ {times} D~a~ - A~s0~ {times} S~a~#</para>
<para>|ename:VK_BLEND_OP_MIN | [eq]#R = min(R~s0~,R~d~)# + [eq]#G = min(G~s0~,G~d~)# + [eq]#B = min(B~s0~,B~d~)# | [eq]#A = min(A~s0~,A~d~)#</para>
<para>|ename:VK_BLEND_OP_MAX | [eq]#R = max(R~s0~,R~d~)# + [eq]#G = max(G~s0~,G~d~)# + [eq]#B = max(B~s0~,B~d~)# | [eq]#A = max(A~s0~,A~d~)# |====</para>
<para>In this table, the following conventions are used:</para>
<para>* [eq]#R~s0~, G~s0~, B~s0~# and [eq]#A~s0~# represent the first source color R, G, B, and A components, respectively. * [eq]#R~d~, G~d~, B~d~# and [eq]#A~d~# represent the R, G, B, and A components of the destination color. That is, the color currently in the corresponding color attachment for this fragment/sample. * [eq]#S~r~, S~g~, S~b~# and [eq]#S~a~# represent the source blend factor R, G, B, and A components, respectively. * [eq]#D~r~, D~g~, D~b~# and [eq]#D~a~# represent the destination blend factor R, G, B, and A components, respectively.</para>
<para>The blending operation produces a new set of values [eq]#R, G, B# and [eq]#A#, which are written to the framebuffer attachment. If blending is not enabled for this attachment, then [eq]#R, G, B# and [eq]#A# are assigned [eq]#R~s0~, G~s0~, B~s0~# and [eq]#A~s0~#, respectively.</para>
<para>If the color attachment is fixed-point, the components of the source and destination values and blend factors are each clamped to [eq]#[0,1]# or [eq]#[-1,1]# respectively for an unsigned normalized or signed normalized color attachment prior to evaluating the blend operations. If the color attachment is floating-point, no clamping occurs.</para>
</description>
<members />
</type>
<type name="VkBool32" summary="Vulkan boolean type.">
<specification />
<description>
<para>ename:VK_TRUE represents a boolean *True* (integer 1) value, and ename:VK_FALSE a boolean *False* (integer 0) value.</para>
<para>All values returned from a Vulkan implementation in a basetype:VkBool32 will be either ename:VK_TRUE or ename:VK_FALSE.</para>
<para>Applications must: not pass any other values than ename:VK_TRUE or ename:VK_FALSE into a Vulkan implementation where a basetype:VkBool32 is expected.</para>
</description>
<members />
</type>
<type name="VkBorderColor" summary="Specify border color used for texture lookups.">
<specification />
<description>
<para>[NOTE] .Mapping of OpenGL to Vulkan filter modes ================== pname:magFilter values of ename:VK_FILTER_NEAREST and ename:VK_FILTER_LINEAR directly correspond to code:GL_NEAREST and code:GL_LINEAR magnification filters. pname:minFilter and pname:mipmapMode combine to correspond to the similarly named OpenGL minification filter of code:GL_minFilter_MIPMAP_mipmapMode (e.g. pname:minFilter of ename:VK_FILTER_LINEAR and pname:mipmapMode of ename:VK_SAMPLER_MIPMAP_MODE_NEAREST correspond to code:GL_LINEAR_MIPMAP_NEAREST).</para>
<para>There are no Vulkan filter modes that directly correspond to OpenGL minification filters of code:GL_LINEAR or code:GL_NEAREST, but they can: be emulated using ename:VK_SAMPLER_MIPMAP_MODE_NEAREST, pname:minLod = 0, and pname:maxLod = 0.25, and using pname:minFilter = ename:VK_FILTER_LINEAR or pname:minFilter = ename:VK_FILTER_NEAREST, respectively.</para>
<para>Note that using a pname:maxLod of zero would cause <<textures-texel-filtering,magnification>> to always be performed, and the pname:magFilter to always be used. This is valid, just not an exact match for OpenGL behavior. Clamping the maximum LOD to 0.25 allows the [eq]#{lambda}# value to be non-zero and minification to be performed, while still always rounding down to the base level. If the pname:minFilter and pname:magFilter are equal, then using a pname:maxLod of zero also works. ==================</para>
<para>pname:addressModeU, pname:addressModeV, and pname:addressModeW must: each have one of the following values:</para>
</description>
<members />
</type>
<type name="VkBuffer" summary="Opaque handle to a buffer object.">
<specification>
<para>Buffers represent linear arrays of data which are used for various purposes by binding them to a graphics or compute pipeline via descriptor sets or via certain commands, or by directly specifying them as parameters to certain commands.</para>
</specification>
<description />
<members />
</type>
<type name="VkBufferCopy" summary="Structure specifying a buffer copy operation.">
<specification />
<description />
<members>
<member name="srcOffset">pname:srcOffset is the starting offset in bytes from the start of pname:srcBuffer.</member>
<member name="dstOffset">pname:dstOffset is the starting offset in bytes from the start of pname:dstBuffer.</member>
<member name="size">pname:size is the number of bytes to copy.</member>
</members>
</type>
<type name="VkBufferCreateFlagBits" summary="Bitmask specifying additional parameters of a buffer.">
<specification />
<description>
<para>See <<sparsememory-sparseresourcefeatures,Sparse Resource Features>> and <<features-features,Physical Device Features>> for details of the sparse memory features supported on a device.</para>
<para>.Valid Usage **** * pname:size must: be greater than `0` * If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT, pname:pQueueFamilyIndices must: be a pointer to an array of pname:queueFamilyIndexCount basetype:uint32_t values * If pname:sharingMode is ename:VK_SHARING_MODE_CONCURRENT, pname:queueFamilyIndexCount must: be greater than `1` * If the <<features-features-sparseBinding,sparse bindings>> feature is not enabled, pname:flags must: not contain ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT * If the <<features-features-sparseResidencyBuffer,sparse buffer residency>> feature is not enabled, pname:flags must: not contain ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT * If the <<features-features-sparseResidencyAliased,sparse aliased residency>> feature is not enabled, pname:flags must: not contain ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT * If pname:flags contains ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must: also contain ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT * If any of the handle types specified in sname:VkExternalMemoryImageCreateInfoKHX::pname:handleTypes requires dedicated allocation, as reported by flink:vkGetPhysicalDeviceExternalBufferPropertiesKHX in sname:VkExternalBufferPropertiesKHX::pname:externalMemoryProperties::pname:externalMemoryFeatures, the pname:pNext extension chain must contain an instance of sname:VkDedicatedAllocationBufferCreateInfoNV with its pname:dedicatedAllocation field set to ename:VK_TRUE. ****</para>
</description>
<members>
<member name="VK_BUFFER_CREATE_SPARSE_BINDING_BIT">ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT indicates that the buffer will be backed using sparse memory binding.</member>
<member name="VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT">ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT indicates that the buffer can: be partially backed using sparse memory binding. Buffers created with this flag must: also be created with the ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT flag.</member>
<member name="VK_BUFFER_CREATE_SPARSE_ALIASED_BIT">ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT indicates that the buffer will be backed using sparse memory binding with memory ranges that might also simultaneously be backing another buffer (or another portion of the same buffer). Buffers created with this flag must: also be created with the ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT flag.</member>
</members>
</type>
<type name="VkBufferCreateInfo" summary="Structure specifying the parameters of a newly created buffer object.">
<specification />
<description>
<para>Bits which can: be set in pname:usage are:</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="flags">pname:flags is a bitmask describing additional parameters of the buffer. See elink:VkBufferCreateFlagBits below for a description of the supported bits.</member>
<member name="size">pname:size is the size in bytes of the buffer to be created.</member>
<member name="usage">pname:usage is a bitmask describing the allowed usages of the buffer. See elink:VkBufferUsageFlagBits below for a description of the supported bits.</member>
<member name="sharingMode">pname:sharingMode is the sharing mode of the buffer when it will be accessed by multiple queue families, see elink:VkSharingMode in the <<resources-sharing,Resource Sharing>> section below for supported values.</member>
<member name="queueFamilyIndexCount">pname:queueFamilyIndexCount is the number of entries in the pname:pQueueFamilyIndices array.</member>
<member name="pQueueFamilyIndices">pname:pQueueFamilyIndices is a list of queue families that will access this buffer (ignored if pname:sharingMode is not ename:VK_SHARING_MODE_CONCURRENT).</member>
</members>
</type>
<type name="VkBufferImageCopy" summary="Structure specifying a buffer image copy operation.">
<specification />
<description>
<para>When copying to or from a depth or stencil aspect, the data in buffer memory uses a layout that is a (mostly) tightly packed representation of the depth or stencil data. Specifically:</para>
<para>* data copied to or from the stencil aspect of any depth/stencil format is tightly packed with one ename:VK_FORMAT_S8_UINT value per texel. * data copied to or from the depth aspect of a ename:VK_FORMAT_D16_UNORM or ename:VK_FORMAT_D16_UNORM_S8_UINT format is tightly packed with one ename:VK_FORMAT_D16_UNORM value per texel. * data copied to or from the depth aspect of a ename:VK_FORMAT_D32_SFLOAT or ename:VK_FORMAT_D32_SFLOAT_S8_UINT format is tightly packed with one ename:VK_FORMAT_D32_SFLOAT value per texel. * data copied to or from the depth aspect of a ename:VK_FORMAT_X8_D24_UNORM_PACK32 or ename:VK_FORMAT_D24_UNORM_S8_UINT format is packed with one 32-bit word per texel with the D24 value in the LSBs of the word, and undefined values in the eight MSBs.</para>
<para>[NOTE] .Note ==== To copy both the depth and stencil aspects of a depth/stencil format, two entries in pname:pRegions can: be used, where one specifies the depth aspect in pname:imageSubresource, and the other specifies the stencil aspect. ====</para>
<para>Because depth or stencil aspect buffer to image copies may: require format conversions on some implementations, they are not supported on queues that do not support graphics. When copying to a depth aspect, the data in buffer memory must: be in the the range [eq]#[0,1]# or undefined results occur.</para>
<para>Copies are done layer by layer starting with image layer pname:baseArrayLayer member of pname:imageSubresource. pname:layerCount layers are copied from the source image or to the destination image.</para>
<para>.Valid Usage **** * If the the calling command's sname:VkImage parameter's format is not a depth/stencil format, then pname:bufferOffset must: be a multiple of the format's element size * pname:bufferOffset must: be a multiple of `4` * pname:bufferRowLength must: be `0`, or greater than or equal to the pname:width member of pname:imageExtent * pname:bufferImageHeight must: be `0`, or greater than or equal to the pname:height member of pname:imageExtent * pname:imageOffset.x and (pname:imageExtent.width + pname:imageOffset.x) must: both be greater than or equal to `0` and less than or equal to the image subresource width * pname:imageOffset.y and (imageExtent.height + pname:imageOffset.y) must: both be greater than or equal to `0` and less than or equal to the image subresource height * If the calling command's pname:srcImage (flink:vkCmdCopyImageToBuffer) or pname:dstImage (flink:vkCmdCopyBufferToImage) is of type ename:VK_IMAGE_TYPE_1D, then pname:imageOffset.y must: be `0` and pname:imageExtent.height must: be `1`. * pname:imageOffset.z and (imageExtent.depth + pname:imageOffset.z) must: both be greater than or equal to `0` and less than or equal to the image subresource depth * If the calling command's pname:srcImage (flink:vkCmdCopyImageToBuffer) or pname:dstImage (flink:vkCmdCopyBufferToImage) is of type ename:VK_IMAGE_TYPE_1D or ename:VK_IMAGE_TYPE_2D, then pname:imageOffset.z must: be `0` and pname:imageExtent.depth must: be `1`. * If the calling command's sname:VkImage parameter is a compressed format image: ** pname:bufferRowLength must: be a multiple of the compressed texel block width ** pname:bufferImageHeight must: be a multiple of the compressed texel block height ** all members of pname:imageOffset must: be a multiple of the corresponding dimensions of the compressed texel block ** pname:bufferOffset must: be a multiple of the compressed texel block size in bytes ** pname:imageExtent.width must: be a multiple of the compressed texel block width or (pname:imageExtent.width + pname:imageOffset.x) must: equal the image subresource width ** pname:imageExtent.height must: be a multiple of the compressed texel block height or (pname:imageExtent.height + pname:imageOffset.y) must: equal the image subresource height ** pname:imageExtent.depth must: be a multiple of the compressed texel block depth or (pname:imageExtent.depth + pname:imageOffset.z) must: equal the image subresource depth * pname:bufferOffset, pname:bufferRowLength, pname:bufferImageHeight and all members of pname:imageOffset and pname:imageExtent must: respect the image transfer granularity requirements of the queue family that it will be submitted against, as described in <<devsandqueues-physical-device-enumeration,Physical Device Enumeration>> * The pname:aspectMask member of pname:imageSubresource must: specify aspects present in the calling command's sname:VkImage parameter * The pname:aspectMask member of pname:imageSubresource must: only have a single bit set * If the calling command's sname:VkImage parameter is of elink:VkImageType ename:VK_IMAGE_TYPE_3D, the pname:baseArrayLayer and pname:layerCount members of pname:imageSubresource must: be `0` and `1`, respectively * When copying to the depth aspect of an image subresource, the data in the source buffer must: be in the range [eq]#[0,1]# ****</para>
</description>
<members>
<member name="bufferOffset">pname:bufferOffset is the offset in bytes from the start of the buffer object where the image data is copied from or to.</member>
<member name="bufferRowLength">pname:bufferRowLength and pname:bufferImageHeight specify the data in buffer memory as a subregion of a larger two- or three-dimensional image, and control the addressing calculations of data in buffer memory. If either of these values is zero, that aspect of the buffer memory is considered to be tightly packed according to the pname:imageExtent.</member>
<member name="imageSubresource">pname:imageSubresource is a slink:VkImageSubresourceLayers used to specify the specific image subresources of the image used for the source or destination image data.</member>
<member name="imageOffset">pname:imageOffset selects the initial x, y, z offsets in texels of the sub-region of the source or destination image data.</member>
<member name="imageExtent">pname:imageExtent is the size in texels of the image to copy in pname:width, pname:height and pname:depth.</member>
</members>
</type>
<type name="VkBufferMemoryBarrier" summary="Structure specifying a buffer memory barrier.">
<specification />
<description>
<para>The first <<synchronization-dependencies-access-scopes, access scope>> is limited to access to memory through the specified buffer range, via access types in the <<synchronization-access-masks, source access mask>> specified by pname:srcAccessMask. If pname:srcAccessMask includes ename:VK_ACCESS_HOST_WRITE_BIT, memory writes performed by that access type are also made visible, as that access type is not performed through a resource.</para>
<para>The second <<synchronization-dependencies-access-scopes, access scope>> is limited to access to memory through the specified buffer range, via access types in the <<synchronization-access-masks, destination access mask>> specified by pname:dstAccessMask. If pname:dstAccessMask includes ename:VK_ACCESS_HOST_WRITE_BIT or ename:VK_ACCESS_HOST_READ_BIT, available memory writes are also made visible to accesses of those types, as those access types are not performed through a resource.</para>
<para>If pname:srcQueueFamilyIndex is not equal to pname:dstQueueFamilyIndex, and pname:srcQueueFamilyIndex is equal to the current queue family, then the memory barrier defines a <<synchronization-queue-transfers-release, queue family release operation>> for the specified buffer range, and the second access scope includes no access, as if pname:dstAccessMask was `0`.</para>
<para>If pname:dstQueueFamilyIndex is not equal to pname:srcQueueFamilyIndex, and pname:dstQueueFamilyIndex is equal to the current queue family, then the memory barrier defines a <<synchronization-queue-transfers-acquire, queue family acquire operation>> for the specified buffer range, and the first access scope includes no access, as if pname:srcAccessMask was `0`.</para>
<para>.Valid Usage **** * pname:offset must: be less than the size of pname:buffer * If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be greater than `0` * If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be less than or equal to than the size of pname:buffer minus pname:offset * If pname:buffer was created with a sharing mode of ename:VK_SHARING_MODE_CONCURRENT, pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex must: both be ename:VK_QUEUE_FAMILY_IGNORED * If pname:buffer was created with a sharing mode of ename:VK_SHARING_MODE_EXCLUSIVE, pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex must: either both be ename:VK_QUEUE_FAMILY_IGNORED, or both be a valid queue family (see <<devsandqueues-queueprops>>) unless one of them is ename:VK_QUEUE_FAMILY_EXTERNAL_KHX and the other is ename:VK_QUEUE_FAMILY_IGNORED. ifndef::VK_KHX_external_memory[] * If pname:buffer was created with a sharing mode of ename:VK_SHARING_MODE_EXCLUSIVE, pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex must: either both be ename:VK_QUEUE_FAMILY_IGNORED, or both be a valid queue family (see <<devsandqueues-queueprops>>). * If pname:buffer was created with a sharing mode of ename:VK_SHARING_MODE_EXCLUSIVE and pname:srcQueueFamilyIndex is ename:VK_QUEUE_FAMILY_IGNORED, pname:dstQueueFamilyIndex must: also be ename:VK_QUEUE_FAMILY_IGNORED. * If pname:buffer was created with a sharing mode of ename:VK_SHARING_MODE_EXCLUSIVE and pname:srcQueueFamilyIndex is not ename:VK_QUEUE_FAMILY_IGNORED, it must be a valid queue family or VK_QUEUE_FAMILY_EXTERNAL_KHX (see <<devsandqueues-queueprops>>). * If pname:buffer was created with a sharing mode of ename:VK_SHARING_MODE_EXCLUSIVE and pname:dstQueueFamilyIndex is not ename:VK_QUEUE_FAMILY_IGNORED, it must be a valid queue family or VK_QUEUE_FAMILY_EXTERNAL_KHX (see <<devsandqueues-queueprops>>). * If pname:buffer was created with a sharing mode of ename:VK_SHARING_MODE_EXCLUSIVE, and pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex are valid queue families, at least one of them must: be the same as the family of the queue that will execute this barrier ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="srcAccessMask">pname:srcAccessMask defines a <<synchronization-access-masks, source access mask>>.</member>
<member name="dstAccessMask">pname:dstAccessMask defines a <<synchronization-access-masks, destination access mask>>.</member>
<member name="srcQueueFamilyIndex">pname:srcQueueFamilyIndex is the source queue family for a <<synchronization-queue-transfers, queue family ownership transfer>>.</member>
<member name="dstQueueFamilyIndex">pname:dstQueueFamilyIndex is the destination queue family for a <<synchronization-queue-transfers, queue family ownership transfer>>.</member>
<member name="buffer">pname:buffer is a handle to the buffer whose backing memory is affected by the barrier.</member>
<member name="offset">pname:offset is an offset in bytes into the backing memory for pname:buffer; this is relative to the base offset as bound to the buffer (see flink:vkBindBufferMemory).</member>
<member name="size">pname:size is a size in bytes of the affected area of backing memory for pname:buffer, or ename:VK_WHOLE_SIZE to use the range from pname:offset to the end of the buffer.</member>
</members>
</type>
<type name="VkBufferUsageFlagBits" summary="Bitmask specifying allowed usage of a buffer.">
<specification />
<description>
<para>Any combination of bits can: be specified for pname:usage, but at least one of the bits must: be set in order to create a valid buffer.</para>
<para>Bits which can: be set in pname:flags are:</para>
</description>
<members>
<member name="VK_BUFFER_USAGE_TRANSFER_SRC_BIT">ename:VK_BUFFER_USAGE_TRANSFER_SRC_BIT indicates that the buffer can: be used as the source of a _transfer command_ (see the definition of <<synchronization-pipeline-stages-transfer, ename:VK_PIPELINE_STAGE_TRANSFER_BIT>>).</member>
<member name="VK_BUFFER_USAGE_TRANSFER_DST_BIT">ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT indicates that the buffer can: be used as the destination of a transfer command.</member>
<member name="VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT">ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT indicates that the buffer can: be used to create a sname:VkBufferView suitable for occupying a sname:VkDescriptorSet slot of type ename:VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER.</member>
<member name="VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT">ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT indicates that the buffer can: be used to create a sname:VkBufferView suitable for occupying a sname:VkDescriptorSet slot of type ename:VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.</member>
<member name="VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT">ename:VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT indicates that the buffer can: be used in a sname:VkDescriptorBufferInfo suitable for occupying a sname:VkDescriptorSet slot either of type ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC.</member>
<member name="VK_BUFFER_USAGE_STORAGE_BUFFER_BIT">ename:VK_BUFFER_USAGE_STORAGE_BUFFER_BIT indicates that the buffer can: be used in a sname:VkDescriptorBufferInfo suitable for occupying a sname:VkDescriptorSet slot either of type ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC.</member>
<member name="VK_BUFFER_USAGE_INDEX_BUFFER_BIT">ename:VK_BUFFER_USAGE_INDEX_BUFFER_BIT indicates that the buffer is suitable for passing as the pname:buffer parameter to fname:vkCmdBindIndexBuffer.</member>
<member name="VK_BUFFER_USAGE_VERTEX_BUFFER_BIT">ename:VK_BUFFER_USAGE_VERTEX_BUFFER_BIT indicates that the buffer is suitable for passing as an element of the pname:pBuffers array to fname:vkCmdBindVertexBuffers.</member>
<member name="VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT">ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT indicates that the buffer is suitable for passing as the pname:buffer parameter to fname:vkCmdDrawIndirect, fname:vkCmdDrawIndexedIndirect, or fname:vkCmdDispatchIndirect. It is also suitable for passing as the pname:buffer member of sname:VkIndirectCommandsTokenNVX, or pname:sequencesCountBuffer or pname:sequencesIndexBuffer member of sname:VkCmdProcessCommandsInfoNVX</member>
</members>
</type>
<type name="VkBufferView" summary="Opaque handle to a buffer view object.">
<specification>
<para>A _buffer view_ represents a contiguous range of a buffer and a specific format to be used to interpret the data. Buffer views are used to enable shaders to access buffer contents interpreted as formatted data. In order to create a valid buffer view, the buffer must: have been created with at least one of the following usage flags:</para>
<para>* ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT * ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT</para>
</specification>
<description />
<members />
</type>
<type name="VkBufferViewCreateInfo" summary="Structure specifying parameters of a newly created buffer view.">
<specification />
<description>
<para>.Valid Usage **** * pname:offset must: be less than the size of pname:buffer * pname:offset must: be a multiple of sname:VkPhysicalDeviceLimits::pname:minTexelBufferOffsetAlignment * If pname:range is not equal to ename:VK_WHOLE_SIZE: ** pname:range must: be greater than `0` ** pname:range must: be a multiple of the element size of pname:format ** pname:range divided by the element size of pname:format, must: be less than or equal to sname:VkPhysicalDeviceLimits::pname:maxTexelBufferElements ** the sum of pname:offset and pname:range must: be less than or equal to the size of pname:buffer * pname:buffer must: have been created with a pname:usage value containing at least one of ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT * If pname:buffer was created with pname:usage containing ename:VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, pname:format must: be supported for uniform texel buffers, as specified by the ename:VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT flag in sname:VkFormatProperties::pname:bufferFeatures returned by fname:vkGetPhysicalDeviceFormatProperties * If pname:buffer was created with pname:usage containing ename:VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, pname:format must: be supported for storage texel buffers, as specified by the ename:VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT flag in sname:VkFormatProperties::pname:bufferFeatures returned by fname:vkGetPhysicalDeviceFormatProperties * If pname:buffer is non-sparse then it must: be bound completely and contiguously to a single sname:VkDeviceMemory object ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="flags">pname:flags is reserved for future use.</member>
<member name="buffer">pname:buffer is a sname:VkBuffer on which the view will be created.</member>
<member name="format">pname:format is a elink:VkFormat describing the format of the data elements in the buffer.</member>
<member name="offset">pname:offset is an offset in bytes from the base address of the buffer. Accesses to the buffer view from shaders use addressing that is relative to this starting offset.</member>
<member name="range">pname:range is a size in bytes of the buffer view. If pname:range is equal to ename:VK_WHOLE_SIZE, the range from pname:offset to the end of the buffer is used. If ename:VK_WHOLE_SIZE is used and the remaining size of the buffer is not a multiple of the element size of pname:format, then the nearest smaller multiple is used.</member>
</members>
</type>
<type name="VkClearAttachment" summary="Structure specifying a clear attachment.">
<specification />
<description>
<para>No memory barriers are needed between fname:vkCmdClearAttachments and preceding or subsequent draw or attachment clear commands in the same subpass.</para>
<para>The fname:vkCmdClearAttachments command is not affected by the bound pipeline state.</para>
<para>Attachments can: also be cleared at the beginning of a render pass instance by setting pname:loadOp (or pname:stencilLoadOp) of slink:VkAttachmentDescription to ename:VK_ATTACHMENT_LOAD_OP_CLEAR, as described for flink:vkCreateRenderPass.</para>
<para>.Valid Usage **** * If pname:aspectMask includes ename:VK_IMAGE_ASPECT_COLOR_BIT, it must: not include ename:VK_IMAGE_ASPECT_DEPTH_BIT or ename:VK_IMAGE_ASPECT_STENCIL_BIT * pname:aspectMask must: not include ename:VK_IMAGE_ASPECT_METADATA_BIT * pname:clearValue must: be a valid sname:VkClearValue union ****</para>
</description>
<members>
<member name="aspectMask">pname:aspectMask is a mask selecting the color, depth and/or stencil aspects of the attachment to be cleared. pname:aspectMask can: include ename:VK_IMAGE_ASPECT_COLOR_BIT for color attachments, ename:VK_IMAGE_ASPECT_DEPTH_BIT for depth/stencil attachments with a depth component, and ename:VK_IMAGE_ASPECT_STENCIL_BIT for depth/stencil attachments with a stencil component. If the subpass's depth/stencil attachment is ename:VK_ATTACHMENT_UNUSED, then the clear has no effect.</member>
<member name="colorAttachment">pname:colorAttachment is only meaningful if ename:VK_IMAGE_ASPECT_COLOR_BIT is set in pname:aspectMask, in which case it is an index to the pname:pColorAttachments array in the slink:VkSubpassDescription structure of the current subpass which selects the color attachment to clear. If pname:colorAttachment is ename:VK_ATTACHMENT_UNUSED then the clear has no effect.</member>
<member name="clearValue">pname:clearValue is the color or depth/stencil value to clear the attachment to, as described in <<clears-values,Clear Values>> below.</member>
</members>
</type>
<type name="VkClearColorValue" summary="Structure specifying a clear color value.">
<specification />
<description>
<para>The four array elements of the clear color map to R, G, B, and A components of image formats, in order.</para>
<para>If the image has more than one sample, the same value is written to all samples for any pixels being cleared.</para>
</description>
<members>
<member name="float32">pname:float32 are the color clear values when the format of the image or attachment is one of the formats in the <<features-formats-numericformat, Interpretation of Numeric Format>> table other than signed integer (etext:SINT) or unsigned integer (etext:UINT). Floating point values are automatically converted to the format of the image, with the clear value being treated as linear if the image is sRGB.</member>
<member name="int32">pname:int32 are the color clear values when the format of the image or attachment is signed integer (etext:SINT). Signed integer values are converted to the format of the image by casting to the smaller type (with negative 32-bit values mapping to negative values in the smaller type). If the integer clear value is not representable in the target type (e.g. would overflow in conversion to that type), the clear value is undefined.</member>
<member name="uint32">pname:uint32 are the color clear values when the format of the image or attachment is unsigned integer (etext:UINT). Unsigned integer values are converted to the format of the image by casting to the integer type with fewer bits.</member>
</members>
</type>
<type name="VkClearDepthStencilValue" summary="Structure specifying a clear depth stencil value.">
<specification />
<description>
<para>.Valid Usage **** * pname:depth must: be between `0.0` and `1.0`, inclusive ****</para>
</description>
<members>
<member name="depth">pname:depth is the clear value for the depth aspect of the depth/stencil attachment. It is a floating-point value which is automatically converted to the attachment's format.</member>
<member name="stencil">pname:stencil is the clear value for the stencil aspect of the depth/stencil attachment. It is a 32-bit integer value which is converted to the attachment's format by taking the appropriate number of LSBs.</member>
</members>
</type>
<type name="VkClearRect" summary="Structure specifying a clear rectangle.">
<specification />
<description>
<para>The layers [eq]#[pname:baseArrayLayer, pname:baseArrayLayer {plus} pname:layerCount)# counting from the base layer of the attachment image view are cleared.</para>
</description>
<members>
<member name="rect">pname:rect is the two-dimensional region to be cleared.</member>
<member name="baseArrayLayer">pname:baseArrayLayer is the first layer to be cleared.</member>
<member name="layerCount">pname:layerCount is the number of layers to clear.</member>
</members>
</type>
<type name="VkClearValue" summary="Structure specifying a clear value.">
<specification />
<description>
<para>This union is used where part of the API requires either color or depth/stencil clear values, depending on the attachment, and defines the initial clear values in the slink:VkRenderPassBeginInfo structure.</para>
<para>.Valid Usage **** * pname:depthStencil must: be a valid sname:VkClearDepthStencilValue structure ****</para>
</description>
<members>
<member name="color">pname:color specifies the color image clear values to use when clearing a color image or attachment.</member>
<member name="depthStencil">pname:depthStencil specifies the depth and stencil clear values to use when clearing a depth/stencil image or attachment.</member>
</members>
</type>
<type name="VkCmdProcessCommandsInfoNVX" summary="Structure specifying parameters for the generation of commands.">
<specification />
<description>
<para>.Valid Usage **** * The provided pname:objectTable must: include all objects referenced by the generation process. * pname:indirectCommandsTokenCount must match the pname:indirectCommandsLayout's tokenCount. * The pname:tokenType member of each entry in the pname:pIndirectCommandsTokens array must match the values used at creation time of pname:indirectCommandsLayout * If pname:targetCommandBuffer is provided, it must have reserved command space. * If pname:targetCommandBuffer is provided, the pname:objectTable must: match the reservation's objectTable and must: have had all referenced objects registered at reservation time. * If pname:targetCommandBuffer is provided, the pname:indirectCommandsLayout must: match the reservation's indirectCommandsLayout. * If pname:targetCommandBuffer is provided, the pname:maxSequencesCount must: not exceed the reservation's maxSequencesCount. * If pname:sequencesCountBuffer is used, its usage flag must: have ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set. * If pname:sequencesCountBuffer is used, pname:sequencesCountOffset must be aligned to sname:VkDeviceGeneratedCommandsLimitsNVX::pname:minSequenceCountBufferOffsetAlignment. * If pname:sequencesIndexBuffer is used, its usage flag must: have ename:VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set. * If pname:sequencesIndexBuffer is used, pname:sequencesIndexOffset must be aligned to sname:VkDeviceGeneratedCommandsLimitsNVX::pname:minSequenceIndexBufferOffsetAlignment. ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="objectTable">pname:objectTable is the sname:VkObjectTableNVX to be used for the generation process. Only registered objects at the time flink:vkCmdReserveSpaceForCommandsNVX is called, will be taken into account for the reservation.</member>
<member name="indirectCommandsLayout">pname:indirectCommandsLayout is the sname:VkIndirectCommandsLayoutNVX that provides the command sequence to generate.</member>
<member name="indirectCommandsTokenCount">pname:indirectCommandsTokenCount defines the number of input tokens used.</member>
<member name="pIndirectCommandsTokens">pname:pIndirectCommandsTokens provides an array of slink:VkIndirectCommandsTokenNVX that reference the input data for each token command.</member>
<member name="maxSequencesCount">pname:maxSequencesCount is the maximum number of sequences for which command buffer space will be reserved. If pname:sequencesCountBuffer is dlink:VK_NULL_HANDLE, this is also the actual number of sequences generated.</member>
<member name="targetCommandBuffer">pname:targetCommandBuffer can: be the secondary sname:VkCommandBuffer in which the commands should be recorded. If pname:targetCommandBuffer is `NULL` an implicit reservation as well as execution takes place on the processing sname:VkCommandBuffer.</member>
<member name="sequencesCountBuffer">pname:sequencesCountBuffer can: be sname:VkBuffer from which the actual amount of sequences is sourced from as ftext:uint32_t value.</member>
<member name="sequencesCountOffset">pname:sequencesCountOffset is the byte offset into pname:sequencesCountBuffer where the count value is stored.</member>
<member name="sequencesIndexBuffer">pname:sequencesIndexBuffer must: be set if pname:indirectCommandsLayout's ename:VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT is set and provides the used sequence indices as ftext:uint32_t array. Otherwise it must: be dlink:VK_NULL_HANDLE.</member>
<member name="sequencesIndexOffset">pname:sequencesIndexOffset is the byte offset into pname:sequencesIndexBuffer where the index values start.</member>
</members>
</type>
<type name="VkCmdReserveSpaceForCommandsInfoNVX" summary="Structure specifying parameters for the reservation of command buffer space.">
<specification />
<description />
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="objectTable">pname:objectTable is the sname:VkObjectTableNVX to be used for the generation process. Only registered objects at the time flink:vkCmdReserveSpaceForCommandsNVX is called, will be taken into account for the reservation.</member>
<member name="indirectCommandsLayout">pname:indirectCommandsLayout is the sname:VkIndirectCommandsLayoutNVX that must: also be used at generation time.</member>
<member name="maxSequencesCount">pname:maxSequencesCount is the maximum number of sequences for which command buffer space will be reserved.</member>
</members>
</type>
<type name="VkColorComponentFlagBits" summary="Bitmask controlling which components are written to the framebuffer.">
<specification />
<description>
<para>If ename:VK_COLOR_COMPONENT_R_BIT is set, then the [eq]#R# value is written to color attachment for the appropriate sample, otherwise the value in memory is unmodified. The ename:VK_COLOR_COMPONENT_G_BIT, ename:VK_COLOR_COMPONENT_B_BIT, and ename:VK_COLOR_COMPONENT_A_BIT bits similarly control writing of the [eq]#G, B,# and [eq]#A# values. The pname:colorWriteMask is applied regardless of whether blending is enabled.</para>
</description>
<members />
</type>
<type name="VkColorSpaceKHR" summary="Supported color space of the presentation engine.">
<specification />
<description>
<para>The color components of Non-linear color space swap chain images have had the appropriate transfer function applied. Vulkan requires that all implementations support the sRGB OETF and EOTF transfer functions when using an SRGB pixel format. Other transfer functions, such as SMPTE 170M, must not: be performed by the implementation, but can: be performed by the application shader.</para>
<para>If pname:pSurfaceFormats includes an entry whose value for pname:colorSpace is ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR and whose value for pname:format is a UNORM (or SRGB) format and the corresponding SRGB (or UNORM) format is a color renderable format for ename:VK_IMAGE_TILING_OPTIMAL, then pname:pSurfaceFormats must: also contain an entry with the same value for pname:colorSpace and pname:format equal to the corresponding SRGB (or UNORM) format.</para>
<para>[NOTE] .Note ==== If pname:pSurfaceFormats includes just one entry, whose value for pname:format is ename:VK_FORMAT_UNDEFINED, pname:surface has no preferred format. In this case, the application can: use any valid ename:VkFormat value. ====</para>
<para>[NOTE] .Note ==== In the initial release of the +VK_KHR_surface+ and +VK_KHR_swapchain+ extensions, the token ename:VK_COLORSPACE_SRGB_NONLINEAR_KHR was used. Starting in the May 13, 2016 updates to the extension branches, matching release 1.0.13 of the core API specification, ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR is used instead for consistency with Vulkan naming rules. The older enum is still available for backwards compatibility. ====</para>
</description>
<members>
<member name="VK_COLOR_SPACE_SRGB_NONLINEAR_KHR">ename:VK_COLOR_SPACE_SRGB_NONLINEAR_KHR: The presentation engine supports the sRGB color space.</member>
<member name="VK_COLOR_SPACE_SCRGB_LINEAR_EXT">* ename:VK_COLOR_SPACE_SCRGB_LINEAR_EXT - supports the scRGB color space and applies a linear OETF.</member>
<member name="VK_COLOR_SPACE_SCRGB_NONLINEAR_EXT">* ename:VK_COLOR_SPACE_SCRGB_NONLINEAR_EXT - supports the scRGB color space and applies the scRGB OETF.</member>
<member name="VK_COLOR_SPACE_DCI_P3_LINEAR_EXT">* ename:VK_COLOR_SPACE_DCI_P3_LINEAR_EXT - supports the DCI-P3 color space and applies a linear OETF.</member>
<member name="VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT">* ename:VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT - supports the DCI-P3 color space and applies the Gamma 2.6 OETF.</member>
<member name="VK_COLOR_SPACE_BT709_LINEAR_EXT">* ename:VK_COLOR_SPACE_BT709_LINEAR_EXT - supports the BT709 color space and applies a linear OETF.</member>
<member name="VK_COLOR_SPACE_BT709_NONLINEAR_EXT">* ename:VK_COLOR_SPACE_BT709_NONLINEAR_EXT - supports the BT709 color space and applies the SMPTE 170M OETF.</member>
<member name="VK_COLOR_SPACE_BT2020_LINEAR_EXT">* ename:VK_COLOR_SPACE_BT2020_LINEAR_EXT - supports the BT2020 color space and applies a linear OETF.</member>
<member name="VK_COLOR_SPACE_BT2020_NONLINEAR_EXT">* ename:VK_COLOR_SPACE_BT2020_NONLINEAR_EXT - supports the BT2020 color space and applies the SMPTE 170M OETF.</member>
<member name="VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT">* ename:VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT - supports the AdobeRGB color space and applies a linear OETF.</member>
<member name="VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT">* ename:VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT - supports the AdobeRGB color space and applies the Gamma 2.2 OETF.</member>
</members>
</type>
<type name="VkCommandBuffer" summary="Opaque handle to a command buffer object.">
<specification>
<para>Command buffers are objects used to record commands which can: be subsequently submitted to a device queue for execution. There are two levels of command buffers - _primary command buffers_, which can: execute secondary command buffers, and which are submitted to queues, and _secondary command buffers_, which can: be executed by primary command buffers, and which are not directly submitted to queues.</para>
</specification>
<description />
<members />
</type>
<type name="VkCommandBufferAllocateInfo" summary="Structure specifying the allocation parameters for command buffer object.">
<specification />
<description />
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="commandPool">pname:commandPool is the command pool from which the command buffers are allocated.</member>
<member name="level">pname:level determines whether the command buffers are primary or secondary command buffers. Possible values include: + --</member>
</members>
</type>
<type name="VkCommandBufferBeginInfo" summary="Structure specifying a command buffer begin operation.">
<specification />
<description />
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="flags">pname:flags is a bitmask indicating usage behavior for the command buffer. Bits which can: be set include: + --</member>
</members>
</type>
<type name="VkCommandBufferInheritanceInfo" summary="Structure specifying command buffer inheritance info.">
<specification />
<description>
<para>.Valid Usage **** * If the <<features-features-inheritedQueries,inherited queries>> feature is not enabled, pname:occlusionQueryEnable must: be ename:VK_FALSE * If the <<features-features-inheritedQueries,inherited queries>> feature is enabled, pname:queryFlags must: be a valid combination of elink:VkQueryControlFlagBits values * If the <<features-features-pipelineStatisticsQuery,pipeline statistics queries>> feature is not enabled, pname:pipelineStatistics must: be code:0 ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="renderPass">pname:renderPass is a sname:VkRenderPass object defining which render passes the sname:VkCommandBuffer will be <<renderpass-compatibility, compatible>> with and can: be executed within. If the sname:VkCommandBuffer will not be executed within a render pass instance, pname:renderPass is ignored.</member>
<member name="subpass">pname:subpass is the index of the subpass within the render pass instance that the sname:VkCommandBuffer will be executed within. If the sname:VkCommandBuffer will not be executed within a render pass instance, pname:subpass is ignored.</member>
<member name="framebuffer">pname:framebuffer optionally refers to the sname:VkFramebuffer object that the sname:VkCommandBuffer will be rendering to if it is executed within a render pass instance. It can: be dlink:VK_NULL_HANDLE if the framebuffer is not known, or if the sname:VkCommandBuffer will not be executed within a render pass instance. + [NOTE] .Note ==== Specifying the exact framebuffer that the secondary command buffer will be executed with may: result in better performance at command buffer execution time. ====</member>
<member name="occlusionQueryEnable">pname:occlusionQueryEnable indicates whether the command buffer can: be executed while an occlusion query is active in the primary command buffer. If this is ename:VK_TRUE, then this command buffer can: be executed whether the primary command buffer has an occlusion query active or not. If this is ename:VK_FALSE, then the primary command buffer must: not have an occlusion query active.</member>
<member name="queryFlags">pname:queryFlags indicates the query flags that can: be used by an active occlusion query in the primary command buffer when this secondary command buffer is executed. If this value includes the ename:VK_QUERY_CONTROL_PRECISE_BIT bit, then the active query can: return boolean results or actual sample counts. If this bit is not set, then the active query must: not use the ename:VK_QUERY_CONTROL_PRECISE_BIT bit.</member>
<member name="pipelineStatistics">pname:pipelineStatistics indicates the set of pipeline statistics that can: be counted by an active query in the primary command buffer when this secondary command buffer is executed. If this value includes a given bit, then this command buffer can: be executed whether the primary command buffer has a pipeline statistics query active that includes this bit or not. If this value excludes a given bit, then the active pipeline statistics query must: not be from a query pool that counts that statistic.</member>
</members>
</type>
<type name="VkCommandBufferLevel" summary="Structure specifying a command buffer level.">
<specification />
<description>
<para>.Valid Usage **** * pname:commandBufferCount must: be greater than `0` ****</para>
</description>
<members />
</type>
<type name="VkCommandBufferResetFlagBits" summary="Bitmask controlling behavior of a command buffer reset.">
<specification />
<description>
<para>.Valid Usage **** * pname:commandBuffer must: not currently be pending execution * pname:commandBuffer must: have been allocated from a pool that was created with the ename:VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT ****</para>
</description>
<members />
</type>
<type name="VkCommandBufferUsageFlagBits" summary="Bitmask specifying usage behavior for command buffer.">
<specification />
<description>
<para>.Valid Usage **** * If pname:flags contains ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the pname:renderPass member of pname:pInheritanceInfo must: be a valid sname:VkRenderPass * If pname:flags contains ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the pname:subpass member of pname:pInheritanceInfo must: be a valid subpass index within the pname:renderPass member of pname:pInheritanceInfo * If pname:flags contains ename:VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the pname:framebuffer member of pname:pInheritanceInfo must: be either dlink:VK_NULL_HANDLE, or a valid sname:VkFramebuffer that is compatible with the pname:renderPass member of pname:pInheritanceInfo ****</para>
</description>
<members />
</type>
<type name="VkCommandPool" summary="Opaque handle to a command pool object.">
<specification>
<para>Command pools are opaque objects that command buffer memory is allocated from, and which allow the implementation to amortize the cost of resource creation across multiple command buffers. Command pools are externally synchronized, meaning that a command pool must: not be used concurrently in multiple threads. That includes use via recording commands on any command buffers allocated from the pool, as well as operations that allocate, free, and reset command buffers or the pool itself.</para>
</specification>
<description />
<members />
</type>
<type name="VkCommandPoolCreateFlagBits" summary="Bitmask specifying usage behavior for a command pool.">
<specification />
<description>
<para>.Valid Usage **** * pname:queueFamilyIndex must: be the index of a queue family available in the calling command's pname:device parameter ****</para>
</description>
<members />
</type>
<type name="VkCommandPoolCreateInfo" summary="Structure specifying parameters of a newly created command pool.">
<specification />
<description />
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="flags">pname:flags is a bitmask indicating usage behavior for the pool and command buffers allocated from it. Bits which can: be set include: + --</member>
</members>
</type>
<type name="VkCommandPoolResetFlagBits" summary="Bitmask controlling behavior of a command pool reset.">
<specification />
<description>
<para>Resetting a command pool recycles all of the resources from all of the command buffers allocated from the command pool back to the command pool. All command buffers that have been allocated from the command pool are put in the initial state.</para>
<para>.Valid Usage **** * All sname:VkCommandBuffer objects allocated from pname:commandPool must: not currently be pending execution ****</para>
</description>
<members />
</type>
<type name="VkCompareOp" summary="Stencil comparison function.">
<specification />
<description />
<members>
<member name="VK_COMPARE_OP_NEVER">ename:VK_COMPARE_OP_NEVER: the test never passes.</member>
<member name="VK_COMPARE_OP_LESS">ename:VK_COMPARE_OP_LESS: the test passes when [eq]#R < S#.</member>
<member name="VK_COMPARE_OP_EQUAL">ename:VK_COMPARE_OP_EQUAL: the test passes when [eq]#R = S#.</member>
<member name="VK_COMPARE_OP_LESS_OR_EQUAL">ename:VK_COMPARE_OP_LESS_OR_EQUAL: the test passes when [eq]#R {leq} S#.</member>
<member name="VK_COMPARE_OP_GREATER">ename:VK_COMPARE_OP_GREATER: the test passes when [eq]#R > S#.</member>
<member name="VK_COMPARE_OP_NOT_EQUAL">ename:VK_COMPARE_OP_NOT_EQUAL: the test passes when [eq]#R {neq} S#.</member>
<member name="VK_COMPARE_OP_GREATER_OR_EQUAL">ename:VK_COMPARE_OP_GREATER_OR_EQUAL: the test passes when [eq]#R {geq} S#.</member>
<member name="VK_COMPARE_OP_ALWAYS">ename:VK_COMPARE_OP_ALWAYS: the test always passes.</member>
</members>
</type>
<type name="VkComponentMapping" summary="Structure specifying a color component mapping.">
<specification />
<description>
<para>Each of pname:r, pname:g, pname:b, and pname:a is one of the values:</para>
</description>
<members>
<member name="r">pname:r determines the component value placed in the R component of the output vector.</member>
<member name="g">pname:g determines the component value placed in the G component of the output vector.</member>
<member name="b">pname:b determines the component value placed in the B component of the output vector.</member>
<member name="a">pname:a determines the component value placed in the A component of the output vector.</member>
</members>
</type>
<type name="VkComponentSwizzle" summary="Specify how a component is swizzled.">
<specification />
<description>
<para>Setting the identity swizzle on a component is equivalent to setting the identity mapping on that component. That is:</para>
<para>.Component Mappings Equivalent To ename:VK_COMPONENT_SWIZZLE_IDENTITY [options="header"] |==== | Component | Identity Mapping | pname:components.r | ename:VK_COMPONENT_SWIZZLE_R | pname:components.g | ename:VK_COMPONENT_SWIZZLE_G | pname:components.b | ename:VK_COMPONENT_SWIZZLE_B | pname:components.a | ename:VK_COMPONENT_SWIZZLE_A |====</para>
</description>
<members>
<member name="VK_COMPONENT_SWIZZLE_IDENTITY">ename:VK_COMPONENT_SWIZZLE_IDENTITY: the component is set to the identity swizzle.</member>
<member name="VK_COMPONENT_SWIZZLE_ZERO">ename:VK_COMPONENT_SWIZZLE_ZERO: the component is set to zero.</member>
<member name="VK_COMPONENT_SWIZZLE_ONE">ename:VK_COMPONENT_SWIZZLE_ONE: the component is set to either 1 or 1.0 depending on whether the type of the image view format is integer or floating-point respectively, as determined by the <<features-formats-definition,Format Definition>> section for each elink:VkFormat.</member>
<member name="VK_COMPONENT_SWIZZLE_R">ename:VK_COMPONENT_SWIZZLE_R: the component is set to the value of the R component of the image.</member>
<member name="VK_COMPONENT_SWIZZLE_G">ename:VK_COMPONENT_SWIZZLE_G: the component is set to the value of the G component of the image.</member>
<member name="VK_COMPONENT_SWIZZLE_B">ename:VK_COMPONENT_SWIZZLE_B: the component is set to the value of the B component of the image.</member>
<member name="VK_COMPONENT_SWIZZLE_A">ename:VK_COMPONENT_SWIZZLE_A: the component is set to the value of the A component of the image.</member>
</members>
</type>
<type name="VkCompositeAlphaFlagBitsKHR" summary="Alpha compositing modes supported on a device.">
<specification />
<description />
<members>
<member name="VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR">ename:VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR: The alpha channel, if it exists, of the images is ignored in the compositing process. Instead, the image is treated as if it has a constant alpha of 1.0.</member>
<member name="VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR">ename:VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR: The alpha channel, if it exists, of the images is respected in the compositing process. The non-alpha channels of the image are expected to already be multiplied by the alpha channel by the application.</member>
<member name="VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR">ename:VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR: The alpha channel, if it exists, of the images is respected in the compositing process. The non-alpha channels of the image are not expected to already be multiplied by the alpha channel by the application; instead, the compositor will multiply the non-alpha channels of the image by the alpha channel during compositing.</member>
<member name="VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR">ename:VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR: The way in which the presentation engine treats the alpha channel in the images is unknown to the Vulkan API. Instead, the application is responsible for setting the composite alpha blending mode using native window system commands. If the application does not set the blending mode using native window system commands, then a platform-specific default will be used.</member>
</members>
</type>
<type name="VkComputePipelineCreateInfo" summary="Structure specifying parameters of a newly created compute pipeline.">
<specification />
<description>
<para>The parameters pname:basePipelineHandle and pname:basePipelineIndex are described in more detail in <<pipelines-pipeline-derivatives,Pipeline Derivatives>>.</para>
<para>pname:stage points to a structure of type sname:VkPipelineShaderStageCreateInfo.</para>
<para>.Valid Usage **** * If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and pname:basePipelineIndex is -1, pname:basePipelineHandle must: be a valid handle to a compute sname:VkPipeline * If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and pname:basePipelineHandle is dlink:VK_NULL_HANDLE, pname:basePipelineIndex must: be a valid index into the calling command's pname:pCreateInfos parameter * If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and pname:basePipelineIndex is not -1, pname:basePipelineHandle must: be dlink:VK_NULL_HANDLE * If pname:flags contains the ename:VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and pname:basePipelineHandle is not dlink:VK_NULL_HANDLE, pname:basePipelineIndex must: be -1 * The pname:stage member of pname:stage must: be ename:VK_SHADER_STAGE_COMPUTE_BIT * The shader code for the entry point identified by pname:stage and the rest of the state identified by this structure must: adhere to the pipeline linking rules described in the <<interfaces,Shader Interfaces>> chapter * pname:layout must: be <<descriptorsets-pipelinelayout-consistency,consistent>> with the layout of the compute shader specified in pname:stage ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="flags">pname:flags provides options for pipeline creation, and is of type elink:VkPipelineCreateFlagBits.</member>
<member name="stage">pname:stage is a slink:VkPipelineShaderStageCreateInfo describing the compute shader.</member>
<member name="layout">pname:layout is the description of binding locations used by both the pipeline and descriptor sets used with the pipeline.</member>
<member name="basePipelineHandle">pname:basePipelineHandle is a pipeline to derive from</member>
<member name="basePipelineIndex">pname:basePipelineIndex is an index into the pname:pCreateInfos parameter to use as a pipeline to derive from</member>
</members>
</type>
<type name="VkCopyDescriptorSet" summary="Structure specifying a copy descriptor set operation.">
<specification />
<description>
<para>.Valid Usage **** * pname:srcBinding must: be a valid binding within pname:srcSet * The sum of pname:srcArrayElement and pname:descriptorCount must: be less than or equal to the number of array elements in the descriptor set binding specified by pname:srcBinding, and all applicable consecutive bindings, as described by <<descriptorsets-updates-consecutive>> * pname:dstBinding must: be a valid binding within pname:dstSet * The sum of pname:dstArrayElement and pname:descriptorCount must: be less than or equal to the number of array elements in the descriptor set binding specified by pname:dstBinding, and all applicable consecutive bindings, as described by <<descriptorsets-updates-consecutive>> * If pname:srcSet is equal to pname:dstSet, then the source and destination ranges of descriptors must: not overlap, where the ranges may: include array elements from consecutive bindings as described by <<descriptorsets-updates-consecutive>> ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="srcSet">pname:srcSet, pname:srcBinding, and pname:srcArrayElement are the source set, binding, and array element, respectively.</member>
<member name="dstSet">pname:dstSet, pname:dstBinding, and pname:dstArrayElement are the destination set, binding, and array element, respectively.</member>
<member name="descriptorCount">pname:descriptorCount is the number of descriptors to copy from the source to destination. If pname:descriptorCount is greater than the number of remaining array elements in the source or destination binding, those affect consecutive bindings in a manner similar to slink:VkWriteDescriptorSet above.</member>
</members>
</type>
<type name="VkCullModeFlagBits" summary="Bitmask controlling triangle culling.">
<specification />
<description>
<para>If the pname:cullMode is set to ename:VK_CULL_MODE_NONE no triangles are discarded, if it is set to ename:VK_CULL_MODE_FRONT_BIT front-facing triangles are discarded, if it is set to ename:VK_CULL_MODE_BACK_BIT then back-facing triangles are discarded and if it is set to ename:VK_CULL_MODE_FRONT_AND_BACK then all triangles are discarded. Following culling, fragments are produced for any triangles which have not been discarded.</para>
</description>
<members />
</type>
<type name="VkD3D12FenceSubmitInfoKHX" summary="Structure specifying values for Direct3D 12 fence-backed semaphores.">
<specification />
<description>
<para>If the semaphore in slink:VkSubmitInfo::pname:pWaitSemaphores or slink:VkSubmitInfo::pname:pSignalSemaphore corresponding to an entry in pname:pWaitSemaphoreValues or pname:pSignalSemaphoreValues respectively does not currently have state imported from a Direct3D 12 fence, the value in the pname:pWaitSemaphoreValues or pname:pSignalSemaphoreValues entry is ignored.</para>
<para>.Valid Usage ****</para>
<para>* pname:waitSemaphoreValuesCount must: be the same value as sname:VkSubmitInfo::pname:waitSemaphoreCount, where sname:SubmitInfo is in the pNext-chain of this sname:VkD3D12FenceSubmitInfoKHX structure.</para>
<para>* pname:signalSemaphoreValuesCount must: be the same value as sname:VkSubmitInfo::pname:signalSemaphoreCount, where sname:SubmitInfo is in the pNext-chain of this sname:VkD3D12FenceSubmitInfoKHX structure. ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="waitSemaphoreValuesCount">pname:waitSemaphoreValuesCount is the number of semaphore wait values specified in pname:pWaitSemaphoreValues.</member>
<member name="pWaitSemaphoreValues">pname:pWaitSemaphoreValues is an array of length pname:waitSemaphoreValuesCount containing values for the corresponding semaphores in slink:VkSubmitInfo::pname:pWaitSemaphores to wait for.</member>
<member name="signalSemaphoreValuesCount">pname:signalSemaphoreValuesCount is the number of semaphore signal values specified in pname:pSignalSemaphoreValues.</member>
<member name="pSignalSemaphoreValues">pname:pSignalSemaphoreValues is an array of length pname:signalSemaphoreValuesCount containing values for the corresponding semaphores in slink:VkSubmitInfo::pname:pSignalSemaphores to set when signaled.</member>
</members>
</type>
<type name="VkDebugMarkerMarkerInfoEXT" summary="Specify parameters of a command buffer marker region.">
<specification />
<description />
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="pMarkerName">pname:pMarkerName is a pointer to a null-terminated UTF-8 string that contains the name of the marker.</member>
<member name="color">pname:color is an optional RGBA color value that can be associated with the marker. A particular implementation may: choose to ignore this color value. The values contain RGBA values in order, in the range 0.0 to 1.0. If all elements in pname:color are set to 0.0 then it is ignored.</member>
</members>
</type>
<type name="VkDebugMarkerObjectNameInfoEXT" summary="Specify parameters of a name to give to an object.">
<specification />
<description>
<para>Applications may: change the name associated with an object simply by calling fname:vkDebugMarkerSetObjectNameEXT again with a new string. To remove a previously set name, pname:pName should: be set to an empty string.</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="objectType">pname:objectType is a elink:VkDebugReportObjectTypeEXT specifying the type of the object to be named.</member>
<member name="object">pname:object is the object to be named.</member>
<member name="pObjectName">pname:pObjectName is a null-terminated UTF-8 string specifying the name to apply to pname:object.</member>
</members>
</type>
<type name="VkDebugMarkerObjectTagInfoEXT" summary="Specify parameters of a tag to attach to an object.">
<specification />
<description>
<para>The pname:tagName parameter gives a name or identifier to the type of data being tagged. This can be used by debugging layers to easily filter for only data that can be used by that implementation.</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="objectType">pname:objectType is a elink:VkDebugReportObjectTypeEXT specifying the type of the object to be named.</member>
<member name="object">pname:object is the object to be tagged.</member>
<member name="tagName">pname:tagName is a numerical identifier of the tag.</member>
<member name="tagSize">pname:tagSize is the number of bytes of data to attach to the object.</member>
<member name="pTag">pname:pTag is an array of pname:tagSize bytes containing the data to be associated with the object.</member>
</members>
</type>
<type name="VkDebugReportCallbackCreateInfoEXT" summary="Structure specifying parameters of a newly created debug report callback.">
<specification />
<description />
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="flags">pname:flags indicate which event(s) will cause this callback to be called. Flags are interpreted as bitmasks and multiple may be set. Bits which can: be set include: + --</member>
</members>
</type>
<type name="VkDebugReportErrorEXT" summary="Unknown VK_EXT_debug_report enumeration type.">
<specification />
<description>
<para>[NOTE] .Note ==== The +VK_EXT_debug_report+ extension defines the elink:VkDebugReportErrorEXT enumerant type, but does not currently explain what the enumeration is used for. It is included here for completeness. ====</para>
</description>
<members />
</type>
<type name="VkDebugReportFlagBitsEXT" summary="Bitmask specifying events which cause a debug report callback.">
<specification />
<description>
<para>For each sname:VkDebugReportCallbackEXT that is created the flags determine when that function is called. A callback will be made for issues that match any bit set in its flags. The callback will come directly from the component that detected the event, unless some other layer intercepts the calls for its own purposes (filter them in different way, log to system error log, etc.) An application may receive multiple callbacks if multiple sname:VkDebugReportCallbackEXT objects were created. A callback will always be executed in the same thread as the originating Vulkan call. A callback may be called from multiple threads simultaneously (if the application is making Vulkan calls from multiple threads).</para>
</description>
<members>
<member name="VK_DEBUG_REPORT_ERROR_BIT_EXT">ename:VK_DEBUG_REPORT_ERROR_BIT_EXT indicates an error that may cause undefined results, including an application crash.</member>
<member name="VK_DEBUG_REPORT_WARNING_BIT_EXT">ename:VK_DEBUG_REPORT_WARNING_BIT_EXT indicates use of Vulkan that may expose an app bug. Such cases may not be immediately harmful, such as a fragment shader outputting to a location with no attachment. Other cases may point to behavior that is almost certainly bad when unintended such as using an image whose memory has not been filled. In general if you see a warning but you know that the behavior is intended/desired, then simply ignore the warning.</member>
<member name="VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT">ename:VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT indicates a potentially non-optimal use of Vulkan. E.g. using flink:vkCmdClearColorImage when a RenderPass load_op would have worked.</member>
<member name="VK_DEBUG_REPORT_INFORMATION_BIT_EXT">ename:VK_DEBUG_REPORT_INFORMATION_BIT_EXT indicates an informational message such as resource details that may be handy when debugging an application.</member>
<member name="VK_DEBUG_REPORT_DEBUG_BIT_EXT">ename:VK_DEBUG_REPORT_DEBUG_BIT_EXT indicates diagnostic information from the loader and layers. -- +</member>
<member name="pfnCallback">pname:pfnCallback is the application callback function to call.</member>
<member name="pUserData">pname:pUserData is user data to be passed to the callback.</member>
</members>
</type>
<type name="VkDebugReportObjectTypeEXT" summary="Specify the type of an object handle.">
<specification />
<description>
<para>[NOTE] .Note ==== The primary expected use of ename:VK_ERROR_VALIDATION_FAILED_EXT is for validation layer testing. It is not expected that an application would see this error code during normal use of the validation layers. ====</para>
</description>
<members>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT is an unknown object.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT is a sname:VkInstance.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT is a sname:VkPhysicalDevice.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT is a sname:VkDevice.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT is a sname:VkQueue.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT is a sname:VkSemaphore.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT is a sname:VkCommandBuffer.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT is a sname:VkFence.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT is a sname:VkDeviceMemory.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT is a sname:VkBuffer.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT is a sname:VkImage.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT is a sname:VkEvent.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT is a sname:VkQueryPool.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT is a sname:VkBufferView.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT is a sname:VkImageView.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT is a sname:VkShaderModule.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT is a sname:VkPipelineCache.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT is a sname:VkPipelineLayout.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT is a sname:VkRenderPass.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT is a sname:VkPipeline.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT is a sname:VkDescriptorSetLayout.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT is a sname:VkSampler.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT is a sname:VkDescriptorPool.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT is a sname:VkDescriptorSet.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT is a sname:VkFramebuffer.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT is a sname:VkCommandPool.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT is a sname:VkSurfaceKHR.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT is a sname:VkSwapchainKHR.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT is a sname:VkDebugReportCallbackEXT.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT is a sname:VkDisplayKHR.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT is a sname:VkDisplayModeKHR.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_OBJECT_TABLE_NVX_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_OBJECT_TABLE_NVX_EXT is a sname:VkObjectTableNVX.</member>
<member name="VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT">ename:VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT is a sname:VkIndirectCommandsLayoutNVX.</member>
</members>
</type>
<type name="VkDedicatedAllocationBufferCreateInfoNV" summary="Specify that a buffer is bound to a dedicated memory resource.">
<specification>
<para>If the pname:pNext list includes a sname:VkDedicatedAllocationBufferCreateInfoNV structure, then that structure includes an enable controlling whether the buffer will have a dedicated memory allocation bound to it.</para>
</specification>
<description>
<para>.Valid Usage **** * If pname:dedicatedAllocation is ename:VK_TRUE, sname:VkBufferCreateInfo::pname:flags must: not include ename:VK_BUFFER_CREATE_SPARSE_BINDING_BIT, ename:VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, or ename:VK_BUFFER_CREATE_SPARSE_ALIASED_BIT ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="dedicatedAllocation">pname:dedicatedAllocation indicates whether the buffer will have a dedicated allocation bound to it.</member>
</members>
</type>
<type name="VkDedicatedAllocationImageCreateInfoNV" summary="Specify that an image is bound to a dedicated memory resource.">
<specification>
<para>If the pname:pNext list includes a sname:VkDedicatedAllocationImageCreateInfoNV structure, then that structure includes an enable controlling whether the image will have a dedicated memory allocation bound to it.</para>
</specification>
<description>
<para>[NOTE] .Note ==== Using a dedicated allocation for color and depth/stencil attachments or other large images may: improve performance on some devices. ====</para>
<para>.Valid Usage **** * If pname:dedicatedAllocation is ename:VK_TRUE, sname:VkImageCreateInfo::pname:flags must: not include ename:VK_IMAGE_CREATE_SPARSE_BINDING_BIT, ename:VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or ename:VK_IMAGE_CREATE_SPARSE_ALIASED_BIT ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="dedicatedAllocation">pname:dedicatedAllocation indicates whether the image will have a dedicated allocation bound to it.</member>
</members>
</type>
<type name="VkDedicatedAllocationMemoryAllocateInfoNV" summary="Specify a dedicated memory allocation resource.">
<specification>
<para>If the pname:pNext list includes a sname:VkDedicatedAllocationMemoryAllocateInfoNV structure, then that structure includes a handle of the sole buffer or image resource that the memory can: be bound to.</para>
</specification>
<description>
<para>.Valid Usage **** * At least one of pname:image and pname:buffer must: be sname:VK_NULL_HANDLE * If pname:image is not sname:VK_NULL_HANDLE, the image must: have been created with sname:VkDedicatedAllocationImageCreateInfoNV::pname:dedicatedAllocation equal to ename:VK_TRUE * If pname:buffer is not sname:VK_NULL_HANDLE, the buffer must: have been created with sname:VkDedicatedAllocationBufferCreateInfoNV::pname:dedicatedAllocation equal to ename:VK_TRUE * If pname:image is not sname:VK_NULL_HANDLE, sname:VkMemoryAllocateInfo::pname:allocationSize must: equal the sname:VkMemoryRequirements::pname:size of the image * If pname:buffer is not sname:VK_NULL_HANDLE, sname:VkMemoryAllocateInfo::pname:allocationSize must: equal the sname:VkMemoryRequirements::pname:size of the buffer * If pname:image is not sname:VK_NULL_HANDLE and slink:VkMemoryAllocateInfo defines a memory import operation, the memory being imported must: also be a dedicated image allocation and pname:image must be identical to the image associated with the imported memory. * If pname:buffer is not sname:VK_NULL_HANDLE and slink:VkMemoryAllocateInfo defines a memory import operation, the memory being imported must: also be a dedicated buffer allocation and pname:buffer must be identical to the buffer associated with the imported memory. ****</para>
</description>
<members>
<member name="sType">pname:sType is the type of this structure.</member>
<member name="pNext">pname:pNext is `NULL` or a pointer to an extension-specific structure.</member>
<member name="image">pname:image is sname:VK_NULL_HANDLE or a handle of an image which this memory will be bound to.</member>
<member name="buffer">pname:buffer is sname:VK_NULL_HANDLE or a handle of a buffer which this memory will be bound to.</member>
</members>
</type>
<type name="VkDependencyFlagBits" summary="Bitmask specifying how execution and memory dependencies are formed.">
<specification />
<description>
<para>When flink:vkCmdPipelineBarrier is submitted to a queue, it defines a memory dependency between commands that were submitted before it, and those submitted after it.</para>
<para>If flink:vkCmdPipelineBarrier was recorded outside a render pass instance, the first <<synchronization-dependencies-scopes, synchronization scope>> includes every command submitted to the same queue before it, including those in the same command buffer and batch. If flink:vkCmdPipelineBarrier was recorded inside a render pass instance, the first synchronization scope includes only commands submitted before it within the same subpass. In either case, the first synchronization scope is limited to operations on the pipeline stages determined by the <<synchronization-pipeline-stages-masks, source stage mask>> specified by pname:srcStageMask.</para>
<para>If flink:vkCmdPipelineBarrier was recorded outside a render pass instance, the second <<synchronization-dependencies-scopes, synchronization scope>> includes every command submitted to the same queue after it, including those in the same command buffer and batch. If flink:vkCmdPipelineBarrier was recorded inside a render pass instance, the second synchronization scope includes only commands submitted after it within the same subpass. In either case, the second synchronization scope is limited to operations on the pipeline stages determined by the <<synchronization-pipeline-stages-masks, destination stage mask>> specified by pname:dstStageMask.</para>
<para>The first <<synchronization-dependencies-access-scopes, access scope>> is limited to access in the pipeline stages determined by the <<synchronization-pipeline-stages-masks, source stage mask>> specified by pname:srcStageMask. Within that, the first access scope only includes the first access scopes defined by elements of the pname:pMemoryBarriers, pname:pBufferMemoryBarriers and pname:pImageMemoryBarriers arrays, which each define a set of <<synchronization-memory-barriers, memory barriers>>. If no memory barriers are specified, then the first access scope includes no accesses.</para>
<para>The second <<synchronization-dependencies-access-scopes, access scope>> is limited to access in the pipeline stages determined by the <<synchronization-pipeline-stages-masks, destination stage mask>> specified by pname:dstStageMask. Within that, the second access scope only includes the second access scopes defined by elements of the pname:pMemoryBarriers, pname:pBufferMemoryBarriers and pname:pImageMemoryBarriers arrays, which each define a set of <<synchronization-memory-barriers, memory barriers>>. If no memory barriers are specified, then the second access scope includes no accesses.</para>
<para>If pname:dependencyFlags includes ename:VK_DEPENDENCY_BY_REGION_BIT, then any dependency between <<synchronization-framebuffer-regions, framebuffer-space>> pipeline stages is <<synchronization-framebuffer-regions, framebuffer-local>> - otherwise it is <<synchronization-framebuffer-regions, framebuffer-global>>.</para>
<para>.Valid Usage **** * If the <<features-features-geometryShader,geometry shaders>> feature is not enabled, pname:srcStageMask must: not contain ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT * If the <<features-features-geometryShader,geometry shaders>> feature is not enabled, pname:dstStageMask must: not contain ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT * If the <<features-features-tessellationShader,tessellation shaders>> feature is not enabled, pname:srcStageMask must: not contain ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT * If the <<features-features-tessellationShader,tessellation shaders>> feature is not enabled, pname:dstStageMask must: not contain ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT * If fname:vkCmdPipelineBarrier is called within a render pass instance, the render pass must: have been created with a sname:VkSubpassDependency instance in pname:pDependencies that expresses a dependency from the current subpass to itself. Additionally: ** pname:srcStageMask must: contain a subset of the bit values in the pname:srcStageMask member of that instance of sname:VkSubpassDependency ** pname:dstStageMask must: contain a subset of the bit values in the pname:dstStageMask member of that instance of sname:VkSubpassDependency ** The pname:srcAccessMask of any element of pname:pMemoryBarriers or pname:pImageMemoryBarriers must: contain a subset of the bit values the pname:srcAccessMask member of that instance of sname:VkSubpassDependency ** The pname:dstAccessMask of any element of pname:pMemoryBarriers or pname:pImageMemoryBarriers must: contain a subset of the bit values the pname:dstAccessMask member of that instance of sname:VkSubpassDependency ** pname:dependencyFlags must: be equal to the pname:dependencyFlags member of that instance of sname:VkSubpassDependency * If fname:vkCmdPipelineBarrier is called within a render pass instance, pname:bufferMemoryBarrierCount must: be `0` * If fname:vkCmdPipelineBarrier is called within a render pass instance, the pname:image member of any element of pname:pImageMemoryBarriers must: be equal to one of the elements of pname:pAttachments that the current pname:framebuffer was created with, that is also referred to by one of the elements of the pname:pColorAttachments, pname:pResolveAttachments or pname:pDepthStencilAttachment members of the sname:VkSubpassDescription instance that the current subpass was created with * If fname:vkCmdPipelineBarrier is called within a render pass instance, the pname:oldLayout and pname:newLayout members of any element of pname:pImageMemoryBarriers must: be equal to the pname:layout member of an element of the pname:pColorAttachments, pname:pResolveAttachments or pname:pDepthStencilAttachment members of the sname:VkSubpassDescription instance that the current subpass was created with, that refers to the same pname:image * If fname:vkCmdPipelineBarrier is called within a render pass instance, the pname:oldLayout and pname:newLayout members of an element of pname:pImageMemoryBarriers must: be equal * If fname:vkCmdPipelineBarrier is called within a render pass instance, the pname:srcQueueFamilyIndex and pname:dstQueueFamilyIndex members of any element of pname:pImageMemoryBarriers must: be ename:VK_QUEUE_FAMILY_IGNORED * Any pipeline stage included in pname:srcStageMask or pname:dstStageMask must: be supported by the capabilities of the queue family specified by the pname:queueFamilyIndex member of the slink:VkCommandPoolCreateInfo structure that was used to create the sname:VkCommandPool that pname:commandBuffer was allocated from, as specified in the <<synchronization-pipeline-stages-supported, table of supported pipeline stages>>. * Any given element of pname:pMemoryBarriers, pname:pBufferMemoryBarriers or pname:pImageMemoryBarriers must: not have any access flag included in its pname:srcAccessMask member if that bit is not supported by any of the pipeline stages in pname:srcStageMask, as specified in the <<synchronization-access-types-supported, table of supported access types>>. * Any given element of pname:pMemoryBarriers, pname:pBufferMemoryBarriers or pname:pImageMemoryBarriers must: not have any access flag included in its pname:dstAccessMask member if that bit is not supported by any of the pipeline stages in pname:dstStageMask, as specified in the <<synchronization-access-types-supported, table of supported access types>>. * If fname:vkCmdPipelineBarrier is called outside of a render pass instance, pname:dependencyFlags must: not include ename:VK_DEPENDENCY_VIEW_LOCAL_BIT_KHX ****</para>
</description>
<members>
<member name="memoryBarrierCount">pname:memoryBarrierCount is the length of the pname:pMemoryBarriers array.</member>
<member name="pMemoryBarriers">pname:pMemoryBarriers is a pointer to an array of slink:VkMemoryBarrier structures.</member>
<member name="bufferMemoryBarrierCount">pname:bufferMemoryBarrierCount is the length of the pname:pBufferMemoryBarriers array.</member>
<member name="pBufferMemoryBarriers">pname:pBufferMemoryBarriers is a pointer to an array of slink:VkBufferMemoryBarrier structures.</member>
<member name="imageMemoryBarrierCount">pname:imageMemoryBarrierCount is the length of the pname:pImageMemoryBarriers array.</member>
<member name="pImageMemoryBarriers">pname:pImageMemoryBarriers is a pointer to an array of slink:VkImageMemoryBarrier structures.</member>
<member name="VK_DEPENDENCY_BY_REGION_BIT">Dependency is per pixel region </member>
</members>
</type>
<type name="VkDescriptorBufferInfo" summary="Structure specifying descriptor buffer info.">
<specification />
<description>
<para>.Valid Usage **** * pname:offset must: be less than the size of pname:buffer * If pname:range is not equal to ename:VK_WHOLE_SIZE, pname:range must: be greater than `0` * If pname:range is not equal to ename:VK_WHOLE_SIZE, pname:range must: be less than or equal to the size of pname:buffer minus pname:offset ****</para>
</description>
<members>
<member name="buffer">pname:buffer is the buffer resource.</member>
<member name="offset">pname:offset is the offset in bytes from the start of pname:buffer. Access to buffer memory via this descriptor uses addressing that is relative to this starting offset.</member>
<member name="range">pname:range is the size in bytes that is used for this descriptor update, or ename:VK_WHOLE_SIZE to use the range from pname:offset to the end of the buffer. + -- [NOTE] .Note ==== When using ename:VK_WHOLE_SIZE, the effective range must: not be larger than the maximum range for the descriptor type (<<features-limits-maxUniformBufferRange, maxUniformBufferRange>> or <<features-limits-maxStorageBufferRange, maxStorageBufferRange>>). This means that ename:VK_WHOLE_SIZE is not typically useful in the common case where uniform buffer descriptors are suballocated from a buffer that is much larger than pname:maxUniformBufferRange. ==== -- + For ename:VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC and ename:VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC descriptor types, pname:offset is the base offset from which the dynamic offset is applied and pname:range is the static size used for all dynamic offsets.</member>
</members>
</type>
<type name="VkDescriptorImageInfo" summary="Structure specifying descriptor image info.">
<specification />
<description>