summaryrefslogtreecommitdiff
path: root/chapters/clears.adoc
blob: 904b60a9651d39dd761422b809d14b30f1fc5983 (plain)
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
// Copyright 2015-2023 The Khronos Group Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

[[clears]]
= Clear Commands


[[clears-outside]]
== Clearing Images Outside A Render Pass Instance

Color and depth/stencil images can: be cleared outside a render pass
instance using flink:vkCmdClearColorImage or
flink:vkCmdClearDepthStencilImage, respectively.
These commands are only allowed outside of a render pass instance.

[open,refpage='vkCmdClearColorImage',desc='Clear regions of a color image',type='protos']
--
To clear one or more subranges of a color image, call:

include::{generated}/api/protos/vkCmdClearColorImage.adoc[]

  * pname:commandBuffer is the command buffer into which the command will be
    recorded.
  * pname:image is the image to be cleared.
  * pname:imageLayout specifies the current layout of the image subresource
    ranges to be cleared, and must: be
ifdef::VK_KHR_shared_presentable_image[]
    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
endif::VK_KHR_shared_presentable_image[]
    ename:VK_IMAGE_LAYOUT_GENERAL or
    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL.
  * pname:pColor is a pointer to a slink:VkClearColorValue structure
    containing the values that the image subresource ranges will be cleared
    to (see <<clears-values>> below).
  * pname:rangeCount is the number of image subresource range structures in
    pname:pRanges.
  * pname:pRanges is a pointer to an array of slink:VkImageSubresourceRange
    structures describing a range of mipmap levels, array layers, and
    aspects to be cleared, as described in <<resources-image-views,Image
    Views>>.

Each specified range in pname:pRanges is cleared to the value specified by
pname:pColor.

.Valid Usage
****
ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
  * [[VUID-vkCmdClearColorImage-image-01993]]
    The <<resources-image-format-features,format features>> of pname:image
    must: contain ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT
endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
  * [[VUID-vkCmdClearColorImage-image-00002]]
    pname:image must: have been created with
    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag
ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
  * [[VUID-vkCmdClearColorImage-image-01545]]
    pname:image must: not use any of the
    <<formats-requiring-sampler-ycbcr-conversion, formats that require a
    sampler {YCbCr} conversion>>
endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
  * [[VUID-vkCmdClearColorImage-image-00003]]
    If pname:image is non-sparse then it must: be bound completely and
    contiguously to a single sname:VkDeviceMemory object
  * [[VUID-vkCmdClearColorImage-imageLayout-00004]]
    pname:imageLayout must: specify the layout of the image subresource
    ranges of pname:image specified in pname:pRanges at the time this
    command is executed on a sname:VkDevice
  * [[VUID-vkCmdClearColorImage-imageLayout-01394]]
    pname:imageLayout must: be
ifdef::VK_KHR_shared_presentable_image[]
    ename:VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
endif::VK_KHR_shared_presentable_image[]
    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or
    ename:VK_IMAGE_LAYOUT_GENERAL
  * [[VUID-vkCmdClearColorImage-aspectMask-02498]]
    The slink:VkImageSubresourceRange::pname:aspectMask members of the
    elements of the pname:pRanges array must: each only include
    ename:VK_IMAGE_ASPECT_COLOR_BIT
  * [[VUID-vkCmdClearColorImage-baseMipLevel-01470]]
    The slink:VkImageSubresourceRange::pname:baseMipLevel members of the
    elements of the pname:pRanges array must: each be less than the
    pname:mipLevels specified in slink:VkImageCreateInfo when pname:image
    was created
  * [[VUID-vkCmdClearColorImage-pRanges-01692]]
    For each slink:VkImageSubresourceRange element of pname:pRanges, if the
    pname:levelCount member is not ename:VK_REMAINING_MIP_LEVELS, then
    [eq]#pname:baseMipLevel {plus} pname:levelCount# must: be less than or
    equal to the pname:mipLevels specified in slink:VkImageCreateInfo when
    pname:image was created
  * [[VUID-vkCmdClearColorImage-baseArrayLayer-01472]]
    The slink:VkImageSubresourceRange::pname:baseArrayLayer members of the
    elements of the pname:pRanges array must: each be less than the
    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
    was created
  * [[VUID-vkCmdClearColorImage-pRanges-01693]]
    For each slink:VkImageSubresourceRange element of pname:pRanges, if the
    pname:layerCount member is not ename:VK_REMAINING_ARRAY_LAYERS, then
    [eq]#pname:baseArrayLayer {plus} pname:layerCount# must: be less than or
    equal to the pname:arrayLayers specified in slink:VkImageCreateInfo when
    pname:image was created
  * [[VUID-vkCmdClearColorImage-image-00007]]
    pname:image must: not have a compressed or depth/stencil format
  * [[VUID-vkCmdClearColorImage-pColor-04961]]
    pname:pColor must: be a valid pointer to a slink:VkClearColorValue union
