blob: 40375850e806f12ab2fef8c99c248d18b1ce10dd [file] [log] [blame]
Chia-I Wuc14d1562014-10-17 09:49:22 +08001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
Chia-I Wuc14d1562014-10-17 09:49:22 +08003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
26 */
27
Chia-I Wu714df452015-01-01 07:55:04 +080028#include "buf.h"
Chia-I Wuc14d1562014-10-17 09:49:22 +080029#include "img.h"
30#include "mem.h"
Chia-I Wu429a0aa2014-10-24 11:57:51 +080031#include "state.h"
Chia-I Wuc14d1562014-10-17 09:49:22 +080032#include "cmd_priv.h"
33
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060034static VkResult cmd_meta_create_buf_view(struct intel_cmd *cmd,
35 VkBuffer buf,
36 VkGpuSize range,
37 VkFormat format,
Chia-I Wu714df452015-01-01 07:55:04 +080038 struct intel_buf_view **view)
Chia-I Wuc14d1562014-10-17 09:49:22 +080039{
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -060040 VkBufferViewCreateInfo info;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060041 VkGpuSize stride;
Chia-I Wuc14d1562014-10-17 09:49:22 +080042
43 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060044 info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
Chia-I Wu714df452015-01-01 07:55:04 +080045 info.buffer = buf;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060046 info.viewType = VK_BUFFER_VIEW_TYPED;
Chia-I Wuc14d1562014-10-17 09:49:22 +080047 info.format = format;
Chia-I Wu714df452015-01-01 07:55:04 +080048 info.range = range;
Chia-I Wuc14d1562014-10-17 09:49:22 +080049
Chia-I Wubc7a30c2014-12-13 15:54:10 +080050 /*
51 * We do not rely on the hardware to avoid out-of-bound access. But we do
52 * not want the hardware to ignore the last element either.
53 */
Courtney Goeltzenleuchterba093032015-03-25 16:31:58 -060054 stride = icd_format_get_size(format);
55 if (info.range % stride)
56 info.range += stride - (info.range % stride);
Chia-I Wubc7a30c2014-12-13 15:54:10 +080057
Chia-I Wu714df452015-01-01 07:55:04 +080058 return intel_buf_view_create(cmd->dev, &info, view);
Chia-I Wuc14d1562014-10-17 09:49:22 +080059}
60
Chia-I Wu714df452015-01-01 07:55:04 +080061static void cmd_meta_set_src_for_buf(struct intel_cmd *cmd,
62 const struct intel_buf *buf,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060063 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +080064 struct intel_cmd_meta *meta)
65{
Chia-I Wu714df452015-01-01 07:55:04 +080066 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060067 VkResult res;
Chia-I Wuc14d1562014-10-17 09:49:22 +080068
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060069 res = cmd_meta_create_buf_view(cmd, (VkBuffer) buf,
Chia-I Wu714df452015-01-01 07:55:04 +080070 buf->size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060071 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -070072 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +080073 return;
74 }
Chia-I Wuc14d1562014-10-17 09:49:22 +080075
76 meta->src.valid = true;
77
Chia-I Wu714df452015-01-01 07:55:04 +080078 memcpy(meta->src.surface, view->cmd,
79 sizeof(view->cmd[0]) * view->cmd_len);
80 meta->src.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +080081
Chia-I Wu714df452015-01-01 07:55:04 +080082 intel_buf_view_destroy(view);
83
84 meta->src.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +080085 meta->src.reloc_offset = 0;
86 meta->src.reloc_flags = 0;
87}
88
Chia-I Wu714df452015-01-01 07:55:04 +080089static void cmd_meta_set_dst_for_buf(struct intel_cmd *cmd,
90 const struct intel_buf *buf,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060091 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +080092 struct intel_cmd_meta *meta)
93{
Chia-I Wu714df452015-01-01 07:55:04 +080094 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060095 VkResult res;
Chia-I Wuc14d1562014-10-17 09:49:22 +080096
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060097 res = cmd_meta_create_buf_view(cmd, (VkBuffer) buf,
Chia-I Wu714df452015-01-01 07:55:04 +080098 buf->size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060099 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700100 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800101 return;
102 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800103
104 meta->dst.valid = true;
105
Chia-I Wu714df452015-01-01 07:55:04 +0800106 memcpy(meta->dst.surface, view->cmd,
107 sizeof(view->cmd[0]) * view->cmd_len);
108 meta->dst.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800109
Chia-I Wu714df452015-01-01 07:55:04 +0800110 intel_buf_view_destroy(view);
111
112 meta->dst.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800113 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800114 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800115}
116
117static void cmd_meta_set_src_for_img(struct intel_cmd *cmd,
118 const struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600119 VkFormat format,
120 VkImageAspect aspect,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800121 struct intel_cmd_meta *meta)
122{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600123 VkImageViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800124 struct intel_img_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600125 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800126
127 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600128 info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600129 info.image = (VkImage) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800130
131 switch (img->type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600132 case VK_IMAGE_1D:
133 info.viewType = VK_IMAGE_VIEW_1D;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800134 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600135 case VK_IMAGE_2D:
136 info.viewType = VK_IMAGE_VIEW_2D;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800137 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600138 case VK_IMAGE_3D:
139 info.viewType = VK_IMAGE_VIEW_3D;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800140 break;
141 default:
142 break;
143 }
144
145 info.format = format;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600146 info.channels.r = VK_CHANNEL_SWIZZLE_R;
147 info.channels.g = VK_CHANNEL_SWIZZLE_G;
148 info.channels.b = VK_CHANNEL_SWIZZLE_B;
149 info.channels.a = VK_CHANNEL_SWIZZLE_A;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800150 info.subresourceRange.aspect = aspect;
151 info.subresourceRange.baseMipLevel = 0;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600152 info.subresourceRange.mipLevels = VK_LAST_MIP_OR_SLICE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800153 info.subresourceRange.baseArraySlice = 0;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600154 info.subresourceRange.arraySize = VK_LAST_MIP_OR_SLICE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800155
156 ret = intel_img_view_create(cmd->dev, &info, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600157 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700158 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800159 return;
160 }
161
162 meta->src.valid = true;
163
164 memcpy(meta->src.surface, view->cmd,
165 sizeof(view->cmd[0]) * view->cmd_len);
166 meta->src.surface_len = view->cmd_len;
167
168 meta->src.reloc_target = (intptr_t) img->obj.mem->bo;
169 meta->src.reloc_offset = 0;
170 meta->src.reloc_flags = 0;
171
172 intel_img_view_destroy(view);
173}
174
Chia-I Wu83084ba2014-12-04 12:49:52 +0800175static void cmd_meta_adjust_compressed_dst(struct intel_cmd *cmd,
176 const struct intel_img *img,
177 struct intel_cmd_meta *meta)
178{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600179 int32_t w, h, layer;
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800180 unsigned x_offset, y_offset;
Chia-I Wu83084ba2014-12-04 12:49:52 +0800181
182 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
183 w = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_WIDTH);
184 h = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800185 layer = GEN_EXTRACT(meta->dst.surface[4],
186 GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800187 } else {
188 w = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_WIDTH);
189 h = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800190 layer = GEN_EXTRACT(meta->dst.surface[4],
191 GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800192 }
193
194 /* note that the width/height fields have the real values minus 1 */
195 w = (w + img->layout.block_width) / img->layout.block_width - 1;
196 h = (h + img->layout.block_height) / img->layout.block_height - 1;
197
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800198 /* adjust width and height */
Chia-I Wu83084ba2014-12-04 12:49:52 +0800199 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800200 meta->dst.surface[2] &= ~(GEN7_SURFACE_DW2_WIDTH__MASK |
201 GEN7_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800202 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN7_SURFACE_DW2_WIDTH) |
203 GEN_SHIFT32(h, GEN7_SURFACE_DW2_HEIGHT);
204 } else {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800205 meta->dst.surface[2] &= ~(GEN6_SURFACE_DW2_WIDTH__MASK |
206 GEN6_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800207 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN6_SURFACE_DW2_WIDTH) |
208 GEN_SHIFT32(h, GEN6_SURFACE_DW2_HEIGHT);
209 }
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800210
211 if (!layer)
212 return;
213
214 meta->dst.reloc_offset = intel_layout_get_slice_tile_offset(&img->layout,
215 0, layer, &x_offset, &y_offset);
216
217 /*
218 * The lower 2 bits (or 1 bit for Y) are missing. This may be a problem
219 * for small images (16x16 or smaller). We will need to adjust the
220 * drawing rectangle instead.
221 */
222 x_offset = (x_offset / img->layout.block_width) >> 2;
223 y_offset = (y_offset / img->layout.block_height) >> 1;
224
225 /* adjust min array element and X/Y offsets */
226 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
227 meta->dst.surface[4] &= ~GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
228 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN7_SURFACE_DW5_X_OFFSET) |
229 GEN_SHIFT32(y_offset, GEN7_SURFACE_DW5_Y_OFFSET);
230 } else {
231 meta->dst.surface[4] &= ~GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
232 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN6_SURFACE_DW5_X_OFFSET) |
233 GEN_SHIFT32(y_offset, GEN6_SURFACE_DW5_Y_OFFSET);
234 }
Chia-I Wu83084ba2014-12-04 12:49:52 +0800235}
236
Chia-I Wuc14d1562014-10-17 09:49:22 +0800237static void cmd_meta_set_dst_for_img(struct intel_cmd *cmd,
238 const struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600239 VkFormat format,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600240 uint32_t lod, uint32_t layer,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800241 struct intel_cmd_meta *meta)
242{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600243 VkColorAttachmentViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800244 struct intel_rt_view *rt;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600245 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800246
247 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600248 info.sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600249 info.image = (VkImage) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800250 info.format = format;
251 info.mipLevel = lod;
252 info.baseArraySlice = layer;
253 info.arraySize = 1;
254
255 ret = intel_rt_view_create(cmd->dev, &info, &rt);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600256 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700257 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800258 return;
259 }
260
261 meta->dst.valid = true;
262
263 memcpy(meta->dst.surface, rt->cmd, sizeof(rt->cmd[0]) * rt->cmd_len);
264 meta->dst.surface_len = rt->cmd_len;
265
266 meta->dst.reloc_target = (intptr_t) img->obj.mem->bo;
267 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800268 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800269
Chia-I Wu83084ba2014-12-04 12:49:52 +0800270 if (icd_format_is_compressed(img->layout.format))
271 cmd_meta_adjust_compressed_dst(cmd, img, meta);
272
Chia-I Wuc14d1562014-10-17 09:49:22 +0800273 intel_rt_view_destroy(rt);
274}
275
276static void cmd_meta_set_src_for_writer(struct intel_cmd *cmd,
277 enum intel_cmd_writer_type writer,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600278 VkGpuSize size,
279 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800280 struct intel_cmd_meta *meta)
281{
Chia-I Wu714df452015-01-01 07:55:04 +0800282 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600283 VkResult res;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800284
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600285 res = cmd_meta_create_buf_view(cmd, (VkBuffer) VK_NULL_HANDLE,
Chia-I Wu714df452015-01-01 07:55:04 +0800286 size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600287 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700288 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800289 return;
290 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800291
292 meta->src.valid = true;
293
Chia-I Wu714df452015-01-01 07:55:04 +0800294 memcpy(meta->src.surface, view->cmd,
295 sizeof(view->cmd[0]) * view->cmd_len);
296 meta->src.surface_len = view->cmd_len;
297
298 intel_buf_view_destroy(view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800299
300 meta->src.reloc_target = (intptr_t) writer;
301 meta->src.reloc_offset = 0;
302 meta->src.reloc_flags = INTEL_CMD_RELOC_TARGET_IS_WRITER;
303}
304
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800305static void cmd_meta_set_ds_view(struct intel_cmd *cmd,
306 const struct intel_img *img,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600307 uint32_t lod, uint32_t layer,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800308 struct intel_cmd_meta *meta)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800309{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600310 VkDepthStencilViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800311 struct intel_ds_view *ds;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600312 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800313
314 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600315 info.sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600316 info.image = (VkImage) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800317 info.mipLevel = lod;
318 info.baseArraySlice = layer;
319 info.arraySize = 1;
320
321 ret = intel_ds_view_create(cmd->dev, &info, &ds);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600322 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700323 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800324 return;
325 }
326
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800327 meta->ds.view = ds;
328}
329
330static void cmd_meta_set_ds_state(struct intel_cmd *cmd,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600331 VkImageAspect aspect,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600332 uint32_t stencil_ref,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800333 struct intel_cmd_meta *meta)
334{
Tony Barbourfa6cac72015-01-16 14:27:35 -0700335 meta->ds.stencil_ref = stencil_ref;
336 meta->ds.aspect = aspect;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800337}
338
339static enum intel_dev_meta_shader get_shader_id(const struct intel_dev *dev,
340 const struct intel_img *img,
341 bool copy_array)
342{
343 enum intel_dev_meta_shader shader_id;
344
345 switch (img->type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600346 case VK_IMAGE_1D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800347 shader_id = (copy_array) ?
348 INTEL_DEV_META_FS_COPY_1D_ARRAY : INTEL_DEV_META_FS_COPY_1D;
349 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600350 case VK_IMAGE_2D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800351 shader_id = (img->samples > 1) ? INTEL_DEV_META_FS_COPY_2D_MS :
352 (copy_array) ? INTEL_DEV_META_FS_COPY_2D_ARRAY :
353 INTEL_DEV_META_FS_COPY_2D;
354 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600355 case VK_IMAGE_3D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800356 default:
357 shader_id = INTEL_DEV_META_FS_COPY_2D_ARRAY;
358 break;
359 }
360
361 return shader_id;
362}
363
Chia-I Wuf3a27252014-11-24 15:27:01 +0800364static bool cmd_meta_mem_dword_aligned(const struct intel_cmd *cmd,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600365 VkGpuSize src_offset,
366 VkGpuSize dst_offset,
367 VkGpuSize size)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800368{
Chia-I Wuf3a27252014-11-24 15:27:01 +0800369 return !((src_offset | dst_offset | size) & 0x3);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800370}
371
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600372static VkFormat cmd_meta_img_raw_format(const struct intel_cmd *cmd,
373 VkFormat format)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800374{
Chia-I Wuffdde352014-12-20 15:12:16 +0800375 switch (icd_format_get_size(format)) {
376 case 1:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600377 format = VK_FMT_R8_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800378 break;
379 case 2:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600380 format = VK_FMT_R16_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800381 break;
382 case 4:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600383 format = VK_FMT_R32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800384 break;
385 case 8:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600386 format = VK_FMT_R32G32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800387 break;
388 case 16:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600389 format = VK_FMT_R32G32B32A32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800390 break;
391 default:
392 assert(!"unsupported image format for raw blit op");
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600393 format = VK_FMT_UNDEFINED;
Chia-I Wuffdde352014-12-20 15:12:16 +0800394 break;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800395 }
396
397 return format;
398}
399
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600400ICD_EXPORT void VKAPI vkCmdCopyBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600401 VkCmdBuffer cmdBuffer,
402 VkBuffer srcBuffer,
403 VkBuffer destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600404 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600405 const VkBufferCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800406{
407 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800408 struct intel_buf *src = intel_buf(srcBuffer);
409 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800410 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600411 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600412 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800413
414 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800415 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800416
Chia-I Wuc14d1562014-10-17 09:49:22 +0800417 meta.height = 1;
418 meta.samples = 1;
419
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600420 format = VK_FMT_UNDEFINED;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800421
422 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600423 const VkBufferCopy *region = &pRegions[i];
424 VkFormat fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800425
Chia-I Wuf3a27252014-11-24 15:27:01 +0800426 meta.src.x = region->srcOffset;
427 meta.dst.x = region->destOffset;
428 meta.width = region->copySize;
429
430 if (cmd_meta_mem_dword_aligned(cmd, region->srcOffset,
431 region->destOffset, region->copySize)) {
432 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
433 meta.src.x /= 4;
434 meta.dst.x /= 4;
435 meta.width /= 4;
436
437 /*
438 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to
439 * be 16
440 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600441 fmt = VK_FMT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800442 } else {
443 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600444 intel_dev_log(cmd->dev, VK_DBG_MSG_ERROR,
445 VK_VALIDATION_LEVEL_0, VK_NULL_HANDLE, 0, 0,
446 "unaligned vkCmdCopyBuffer unsupported");
447 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800448 continue;
449 }
450
451 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM_UNALIGNED;
452
453 /*
454 * INTEL_DEV_META_VS_COPY_MEM_UNALIGNED is untyped but expects the
455 * stride to be 4
456 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600457 fmt = VK_FMT_R8G8B8A8_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800458 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800459
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700460 if (format != fmt) {
461 format = fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800462
Chia-I Wu714df452015-01-01 07:55:04 +0800463 cmd_meta_set_src_for_buf(cmd, src, format, &meta);
464 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800465 }
466
Chia-I Wuc14d1562014-10-17 09:49:22 +0800467 cmd_draw_meta(cmd, &meta);
468 }
469}
470
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600471ICD_EXPORT void VKAPI vkCmdCopyImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600472 VkCmdBuffer cmdBuffer,
473 VkImage srcImage,
474 VkImageLayout srcImageLayout,
475 VkImage destImage,
476 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600477 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600478 const VkImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800479{
480 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
481 struct intel_img *src = intel_img(srcImage);
482 struct intel_img *dst = intel_img(destImage);
483 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600484 VkFormat raw_format;
Cody Northrop30a2b462015-02-10 09:28:30 -0700485 bool raw_copy = false;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600486 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800487
488 if (src->type != dst->type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600489 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800490 return;
491 }
492
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700493 if (src->layout.format == dst->layout.format) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800494 raw_copy = true;
495 raw_format = cmd_meta_img_raw_format(cmd, src->layout.format);
496 } else if (icd_format_is_compressed(src->layout.format) ||
497 icd_format_is_compressed(dst->layout.format)) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600498 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800499 return;
500 }
501
502 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800503 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800504
505 cmd_meta_set_src_for_img(cmd, src,
506 (raw_copy) ? raw_format : src->layout.format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600507 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800508
509 meta.samples = dst->samples;
510
511 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600512 const VkImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600513 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800514
515 meta.shader_id = get_shader_id(cmd->dev, src,
516 (region->extent.depth > 1));
517
518 meta.src.lod = region->srcSubresource.mipLevel;
519 meta.src.layer = region->srcSubresource.arraySlice +
520 region->srcOffset.z;
521 meta.src.x = region->srcOffset.x;
522 meta.src.y = region->srcOffset.y;
523
524 meta.dst.lod = region->destSubresource.mipLevel;
525 meta.dst.layer = region->destSubresource.arraySlice +
526 region->destOffset.z;
527 meta.dst.x = region->destOffset.x;
528 meta.dst.y = region->destOffset.y;
529
530 meta.width = region->extent.width;
531 meta.height = region->extent.height;
532
Chia-I Wueccc7682015-03-24 14:15:30 +0800533 if (raw_copy) {
534 const uint32_t block_width =
535 icd_format_get_block_width(raw_format);
536
537 meta.src.x /= block_width;
538 meta.src.y /= block_width;
539 meta.dst.x /= block_width;
540 meta.dst.y /= block_width;
541 meta.width /= block_width;
542 meta.height /= block_width;
543 }
544
Chia-I Wuc14d1562014-10-17 09:49:22 +0800545 for (j = 0; j < region->extent.depth; j++) {
546 cmd_meta_set_dst_for_img(cmd, dst,
547 (raw_copy) ? raw_format : dst->layout.format,
548 meta.dst.lod, meta.dst.layer, &meta);
549
550 cmd_draw_meta(cmd, &meta);
551
552 meta.src.layer++;
553 meta.dst.layer++;
554 }
555 }
556}
557
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600558ICD_EXPORT void VKAPI vkCmdBlitImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600559 VkCmdBuffer cmdBuffer,
560 VkImage srcImage,
561 VkImageLayout srcImageLayout,
562 VkImage destImage,
563 VkImageLayout destImageLayout,
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600564 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600565 const VkImageBlit* pRegions)
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600566{
567 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
568
569 /*
570 * TODO: Implement actual blit function.
571 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600572 cmd_fail(cmd, VK_ERROR_UNAVAILABLE);
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600573}
574
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600575ICD_EXPORT void VKAPI vkCmdCopyBufferToImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600576 VkCmdBuffer cmdBuffer,
577 VkBuffer srcBuffer,
578 VkImage destImage,
579 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600580 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600581 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800582{
583 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800584 struct intel_buf *buf = intel_buf(srcBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800585 struct intel_img *img = intel_img(destImage);
586 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600587 VkFormat format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800588 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800589
590 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800591 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800592
593 meta.shader_id = INTEL_DEV_META_FS_COPY_MEM_TO_IMG;
594 meta.samples = img->samples;
595
596 format = cmd_meta_img_raw_format(cmd, img->layout.format);
Mike Stroyanbc4e2ed2015-03-24 15:10:24 -0600597 block_width = icd_format_get_block_width(img->layout.format);
Chia-I Wu714df452015-01-01 07:55:04 +0800598 cmd_meta_set_src_for_buf(cmd, buf, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800599
600 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600601 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600602 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800603
Chia-I Wu714df452015-01-01 07:55:04 +0800604 meta.src.x = region->bufferOffset / icd_format_get_size(format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800605
606 meta.dst.lod = region->imageSubresource.mipLevel;
607 meta.dst.layer = region->imageSubresource.arraySlice +
608 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800609 meta.dst.x = region->imageOffset.x / block_width;
610 meta.dst.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800611
Chia-I Wueccc7682015-03-24 14:15:30 +0800612 meta.width = region->imageExtent.width / block_width;
613 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800614
615 for (j = 0; j < region->imageExtent.depth; j++) {
616 cmd_meta_set_dst_for_img(cmd, img, format,
617 meta.dst.lod, meta.dst.layer, &meta);
618
619 cmd_draw_meta(cmd, &meta);
620
621 meta.src.x += meta.width * meta.height;
622 meta.dst.layer++;
623 }
624 }
625}
626
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600627ICD_EXPORT void VKAPI vkCmdCopyImageToBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600628 VkCmdBuffer cmdBuffer,
629 VkImage srcImage,
630 VkImageLayout srcImageLayout,
631 VkBuffer destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600632 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600633 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800634{
635 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
636 struct intel_img *img = intel_img(srcImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800637 struct intel_buf *buf = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800638 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600639 VkFormat img_format, buf_format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800640 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800641
642 memset(&meta, 0, sizeof(meta));
Chia-I Wua44b6482014-12-20 14:58:01 +0800643 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800644
Chia-I Wua44b6482014-12-20 14:58:01 +0800645 img_format = cmd_meta_img_raw_format(cmd, img->layout.format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800646 block_width = icd_format_get_block_width(img_format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800647
Chia-I Wu714df452015-01-01 07:55:04 +0800648 /* buf_format is ignored by hw, but we derive stride from it */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700649 switch (img_format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600650 case VK_FMT_R8_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800651 meta.shader_id = INTEL_DEV_META_VS_COPY_R8_TO_MEM;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600652 buf_format = VK_FMT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800653 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600654 case VK_FMT_R16_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800655 meta.shader_id = INTEL_DEV_META_VS_COPY_R16_TO_MEM;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600656 buf_format = VK_FMT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800657 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600658 case VK_FMT_R32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800659 meta.shader_id = INTEL_DEV_META_VS_COPY_R32_TO_MEM;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600660 buf_format = VK_FMT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800661 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600662 case VK_FMT_R32G32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800663 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32_TO_MEM;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600664 buf_format = VK_FMT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800665 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600666 case VK_FMT_R32G32B32A32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800667 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32B32A32_TO_MEM;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600668 buf_format = VK_FMT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800669 break;
670 default:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600671 img_format = VK_FMT_UNDEFINED;
672 buf_format = VK_FMT_UNDEFINED;
Chia-I Wua44b6482014-12-20 14:58:01 +0800673 break;
674 }
675
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600676 if (img_format == VK_FMT_UNDEFINED ||
Chia-I Wua44b6482014-12-20 14:58:01 +0800677 (cmd_gen(cmd) == INTEL_GEN(6) &&
678 icd_format_get_size(img_format) < 4)) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600679 intel_dev_log(cmd->dev, VK_DBG_MSG_ERROR,
680 VK_VALIDATION_LEVEL_0, VK_NULL_HANDLE, 0, 0,
681 "vkCmdCopyImageToBuffer with bpp %d unsupported",
Chia-I Wua44b6482014-12-20 14:58:01 +0800682 icd_format_get_size(img->layout.format));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600683 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wua44b6482014-12-20 14:58:01 +0800684 return;
685 }
686
687 cmd_meta_set_src_for_img(cmd, img, img_format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600688 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800689 cmd_meta_set_dst_for_buf(cmd, buf, buf_format, &meta);
Chia-I Wua44b6482014-12-20 14:58:01 +0800690
Chia-I Wuc14d1562014-10-17 09:49:22 +0800691 meta.samples = 1;
692
693 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600694 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600695 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800696
Chia-I Wuc14d1562014-10-17 09:49:22 +0800697 meta.src.lod = region->imageSubresource.mipLevel;
698 meta.src.layer = region->imageSubresource.arraySlice +
699 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800700 meta.src.x = region->imageOffset.x / block_width;
701 meta.src.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800702
Chia-I Wu714df452015-01-01 07:55:04 +0800703 meta.dst.x = region->bufferOffset / icd_format_get_size(img_format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800704 meta.width = region->imageExtent.width / block_width;
705 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800706
707 for (j = 0; j < region->imageExtent.depth; j++) {
708 cmd_draw_meta(cmd, &meta);
709
710 meta.src.layer++;
Chia-I Wua44b6482014-12-20 14:58:01 +0800711 meta.dst.x += meta.width * meta.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800712 }
713 }
714}
715
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600716ICD_EXPORT void VKAPI vkCmdCloneImageData(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600717 VkCmdBuffer cmdBuffer,
718 VkImage srcImage,
719 VkImageLayout srcImageLayout,
720 VkImage destImage,
721 VkImageLayout destImageLayout)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800722{
Chia-I Wud788fc62014-12-22 14:24:11 +0800723 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
724 struct intel_img *src = intel_img(srcImage);
725 struct intel_img *dst = intel_img(destImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800726 struct intel_buf *src_buf, *dst_buf;
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -0600727 VkBufferCreateInfo buf_info;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600728 VkBufferCopy buf_region;
729 VkResult res;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800730
Chia-I Wu714df452015-01-01 07:55:04 +0800731 memset(&buf_info, 0, sizeof(buf_info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600732 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chia-I Wu714df452015-01-01 07:55:04 +0800733 buf_info.size = src->obj.mem->size;
734
735 memset(&buf_region, 0, sizeof(buf_region));
736 buf_region.copySize = src->obj.mem->size;
737
738 res = intel_buf_create(cmd->dev, &buf_info, &src_buf);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600739 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700740 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800741 return;
742 }
743
744 res = intel_buf_create(cmd->dev, &buf_info, &dst_buf);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600745 if (res != VK_SUCCESS) {
Chia-I Wu714df452015-01-01 07:55:04 +0800746 intel_buf_destroy(src_buf);
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700747 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800748 return;
749 }
750
751 intel_obj_bind_mem(&src_buf->obj, src->obj.mem, 0);
752 intel_obj_bind_mem(&dst_buf->obj, dst->obj.mem, 0);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800753
Chia-I Wud788fc62014-12-22 14:24:11 +0800754 cmd_batch_flush(cmd, GEN6_PIPE_CONTROL_RENDER_CACHE_FLUSH);
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600755 vkCmdCopyBuffer(cmdBuffer, (VkBuffer) src_buf,
756 (VkBuffer) dst_buf, 1, &buf_region);
Chia-I Wu714df452015-01-01 07:55:04 +0800757
758 intel_buf_destroy(src_buf);
759 intel_buf_destroy(dst_buf);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800760}
761
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600762ICD_EXPORT void VKAPI vkCmdUpdateBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600763 VkCmdBuffer cmdBuffer,
764 VkBuffer destBuffer,
765 VkGpuSize destOffset,
766 VkGpuSize dataSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600767 const uint32_t* pData)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800768{
769 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800770 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800771 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600772 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800773 uint32_t *ptr;
774 uint32_t offset;
775
Chia-I Wuf3a27252014-11-24 15:27:01 +0800776 /* must be 4-byte aligned */
777 if ((destOffset | dataSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600778 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800779 return;
780 }
781
Chia-I Wuc14d1562014-10-17 09:49:22 +0800782 /* write to dynamic state writer first */
783 offset = cmd_state_pointer(cmd, INTEL_CMD_ITEM_BLOB, 32,
784 (dataSize + 3) / 4, &ptr);
785 memcpy(ptr, pData, dataSize);
786
Chia-I Wuc14d1562014-10-17 09:49:22 +0800787 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800788 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800789
Chia-I Wuf3a27252014-11-24 15:27:01 +0800790 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
791
792 meta.src.x = offset / 4;
793 meta.dst.x = destOffset / 4;
794 meta.width = dataSize / 4;
795 meta.height = 1;
796 meta.samples = 1;
797
798 /*
799 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to be 16
800 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600801 format = VK_FMT_R32G32B32A32_UINT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800802
803 cmd_meta_set_src_for_writer(cmd, INTEL_CMD_WRITER_STATE,
804 offset + dataSize, format, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800805 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800806
Chia-I Wuc14d1562014-10-17 09:49:22 +0800807 cmd_draw_meta(cmd, &meta);
808}
809
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600810ICD_EXPORT void VKAPI vkCmdFillBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600811 VkCmdBuffer cmdBuffer,
812 VkBuffer destBuffer,
813 VkGpuSize destOffset,
814 VkGpuSize fillSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600815 uint32_t data)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800816{
817 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800818 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800819 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600820 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800821
822 /* must be 4-byte aligned */
823 if ((destOffset | fillSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600824 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800825 return;
826 }
827
828 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800829 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800830
Chia-I Wuf3a27252014-11-24 15:27:01 +0800831 meta.shader_id = INTEL_DEV_META_VS_FILL_MEM;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800832
833 meta.clear_val[0] = data;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800834
Chia-I Wuf3a27252014-11-24 15:27:01 +0800835 meta.dst.x = destOffset / 4;
836 meta.width = fillSize / 4;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800837 meta.height = 1;
838 meta.samples = 1;
839
Chia-I Wuf3a27252014-11-24 15:27:01 +0800840 /*
841 * INTEL_DEV_META_VS_FILL_MEM is untyped but expects the stride to be 16
842 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600843 format = VK_FMT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800844
Chia-I Wu714df452015-01-01 07:55:04 +0800845 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800846
Chia-I Wuc14d1562014-10-17 09:49:22 +0800847 cmd_draw_meta(cmd, &meta);
848}
849
850static void cmd_meta_clear_image(struct intel_cmd *cmd,
851 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600852 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800853 struct intel_cmd_meta *meta,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600854 const VkImageSubresourceRange *range)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800855{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600856 uint32_t mip_levels, array_size;
857 uint32_t i, j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800858
859 if (range->baseMipLevel >= img->mip_levels ||
860 range->baseArraySlice >= img->array_size)
861 return;
862
863 mip_levels = img->mip_levels - range->baseMipLevel;
864 if (mip_levels > range->mipLevels)
865 mip_levels = range->mipLevels;
866
867 array_size = img->array_size - range->baseArraySlice;
868 if (array_size > range->arraySize)
869 array_size = range->arraySize;
870
Chia-I Wuc14d1562014-10-17 09:49:22 +0800871 for (i = 0; i < mip_levels; i++) {
Chia-I Wufaaed472014-10-28 14:17:43 +0800872 meta->dst.lod = range->baseMipLevel + i;
873 meta->dst.layer = range->baseArraySlice;
874
Chia-I Wu73520ac2015-02-19 11:17:45 -0700875 /* TODO INTEL_CMD_META_DS_HIZ_CLEAR requires 8x4 aligned rectangle */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800876 meta->width = u_minify(img->layout.width0, meta->dst.lod);
877 meta->height = u_minify(img->layout.height0, meta->dst.lod);
878
Chia-I Wu73520ac2015-02-19 11:17:45 -0700879 if (meta->ds.op != INTEL_CMD_META_DS_NOP &&
880 !intel_img_can_enable_hiz(img, meta->dst.lod))
881 continue;
882
Chia-I Wuc14d1562014-10-17 09:49:22 +0800883 for (j = 0; j < array_size; j++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600884 if (range->aspect == VK_IMAGE_ASPECT_COLOR) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800885 cmd_meta_set_dst_for_img(cmd, img, format,
886 meta->dst.lod, meta->dst.layer, meta);
887
888 cmd_draw_meta(cmd, meta);
889 } else {
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800890 cmd_meta_set_ds_view(cmd, img, meta->dst.lod,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800891 meta->dst.layer, meta);
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800892 cmd_meta_set_ds_state(cmd, range->aspect,
893 meta->clear_val[1], meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800894
895 cmd_draw_meta(cmd, meta);
896
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800897 intel_ds_view_destroy(meta->ds.view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800898 }
899
900 meta->dst.layer++;
901 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800902 }
903}
904
Chia-I Wu73520ac2015-02-19 11:17:45 -0700905void cmd_meta_ds_op(struct intel_cmd *cmd,
906 enum intel_cmd_meta_ds_op op,
907 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600908 const VkImageSubresourceRange *range)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700909{
910 struct intel_cmd_meta meta;
911
912 if (img->layout.aux != INTEL_LAYOUT_AUX_HIZ)
913 return;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600914 if (range->aspect != VK_IMAGE_ASPECT_DEPTH)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700915 return;
916
917 memset(&meta, 0, sizeof(meta));
918 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
919 meta.samples = img->samples;
920
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600921 meta.ds.aspect = VK_IMAGE_ASPECT_DEPTH;
Chia-I Wu73520ac2015-02-19 11:17:45 -0700922 meta.ds.op = op;
923 meta.ds.optimal = true;
924
925 cmd_meta_clear_image(cmd, img, img->layout.format, &meta, range);
926}
927
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600928ICD_EXPORT void VKAPI vkCmdClearColorImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600929 VkCmdBuffer cmdBuffer,
930 VkImage image,
931 VkImageLayout imageLayout,
932 VkClearColor clearColor,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600933 uint32_t rangeCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600934 const VkImageSubresourceRange* pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800935{
936 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
937 struct intel_img *img = intel_img(image);
938 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600939 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600940 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800941
942 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800943 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800944
945 meta.shader_id = INTEL_DEV_META_FS_CLEAR_COLOR;
946 meta.samples = img->samples;
947
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600948 if (clearColor.useRawValue) {
949 icd_format_get_raw_value(img->layout.format, clearColor.color.rawColor, meta.clear_val);
950 format = cmd_meta_img_raw_format(cmd, img->layout.format);
951 } else {
952 meta.clear_val[0] = u_fui(clearColor.color.floatColor[0]);
953 meta.clear_val[1] = u_fui(clearColor.color.floatColor[1]);
954 meta.clear_val[2] = u_fui(clearColor.color.floatColor[2]);
955 meta.clear_val[3] = u_fui(clearColor.color.floatColor[3]);
956 format = img->layout.format;
957 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800958
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600959 for (i = 0; i < rangeCount; i++) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800960 cmd_meta_clear_image(cmd, img, format, &meta, &pRanges[i]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600961 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800962}
963
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600964ICD_EXPORT void VKAPI vkCmdClearDepthStencil(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600965 VkCmdBuffer cmdBuffer,
966 VkImage image,
967 VkImageLayout imageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600968 float depth,
969 uint32_t stencil,
970 uint32_t rangeCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600971 const VkImageSubresourceRange* pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800972{
973 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
974 struct intel_img *img = intel_img(image);
975 struct intel_cmd_meta meta;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600976 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800977
978 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800979 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800980
981 meta.shader_id = INTEL_DEV_META_FS_CLEAR_DEPTH;
982 meta.samples = img->samples;
983
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800984 meta.clear_val[0] = u_fui(depth);
985 meta.clear_val[1] = stencil;
986
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600987 if (imageLayout == VK_IMAGE_LAYOUT_CLEAR_OPTIMAL ||
988 imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
989 imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) {
Courtney Goeltzenleuchter3b61a592015-03-30 15:07:58 -0600990 meta.ds.optimal = true;
991 }
Chia-I Wu73520ac2015-02-19 11:17:45 -0700992
Chia-I Wuc14d1562014-10-17 09:49:22 +0800993 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600994 const VkImageSubresourceRange *range = &pRanges[i];
Chia-I Wuc14d1562014-10-17 09:49:22 +0800995
Chia-I Wuc14d1562014-10-17 09:49:22 +0800996 cmd_meta_clear_image(cmd, img, img->layout.format,
997 &meta, range);
998 }
999}
1000
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001001ICD_EXPORT void VKAPI vkCmdResolveImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001002 VkCmdBuffer cmdBuffer,
1003 VkImage srcImage,
1004 VkImageLayout srcImageLayout,
1005 VkImage destImage,
1006 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001007 uint32_t rectCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001008 const VkImageResolve* pRects)
Chia-I Wuc14d1562014-10-17 09:49:22 +08001009{
1010 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1011 struct intel_img *src = intel_img(srcImage);
1012 struct intel_img *dst = intel_img(destImage);
1013 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001014 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001015 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001016
1017 if (src->samples <= 1 || dst->samples > 1 ||
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -07001018 src->layout.format != dst->layout.format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001019 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001020 return;
1021 }
1022
1023 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +08001024 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001025
1026 switch (src->samples) {
1027 case 2:
1028 default:
1029 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_2X;
1030 break;
1031 case 4:
1032 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_4X;
1033 break;
1034 case 8:
1035 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_8X;
1036 break;
1037 case 16:
1038 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_16X;
1039 break;
1040 }
1041
1042 meta.samples = 1;
1043
1044 format = cmd_meta_img_raw_format(cmd, src->layout.format);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001045 cmd_meta_set_src_for_img(cmd, src, format, VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001046
1047 for (i = 0; i < rectCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001048 const VkImageResolve *rect = &pRects[i];
Chia-I Wuc14d1562014-10-17 09:49:22 +08001049
1050 meta.src.lod = rect->srcSubresource.mipLevel;
1051 meta.src.layer = rect->srcSubresource.arraySlice;
1052 meta.src.x = rect->srcOffset.x;
1053 meta.src.y = rect->srcOffset.y;
1054
1055 meta.dst.lod = rect->destSubresource.mipLevel;
1056 meta.dst.layer = rect->destSubresource.arraySlice;
1057 meta.dst.x = rect->destOffset.x;
1058 meta.dst.y = rect->destOffset.y;
1059
1060 meta.width = rect->extent.width;
1061 meta.height = rect->extent.height;
1062
1063 cmd_meta_set_dst_for_img(cmd, dst, format,
1064 meta.dst.lod, meta.dst.layer, &meta);
1065
1066 cmd_draw_meta(cmd, &meta);
1067 }
1068}