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_bindings bindings
;
156 struct anv_bindings
*old_bindings
;
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_bindings
= cmd_buffer
->bindings
;
166 cmd_buffer
->bindings
= &state
->bindings
;
167 state
->old_pipeline
= cmd_buffer
->pipeline
;
171 anv_cmd_buffer_restore(struct anv_cmd_buffer
*cmd_buffer
,
172 const struct anv_saved_state
*state
)
174 cmd_buffer
->bindings
= state
->old_bindings
;
175 cmd_buffer
->pipeline
= state
->old_pipeline
;
177 cmd_buffer
->vb_dirty
|= (1 << NUM_VB_USED
) - 1;
178 cmd_buffer
->dirty
|= ANV_CMD_BUFFER_PIPELINE_DIRTY
|
179 ANV_CMD_BUFFER_DESCRIPTOR_SET_DIRTY
;
183 anv_cmd_buffer_copy_render_targets(struct anv_cmd_buffer
*cmd_buffer
,
184 struct anv_saved_state
*state
)
186 struct anv_framebuffer
*fb
= cmd_buffer
->framebuffer
;
187 struct anv_bindings
*old_bindings
= state
->old_bindings
;
188 struct anv_bindings
*bindings
= cmd_buffer
->bindings
;
190 for (uint32_t i
= 0; i
< fb
->color_attachment_count
; i
++) {
191 bindings
->descriptors
[VK_SHADER_STAGE_FRAGMENT
].surfaces
[i
] =
192 old_bindings
->descriptors
[VK_SHADER_STAGE_FRAGMENT
].surfaces
[i
];
195 cmd_buffer
->dirty
|= ANV_CMD_BUFFER_DESCRIPTOR_SET_DIRTY
;
201 uint32_t ViewportIndex
;
206 anv_cmd_buffer_clear(struct anv_cmd_buffer
*cmd_buffer
,
207 struct anv_render_pass
*pass
)
209 struct anv_device
*device
= cmd_buffer
->device
;
210 struct anv_framebuffer
*fb
= cmd_buffer
->framebuffer
;
211 struct anv_saved_state saved_state
;
212 struct anv_state state
;
215 struct instance_data
{
216 struct vue_header vue_header
;
220 if (pass
->num_clear_layers
== 0)
223 const float vertex_data
[] = {
224 /* Rect-list coordinates */
227 fb
->width
, fb
->height
,
229 /* Align to 16 bytes */
233 size
= sizeof(vertex_data
) + pass
->num_clear_layers
* sizeof(instance_data
[0]);
234 state
= anv_state_stream_alloc(&cmd_buffer
->surface_state_stream
, size
, 16);
236 memcpy(state
.map
, vertex_data
, sizeof(vertex_data
));
237 instance_data
= state
.map
+ sizeof(vertex_data
);
239 for (uint32_t i
= 0; i
< pass
->num_layers
; i
++) {
240 if (pass
->layers
[i
].color_load_op
== VK_ATTACHMENT_LOAD_OP_CLEAR
) {
241 *instance_data
++ = (struct instance_data
) {
248 pass
->layers
[i
].clear_color
.color
.floatColor
[0],
249 pass
->layers
[i
].clear_color
.color
.floatColor
[1],
250 pass
->layers
[i
].clear_color
.color
.floatColor
[2],
251 pass
->layers
[i
].clear_color
.color
.floatColor
[3],
257 struct anv_buffer vertex_buffer
= {
258 .device
= cmd_buffer
->device
,
260 .bo
= &device
->surface_state_block_pool
.bo
,
261 .offset
= state
.offset
264 anv_cmd_buffer_save(cmd_buffer
, &saved_state
);
265 anv_cmd_buffer_copy_render_targets(cmd_buffer
, &saved_state
);
267 anv_CmdBindVertexBuffers((VkCmdBuffer
) cmd_buffer
, 0, 2,
269 (VkBuffer
) &vertex_buffer
,
270 (VkBuffer
) &vertex_buffer
277 if ((VkPipeline
) cmd_buffer
->pipeline
!= device
->meta_state
.clear
.pipeline
)
278 anv_CmdBindPipeline((VkCmdBuffer
) cmd_buffer
,
279 VK_PIPELINE_BIND_POINT_GRAPHICS
,
280 device
->meta_state
.clear
.pipeline
);
282 /* We don't need anything here, only set if not already set. */
283 if (cmd_buffer
->rs_state
== NULL
)
284 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
285 VK_STATE_BIND_POINT_RASTER
,
286 device
->meta_state
.shared
.rs_state
);
288 if (cmd_buffer
->vp_state
== NULL
)
289 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
290 VK_STATE_BIND_POINT_VIEWPORT
,
291 cmd_buffer
->framebuffer
->vp_state
);
293 if (cmd_buffer
->ds_state
== NULL
)
294 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
295 VK_STATE_BIND_POINT_DEPTH_STENCIL
,
296 device
->meta_state
.shared
.ds_state
);
298 anv_CmdDraw((VkCmdBuffer
) cmd_buffer
, 0, 3, 0, pass
->num_clear_layers
);
300 /* Restore API state */
301 anv_cmd_buffer_restore(cmd_buffer
, &saved_state
);
306 anv_device_init_meta_blit_state(struct anv_device
*device
)
308 VkPipelineIaStateCreateInfo ia_create_info
= {
309 .sType
= VK_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO
,
310 .topology
= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
,
311 .disableVertexReuse
= false,
312 .primitiveRestartEnable
= false,
313 .primitiveRestartIndex
= 0
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 VkPipelineLayoutCreateInfo pipeline_layout_info
= {
424 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
425 .descriptorSetCount
= 1,
426 .pSetLayouts
= &device
->meta_state
.blit
.ds_layout
,
429 VkPipelineLayout pipeline_layout
;
430 anv_CreatePipelineLayout((VkDevice
) device
, &pipeline_layout_info
,
433 VkPipelineRsStateCreateInfo rs_create_info
= {
434 .sType
= VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO
,
435 .pNext
= &vi_create_info
,
436 .depthClipEnable
= true,
437 .rasterizerDiscardEnable
= false,
438 .fillMode
= VK_FILL_MODE_SOLID
,
439 .cullMode
= VK_CULL_MODE_NONE
,
440 .frontFace
= VK_FRONT_FACE_CCW
443 VkPipelineCbStateCreateInfo cb_create_info
= {
444 .sType
= VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO
,
445 .pNext
= &rs_create_info
,
446 .attachmentCount
= 1,
447 .pAttachments
= (VkPipelineCbAttachmentState
[]) {
448 { .channelWriteMask
= VK_CHANNEL_A_BIT
|
449 VK_CHANNEL_R_BIT
| VK_CHANNEL_G_BIT
| VK_CHANNEL_B_BIT
},
453 VkGraphicsPipelineCreateInfo pipeline_info
= {
454 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
455 .pNext
= &cb_create_info
,
457 .layout
= pipeline_layout
,
460 anv_pipeline_create((VkDevice
) device
, &pipeline_info
,
461 &(struct anv_pipeline_create_info
) {
462 .use_repclear
= false,
463 .disable_viewport
= true,
464 .disable_scissor
= true,
468 &device
->meta_state
.blit
.pipeline
);
470 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, vs
);
471 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, fs
);
475 meta_prepare_blit(struct anv_cmd_buffer
*cmd_buffer
,
476 struct anv_saved_state
*saved_state
)
478 struct anv_device
*device
= cmd_buffer
->device
;
480 anv_cmd_buffer_save(cmd_buffer
, saved_state
);
482 if ((VkPipeline
) cmd_buffer
->pipeline
!= device
->meta_state
.blit
.pipeline
)
483 anv_CmdBindPipeline((VkCmdBuffer
) cmd_buffer
,
484 VK_PIPELINE_BIND_POINT_GRAPHICS
,
485 device
->meta_state
.blit
.pipeline
);
487 /* We don't need anything here, only set if not already set. */
488 if (cmd_buffer
->rs_state
== NULL
)
489 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
490 VK_STATE_BIND_POINT_RASTER
,
491 device
->meta_state
.shared
.rs_state
);
492 if (cmd_buffer
->ds_state
== NULL
)
493 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
494 VK_STATE_BIND_POINT_DEPTH_STENCIL
,
495 device
->meta_state
.shared
.ds_state
);
497 saved_state
->cb_state
= (VkDynamicCbState
) cmd_buffer
->cb_state
;
498 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
499 VK_STATE_BIND_POINT_COLOR_BLEND
,
500 device
->meta_state
.shared
.cb_state
);
504 VkOffset3D src_offset
;
505 VkExtent3D src_extent
;
506 VkOffset3D dest_offset
;
507 VkExtent3D dest_extent
;
511 meta_emit_blit(struct anv_cmd_buffer
*cmd_buffer
,
512 struct anv_surface_view
*src
,
513 VkOffset3D src_offset
,
514 VkExtent3D src_extent
,
515 struct anv_surface_view
*dest
,
516 VkOffset3D dest_offset
,
517 VkExtent3D dest_extent
)
519 struct anv_device
*device
= cmd_buffer
->device
;
521 struct blit_vb_data
{
526 unsigned vb_size
= sizeof(struct vue_header
) + 3 * sizeof(*vb_data
);
528 struct anv_state vb_state
=
529 anv_state_stream_alloc(&cmd_buffer
->surface_state_stream
, vb_size
, 16);
530 memset(vb_state
.map
, 0, sizeof(struct vue_header
));
531 vb_data
= vb_state
.map
+ sizeof(struct vue_header
);
533 vb_data
[0] = (struct blit_vb_data
) {
535 dest_offset
.x
+ dest_extent
.width
,
536 dest_offset
.y
+ dest_extent
.height
,
539 (float)(src_offset
.x
+ src_extent
.width
) / (float)src
->extent
.width
,
540 (float)(src_offset
.y
+ src_extent
.height
) / (float)src
->extent
.height
,
544 vb_data
[1] = (struct blit_vb_data
) {
547 dest_offset
.y
+ dest_extent
.height
,
550 (float)src_offset
.x
/ (float)src
->extent
.width
,
551 (float)(src_offset
.y
+ src_extent
.height
) / (float)src
->extent
.height
,
555 vb_data
[2] = (struct blit_vb_data
) {
561 (float)src_offset
.x
/ (float)src
->extent
.width
,
562 (float)src_offset
.y
/ (float)src
->extent
.height
,
566 struct anv_buffer vertex_buffer
= {
569 .bo
= &device
->surface_state_block_pool
.bo
,
570 .offset
= vb_state
.offset
,
573 anv_CmdBindVertexBuffers((VkCmdBuffer
) cmd_buffer
, 0, 2,
575 (VkBuffer
) &vertex_buffer
,
576 (VkBuffer
) &vertex_buffer
580 sizeof(struct vue_header
),
585 anv_AllocDescriptorSets((VkDevice
) device
, 0 /* pool */,
586 VK_DESCRIPTOR_SET_USAGE_ONE_SHOT
,
587 1, &device
->meta_state
.blit
.ds_layout
, &set
, &count
);
588 anv_UpdateDescriptors((VkDevice
) device
, set
, 1,
591 .sType
= VK_STRUCTURE_TYPE_UPDATE_IMAGES
,
592 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
595 .pImageViews
= (VkImageViewAttachInfo
[]) {
597 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO
,
598 .view
= (VkImageView
) src
,
599 .layout
= VK_IMAGE_LAYOUT_GENERAL
,
605 struct anv_framebuffer
*fb
;
606 anv_CreateFramebuffer((VkDevice
) device
,
607 &(VkFramebufferCreateInfo
) {
608 .sType
= VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
,
609 .colorAttachmentCount
= 1,
610 .pColorAttachments
= (VkColorAttachmentBindInfo
[]) {
612 .view
= (VkColorAttachmentView
) dest
,
613 .layout
= VK_IMAGE_LAYOUT_GENERAL
616 .pDepthStencilAttachment
= NULL
,
618 .width
= dest
->extent
.width
,
619 .height
= dest
->extent
.height
,
621 }, (VkFramebuffer
*)&fb
);
625 anv_CreateRenderPass((VkDevice
)device
,
626 &(VkRenderPassCreateInfo
) {
627 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
,
628 .renderArea
= { { 0, 0 }, { dest
->extent
.width
, dest
->extent
.height
} },
629 .colorAttachmentCount
= 1,
633 .pColorFormats
= (VkFormat
[]) { dest
->format
},
634 .pColorLayouts
= (VkImageLayout
[]) { VK_IMAGE_LAYOUT_GENERAL
},
635 .pColorLoadOps
= (VkAttachmentLoadOp
[]) { VK_ATTACHMENT_LOAD_OP_LOAD
},
636 .pColorStoreOps
= (VkAttachmentStoreOp
[]) { VK_ATTACHMENT_STORE_OP_STORE
},
637 .pColorLoadClearValues
= (VkClearColor
[]) {
638 { .color
= { .floatColor
= { 1.0, 0.0, 0.0, 1.0 } }, .useRawValue
= false }
640 .depthStencilFormat
= VK_FORMAT_UNDEFINED
,
643 anv_CmdBeginRenderPass((VkCmdBuffer
) cmd_buffer
,
644 &(VkRenderPassBegin
) {
646 .framebuffer
= (VkFramebuffer
) fb
,
649 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
650 VK_STATE_BIND_POINT_VIEWPORT
, fb
->vp_state
);
652 anv_CmdBindDescriptorSets((VkCmdBuffer
) cmd_buffer
,
653 VK_PIPELINE_BIND_POINT_GRAPHICS
, 0, 1,
656 anv_CmdDraw((VkCmdBuffer
) cmd_buffer
, 0, 3, 0, 1);
658 anv_CmdEndRenderPass((VkCmdBuffer
) cmd_buffer
, pass
);
662 meta_finish_blit(struct anv_cmd_buffer
*cmd_buffer
,
663 const struct anv_saved_state
*saved_state
)
665 anv_cmd_buffer_restore(cmd_buffer
, saved_state
);
666 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
667 VK_STATE_BIND_POINT_COLOR_BLEND
,
668 saved_state
->cb_state
);
672 vk_format_for_cpp(int cpp
)
675 case 1: return VK_FORMAT_R8_UINT
;
676 case 2: return VK_FORMAT_R8G8_UINT
;
677 case 3: return VK_FORMAT_R8G8B8_UINT
;
678 case 4: return VK_FORMAT_R8G8B8A8_UINT
;
679 case 6: return VK_FORMAT_R16G16B16_UINT
;
680 case 8: return VK_FORMAT_R16G16B16A16_UINT
;
681 case 12: return VK_FORMAT_R32G32B32_UINT
;
682 case 16: return VK_FORMAT_R32G32B32A32_UINT
;
684 unreachable("Invalid format cpp");
689 do_buffer_copy(struct anv_cmd_buffer
*cmd_buffer
,
690 struct anv_bo
*src
, uint64_t src_offset
,
691 struct anv_bo
*dest
, uint64_t dest_offset
,
692 int width
, int height
, VkFormat copy_format
)
694 VkDevice vk_device
= (VkDevice
)cmd_buffer
->device
;
696 VkImageCreateInfo image_info
= {
697 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
698 .imageType
= VK_IMAGE_TYPE_2D
,
699 .format
= copy_format
,
708 .tiling
= VK_IMAGE_TILING_LINEAR
,
709 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
713 struct anv_image
*src_image
, *dest_image
;
714 anv_CreateImage(vk_device
, &image_info
, (VkImage
*)&src_image
);
715 anv_CreateImage(vk_device
, &image_info
, (VkImage
*)&dest_image
);
717 /* We could use a vk call to bind memory, but that would require
718 * creating a dummy memory object etc. so there's really no point.
721 src_image
->offset
= src_offset
;
722 dest_image
->bo
= dest
;
723 dest_image
->offset
= dest_offset
;
725 struct anv_surface_view src_view
;
726 anv_image_view_init(&src_view
, cmd_buffer
->device
,
727 &(VkImageViewCreateInfo
) {
728 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
729 .image
= (VkImage
)src_image
,
730 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
731 .format
= copy_format
,
733 VK_CHANNEL_SWIZZLE_R
,
734 VK_CHANNEL_SWIZZLE_G
,
735 VK_CHANNEL_SWIZZLE_B
,
738 .subresourceRange
= {
739 .aspect
= VK_IMAGE_ASPECT_COLOR
,
749 struct anv_surface_view dest_view
;
750 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
751 &(VkColorAttachmentViewCreateInfo
) {
752 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
753 .image
= (VkImage
)dest_image
,
754 .format
= copy_format
,
761 meta_emit_blit(cmd_buffer
,
763 (VkOffset3D
) { 0, 0, 0 },
764 (VkExtent3D
) { width
, height
, 1 },
766 (VkOffset3D
) { 0, 0, 0 },
767 (VkExtent3D
) { width
, height
, 1 });
770 void anv_CmdCopyBuffer(
771 VkCmdBuffer cmdBuffer
,
774 uint32_t regionCount
,
775 const VkBufferCopy
* pRegions
)
777 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
778 struct anv_buffer
*src_buffer
= (struct anv_buffer
*)srcBuffer
;
779 struct anv_buffer
*dest_buffer
= (struct anv_buffer
*)destBuffer
;
780 struct anv_saved_state saved_state
;
782 meta_prepare_blit(cmd_buffer
, &saved_state
);
784 for (unsigned r
= 0; r
< regionCount
; r
++) {
785 uint64_t src_offset
= src_buffer
->offset
+ pRegions
[r
].srcOffset
;
786 uint64_t dest_offset
= dest_buffer
->offset
+ pRegions
[r
].destOffset
;
787 uint64_t copy_size
= pRegions
[r
].copySize
;
789 /* First, we compute the biggest format that can be used with the
790 * given offsets and size.
794 int fs
= ffs(src_offset
) - 1;
796 cpp
= MIN2(cpp
, 1 << fs
);
797 assert(src_offset
% cpp
== 0);
799 fs
= ffs(dest_offset
) - 1;
801 cpp
= MIN2(cpp
, 1 << fs
);
802 assert(dest_offset
% cpp
== 0);
804 fs
= ffs(pRegions
[r
].copySize
) - 1;
806 cpp
= MIN2(cpp
, 1 << fs
);
807 assert(pRegions
[r
].copySize
% cpp
== 0);
809 VkFormat copy_format
= vk_format_for_cpp(cpp
);
811 /* This is maximum possible width/height our HW can handle */
812 uint64_t max_surface_dim
= 1 << 14;
814 /* First, we make a bunch of max-sized copies */
815 uint64_t max_copy_size
= max_surface_dim
* max_surface_dim
* cpp
;
816 while (copy_size
> max_copy_size
) {
817 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
818 dest_buffer
->bo
, dest_offset
,
819 max_surface_dim
, max_surface_dim
, copy_format
);
820 copy_size
-= max_copy_size
;
821 src_offset
+= max_copy_size
;
822 dest_offset
+= max_copy_size
;
825 uint64_t height
= copy_size
/ (max_surface_dim
* cpp
);
826 assert(height
< max_surface_dim
);
828 uint64_t rect_copy_size
= height
* max_surface_dim
* cpp
;
829 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
830 dest_buffer
->bo
, dest_offset
,
831 max_surface_dim
, height
, copy_format
);
832 copy_size
-= rect_copy_size
;
833 src_offset
+= rect_copy_size
;
834 dest_offset
+= rect_copy_size
;
837 if (copy_size
!= 0) {
838 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
839 dest_buffer
->bo
, dest_offset
,
840 copy_size
/ cpp
, 1, copy_format
);
844 meta_finish_blit(cmd_buffer
, &saved_state
);
847 void anv_CmdCopyImage(
848 VkCmdBuffer cmdBuffer
,
850 VkImageLayout srcImageLayout
,
852 VkImageLayout destImageLayout
,
853 uint32_t regionCount
,
854 const VkImageCopy
* pRegions
)
856 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
857 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
858 struct anv_saved_state saved_state
;
860 meta_prepare_blit(cmd_buffer
, &saved_state
);
862 for (unsigned r
= 0; r
< regionCount
; r
++) {
863 struct anv_surface_view src_view
;
864 anv_image_view_init(&src_view
, cmd_buffer
->device
,
865 &(VkImageViewCreateInfo
) {
866 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
868 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
869 .format
= src_image
->format
,
871 VK_CHANNEL_SWIZZLE_R
,
872 VK_CHANNEL_SWIZZLE_G
,
873 VK_CHANNEL_SWIZZLE_B
,
876 .subresourceRange
= {
877 .aspect
= pRegions
[r
].srcSubresource
.aspect
,
878 .baseMipLevel
= pRegions
[r
].srcSubresource
.mipLevel
,
880 .baseArraySlice
= pRegions
[r
].srcSubresource
.arraySlice
,
887 struct anv_surface_view dest_view
;
888 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
889 &(VkColorAttachmentViewCreateInfo
) {
890 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
892 .format
= src_image
->format
,
893 .mipLevel
= pRegions
[r
].destSubresource
.mipLevel
,
894 .baseArraySlice
= pRegions
[r
].destSubresource
.arraySlice
,
899 meta_emit_blit(cmd_buffer
,
901 pRegions
[r
].srcOffset
,
904 pRegions
[r
].destOffset
,
908 meta_finish_blit(cmd_buffer
, &saved_state
);
911 void anv_CmdBlitImage(
912 VkCmdBuffer cmdBuffer
,
914 VkImageLayout srcImageLayout
,
916 VkImageLayout destImageLayout
,
917 uint32_t regionCount
,
918 const VkImageBlit
* pRegions
)
920 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
921 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
922 struct anv_image
*dest_image
= (struct anv_image
*)destImage
;
923 struct anv_saved_state saved_state
;
925 meta_prepare_blit(cmd_buffer
, &saved_state
);
927 for (unsigned r
= 0; r
< regionCount
; r
++) {
928 struct anv_surface_view src_view
;
929 anv_image_view_init(&src_view
, cmd_buffer
->device
,
930 &(VkImageViewCreateInfo
) {
931 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
933 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
934 .format
= src_image
->format
,
936 VK_CHANNEL_SWIZZLE_R
,
937 VK_CHANNEL_SWIZZLE_G
,
938 VK_CHANNEL_SWIZZLE_B
,
941 .subresourceRange
= {
942 .aspect
= pRegions
[r
].srcSubresource
.aspect
,
943 .baseMipLevel
= pRegions
[r
].srcSubresource
.mipLevel
,
945 .baseArraySlice
= pRegions
[r
].srcSubresource
.arraySlice
,
952 struct anv_surface_view dest_view
;
953 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
954 &(VkColorAttachmentViewCreateInfo
) {
955 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
957 .format
= dest_image
->format
,
958 .mipLevel
= pRegions
[r
].destSubresource
.mipLevel
,
959 .baseArraySlice
= pRegions
[r
].destSubresource
.arraySlice
,
964 meta_emit_blit(cmd_buffer
,
966 pRegions
[r
].srcOffset
,
967 pRegions
[r
].srcExtent
,
969 pRegions
[r
].destOffset
,
970 pRegions
[r
].destExtent
);
973 meta_finish_blit(cmd_buffer
, &saved_state
);
976 void anv_CmdCopyBufferToImage(
977 VkCmdBuffer cmdBuffer
,
980 VkImageLayout destImageLayout
,
981 uint32_t regionCount
,
982 const VkBufferImageCopy
* pRegions
)
984 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
985 VkDevice vk_device
= (VkDevice
) cmd_buffer
->device
;
986 struct anv_buffer
*src_buffer
= (struct anv_buffer
*)srcBuffer
;
987 struct anv_image
*dest_image
= (struct anv_image
*)destImage
;
988 struct anv_saved_state saved_state
;
990 meta_prepare_blit(cmd_buffer
, &saved_state
);
992 for (unsigned r
= 0; r
< regionCount
; r
++) {
993 struct anv_image
*src_image
;
994 anv_CreateImage(vk_device
,
995 &(VkImageCreateInfo
) {
996 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
997 .imageType
= VK_IMAGE_TYPE_2D
,
998 .format
= dest_image
->format
,
1000 .width
= pRegions
[r
].imageExtent
.width
,
1001 .height
= pRegions
[r
].imageExtent
.height
,
1007 .tiling
= VK_IMAGE_TILING_LINEAR
,
1008 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
1010 }, (VkImage
*)&src_image
);
1012 /* We could use a vk call to bind memory, but that would require
1013 * creating a dummy memory object etc. so there's really no point.
1015 src_image
->bo
= src_buffer
->bo
;
1016 src_image
->offset
= src_buffer
->offset
+ pRegions
[r
].bufferOffset
;
1018 struct anv_surface_view src_view
;
1019 anv_image_view_init(&src_view
, cmd_buffer
->device
,
1020 &(VkImageViewCreateInfo
) {
1021 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
1022 .image
= (VkImage
)src_image
,
1023 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
1024 .format
= dest_image
->format
,
1026 VK_CHANNEL_SWIZZLE_R
,
1027 VK_CHANNEL_SWIZZLE_G
,
1028 VK_CHANNEL_SWIZZLE_B
,
1029 VK_CHANNEL_SWIZZLE_A
1031 .subresourceRange
= {
1032 .aspect
= pRegions
[r
].imageSubresource
.aspect
,
1035 .baseArraySlice
= 0,
1042 struct anv_surface_view dest_view
;
1043 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
1044 &(VkColorAttachmentViewCreateInfo
) {
1045 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
1046 .image
= (VkImage
)dest_image
,
1047 .format
= dest_image
->format
,
1048 .mipLevel
= pRegions
[r
].imageSubresource
.mipLevel
,
1049 .baseArraySlice
= pRegions
[r
].imageSubresource
.arraySlice
,
1054 meta_emit_blit(cmd_buffer
,
1056 (VkOffset3D
) { 0, 0, 0 },
1057 pRegions
[r
].imageExtent
,
1059 pRegions
[r
].imageOffset
,
1060 pRegions
[r
].imageExtent
);
1063 meta_finish_blit(cmd_buffer
, &saved_state
);
1066 void anv_CmdCopyImageToBuffer(
1067 VkCmdBuffer cmdBuffer
,
1069 VkImageLayout srcImageLayout
,
1070 VkBuffer destBuffer
,
1071 uint32_t regionCount
,
1072 const VkBufferImageCopy
* pRegions
)
1074 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
1075 VkDevice vk_device
= (VkDevice
) cmd_buffer
->device
;
1076 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
1077 struct anv_buffer
*dest_buffer
= (struct anv_buffer
*)destBuffer
;
1078 struct anv_saved_state saved_state
;
1080 meta_prepare_blit(cmd_buffer
, &saved_state
);
1082 for (unsigned r
= 0; r
< regionCount
; r
++) {
1083 struct anv_surface_view src_view
;
1084 anv_image_view_init(&src_view
, cmd_buffer
->device
,
1085 &(VkImageViewCreateInfo
) {
1086 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
1088 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
1089 .format
= src_image
->format
,
1091 VK_CHANNEL_SWIZZLE_R
,
1092 VK_CHANNEL_SWIZZLE_G
,
1093 VK_CHANNEL_SWIZZLE_B
,
1094 VK_CHANNEL_SWIZZLE_A
1096 .subresourceRange
= {
1097 .aspect
= pRegions
[r
].imageSubresource
.aspect
,
1098 .baseMipLevel
= pRegions
[r
].imageSubresource
.mipLevel
,
1100 .baseArraySlice
= pRegions
[r
].imageSubresource
.arraySlice
,
1107 struct anv_image
*dest_image
;
1108 anv_CreateImage(vk_device
,
1109 &(VkImageCreateInfo
) {
1110 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
1111 .imageType
= VK_IMAGE_TYPE_2D
,
1112 .format
= src_image
->format
,
1114 .width
= pRegions
[r
].imageExtent
.width
,
1115 .height
= pRegions
[r
].imageExtent
.height
,
1121 .tiling
= VK_IMAGE_TILING_LINEAR
,
1122 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
1124 }, (VkImage
*)&dest_image
);
1126 /* We could use a vk call to bind memory, but that would require
1127 * creating a dummy memory object etc. so there's really no point.
1129 dest_image
->bo
= dest_buffer
->bo
;
1130 dest_image
->offset
= dest_buffer
->offset
+ pRegions
[r
].bufferOffset
;
1132 struct anv_surface_view dest_view
;
1133 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
1134 &(VkColorAttachmentViewCreateInfo
) {
1135 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
1136 .image
= (VkImage
)dest_image
,
1137 .format
= src_image
->format
,
1139 .baseArraySlice
= 0,
1144 meta_emit_blit(cmd_buffer
,
1146 pRegions
[r
].imageOffset
,
1147 pRegions
[r
].imageExtent
,
1149 (VkOffset3D
) { 0, 0, 0 },
1150 pRegions
[r
].imageExtent
);
1153 meta_finish_blit(cmd_buffer
, &saved_state
);
1156 void anv_CmdCloneImageData(
1157 VkCmdBuffer cmdBuffer
,
1159 VkImageLayout srcImageLayout
,
1161 VkImageLayout destImageLayout
)
1166 void anv_CmdUpdateBuffer(
1167 VkCmdBuffer cmdBuffer
,
1168 VkBuffer destBuffer
,
1169 VkDeviceSize destOffset
,
1170 VkDeviceSize dataSize
,
1171 const uint32_t* pData
)
1176 void anv_CmdFillBuffer(
1177 VkCmdBuffer cmdBuffer
,
1178 VkBuffer destBuffer
,
1179 VkDeviceSize destOffset
,
1180 VkDeviceSize fillSize
,
1186 void anv_CmdClearColorImage(
1187 VkCmdBuffer cmdBuffer
,
1189 VkImageLayout imageLayout
,
1190 const VkClearColor
* color
,
1191 uint32_t rangeCount
,
1192 const VkImageSubresourceRange
* pRanges
)
1197 void anv_CmdClearDepthStencil(
1198 VkCmdBuffer cmdBuffer
,
1200 VkImageLayout imageLayout
,
1203 uint32_t rangeCount
,
1204 const VkImageSubresourceRange
* pRanges
)
1209 void anv_CmdResolveImage(
1210 VkCmdBuffer cmdBuffer
,
1212 VkImageLayout srcImageLayout
,
1214 VkImageLayout destImageLayout
,
1215 uint32_t regionCount
,
1216 const VkImageResolve
* pRegions
)
1222 anv_device_init_meta(struct anv_device
*device
)
1224 anv_device_init_meta_clear_state(device
);
1225 anv_device_init_meta_blit_state(device
);
1227 anv_CreateDynamicRasterState((VkDevice
) device
,
1228 &(VkDynamicRsStateCreateInfo
) {
1229 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO
,
1231 &device
->meta_state
.shared
.rs_state
);
1233 anv_CreateDynamicColorBlendState((VkDevice
) device
,
1234 &(VkDynamicCbStateCreateInfo
) {
1235 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO
1237 &device
->meta_state
.shared
.cb_state
);
1239 anv_CreateDynamicDepthStencilState((VkDevice
) device
,
1240 &(VkDynamicDsStateCreateInfo
) {
1241 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO
1243 &device
->meta_state
.shared
.ds_state
);