ifdef::VK_VERSION_1_1[]
  * [[VUID-vkCmdClearColorImage-commandBuffer-01805]]
    If pname:commandBuffer is an unprotected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    pname:image must: not be a protected image
  * [[VUID-vkCmdClearColorImage-commandBuffer-01806]]
    If pname:commandBuffer is a protected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    must: not be an unprotected image
endif::VK_VERSION_1_1[]
****

include::{generated}/validity/protos/vkCmdClearColorImage.adoc[]
--

[open,refpage='vkCmdClearDepthStencilImage',desc='Fill regions of a combined depth/stencil image',type='protos']
--
To clear one or more subranges of a depth/stencil image, call:

include::{generated}/api/protos/vkCmdClearDepthStencilImage.adoc[]

  * pname:commandBuffer is the command buffer into which the command will be
    recorded.
  * pname:image is the image to be cleared.
  * pname:imageLayout specifies the current layout of the image subresource
    ranges to be cleared, and must: be ename:VK_IMAGE_LAYOUT_GENERAL or
    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL.
  * pname:pDepthStencil is a pointer to a slink:VkClearDepthStencilValue
    structure containing the values that the depth and stencil image
    subresource ranges will be cleared to (see <<clears-values>> below).
  * pname:rangeCount is the number of image subresource range structures in
    pname:pRanges.
  * pname:pRanges is a pointer to an array of slink:VkImageSubresourceRange
    structures describing a range of mipmap levels, array layers, and
    aspects to be cleared, as described in <<resources-image-views,Image
    Views>>.

.Valid Usage
****
ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
  * [[VUID-vkCmdClearDepthStencilImage-image-01994]]
    The <<resources-image-format-features,format features>> of pname:image
    must: contain ename:VK_FORMAT_FEATURE_TRANSFER_DST_BIT
endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
ifdef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
  * [[VUID-vkCmdClearDepthStencilImage-pRanges-02658]]
    If the pname:aspect member of any element of pname:pRanges includes
    ename:VK_IMAGE_ASPECT_STENCIL_BIT, and pname:image was created with
    <<VkImageStencilUsageCreateInfo,separate stencil usage>>,
    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT must: have been included in the
    slink:VkImageStencilUsageCreateInfo::pname:stencilUsage used to create
    pname:image
endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
  * [[VUID-vkCmdClearDepthStencilImage-pRanges-02659]]
    If the pname:aspect member of any element of pname:pRanges includes
    ename:VK_IMAGE_ASPECT_STENCIL_BIT,
ifdef::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
    and pname:image was not created with
    <<VkImageStencilUsageCreateInfo,separate stencil usage>>,
