2 * Copyright © 2015 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
31 #include "meta-spirv.h"
34 anv_device_init_meta_clear_state(struct anv_device
*device
)
36 VkPipelineIaStateCreateInfo ia_create_info
= {
37 .sType
= VK_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO
,
38 .topology
= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
,
39 .primitiveRestartEnable
= false,
42 /* We don't use a vertex shader for clearing, but instead build and pass
43 * the VUEs directly to the rasterization backend.
45 VkShader fs
= GLSL_VK_SHADER(device
, FRAGMENT
,
54 VkPipelineShaderStageCreateInfo fs_create_info
= {
55 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
56 .pNext
= &ia_create_info
,
58 .stage
= VK_SHADER_STAGE_FRAGMENT
,
60 .linkConstBufferCount
= 0,
61 .pLinkConstBufferInfo
= NULL
,
62 .pSpecializationInfo
= NULL
66 /* We use instanced rendering to clear multiple render targets. We have two
67 * vertex buffers: the first vertex buffer holds per-vertex data and
68 * provides the vertices for the clear rectangle. The second one holds
69 * per-instance data, which consists of the VUE header (which selects the
70 * layer) and the color (Vulkan supports per-RT clear colors).
72 VkPipelineVertexInputCreateInfo vi_create_info
= {
73 .sType
= VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO
,
74 .pNext
= &fs_create_info
,
76 .pVertexBindingDescriptions
= (VkVertexInputBindingDescription
[]) {
80 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_VERTEX
85 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_INSTANCE
89 .pVertexAttributeDescriptions
= (VkVertexInputAttributeDescription
[]) {
94 .format
= VK_FORMAT_R32G32B32A32_UINT
,
101 .format
= VK_FORMAT_R32G32_SFLOAT
,
108 .format
= VK_FORMAT_R32G32B32A32_SFLOAT
,
114 VkPipelineRsStateCreateInfo rs_create_info
= {
115 .sType
= VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO
,
116 .pNext
= &vi_create_info
,
117 .depthClipEnable
= true,
118 .rasterizerDiscardEnable
= false,
119 .fillMode
= VK_FILL_MODE_SOLID
,
120 .cullMode
= VK_CULL_MODE_NONE
,
121 .frontFace
= VK_FRONT_FACE_CCW
124 VkPipelineCbStateCreateInfo cb_create_info
= {
125 .sType
= VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO
,
126 .pNext
= &rs_create_info
,
127 .attachmentCount
= 1,
128 .pAttachments
= (VkPipelineCbAttachmentState
[]) {
129 { .channelWriteMask
= VK_CHANNEL_A_BIT
|
130 VK_CHANNEL_R_BIT
| VK_CHANNEL_G_BIT
| VK_CHANNEL_B_BIT
},
134 anv_pipeline_create((VkDevice
) device
,
135 &(VkGraphicsPipelineCreateInfo
) {
136 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
137 .pNext
= &cb_create_info
,
141 &(struct anv_pipeline_create_info
) {
142 .use_repclear
= true,
143 .disable_viewport
= true,
146 &device
->meta_state
.clear
.pipeline
);
148 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, fs
);
151 #define NUM_VB_USED 2
152 struct anv_saved_state
{
153 struct anv_vertex_binding old_vertex_bindings
[NUM_VB_USED
];
154 struct anv_descriptor_set
*old_descriptor_set0
;
155 struct anv_pipeline
*old_pipeline
;
156 VkDynamicCbState cb_state
;
160 anv_cmd_buffer_save(struct anv_cmd_buffer
*cmd_buffer
,
161 struct anv_saved_state
*state
)
163 state
->old_pipeline
= cmd_buffer
->pipeline
;
164 state
->old_descriptor_set0
= cmd_buffer
->descriptors
[0].set
;
165 memcpy(state
->old_vertex_bindings
, cmd_buffer
->vertex_bindings
,
166 sizeof(state
->old_vertex_bindings
));
170 anv_cmd_buffer_restore(struct anv_cmd_buffer
*cmd_buffer
,
171 const struct anv_saved_state
*state
)
173 cmd_buffer
->pipeline
= state
->old_pipeline
;
174 cmd_buffer
->descriptors
[0].set
= state
->old_descriptor_set0
;
175 memcpy(cmd_buffer
->vertex_bindings
, state
->old_vertex_bindings
,
176 sizeof(state
->old_vertex_bindings
));
178 cmd_buffer
->vb_dirty
|= (1 << NUM_VB_USED
) - 1;
179 cmd_buffer
->dirty
|= ANV_CMD_BUFFER_PIPELINE_DIRTY
;
180 cmd_buffer
->descriptors_dirty
|= VK_SHADER_STAGE_VERTEX_BIT
;
186 uint32_t ViewportIndex
;
190 struct clear_instance_data
{
191 struct vue_header vue_header
;
196 meta_emit_clear(struct anv_cmd_buffer
*cmd_buffer
,
198 struct clear_instance_data
*instance_data
)
200 struct anv_device
*device
= cmd_buffer
->device
;
201 struct anv_framebuffer
*fb
= cmd_buffer
->framebuffer
;
202 struct anv_state state
;
205 const float vertex_data
[] = {
206 /* Rect-list coordinates */
209 fb
->width
, fb
->height
,
211 /* Align to 16 bytes */
215 size
= sizeof(vertex_data
) + num_instances
* sizeof(*instance_data
);
216 state
= anv_state_stream_alloc(&cmd_buffer
->surface_state_stream
, size
, 16);
218 /* Copy in the vertex and instance data */
219 memcpy(state
.map
, vertex_data
, sizeof(vertex_data
));
220 memcpy(state
.map
+ sizeof(vertex_data
), instance_data
,
221 num_instances
* sizeof(*instance_data
));
223 struct anv_buffer vertex_buffer
= {
224 .device
= cmd_buffer
->device
,
226 .bo
= &device
->surface_state_block_pool
.bo
,
227 .offset
= state
.offset
230 anv_CmdBindVertexBuffers((VkCmdBuffer
) cmd_buffer
, 0, 2,
232 (VkBuffer
) &vertex_buffer
,
233 (VkBuffer
) &vertex_buffer
240 if ((VkPipeline
) cmd_buffer
->pipeline
!= device
->meta_state
.clear
.pipeline
)
241 anv_CmdBindPipeline((VkCmdBuffer
) cmd_buffer
,
242 VK_PIPELINE_BIND_POINT_GRAPHICS
,
243 device
->meta_state
.clear
.pipeline
);
245 /* We don't need anything here, only set if not already set. */
246 if (cmd_buffer
->rs_state
== NULL
)
247 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
248 VK_STATE_BIND_POINT_RASTER
,
249 device
->meta_state
.shared
.rs_state
);
251 if (cmd_buffer
->vp_state
== NULL
)
252 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
253 VK_STATE_BIND_POINT_VIEWPORT
,
254 cmd_buffer
->framebuffer
->vp_state
);
256 if (cmd_buffer
->ds_state
== NULL
)
257 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
258 VK_STATE_BIND_POINT_DEPTH_STENCIL
,
259 device
->meta_state
.shared
.ds_state
);
261 if (cmd_buffer
->cb_state
== NULL
)
262 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
263 VK_STATE_BIND_POINT_COLOR_BLEND
,
264 device
->meta_state
.shared
.cb_state
);
266 anv_CmdDraw((VkCmdBuffer
) cmd_buffer
, 0, 3, 0, num_instances
);
270 anv_cmd_buffer_clear(struct anv_cmd_buffer
*cmd_buffer
,
271 struct anv_render_pass
*pass
)
273 struct anv_saved_state saved_state
;
275 int num_clear_layers
= 0;
276 struct clear_instance_data instance_data
[MAX_RTS
];
278 for (uint32_t i
= 0; i
< pass
->num_layers
; i
++) {
279 if (pass
->layers
[i
].color_load_op
== VK_ATTACHMENT_LOAD_OP_CLEAR
) {
280 instance_data
[num_clear_layers
++] = (struct clear_instance_data
) {
287 pass
->layers
[i
].clear_color
.color
.floatColor
[0],
288 pass
->layers
[i
].clear_color
.color
.floatColor
[1],
289 pass
->layers
[i
].clear_color
.color
.floatColor
[2],
290 pass
->layers
[i
].clear_color
.color
.floatColor
[3],
296 if (num_clear_layers
== 0)
299 anv_cmd_buffer_save(cmd_buffer
, &saved_state
);
301 meta_emit_clear(cmd_buffer
, num_clear_layers
, instance_data
);
303 /* Restore API state */
304 anv_cmd_buffer_restore(cmd_buffer
, &saved_state
);
308 anv_device_init_meta_blit_state(struct anv_device
*device
)
310 VkPipelineIaStateCreateInfo ia_create_info
= {
311 .sType
= VK_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO
,
312 .topology
= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
,
313 .primitiveRestartEnable
= false,
316 /* We don't use a vertex shader for clearing, but instead build and pass
317 * the VUEs directly to the rasterization backend. However, we do need
318 * to provide GLSL source for the vertex shader so that the compiler
319 * does not dead-code our inputs.
321 VkShader vs
= GLSL_VK_SHADER(device
, VERTEX
,
324 out vec4 v_tex_coord
;
327 v_tex_coord
= vec4(a_tex_coord
, 0, 1);
328 gl_Position
= vec4(a_pos
, 0, 1);
332 VkShader fs
= GLSL_VK_SHADER(device
, FRAGMENT
,
335 layout(set
= 0, binding
= 0) uniform sampler2D u_tex
;
338 f_color
= texture(u_tex
, v_tex_coord
.xy
);
342 VkPipelineShaderStageCreateInfo vs_create_info
= {
343 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
344 .pNext
= &ia_create_info
,
346 .stage
= VK_SHADER_STAGE_VERTEX
,
348 .linkConstBufferCount
= 0,
349 .pLinkConstBufferInfo
= NULL
,
350 .pSpecializationInfo
= NULL
354 VkPipelineShaderStageCreateInfo fs_create_info
= {
355 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
356 .pNext
= &vs_create_info
,
358 .stage
= VK_SHADER_STAGE_FRAGMENT
,
360 .linkConstBufferCount
= 0,
361 .pLinkConstBufferInfo
= NULL
,
362 .pSpecializationInfo
= NULL
366 VkPipelineVertexInputCreateInfo vi_create_info
= {
367 .sType
= VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO
,
368 .pNext
= &fs_create_info
,
370 .pVertexBindingDescriptions
= (VkVertexInputBindingDescription
[]) {
374 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_VERTEX
379 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_VERTEX
383 .pVertexAttributeDescriptions
= (VkVertexInputAttributeDescription
[]) {
388 .format
= VK_FORMAT_R32G32B32A32_UINT
,
395 .format
= VK_FORMAT_R32G32_SFLOAT
,
399 /* Texture Coordinate */
402 .format
= VK_FORMAT_R32G32_SFLOAT
,
408 VkDescriptorSetLayoutCreateInfo ds_layout_info
= {
409 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
411 .pBinding
= (VkDescriptorSetLayoutBinding
[]) {
413 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
415 .stageFlags
= VK_SHADER_STAGE_FRAGMENT_BIT
,
416 .pImmutableSamplers
= NULL
420 anv_CreateDescriptorSetLayout((VkDevice
) device
, &ds_layout_info
,
421 &device
->meta_state
.blit
.ds_layout
);
423 anv_CreatePipelineLayout((VkDevice
) device
,
424 &(VkPipelineLayoutCreateInfo
) {
425 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
426 .descriptorSetCount
= 1,
427 .pSetLayouts
= &device
->meta_state
.blit
.ds_layout
,
429 &device
->meta_state
.blit
.pipeline_layout
);
431 VkPipelineRsStateCreateInfo rs_create_info
= {
432 .sType
= VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO
,
433 .pNext
= &vi_create_info
,
434 .depthClipEnable
= true,
435 .rasterizerDiscardEnable
= false,
436 .fillMode
= VK_FILL_MODE_SOLID
,
437 .cullMode
= VK_CULL_MODE_NONE
,
438 .frontFace
= VK_FRONT_FACE_CCW
441 VkPipelineCbStateCreateInfo cb_create_info
= {
442 .sType
= VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO
,
443 .pNext
= &rs_create_info
,
444 .attachmentCount
= 1,
445 .pAttachments
= (VkPipelineCbAttachmentState
[]) {
446 { .channelWriteMask
= VK_CHANNEL_A_BIT
|
447 VK_CHANNEL_R_BIT
| VK_CHANNEL_G_BIT
| VK_CHANNEL_B_BIT
},
451 VkGraphicsPipelineCreateInfo pipeline_info
= {
452 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
453 .pNext
= &cb_create_info
,
455 .layout
= device
->meta_state
.blit
.pipeline_layout
,
458 anv_pipeline_create((VkDevice
) device
, &pipeline_info
,
459 &(struct anv_pipeline_create_info
) {
460 .use_repclear
= false,
461 .disable_viewport
= true,
462 .disable_scissor
= true,
466 &device
->meta_state
.blit
.pipeline
);
468 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, vs
);
469 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, fs
);
473 meta_prepare_blit(struct anv_cmd_buffer
*cmd_buffer
,
474 struct anv_saved_state
*saved_state
)
476 struct anv_device
*device
= cmd_buffer
->device
;
478 anv_cmd_buffer_save(cmd_buffer
, saved_state
);
480 if ((VkPipeline
) cmd_buffer
->pipeline
!= device
->meta_state
.blit
.pipeline
)
481 anv_CmdBindPipeline((VkCmdBuffer
) cmd_buffer
,
482 VK_PIPELINE_BIND_POINT_GRAPHICS
,
483 device
->meta_state
.blit
.pipeline
);
485 /* We don't need anything here, only set if not already set. */
486 if (cmd_buffer
->rs_state
== NULL
)
487 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
488 VK_STATE_BIND_POINT_RASTER
,
489 device
->meta_state
.shared
.rs_state
);
490 if (cmd_buffer
->ds_state
== NULL
)
491 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
492 VK_STATE_BIND_POINT_DEPTH_STENCIL
,
493 device
->meta_state
.shared
.ds_state
);
495 saved_state
->cb_state
= (VkDynamicCbState
) cmd_buffer
->cb_state
;
496 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
497 VK_STATE_BIND_POINT_COLOR_BLEND
,
498 device
->meta_state
.shared
.cb_state
);
502 VkOffset3D src_offset
;
503 VkExtent3D src_extent
;
504 VkOffset3D dest_offset
;
505 VkExtent3D dest_extent
;
509 meta_emit_blit(struct anv_cmd_buffer
*cmd_buffer
,
510 struct anv_surface_view
*src
,
511 VkOffset3D src_offset
,
512 VkExtent3D src_extent
,
513 struct anv_surface_view
*dest
,
514 VkOffset3D dest_offset
,
515 VkExtent3D dest_extent
)
517 struct anv_device
*device
= cmd_buffer
->device
;
519 struct blit_vb_data
{
524 unsigned vb_size
= sizeof(struct vue_header
) + 3 * sizeof(*vb_data
);
526 struct anv_state vb_state
=
527 anv_state_stream_alloc(&cmd_buffer
->surface_state_stream
, vb_size
, 16);
528 memset(vb_state
.map
, 0, sizeof(struct vue_header
));
529 vb_data
= vb_state
.map
+ sizeof(struct vue_header
);
531 vb_data
[0] = (struct blit_vb_data
) {
533 dest_offset
.x
+ dest_extent
.width
,
534 dest_offset
.y
+ dest_extent
.height
,
537 (float)(src_offset
.x
+ src_extent
.width
) / (float)src
->extent
.width
,
538 (float)(src_offset
.y
+ src_extent
.height
) / (float)src
->extent
.height
,
542 vb_data
[1] = (struct blit_vb_data
) {
545 dest_offset
.y
+ dest_extent
.height
,
548 (float)src_offset
.x
/ (float)src
->extent
.width
,
549 (float)(src_offset
.y
+ src_extent
.height
) / (float)src
->extent
.height
,
553 vb_data
[2] = (struct blit_vb_data
) {
559 (float)src_offset
.x
/ (float)src
->extent
.width
,
560 (float)src_offset
.y
/ (float)src
->extent
.height
,
564 struct anv_buffer vertex_buffer
= {
567 .bo
= &device
->surface_state_block_pool
.bo
,
568 .offset
= vb_state
.offset
,
571 anv_CmdBindVertexBuffers((VkCmdBuffer
) cmd_buffer
, 0, 2,
573 (VkBuffer
) &vertex_buffer
,
574 (VkBuffer
) &vertex_buffer
578 sizeof(struct vue_header
),
583 anv_AllocDescriptorSets((VkDevice
) device
, 0 /* pool */,
584 VK_DESCRIPTOR_SET_USAGE_ONE_SHOT
,
585 1, &device
->meta_state
.blit
.ds_layout
, &set
, &count
);
586 anv_UpdateDescriptors((VkDevice
) device
, set
, 1,
589 .sType
= VK_STRUCTURE_TYPE_UPDATE_IMAGES
,
590 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
593 .pImageViews
= (VkImageViewAttachInfo
[]) {
595 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO
,
596 .view
= (VkImageView
) src
,
597 .layout
= VK_IMAGE_LAYOUT_GENERAL
,
603 struct anv_framebuffer
*fb
;
604 anv_CreateFramebuffer((VkDevice
) device
,
605 &(VkFramebufferCreateInfo
) {
606 .sType
= VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
,
607 .colorAttachmentCount
= 1,
608 .pColorAttachments
= (VkColorAttachmentBindInfo
[]) {
610 .view
= (VkColorAttachmentView
) dest
,
611 .layout
= VK_IMAGE_LAYOUT_GENERAL
614 .pDepthStencilAttachment
= NULL
,
616 .width
= dest
->extent
.width
,
617 .height
= dest
->extent
.height
,
619 }, (VkFramebuffer
*)&fb
);
623 anv_CreateRenderPass((VkDevice
)device
,
624 &(VkRenderPassCreateInfo
) {
625 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
,
626 .renderArea
= { { 0, 0 }, { dest
->extent
.width
, dest
->extent
.height
} },
627 .colorAttachmentCount
= 1,
631 .pColorFormats
= (VkFormat
[]) { dest
->format
},
632 .pColorLayouts
= (VkImageLayout
[]) { VK_IMAGE_LAYOUT_GENERAL
},
633 .pColorLoadOps
= (VkAttachmentLoadOp
[]) { VK_ATTACHMENT_LOAD_OP_LOAD
},
634 .pColorStoreOps
= (VkAttachmentStoreOp
[]) { VK_ATTACHMENT_STORE_OP_STORE
},
635 .pColorLoadClearValues
= (VkClearColor
[]) {
636 { .color
= { .floatColor
= { 1.0, 0.0, 0.0, 1.0 } }, .useRawValue
= false }
638 .depthStencilFormat
= VK_FORMAT_UNDEFINED
,
641 anv_CmdBeginRenderPass((VkCmdBuffer
) cmd_buffer
,
642 &(VkRenderPassBegin
) {
644 .framebuffer
= (VkFramebuffer
) fb
,
647 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
648 VK_STATE_BIND_POINT_VIEWPORT
, fb
->vp_state
);
650 anv_CmdBindDescriptorSets((VkCmdBuffer
) cmd_buffer
,
651 VK_PIPELINE_BIND_POINT_GRAPHICS
, 0, 1,
654 anv_CmdDraw((VkCmdBuffer
) cmd_buffer
, 0, 3, 0, 1);
656 anv_CmdEndRenderPass((VkCmdBuffer
) cmd_buffer
, pass
);
658 /* At the point where we emit the draw call, all data from the
659 * descriptor sets, etc. has been used. We are free to delete it.
661 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_DESCRIPTOR_SET
, set
);
662 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_FRAMEBUFFER
,
664 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_RENDER_PASS
, pass
);
668 meta_finish_blit(struct anv_cmd_buffer
*cmd_buffer
,
669 const struct anv_saved_state
*saved_state
)
671 anv_cmd_buffer_restore(cmd_buffer
, saved_state
);
672 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
673 VK_STATE_BIND_POINT_COLOR_BLEND
,
674 saved_state
->cb_state
);
678 vk_format_for_cpp(int cpp
)
681 case 1: return VK_FORMAT_R8_UINT
;
682 case 2: return VK_FORMAT_R8G8_UINT
;
683 case 3: return VK_FORMAT_R8G8B8_UINT
;
684 case 4: return VK_FORMAT_R8G8B8A8_UINT
;
685 case 6: return VK_FORMAT_R16G16B16_UINT
;
686 case 8: return VK_FORMAT_R16G16B16A16_UINT
;
687 case 12: return VK_FORMAT_R32G32B32_UINT
;
688 case 16: return VK_FORMAT_R32G32B32A32_UINT
;
690 unreachable("Invalid format cpp");
695 do_buffer_copy(struct anv_cmd_buffer
*cmd_buffer
,
696 struct anv_bo
*src
, uint64_t src_offset
,
697 struct anv_bo
*dest
, uint64_t dest_offset
,
698 int width
, int height
, VkFormat copy_format
)
700 VkDevice vk_device
= (VkDevice
)cmd_buffer
->device
;
702 VkImageCreateInfo image_info
= {
703 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
704 .imageType
= VK_IMAGE_TYPE_2D
,
705 .format
= copy_format
,
714 .tiling
= VK_IMAGE_TILING_LINEAR
,
715 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
719 struct anv_image
*src_image
, *dest_image
;
720 anv_CreateImage(vk_device
, &image_info
, (VkImage
*)&src_image
);
721 anv_CreateImage(vk_device
, &image_info
, (VkImage
*)&dest_image
);
723 /* We could use a vk call to bind memory, but that would require
724 * creating a dummy memory object etc. so there's really no point.
727 src_image
->offset
= src_offset
;
728 dest_image
->bo
= dest
;
729 dest_image
->offset
= dest_offset
;
731 struct anv_surface_view src_view
;
732 anv_image_view_init(&src_view
, cmd_buffer
->device
,
733 &(VkImageViewCreateInfo
) {
734 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
735 .image
= (VkImage
)src_image
,
736 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
737 .format
= copy_format
,
739 VK_CHANNEL_SWIZZLE_R
,
740 VK_CHANNEL_SWIZZLE_G
,
741 VK_CHANNEL_SWIZZLE_B
,
744 .subresourceRange
= {
745 .aspect
= VK_IMAGE_ASPECT_COLOR
,
755 struct anv_surface_view dest_view
;
756 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
757 &(VkColorAttachmentViewCreateInfo
) {
758 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
759 .image
= (VkImage
)dest_image
,
760 .format
= copy_format
,
767 meta_emit_blit(cmd_buffer
,
769 (VkOffset3D
) { 0, 0, 0 },
770 (VkExtent3D
) { width
, height
, 1 },
772 (VkOffset3D
) { 0, 0, 0 },
773 (VkExtent3D
) { width
, height
, 1 });
775 anv_DestroyObject(vk_device
, VK_OBJECT_TYPE_IMAGE
, (VkImage
) src_image
);
776 anv_DestroyObject(vk_device
, VK_OBJECT_TYPE_IMAGE
, (VkImage
) dest_image
);
779 void anv_CmdCopyBuffer(
780 VkCmdBuffer cmdBuffer
,
783 uint32_t regionCount
,
784 const VkBufferCopy
* pRegions
)
786 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
787 struct anv_buffer
*src_buffer
= (struct anv_buffer
*)srcBuffer
;
788 struct anv_buffer
*dest_buffer
= (struct anv_buffer
*)destBuffer
;
789 struct anv_saved_state saved_state
;
791 meta_prepare_blit(cmd_buffer
, &saved_state
);
793 for (unsigned r
= 0; r
< regionCount
; r
++) {
794 uint64_t src_offset
= src_buffer
->offset
+ pRegions
[r
].srcOffset
;
795 uint64_t dest_offset
= dest_buffer
->offset
+ pRegions
[r
].destOffset
;
796 uint64_t copy_size
= pRegions
[r
].copySize
;
798 /* First, we compute the biggest format that can be used with the
799 * given offsets and size.
803 int fs
= ffs(src_offset
) - 1;
805 cpp
= MIN2(cpp
, 1 << fs
);
806 assert(src_offset
% cpp
== 0);
808 fs
= ffs(dest_offset
) - 1;
810 cpp
= MIN2(cpp
, 1 << fs
);
811 assert(dest_offset
% cpp
== 0);
813 fs
= ffs(pRegions
[r
].copySize
) - 1;
815 cpp
= MIN2(cpp
, 1 << fs
);
816 assert(pRegions
[r
].copySize
% cpp
== 0);
818 VkFormat copy_format
= vk_format_for_cpp(cpp
);
820 /* This is maximum possible width/height our HW can handle */
821 uint64_t max_surface_dim
= 1 << 14;
823 /* First, we make a bunch of max-sized copies */
824 uint64_t max_copy_size
= max_surface_dim
* max_surface_dim
* cpp
;
825 while (copy_size
> max_copy_size
) {
826 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
827 dest_buffer
->bo
, dest_offset
,
828 max_surface_dim
, max_surface_dim
, copy_format
);
829 copy_size
-= max_copy_size
;
830 src_offset
+= max_copy_size
;
831 dest_offset
+= max_copy_size
;
834 uint64_t height
= copy_size
/ (max_surface_dim
* cpp
);
835 assert(height
< max_surface_dim
);
837 uint64_t rect_copy_size
= height
* max_surface_dim
* cpp
;
838 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
839 dest_buffer
->bo
, dest_offset
,
840 max_surface_dim
, height
, copy_format
);
841 copy_size
-= rect_copy_size
;
842 src_offset
+= rect_copy_size
;
843 dest_offset
+= rect_copy_size
;
846 if (copy_size
!= 0) {
847 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
848 dest_buffer
->bo
, dest_offset
,
849 copy_size
/ cpp
, 1, copy_format
);
853 meta_finish_blit(cmd_buffer
, &saved_state
);
856 void anv_CmdCopyImage(
857 VkCmdBuffer cmdBuffer
,
859 VkImageLayout srcImageLayout
,
861 VkImageLayout destImageLayout
,
862 uint32_t regionCount
,
863 const VkImageCopy
* pRegions
)
865 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
866 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
867 struct anv_saved_state saved_state
;
869 meta_prepare_blit(cmd_buffer
, &saved_state
);
871 for (unsigned r
= 0; r
< regionCount
; r
++) {
872 struct anv_surface_view src_view
;
873 anv_image_view_init(&src_view
, cmd_buffer
->device
,
874 &(VkImageViewCreateInfo
) {
875 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
877 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
878 .format
= src_image
->format
,
880 VK_CHANNEL_SWIZZLE_R
,
881 VK_CHANNEL_SWIZZLE_G
,
882 VK_CHANNEL_SWIZZLE_B
,
885 .subresourceRange
= {
886 .aspect
= pRegions
[r
].srcSubresource
.aspect
,
887 .baseMipLevel
= pRegions
[r
].srcSubresource
.mipLevel
,
889 .baseArraySlice
= pRegions
[r
].srcSubresource
.arraySlice
,
896 struct anv_surface_view dest_view
;
897 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
898 &(VkColorAttachmentViewCreateInfo
) {
899 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
901 .format
= src_image
->format
,
902 .mipLevel
= pRegions
[r
].destSubresource
.mipLevel
,
903 .baseArraySlice
= pRegions
[r
].destSubresource
.arraySlice
,
908 meta_emit_blit(cmd_buffer
,
910 pRegions
[r
].srcOffset
,
913 pRegions
[r
].destOffset
,
917 meta_finish_blit(cmd_buffer
, &saved_state
);
920 void anv_CmdBlitImage(
921 VkCmdBuffer cmdBuffer
,
923 VkImageLayout srcImageLayout
,
925 VkImageLayout destImageLayout
,
926 uint32_t regionCount
,
927 const VkImageBlit
* pRegions
)
929 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
930 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
931 struct anv_image
*dest_image
= (struct anv_image
*)destImage
;
932 struct anv_saved_state saved_state
;
934 meta_prepare_blit(cmd_buffer
, &saved_state
);
936 for (unsigned r
= 0; r
< regionCount
; r
++) {
937 struct anv_surface_view src_view
;
938 anv_image_view_init(&src_view
, cmd_buffer
->device
,
939 &(VkImageViewCreateInfo
) {
940 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
942 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
943 .format
= src_image
->format
,
945 VK_CHANNEL_SWIZZLE_R
,
946 VK_CHANNEL_SWIZZLE_G
,
947 VK_CHANNEL_SWIZZLE_B
,
950 .subresourceRange
= {
951 .aspect
= pRegions
[r
].srcSubresource
.aspect
,
952 .baseMipLevel
= pRegions
[r
].srcSubresource
.mipLevel
,
954 .baseArraySlice
= pRegions
[r
].srcSubresource
.arraySlice
,
961 struct anv_surface_view dest_view
;
962 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
963 &(VkColorAttachmentViewCreateInfo
) {
964 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
966 .format
= dest_image
->format
,
967 .mipLevel
= pRegions
[r
].destSubresource
.mipLevel
,
968 .baseArraySlice
= pRegions
[r
].destSubresource
.arraySlice
,
973 meta_emit_blit(cmd_buffer
,
975 pRegions
[r
].srcOffset
,
976 pRegions
[r
].srcExtent
,
978 pRegions
[r
].destOffset
,
979 pRegions
[r
].destExtent
);
982 meta_finish_blit(cmd_buffer
, &saved_state
);
985 void anv_CmdCopyBufferToImage(
986 VkCmdBuffer cmdBuffer
,
989 VkImageLayout destImageLayout
,
990 uint32_t regionCount
,
991 const VkBufferImageCopy
* pRegions
)
993 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
994 VkDevice vk_device
= (VkDevice
) cmd_buffer
->device
;
995 struct anv_buffer
*src_buffer
= (struct anv_buffer
*)srcBuffer
;
996 struct anv_image
*dest_image
= (struct anv_image
*)destImage
;
997 struct anv_saved_state saved_state
;
999 meta_prepare_blit(cmd_buffer
, &saved_state
);
1001 for (unsigned r
= 0; r
< regionCount
; r
++) {
1002 struct anv_image
*src_image
;
1003 anv_CreateImage(vk_device
,
1004 &(VkImageCreateInfo
) {
1005 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
1006 .imageType
= VK_IMAGE_TYPE_2D
,
1007 .format
= dest_image
->format
,
1009 .width
= pRegions
[r
].imageExtent
.width
,
1010 .height
= pRegions
[r
].imageExtent
.height
,
1016 .tiling
= VK_IMAGE_TILING_LINEAR
,
1017 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
1019 }, (VkImage
*)&src_image
);
1021 /* We could use a vk call to bind memory, but that would require
1022 * creating a dummy memory object etc. so there's really no point.
1024 src_image
->bo
= src_buffer
->bo
;
1025 src_image
->offset
= src_buffer
->offset
+ pRegions
[r
].bufferOffset
;
1027 struct anv_surface_view src_view
;
1028 anv_image_view_init(&src_view
, cmd_buffer
->device
,
1029 &(VkImageViewCreateInfo
) {
1030 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
1031 .image
= (VkImage
)src_image
,
1032 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
1033 .format
= dest_image
->format
,
1035 VK_CHANNEL_SWIZZLE_R
,
1036 VK_CHANNEL_SWIZZLE_G
,
1037 VK_CHANNEL_SWIZZLE_B
,
1038 VK_CHANNEL_SWIZZLE_A
1040 .subresourceRange
= {
1041 .aspect
= pRegions
[r
].imageSubresource
.aspect
,
1044 .baseArraySlice
= 0,
1051 struct anv_surface_view dest_view
;
1052 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
1053 &(VkColorAttachmentViewCreateInfo
) {
1054 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
1055 .image
= (VkImage
)dest_image
,
1056 .format
= dest_image
->format
,
1057 .mipLevel
= pRegions
[r
].imageSubresource
.mipLevel
,
1058 .baseArraySlice
= pRegions
[r
].imageSubresource
.arraySlice
,
1063 meta_emit_blit(cmd_buffer
,
1065 (VkOffset3D
) { 0, 0, 0 },
1066 pRegions
[r
].imageExtent
,
1068 pRegions
[r
].imageOffset
,
1069 pRegions
[r
].imageExtent
);
1071 anv_DestroyObject(vk_device
, VK_OBJECT_TYPE_IMAGE
, (VkImage
) src_image
);
1074 meta_finish_blit(cmd_buffer
, &saved_state
);
1077 void anv_CmdCopyImageToBuffer(
1078 VkCmdBuffer cmdBuffer
,
1080 VkImageLayout srcImageLayout
,
1081 VkBuffer destBuffer
,
1082 uint32_t regionCount
,
1083 const VkBufferImageCopy
* pRegions
)
1085 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
1086 VkDevice vk_device
= (VkDevice
) cmd_buffer
->device
;
1087 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
1088 struct anv_buffer
*dest_buffer
= (struct anv_buffer
*)destBuffer
;
1089 struct anv_saved_state saved_state
;
1091 meta_prepare_blit(cmd_buffer
, &saved_state
);
1093 for (unsigned r
= 0; r
< regionCount
; r
++) {
1094 struct anv_surface_view src_view
;
1095 anv_image_view_init(&src_view
, cmd_buffer
->device
,
1096 &(VkImageViewCreateInfo
) {
1097 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
1099 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
1100 .format
= src_image
->format
,
1102 VK_CHANNEL_SWIZZLE_R
,
1103 VK_CHANNEL_SWIZZLE_G
,
1104 VK_CHANNEL_SWIZZLE_B
,
1105 VK_CHANNEL_SWIZZLE_A
1107 .subresourceRange
= {
1108 .aspect
= pRegions
[r
].imageSubresource
.aspect
,
1109 .baseMipLevel
= pRegions
[r
].imageSubresource
.mipLevel
,
1111 .baseArraySlice
= pRegions
[r
].imageSubresource
.arraySlice
,
1118 struct anv_image
*dest_image
;
1119 anv_CreateImage(vk_device
,
1120 &(VkImageCreateInfo
) {
1121 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
1122 .imageType
= VK_IMAGE_TYPE_2D
,
1123 .format
= src_image
->format
,
1125 .width
= pRegions
[r
].imageExtent
.width
,
1126 .height
= pRegions
[r
].imageExtent
.height
,
1132 .tiling
= VK_IMAGE_TILING_LINEAR
,
1133 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
1135 }, (VkImage
*)&dest_image
);
1137 /* We could use a vk call to bind memory, but that would require
1138 * creating a dummy memory object etc. so there's really no point.
1140 dest_image
->bo
= dest_buffer
->bo
;
1141 dest_image
->offset
= dest_buffer
->offset
+ pRegions
[r
].bufferOffset
;
1143 struct anv_surface_view dest_view
;
1144 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
1145 &(VkColorAttachmentViewCreateInfo
) {
1146 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
1147 .image
= (VkImage
)dest_image
,
1148 .format
= src_image
->format
,
1150 .baseArraySlice
= 0,
1155 meta_emit_blit(cmd_buffer
,
1157 pRegions
[r
].imageOffset
,
1158 pRegions
[r
].imageExtent
,
1160 (VkOffset3D
) { 0, 0, 0 },
1161 pRegions
[r
].imageExtent
);
1163 anv_DestroyObject(vk_device
, VK_OBJECT_TYPE_IMAGE
, (VkImage
) dest_image
);
1166 meta_finish_blit(cmd_buffer
, &saved_state
);
1169 void anv_CmdUpdateBuffer(
1170 VkCmdBuffer cmdBuffer
,
1171 VkBuffer destBuffer
,
1172 VkDeviceSize destOffset
,
1173 VkDeviceSize dataSize
,
1174 const uint32_t* pData
)
1179 void anv_CmdFillBuffer(
1180 VkCmdBuffer cmdBuffer
,
1181 VkBuffer destBuffer
,
1182 VkDeviceSize destOffset
,
1183 VkDeviceSize fillSize
,
1189 void anv_CmdClearColorImage(
1190 VkCmdBuffer cmdBuffer
,
1192 VkImageLayout imageLayout
,
1194 uint32_t rangeCount
,
1195 const VkImageSubresourceRange
* pRanges
)
1197 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
1198 struct anv_image
*image
= (struct anv_image
*)_image
;
1199 struct anv_saved_state saved_state
;
1201 anv_cmd_buffer_save(cmd_buffer
, &saved_state
);
1203 for (uint32_t r
= 0; r
< rangeCount
; r
++) {
1204 for (uint32_t l
= 0; l
< pRanges
[r
].mipLevels
; l
++) {
1205 for (uint32_t s
= 0; s
< pRanges
[r
].arraySize
; s
++) {
1206 struct anv_surface_view view
;
1207 anv_color_attachment_view_init(&view
, cmd_buffer
->device
,
1208 &(VkColorAttachmentViewCreateInfo
) {
1209 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
1211 .format
= image
->format
,
1212 .mipLevel
= pRanges
[r
].baseMipLevel
+ l
,
1213 .baseArraySlice
= pRanges
[r
].baseArraySlice
+ s
,
1219 anv_CreateFramebuffer((VkDevice
) cmd_buffer
->device
,
1220 &(VkFramebufferCreateInfo
) {
1221 .sType
= VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
,
1222 .colorAttachmentCount
= 1,
1223 .pColorAttachments
= (VkColorAttachmentBindInfo
[]) {
1225 .view
= (VkColorAttachmentView
) &view
,
1226 .layout
= VK_IMAGE_LAYOUT_GENERAL
1229 .pDepthStencilAttachment
= NULL
,
1231 .width
= view
.extent
.width
,
1232 .height
= view
.extent
.height
,
1237 anv_CreateRenderPass((VkDevice
) cmd_buffer
->device
,
1238 &(VkRenderPassCreateInfo
) {
1239 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
,
1240 .renderArea
= { { 0, 0 }, { view
.extent
.width
, view
.extent
.height
} },
1241 .colorAttachmentCount
= 1,
1245 .pColorFormats
= (VkFormat
[]) { image
->format
},
1246 .pColorLayouts
= (VkImageLayout
[]) { imageLayout
},
1247 .pColorLoadOps
= (VkAttachmentLoadOp
[]) { VK_ATTACHMENT_LOAD_OP_DONT_CARE
},
1248 .pColorStoreOps
= (VkAttachmentStoreOp
[]) { VK_ATTACHMENT_STORE_OP_STORE
},
1249 .pColorLoadClearValues
= &color
,
1250 .depthStencilFormat
= VK_FORMAT_UNDEFINED
,
1253 anv_CmdBeginRenderPass((VkCmdBuffer
) cmd_buffer
,
1254 &(VkRenderPassBegin
) {
1256 .framebuffer
= (VkFramebuffer
) fb
,
1259 struct clear_instance_data instance_data
= {
1266 color
.color
.floatColor
[0],
1267 color
.color
.floatColor
[1],
1268 color
.color
.floatColor
[2],
1269 color
.color
.floatColor
[3],
1273 meta_emit_clear(cmd_buffer
, 1, &instance_data
);
1275 anv_CmdEndRenderPass((VkCmdBuffer
) cmd_buffer
, pass
);
1280 /* Restore API state */
1281 anv_cmd_buffer_restore(cmd_buffer
, &saved_state
);
1284 void anv_CmdClearDepthStencil(
1285 VkCmdBuffer cmdBuffer
,
1287 VkImageLayout imageLayout
,
1290 uint32_t rangeCount
,
1291 const VkImageSubresourceRange
* pRanges
)
1296 void anv_CmdResolveImage(
1297 VkCmdBuffer cmdBuffer
,
1299 VkImageLayout srcImageLayout
,
1301 VkImageLayout destImageLayout
,
1302 uint32_t regionCount
,
1303 const VkImageResolve
* pRegions
)
1309 anv_device_init_meta(struct anv_device
*device
)
1311 anv_device_init_meta_clear_state(device
);
1312 anv_device_init_meta_blit_state(device
);
1314 anv_CreateDynamicRasterState((VkDevice
) device
,
1315 &(VkDynamicRsStateCreateInfo
) {
1316 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO
,
1318 &device
->meta_state
.shared
.rs_state
);
1320 anv_CreateDynamicColorBlendState((VkDevice
) device
,
1321 &(VkDynamicCbStateCreateInfo
) {
1322 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO
1324 &device
->meta_state
.shared
.cb_state
);
1326 anv_CreateDynamicDepthStencilState((VkDevice
) device
,
1327 &(VkDynamicDsStateCreateInfo
) {
1328 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO
1330 &device
->meta_state
.shared
.ds_state
);
1334 anv_device_finish_meta(struct anv_device
*device
)
1337 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_PIPELINE
,
1338 device
->meta_state
.clear
.pipeline
);
1341 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_PIPELINE
,
1342 device
->meta_state
.blit
.pipeline
);
1343 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_PIPELINE_LAYOUT
,
1344 device
->meta_state
.blit
.pipeline_layout
);
1345 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT
,
1346 device
->meta_state
.blit
.ds_layout
);
1349 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_DYNAMIC_RS_STATE
,
1350 device
->meta_state
.shared
.rs_state
);
1351 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_DYNAMIC_CB_STATE
,
1352 device
->meta_state
.shared
.cb_state
);
1353 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_DYNAMIC_DS_STATE
,
1354 device
->meta_state
.shared
.ds_state
);