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 "glsl_helpers.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 anv_pipeline_create((VkDevice
) device
,
127 &(VkGraphicsPipelineCreateInfo
) {
128 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
129 .pNext
= &rs_create_info
,
133 &(struct anv_pipeline_create_info
) {
134 .use_repclear
= true,
135 .disable_viewport
= true,
138 &device
->clear_state
.pipeline
);
140 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, fs
);
142 anv_CreateDynamicRasterState((VkDevice
) device
,
143 &(VkDynamicRsStateCreateInfo
) {
144 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO
,
146 &device
->clear_state
.rs_state
);
149 #define NUM_VB_USED 2
150 struct anv_saved_state
{
151 struct anv_bindings bindings
;
152 struct anv_bindings
*old_bindings
;
153 struct anv_pipeline
*old_pipeline
;
157 anv_cmd_buffer_save(struct anv_cmd_buffer
*cmd_buffer
,
158 struct anv_saved_state
*state
)
160 state
->old_bindings
= cmd_buffer
->bindings
;
161 cmd_buffer
->bindings
= &state
->bindings
;
162 state
->old_pipeline
= cmd_buffer
->pipeline
;
166 anv_cmd_buffer_restore(struct anv_cmd_buffer
*cmd_buffer
,
167 const struct anv_saved_state
*state
)
169 cmd_buffer
->bindings
= state
->old_bindings
;
170 cmd_buffer
->pipeline
= state
->old_pipeline
;
172 cmd_buffer
->vb_dirty
|= (1 << NUM_VB_USED
) - 1;
173 cmd_buffer
->dirty
|= ANV_CMD_BUFFER_PIPELINE_DIRTY
|
174 ANV_CMD_BUFFER_DESCRIPTOR_SET_DIRTY
;
178 anv_cmd_buffer_copy_render_targets(struct anv_cmd_buffer
*cmd_buffer
,
179 struct anv_saved_state
*state
)
181 struct anv_framebuffer
*fb
= cmd_buffer
->framebuffer
;
182 struct anv_bindings
*old_bindings
= state
->old_bindings
;
183 struct anv_bindings
*bindings
= cmd_buffer
->bindings
;
185 for (uint32_t i
= 0; i
< fb
->color_attachment_count
; i
++) {
186 bindings
->descriptors
[VK_SHADER_STAGE_FRAGMENT
].surfaces
[i
] =
187 old_bindings
->descriptors
[VK_SHADER_STAGE_FRAGMENT
].surfaces
[i
];
189 bindings
->descriptors
[VK_SHADER_STAGE_FRAGMENT
].relocs
[i
].bo
=
190 old_bindings
->descriptors
[VK_SHADER_STAGE_FRAGMENT
].relocs
[i
].bo
;
191 bindings
->descriptors
[VK_SHADER_STAGE_FRAGMENT
].relocs
[i
].offset
=
192 old_bindings
->descriptors
[VK_SHADER_STAGE_FRAGMENT
].relocs
[i
].offset
;
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
->clear_state
.pipeline
)
278 anv_CmdBindPipeline((VkCmdBuffer
) cmd_buffer
,
279 VK_PIPELINE_BIND_POINT_GRAPHICS
, device
->clear_state
.pipeline
);
281 /* We don't need anything here, only set if not already set. */
282 if (cmd_buffer
->rs_state
== NULL
)
283 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
284 VK_STATE_BIND_POINT_RASTER
,
285 device
->clear_state
.rs_state
);
287 if (cmd_buffer
->vp_state
== NULL
)
288 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
289 VK_STATE_BIND_POINT_VIEWPORT
,
290 cmd_buffer
->framebuffer
->vp_state
);
292 anv_CmdDraw((VkCmdBuffer
) cmd_buffer
, 0, 3, 0, pass
->num_clear_layers
);
294 /* Restore API state */
295 anv_cmd_buffer_restore(cmd_buffer
, &saved_state
);
300 anv_device_init_meta_blit_state(struct anv_device
*device
)
302 VkPipelineIaStateCreateInfo ia_create_info
= {
303 .sType
= VK_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO
,
304 .topology
= VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP
,
305 .disableVertexReuse
= false,
306 .primitiveRestartEnable
= false,
307 .primitiveRestartIndex
= 0
310 /* We don't use a vertex shader for clearing, but instead build and pass
311 * the VUEs directly to the rasterization backend. However, we do need
312 * to provide GLSL source for the vertex shader so that the compiler
313 * does not dead-code our inputs.
315 VkShader vs
= GLSL_VK_SHADER(device
, VERTEX
,
318 out vec4 v_tex_coord
;
321 v_tex_coord
= vec4(a_tex_coord
, 0, 1);
322 gl_Position
= vec4(a_pos
, 0, 1);
326 VkShader fs
= GLSL_VK_SHADER(device
, FRAGMENT
,
329 layout(set
= 0, binding
= 0) uniform sampler2D u_tex
;
332 f_color
= texture(u_tex
, v_tex_coord
.xy
);
336 VkPipelineShaderStageCreateInfo vs_create_info
= {
337 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
338 .pNext
= &ia_create_info
,
340 .stage
= VK_SHADER_STAGE_VERTEX
,
342 .linkConstBufferCount
= 0,
343 .pLinkConstBufferInfo
= NULL
,
344 .pSpecializationInfo
= NULL
348 VkPipelineShaderStageCreateInfo fs_create_info
= {
349 .sType
= VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
,
350 .pNext
= &vs_create_info
,
352 .stage
= VK_SHADER_STAGE_FRAGMENT
,
354 .linkConstBufferCount
= 0,
355 .pLinkConstBufferInfo
= NULL
,
356 .pSpecializationInfo
= NULL
360 VkPipelineVertexInputCreateInfo vi_create_info
= {
361 .sType
= VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO
,
362 .pNext
= &fs_create_info
,
364 .pVertexBindingDescriptions
= (VkVertexInputBindingDescription
[]) {
368 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_VERTEX
373 .stepRate
= VK_VERTEX_INPUT_STEP_RATE_VERTEX
377 .pVertexAttributeDescriptions
= (VkVertexInputAttributeDescription
[]) {
382 .format
= VK_FORMAT_R32G32B32A32_UINT
,
389 .format
= VK_FORMAT_R32G32_SFLOAT
,
393 /* Texture Coordinate */
396 .format
= VK_FORMAT_R32G32_SFLOAT
,
402 VkDescriptorSetLayoutCreateInfo ds_layout_info
= {
403 .sType
= VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
,
405 .pBinding
= (VkDescriptorSetLayoutBinding
[]) {
407 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
409 .stageFlags
= VK_SHADER_STAGE_FRAGMENT_BIT
,
410 .pImmutableSamplers
= NULL
414 anv_CreateDescriptorSetLayout((VkDevice
) device
, &ds_layout_info
,
415 &device
->blit_state
.ds_layout
);
417 VkPipelineLayoutCreateInfo pipeline_layout_info
= {
418 .sType
= VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
,
419 .descriptorSetCount
= 1,
420 .pSetLayouts
= &device
->blit_state
.ds_layout
,
423 VkPipelineLayout pipeline_layout
;
424 anv_CreatePipelineLayout((VkDevice
) device
, &pipeline_layout_info
,
427 VkPipelineRsStateCreateInfo rs_create_info
= {
428 .sType
= VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO
,
429 .pNext
= &vi_create_info
,
430 .depthClipEnable
= true,
431 .rasterizerDiscardEnable
= false,
432 .fillMode
= VK_FILL_MODE_SOLID
,
433 .cullMode
= VK_CULL_MODE_NONE
,
434 .frontFace
= VK_FRONT_FACE_CCW
437 VkGraphicsPipelineCreateInfo pipeline_info
= {
438 .sType
= VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
,
439 .pNext
= &rs_create_info
,
441 .layout
= pipeline_layout
,
444 anv_pipeline_create((VkDevice
) device
, &pipeline_info
,
445 &(struct anv_pipeline_create_info
) {
446 .use_repclear
= false,
447 .disable_viewport
= true,
448 .disable_scissor
= true,
452 &device
->blit_state
.pipeline
);
454 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, vs
);
455 anv_DestroyObject((VkDevice
) device
, VK_OBJECT_TYPE_SHADER
, fs
);
457 anv_CreateDynamicRasterState((VkDevice
) device
,
458 &(VkDynamicRsStateCreateInfo
) {
459 .sType
= VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO
,
461 &device
->blit_state
.rs_state
);
465 meta_prepare_blit(struct anv_cmd_buffer
*cmd_buffer
,
466 struct anv_saved_state
*saved_state
)
468 struct anv_device
*device
= cmd_buffer
->device
;
470 anv_cmd_buffer_save(cmd_buffer
, saved_state
);
472 if ((VkPipeline
) cmd_buffer
->pipeline
!= device
->blit_state
.pipeline
)
473 anv_CmdBindPipeline((VkCmdBuffer
) cmd_buffer
,
474 VK_PIPELINE_BIND_POINT_GRAPHICS
,
475 device
->blit_state
.pipeline
);
477 /* We don't need anything here, only set if not already set. */
478 if (cmd_buffer
->rs_state
== NULL
)
479 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
480 VK_STATE_BIND_POINT_RASTER
,
481 device
->blit_state
.rs_state
);
485 VkOffset3D src_offset
;
486 VkExtent3D src_extent
;
487 VkOffset3D dest_offset
;
488 VkExtent3D dest_extent
;
492 meta_emit_blit(struct anv_cmd_buffer
*cmd_buffer
,
493 struct anv_surface_view
*src
,
494 VkOffset3D src_offset
,
495 VkExtent3D src_extent
,
496 struct anv_surface_view
*dest
,
497 VkOffset3D dest_offset
,
498 VkExtent3D dest_extent
)
500 struct anv_device
*device
= cmd_buffer
->device
;
502 struct blit_vb_data
{
507 unsigned vb_size
= sizeof(struct vue_header
) + 3 * sizeof(*vb_data
);
509 struct anv_state vb_state
=
510 anv_state_stream_alloc(&cmd_buffer
->surface_state_stream
, vb_size
, 16);
511 memset(vb_state
.map
, 0, sizeof(struct vue_header
));
512 vb_data
= vb_state
.map
+ sizeof(struct vue_header
);
514 vb_data
[0] = (struct blit_vb_data
) {
516 dest_offset
.x
+ dest_extent
.width
,
517 dest_offset
.y
+ dest_extent
.height
,
520 (float)(src_offset
.x
+ src_extent
.width
) / (float)src
->extent
.width
,
521 (float)(src_offset
.y
+ src_extent
.height
) / (float)src
->extent
.height
,
525 vb_data
[1] = (struct blit_vb_data
) {
528 dest_offset
.y
+ dest_extent
.height
,
531 (float)src_offset
.x
/ (float)src
->extent
.width
,
532 (float)(src_offset
.y
+ src_extent
.height
) / (float)src
->extent
.height
,
536 vb_data
[2] = (struct blit_vb_data
) {
542 (float)src_offset
.x
/ (float)src
->extent
.width
,
543 (float)src_offset
.y
/ (float)src
->extent
.height
,
547 struct anv_buffer vertex_buffer
= {
550 .bo
= &device
->surface_state_block_pool
.bo
,
551 .offset
= vb_state
.offset
,
554 anv_CmdBindVertexBuffers((VkCmdBuffer
) cmd_buffer
, 0, 2,
556 (VkBuffer
) &vertex_buffer
,
557 (VkBuffer
) &vertex_buffer
561 sizeof(struct vue_header
),
566 anv_AllocDescriptorSets((VkDevice
) device
, 0 /* pool */,
567 VK_DESCRIPTOR_SET_USAGE_ONE_SHOT
,
568 1, &device
->blit_state
.ds_layout
, &set
, &count
);
569 anv_UpdateDescriptors((VkDevice
) device
, set
, 1,
572 .sType
= VK_STRUCTURE_TYPE_UPDATE_IMAGES
,
573 .descriptorType
= VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
,
576 .pImageViews
= (VkImageViewAttachInfo
[]) {
578 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO
,
579 .view
= (VkImageView
) src
,
580 .layout
= VK_IMAGE_LAYOUT_GENERAL
,
586 struct anv_framebuffer
*fb
;
587 anv_CreateFramebuffer((VkDevice
) device
,
588 &(VkFramebufferCreateInfo
) {
589 .sType
= VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
,
590 .colorAttachmentCount
= 1,
591 .pColorAttachments
= (VkColorAttachmentBindInfo
[]) {
593 .view
= (VkColorAttachmentView
) dest
,
594 .layout
= VK_IMAGE_LAYOUT_GENERAL
597 .pDepthStencilAttachment
= NULL
,
599 .width
= dest
->extent
.width
,
600 .height
= dest
->extent
.height
,
602 }, (VkFramebuffer
*)&fb
);
606 anv_CreateRenderPass((VkDevice
)device
,
607 &(VkRenderPassCreateInfo
) {
608 .sType
= VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
,
609 .renderArea
= { { 0, 0 }, { dest
->extent
.width
, dest
->extent
.height
} },
610 .colorAttachmentCount
= 1,
614 .pColorFormats
= (VkFormat
[]) { dest
->format
},
615 .pColorLayouts
= (VkImageLayout
[]) { VK_IMAGE_LAYOUT_GENERAL
},
616 .pColorLoadOps
= (VkAttachmentLoadOp
[]) { VK_ATTACHMENT_LOAD_OP_LOAD
},
617 .pColorStoreOps
= (VkAttachmentStoreOp
[]) { VK_ATTACHMENT_STORE_OP_STORE
},
618 .pColorLoadClearValues
= (VkClearColor
[]) {
619 { .color
= { .floatColor
= { 1.0, 0.0, 0.0, 1.0 } }, .useRawValue
= false }
621 .depthStencilFormat
= VK_FORMAT_UNDEFINED
,
624 anv_CmdBeginRenderPass((VkCmdBuffer
) cmd_buffer
,
625 &(VkRenderPassBegin
) {
627 .framebuffer
= (VkFramebuffer
) fb
,
630 anv_CmdBindDynamicStateObject((VkCmdBuffer
) cmd_buffer
,
631 VK_STATE_BIND_POINT_VIEWPORT
, fb
->vp_state
);
633 anv_CmdBindDescriptorSets((VkCmdBuffer
) cmd_buffer
,
634 VK_PIPELINE_BIND_POINT_GRAPHICS
, 0, 1,
637 anv_CmdDraw((VkCmdBuffer
) cmd_buffer
, 0, 3, 0, 1);
639 anv_CmdEndRenderPass((VkCmdBuffer
) cmd_buffer
, pass
);
643 meta_finish_blit(struct anv_cmd_buffer
*cmd_buffer
,
644 const struct anv_saved_state
*saved_state
)
646 anv_cmd_buffer_restore(cmd_buffer
, saved_state
);
650 vk_format_for_cpp(int cpp
)
653 case 1: return VK_FORMAT_R8_UINT
;
654 case 2: return VK_FORMAT_R8G8_UINT
;
655 case 3: return VK_FORMAT_R8G8B8_UINT
;
656 case 4: return VK_FORMAT_R8G8B8A8_UINT
;
657 case 6: return VK_FORMAT_R16G16B16_UINT
;
658 case 8: return VK_FORMAT_R16G16B16A16_UINT
;
659 case 12: return VK_FORMAT_R32G32B32_UINT
;
660 case 16: return VK_FORMAT_R32G32B32A32_UINT
;
662 unreachable("Invalid format cpp");
667 do_buffer_copy(struct anv_cmd_buffer
*cmd_buffer
,
668 struct anv_bo
*src
, uint64_t src_offset
,
669 struct anv_bo
*dest
, uint64_t dest_offset
,
670 int width
, int height
, VkFormat copy_format
)
672 VkDevice vk_device
= (VkDevice
)cmd_buffer
->device
;
674 VkImageCreateInfo image_info
= {
675 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
676 .imageType
= VK_IMAGE_TYPE_2D
,
677 .format
= copy_format
,
686 .tiling
= VK_IMAGE_TILING_LINEAR
,
687 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
691 struct anv_image
*src_image
, *dest_image
;
692 anv_CreateImage(vk_device
, &image_info
, (VkImage
*)&src_image
);
693 anv_CreateImage(vk_device
, &image_info
, (VkImage
*)&dest_image
);
695 /* We could use a vk call to bind memory, but that would require
696 * creating a dummy memory object etc. so there's really no point.
699 src_image
->offset
= src_offset
;
700 dest_image
->bo
= dest
;
701 dest_image
->offset
= dest_offset
;
703 struct anv_surface_view src_view
;
704 anv_image_view_init(&src_view
, cmd_buffer
->device
,
705 &(VkImageViewCreateInfo
) {
706 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
707 .image
= (VkImage
)src_image
,
708 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
709 .format
= copy_format
,
711 VK_CHANNEL_SWIZZLE_R
,
712 VK_CHANNEL_SWIZZLE_G
,
713 VK_CHANNEL_SWIZZLE_B
,
716 .subresourceRange
= {
717 .aspect
= VK_IMAGE_ASPECT_COLOR
,
727 struct anv_surface_view dest_view
;
728 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
729 &(VkColorAttachmentViewCreateInfo
) {
730 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
731 .image
= (VkImage
)dest_image
,
732 .format
= copy_format
,
739 meta_emit_blit(cmd_buffer
,
741 (VkOffset3D
) { 0, 0, 0 },
742 (VkExtent3D
) { width
, height
, 1 },
744 (VkOffset3D
) { 0, 0, 0 },
745 (VkExtent3D
) { width
, height
, 1 });
748 void anv_CmdCopyBuffer(
749 VkCmdBuffer cmdBuffer
,
752 uint32_t regionCount
,
753 const VkBufferCopy
* pRegions
)
755 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
756 struct anv_buffer
*src_buffer
= (struct anv_buffer
*)srcBuffer
;
757 struct anv_buffer
*dest_buffer
= (struct anv_buffer
*)destBuffer
;
758 struct anv_saved_state saved_state
;
760 meta_prepare_blit(cmd_buffer
, &saved_state
);
762 for (unsigned r
= 0; r
< regionCount
; r
++) {
763 uint64_t src_offset
= src_buffer
->offset
+ pRegions
[r
].srcOffset
;
764 uint64_t dest_offset
= dest_buffer
->offset
+ pRegions
[r
].destOffset
;
765 uint64_t copy_size
= pRegions
[r
].copySize
;
767 /* First, we compute the biggest format that can be used with the
768 * given offsets and size.
772 int fs
= ffs(src_offset
) - 1;
774 cpp
= MIN2(cpp
, 1 << fs
);
775 assert(src_offset
% cpp
== 0);
777 fs
= ffs(dest_offset
) - 1;
779 cpp
= MIN2(cpp
, 1 << fs
);
780 assert(dest_offset
% cpp
== 0);
782 fs
= ffs(pRegions
[r
].copySize
) - 1;
784 cpp
= MIN2(cpp
, 1 << fs
);
785 assert(pRegions
[r
].copySize
% cpp
== 0);
787 VkFormat copy_format
= vk_format_for_cpp(cpp
);
789 /* This is maximum possible width/height our HW can handle */
790 uint64_t max_surface_dim
= 1 << 14;
792 /* First, we make a bunch of max-sized copies */
793 uint64_t max_copy_size
= max_surface_dim
* max_surface_dim
* cpp
;
794 while (copy_size
> max_copy_size
) {
795 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
796 dest_buffer
->bo
, dest_offset
,
797 max_surface_dim
, max_surface_dim
, copy_format
);
798 copy_size
-= max_copy_size
;
799 src_offset
+= max_copy_size
;
800 dest_offset
+= max_copy_size
;
803 uint64_t height
= copy_size
/ (max_surface_dim
* cpp
);
804 assert(height
< max_surface_dim
);
806 uint64_t rect_copy_size
= height
* max_surface_dim
* cpp
;
807 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
808 dest_buffer
->bo
, dest_offset
,
809 max_surface_dim
, height
, copy_format
);
810 copy_size
-= rect_copy_size
;
811 src_offset
+= rect_copy_size
;
812 dest_offset
+= rect_copy_size
;
815 if (copy_size
!= 0) {
816 do_buffer_copy(cmd_buffer
, src_buffer
->bo
, src_offset
,
817 dest_buffer
->bo
, dest_offset
,
818 copy_size
/ cpp
, 1, copy_format
);
822 meta_finish_blit(cmd_buffer
, &saved_state
);
825 void anv_CmdCopyImage(
826 VkCmdBuffer cmdBuffer
,
828 VkImageLayout srcImageLayout
,
830 VkImageLayout destImageLayout
,
831 uint32_t regionCount
,
832 const VkImageCopy
* pRegions
)
834 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
835 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
836 struct anv_saved_state saved_state
;
838 meta_prepare_blit(cmd_buffer
, &saved_state
);
840 for (unsigned r
= 0; r
< regionCount
; r
++) {
841 struct anv_surface_view src_view
;
842 anv_image_view_init(&src_view
, cmd_buffer
->device
,
843 &(VkImageViewCreateInfo
) {
844 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
846 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
847 .format
= src_image
->format
,
849 VK_CHANNEL_SWIZZLE_R
,
850 VK_CHANNEL_SWIZZLE_G
,
851 VK_CHANNEL_SWIZZLE_B
,
854 .subresourceRange
= {
855 .aspect
= pRegions
[r
].srcSubresource
.aspect
,
856 .baseMipLevel
= pRegions
[r
].srcSubresource
.mipLevel
,
858 .baseArraySlice
= pRegions
[r
].srcSubresource
.arraySlice
,
865 struct anv_surface_view dest_view
;
866 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
867 &(VkColorAttachmentViewCreateInfo
) {
868 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
870 .format
= src_image
->format
,
871 .mipLevel
= pRegions
[r
].destSubresource
.mipLevel
,
872 .baseArraySlice
= pRegions
[r
].destSubresource
.arraySlice
,
877 meta_emit_blit(cmd_buffer
,
879 pRegions
[r
].srcOffset
,
882 pRegions
[r
].destOffset
,
886 meta_finish_blit(cmd_buffer
, &saved_state
);
889 void anv_CmdBlitImage(
890 VkCmdBuffer cmdBuffer
,
892 VkImageLayout srcImageLayout
,
894 VkImageLayout destImageLayout
,
895 uint32_t regionCount
,
896 const VkImageBlit
* pRegions
)
898 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
899 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
900 struct anv_image
*dest_image
= (struct anv_image
*)destImage
;
901 struct anv_saved_state saved_state
;
903 meta_prepare_blit(cmd_buffer
, &saved_state
);
905 for (unsigned r
= 0; r
< regionCount
; r
++) {
906 struct anv_surface_view src_view
;
907 anv_image_view_init(&src_view
, cmd_buffer
->device
,
908 &(VkImageViewCreateInfo
) {
909 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
911 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
912 .format
= src_image
->format
,
914 VK_CHANNEL_SWIZZLE_R
,
915 VK_CHANNEL_SWIZZLE_G
,
916 VK_CHANNEL_SWIZZLE_B
,
919 .subresourceRange
= {
920 .aspect
= pRegions
[r
].srcSubresource
.aspect
,
921 .baseMipLevel
= pRegions
[r
].srcSubresource
.mipLevel
,
923 .baseArraySlice
= pRegions
[r
].srcSubresource
.arraySlice
,
930 struct anv_surface_view dest_view
;
931 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
932 &(VkColorAttachmentViewCreateInfo
) {
933 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
935 .format
= dest_image
->format
,
936 .mipLevel
= pRegions
[r
].destSubresource
.mipLevel
,
937 .baseArraySlice
= pRegions
[r
].destSubresource
.arraySlice
,
942 meta_emit_blit(cmd_buffer
,
944 pRegions
[r
].srcOffset
,
945 pRegions
[r
].srcExtent
,
947 pRegions
[r
].destOffset
,
948 pRegions
[r
].destExtent
);
951 meta_finish_blit(cmd_buffer
, &saved_state
);
954 void anv_CmdCopyBufferToImage(
955 VkCmdBuffer cmdBuffer
,
958 VkImageLayout destImageLayout
,
959 uint32_t regionCount
,
960 const VkBufferImageCopy
* pRegions
)
962 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
963 VkDevice vk_device
= (VkDevice
) cmd_buffer
->device
;
964 struct anv_buffer
*src_buffer
= (struct anv_buffer
*)srcBuffer
;
965 struct anv_image
*dest_image
= (struct anv_image
*)destImage
;
966 struct anv_saved_state saved_state
;
968 meta_prepare_blit(cmd_buffer
, &saved_state
);
970 for (unsigned r
= 0; r
< regionCount
; r
++) {
971 struct anv_image
*src_image
;
972 anv_CreateImage(vk_device
,
973 &(VkImageCreateInfo
) {
974 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
975 .imageType
= VK_IMAGE_TYPE_2D
,
976 .format
= dest_image
->format
,
978 .width
= pRegions
[r
].imageExtent
.width
,
979 .height
= pRegions
[r
].imageExtent
.height
,
985 .tiling
= VK_IMAGE_TILING_LINEAR
,
986 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
988 }, (VkImage
*)&src_image
);
990 /* We could use a vk call to bind memory, but that would require
991 * creating a dummy memory object etc. so there's really no point.
993 src_image
->bo
= src_buffer
->bo
;
994 src_image
->offset
= src_buffer
->offset
+ pRegions
[r
].bufferOffset
;
996 struct anv_surface_view src_view
;
997 anv_image_view_init(&src_view
, cmd_buffer
->device
,
998 &(VkImageViewCreateInfo
) {
999 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
1000 .image
= (VkImage
)src_image
,
1001 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
1002 .format
= dest_image
->format
,
1004 VK_CHANNEL_SWIZZLE_R
,
1005 VK_CHANNEL_SWIZZLE_G
,
1006 VK_CHANNEL_SWIZZLE_B
,
1007 VK_CHANNEL_SWIZZLE_A
1009 .subresourceRange
= {
1010 .aspect
= pRegions
[r
].imageSubresource
.aspect
,
1013 .baseArraySlice
= 0,
1020 struct anv_surface_view dest_view
;
1021 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
1022 &(VkColorAttachmentViewCreateInfo
) {
1023 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
1024 .image
= (VkImage
)dest_image
,
1025 .format
= dest_image
->format
,
1026 .mipLevel
= pRegions
[r
].imageSubresource
.mipLevel
,
1027 .baseArraySlice
= pRegions
[r
].imageSubresource
.arraySlice
,
1032 meta_emit_blit(cmd_buffer
,
1034 (VkOffset3D
) { 0, 0, 0 },
1035 pRegions
[r
].imageExtent
,
1037 pRegions
[r
].imageOffset
,
1038 pRegions
[r
].imageExtent
);
1041 meta_finish_blit(cmd_buffer
, &saved_state
);
1044 void anv_CmdCopyImageToBuffer(
1045 VkCmdBuffer cmdBuffer
,
1047 VkImageLayout srcImageLayout
,
1048 VkBuffer destBuffer
,
1049 uint32_t regionCount
,
1050 const VkBufferImageCopy
* pRegions
)
1052 struct anv_cmd_buffer
*cmd_buffer
= (struct anv_cmd_buffer
*)cmdBuffer
;
1053 VkDevice vk_device
= (VkDevice
) cmd_buffer
->device
;
1054 struct anv_image
*src_image
= (struct anv_image
*)srcImage
;
1055 struct anv_buffer
*dest_buffer
= (struct anv_buffer
*)destBuffer
;
1056 struct anv_saved_state saved_state
;
1058 meta_prepare_blit(cmd_buffer
, &saved_state
);
1060 for (unsigned r
= 0; r
< regionCount
; r
++) {
1061 struct anv_surface_view src_view
;
1062 anv_image_view_init(&src_view
, cmd_buffer
->device
,
1063 &(VkImageViewCreateInfo
) {
1064 .sType
= VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
,
1066 .viewType
= VK_IMAGE_VIEW_TYPE_2D
,
1067 .format
= src_image
->format
,
1069 VK_CHANNEL_SWIZZLE_R
,
1070 VK_CHANNEL_SWIZZLE_G
,
1071 VK_CHANNEL_SWIZZLE_B
,
1072 VK_CHANNEL_SWIZZLE_A
1074 .subresourceRange
= {
1075 .aspect
= pRegions
[r
].imageSubresource
.aspect
,
1076 .baseMipLevel
= pRegions
[r
].imageSubresource
.mipLevel
,
1078 .baseArraySlice
= pRegions
[r
].imageSubresource
.arraySlice
,
1085 struct anv_image
*dest_image
;
1086 anv_CreateImage(vk_device
,
1087 &(VkImageCreateInfo
) {
1088 .sType
= VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
,
1089 .imageType
= VK_IMAGE_TYPE_2D
,
1090 .format
= src_image
->format
,
1092 .width
= pRegions
[r
].imageExtent
.width
,
1093 .height
= pRegions
[r
].imageExtent
.height
,
1099 .tiling
= VK_IMAGE_TILING_LINEAR
,
1100 .usage
= VK_IMAGE_USAGE_SAMPLED_BIT
,
1102 }, (VkImage
*)&dest_image
);
1104 /* We could use a vk call to bind memory, but that would require
1105 * creating a dummy memory object etc. so there's really no point.
1107 dest_image
->bo
= dest_buffer
->bo
;
1108 dest_image
->offset
= dest_buffer
->offset
+ pRegions
[r
].bufferOffset
;
1110 struct anv_surface_view dest_view
;
1111 anv_color_attachment_view_init(&dest_view
, cmd_buffer
->device
,
1112 &(VkColorAttachmentViewCreateInfo
) {
1113 .sType
= VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO
,
1114 .image
= (VkImage
)dest_image
,
1115 .format
= src_image
->format
,
1117 .baseArraySlice
= 0,
1122 meta_emit_blit(cmd_buffer
,
1124 pRegions
[r
].imageOffset
,
1125 pRegions
[r
].imageExtent
,
1127 (VkOffset3D
) { 0, 0, 0 },
1128 pRegions
[r
].imageExtent
);
1131 meta_finish_blit(cmd_buffer
, &saved_state
);
1134 void anv_CmdCloneImageData(
1135 VkCmdBuffer cmdBuffer
,
1137 VkImageLayout srcImageLayout
,
1139 VkImageLayout destImageLayout
)
1144 void anv_CmdUpdateBuffer(
1145 VkCmdBuffer cmdBuffer
,
1146 VkBuffer destBuffer
,
1147 VkDeviceSize destOffset
,
1148 VkDeviceSize dataSize
,
1149 const uint32_t* pData
)
1154 void anv_CmdFillBuffer(
1155 VkCmdBuffer cmdBuffer
,
1156 VkBuffer destBuffer
,
1157 VkDeviceSize destOffset
,
1158 VkDeviceSize fillSize
,
1164 void anv_CmdClearColorImage(
1165 VkCmdBuffer cmdBuffer
,
1167 VkImageLayout imageLayout
,
1168 const VkClearColor
* color
,
1169 uint32_t rangeCount
,
1170 const VkImageSubresourceRange
* pRanges
)
1175 void anv_CmdClearDepthStencil(
1176 VkCmdBuffer cmdBuffer
,
1178 VkImageLayout imageLayout
,
1181 uint32_t rangeCount
,
1182 const VkImageSubresourceRange
* pRanges
)
1187 void anv_CmdResolveImage(
1188 VkCmdBuffer cmdBuffer
,
1190 VkImageLayout srcImageLayout
,
1192 VkImageLayout destImageLayout
,
1193 uint32_t regionCount
,
1194 const VkImageResolve
* pRegions
)
1200 anv_device_init_meta(struct anv_device
*device
)
1202 anv_device_init_meta_clear_state(device
);
1203 anv_device_init_meta_blit_state(device
);