endif::VK_VERSION_1_2,VK_EXT_separate_stencil_usage[]
    ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT must: have been included in the
    slink:VkImageCreateInfo::pname:usage used to create pname:image
  * [[VUID-vkCmdClearDepthStencilImage-pRanges-02660]]
    If the pname:aspect member of any element of pname:pRanges includes
    ename:VK_IMAGE_ASPECT_DEPTH_BIT, ename:VK_IMAGE_USAGE_TRANSFER_DST_BIT
    must: have been included in the slink:VkImageCreateInfo::pname:usage
    used to create pname:image
  * [[VUID-vkCmdClearDepthStencilImage-image-00010]]
    If pname:image is non-sparse then it must: be bound completely and
    contiguously to a single sname:VkDeviceMemory object
  * [[VUID-vkCmdClearDepthStencilImage-imageLayout-00011]]
    pname:imageLayout must: specify the layout of the image subresource
    ranges of pname:image specified in pname:pRanges at the time this
    command is executed on a sname:VkDevice
  * [[VUID-vkCmdClearDepthStencilImage-imageLayout-00012]]
    pname:imageLayout must: be either of
    ename:VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or
    ename:VK_IMAGE_LAYOUT_GENERAL
  * [[VUID-vkCmdClearDepthStencilImage-aspectMask-02824]]
    The slink:VkImageSubresourceRange::pname:aspectMask member of each
    element of the pname:pRanges array must: not include bits other than
    ename:VK_IMAGE_ASPECT_DEPTH_BIT or ename:VK_IMAGE_ASPECT_STENCIL_BIT
  * [[VUID-vkCmdClearDepthStencilImage-image-02825]]
    If the pname:image's format does not have a stencil component, then the
    slink:VkImageSubresourceRange::pname:aspectMask member of each element
    of the pname:pRanges array must: not include the
    ename:VK_IMAGE_ASPECT_STENCIL_BIT bit
  * [[VUID-vkCmdClearDepthStencilImage-image-02826]]
    If the pname:image's format does not have a depth component, then the
    slink:VkImageSubresourceRange::pname:aspectMask member of each element
    of the pname:pRanges array must: not include the
    ename:VK_IMAGE_ASPECT_DEPTH_BIT bit
  * [[VUID-vkCmdClearDepthStencilImage-baseMipLevel-01474]]
    The slink:VkImageSubresourceRange::pname:baseMipLevel members of the
    elements of the pname:pRanges array must: each be less than the
    pname:mipLevels specified in slink:VkImageCreateInfo when pname:image
    was created
  * [[VUID-vkCmdClearDepthStencilImage-pRanges-01694]]
    For each slink:VkImageSubresourceRange element of pname:pRanges, if the
    pname:levelCount member is not ename:VK_REMAINING_MIP_LEVELS, then
    [eq]#pname:baseMipLevel {plus} pname:levelCount# must: be less than or
    equal to the pname:mipLevels specified in slink:VkImageCreateInfo when
    pname:image was created
  * [[VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476]]
    The slink:VkImageSubresourceRange::pname:baseArrayLayer members of the
    elements of the pname:pRanges array must: each be less than the
    pname:arrayLayers specified in slink:VkImageCreateInfo when pname:image
    was created
  * [[VUID-vkCmdClearDepthStencilImage-pRanges-01695]]
    For each slink:VkImageSubresourceRange element of pname:pRanges, if the
    pname:layerCount member is not ename:VK_REMAINING_ARRAY_LAYERS, then
    [eq]#pname:baseArrayLayer {plus} pname:layerCount# must: be less than or
    equal to the pname:arrayLayers specified in slink:VkImageCreateInfo when
    pname:image was created
  * [[VUID-vkCmdClearDepthStencilImage-image-00014]]
    pname:image must: have a depth/stencil format
ifdef::VK_VERSION_1_1[]
  * [[VUID-vkCmdClearDepthStencilImage-commandBuffer-01807]]
    If pname:commandBuffer is an unprotected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    pname:image must: not be a protected image
  * [[VUID-vkCmdClearDepthStencilImage-commandBuffer-01808]]
    If pname:commandBuffer is a protected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    pname:image must: not be an unprotected image
endif::VK_VERSION_1_1[]
****

include::{generated}/validity/protos/vkCmdClearDepthStencilImage.adoc[]
--

Clears outside render pass instances are treated as transfer operations for
the purposes of memory barriers.


[[clears-inside]]
== Clearing Images Inside A Render Pass Instance

[open,refpage='vkCmdClearAttachments',desc='Clear regions within bound framebuffer attachments',type='protos']
--
To clear one or more regions of color and depth/stencil attachments inside a
render pass instance, call:

include::{generated}/api/protos/vkCmdClearAttachments.adoc[]

  * pname:commandBuffer is the command buffer into which the command will be
    recorded.
  * pname:attachmentCount is the number of entries in the pname:pAttachments
    array.
  * pname:pAttachments is a pointer to an array of slink:VkClearAttachment
    structures defining the attachments to clear and the clear values to
    use.
  * pname:rectCount is the number of entries in the pname:pRects array.
  * pname:pRects is a pointer to an array of slink:VkClearRect structures
    defining regions within each selected attachment to clear.

