blob: 4db330857266267baf07d87dc841c9db796115ac [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,
Tony Barbour8205d902015-04-16 15:59:00 -060036 VkDeviceSize range,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060037 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;
Tony Barbour8205d902015-04-16 15:59:00 -060041 VkDeviceSize 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;
Tony Barbour8205d902015-04-16 15:59:00 -060046 info.viewType = VK_BUFFER_VIEW_TYPE_FORMATTED;
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
Mark Lobodzinskic4e83e32015-07-02 09:53:03 -0600131 if (img->array_size == 1) {
132 switch (img->type) {
133 case VK_IMAGE_TYPE_1D:
134 info.viewType = VK_IMAGE_VIEW_TYPE_1D;
135 break;
136 case VK_IMAGE_TYPE_2D:
137 info.viewType = VK_IMAGE_VIEW_TYPE_2D;
138 break;
139 default:
140 break;
141 }
142 } else {
143 switch (img->type) {
144 case VK_IMAGE_TYPE_1D:
145 info.viewType = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
146 break;
147 case VK_IMAGE_TYPE_2D:
148 info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
149 break;
150 case VK_IMAGE_TYPE_3D:
151 info.viewType = VK_IMAGE_VIEW_TYPE_3D;
152 break;
153 default:
154 break;
155 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800156 }
157
158 info.format = format;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600159 info.channels.r = VK_CHANNEL_SWIZZLE_R;
160 info.channels.g = VK_CHANNEL_SWIZZLE_G;
161 info.channels.b = VK_CHANNEL_SWIZZLE_B;
162 info.channels.a = VK_CHANNEL_SWIZZLE_A;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800163 info.subresourceRange.aspect = aspect;
164 info.subresourceRange.baseMipLevel = 0;
Courtney Goeltzenleuchterdac96cf2015-06-04 11:35:43 -0600165 info.subresourceRange.mipLevels = VK_LAST_MIP_LEVEL;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800166 info.subresourceRange.baseArraySlice = 0;
Courtney Goeltzenleuchterdac96cf2015-06-04 11:35:43 -0600167 info.subresourceRange.arraySize = VK_LAST_ARRAY_SLICE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800168
169 ret = intel_img_view_create(cmd->dev, &info, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600170 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700171 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800172 return;
173 }
174
175 meta->src.valid = true;
176
177 memcpy(meta->src.surface, view->cmd,
178 sizeof(view->cmd[0]) * view->cmd_len);
179 meta->src.surface_len = view->cmd_len;
180
181 meta->src.reloc_target = (intptr_t) img->obj.mem->bo;
182 meta->src.reloc_offset = 0;
183 meta->src.reloc_flags = 0;
184
185 intel_img_view_destroy(view);
186}
187
Chia-I Wu83084ba2014-12-04 12:49:52 +0800188static void cmd_meta_adjust_compressed_dst(struct intel_cmd *cmd,
189 const struct intel_img *img,
190 struct intel_cmd_meta *meta)
191{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600192 int32_t w, h, layer;
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800193 unsigned x_offset, y_offset;
Chia-I Wu83084ba2014-12-04 12:49:52 +0800194
195 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
196 w = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_WIDTH);
197 h = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800198 layer = GEN_EXTRACT(meta->dst.surface[4],
199 GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800200 } else {
201 w = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_WIDTH);
202 h = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800203 layer = GEN_EXTRACT(meta->dst.surface[4],
204 GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800205 }
206
207 /* note that the width/height fields have the real values minus 1 */
208 w = (w + img->layout.block_width) / img->layout.block_width - 1;
209 h = (h + img->layout.block_height) / img->layout.block_height - 1;
210
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800211 /* adjust width and height */
Chia-I Wu83084ba2014-12-04 12:49:52 +0800212 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800213 meta->dst.surface[2] &= ~(GEN7_SURFACE_DW2_WIDTH__MASK |
214 GEN7_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800215 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN7_SURFACE_DW2_WIDTH) |
216 GEN_SHIFT32(h, GEN7_SURFACE_DW2_HEIGHT);
217 } else {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800218 meta->dst.surface[2] &= ~(GEN6_SURFACE_DW2_WIDTH__MASK |
219 GEN6_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800220 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN6_SURFACE_DW2_WIDTH) |
221 GEN_SHIFT32(h, GEN6_SURFACE_DW2_HEIGHT);
222 }
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800223
224 if (!layer)
225 return;
226
227 meta->dst.reloc_offset = intel_layout_get_slice_tile_offset(&img->layout,
228 0, layer, &x_offset, &y_offset);
229
230 /*
231 * The lower 2 bits (or 1 bit for Y) are missing. This may be a problem
232 * for small images (16x16 or smaller). We will need to adjust the
233 * drawing rectangle instead.
234 */
235 x_offset = (x_offset / img->layout.block_width) >> 2;
236 y_offset = (y_offset / img->layout.block_height) >> 1;
237
238 /* adjust min array element and X/Y offsets */
239 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
240 meta->dst.surface[4] &= ~GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
241 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN7_SURFACE_DW5_X_OFFSET) |
242 GEN_SHIFT32(y_offset, GEN7_SURFACE_DW5_Y_OFFSET);
243 } else {
244 meta->dst.surface[4] &= ~GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
245 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN6_SURFACE_DW5_X_OFFSET) |
246 GEN_SHIFT32(y_offset, GEN6_SURFACE_DW5_Y_OFFSET);
247 }
Chia-I Wu83084ba2014-12-04 12:49:52 +0800248}
249
Chia-I Wuc14d1562014-10-17 09:49:22 +0800250static void cmd_meta_set_dst_for_img(struct intel_cmd *cmd,
251 const struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600252 VkFormat format,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600253 uint32_t lod, uint32_t layer,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800254 struct intel_cmd_meta *meta)
255{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600256 VkColorAttachmentViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800257 struct intel_rt_view *rt;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600258 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800259
260 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600261 info.sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600262 info.image = (VkImage) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800263 info.format = format;
264 info.mipLevel = lod;
265 info.baseArraySlice = layer;
266 info.arraySize = 1;
267
268 ret = intel_rt_view_create(cmd->dev, &info, &rt);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600269 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700270 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800271 return;
272 }
273
274 meta->dst.valid = true;
275
276 memcpy(meta->dst.surface, rt->cmd, sizeof(rt->cmd[0]) * rt->cmd_len);
277 meta->dst.surface_len = rt->cmd_len;
278
279 meta->dst.reloc_target = (intptr_t) img->obj.mem->bo;
280 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800281 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800282
Chia-I Wu83084ba2014-12-04 12:49:52 +0800283 if (icd_format_is_compressed(img->layout.format))
284 cmd_meta_adjust_compressed_dst(cmd, img, meta);
285
Chia-I Wuc14d1562014-10-17 09:49:22 +0800286 intel_rt_view_destroy(rt);
287}
288
289static void cmd_meta_set_src_for_writer(struct intel_cmd *cmd,
290 enum intel_cmd_writer_type writer,
Tony Barbour8205d902015-04-16 15:59:00 -0600291 VkDeviceSize size,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600292 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800293 struct intel_cmd_meta *meta)
294{
Chia-I Wu714df452015-01-01 07:55:04 +0800295 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600296 VkResult res;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800297
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600298 res = cmd_meta_create_buf_view(cmd, (VkBuffer) VK_NULL_HANDLE,
Chia-I Wu714df452015-01-01 07:55:04 +0800299 size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600300 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700301 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800302 return;
303 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800304
305 meta->src.valid = true;
306
Chia-I Wu714df452015-01-01 07:55:04 +0800307 memcpy(meta->src.surface, view->cmd,
308 sizeof(view->cmd[0]) * view->cmd_len);
309 meta->src.surface_len = view->cmd_len;
310
311 intel_buf_view_destroy(view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800312
313 meta->src.reloc_target = (intptr_t) writer;
314 meta->src.reloc_offset = 0;
315 meta->src.reloc_flags = INTEL_CMD_RELOC_TARGET_IS_WRITER;
316}
317
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800318static void cmd_meta_set_ds_view(struct intel_cmd *cmd,
319 const struct intel_img *img,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600320 uint32_t lod, uint32_t layer,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800321 struct intel_cmd_meta *meta)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800322{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600323 VkDepthStencilViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800324 struct intel_ds_view *ds;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600325 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800326
327 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600328 info.sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600329 info.image = (VkImage) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800330 info.mipLevel = lod;
331 info.baseArraySlice = layer;
332 info.arraySize = 1;
333
334 ret = intel_ds_view_create(cmd->dev, &info, &ds);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600335 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700336 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800337 return;
338 }
339
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800340 meta->ds.view = ds;
341}
342
343static void cmd_meta_set_ds_state(struct intel_cmd *cmd,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600344 VkImageAspect aspect,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600345 uint32_t stencil_ref,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800346 struct intel_cmd_meta *meta)
347{
Tony Barbourfa6cac72015-01-16 14:27:35 -0700348 meta->ds.stencil_ref = stencil_ref;
349 meta->ds.aspect = aspect;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800350}
351
352static enum intel_dev_meta_shader get_shader_id(const struct intel_dev *dev,
353 const struct intel_img *img,
354 bool copy_array)
355{
356 enum intel_dev_meta_shader shader_id;
357
358 switch (img->type) {
Tony Barbour8205d902015-04-16 15:59:00 -0600359 case VK_IMAGE_TYPE_1D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800360 shader_id = (copy_array) ?
361 INTEL_DEV_META_FS_COPY_1D_ARRAY : INTEL_DEV_META_FS_COPY_1D;
362 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600363 case VK_IMAGE_TYPE_2D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800364 shader_id = (img->samples > 1) ? INTEL_DEV_META_FS_COPY_2D_MS :
365 (copy_array) ? INTEL_DEV_META_FS_COPY_2D_ARRAY :
366 INTEL_DEV_META_FS_COPY_2D;
367 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600368 case VK_IMAGE_TYPE_3D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800369 default:
370 shader_id = INTEL_DEV_META_FS_COPY_2D_ARRAY;
371 break;
372 }
373
374 return shader_id;
375}
376
Chia-I Wuf3a27252014-11-24 15:27:01 +0800377static bool cmd_meta_mem_dword_aligned(const struct intel_cmd *cmd,
Tony Barbour8205d902015-04-16 15:59:00 -0600378 VkDeviceSize src_offset,
379 VkDeviceSize dst_offset,
380 VkDeviceSize size)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800381{
Chia-I Wuf3a27252014-11-24 15:27:01 +0800382 return !((src_offset | dst_offset | size) & 0x3);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800383}
384
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600385static VkFormat cmd_meta_img_raw_format(const struct intel_cmd *cmd,
386 VkFormat format)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800387{
Chia-I Wuffdde352014-12-20 15:12:16 +0800388 switch (icd_format_get_size(format)) {
389 case 1:
Tony Barbour8205d902015-04-16 15:59:00 -0600390 format = VK_FORMAT_R8_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800391 break;
392 case 2:
Tony Barbour8205d902015-04-16 15:59:00 -0600393 format = VK_FORMAT_R16_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800394 break;
395 case 4:
Tony Barbour8205d902015-04-16 15:59:00 -0600396 format = VK_FORMAT_R32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800397 break;
398 case 8:
Tony Barbour8205d902015-04-16 15:59:00 -0600399 format = VK_FORMAT_R32G32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800400 break;
401 case 16:
Tony Barbour8205d902015-04-16 15:59:00 -0600402 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800403 break;
404 default:
405 assert(!"unsupported image format for raw blit op");
Tony Barbour8205d902015-04-16 15:59:00 -0600406 format = VK_FORMAT_UNDEFINED;
Chia-I Wuffdde352014-12-20 15:12:16 +0800407 break;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800408 }
409
410 return format;
411}
412
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600413ICD_EXPORT void VKAPI vkCmdCopyBuffer(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600414 VkCmdBuffer cmdBuffer,
415 VkBuffer srcBuffer,
416 VkBuffer destBuffer,
417 uint32_t regionCount,
418 const VkBufferCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800419{
420 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800421 struct intel_buf *src = intel_buf(srcBuffer);
422 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800423 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600424 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600425 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800426
427 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800428 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800429
Chia-I Wuc14d1562014-10-17 09:49:22 +0800430 meta.height = 1;
431 meta.samples = 1;
432
Tony Barbour8205d902015-04-16 15:59:00 -0600433 format = VK_FORMAT_UNDEFINED;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800434
435 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600436 const VkBufferCopy *region = &pRegions[i];
437 VkFormat fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800438
Chia-I Wuf3a27252014-11-24 15:27:01 +0800439 meta.src.x = region->srcOffset;
440 meta.dst.x = region->destOffset;
441 meta.width = region->copySize;
442
443 if (cmd_meta_mem_dword_aligned(cmd, region->srcOffset,
444 region->destOffset, region->copySize)) {
445 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
446 meta.src.x /= 4;
447 meta.dst.x /= 4;
448 meta.width /= 4;
449
450 /*
451 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to
452 * be 16
453 */
Tony Barbour8205d902015-04-16 15:59:00 -0600454 fmt = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800455 } else {
456 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600457 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
458 &cmd->obj.base, 0, 0,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600459 "unaligned vkCmdCopyBuffer unsupported");
460 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800461 continue;
462 }
463
464 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM_UNALIGNED;
465
466 /*
467 * INTEL_DEV_META_VS_COPY_MEM_UNALIGNED is untyped but expects the
468 * stride to be 4
469 */
Tony Barbour8205d902015-04-16 15:59:00 -0600470 fmt = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800471 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800472
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700473 if (format != fmt) {
474 format = fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800475
Chia-I Wu714df452015-01-01 07:55:04 +0800476 cmd_meta_set_src_for_buf(cmd, src, format, &meta);
477 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800478 }
479
Chia-I Wuc14d1562014-10-17 09:49:22 +0800480 cmd_draw_meta(cmd, &meta);
481 }
482}
483
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600484ICD_EXPORT void VKAPI vkCmdCopyImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600485 VkCmdBuffer cmdBuffer,
486 VkImage srcImage,
487 VkImageLayout srcImageLayout,
488 VkImage destImage,
489 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600490 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600491 const VkImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800492{
493 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
494 struct intel_img *src = intel_img(srcImage);
495 struct intel_img *dst = intel_img(destImage);
496 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600497 VkFormat raw_format;
Cody Northrop30a2b462015-02-10 09:28:30 -0700498 bool raw_copy = false;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600499 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800500
501 if (src->type != dst->type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600502 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800503 return;
504 }
505
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700506 if (src->layout.format == dst->layout.format) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800507 raw_copy = true;
508 raw_format = cmd_meta_img_raw_format(cmd, src->layout.format);
509 } else if (icd_format_is_compressed(src->layout.format) ||
510 icd_format_is_compressed(dst->layout.format)) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600511 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800512 return;
513 }
514
515 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800516 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800517
518 cmd_meta_set_src_for_img(cmd, src,
519 (raw_copy) ? raw_format : src->layout.format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600520 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800521
522 meta.samples = dst->samples;
523
524 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600525 const VkImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600526 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800527
528 meta.shader_id = get_shader_id(cmd->dev, src,
529 (region->extent.depth > 1));
530
531 meta.src.lod = region->srcSubresource.mipLevel;
532 meta.src.layer = region->srcSubresource.arraySlice +
533 region->srcOffset.z;
534 meta.src.x = region->srcOffset.x;
535 meta.src.y = region->srcOffset.y;
536
537 meta.dst.lod = region->destSubresource.mipLevel;
538 meta.dst.layer = region->destSubresource.arraySlice +
539 region->destOffset.z;
540 meta.dst.x = region->destOffset.x;
541 meta.dst.y = region->destOffset.y;
542
543 meta.width = region->extent.width;
544 meta.height = region->extent.height;
545
Chia-I Wueccc7682015-03-24 14:15:30 +0800546 if (raw_copy) {
547 const uint32_t block_width =
548 icd_format_get_block_width(raw_format);
549
550 meta.src.x /= block_width;
551 meta.src.y /= block_width;
552 meta.dst.x /= block_width;
553 meta.dst.y /= block_width;
554 meta.width /= block_width;
555 meta.height /= block_width;
556 }
557
Chia-I Wuc14d1562014-10-17 09:49:22 +0800558 for (j = 0; j < region->extent.depth; j++) {
559 cmd_meta_set_dst_for_img(cmd, dst,
560 (raw_copy) ? raw_format : dst->layout.format,
561 meta.dst.lod, meta.dst.layer, &meta);
562
563 cmd_draw_meta(cmd, &meta);
564
565 meta.src.layer++;
566 meta.dst.layer++;
567 }
568 }
569}
570
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600571ICD_EXPORT void VKAPI vkCmdBlitImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600572 VkCmdBuffer cmdBuffer,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500573 VkImage srcImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600574 VkImageLayout srcImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500575 VkImage destImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600576 VkImageLayout destImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500577 uint32_t regionCount,
578 const VkImageBlit* pRegions,
579 VkTexFilter filter)
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600580{
581 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
582
583 /*
584 * TODO: Implement actual blit function.
585 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600586 cmd_fail(cmd, VK_ERROR_UNAVAILABLE);
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600587}
588
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600589ICD_EXPORT void VKAPI vkCmdCopyBufferToImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600590 VkCmdBuffer cmdBuffer,
591 VkBuffer srcBuffer,
592 VkImage destImage,
593 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600594 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600595 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800596{
597 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800598 struct intel_buf *buf = intel_buf(srcBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800599 struct intel_img *img = intel_img(destImage);
600 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600601 VkFormat format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800602 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800603
604 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800605 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800606
607 meta.shader_id = INTEL_DEV_META_FS_COPY_MEM_TO_IMG;
608 meta.samples = img->samples;
609
610 format = cmd_meta_img_raw_format(cmd, img->layout.format);
Mike Stroyanbc4e2ed2015-03-24 15:10:24 -0600611 block_width = icd_format_get_block_width(img->layout.format);
Chia-I Wu714df452015-01-01 07:55:04 +0800612 cmd_meta_set_src_for_buf(cmd, buf, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800613
614 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600615 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600616 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800617
Chia-I Wu714df452015-01-01 07:55:04 +0800618 meta.src.x = region->bufferOffset / icd_format_get_size(format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800619
620 meta.dst.lod = region->imageSubresource.mipLevel;
621 meta.dst.layer = region->imageSubresource.arraySlice +
622 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800623 meta.dst.x = region->imageOffset.x / block_width;
624 meta.dst.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800625
Chia-I Wueccc7682015-03-24 14:15:30 +0800626 meta.width = region->imageExtent.width / block_width;
627 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800628
629 for (j = 0; j < region->imageExtent.depth; j++) {
630 cmd_meta_set_dst_for_img(cmd, img, format,
631 meta.dst.lod, meta.dst.layer, &meta);
632
633 cmd_draw_meta(cmd, &meta);
634
635 meta.src.x += meta.width * meta.height;
636 meta.dst.layer++;
637 }
638 }
639}
640
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600641ICD_EXPORT void VKAPI vkCmdCopyImageToBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600642 VkCmdBuffer cmdBuffer,
643 VkImage srcImage,
644 VkImageLayout srcImageLayout,
645 VkBuffer destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600646 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600647 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800648{
649 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
650 struct intel_img *img = intel_img(srcImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800651 struct intel_buf *buf = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800652 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600653 VkFormat img_format, buf_format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800654 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800655
656 memset(&meta, 0, sizeof(meta));
Chia-I Wua44b6482014-12-20 14:58:01 +0800657 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800658
Chia-I Wua44b6482014-12-20 14:58:01 +0800659 img_format = cmd_meta_img_raw_format(cmd, img->layout.format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800660 block_width = icd_format_get_block_width(img_format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800661
Chia-I Wu714df452015-01-01 07:55:04 +0800662 /* buf_format is ignored by hw, but we derive stride from it */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700663 switch (img_format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600664 case VK_FORMAT_R8_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800665 meta.shader_id = INTEL_DEV_META_VS_COPY_R8_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600666 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800667 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600668 case VK_FORMAT_R16_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800669 meta.shader_id = INTEL_DEV_META_VS_COPY_R16_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600670 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800671 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600672 case VK_FORMAT_R32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800673 meta.shader_id = INTEL_DEV_META_VS_COPY_R32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600674 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800675 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600676 case VK_FORMAT_R32G32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800677 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600678 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800679 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600680 case VK_FORMAT_R32G32B32A32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800681 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32B32A32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600682 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800683 break;
684 default:
Tony Barbour8205d902015-04-16 15:59:00 -0600685 img_format = VK_FORMAT_UNDEFINED;
686 buf_format = VK_FORMAT_UNDEFINED;
Chia-I Wua44b6482014-12-20 14:58:01 +0800687 break;
688 }
689
Tony Barbour8205d902015-04-16 15:59:00 -0600690 if (img_format == VK_FORMAT_UNDEFINED ||
Chia-I Wua44b6482014-12-20 14:58:01 +0800691 (cmd_gen(cmd) == INTEL_GEN(6) &&
692 icd_format_get_size(img_format) < 4)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600693 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
694 &cmd->obj.base, 0, 0,
695 "vkCmdCopyImageToBuffer with bpp %d unsupported",
696 icd_format_get_size(img->layout.format));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600697 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wua44b6482014-12-20 14:58:01 +0800698 return;
699 }
700
701 cmd_meta_set_src_for_img(cmd, img, img_format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600702 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800703 cmd_meta_set_dst_for_buf(cmd, buf, buf_format, &meta);
Chia-I Wua44b6482014-12-20 14:58:01 +0800704
Chia-I Wuc14d1562014-10-17 09:49:22 +0800705 meta.samples = 1;
706
707 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600708 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600709 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800710
Chia-I Wuc14d1562014-10-17 09:49:22 +0800711 meta.src.lod = region->imageSubresource.mipLevel;
712 meta.src.layer = region->imageSubresource.arraySlice +
713 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800714 meta.src.x = region->imageOffset.x / block_width;
715 meta.src.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800716
Chia-I Wu714df452015-01-01 07:55:04 +0800717 meta.dst.x = region->bufferOffset / icd_format_get_size(img_format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800718 meta.width = region->imageExtent.width / block_width;
719 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800720
721 for (j = 0; j < region->imageExtent.depth; j++) {
722 cmd_draw_meta(cmd, &meta);
723
724 meta.src.layer++;
Chia-I Wua44b6482014-12-20 14:58:01 +0800725 meta.dst.x += meta.width * meta.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800726 }
727 }
728}
729
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600730ICD_EXPORT void VKAPI vkCmdUpdateBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600731 VkCmdBuffer cmdBuffer,
732 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600733 VkDeviceSize destOffset,
734 VkDeviceSize dataSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600735 const uint32_t* pData)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800736{
737 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800738 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800739 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600740 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800741 uint32_t *ptr;
742 uint32_t offset;
743
Chia-I Wuf3a27252014-11-24 15:27:01 +0800744 /* must be 4-byte aligned */
745 if ((destOffset | dataSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600746 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800747 return;
748 }
749
Chia-I Wuc14d1562014-10-17 09:49:22 +0800750 /* write to dynamic state writer first */
751 offset = cmd_state_pointer(cmd, INTEL_CMD_ITEM_BLOB, 32,
752 (dataSize + 3) / 4, &ptr);
753 memcpy(ptr, pData, dataSize);
754
Chia-I Wuc14d1562014-10-17 09:49:22 +0800755 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800756 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800757
Chia-I Wuf3a27252014-11-24 15:27:01 +0800758 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
759
760 meta.src.x = offset / 4;
761 meta.dst.x = destOffset / 4;
762 meta.width = dataSize / 4;
763 meta.height = 1;
764 meta.samples = 1;
765
766 /*
767 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to be 16
768 */
Tony Barbour8205d902015-04-16 15:59:00 -0600769 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800770
771 cmd_meta_set_src_for_writer(cmd, INTEL_CMD_WRITER_STATE,
772 offset + dataSize, format, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800773 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800774
Chia-I Wuc14d1562014-10-17 09:49:22 +0800775 cmd_draw_meta(cmd, &meta);
776}
777
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600778ICD_EXPORT void VKAPI vkCmdFillBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600779 VkCmdBuffer cmdBuffer,
780 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600781 VkDeviceSize destOffset,
782 VkDeviceSize fillSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600783 uint32_t data)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800784{
785 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800786 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800787 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600788 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800789
790 /* must be 4-byte aligned */
791 if ((destOffset | fillSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600792 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800793 return;
794 }
795
796 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800797 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800798
Chia-I Wuf3a27252014-11-24 15:27:01 +0800799 meta.shader_id = INTEL_DEV_META_VS_FILL_MEM;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800800
801 meta.clear_val[0] = data;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800802
Chia-I Wuf3a27252014-11-24 15:27:01 +0800803 meta.dst.x = destOffset / 4;
804 meta.width = fillSize / 4;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800805 meta.height = 1;
806 meta.samples = 1;
807
Chia-I Wuf3a27252014-11-24 15:27:01 +0800808 /*
809 * INTEL_DEV_META_VS_FILL_MEM is untyped but expects the stride to be 16
810 */
Tony Barbour8205d902015-04-16 15:59:00 -0600811 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800812
Chia-I Wu714df452015-01-01 07:55:04 +0800813 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800814
Chia-I Wuc14d1562014-10-17 09:49:22 +0800815 cmd_draw_meta(cmd, &meta);
816}
817
818static void cmd_meta_clear_image(struct intel_cmd *cmd,
819 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600820 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800821 struct intel_cmd_meta *meta,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600822 const VkImageSubresourceRange *range)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800823{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600824 uint32_t mip_levels, array_size;
825 uint32_t i, j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800826
827 if (range->baseMipLevel >= img->mip_levels ||
828 range->baseArraySlice >= img->array_size)
829 return;
830
831 mip_levels = img->mip_levels - range->baseMipLevel;
832 if (mip_levels > range->mipLevels)
833 mip_levels = range->mipLevels;
834
835 array_size = img->array_size - range->baseArraySlice;
836 if (array_size > range->arraySize)
837 array_size = range->arraySize;
838
Chia-I Wuc14d1562014-10-17 09:49:22 +0800839 for (i = 0; i < mip_levels; i++) {
Chia-I Wufaaed472014-10-28 14:17:43 +0800840 meta->dst.lod = range->baseMipLevel + i;
841 meta->dst.layer = range->baseArraySlice;
842
Chia-I Wu73520ac2015-02-19 11:17:45 -0700843 /* TODO INTEL_CMD_META_DS_HIZ_CLEAR requires 8x4 aligned rectangle */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800844 meta->width = u_minify(img->layout.width0, meta->dst.lod);
845 meta->height = u_minify(img->layout.height0, meta->dst.lod);
846
Chia-I Wu73520ac2015-02-19 11:17:45 -0700847 if (meta->ds.op != INTEL_CMD_META_DS_NOP &&
848 !intel_img_can_enable_hiz(img, meta->dst.lod))
849 continue;
850
Chia-I Wuc14d1562014-10-17 09:49:22 +0800851 for (j = 0; j < array_size; j++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600852 if (range->aspect == VK_IMAGE_ASPECT_COLOR) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800853 cmd_meta_set_dst_for_img(cmd, img, format,
854 meta->dst.lod, meta->dst.layer, meta);
855
856 cmd_draw_meta(cmd, meta);
857 } else {
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800858 cmd_meta_set_ds_view(cmd, img, meta->dst.lod,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800859 meta->dst.layer, meta);
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800860 cmd_meta_set_ds_state(cmd, range->aspect,
861 meta->clear_val[1], meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800862
863 cmd_draw_meta(cmd, meta);
864
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800865 intel_ds_view_destroy(meta->ds.view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800866 }
867
868 meta->dst.layer++;
869 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800870 }
871}
872
Chia-I Wu73520ac2015-02-19 11:17:45 -0700873void cmd_meta_ds_op(struct intel_cmd *cmd,
874 enum intel_cmd_meta_ds_op op,
875 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600876 const VkImageSubresourceRange *range)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700877{
878 struct intel_cmd_meta meta;
879
880 if (img->layout.aux != INTEL_LAYOUT_AUX_HIZ)
881 return;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600882 if (range->aspect != VK_IMAGE_ASPECT_DEPTH)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700883 return;
884
885 memset(&meta, 0, sizeof(meta));
886 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
887 meta.samples = img->samples;
888
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600889 meta.ds.aspect = VK_IMAGE_ASPECT_DEPTH;
Chia-I Wu73520ac2015-02-19 11:17:45 -0700890 meta.ds.op = op;
891 meta.ds.optimal = true;
892
893 cmd_meta_clear_image(cmd, img, img->layout.format, &meta, range);
894}
895
Chris Forbesfff9bf42015-06-15 15:26:19 +1200896void cmd_meta_clear_color_image(
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600897 VkCmdBuffer cmdBuffer,
898 VkImage image,
899 VkImageLayout imageLayout,
900 const VkClearColor *pClearColor,
901 uint32_t rangeCount,
902 const VkImageSubresourceRange *pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800903{
904 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
905 struct intel_img *img = intel_img(image);
906 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600907 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600908 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800909
910 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800911 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800912
913 meta.shader_id = INTEL_DEV_META_FS_CLEAR_COLOR;
914 meta.samples = img->samples;
915
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600916 if (pClearColor->useRawValue) {
917 icd_format_get_raw_value(img->layout.format, pClearColor->color.rawColor, meta.clear_val);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600918 format = cmd_meta_img_raw_format(cmd, img->layout.format);
919 } else {
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600920 meta.clear_val[0] = u_fui(pClearColor->color.floatColor[0]);
921 meta.clear_val[1] = u_fui(pClearColor->color.floatColor[1]);
922 meta.clear_val[2] = u_fui(pClearColor->color.floatColor[2]);
923 meta.clear_val[3] = u_fui(pClearColor->color.floatColor[3]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600924 format = img->layout.format;
925 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800926
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600927 for (i = 0; i < rangeCount; i++) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800928 cmd_meta_clear_image(cmd, img, format, &meta, &pRanges[i]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600929 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800930}
931
Chris Forbesfff9bf42015-06-15 15:26:19 +1200932ICD_EXPORT void VKAPI vkCmdClearColorImage(
933 VkCmdBuffer cmdBuffer,
934 VkImage image,
935 VkImageLayout imageLayout,
936 const VkClearColor *pClearColor,
937 uint32_t rangeCount,
938 const VkImageSubresourceRange *pRanges)
939{
940 cmd_meta_clear_color_image(cmdBuffer, image, imageLayout, pClearColor, rangeCount, pRanges);
941}
942
Chris Forbes4cf9d102015-06-22 18:46:05 +1200943void cmd_meta_clear_depth_stencil_image(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600944 VkCmdBuffer cmdBuffer,
945 VkImage image,
946 VkImageLayout imageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600947 float depth,
948 uint32_t stencil,
949 uint32_t rangeCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600950 const VkImageSubresourceRange* pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800951{
952 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
953 struct intel_img *img = intel_img(image);
954 struct intel_cmd_meta meta;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600955 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800956
957 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800958 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800959
960 meta.shader_id = INTEL_DEV_META_FS_CLEAR_DEPTH;
961 meta.samples = img->samples;
962
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800963 meta.clear_val[0] = u_fui(depth);
964 meta.clear_val[1] = stencil;
965
Mark Lobodzinski4e97c452015-07-01 15:18:26 -0600966 if (imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600967 imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) {
Courtney Goeltzenleuchter3b61a592015-03-30 15:07:58 -0600968 meta.ds.optimal = true;
969 }
Chia-I Wu73520ac2015-02-19 11:17:45 -0700970
Chia-I Wuc14d1562014-10-17 09:49:22 +0800971 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600972 const VkImageSubresourceRange *range = &pRanges[i];
Chia-I Wuc14d1562014-10-17 09:49:22 +0800973
Chia-I Wuc14d1562014-10-17 09:49:22 +0800974 cmd_meta_clear_image(cmd, img, img->layout.format,
975 &meta, range);
976 }
977}
978
Chris Forbes4cf9d102015-06-22 18:46:05 +1200979ICD_EXPORT void VKAPI vkCmdClearDepthStencilImage(
980 VkCmdBuffer cmdBuffer,
981 VkImage image,
982 VkImageLayout imageLayout,
983 float depth,
984 uint32_t stencil,
985 uint32_t rangeCount,
986 const VkImageSubresourceRange* pRanges)
987{
988 cmd_meta_clear_depth_stencil_image(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
989}
990
Chris Forbes2951d7d2015-06-22 17:21:59 +1200991ICD_EXPORT void VKAPI vkCmdClearColorAttachment(
992 VkCmdBuffer cmdBuffer,
993 uint32_t colorAttachment,
994 VkImageLayout imageLayout,
995 const VkClearColor *pColor,
996 uint32_t rectCount,
997 const VkRect3D *pRects)
998{
999 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1000 assert(!"CmdClearColorAttachment not implemented");
1001 cmd_fail(cmd, VK_ERROR_UNKNOWN);
1002}
1003
1004ICD_EXPORT void VKAPI vkCmdClearDepthStencilAttachment(
1005 VkCmdBuffer cmdBuffer,
1006 VkImageAspectFlags imageAspectMask,
1007 VkImageLayout imageLayout,
1008 float depth,
1009 uint32_t stencil,
1010 uint32_t rectCount,
1011 const VkRect3D *pRects)
1012{
1013 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1014 assert(!"CmdClearDepthStencilAttachment not implemented");
1015 cmd_fail(cmd, VK_ERROR_UNKNOWN);
1016}
1017
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001018ICD_EXPORT void VKAPI vkCmdResolveImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001019 VkCmdBuffer cmdBuffer,
1020 VkImage srcImage,
1021 VkImageLayout srcImageLayout,
1022 VkImage destImage,
1023 VkImageLayout destImageLayout,
Tony Barbour11f74372015-04-13 15:02:52 -06001024 uint32_t regionCount,
1025 const VkImageResolve* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +08001026{
1027 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1028 struct intel_img *src = intel_img(srcImage);
1029 struct intel_img *dst = intel_img(destImage);
1030 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001031 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001032 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001033
1034 if (src->samples <= 1 || dst->samples > 1 ||
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -07001035 src->layout.format != dst->layout.format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001036 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001037 return;
1038 }
1039
1040 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +08001041 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001042
1043 switch (src->samples) {
1044 case 2:
1045 default:
1046 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_2X;
1047 break;
1048 case 4:
1049 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_4X;
1050 break;
1051 case 8:
1052 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_8X;
1053 break;
1054 case 16:
1055 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_16X;
1056 break;
1057 }
1058
1059 meta.samples = 1;
1060
1061 format = cmd_meta_img_raw_format(cmd, src->layout.format);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001062 cmd_meta_set_src_for_img(cmd, src, format, VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001063
Tony Barbour11f74372015-04-13 15:02:52 -06001064 for (i = 0; i < regionCount; i++) {
1065 const VkImageResolve *region = &pRegions[i];
Tony Barboure9f99942015-04-13 13:11:12 -06001066 int arraySlice;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001067
Tony Barbour11f74372015-04-13 15:02:52 -06001068 for(arraySlice = 0; arraySlice < region->extent.depth; arraySlice++) {
1069 meta.src.lod = region->srcSubresource.mipLevel;
1070 meta.src.layer = region->srcSubresource.arraySlice + arraySlice;
1071 meta.src.x = region->srcOffset.x;
1072 meta.src.y = region->srcOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001073
Tony Barbour11f74372015-04-13 15:02:52 -06001074 meta.dst.lod = region->destSubresource.mipLevel;
1075 meta.dst.layer = region->destSubresource.arraySlice + arraySlice;
1076 meta.dst.x = region->destOffset.x;
1077 meta.dst.y = region->destOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001078
Tony Barbour11f74372015-04-13 15:02:52 -06001079 meta.width = region->extent.width;
1080 meta.height = region->extent.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001081
Tony Barboure9f99942015-04-13 13:11:12 -06001082 cmd_meta_set_dst_for_img(cmd, dst, format,
1083 meta.dst.lod, meta.dst.layer, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001084
Tony Barboure9f99942015-04-13 13:11:12 -06001085 cmd_draw_meta(cmd, &meta);
1086 }
Chia-I Wuc14d1562014-10-17 09:49:22 +08001087 }
1088}