blob: 8d6e439c41c8bfeeed8e2216cc217fdd58b13a10 [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"
Chris Forbes1e16cb82015-06-24 12:05:30 +120033#include "fb.h"
Chia-I Wuc14d1562014-10-17 09:49:22 +080034
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060035static VkResult cmd_meta_create_buf_view(struct intel_cmd *cmd,
36 VkBuffer buf,
Tony Barbour8205d902015-04-16 15:59:00 -060037 VkDeviceSize range,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060038 VkFormat format,
Chia-I Wu714df452015-01-01 07:55:04 +080039 struct intel_buf_view **view)
Chia-I Wuc14d1562014-10-17 09:49:22 +080040{
Courtney Goeltzenleuchterddcb6192015-04-14 18:48:46 -060041 VkBufferViewCreateInfo info;
Tony Barbour8205d902015-04-16 15:59:00 -060042 VkDeviceSize stride;
Chia-I Wuc14d1562014-10-17 09:49:22 +080043
44 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060045 info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
Chia-I Wu714df452015-01-01 07:55:04 +080046 info.buffer = buf;
Tony Barbour8205d902015-04-16 15:59:00 -060047 info.viewType = VK_BUFFER_VIEW_TYPE_FORMATTED;
Chia-I Wuc14d1562014-10-17 09:49:22 +080048 info.format = format;
Chia-I Wu714df452015-01-01 07:55:04 +080049 info.range = range;
Chia-I Wuc14d1562014-10-17 09:49:22 +080050
Chia-I Wubc7a30c2014-12-13 15:54:10 +080051 /*
52 * We do not rely on the hardware to avoid out-of-bound access. But we do
53 * not want the hardware to ignore the last element either.
54 */
Courtney Goeltzenleuchterba093032015-03-25 16:31:58 -060055 stride = icd_format_get_size(format);
56 if (info.range % stride)
57 info.range += stride - (info.range % stride);
Chia-I Wubc7a30c2014-12-13 15:54:10 +080058
Chia-I Wu714df452015-01-01 07:55:04 +080059 return intel_buf_view_create(cmd->dev, &info, view);
Chia-I Wuc14d1562014-10-17 09:49:22 +080060}
61
Chia-I Wu714df452015-01-01 07:55:04 +080062static void cmd_meta_set_src_for_buf(struct intel_cmd *cmd,
63 const struct intel_buf *buf,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060064 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +080065 struct intel_cmd_meta *meta)
66{
Chia-I Wu714df452015-01-01 07:55:04 +080067 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060068 VkResult res;
Chia-I Wuc14d1562014-10-17 09:49:22 +080069
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060070 res = cmd_meta_create_buf_view(cmd, (VkBuffer) buf,
Chia-I Wu714df452015-01-01 07:55:04 +080071 buf->size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060072 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -070073 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +080074 return;
75 }
Chia-I Wuc14d1562014-10-17 09:49:22 +080076
77 meta->src.valid = true;
78
Chia-I Wu714df452015-01-01 07:55:04 +080079 memcpy(meta->src.surface, view->cmd,
80 sizeof(view->cmd[0]) * view->cmd_len);
81 meta->src.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +080082
Chia-I Wu714df452015-01-01 07:55:04 +080083 intel_buf_view_destroy(view);
84
85 meta->src.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +080086 meta->src.reloc_offset = 0;
87 meta->src.reloc_flags = 0;
88}
89
Chia-I Wu714df452015-01-01 07:55:04 +080090static void cmd_meta_set_dst_for_buf(struct intel_cmd *cmd,
91 const struct intel_buf *buf,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060092 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +080093 struct intel_cmd_meta *meta)
94{
Chia-I Wu714df452015-01-01 07:55:04 +080095 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060096 VkResult res;
Chia-I Wuc14d1562014-10-17 09:49:22 +080097
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060098 res = cmd_meta_create_buf_view(cmd, (VkBuffer) buf,
Chia-I Wu714df452015-01-01 07:55:04 +080099 buf->size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600100 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700101 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800102 return;
103 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800104
105 meta->dst.valid = true;
106
Chia-I Wu714df452015-01-01 07:55:04 +0800107 memcpy(meta->dst.surface, view->cmd,
108 sizeof(view->cmd[0]) * view->cmd_len);
109 meta->dst.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800110
Chia-I Wu714df452015-01-01 07:55:04 +0800111 intel_buf_view_destroy(view);
112
113 meta->dst.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800114 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800115 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800116}
117
118static void cmd_meta_set_src_for_img(struct intel_cmd *cmd,
119 const struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600120 VkFormat format,
121 VkImageAspect aspect,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800122 struct intel_cmd_meta *meta)
123{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600124 VkImageViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800125 struct intel_img_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600126 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800127
128 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600129 info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600130 info.image = (VkImage) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800131
Mark Lobodzinskic4e83e32015-07-02 09:53:03 -0600132 if (img->array_size == 1) {
133 switch (img->type) {
134 case VK_IMAGE_TYPE_1D:
135 info.viewType = VK_IMAGE_VIEW_TYPE_1D;
136 break;
137 case VK_IMAGE_TYPE_2D:
138 info.viewType = VK_IMAGE_VIEW_TYPE_2D;
139 break;
140 default:
141 break;
142 }
143 } else {
144 switch (img->type) {
145 case VK_IMAGE_TYPE_1D:
146 info.viewType = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
147 break;
148 case VK_IMAGE_TYPE_2D:
149 info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
150 break;
151 case VK_IMAGE_TYPE_3D:
152 info.viewType = VK_IMAGE_VIEW_TYPE_3D;
153 break;
154 default:
155 break;
156 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800157 }
158
159 info.format = format;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600160 info.channels.r = VK_CHANNEL_SWIZZLE_R;
161 info.channels.g = VK_CHANNEL_SWIZZLE_G;
162 info.channels.b = VK_CHANNEL_SWIZZLE_B;
163 info.channels.a = VK_CHANNEL_SWIZZLE_A;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800164 info.subresourceRange.aspect = aspect;
165 info.subresourceRange.baseMipLevel = 0;
Courtney Goeltzenleuchterdac96cf2015-06-04 11:35:43 -0600166 info.subresourceRange.mipLevels = VK_LAST_MIP_LEVEL;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800167 info.subresourceRange.baseArraySlice = 0;
Courtney Goeltzenleuchterdac96cf2015-06-04 11:35:43 -0600168 info.subresourceRange.arraySize = VK_LAST_ARRAY_SLICE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800169
170 ret = intel_img_view_create(cmd->dev, &info, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600171 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700172 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800173 return;
174 }
175
176 meta->src.valid = true;
177
178 memcpy(meta->src.surface, view->cmd,
179 sizeof(view->cmd[0]) * view->cmd_len);
180 meta->src.surface_len = view->cmd_len;
181
182 meta->src.reloc_target = (intptr_t) img->obj.mem->bo;
183 meta->src.reloc_offset = 0;
184 meta->src.reloc_flags = 0;
185
186 intel_img_view_destroy(view);
187}
188
Chia-I Wu83084ba2014-12-04 12:49:52 +0800189static void cmd_meta_adjust_compressed_dst(struct intel_cmd *cmd,
190 const struct intel_img *img,
191 struct intel_cmd_meta *meta)
192{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600193 int32_t w, h, layer;
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800194 unsigned x_offset, y_offset;
Chia-I Wu83084ba2014-12-04 12:49:52 +0800195
196 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
197 w = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_WIDTH);
198 h = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800199 layer = GEN_EXTRACT(meta->dst.surface[4],
200 GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800201 } else {
202 w = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_WIDTH);
203 h = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800204 layer = GEN_EXTRACT(meta->dst.surface[4],
205 GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800206 }
207
208 /* note that the width/height fields have the real values minus 1 */
209 w = (w + img->layout.block_width) / img->layout.block_width - 1;
210 h = (h + img->layout.block_height) / img->layout.block_height - 1;
211
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800212 /* adjust width and height */
Chia-I Wu83084ba2014-12-04 12:49:52 +0800213 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800214 meta->dst.surface[2] &= ~(GEN7_SURFACE_DW2_WIDTH__MASK |
215 GEN7_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800216 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN7_SURFACE_DW2_WIDTH) |
217 GEN_SHIFT32(h, GEN7_SURFACE_DW2_HEIGHT);
218 } else {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800219 meta->dst.surface[2] &= ~(GEN6_SURFACE_DW2_WIDTH__MASK |
220 GEN6_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800221 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN6_SURFACE_DW2_WIDTH) |
222 GEN_SHIFT32(h, GEN6_SURFACE_DW2_HEIGHT);
223 }
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800224
225 if (!layer)
226 return;
227
228 meta->dst.reloc_offset = intel_layout_get_slice_tile_offset(&img->layout,
229 0, layer, &x_offset, &y_offset);
230
231 /*
232 * The lower 2 bits (or 1 bit for Y) are missing. This may be a problem
233 * for small images (16x16 or smaller). We will need to adjust the
234 * drawing rectangle instead.
235 */
236 x_offset = (x_offset / img->layout.block_width) >> 2;
237 y_offset = (y_offset / img->layout.block_height) >> 1;
238
239 /* adjust min array element and X/Y offsets */
240 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
241 meta->dst.surface[4] &= ~GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
242 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN7_SURFACE_DW5_X_OFFSET) |
243 GEN_SHIFT32(y_offset, GEN7_SURFACE_DW5_Y_OFFSET);
244 } else {
245 meta->dst.surface[4] &= ~GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
246 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN6_SURFACE_DW5_X_OFFSET) |
247 GEN_SHIFT32(y_offset, GEN6_SURFACE_DW5_Y_OFFSET);
248 }
Chia-I Wu83084ba2014-12-04 12:49:52 +0800249}
250
Chia-I Wuc14d1562014-10-17 09:49:22 +0800251static void cmd_meta_set_dst_for_img(struct intel_cmd *cmd,
252 const struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600253 VkFormat format,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600254 uint32_t lod, uint32_t layer,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800255 struct intel_cmd_meta *meta)
256{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600257 VkColorAttachmentViewCreateInfo info;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800258 struct intel_att_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600259 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800260
261 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600262 info.sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600263 info.image = (VkImage) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800264 info.format = format;
265 info.mipLevel = lod;
266 info.baseArraySlice = layer;
267 info.arraySize = 1;
268
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800269 ret = intel_att_view_create_for_color(cmd->dev, &info, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600270 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700271 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800272 return;
273 }
274
275 meta->dst.valid = true;
276
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800277 memcpy(meta->dst.surface, view->att_cmd,
278 sizeof(view->att_cmd[0]) * view->cmd_len);
279 meta->dst.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800280
281 meta->dst.reloc_target = (intptr_t) img->obj.mem->bo;
282 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800283 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800284
Chia-I Wu83084ba2014-12-04 12:49:52 +0800285 if (icd_format_is_compressed(img->layout.format))
286 cmd_meta_adjust_compressed_dst(cmd, img, meta);
287
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800288 intel_att_view_destroy(view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800289}
290
291static void cmd_meta_set_src_for_writer(struct intel_cmd *cmd,
292 enum intel_cmd_writer_type writer,
Tony Barbour8205d902015-04-16 15:59:00 -0600293 VkDeviceSize size,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600294 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800295 struct intel_cmd_meta *meta)
296{
Chia-I Wu714df452015-01-01 07:55:04 +0800297 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600298 VkResult res;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800299
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600300 res = cmd_meta_create_buf_view(cmd, (VkBuffer) VK_NULL_HANDLE,
Chia-I Wu714df452015-01-01 07:55:04 +0800301 size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600302 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700303 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800304 return;
305 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800306
307 meta->src.valid = true;
308
Chia-I Wu714df452015-01-01 07:55:04 +0800309 memcpy(meta->src.surface, view->cmd,
310 sizeof(view->cmd[0]) * view->cmd_len);
311 meta->src.surface_len = view->cmd_len;
312
313 intel_buf_view_destroy(view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800314
315 meta->src.reloc_target = (intptr_t) writer;
316 meta->src.reloc_offset = 0;
317 meta->src.reloc_flags = INTEL_CMD_RELOC_TARGET_IS_WRITER;
318}
319
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800320static void cmd_meta_set_ds_view(struct intel_cmd *cmd,
321 const struct intel_img *img,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600322 uint32_t lod, uint32_t layer,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800323 struct intel_cmd_meta *meta)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800324{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600325 VkDepthStencilViewCreateInfo info;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800326 struct intel_att_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600327 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800328
329 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600330 info.sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600331 info.image = (VkImage) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800332 info.mipLevel = lod;
333 info.baseArraySlice = layer;
334 info.arraySize = 1;
335
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800336 ret = intel_att_view_create_for_ds(cmd->dev, &info, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600337 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700338 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800339 return;
340 }
341
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800342 meta->ds.view = view;
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800343}
344
345static void cmd_meta_set_ds_state(struct intel_cmd *cmd,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600346 VkImageAspect aspect,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600347 uint32_t stencil_ref,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800348 struct intel_cmd_meta *meta)
349{
Tony Barbourfa6cac72015-01-16 14:27:35 -0700350 meta->ds.stencil_ref = stencil_ref;
351 meta->ds.aspect = aspect;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800352}
353
354static enum intel_dev_meta_shader get_shader_id(const struct intel_dev *dev,
355 const struct intel_img *img,
356 bool copy_array)
357{
358 enum intel_dev_meta_shader shader_id;
359
360 switch (img->type) {
Tony Barbour8205d902015-04-16 15:59:00 -0600361 case VK_IMAGE_TYPE_1D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800362 shader_id = (copy_array) ?
363 INTEL_DEV_META_FS_COPY_1D_ARRAY : INTEL_DEV_META_FS_COPY_1D;
364 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600365 case VK_IMAGE_TYPE_2D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800366 shader_id = (img->samples > 1) ? INTEL_DEV_META_FS_COPY_2D_MS :
367 (copy_array) ? INTEL_DEV_META_FS_COPY_2D_ARRAY :
368 INTEL_DEV_META_FS_COPY_2D;
369 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600370 case VK_IMAGE_TYPE_3D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800371 default:
372 shader_id = INTEL_DEV_META_FS_COPY_2D_ARRAY;
373 break;
374 }
375
376 return shader_id;
377}
378
Chia-I Wuf3a27252014-11-24 15:27:01 +0800379static bool cmd_meta_mem_dword_aligned(const struct intel_cmd *cmd,
Tony Barbour8205d902015-04-16 15:59:00 -0600380 VkDeviceSize src_offset,
381 VkDeviceSize dst_offset,
382 VkDeviceSize size)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800383{
Chia-I Wuf3a27252014-11-24 15:27:01 +0800384 return !((src_offset | dst_offset | size) & 0x3);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800385}
386
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600387static VkFormat cmd_meta_img_raw_format(const struct intel_cmd *cmd,
388 VkFormat format)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800389{
Chia-I Wuffdde352014-12-20 15:12:16 +0800390 switch (icd_format_get_size(format)) {
391 case 1:
Tony Barbour8205d902015-04-16 15:59:00 -0600392 format = VK_FORMAT_R8_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800393 break;
394 case 2:
Tony Barbour8205d902015-04-16 15:59:00 -0600395 format = VK_FORMAT_R16_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800396 break;
397 case 4:
Tony Barbour8205d902015-04-16 15:59:00 -0600398 format = VK_FORMAT_R32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800399 break;
400 case 8:
Tony Barbour8205d902015-04-16 15:59:00 -0600401 format = VK_FORMAT_R32G32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800402 break;
403 case 16:
Tony Barbour8205d902015-04-16 15:59:00 -0600404 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800405 break;
406 default:
407 assert(!"unsupported image format for raw blit op");
Tony Barbour8205d902015-04-16 15:59:00 -0600408 format = VK_FORMAT_UNDEFINED;
Chia-I Wuffdde352014-12-20 15:12:16 +0800409 break;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800410 }
411
412 return format;
413}
414
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600415ICD_EXPORT void VKAPI vkCmdCopyBuffer(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600416 VkCmdBuffer cmdBuffer,
417 VkBuffer srcBuffer,
418 VkBuffer destBuffer,
419 uint32_t regionCount,
420 const VkBufferCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800421{
422 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800423 struct intel_buf *src = intel_buf(srcBuffer);
424 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800425 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600426 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600427 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800428
429 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800430 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800431
Chia-I Wuc14d1562014-10-17 09:49:22 +0800432 meta.height = 1;
433 meta.samples = 1;
434
Tony Barbour8205d902015-04-16 15:59:00 -0600435 format = VK_FORMAT_UNDEFINED;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800436
437 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600438 const VkBufferCopy *region = &pRegions[i];
439 VkFormat fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800440
Chia-I Wuf3a27252014-11-24 15:27:01 +0800441 meta.src.x = region->srcOffset;
442 meta.dst.x = region->destOffset;
443 meta.width = region->copySize;
444
445 if (cmd_meta_mem_dword_aligned(cmd, region->srcOffset,
446 region->destOffset, region->copySize)) {
447 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
448 meta.src.x /= 4;
449 meta.dst.x /= 4;
450 meta.width /= 4;
451
452 /*
453 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to
454 * be 16
455 */
Tony Barbour8205d902015-04-16 15:59:00 -0600456 fmt = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800457 } else {
458 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600459 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
460 &cmd->obj.base, 0, 0,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600461 "unaligned vkCmdCopyBuffer unsupported");
462 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800463 continue;
464 }
465
466 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM_UNALIGNED;
467
468 /*
469 * INTEL_DEV_META_VS_COPY_MEM_UNALIGNED is untyped but expects the
470 * stride to be 4
471 */
Tony Barbour8205d902015-04-16 15:59:00 -0600472 fmt = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800473 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800474
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700475 if (format != fmt) {
476 format = fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800477
Chia-I Wu714df452015-01-01 07:55:04 +0800478 cmd_meta_set_src_for_buf(cmd, src, format, &meta);
479 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800480 }
481
Chia-I Wuc14d1562014-10-17 09:49:22 +0800482 cmd_draw_meta(cmd, &meta);
483 }
484}
485
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600486ICD_EXPORT void VKAPI vkCmdCopyImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600487 VkCmdBuffer cmdBuffer,
488 VkImage srcImage,
489 VkImageLayout srcImageLayout,
490 VkImage destImage,
491 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600492 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600493 const VkImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800494{
495 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
496 struct intel_img *src = intel_img(srcImage);
497 struct intel_img *dst = intel_img(destImage);
498 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600499 VkFormat raw_format;
Cody Northrop30a2b462015-02-10 09:28:30 -0700500 bool raw_copy = false;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600501 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800502
503 if (src->type != dst->type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600504 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800505 return;
506 }
507
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700508 if (src->layout.format == dst->layout.format) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800509 raw_copy = true;
510 raw_format = cmd_meta_img_raw_format(cmd, src->layout.format);
511 } else if (icd_format_is_compressed(src->layout.format) ||
512 icd_format_is_compressed(dst->layout.format)) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600513 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800514 return;
515 }
516
517 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800518 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800519
520 cmd_meta_set_src_for_img(cmd, src,
521 (raw_copy) ? raw_format : src->layout.format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600522 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800523
524 meta.samples = dst->samples;
525
526 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600527 const VkImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600528 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800529
530 meta.shader_id = get_shader_id(cmd->dev, src,
531 (region->extent.depth > 1));
532
533 meta.src.lod = region->srcSubresource.mipLevel;
534 meta.src.layer = region->srcSubresource.arraySlice +
535 region->srcOffset.z;
536 meta.src.x = region->srcOffset.x;
537 meta.src.y = region->srcOffset.y;
538
539 meta.dst.lod = region->destSubresource.mipLevel;
540 meta.dst.layer = region->destSubresource.arraySlice +
541 region->destOffset.z;
542 meta.dst.x = region->destOffset.x;
543 meta.dst.y = region->destOffset.y;
544
545 meta.width = region->extent.width;
546 meta.height = region->extent.height;
547
Chia-I Wueccc7682015-03-24 14:15:30 +0800548 if (raw_copy) {
549 const uint32_t block_width =
550 icd_format_get_block_width(raw_format);
551
552 meta.src.x /= block_width;
553 meta.src.y /= block_width;
554 meta.dst.x /= block_width;
555 meta.dst.y /= block_width;
556 meta.width /= block_width;
557 meta.height /= block_width;
558 }
559
Chia-I Wuc14d1562014-10-17 09:49:22 +0800560 for (j = 0; j < region->extent.depth; j++) {
561 cmd_meta_set_dst_for_img(cmd, dst,
562 (raw_copy) ? raw_format : dst->layout.format,
563 meta.dst.lod, meta.dst.layer, &meta);
564
565 cmd_draw_meta(cmd, &meta);
566
567 meta.src.layer++;
568 meta.dst.layer++;
569 }
570 }
571}
572
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600573ICD_EXPORT void VKAPI vkCmdBlitImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600574 VkCmdBuffer cmdBuffer,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500575 VkImage srcImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600576 VkImageLayout srcImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500577 VkImage destImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600578 VkImageLayout destImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500579 uint32_t regionCount,
580 const VkImageBlit* pRegions,
581 VkTexFilter filter)
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600582{
583 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
584
585 /*
586 * TODO: Implement actual blit function.
587 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600588 cmd_fail(cmd, VK_ERROR_UNAVAILABLE);
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600589}
590
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600591ICD_EXPORT void VKAPI vkCmdCopyBufferToImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600592 VkCmdBuffer cmdBuffer,
593 VkBuffer srcBuffer,
594 VkImage destImage,
595 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600596 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600597 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800598{
599 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800600 struct intel_buf *buf = intel_buf(srcBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800601 struct intel_img *img = intel_img(destImage);
602 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600603 VkFormat format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800604 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800605
606 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800607 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800608
609 meta.shader_id = INTEL_DEV_META_FS_COPY_MEM_TO_IMG;
610 meta.samples = img->samples;
611
612 format = cmd_meta_img_raw_format(cmd, img->layout.format);
Mike Stroyanbc4e2ed2015-03-24 15:10:24 -0600613 block_width = icd_format_get_block_width(img->layout.format);
Chia-I Wu714df452015-01-01 07:55:04 +0800614 cmd_meta_set_src_for_buf(cmd, buf, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800615
616 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600617 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600618 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800619
Chia-I Wu714df452015-01-01 07:55:04 +0800620 meta.src.x = region->bufferOffset / icd_format_get_size(format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800621
622 meta.dst.lod = region->imageSubresource.mipLevel;
623 meta.dst.layer = region->imageSubresource.arraySlice +
624 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800625 meta.dst.x = region->imageOffset.x / block_width;
626 meta.dst.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800627
Chia-I Wueccc7682015-03-24 14:15:30 +0800628 meta.width = region->imageExtent.width / block_width;
629 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800630
631 for (j = 0; j < region->imageExtent.depth; j++) {
632 cmd_meta_set_dst_for_img(cmd, img, format,
633 meta.dst.lod, meta.dst.layer, &meta);
634
635 cmd_draw_meta(cmd, &meta);
636
637 meta.src.x += meta.width * meta.height;
638 meta.dst.layer++;
639 }
640 }
641}
642
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600643ICD_EXPORT void VKAPI vkCmdCopyImageToBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600644 VkCmdBuffer cmdBuffer,
645 VkImage srcImage,
646 VkImageLayout srcImageLayout,
647 VkBuffer destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600648 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600649 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800650{
651 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
652 struct intel_img *img = intel_img(srcImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800653 struct intel_buf *buf = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800654 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600655 VkFormat img_format, buf_format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800656 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800657
658 memset(&meta, 0, sizeof(meta));
Chia-I Wua44b6482014-12-20 14:58:01 +0800659 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800660
Chia-I Wua44b6482014-12-20 14:58:01 +0800661 img_format = cmd_meta_img_raw_format(cmd, img->layout.format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800662 block_width = icd_format_get_block_width(img_format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800663
Chia-I Wu714df452015-01-01 07:55:04 +0800664 /* buf_format is ignored by hw, but we derive stride from it */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700665 switch (img_format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600666 case VK_FORMAT_R8_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800667 meta.shader_id = INTEL_DEV_META_VS_COPY_R8_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600668 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800669 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600670 case VK_FORMAT_R16_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800671 meta.shader_id = INTEL_DEV_META_VS_COPY_R16_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600672 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800673 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600674 case VK_FORMAT_R32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800675 meta.shader_id = INTEL_DEV_META_VS_COPY_R32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600676 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800677 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600678 case VK_FORMAT_R32G32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800679 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600680 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800681 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600682 case VK_FORMAT_R32G32B32A32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800683 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32B32A32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600684 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800685 break;
686 default:
Tony Barbour8205d902015-04-16 15:59:00 -0600687 img_format = VK_FORMAT_UNDEFINED;
688 buf_format = VK_FORMAT_UNDEFINED;
Chia-I Wua44b6482014-12-20 14:58:01 +0800689 break;
690 }
691
Tony Barbour8205d902015-04-16 15:59:00 -0600692 if (img_format == VK_FORMAT_UNDEFINED ||
Chia-I Wua44b6482014-12-20 14:58:01 +0800693 (cmd_gen(cmd) == INTEL_GEN(6) &&
694 icd_format_get_size(img_format) < 4)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600695 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
696 &cmd->obj.base, 0, 0,
697 "vkCmdCopyImageToBuffer with bpp %d unsupported",
698 icd_format_get_size(img->layout.format));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600699 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wua44b6482014-12-20 14:58:01 +0800700 return;
701 }
702
703 cmd_meta_set_src_for_img(cmd, img, img_format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600704 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800705 cmd_meta_set_dst_for_buf(cmd, buf, buf_format, &meta);
Chia-I Wua44b6482014-12-20 14:58:01 +0800706
Chia-I Wuc14d1562014-10-17 09:49:22 +0800707 meta.samples = 1;
708
709 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600710 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600711 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800712
Chia-I Wuc14d1562014-10-17 09:49:22 +0800713 meta.src.lod = region->imageSubresource.mipLevel;
714 meta.src.layer = region->imageSubresource.arraySlice +
715 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800716 meta.src.x = region->imageOffset.x / block_width;
717 meta.src.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800718
Chia-I Wu714df452015-01-01 07:55:04 +0800719 meta.dst.x = region->bufferOffset / icd_format_get_size(img_format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800720 meta.width = region->imageExtent.width / block_width;
721 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800722
723 for (j = 0; j < region->imageExtent.depth; j++) {
724 cmd_draw_meta(cmd, &meta);
725
726 meta.src.layer++;
Chia-I Wua44b6482014-12-20 14:58:01 +0800727 meta.dst.x += meta.width * meta.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800728 }
729 }
730}
731
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600732ICD_EXPORT void VKAPI vkCmdUpdateBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600733 VkCmdBuffer cmdBuffer,
734 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600735 VkDeviceSize destOffset,
736 VkDeviceSize dataSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600737 const uint32_t* pData)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800738{
739 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800740 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800741 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600742 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800743 uint32_t *ptr;
744 uint32_t offset;
745
Chia-I Wuf3a27252014-11-24 15:27:01 +0800746 /* must be 4-byte aligned */
747 if ((destOffset | dataSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600748 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800749 return;
750 }
751
Chia-I Wuc14d1562014-10-17 09:49:22 +0800752 /* write to dynamic state writer first */
753 offset = cmd_state_pointer(cmd, INTEL_CMD_ITEM_BLOB, 32,
754 (dataSize + 3) / 4, &ptr);
755 memcpy(ptr, pData, dataSize);
756
Chia-I Wuc14d1562014-10-17 09:49:22 +0800757 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800758 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800759
Chia-I Wuf3a27252014-11-24 15:27:01 +0800760 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
761
762 meta.src.x = offset / 4;
763 meta.dst.x = destOffset / 4;
764 meta.width = dataSize / 4;
765 meta.height = 1;
766 meta.samples = 1;
767
768 /*
769 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to be 16
770 */
Tony Barbour8205d902015-04-16 15:59:00 -0600771 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800772
773 cmd_meta_set_src_for_writer(cmd, INTEL_CMD_WRITER_STATE,
774 offset + dataSize, format, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800775 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800776
Chia-I Wuc14d1562014-10-17 09:49:22 +0800777 cmd_draw_meta(cmd, &meta);
778}
779
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600780ICD_EXPORT void VKAPI vkCmdFillBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600781 VkCmdBuffer cmdBuffer,
782 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600783 VkDeviceSize destOffset,
784 VkDeviceSize fillSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600785 uint32_t data)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800786{
787 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800788 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800789 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600790 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800791
792 /* must be 4-byte aligned */
793 if ((destOffset | fillSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600794 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800795 return;
796 }
797
798 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800799 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800800
Chia-I Wuf3a27252014-11-24 15:27:01 +0800801 meta.shader_id = INTEL_DEV_META_VS_FILL_MEM;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800802
803 meta.clear_val[0] = data;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800804
Chia-I Wuf3a27252014-11-24 15:27:01 +0800805 meta.dst.x = destOffset / 4;
806 meta.width = fillSize / 4;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800807 meta.height = 1;
808 meta.samples = 1;
809
Chia-I Wuf3a27252014-11-24 15:27:01 +0800810 /*
811 * INTEL_DEV_META_VS_FILL_MEM is untyped but expects the stride to be 16
812 */
Tony Barbour8205d902015-04-16 15:59:00 -0600813 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800814
Chia-I Wu714df452015-01-01 07:55:04 +0800815 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800816
Chia-I Wuc14d1562014-10-17 09:49:22 +0800817 cmd_draw_meta(cmd, &meta);
818}
819
820static void cmd_meta_clear_image(struct intel_cmd *cmd,
821 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600822 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800823 struct intel_cmd_meta *meta,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600824 const VkImageSubresourceRange *range)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800825{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600826 uint32_t mip_levels, array_size;
827 uint32_t i, j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800828
829 if (range->baseMipLevel >= img->mip_levels ||
830 range->baseArraySlice >= img->array_size)
831 return;
832
833 mip_levels = img->mip_levels - range->baseMipLevel;
834 if (mip_levels > range->mipLevels)
835 mip_levels = range->mipLevels;
836
837 array_size = img->array_size - range->baseArraySlice;
838 if (array_size > range->arraySize)
839 array_size = range->arraySize;
840
Chia-I Wuc14d1562014-10-17 09:49:22 +0800841 for (i = 0; i < mip_levels; i++) {
Chia-I Wufaaed472014-10-28 14:17:43 +0800842 meta->dst.lod = range->baseMipLevel + i;
843 meta->dst.layer = range->baseArraySlice;
844
Chia-I Wu73520ac2015-02-19 11:17:45 -0700845 /* TODO INTEL_CMD_META_DS_HIZ_CLEAR requires 8x4 aligned rectangle */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800846 meta->width = u_minify(img->layout.width0, meta->dst.lod);
847 meta->height = u_minify(img->layout.height0, meta->dst.lod);
848
Chia-I Wu73520ac2015-02-19 11:17:45 -0700849 if (meta->ds.op != INTEL_CMD_META_DS_NOP &&
850 !intel_img_can_enable_hiz(img, meta->dst.lod))
851 continue;
852
Chia-I Wuc14d1562014-10-17 09:49:22 +0800853 for (j = 0; j < array_size; j++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600854 if (range->aspect == VK_IMAGE_ASPECT_COLOR) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800855 cmd_meta_set_dst_for_img(cmd, img, format,
856 meta->dst.lod, meta->dst.layer, meta);
857
858 cmd_draw_meta(cmd, meta);
859 } else {
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800860 cmd_meta_set_ds_view(cmd, img, meta->dst.lod,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800861 meta->dst.layer, meta);
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800862 cmd_meta_set_ds_state(cmd, range->aspect,
863 meta->clear_val[1], meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800864
865 cmd_draw_meta(cmd, meta);
866
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800867 intel_att_view_destroy(meta->ds.view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800868 }
869
870 meta->dst.layer++;
871 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800872 }
873}
874
Chia-I Wu73520ac2015-02-19 11:17:45 -0700875void cmd_meta_ds_op(struct intel_cmd *cmd,
876 enum intel_cmd_meta_ds_op op,
877 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600878 const VkImageSubresourceRange *range)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700879{
880 struct intel_cmd_meta meta;
881
882 if (img->layout.aux != INTEL_LAYOUT_AUX_HIZ)
883 return;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600884 if (range->aspect != VK_IMAGE_ASPECT_DEPTH)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700885 return;
886
887 memset(&meta, 0, sizeof(meta));
888 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
889 meta.samples = img->samples;
890
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600891 meta.ds.aspect = VK_IMAGE_ASPECT_DEPTH;
Chia-I Wu73520ac2015-02-19 11:17:45 -0700892 meta.ds.op = op;
893 meta.ds.optimal = true;
894
895 cmd_meta_clear_image(cmd, img, img->layout.format, &meta, range);
896}
897
Chris Forbesfff9bf42015-06-15 15:26:19 +1200898void cmd_meta_clear_color_image(
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600899 VkCmdBuffer cmdBuffer,
900 VkImage image,
901 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200902 const VkClearColorValue *pClearColor,
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600903 uint32_t rangeCount,
904 const VkImageSubresourceRange *pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800905{
906 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
907 struct intel_img *img = intel_img(image);
908 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600909 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600910 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800911
912 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800913 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800914
915 meta.shader_id = INTEL_DEV_META_FS_CLEAR_COLOR;
916 meta.samples = img->samples;
917
Chris Forbese3105972015-06-24 14:34:53 +1200918 meta.clear_val[0] = pClearColor->u32[0];
919 meta.clear_val[1] = pClearColor->u32[1];
920 meta.clear_val[2] = pClearColor->u32[2];
921 meta.clear_val[3] = pClearColor->u32[3];
922 format = img->layout.format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800923
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600924 for (i = 0; i < rangeCount; i++) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800925 cmd_meta_clear_image(cmd, img, format, &meta, &pRanges[i]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600926 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800927}
928
Chris Forbesfff9bf42015-06-15 15:26:19 +1200929ICD_EXPORT void VKAPI vkCmdClearColorImage(
930 VkCmdBuffer cmdBuffer,
931 VkImage image,
932 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200933 const VkClearColorValue *pClearColor,
Chris Forbesfff9bf42015-06-15 15:26:19 +1200934 uint32_t rangeCount,
935 const VkImageSubresourceRange *pRanges)
936{
937 cmd_meta_clear_color_image(cmdBuffer, image, imageLayout, pClearColor, rangeCount, pRanges);
938}
939
Chris Forbes4cf9d102015-06-22 18:46:05 +1200940void cmd_meta_clear_depth_stencil_image(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600941 VkCmdBuffer cmdBuffer,
942 VkImage image,
943 VkImageLayout imageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600944 float depth,
945 uint32_t stencil,
946 uint32_t rangeCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600947 const VkImageSubresourceRange* pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800948{
949 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
950 struct intel_img *img = intel_img(image);
951 struct intel_cmd_meta meta;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600952 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800953
954 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800955 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800956
957 meta.shader_id = INTEL_DEV_META_FS_CLEAR_DEPTH;
958 meta.samples = img->samples;
959
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800960 meta.clear_val[0] = u_fui(depth);
961 meta.clear_val[1] = stencil;
962
Mark Lobodzinski4e97c452015-07-01 15:18:26 -0600963 if (imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600964 imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) {
Courtney Goeltzenleuchter3b61a592015-03-30 15:07:58 -0600965 meta.ds.optimal = true;
966 }
Chia-I Wu73520ac2015-02-19 11:17:45 -0700967
Chia-I Wuc14d1562014-10-17 09:49:22 +0800968 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600969 const VkImageSubresourceRange *range = &pRanges[i];
Chia-I Wuc14d1562014-10-17 09:49:22 +0800970
Chia-I Wuc14d1562014-10-17 09:49:22 +0800971 cmd_meta_clear_image(cmd, img, img->layout.format,
972 &meta, range);
973 }
974}
975
Chris Forbes4cf9d102015-06-22 18:46:05 +1200976ICD_EXPORT void VKAPI vkCmdClearDepthStencilImage(
977 VkCmdBuffer cmdBuffer,
978 VkImage image,
979 VkImageLayout imageLayout,
980 float depth,
981 uint32_t stencil,
982 uint32_t rangeCount,
983 const VkImageSubresourceRange* pRanges)
984{
985 cmd_meta_clear_depth_stencil_image(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
986}
987
Chris Forbes2951d7d2015-06-22 17:21:59 +1200988ICD_EXPORT void VKAPI vkCmdClearColorAttachment(
989 VkCmdBuffer cmdBuffer,
990 uint32_t colorAttachment,
991 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200992 const VkClearColorValue *pColor,
Chris Forbes2951d7d2015-06-22 17:21:59 +1200993 uint32_t rectCount,
994 const VkRect3D *pRects)
995{
996 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800997 const struct intel_fb *fb = cmd->bind.fb;
998 const struct intel_att_view *view = fb->views[colorAttachment];
Chris Forbes1e16cb82015-06-24 12:05:30 +1200999
1000 /* Convert each rect3d to clear into a subresource clear.
1001 * TODO: this currently only supports full layer clears --
1002 * cmd_meta_clear_color_image does not provide a means to
1003 * specify the xy bounds.
1004 */
1005 for (uint32_t i = 0; i < rectCount; i++) {
Chris Forbes1e16cb82015-06-24 12:05:30 +12001006 VkImageSubresourceRange range = {
1007 VK_IMAGE_ASPECT_COLOR,
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001008 view->mipLevel,
Chris Forbes1e16cb82015-06-24 12:05:30 +12001009 1,
1010 pRects[i].offset.z,
1011 pRects[i].extent.depth
1012 };
1013
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001014 cmd_meta_clear_color_image(cmdBuffer, (VkImage) view->img,
Chris Forbes1e16cb82015-06-24 12:05:30 +12001015 imageLayout,
1016 pColor,
1017 1,
1018 &range);
1019 }
Chris Forbes2951d7d2015-06-22 17:21:59 +12001020}
1021
1022ICD_EXPORT void VKAPI vkCmdClearDepthStencilAttachment(
1023 VkCmdBuffer cmdBuffer,
1024 VkImageAspectFlags imageAspectMask,
1025 VkImageLayout imageLayout,
1026 float depth,
1027 uint32_t stencil,
1028 uint32_t rectCount,
1029 const VkRect3D *pRects)
1030{
1031 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001032 const struct intel_render_pass *rp = cmd->bind.render_pass;
1033 const struct intel_fb *fb = cmd->bind.fb;
1034 const struct intel_att_view *view = fb->views[rp->colorAttachmentCount];
Chris Forbes1e16cb82015-06-24 12:05:30 +12001035
1036 /* Convert each rect3d to clear into a subresource clear.
1037 * TODO: this currently only supports full layer clears --
1038 * cmd_meta_clear_depth_stencil_image does not provide a means to
1039 * specify the xy bounds.
1040 */
1041 for (uint32_t i = 0; i < rectCount; i++) {
Chris Forbes1e16cb82015-06-24 12:05:30 +12001042 VkImageSubresourceRange range = {
1043 VK_IMAGE_ASPECT_DEPTH,
1044 0, /* ds->mipLevel, */
1045 1,
1046 pRects[i].offset.z,
1047 pRects[i].extent.depth
1048 };
1049
1050 if (imageAspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001051 cmd_meta_clear_depth_stencil_image(cmdBuffer,
1052 (VkImage) view->img, imageLayout,
1053 depth, stencil, 1, &range);
Chris Forbes1e16cb82015-06-24 12:05:30 +12001054 }
1055 if (imageAspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
1056 range.aspect = VK_IMAGE_ASPECT_STENCIL;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001057 cmd_meta_clear_depth_stencil_image(cmdBuffer,
1058 (VkImage) view->img, imageLayout,
1059 depth, stencil, 1, &range);
Chris Forbes1e16cb82015-06-24 12:05:30 +12001060 }
1061 }
Chris Forbes2951d7d2015-06-22 17:21:59 +12001062}
1063
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001064ICD_EXPORT void VKAPI vkCmdResolveImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001065 VkCmdBuffer cmdBuffer,
1066 VkImage srcImage,
1067 VkImageLayout srcImageLayout,
1068 VkImage destImage,
1069 VkImageLayout destImageLayout,
Tony Barbour11f74372015-04-13 15:02:52 -06001070 uint32_t regionCount,
1071 const VkImageResolve* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +08001072{
1073 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1074 struct intel_img *src = intel_img(srcImage);
1075 struct intel_img *dst = intel_img(destImage);
1076 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001077 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001078 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001079
1080 if (src->samples <= 1 || dst->samples > 1 ||
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -07001081 src->layout.format != dst->layout.format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001082 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001083 return;
1084 }
1085
1086 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +08001087 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001088
1089 switch (src->samples) {
1090 case 2:
1091 default:
1092 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_2X;
1093 break;
1094 case 4:
1095 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_4X;
1096 break;
1097 case 8:
1098 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_8X;
1099 break;
1100 case 16:
1101 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_16X;
1102 break;
1103 }
1104
1105 meta.samples = 1;
1106
1107 format = cmd_meta_img_raw_format(cmd, src->layout.format);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001108 cmd_meta_set_src_for_img(cmd, src, format, VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001109
Tony Barbour11f74372015-04-13 15:02:52 -06001110 for (i = 0; i < regionCount; i++) {
1111 const VkImageResolve *region = &pRegions[i];
Tony Barboure9f99942015-04-13 13:11:12 -06001112 int arraySlice;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001113
Tony Barbour11f74372015-04-13 15:02:52 -06001114 for(arraySlice = 0; arraySlice < region->extent.depth; arraySlice++) {
1115 meta.src.lod = region->srcSubresource.mipLevel;
1116 meta.src.layer = region->srcSubresource.arraySlice + arraySlice;
1117 meta.src.x = region->srcOffset.x;
1118 meta.src.y = region->srcOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001119
Tony Barbour11f74372015-04-13 15:02:52 -06001120 meta.dst.lod = region->destSubresource.mipLevel;
1121 meta.dst.layer = region->destSubresource.arraySlice + arraySlice;
1122 meta.dst.x = region->destOffset.x;
1123 meta.dst.y = region->destOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001124
Tony Barbour11f74372015-04-13 15:02:52 -06001125 meta.width = region->extent.width;
1126 meta.height = region->extent.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001127
Tony Barboure9f99942015-04-13 13:11:12 -06001128 cmd_meta_set_dst_for_img(cmd, dst, format,
1129 meta.dst.lod, meta.dst.layer, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001130
Tony Barboure9f99942015-04-13 13:11:12 -06001131 cmd_draw_meta(cmd, &meta);
1132 }
Chia-I Wuc14d1562014-10-17 09:49:22 +08001133 }
1134}