ifdef::VK_EXT_fragment_density_map[]
If the render pass has a <<renderpass-fragmentdensitymapattachment,fragment
density map attachment>>, clears follow the
<<fragmentdensitymapops,operations of fragment density maps>> as if each
clear region was a primitive which generates fragments.
The clear color is applied to all pixels inside each fragment's area
regardless if the pixels lie outside of the clear region.
Clears may: have a different set of supported fragment areas than draws.
endif::VK_EXT_fragment_density_map[]

Unlike other <<clears,clear commands>>, flink:vkCmdClearAttachments is not a
transfer command.
It performs its operations in <<primsrast-order, rasterization order>>.
For color attachments, the operations are executed as color attachment
writes, by the ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT stage.
For depth/stencil attachments, the operations are executed as
<<fragops-depth, depth writes>> and <<fragops-stencil, stencil writes>> by
the ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT and
ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT stages.

fname:vkCmdClearAttachments is not affected by the bound pipeline state.

[NOTE]
.Note
====
It is generally preferable to clear attachments by using the
ename:VK_ATTACHMENT_LOAD_OP_CLEAR load operation at the start of rendering,
as it is more efficient on some implementations.
====

If any attachment's pname:aspectMask to be cleared is not backed by an image
view, the clear has no effect on that aspect.

ifdef::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]
If an attachment being cleared refers to an image view created with an
pname:aspectMask equal to one of ename:VK_IMAGE_ASPECT_PLANE_0_BIT,
ename:VK_IMAGE_ASPECT_PLANE_1_BIT or ename:VK_IMAGE_ASPECT_PLANE_2_BIT, it
is considered to be ename:VK_IMAGE_ASPECT_COLOR_BIT for purposes of this
command, and must: be cleared with the ename:VK_IMAGE_ASPECT_COLOR_BIT
aspect as specified by <<image-views-plane-promotion,image view creation>>.
endif::VK_VERSION_1_1,VK_KHR_sampler_ycbcr_conversion[]

.Valid Usage
****
  * [[VUID-vkCmdClearAttachments-aspectMask-07884]]
    If
ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[]
    the current render pass instance does not use dynamic rendering, and
endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[]
    the pname:aspectMask member of any element of pname:pAttachments
    contains ename:VK_IMAGE_ASPECT_DEPTH_BIT, the current subpass instance's
    depth-stencil attachment must: be either ename:VK_ATTACHMENT_UNUSED or
    the attachment pname:format must: contain a depth component
  * [[VUID-vkCmdClearAttachments-aspectMask-07885]]
    If
ifdef::VK_VERSION_1_3,VK_KHR_dynamic_rendering[]
    the current render pass instance does not use dynamic rendering, and
endif::VK_VERSION_1_3,VK_KHR_dynamic_rendering[]
    the pname:aspectMask member of any element of pname:pAttachments
    contains ename:VK_IMAGE_ASPECT_STENCIL_BIT, the current subpass
    instance's depth-stencil attachment must: be either
    ename:VK_ATTACHMENT_UNUSED or the attachment pname:format must: contain
    a stencil component
  * [[VUID-vkCmdClearAttachments-aspectMask-07271]]
    If the pname:aspectMask member of any element of pname:pAttachments
    contains ename:VK_IMAGE_ASPECT_COLOR_BIT, the pname:colorAttachment
    must: be a valid color attachment index in the current render pass
    instance
  * [[VUID-vkCmdClearAttachments-rect-02682]]
    The pname:rect member of each element of pname:pRects must: have an
    pname:extent.width greater than `0`
  * [[VUID-vkCmdClearAttachments-rect-02683]]
    The pname:rect member of each element of pname:pRects must: have an
    pname:extent.height greater than `0`
  * [[VUID-vkCmdClearAttachments-pRects-00016]]
    The rectangular region specified by each element of pname:pRects must:
    be contained within the render area of the current render pass instance
  * [[VUID-vkCmdClearAttachments-pRects-06937]]
    The layers specified by each element of pname:pRects must: be contained
    within every attachment that pname:pAttachments refers to, i.e. for each
    element of pname:pRects, slink:VkClearRect::pname:baseArrayLayer {plus}
    slink:VkClearRect::pname:layerCount must: be less than or equal to the
    number of layers rendered to in the current render pass instance
  * [[VUID-vkCmdClearAttachments-layerCount-01934]]
    The pname:layerCount member of each element of pname:pRects must: not be
    `0`
