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 .disableVertexReuse
= false,
40 .primitiveRestartEnable
= false,
41 .primitiveRestartIndex
= 0
44 /* We don't use a vertex shader for clearing, but instead build and pass
45 * the VUEs directly to the rasterization backend.
47 VkShader fs
= GLSL_VK_SHADER(device
, FRAGMENT
,
56 VkPipelineShaderStageCreateInfo fs_create_info
= {
57 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
58 .pNext
= &ia_create_info
,
60 .stage
= VK_SHADER_STAGE_FRAGMENT
,
62 .linkConstBufferCount
= 0,
63 .pLinkConstBufferInfo
= NULL
,
64 .pSpecializationInfo
= NULL
68 /* We use instanced rendering to clear multiple render targets. We have two
69 * vertex buffers: the first vertex buffer holds per-vertex data and
70 * provides the vertices for the clear rectangle. The second one holds
71 * per-instance data, which consists of the VUE header (which selects the
72 * layer) and the color (Vulkan supports per-RT clear colors).
74 VkPipelineVertexInputCreateInfo vi_create_info
= {
75 .sType
= VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO
,
76 .pNext
= &fs_create_info
,
78 .pVertexBindingDescriptions
= (VkVertexInputBindingDescription
[]) {
82 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_VERTEX
87 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_INSTANCE
91 .pVertexAttributeDescriptions
= (VkVertexInputAttributeDescription
[]) {
96 .format
= VK_FORMAT_R32G32B32A32_UINT
,
103 .format
= VK_FORMAT_R32G32_SFLOAT
,
110 .format
= VK_FORMAT_R32G32B32A32_SFLOAT
,
116 VkPipelineRsStateCreateInfo rs_create_info
= {
117 .sType
= VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO
,
118 .pNext
= &vi_create_info
,
119 .depthClipEnable
= true,
120 .rasterizerDiscardEnable
= false,
121 .fillMode
= VK_FILL_MODE_SOLID
,
122 .cullMode
= VK_CULL_MODE_NONE
,
123 .frontFace
= VK_FRONT_FACE_CCW
126 VkPipelineCbStateCreateInfo cb_create_info
= {
127 .sType
= VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO
,
128 .pNext
= &rs_create_info
,
129 .attachmentCount
= 1,
130 .pAttachments
= (VkPipelineCbAttachmentState
[]) {
131 { .channelWriteMask
= VK_CHANNEL_A_BIT
|
132 VK_CHANNEL_R_BIT
| VK_CHANNEL_G_BIT
| VK_CHANNEL_B_BIT
},
136 anv_pipeline_create((VkDevice
) device
,
137 &(VkGraphicsPipelineCreateInfo
) {
138 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
139 .pNext
= &cb_create_info
,
143 &(struct anv_pipeline_create_info
) {
144 .use_repclear
= true,
145 .disable_viewport
= true,
148 &device
->meta_state
.clear
.pipeline
);
150 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, fs
);
153 #define NUM_VB_USED 2
154 struct anv_saved_state
{
155 struct anv_vertex_binding old_vertex_bindings
[NUM_VB_USED
];
156 struct anv_descriptor_set
*old_descriptor_set0
;
157 struct anv_pipeline
*old_pipeline
;
158 VkDynamicCbState cb_state
;
162 anv_cmd_buffer_save(struct anv_cmd_buffer
*cmd_buffer
,
163 struct anv_saved_state
*state
)
165 state
->old_pipeline
= cmd_buffer
->pipeline
;
166 state
->old_descriptor_set0
= cmd_buffer
->descriptors
[0].set
;
167 memcpy(state
->old_vertex_bindings
, cmd_buffer
->vertex_bindings
,
168 sizeof(state
->old_vertex_bindings
));
172 anv_cmd_buffer_restore(struct anv_cmd_buffer
*cmd_buffer
,
173 const struct anv_saved_state
*state
)
175 cmd_buffer
->pipeline
= state
->old_pipeline
;
176 cmd_buffer
->descriptors
[0].set
= state
->old_descriptor_set0
;
177 memcpy(cmd_buffer
->vertex_bindings
, state
->old_vertex_bindings
,
178 sizeof(state
->old_vertex_bindings
));
180 cmd_buffer
->vb_dirty
|= (1 << NUM_VB_USED
) - 1;
181 cmd_buffer
->dirty
|= ANV_CMD_BUFFER_PIPELINE_DIRTY
;
182 cmd_buffer
->descriptors_dirty
|= VK_SHADER_STAGE_VERTEX_BIT
;
188 uint32_t ViewportIndex
;
193 anv_cmd_buffer_clear(struct anv_cmd_buffer
*cmd_buffer
,
194 struct anv_render_pass
*pass
)
196 struct anv_device
*device
= cmd_buffer
->device
;
197 struct anv_framebuffer
*fb
= cmd_buffer
->framebuffer
;
198 struct anv_saved_state saved_state
;
199 struct anv_state state
;
202 struct instance_data
{
203 struct vue_header vue_header
;
207 if (pass
->num_clear_layers
== 0)
210 const float vertex_data
[] = {
211 /* Rect-list coordinates */
214 fb
->width
, fb
->height
,
216 /* Align to 16 bytes */
220 size
= sizeof(vertex_data
) + pass
->num_clear_layers
* sizeof(instance_data
[0]);
221 state
= anv_state_stream_alloc(&cmd_buffer
->surface_state_stream
, size
, 16);
223 memcpy(state
.map
, vertex_data
, sizeof(vertex_data
));
224 instance_data
= state
.map
+ sizeof(vertex_data
);
226 for (uint32_t i
= 0; i
< pass
->num_layers
; i
++) {
227 if (pass
->layers
[i
].color_load_op
== VK_ATTACHMENT_LOAD_OP_CLEAR
) {
228 *instance_data
++ = (struct instance_data
) {
235 pass
->layers
[i
].clear_color
.color
.floatColor
[0],
236 pass
->layers
[i
].clear_color
.color
.floatColor
[1],
237 pass
->layers
[i
].clear_color
.color
.floatColor
[2],
238 pass
->layers
[i
].clear_color
.color
.floatColor
[3],
244 struct anv_buffer vertex_buffer
= {
245 .device
= cmd_buffer
->device
,
247 .bo
= &device
->surface_state_block_pool
.bo
,
248 .offset
= state
.offset
251 anv_cmd_buffer_save(cmd_buffer
, &saved_state
);
253 anv_CmdBindVertexBuffers((VkCmdBuffer
) cmd_buffer
, 0, 2,
255 (VkBuffer
) &vertex_buffer
,
256 (VkBuffer
) &vertex_buffer
263 if ((VkPipeline
) cmd_buffer
->pipeline
!= device
->meta_state
.clear
.pipeline
)
264 anv_CmdBindPipeline((VkCmdBuffer
) cmd_buffer
,
265 VK_PIPELINE_BIND_POINT_GRAPHICS
,
266 device
->meta_state
.clear
.pipeline
);
268 /* We don't need anything here, only set if not already set. */
269 if (cmd_buffer
->rs_state
== NULL
)
270 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
271 VK_STATE_BIND_POINT_RASTER
,
272 device
->meta_state
.shared
.rs_state
);
274 if (cmd_buffer
->vp_state
== NULL
)
275 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
276 VK_STATE_BIND_POINT_VIEWPORT
,
277 cmd_buffer
->framebuffer
->vp_state
);
279 if (cmd_buffer
->ds_state
== NULL
)
280 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
281 VK_STATE_BIND_POINT_DEPTH_STENCIL
,
282 device
->meta_state
.shared
.ds_state
);
284 anv_CmdDraw((VkCmdBuffer
) cmd_buffer
, 0, 3, 0, pass
->num_clear_layers
);
286 /* Restore API state */
287 anv_cmd_buffer_restore(cmd_buffer
, &saved_state
);
292 anv_device_init_meta_blit_state(struct anv_device
*device
)
294 VkPipelineIaStateCreateInfo ia_create_info
= {
295 .sType
= VK_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO
,
296 .topology
= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
,
297 .disableVertexReuse
= false,
298 .primitiveRestartEnable
= false,
299 .primitiveRestartIndex
= 0
302 /* We don't use a vertex shader for clearing, but instead build and pass
303 * the VUEs directly to the rasterization backend. However, we do need
304 * to provide GLSL source for the vertex shader so that the compiler
305 * does not dead-code our inputs.
307 VkShader vs
= GLSL_VK_SHADER(device
, VERTEX
,
310 out vec4 v_tex_coord
;
313 v_tex_coord
= vec4(a_tex_coord
, 0, 1);
314 gl_Position
= vec4(a_pos
, 0, 1);
318 VkShader fs
= GLSL_VK_SHADER(device
, FRAGMENT
,
321 layout(set
= 0, binding
= 0) uniform sampler2D u_tex
;
324 f_color
= texture(u_tex
, v_tex_coord
.xy
);
328 VkPipelineShaderStageCreateInfo vs_create_info
= {
329 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
330 .pNext
= &ia_create_info
,
332 .stage
= VK_SHADER_STAGE_VERTEX
,
334 .linkConstBufferCount
= 0,
335 .pLinkConstBufferInfo
= NULL
,
336 .pSpecializationInfo
= NULL
340 VkPipelineShaderStageCreateInfo fs_create_info
= {
341 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
342 .pNext
= &vs_create_info
,
344 .stage
= VK_SHADER_STAGE_FRAGMENT
,
346 .linkConstBufferCount
= 0,
347 .pLinkConstBufferInfo
= NULL
,
348 .pSpecializationInfo
= NULL
352 VkPipelineVertexInputCreateInfo vi_create_info
= {
353 .sType
= VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO
,
354 .pNext
= &fs_create_info
,
356 .pVertexBindingDescriptions
= (VkVertexInputBindingDescription
[]) {
360 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_VERTEX
365 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_VERTEX
369 .pVertexAttributeDescriptions
= (VkVertexInputAttributeDescription
[]) {
374 .format
= VK_FORMAT_R32G32B32A32_UINT
,
381 .format
= VK_FORMAT_R32G32_SFLOAT
,
385 /* Texture Coordinate */
388 .format
= VK_FORMAT_R32G32_SFLOAT
,
394 VkDescriptorSetLayoutCreateInfo ds_layout_info
= {
395 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
397 .pBinding
= (VkDescriptorSetLayoutBinding
[]) {
399 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
401 .stageFlags
= VK_SHADER_STAGE_FRAGMENT_BIT
,
402 .pImmutableSamplers
= NULL
406 anv_CreateDescriptorSetLayout((VkDevice
) device
, &ds_layout_info
,
407 &device
->meta_state
.blit
.ds_layout
);
409 VkPipelineLayoutCreateInfo pipeline_layout_info
= {
410 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
411 .descriptorSetCount
= 1,
412 .pSetLayouts
= &device
->meta_state
.blit
.ds_layout
,
415 VkPipelineLayout pipeline_layout
;
416 anv_CreatePipelineLayout((VkDevice
) device
, &pipeline_layout_info
,
419 VkPipelineRsStateCreateInfo rs_create_info
= {
420 .sType
= VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO
,
421 .pNext
= &vi_create_info
,
422 .depthClipEnable
= true,
423 .rasterizerDiscardEnable
= false,
424 .fillMode
= VK_FILL_MODE_SOLID
,
425 .cullMode
= VK_CULL_MODE_NONE
,
426 .frontFace
= VK_FRONT_FACE_CCW
429 VkPipelineCbStateCreateInfo cb_create_info
= {
430 .sType
= VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO
,
431 .pNext
= &rs_create_info
,
432 .attachmentCount
= 1,
433 .pAttachments
= (VkPipelineCbAttachmentState
[]) {
434 { .channelWriteMask
= VK_CHANNEL_A_BIT
|
435 VK_CHANNEL_R_BIT
| VK_CHANNEL_G_BIT
| VK_CHANNEL_B_BIT
},
439 VkGraphicsPipelineCreateInfo pipeline_info
= {
440 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
441 .pNext
= &cb_create_info
,
443 .layout
= pipeline_layout
,
446 anv_pipeline_create((VkDevice
) device
, &pipeline_info
,
447 &(struct anv_pipeline_create_info
) {
448 .use_repclear
= false,
449 .disable_viewport
= true,
450 .disable_scissor
= true,
454 &device
->meta_state
.blit
.pipeline
);
456 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, vs
);
457 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, fs
);
461 meta_prepare_blit(struct anv_cmd_buffer
*cmd_buffer
,
462 struct anv_saved_state
*saved_state
)
464 struct anv_device
*device
= cmd_buffer
->device
;
466 anv_cmd_buffer_save(cmd_buffer
, saved_state
);
468 if ((VkPipeline
) cmd_buffer
->pipeline
!= device
->meta_state
.blit
.pipeline
)
469 anv_CmdBindPipeline((VkCmdBuffer
) cmd_buffer
,
470 VK_PIPELINE_BIND_POINT_GRAPHICS
,
471 device
->meta_state
.blit
.pipeline
);
473 /* We don't need anything here, only set if not already set. */
474 if (cmd_buffer
->rs_state
== NULL
)
475 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
476 VK_STATE_BIND_POINT_RASTER
,
477 device
->meta_state
.shared
.rs_state
);
478 if (cmd_buffer
->ds_state
== NULL
)
479 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
480 VK_STATE_BIND_POINT_DEPTH_STENCIL
,
481 device
->meta_state
.shared
.ds_state
);
483 saved_state
->cb_state
= (VkDynamicCbState
) cmd_buffer
->cb_state
;
484 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
485 VK_STATE_BIND_POINT_COLOR_BLEND
,
486 device
->meta_state
.shared
.cb_state
);
490 VkOffset3D src_offset
;
491 VkExtent3D src_extent
;
492 VkOffset3D dest_offset
;
493 VkExtent3D dest_extent
;
497 meta_emit_blit(struct anv_cmd_buffer
*cmd_buffer
,
498 struct anv_surface_view
*src
,
499 VkOffset3D src_offset
,
500 VkExtent3D src_extent
,
501 struct anv_surface_view
*dest
,
502 VkOffset3D dest_offset
,
503 VkExtent3D dest_extent
)
505 struct anv_device
*device
= cmd_buffer
->device
;
507 struct blit_vb_data
{
512 unsigned vb_size
= sizeof(struct vue_header
) + 3 * sizeof(*vb_data
);
514 struct anv_state vb_state
=
515 anv_state_stream_alloc(&cmd_buffer
->surface_state_stream
, vb_size
, 16);
516 memset(vb_state
.map
, 0, sizeof(struct vue_header
));
517 vb_data
= vb_state
.map
+ sizeof(struct vue_header
);
519 vb_data
[0] = (struct blit_vb_data
) {
521 dest_offset
.x
+ dest_extent
.width
,
522 dest_offset
.y
+ dest_extent
.height
,
525 (float)(src_offset
.x
+ src_extent
.width
) / (float)src
->extent
.width
,
526 (float)(src_offset
.y
+ src_extent
.height
) / (float)src
->extent
.height
,
530 vb_data
[1] = (struct blit_vb_data
) {
533 dest_offset
.y
+ dest_extent
.height
,
536 (float)src_offset
.x
/ (float)src
->extent
.width
,
537 (float)(src_offset
.y
+ src_extent
.height
) / (float)src
->extent
.height
,
541 vb_data
[2] = (struct blit_vb_data
) {
547 (float)src_offset
.x
/ (float)src
->extent
.width
,
548 (float)src_offset
.y
/ (float)src
->extent
.height
,
552 struct anv_buffer vertex_buffer
= {
555 .bo
= &device
->surface_state_block_pool
.bo
,
556 .offset
= vb_state
.offset
,
559 anv_CmdBindVertexBuffers((VkCmdBuffer
) cmd_buffer
, 0, 2,
561 (VkBuffer
) &vertex_buffer
,
562 (VkBuffer
) &vertex_buffer
566 sizeof(struct vue_header
),
571 anv_AllocDescriptorSets((VkDevice
) device
, 0 /* pool */,
572 VK_DESCRIPTOR_SET_USAGE_ONE_SHOT
,
573 1, &device
->meta_state
.blit
.ds_layout
, &set
, &count
);
574 anv_UpdateDescriptors((VkDevice
) device
, set
, 1,
577 .sType
= VK_STRUCTURE_TYPE_UPDATE_IMAGES
,
578 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
581 .pImageViews
= (VkImageViewAttachInfo
[]) {
583 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO
,
584 .view
= (VkImageView
) src
,
585 .layout
= VK_IMAGE_LAYOUT_GENERAL
,
591 struct anv_framebuffer
*fb
;
592 anv_CreateFramebuffer((VkDevice
) device
,
593 &(VkFramebufferCreateInfo
) {
594 .sType
= VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
,
595 .colorAttachmentCount
= 1,
596 .pColorAttachments
= (VkColorAttachmentBindInfo
[]) {
598 .view
= (VkColorAttachmentView
) dest
,
599 .layout
= VK_IMAGE_LAYOUT_GENERAL
602 .pDepthStencilAttachment
= NULL
,
604 .width
= dest
->extent
.width
,
605 .height
= dest
->extent
.height
,
607 }, (VkFramebuffer
*)&fb
);
611 anv_CreateRenderPass((VkDevice
)device
,
612 &(VkRenderPassCreateInfo
) {
613 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
,
614 .renderArea
= { { 0, 0 }, { dest
->extent
.width
, dest
->extent
.height
} },
615 .colorAttachmentCount
= 1,
619 .pColorFormats
= (VkFormat
[]) { dest
->format
},
620 .pColorLayouts
= (VkImageLayout
[]) { VK_IMAGE_LAYOUT_GENERAL
},
621 .pColorLoadOps
= (VkAttachmentLoadOp
[]) { VK_ATTACHMENT_LOAD_OP_LOAD
},
622 .pColorStoreOps
= (VkAttachmentStoreOp
[]) { VK_ATTACHMENT_STORE_OP_STORE
},
623 .pColorLoadClearValues
= (VkClearColor
[]) {
624 { .color
= { .floatColor
= { 1.0, 0.0, 0.0, 1.0 } }, .useRawValue
= false }
626 .depthStencilFormat
= VK_FORMAT_UNDEFINED
,
629 anv_CmdBeginRenderPass((VkCmdBuffer
) cmd_buffer
,
630 &(VkRenderPassBegin
) {
632 .framebuffer
= (VkFramebuffer
) fb
,
635 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
636 VK_STATE_BIND_POINT_VIEWPORT
, fb
->vp_state
);
638 anv_CmdBindDescriptorSets((VkCmdBuffer
) cmd_buffer
,
639 VK_PIPELINE_BIND_POINT_GRAPHICS
, 0, 1,
642 anv_CmdDraw((VkCmdBuffer
) cmd_buffer
, 0, 3, 0, 1);
644 anv_CmdEndRenderPass((VkCmdBuffer
) cmd_buffer
, pass
);
648 meta_finish_blit(struct anv_cmd_buffer
*cmd_buffer
,
649 const struct anv_saved_state
*saved_state
)
651 anv_cmd_buffer_restore(cmd_buffer
, saved_state
);
652 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
653 VK_STATE_BIND_POINT_COLOR_BLEND
,
654 saved_state
->cb_state
);
658 vk_format_for_cpp(int cpp
)
661 case 1: return VK_FORMAT_R8_UINT
;
662 case 2: return VK_FORMAT_R8G8_UINT
;
663 case 3: return VK_FORMAT_R8G8B8_UINT
;
664 case 4: return VK_FORMAT_R8G8B8A8_UINT
;
665 case 6: return VK_FORMAT_R16G16B16_UINT
;
666 case 8: return VK_FORMAT_R16G16B16A16_UINT
;
667 case 12: return VK_FORMAT_R32G32B32_UINT
;
668 case 16: return VK_FORMAT_R32G32B32A32_UINT
;
670 unreachable("Invalid format cpp");
675 do_buffer_copy(struct anv_cmd_buffer
*cmd_buffer
,
676 struct anv_bo
*src
, uint64_t src_offset
,
677 struct anv_bo
*dest
, uint64_t dest_offset
,
678 int width
, int height
, VkFormat copy_format
)
680 VkDevice vk_device
= (VkDevice
)cmd_buffer
->device
;
682 VkImageCreateInfo image_info
= {
683 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
684 .imageType
= VK_IMAGE_TYPE_2D
,
685 .format
= copy_format
,
694 .tiling
= VK_IMAGE_TILING_LINEAR
,
695 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
699 struct anv_image
*src_image
, *dest_image
;
700 anv_CreateImage(vk_device
, &image_info
, (VkImage
*)&src_image
);
701 anv_CreateImage(vk_device
, &image_info
, (VkImage
*)&dest_image
);
703 /* We could use a vk call to bind memory, but that would require
704 * creating a dummy memory object etc. so there's really no point.
707 src_image
->offset
= src_offset
;
708 dest_image
->bo
= dest
;
709 dest_image
->offset
= dest_offset
;
711 struct anv_surface_view src_view
;
712 anv_image_view_init(&src_view
, cmd_buffer
->device
,
713 &(VkImageViewCreateInfo
) {
714 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
715 .image
= (VkImage
)src_image
,
716 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
717 .format
= copy_format
,
719 VK_CHANNEL_SWIZZLE_R
,
720 VK_CHANNEL_SWIZZLE_G
,
721 VK_CHANNEL_SWIZZLE_B
,
724 .subresourceRange
= {
725 .aspect
= VK_IMAGE_ASPECT_COLOR
,
735 struct anv_surface_view dest_view
;
736 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
737 &(VkColorAttachmentViewCreateInfo
) {
738 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
739 .image
= (VkImage
)dest_image
,
740 .format
= copy_format
,
747 meta_emit_blit(cmd_buffer
,
749 (VkOffset3D
) { 0, 0, 0 },
750 (VkExtent3D
) { width
, height
, 1 },
752 (VkOffset3D
) { 0, 0, 0 },
753 (VkExtent3D
) { width
, height
, 1 });
756 void anv_CmdCopyBuffer(
757 VkCmdBuffer cmdBuffer
,
760 uint32_t regionCount
,
761 const VkBufferCopy
* pRegions
)
763 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
764 struct anv_buffer
*src_buffer
= (struct anv_buffer
*)srcBuffer
;
765 struct anv_buffer
*dest_buffer
= (struct anv_buffer
*)destBuffer
;
766 struct anv_saved_state saved_state
;
768 meta_prepare_blit(cmd_buffer
, &saved_state
);
770 for (unsigned r
= 0; r
< regionCount
; r
++) {
771 uint64_t src_offset
= src_buffer
->offset
+ pRegions
[r
].srcOffset
;
772 uint64_t dest_offset
= dest_buffer
->offset
+ pRegions
[r
].destOffset
;
773 uint64_t copy_size
= pRegions
[r
].copySize
;
775 /* First, we compute the biggest format that can be used with the
776 * given offsets and size.
780 int fs
= ffs(src_offset
) - 1;
782 cpp
= MIN2(cpp
, 1 << fs
);
783 assert(src_offset
% cpp
== 0);
785 fs
= ffs(dest_offset
) - 1;
787 cpp
= MIN2(cpp
, 1 << fs
);
788 assert(dest_offset
% cpp
== 0);
790 fs
= ffs(pRegions
[r
].copySize
) - 1;
792 cpp
= MIN2(cpp
, 1 << fs
);
793 assert(pRegions
[r
].copySize
% cpp
== 0);
795 VkFormat copy_format
= vk_format_for_cpp(cpp
);
797 /* This is maximum possible width/height our HW can handle */
798 uint64_t max_surface_dim
= 1 << 14;
800 /* First, we make a bunch of max-sized copies */
801 uint64_t max_copy_size
= max_surface_dim
* max_surface_dim
* cpp
;
802 while (copy_size
> max_copy_size
) {
803 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
804 dest_buffer
->bo
, dest_offset
,
805 max_surface_dim
, max_surface_dim
, copy_format
);
806 copy_size
-= max_copy_size
;
807 src_offset
+= max_copy_size
;
808 dest_offset
+= max_copy_size
;
811 uint64_t height
= copy_size
/ (max_surface_dim
* cpp
);
812 assert(height
< max_surface_dim
);
814 uint64_t rect_copy_size
= height
* max_surface_dim
* cpp
;
815 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
816 dest_buffer
->bo
, dest_offset
,
817 max_surface_dim
, height
, copy_format
);
818 copy_size
-= rect_copy_size
;
819 src_offset
+= rect_copy_size
;
820 dest_offset
+= rect_copy_size
;
823 if (copy_size
!= 0) {
824 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
825 dest_buffer
->bo
, dest_offset
,
826 copy_size
/ cpp
, 1, copy_format
);
830 meta_finish_blit(cmd_buffer
, &saved_state
);
833 void anv_CmdCopyImage(
834 VkCmdBuffer cmdBuffer
,
836 VkImageLayout srcImageLayout
,
838 VkImageLayout destImageLayout
,
839 uint32_t regionCount
,
840 const VkImageCopy
* pRegions
)
842 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
843 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
844 struct anv_saved_state saved_state
;
846 meta_prepare_blit(cmd_buffer
, &saved_state
);
848 for (unsigned r
= 0; r
< regionCount
; r
++) {
849 struct anv_surface_view src_view
;
850 anv_image_view_init(&src_view
, cmd_buffer
->device
,
851 &(VkImageViewCreateInfo
) {
852 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
854 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
855 .format
= src_image
->format
,
857 VK_CHANNEL_SWIZZLE_R
,
858 VK_CHANNEL_SWIZZLE_G
,
859 VK_CHANNEL_SWIZZLE_B
,
862 .subresourceRange
= {
863 .aspect
= pRegions
[r
].srcSubresource
.aspect
,
864 .baseMipLevel
= pRegions
[r
].srcSubresource
.mipLevel
,
866 .baseArraySlice
= pRegions
[r
].srcSubresource
.arraySlice
,
873 struct anv_surface_view dest_view
;
874 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
875 &(VkColorAttachmentViewCreateInfo
) {
876 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
878 .format
= src_image
->format
,
879 .mipLevel
= pRegions
[r
].destSubresource
.mipLevel
,
880 .baseArraySlice
= pRegions
[r
].destSubresource
.arraySlice
,
885 meta_emit_blit(cmd_buffer
,
887 pRegions
[r
].srcOffset
,
890 pRegions
[r
].destOffset
,
894 meta_finish_blit(cmd_buffer
, &saved_state
);
897 void anv_CmdBlitImage(
898 VkCmdBuffer cmdBuffer
,
900 VkImageLayout srcImageLayout
,
902 VkImageLayout destImageLayout
,
903 uint32_t regionCount
,
904 const VkImageBlit
* pRegions
)
906 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
907 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
908 struct anv_image
*dest_image
= (struct anv_image
*)destImage
;
909 struct anv_saved_state saved_state
;
911 meta_prepare_blit(cmd_buffer
, &saved_state
);
913 for (unsigned r
= 0; r
< regionCount
; r
++) {
914 struct anv_surface_view src_view
;
915 anv_image_view_init(&src_view
, cmd_buffer
->device
,
916 &(VkImageViewCreateInfo
) {
917 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
919 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
920 .format
= src_image
->format
,
922 VK_CHANNEL_SWIZZLE_R
,
923 VK_CHANNEL_SWIZZLE_G
,
924 VK_CHANNEL_SWIZZLE_B
,
927 .subresourceRange
= {
928 .aspect
= pRegions
[r
].srcSubresource
.aspect
,
929 .baseMipLevel
= pRegions
[r
].srcSubresource
.mipLevel
,
931 .baseArraySlice
= pRegions
[r
].srcSubresource
.arraySlice
,
938 struct anv_surface_view dest_view
;
939 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
940 &(VkColorAttachmentViewCreateInfo
) {
941 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
943 .format
= dest_image
->format
,
944 .mipLevel
= pRegions
[r
].destSubresource
.mipLevel
,
945 .baseArraySlice
= pRegions
[r
].destSubresource
.arraySlice
,
950 meta_emit_blit(cmd_buffer
,
952 pRegions
[r
].srcOffset
,
953 pRegions
[r
].srcExtent
,
955 pRegions
[r
].destOffset
,
956 pRegions
[r
].destExtent
);
959 meta_finish_blit(cmd_buffer
, &saved_state
);
962 void anv_CmdCopyBufferToImage(
963 VkCmdBuffer cmdBuffer
,
966 VkImageLayout destImageLayout
,
967 uint32_t regionCount
,
968 const VkBufferImageCopy
* pRegions
)
970 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
971 VkDevice vk_device
= (VkDevice
) cmd_buffer
->device
;
972 struct anv_buffer
*src_buffer
= (struct anv_buffer
*)srcBuffer
;
973 struct anv_image
*dest_image
= (struct anv_image
*)destImage
;
974 struct anv_saved_state saved_state
;
976 meta_prepare_blit(cmd_buffer
, &saved_state
);
978 for (unsigned r
= 0; r
< regionCount
; r
++) {
979 struct anv_image
*src_image
;
980 anv_CreateImage(vk_device
,
981 &(VkImageCreateInfo
) {
982 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
983 .imageType
= VK_IMAGE_TYPE_2D
,
984 .format
= dest_image
->format
,
986 .width
= pRegions
[r
].imageExtent
.width
,
987 .height
= pRegions
[r
].imageExtent
.height
,
993 .tiling
= VK_IMAGE_TILING_LINEAR
,
994 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
996 }, (VkImage
*)&src_image
);
998 /* We could use a vk call to bind memory, but that would require
999 * creating a dummy memory object etc. so there's really no point.
1001 src_image
->bo
= src_buffer
->bo
;
1002 src_image
->offset
= src_buffer
->offset
+ pRegions
[r
].bufferOffset
;
1004 struct anv_surface_view src_view
;
1005 anv_image_view_init(&src_view
, cmd_buffer
->device
,
1006 &(VkImageViewCreateInfo
) {
1007 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
1008 .image
= (VkImage
)src_image
,
1009 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
1010 .format
= dest_image
->format
,
1012 VK_CHANNEL_SWIZZLE_R
,
1013 VK_CHANNEL_SWIZZLE_G
,
1014 VK_CHANNEL_SWIZZLE_B
,
1015 VK_CHANNEL_SWIZZLE_A
1017 .subresourceRange
= {
1018 .aspect
= pRegions
[r
].imageSubresource
.aspect
,
1021 .baseArraySlice
= 0,
1028 struct anv_surface_view dest_view
;
1029 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
1030 &(VkColorAttachmentViewCreateInfo
) {
1031 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
1032 .image
= (VkImage
)dest_image
,
1033 .format
= dest_image
->format
,
1034 .mipLevel
= pRegions
[r
].imageSubresource
.mipLevel
,
1035 .baseArraySlice
= pRegions
[r
].imageSubresource
.arraySlice
,
1040 meta_emit_blit(cmd_buffer
,
1042 (VkOffset3D
) { 0, 0, 0 },
1043 pRegions
[r
].imageExtent
,
1045 pRegions
[r
].imageOffset
,
1046 pRegions
[r
].imageExtent
);
1049 meta_finish_blit(cmd_buffer
, &saved_state
);
1052 void anv_CmdCopyImageToBuffer(
1053 VkCmdBuffer cmdBuffer
,
1055 VkImageLayout srcImageLayout
,
1056 VkBuffer destBuffer
,
1057 uint32_t regionCount
,
1058 const VkBufferImageCopy
* pRegions
)
1060 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
1061 VkDevice vk_device
= (VkDevice
) cmd_buffer
->device
;
1062 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
1063 struct anv_buffer
*dest_buffer
= (struct anv_buffer
*)destBuffer
;
1064 struct anv_saved_state saved_state
;
1066 meta_prepare_blit(cmd_buffer
, &saved_state
);
1068 for (unsigned r
= 0; r
< regionCount
; r
++) {
1069 struct anv_surface_view src_view
;
1070 anv_image_view_init(&src_view
, cmd_buffer
->device
,
1071 &(VkImageViewCreateInfo
) {
1072 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
1074 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
1075 .format
= src_image
->format
,
1077 VK_CHANNEL_SWIZZLE_R
,
1078 VK_CHANNEL_SWIZZLE_G
,
1079 VK_CHANNEL_SWIZZLE_B
,
1080 VK_CHANNEL_SWIZZLE_A
1082 .subresourceRange
= {
1083 .aspect
= pRegions
[r
].imageSubresource
.aspect
,
1084 .baseMipLevel
= pRegions
[r
].imageSubresource
.mipLevel
,
1086 .baseArraySlice
= pRegions
[r
].imageSubresource
.arraySlice
,
1093 struct anv_image
*dest_image
;
1094 anv_CreateImage(vk_device
,
1095 &(VkImageCreateInfo
) {
1096 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
1097 .imageType
= VK_IMAGE_TYPE_2D
,
1098 .format
= src_image
->format
,
1100 .width
= pRegions
[r
].imageExtent
.width
,
1101 .height
= pRegions
[r
].imageExtent
.height
,
1107 .tiling
= VK_IMAGE_TILING_LINEAR
,
1108 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
1110 }, (VkImage
*)&dest_image
);
1112 /* We could use a vk call to bind memory, but that would require
1113 * creating a dummy memory object etc. so there's really no point.
1115 dest_image
->bo
= dest_buffer
->bo
;
1116 dest_image
->offset
= dest_buffer
->offset
+ pRegions
[r
].bufferOffset
;
1118 struct anv_surface_view dest_view
;
1119 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
1120 &(VkColorAttachmentViewCreateInfo
) {
1121 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
1122 .image
= (VkImage
)dest_image
,
1123 .format
= src_image
->format
,
1125 .baseArraySlice
= 0,
1130 meta_emit_blit(cmd_buffer
,
1132 pRegions
[r
].imageOffset
,
1133 pRegions
[r
].imageExtent
,
1135 (VkOffset3D
) { 0, 0, 0 },
1136 pRegions
[r
].imageExtent
);
1139 meta_finish_blit(cmd_buffer
, &saved_state
);
1142 void anv_CmdCloneImageData(
1143 VkCmdBuffer cmdBuffer
,
1145 VkImageLayout srcImageLayout
,
1147 VkImageLayout destImageLayout
)
1152 void anv_CmdUpdateBuffer(
1153 VkCmdBuffer cmdBuffer
,
1154 VkBuffer destBuffer
,
1155 VkDeviceSize destOffset
,
1156 VkDeviceSize dataSize
,
1157 const uint32_t* pData
)
1162 void anv_CmdFillBuffer(
1163 VkCmdBuffer cmdBuffer
,
1164 VkBuffer destBuffer
,
1165 VkDeviceSize destOffset
,
1166 VkDeviceSize fillSize
,
1172 void anv_CmdClearColorImage(
1173 VkCmdBuffer cmdBuffer
,
1175 VkImageLayout imageLayout
,
1176 const VkClearColor
* color
,
1177 uint32_t rangeCount
,
1178 const VkImageSubresourceRange
* pRanges
)
1183 void anv_CmdClearDepthStencil(
1184 VkCmdBuffer cmdBuffer
,
1186 VkImageLayout imageLayout
,
1189 uint32_t rangeCount
,
1190 const VkImageSubresourceRange
* pRanges
)
1195 void anv_CmdResolveImage(
1196 VkCmdBuffer cmdBuffer
,
1198 VkImageLayout srcImageLayout
,
1200 VkImageLayout destImageLayout
,
1201 uint32_t regionCount
,
1202 const VkImageResolve
* pRegions
)
1208 anv_device_init_meta(struct anv_device
*device
)
1210 anv_device_init_meta_clear_state(device
);
1211 anv_device_init_meta_blit_state(device
);
1213 anv_CreateDynamicRasterState((VkDevice
) device
,
1214 &(VkDynamicRsStateCreateInfo
) {
1215 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO
,
1217 &device
->meta_state
.shared
.rs_state
);
1219 anv_CreateDynamicColorBlendState((VkDevice
) device
,
1220 &(VkDynamicCbStateCreateInfo
) {
1221 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO
1223 &device
->meta_state
.shared
.cb_state
);
1225 anv_CreateDynamicDepthStencilState((VkDevice
) device
,
1226 &(VkDynamicDsStateCreateInfo
) {
1227 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO
1229 &device
->meta_state
.shared
.ds_state
);