2 * Copyright © 2016 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
21 * DEALINGS IN THE SOFTWARE.
24 #include "tu_private.h"
27 #include "adreno_common.xml.h"
28 #include "adreno_pm4.xml.h"
30 #include "vk_format.h"
36 tu_copy_buffer(struct tu_cmd_buffer
*cmd
,
37 struct tu_buffer
*src
,
38 struct tu_buffer
*dst
,
39 const VkBufferCopy
*region
)
41 tu_bo_list_add(&cmd
->bo_list
, src
->bo
, MSM_SUBMIT_BO_READ
);
42 tu_bo_list_add(&cmd
->bo_list
, dst
->bo
, MSM_SUBMIT_BO_WRITE
);
44 tu_blit(cmd
, &(struct tu_blit
) {
46 .fmt
= VK_FORMAT_R8_UNORM
,
47 .va
= tu_buffer_iova(dst
) + region
->dstOffset
,
48 .width
= region
->size
,
53 .fmt
= VK_FORMAT_R8_UNORM
,
54 .va
= tu_buffer_iova(src
) + region
->srcOffset
,
55 .width
= region
->size
,
65 static struct tu_blit_surf
66 tu_blit_buffer(struct tu_buffer
*buffer
,
68 const VkBufferImageCopy
*info
)
70 if (info
->imageSubresource
.aspectMask
== VK_IMAGE_ASPECT_STENCIL_BIT
)
71 format
= VK_FORMAT_R8_UNORM
;
73 unsigned pitch
= (info
->bufferRowLength
?: info
->imageExtent
.width
) *
74 vk_format_get_blocksize(format
);
76 return (struct tu_blit_surf
) {
78 .tile_mode
= TILE6_LINEAR
,
79 .va
= tu_buffer_iova(buffer
) + info
->bufferOffset
,
81 .layer_size
= (info
->bufferImageHeight
?: info
->imageExtent
.height
) * pitch
/ vk_format_get_blockwidth(format
) / vk_format_get_blockheight(format
),
82 .width
= info
->imageExtent
.width
,
83 .height
= info
->imageExtent
.height
,
89 tu_copy_buffer_to_image(struct tu_cmd_buffer
*cmdbuf
,
90 struct tu_buffer
*src_buffer
,
91 struct tu_image
*dst_image
,
92 const VkBufferImageCopy
*info
)
94 if (info
->imageSubresource
.aspectMask
== VK_IMAGE_ASPECT_STENCIL_BIT
&&
95 vk_format_get_blocksize(dst_image
->vk_format
) == 4) {
96 tu_finishme("aspect mask\n");
100 tu_blit(cmdbuf
, &(struct tu_blit
) {
101 .dst
= tu_blit_surf_ext(dst_image
, info
->imageSubresource
, info
->imageOffset
, info
->imageExtent
),
102 .src
= tu_blit_buffer(src_buffer
, dst_image
->vk_format
, info
),
103 .layers
= MAX2(info
->imageExtent
.depth
, info
->imageSubresource
.layerCount
),
104 .type
= TU_BLIT_COPY
,
109 tu_copy_image_to_buffer(struct tu_cmd_buffer
*cmdbuf
,
110 struct tu_image
*src_image
,
111 struct tu_buffer
*dst_buffer
,
112 const VkBufferImageCopy
*info
)
114 tu_blit(cmdbuf
, &(struct tu_blit
) {
115 .dst
= tu_blit_buffer(dst_buffer
, src_image
->vk_format
, info
),
116 .src
= tu_blit_surf_ext(src_image
, info
->imageSubresource
, info
->imageOffset
, info
->imageExtent
),
117 .layers
= MAX2(info
->imageExtent
.depth
, info
->imageSubresource
.layerCount
),
118 .type
= TU_BLIT_COPY
,
123 tu_copy_image_to_image(struct tu_cmd_buffer
*cmdbuf
,
124 struct tu_image
*src_image
,
125 struct tu_image
*dst_image
,
126 const VkImageCopy
*info
)
128 if ((info
->dstSubresource
.aspectMask
== VK_IMAGE_ASPECT_STENCIL_BIT
&&
129 vk_format_get_blocksize(dst_image
->vk_format
) == 4) ||
130 (info
->srcSubresource
.aspectMask
== VK_IMAGE_ASPECT_STENCIL_BIT
&&
131 vk_format_get_blocksize(src_image
->vk_format
) == 4)) {
132 tu_finishme("aspect mask\n");
136 tu_blit(cmdbuf
, &(struct tu_blit
) {
137 .dst
= tu_blit_surf_ext(dst_image
, info
->dstSubresource
, info
->dstOffset
, info
->extent
),
138 .src
= tu_blit_surf_ext(src_image
, info
->srcSubresource
, info
->srcOffset
, info
->extent
),
139 .layers
= info
->extent
.depth
,
140 .type
= TU_BLIT_COPY
,
145 tu_CmdCopyBuffer(VkCommandBuffer commandBuffer
,
148 uint32_t regionCount
,
149 const VkBufferCopy
*pRegions
)
151 TU_FROM_HANDLE(tu_cmd_buffer
, cmdbuf
, commandBuffer
);
152 TU_FROM_HANDLE(tu_buffer
, src_buffer
, srcBuffer
);
153 TU_FROM_HANDLE(tu_buffer
, dst_buffer
, destBuffer
);
155 for (unsigned i
= 0; i
< regionCount
; ++i
)
156 tu_copy_buffer(cmdbuf
, src_buffer
, dst_buffer
, &pRegions
[i
]);
160 tu_CmdCopyBufferToImage(VkCommandBuffer commandBuffer
,
163 VkImageLayout destImageLayout
,
164 uint32_t regionCount
,
165 const VkBufferImageCopy
*pRegions
)
167 TU_FROM_HANDLE(tu_cmd_buffer
, cmdbuf
, commandBuffer
);
168 TU_FROM_HANDLE(tu_image
, dst_image
, destImage
);
169 TU_FROM_HANDLE(tu_buffer
, src_buffer
, srcBuffer
);
171 tu_bo_list_add(&cmdbuf
->bo_list
, src_buffer
->bo
, MSM_SUBMIT_BO_READ
);
172 tu_bo_list_add(&cmdbuf
->bo_list
, dst_image
->bo
, MSM_SUBMIT_BO_WRITE
);
174 for (unsigned i
= 0; i
< regionCount
; ++i
)
175 tu_copy_buffer_to_image(cmdbuf
, src_buffer
, dst_image
, pRegions
+ i
);
179 tu_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer
,
181 VkImageLayout srcImageLayout
,
183 uint32_t regionCount
,
184 const VkBufferImageCopy
*pRegions
)
186 TU_FROM_HANDLE(tu_cmd_buffer
, cmdbuf
, commandBuffer
);
187 TU_FROM_HANDLE(tu_image
, src_image
, srcImage
);
188 TU_FROM_HANDLE(tu_buffer
, dst_buffer
, destBuffer
);
190 tu_bo_list_add(&cmdbuf
->bo_list
, src_image
->bo
, MSM_SUBMIT_BO_READ
);
191 tu_bo_list_add(&cmdbuf
->bo_list
, dst_buffer
->bo
, MSM_SUBMIT_BO_WRITE
);
193 for (unsigned i
= 0; i
< regionCount
; ++i
)
194 tu_copy_image_to_buffer(cmdbuf
, src_image
, dst_buffer
, pRegions
+ i
);
198 tu_CmdCopyImage(VkCommandBuffer commandBuffer
,
200 VkImageLayout srcImageLayout
,
202 VkImageLayout destImageLayout
,
203 uint32_t regionCount
,
204 const VkImageCopy
*pRegions
)
206 TU_FROM_HANDLE(tu_cmd_buffer
, cmdbuf
, commandBuffer
);
207 TU_FROM_HANDLE(tu_image
, src_image
, srcImage
);
208 TU_FROM_HANDLE(tu_image
, dst_image
, destImage
);
210 tu_bo_list_add(&cmdbuf
->bo_list
, src_image
->bo
, MSM_SUBMIT_BO_READ
);
211 tu_bo_list_add(&cmdbuf
->bo_list
, dst_image
->bo
, MSM_SUBMIT_BO_WRITE
);
213 for (uint32_t i
= 0; i
< regionCount
; ++i
)
214 tu_copy_image_to_image(cmdbuf
, src_image
, dst_image
, pRegions
+ i
);