ifdef::VK_VERSION_1_1[]
  * [[VUID-vkCmdClearAttachments-commandBuffer-02504]]
    If pname:commandBuffer is an unprotected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    each attachment to be cleared must: not be a protected image
  * [[VUID-vkCmdClearAttachments-commandBuffer-02505]]
    If pname:commandBuffer is a protected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    each attachment to be cleared must: not be an unprotected image
endif::VK_VERSION_1_1[]
ifdef::VK_VERSION_1_1,VK_KHR_multiview[]
  * [[VUID-vkCmdClearAttachments-baseArrayLayer-00018]]
    If the render pass instance this is recorded in uses multiview, then
    pname:baseArrayLayer must: be zero and pname:layerCount must: be one
endif::VK_VERSION_1_1,VK_KHR_multiview[]
ifdef::VK_ANDROID_external_format_resolve[]
  * [[VUID-vkCmdClearAttachments-aspectMask-09298]]
    If the subpass this is recorded in performs an external format resolve,
    the pname:aspectMask member of any element of pname:pAttachments must:
    not include `VK_IMAGE_ASPECT_PLANE__{ibit}__BIT` for any index _i_
endif::VK_ANDROID_external_format_resolve[]
****

include::{generated}/validity/protos/vkCmdClearAttachments.adoc[]
--

[open,refpage='VkClearRect',desc='Structure specifying a clear rectangle',type='structs']
--
The sname:VkClearRect structure is defined as:

include::{generated}/api/structs/VkClearRect.adoc[]

  * pname:rect is the two-dimensional region to be cleared.
  * pname:baseArrayLayer is the first layer to be cleared.
  * pname:layerCount is the number of layers to clear.

The layers [eq]#[pname:baseArrayLayer, pname:baseArrayLayer {plus}
pname:layerCount)# counting from the base layer of the attachment image view
are cleared.

include::{generated}/validity/structs/VkClearRect.adoc[]
--

[open,refpage='VkClearAttachment',desc='Structure specifying a clear attachment',type='structs']
--
The sname:VkClearAttachment structure is defined as:

include::{generated}/api/structs/VkClearAttachment.adoc[]

  * pname:aspectMask is a mask selecting the color, depth and/or stencil
    aspects of the attachment to be cleared.
  * pname:colorAttachment is only meaningful if
    ename:VK_IMAGE_ASPECT_COLOR_BIT is set in pname:aspectMask, in which
    case it is an index into the currently bound color attachments.
  * pname:clearValue is the color or depth/stencil value to clear the
    attachment to, as described in <<clears-values,Clear Values>> below.

.Valid Usage
****
  * [[VUID-VkClearAttachment-aspectMask-00019]]
    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
  * [[VUID-VkClearAttachment-aspectMask-00020]]
    pname:aspectMask must: not include ename:VK_IMAGE_ASPECT_METADATA_BIT
ifdef::VK_EXT_image_drm_format_modifier[]
  * [[VUID-VkClearAttachment-aspectMask-02246]]
    pname:aspectMask must: not include
    `VK_IMAGE_ASPECT_MEMORY_PLANE__{ibit}__BIT_EXT` for any index _i_
endif::VK_EXT_image_drm_format_modifier[]
  * [[VUID-VkClearAttachment-clearValue-00021]]
    pname:clearValue must: be a valid sname:VkClearValue union
****

include::{generated}/validity/structs/VkClearAttachment.adoc[]
--


[[clears-values]]
== Clear Values

[open,refpage='VkClearColorValue',desc='Structure specifying a clear color value',type='structs']
--
The sname:VkClearColorValue structure is defined as:

include::{generated}/api/structs/VkClearColorValue.adoc[]

  * pname:float32 are the color clear values when the format of the image or
    attachment is one of the <<formats-numericformat, numeric formats>> with
    a numeric type that is floating-point.
    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.
  * pname:int32 are the color clear values when the format of the image or
    attachment has a numeric type that 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:.
  * pname:uint32 are the color clear values when the format of the image or
    attachment has a numeric type that 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.

The four array elements of the clear color map to R, G, B, and A components
of image formats, in order.

If the image has more than one sample, the same value is written to all
samples for any pixels being cleared.

include::{generated}/validity/structs/VkClearColorValue.adoc[]
--

[open,refpage='VkClearDepthStencilValue',desc='Structure specifying a clear depth stencil value',type='structs']
--
The sname:VkClearDepthStencilValue structure is defined as:

include::{generated}/api/structs/VkClearDepthStencilValue.adoc[]

  * 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.
  * 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.

.Valid Usage
****
  * [[VUID-VkClearDepthStencilValue-depth-00022]]
ifdef::VK_EXT_depth_range_unrestricted[]
    Unless the `apiext:VK_EXT_depth_range_unrestricted` extension is enabled
endif::VK_EXT_depth_range_unrestricted[]
    pname:depth must: be between `0.0` and `1.0`, inclusive
****

include::{generated}/validity/structs/VkClearDepthStencilValue.adoc[]
--

[open,refpage='VkClearValue',desc='Structure specifying a clear value',type='structs']
--
The sname:VkClearValue union is defined as:

include::{generated}/api/structs/VkClearValue.adoc[]

  * pname:color specifies the color image clear values to use when clearing
    a color image or attachment.
  * pname:depthStencil specifies the depth and stencil clear values to use
    when clearing a depth/stencil image or attachment.

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.

include::{generated}/validity/structs/VkClearValue.adoc[]
--


[[clears-filling-buffers]]
== Filling Buffers

[open,refpage='vkCmdFillBuffer',desc='Fill a region of a buffer with a fixed value',type='protos']
--
To clear buffer data, call:

include::{generated}/api/protos/vkCmdFillBuffer.adoc[]

  * pname:commandBuffer is the command buffer into which the command will be
    recorded.
  * pname:dstBuffer is the buffer to be filled.
  * pname:dstOffset is the byte offset into the buffer at which to start
    filling, and must: be a multiple of 4.
  * pname:size is the number of bytes to fill, and must: be either a
    multiple of 4, or ename:VK_WHOLE_SIZE to fill the range from
    pname:offset to the end of the buffer.
    If ename:VK_WHOLE_SIZE is used and the remaining size of the buffer is
    not a multiple of 4, then the nearest smaller multiple is used.
  * pname:data is the 4-byte word written repeatedly to the buffer to fill
    pname:size bytes of data.
    The data word is written to memory according to the host endianness.

fname:vkCmdFillBuffer is treated as a "`transfer`" operation for the
purposes of synchronization barriers.
The ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT must: be specified in pname:usage
of slink:VkBufferCreateInfo in order for the buffer to be compatible with
fname:vkCmdFillBuffer.

.Valid Usage
****
  * [[VUID-vkCmdFillBuffer-dstOffset-00024]]
    pname:dstOffset must: be less than the size of pname:dstBuffer
  * [[VUID-vkCmdFillBuffer-dstOffset-00025]]
    pname:dstOffset must: be a multiple of `4`
  * [[VUID-vkCmdFillBuffer-size-00026]]
    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be
    greater than `0`
  * [[VUID-vkCmdFillBuffer-size-00027]]
    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be
    less than or equal to the size of pname:dstBuffer minus pname:dstOffset
  * [[VUID-vkCmdFillBuffer-size-00028]]
    If pname:size is not equal to ename:VK_WHOLE_SIZE, pname:size must: be a
    multiple of `4`
  * [[VUID-vkCmdFillBuffer-dstBuffer-00029]]
    pname:dstBuffer must: have been created with
    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag
  * [[VUID-vkCmdFillBuffer-apiVersion-07894]]
ifdef::VK_VERSION_1_1,VK_KHR_maintenance1[]
ifndef::VKSC_VERSION_1_0[]
    If the apiext:VK_KHR_maintenance1 extension is not enabled and
    slink:VkPhysicalDeviceProperties::pname:apiVersion is less than Vulkan
    1.1, the
endif::VKSC_VERSION_1_0[]
endif::VK_VERSION_1_1,VK_KHR_maintenance1[]
ifndef::VK_VERSION_1_1,VK_KHR_maintenance1[The]
    slink:VkCommandPool that pname:commandBuffer was allocated from must:
    support graphics or compute operations
  * [[VUID-vkCmdFillBuffer-dstBuffer-00031]]
    If pname:dstBuffer is non-sparse then it must: be bound completely and
    contiguously to a single slink:VkDeviceMemory object
ifdef::VK_VERSION_1_1[]
  * [[VUID-vkCmdFillBuffer-commandBuffer-01811]]
    If pname:commandBuffer is an unprotected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    pname:dstBuffer must: not be a protected buffer
  * [[VUID-vkCmdFillBuffer-commandBuffer-01812]]
    If pname:commandBuffer is a protected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    pname:dstBuffer must: not be an unprotected buffer
endif::VK_VERSION_1_1[]
****

include::{generated}/validity/protos/vkCmdFillBuffer.adoc[]
--


[[clears-updating-buffers]]
== Updating Buffers

[open,refpage='vkCmdUpdateBuffer',desc='Update a buffer\'s contents from host memory',type='protos']
--
To update buffer data inline in a command buffer, call:

include::{generated}/api/protos/vkCmdUpdateBuffer.adoc[]

  * pname:commandBuffer is the command buffer into which the command will be
    recorded.
  * pname:dstBuffer is a handle to the buffer to be updated.
  * pname:dstOffset is the byte offset into the buffer to start updating,
    and must: be a multiple of 4.
  * pname:dataSize is the number of bytes to update, and must: be a multiple
    of 4.
  * pname:pData is a pointer to the source data for the buffer update, and
    must: be at least pname:dataSize bytes in size.

pname:dataSize must: be less than or equal to 65536 bytes.
For larger updates, applications can: use buffer to buffer
<<copies-buffers,copies>>.

[NOTE]
.Note
====
Buffer updates performed with fname:vkCmdUpdateBuffer first copy the data
into command buffer memory when the command is recorded (which requires
additional storage and may incur an additional allocation), and then copy
the data from the command buffer into pname:dstBuffer when the command is
executed on a device.

The additional cost of this functionality compared to <<copies-buffers,
buffer to buffer copies>> means it is only recommended for very small
amounts of data, and is why it is limited to only 65536 bytes.

Applications can: work around this by issuing multiple
fname:vkCmdUpdateBuffer commands to different ranges of the same buffer, but
it is strongly recommended that they should: not.
====

The source data is copied from the user pointer to the command buffer when
the command is called.

fname:vkCmdUpdateBuffer is only allowed outside of a render pass.
This command is treated as a "`transfer`" operation for the purposes of
synchronization barriers.
The ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT must: be specified in pname:usage
of slink:VkBufferCreateInfo in order for the buffer to be compatible with
fname:vkCmdUpdateBuffer.

.Valid Usage
****
  * [[VUID-vkCmdUpdateBuffer-dstOffset-00032]]
    pname:dstOffset must: be less than the size of pname:dstBuffer
  * [[VUID-vkCmdUpdateBuffer-dataSize-00033]]
    pname:dataSize must: be less than or equal to the size of
    pname:dstBuffer minus pname:dstOffset
  * [[VUID-vkCmdUpdateBuffer-dstBuffer-00034]]
    pname:dstBuffer must: have been created with
    ename:VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag
  * [[VUID-vkCmdUpdateBuffer-dstBuffer-00035]]
    If pname:dstBuffer is non-sparse then it must: be bound completely and
    contiguously to a single sname:VkDeviceMemory object
  * [[VUID-vkCmdUpdateBuffer-dstOffset-00036]]
    pname:dstOffset must: be a multiple of `4`
  * [[VUID-vkCmdUpdateBuffer-dataSize-00037]]
    pname:dataSize must: be less than or equal to `65536`
  * [[VUID-vkCmdUpdateBuffer-dataSize-00038]]
    pname:dataSize must: be a multiple of `4`
ifdef::VK_VERSION_1_1[]
  * [[VUID-vkCmdUpdateBuffer-commandBuffer-01813]]
    If pname:commandBuffer is an unprotected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    pname:dstBuffer must: not be a protected buffer
  * [[VUID-vkCmdUpdateBuffer-commandBuffer-01814]]
    If pname:commandBuffer is a protected command buffer and
    <<limits-protectedNoFault, pname:protectedNoFault>> is not supported,
    pname:dstBuffer must: not be an unprotected buffer
endif::VK_VERSION_1_1[]
****

include::{generated}/validity/protos/vkCmdUpdateBuffer.adoc[]
--

ifndef::VKSC_VERSION_1_0[]
[NOTE]
.Note
====
The pname:pData parameter was of type code:uint32_t* instead of code:void*
prior to version 1.0.19 of the Specification and dlink:VK_HEADER_VERSION 19
of the <<boilerplate-headers,Vulkan Header Files>>.
This was a historical anomaly, as the source data may be of other types.
====
endif::VKSC_VERSION_1_0[]