blob: 3d053229033929578d8cb86b1b612455381322f7 [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 Wuc14d1562014-10-17 09:49:22 +0800258 struct intel_rt_view *rt;
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
269 ret = intel_rt_view_create(cmd->dev, &info, &rt);
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
277 memcpy(meta->dst.surface, rt->cmd, sizeof(rt->cmd[0]) * rt->cmd_len);
278 meta->dst.surface_len = rt->cmd_len;
279
280 meta->dst.reloc_target = (intptr_t) img->obj.mem->bo;
281 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800282 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800283
Chia-I Wu83084ba2014-12-04 12:49:52 +0800284 if (icd_format_is_compressed(img->layout.format))
285 cmd_meta_adjust_compressed_dst(cmd, img, meta);
286
Chia-I Wuc14d1562014-10-17 09:49:22 +0800287 intel_rt_view_destroy(rt);
288}
289
290static void cmd_meta_set_src_for_writer(struct intel_cmd *cmd,
291 enum intel_cmd_writer_type writer,
Tony Barbour8205d902015-04-16 15:59:00 -0600292 VkDeviceSize size,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600293 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800294 struct intel_cmd_meta *meta)
295{
Chia-I Wu714df452015-01-01 07:55:04 +0800296 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600297 VkResult res;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800298
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600299 res = cmd_meta_create_buf_view(cmd, (VkBuffer) VK_NULL_HANDLE,
Chia-I Wu714df452015-01-01 07:55:04 +0800300 size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600301 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700302 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800303 return;
304 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800305
306 meta->src.valid = true;
307
Chia-I Wu714df452015-01-01 07:55:04 +0800308 memcpy(meta->src.surface, view->cmd,
309 sizeof(view->cmd[0]) * view->cmd_len);
310 meta->src.surface_len = view->cmd_len;
311
312 intel_buf_view_destroy(view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800313
314 meta->src.reloc_target = (intptr_t) writer;
315 meta->src.reloc_offset = 0;
316 meta->src.reloc_flags = INTEL_CMD_RELOC_TARGET_IS_WRITER;
317}
318
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800319static void cmd_meta_set_ds_view(struct intel_cmd *cmd,
320 const struct intel_img *img,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600321 uint32_t lod, uint32_t layer,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800322 struct intel_cmd_meta *meta)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800323{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600324 VkDepthStencilViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800325 struct intel_ds_view *ds;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600326 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800327
328 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600329 info.sType = VK_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600330 info.image = (VkImage) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800331 info.mipLevel = lod;
332 info.baseArraySlice = layer;
333 info.arraySize = 1;
334
335 ret = intel_ds_view_create(cmd->dev, &info, &ds);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600336 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700337 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800338 return;
339 }
340
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800341 meta->ds.view = ds;
342}
343
344static void cmd_meta_set_ds_state(struct intel_cmd *cmd,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600345 VkImageAspect aspect,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600346 uint32_t stencil_ref,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800347 struct intel_cmd_meta *meta)
348{
Tony Barbourfa6cac72015-01-16 14:27:35 -0700349 meta->ds.stencil_ref = stencil_ref;
350 meta->ds.aspect = aspect;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800351}
352
353static enum intel_dev_meta_shader get_shader_id(const struct intel_dev *dev,
354 const struct intel_img *img,
355 bool copy_array)
356{
357 enum intel_dev_meta_shader shader_id;
358
359 switch (img->type) {
Tony Barbour8205d902015-04-16 15:59:00 -0600360 case VK_IMAGE_TYPE_1D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800361 shader_id = (copy_array) ?
362 INTEL_DEV_META_FS_COPY_1D_ARRAY : INTEL_DEV_META_FS_COPY_1D;
363 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600364 case VK_IMAGE_TYPE_2D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800365 shader_id = (img->samples > 1) ? INTEL_DEV_META_FS_COPY_2D_MS :
366 (copy_array) ? INTEL_DEV_META_FS_COPY_2D_ARRAY :
367 INTEL_DEV_META_FS_COPY_2D;
368 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600369 case VK_IMAGE_TYPE_3D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800370 default:
371 shader_id = INTEL_DEV_META_FS_COPY_2D_ARRAY;
372 break;
373 }
374
375 return shader_id;
376}
377
Chia-I Wuf3a27252014-11-24 15:27:01 +0800378static bool cmd_meta_mem_dword_aligned(const struct intel_cmd *cmd,
Tony Barbour8205d902015-04-16 15:59:00 -0600379 VkDeviceSize src_offset,
380 VkDeviceSize dst_offset,
381 VkDeviceSize size)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800382{
Chia-I Wuf3a27252014-11-24 15:27:01 +0800383 return !((src_offset | dst_offset | size) & 0x3);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800384}
385
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600386static VkFormat cmd_meta_img_raw_format(const struct intel_cmd *cmd,
387 VkFormat format)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800388{
Chia-I Wuffdde352014-12-20 15:12:16 +0800389 switch (icd_format_get_size(format)) {
390 case 1:
Tony Barbour8205d902015-04-16 15:59:00 -0600391 format = VK_FORMAT_R8_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800392 break;
393 case 2:
Tony Barbour8205d902015-04-16 15:59:00 -0600394 format = VK_FORMAT_R16_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800395 break;
396 case 4:
Tony Barbour8205d902015-04-16 15:59:00 -0600397 format = VK_FORMAT_R32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800398 break;
399 case 8:
Tony Barbour8205d902015-04-16 15:59:00 -0600400 format = VK_FORMAT_R32G32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800401 break;
402 case 16:
Tony Barbour8205d902015-04-16 15:59:00 -0600403 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800404 break;
405 default:
406 assert(!"unsupported image format for raw blit op");
Tony Barbour8205d902015-04-16 15:59:00 -0600407 format = VK_FORMAT_UNDEFINED;
Chia-I Wuffdde352014-12-20 15:12:16 +0800408 break;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800409 }
410
411 return format;
412}
413
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600414ICD_EXPORT void VKAPI vkCmdCopyBuffer(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600415 VkCmdBuffer cmdBuffer,
416 VkBuffer srcBuffer,
417 VkBuffer destBuffer,
418 uint32_t regionCount,
419 const VkBufferCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800420{
421 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800422 struct intel_buf *src = intel_buf(srcBuffer);
423 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800424 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600425 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600426 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800427
428 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800429 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800430
Chia-I Wuc14d1562014-10-17 09:49:22 +0800431 meta.height = 1;
432 meta.samples = 1;
433
Tony Barbour8205d902015-04-16 15:59:00 -0600434 format = VK_FORMAT_UNDEFINED;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800435
436 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600437 const VkBufferCopy *region = &pRegions[i];
438 VkFormat fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800439
Chia-I Wuf3a27252014-11-24 15:27:01 +0800440 meta.src.x = region->srcOffset;
441 meta.dst.x = region->destOffset;
442 meta.width = region->copySize;
443
444 if (cmd_meta_mem_dword_aligned(cmd, region->srcOffset,
445 region->destOffset, region->copySize)) {
446 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
447 meta.src.x /= 4;
448 meta.dst.x /= 4;
449 meta.width /= 4;
450
451 /*
452 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to
453 * be 16
454 */
Tony Barbour8205d902015-04-16 15:59:00 -0600455 fmt = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800456 } else {
457 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600458 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
459 &cmd->obj.base, 0, 0,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600460 "unaligned vkCmdCopyBuffer unsupported");
461 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800462 continue;
463 }
464
465 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM_UNALIGNED;
466
467 /*
468 * INTEL_DEV_META_VS_COPY_MEM_UNALIGNED is untyped but expects the
469 * stride to be 4
470 */
Tony Barbour8205d902015-04-16 15:59:00 -0600471 fmt = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800472 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800473
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700474 if (format != fmt) {
475 format = fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800476
Chia-I Wu714df452015-01-01 07:55:04 +0800477 cmd_meta_set_src_for_buf(cmd, src, format, &meta);
478 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800479 }
480
Chia-I Wuc14d1562014-10-17 09:49:22 +0800481 cmd_draw_meta(cmd, &meta);
482 }
483}
484
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600485ICD_EXPORT void VKAPI vkCmdCopyImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600486 VkCmdBuffer cmdBuffer,
487 VkImage srcImage,
488 VkImageLayout srcImageLayout,
489 VkImage destImage,
490 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600491 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600492 const VkImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800493{
494 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
495 struct intel_img *src = intel_img(srcImage);
496 struct intel_img *dst = intel_img(destImage);
497 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600498 VkFormat raw_format;
Cody Northrop30a2b462015-02-10 09:28:30 -0700499 bool raw_copy = false;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600500 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800501
502 if (src->type != dst->type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600503 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800504 return;
505 }
506
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700507 if (src->layout.format == dst->layout.format) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800508 raw_copy = true;
509 raw_format = cmd_meta_img_raw_format(cmd, src->layout.format);
510 } else if (icd_format_is_compressed(src->layout.format) ||
511 icd_format_is_compressed(dst->layout.format)) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600512 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800513 return;
514 }
515
516 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800517 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800518
519 cmd_meta_set_src_for_img(cmd, src,
520 (raw_copy) ? raw_format : src->layout.format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600521 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800522
523 meta.samples = dst->samples;
524
525 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600526 const VkImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600527 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800528
529 meta.shader_id = get_shader_id(cmd->dev, src,
530 (region->extent.depth > 1));
531
532 meta.src.lod = region->srcSubresource.mipLevel;
533 meta.src.layer = region->srcSubresource.arraySlice +
534 region->srcOffset.z;
535 meta.src.x = region->srcOffset.x;
536 meta.src.y = region->srcOffset.y;
537
538 meta.dst.lod = region->destSubresource.mipLevel;
539 meta.dst.layer = region->destSubresource.arraySlice +
540 region->destOffset.z;
541 meta.dst.x = region->destOffset.x;
542 meta.dst.y = region->destOffset.y;
543
544 meta.width = region->extent.width;
545 meta.height = region->extent.height;
546
Chia-I Wueccc7682015-03-24 14:15:30 +0800547 if (raw_copy) {
548 const uint32_t block_width =
549 icd_format_get_block_width(raw_format);
550
551 meta.src.x /= block_width;
552 meta.src.y /= block_width;
553 meta.dst.x /= block_width;
554 meta.dst.y /= block_width;
555 meta.width /= block_width;
556 meta.height /= block_width;
557 }
558
Chia-I Wuc14d1562014-10-17 09:49:22 +0800559 for (j = 0; j < region->extent.depth; j++) {
560 cmd_meta_set_dst_for_img(cmd, dst,
561 (raw_copy) ? raw_format : dst->layout.format,
562 meta.dst.lod, meta.dst.layer, &meta);
563
564 cmd_draw_meta(cmd, &meta);
565
566 meta.src.layer++;
567 meta.dst.layer++;
568 }
569 }
570}
571
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600572ICD_EXPORT void VKAPI vkCmdBlitImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600573 VkCmdBuffer cmdBuffer,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500574 VkImage srcImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600575 VkImageLayout srcImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500576 VkImage destImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600577 VkImageLayout destImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500578 uint32_t regionCount,
579 const VkImageBlit* pRegions,
580 VkTexFilter filter)
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600581{
582 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
583
584 /*
585 * TODO: Implement actual blit function.
586 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600587 cmd_fail(cmd, VK_ERROR_UNAVAILABLE);
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600588}
589
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600590ICD_EXPORT void VKAPI vkCmdCopyBufferToImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600591 VkCmdBuffer cmdBuffer,
592 VkBuffer srcBuffer,
593 VkImage destImage,
594 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600595 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600596 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800597{
598 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800599 struct intel_buf *buf = intel_buf(srcBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800600 struct intel_img *img = intel_img(destImage);
601 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600602 VkFormat format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800603 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800604
605 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800606 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800607
608 meta.shader_id = INTEL_DEV_META_FS_COPY_MEM_TO_IMG;
609 meta.samples = img->samples;
610
611 format = cmd_meta_img_raw_format(cmd, img->layout.format);
Mike Stroyanbc4e2ed2015-03-24 15:10:24 -0600612 block_width = icd_format_get_block_width(img->layout.format);
Chia-I Wu714df452015-01-01 07:55:04 +0800613 cmd_meta_set_src_for_buf(cmd, buf, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800614
615 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600616 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600617 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800618
Chia-I Wu714df452015-01-01 07:55:04 +0800619 meta.src.x = region->bufferOffset / icd_format_get_size(format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800620
621 meta.dst.lod = region->imageSubresource.mipLevel;
622 meta.dst.layer = region->imageSubresource.arraySlice +
623 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800624 meta.dst.x = region->imageOffset.x / block_width;
625 meta.dst.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800626
Chia-I Wueccc7682015-03-24 14:15:30 +0800627 meta.width = region->imageExtent.width / block_width;
628 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800629
630 for (j = 0; j < region->imageExtent.depth; j++) {
631 cmd_meta_set_dst_for_img(cmd, img, format,
632 meta.dst.lod, meta.dst.layer, &meta);
633
634 cmd_draw_meta(cmd, &meta);
635
636 meta.src.x += meta.width * meta.height;
637 meta.dst.layer++;
638 }
639 }
640}
641
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600642ICD_EXPORT void VKAPI vkCmdCopyImageToBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600643 VkCmdBuffer cmdBuffer,
644 VkImage srcImage,
645 VkImageLayout srcImageLayout,
646 VkBuffer destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600647 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600648 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800649{
650 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
651 struct intel_img *img = intel_img(srcImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800652 struct intel_buf *buf = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800653 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600654 VkFormat img_format, buf_format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800655 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800656
657 memset(&meta, 0, sizeof(meta));
Chia-I Wua44b6482014-12-20 14:58:01 +0800658 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800659
Chia-I Wua44b6482014-12-20 14:58:01 +0800660 img_format = cmd_meta_img_raw_format(cmd, img->layout.format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800661 block_width = icd_format_get_block_width(img_format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800662
Chia-I Wu714df452015-01-01 07:55:04 +0800663 /* buf_format is ignored by hw, but we derive stride from it */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700664 switch (img_format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600665 case VK_FORMAT_R8_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800666 meta.shader_id = INTEL_DEV_META_VS_COPY_R8_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600667 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800668 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600669 case VK_FORMAT_R16_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800670 meta.shader_id = INTEL_DEV_META_VS_COPY_R16_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600671 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800672 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600673 case VK_FORMAT_R32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800674 meta.shader_id = INTEL_DEV_META_VS_COPY_R32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600675 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800676 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600677 case VK_FORMAT_R32G32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800678 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600679 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800680 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600681 case VK_FORMAT_R32G32B32A32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800682 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32B32A32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600683 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800684 break;
685 default:
Tony Barbour8205d902015-04-16 15:59:00 -0600686 img_format = VK_FORMAT_UNDEFINED;
687 buf_format = VK_FORMAT_UNDEFINED;
Chia-I Wua44b6482014-12-20 14:58:01 +0800688 break;
689 }
690
Tony Barbour8205d902015-04-16 15:59:00 -0600691 if (img_format == VK_FORMAT_UNDEFINED ||
Chia-I Wua44b6482014-12-20 14:58:01 +0800692 (cmd_gen(cmd) == INTEL_GEN(6) &&
693 icd_format_get_size(img_format) < 4)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600694 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
695 &cmd->obj.base, 0, 0,
696 "vkCmdCopyImageToBuffer with bpp %d unsupported",
697 icd_format_get_size(img->layout.format));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600698 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wua44b6482014-12-20 14:58:01 +0800699 return;
700 }
701
702 cmd_meta_set_src_for_img(cmd, img, img_format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600703 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800704 cmd_meta_set_dst_for_buf(cmd, buf, buf_format, &meta);
Chia-I Wua44b6482014-12-20 14:58:01 +0800705
Chia-I Wuc14d1562014-10-17 09:49:22 +0800706 meta.samples = 1;
707
708 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600709 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600710 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800711
Chia-I Wuc14d1562014-10-17 09:49:22 +0800712 meta.src.lod = region->imageSubresource.mipLevel;
713 meta.src.layer = region->imageSubresource.arraySlice +
714 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800715 meta.src.x = region->imageOffset.x / block_width;
716 meta.src.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800717
Chia-I Wu714df452015-01-01 07:55:04 +0800718 meta.dst.x = region->bufferOffset / icd_format_get_size(img_format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800719 meta.width = region->imageExtent.width / block_width;
720 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800721
722 for (j = 0; j < region->imageExtent.depth; j++) {
723 cmd_draw_meta(cmd, &meta);
724
725 meta.src.layer++;
Chia-I Wua44b6482014-12-20 14:58:01 +0800726 meta.dst.x += meta.width * meta.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800727 }
728 }
729}
730
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600731ICD_EXPORT void VKAPI vkCmdUpdateBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600732 VkCmdBuffer cmdBuffer,
733 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600734 VkDeviceSize destOffset,
735 VkDeviceSize dataSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600736 const uint32_t* pData)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800737{
738 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800739 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800740 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600741 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800742 uint32_t *ptr;
743 uint32_t offset;
744
Chia-I Wuf3a27252014-11-24 15:27:01 +0800745 /* must be 4-byte aligned */
746 if ((destOffset | dataSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600747 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800748 return;
749 }
750
Chia-I Wuc14d1562014-10-17 09:49:22 +0800751 /* write to dynamic state writer first */
752 offset = cmd_state_pointer(cmd, INTEL_CMD_ITEM_BLOB, 32,
753 (dataSize + 3) / 4, &ptr);
754 memcpy(ptr, pData, dataSize);
755
Chia-I Wuc14d1562014-10-17 09:49:22 +0800756 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800757 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800758
Chia-I Wuf3a27252014-11-24 15:27:01 +0800759 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
760
761 meta.src.x = offset / 4;
762 meta.dst.x = destOffset / 4;
763 meta.width = dataSize / 4;
764 meta.height = 1;
765 meta.samples = 1;
766
767 /*
768 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to be 16
769 */
Tony Barbour8205d902015-04-16 15:59:00 -0600770 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800771
772 cmd_meta_set_src_for_writer(cmd, INTEL_CMD_WRITER_STATE,
773 offset + dataSize, format, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800774 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800775
Chia-I Wuc14d1562014-10-17 09:49:22 +0800776 cmd_draw_meta(cmd, &meta);
777}
778
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600779ICD_EXPORT void VKAPI vkCmdFillBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600780 VkCmdBuffer cmdBuffer,
781 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600782 VkDeviceSize destOffset,
783 VkDeviceSize fillSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600784 uint32_t data)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800785{
786 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800787 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800788 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600789 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800790
791 /* must be 4-byte aligned */
792 if ((destOffset | fillSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600793 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800794 return;
795 }
796
797 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800798 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800799
Chia-I Wuf3a27252014-11-24 15:27:01 +0800800 meta.shader_id = INTEL_DEV_META_VS_FILL_MEM;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800801
802 meta.clear_val[0] = data;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800803
Chia-I Wuf3a27252014-11-24 15:27:01 +0800804 meta.dst.x = destOffset / 4;
805 meta.width = fillSize / 4;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800806 meta.height = 1;
807 meta.samples = 1;
808
Chia-I Wuf3a27252014-11-24 15:27:01 +0800809 /*
810 * INTEL_DEV_META_VS_FILL_MEM is untyped but expects the stride to be 16
811 */
Tony Barbour8205d902015-04-16 15:59:00 -0600812 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800813
Chia-I Wu714df452015-01-01 07:55:04 +0800814 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800815
Chia-I Wuc14d1562014-10-17 09:49:22 +0800816 cmd_draw_meta(cmd, &meta);
817}
818
819static void cmd_meta_clear_image(struct intel_cmd *cmd,
820 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600821 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800822 struct intel_cmd_meta *meta,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600823 const VkImageSubresourceRange *range)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800824{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600825 uint32_t mip_levels, array_size;
826 uint32_t i, j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800827
828 if (range->baseMipLevel >= img->mip_levels ||
829 range->baseArraySlice >= img->array_size)
830 return;
831
832 mip_levels = img->mip_levels - range->baseMipLevel;
833 if (mip_levels > range->mipLevels)
834 mip_levels = range->mipLevels;
835
836 array_size = img->array_size - range->baseArraySlice;
837 if (array_size > range->arraySize)
838 array_size = range->arraySize;
839
Chia-I Wuc14d1562014-10-17 09:49:22 +0800840 for (i = 0; i < mip_levels; i++) {
Chia-I Wufaaed472014-10-28 14:17:43 +0800841 meta->dst.lod = range->baseMipLevel + i;
842 meta->dst.layer = range->baseArraySlice;
843
Chia-I Wu73520ac2015-02-19 11:17:45 -0700844 /* TODO INTEL_CMD_META_DS_HIZ_CLEAR requires 8x4 aligned rectangle */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800845 meta->width = u_minify(img->layout.width0, meta->dst.lod);
846 meta->height = u_minify(img->layout.height0, meta->dst.lod);
847
Chia-I Wu73520ac2015-02-19 11:17:45 -0700848 if (meta->ds.op != INTEL_CMD_META_DS_NOP &&
849 !intel_img_can_enable_hiz(img, meta->dst.lod))
850 continue;
851
Chia-I Wuc14d1562014-10-17 09:49:22 +0800852 for (j = 0; j < array_size; j++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600853 if (range->aspect == VK_IMAGE_ASPECT_COLOR) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800854 cmd_meta_set_dst_for_img(cmd, img, format,
855 meta->dst.lod, meta->dst.layer, meta);
856
857 cmd_draw_meta(cmd, meta);
858 } else {
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800859 cmd_meta_set_ds_view(cmd, img, meta->dst.lod,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800860 meta->dst.layer, meta);
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800861 cmd_meta_set_ds_state(cmd, range->aspect,
862 meta->clear_val[1], meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800863
864 cmd_draw_meta(cmd, meta);
865
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800866 intel_ds_view_destroy(meta->ds.view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800867 }
868
869 meta->dst.layer++;
870 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800871 }
872}
873
Chia-I Wu73520ac2015-02-19 11:17:45 -0700874void cmd_meta_ds_op(struct intel_cmd *cmd,
875 enum intel_cmd_meta_ds_op op,
876 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600877 const VkImageSubresourceRange *range)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700878{
879 struct intel_cmd_meta meta;
880
881 if (img->layout.aux != INTEL_LAYOUT_AUX_HIZ)
882 return;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600883 if (range->aspect != VK_IMAGE_ASPECT_DEPTH)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700884 return;
885
886 memset(&meta, 0, sizeof(meta));
887 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
888 meta.samples = img->samples;
889
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600890 meta.ds.aspect = VK_IMAGE_ASPECT_DEPTH;
Chia-I Wu73520ac2015-02-19 11:17:45 -0700891 meta.ds.op = op;
892 meta.ds.optimal = true;
893
894 cmd_meta_clear_image(cmd, img, img->layout.format, &meta, range);
895}
896
Chris Forbesfff9bf42015-06-15 15:26:19 +1200897void cmd_meta_clear_color_image(
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600898 VkCmdBuffer cmdBuffer,
899 VkImage image,
900 VkImageLayout imageLayout,
901 const VkClearColor *pClearColor,
902 uint32_t rangeCount,
903 const VkImageSubresourceRange *pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800904{
905 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
906 struct intel_img *img = intel_img(image);
907 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600908 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600909 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800910
911 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800912 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800913
914 meta.shader_id = INTEL_DEV_META_FS_CLEAR_COLOR;
915 meta.samples = img->samples;
916
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600917 if (pClearColor->useRawValue) {
918 icd_format_get_raw_value(img->layout.format, pClearColor->color.rawColor, meta.clear_val);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600919 format = cmd_meta_img_raw_format(cmd, img->layout.format);
920 } else {
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600921 meta.clear_val[0] = u_fui(pClearColor->color.floatColor[0]);
922 meta.clear_val[1] = u_fui(pClearColor->color.floatColor[1]);
923 meta.clear_val[2] = u_fui(pClearColor->color.floatColor[2]);
924 meta.clear_val[3] = u_fui(pClearColor->color.floatColor[3]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600925 format = img->layout.format;
926 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800927
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600928 for (i = 0; i < rangeCount; i++) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800929 cmd_meta_clear_image(cmd, img, format, &meta, &pRanges[i]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600930 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800931}
932
Chris Forbesfff9bf42015-06-15 15:26:19 +1200933ICD_EXPORT void VKAPI vkCmdClearColorImage(
934 VkCmdBuffer cmdBuffer,
935 VkImage image,
936 VkImageLayout imageLayout,
937 const VkClearColor *pClearColor,
938 uint32_t rangeCount,
939 const VkImageSubresourceRange *pRanges)
940{
941 cmd_meta_clear_color_image(cmdBuffer, image, imageLayout, pClearColor, rangeCount, pRanges);
942}
943
Chris Forbes4cf9d102015-06-22 18:46:05 +1200944void cmd_meta_clear_depth_stencil_image(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600945 VkCmdBuffer cmdBuffer,
946 VkImage image,
947 VkImageLayout imageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600948 float depth,
949 uint32_t stencil,
950 uint32_t rangeCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600951 const VkImageSubresourceRange* pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800952{
953 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
954 struct intel_img *img = intel_img(image);
955 struct intel_cmd_meta meta;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600956 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800957
958 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800959 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800960
961 meta.shader_id = INTEL_DEV_META_FS_CLEAR_DEPTH;
962 meta.samples = img->samples;
963
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800964 meta.clear_val[0] = u_fui(depth);
965 meta.clear_val[1] = stencil;
966
Mark Lobodzinski4e97c452015-07-01 15:18:26 -0600967 if (imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600968 imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) {
Courtney Goeltzenleuchter3b61a592015-03-30 15:07:58 -0600969 meta.ds.optimal = true;
970 }
Chia-I Wu73520ac2015-02-19 11:17:45 -0700971
Chia-I Wuc14d1562014-10-17 09:49:22 +0800972 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600973 const VkImageSubresourceRange *range = &pRanges[i];
Chia-I Wuc14d1562014-10-17 09:49:22 +0800974
Chia-I Wuc14d1562014-10-17 09:49:22 +0800975 cmd_meta_clear_image(cmd, img, img->layout.format,
976 &meta, range);
977 }
978}
979
Chris Forbes4cf9d102015-06-22 18:46:05 +1200980ICD_EXPORT void VKAPI vkCmdClearDepthStencilImage(
981 VkCmdBuffer cmdBuffer,
982 VkImage image,
983 VkImageLayout imageLayout,
984 float depth,
985 uint32_t stencil,
986 uint32_t rangeCount,
987 const VkImageSubresourceRange* pRanges)
988{
989 cmd_meta_clear_depth_stencil_image(cmdBuffer, image, imageLayout, depth, stencil, rangeCount, pRanges);
990}
991
Chris Forbes2951d7d2015-06-22 17:21:59 +1200992ICD_EXPORT void VKAPI vkCmdClearColorAttachment(
993 VkCmdBuffer cmdBuffer,
994 uint32_t colorAttachment,
995 VkImageLayout imageLayout,
996 const VkClearColor *pColor,
997 uint32_t rectCount,
998 const VkRect3D *pRects)
999{
1000 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chris Forbes1e16cb82015-06-24 12:05:30 +12001001 struct intel_fb const *fb = cmd->bind.fb;
1002
1003 /* Convert each rect3d to clear into a subresource clear.
1004 * TODO: this currently only supports full layer clears --
1005 * cmd_meta_clear_color_image does not provide a means to
1006 * specify the xy bounds.
1007 */
1008 for (uint32_t i = 0; i < rectCount; i++) {
1009 const struct intel_rt_view *rt = fb->rt[colorAttachment];
1010
1011 VkImageSubresourceRange range = {
1012 VK_IMAGE_ASPECT_COLOR,
1013 rt->mipLevel,
1014 1,
1015 pRects[i].offset.z,
1016 pRects[i].extent.depth
1017 };
1018
1019 cmd_meta_clear_color_image(cmdBuffer, (VkImage) rt->img,
1020 imageLayout,
1021 pColor,
1022 1,
1023 &range);
1024 }
Chris Forbes2951d7d2015-06-22 17:21:59 +12001025}
1026
1027ICD_EXPORT void VKAPI vkCmdClearDepthStencilAttachment(
1028 VkCmdBuffer cmdBuffer,
1029 VkImageAspectFlags imageAspectMask,
1030 VkImageLayout imageLayout,
1031 float depth,
1032 uint32_t stencil,
1033 uint32_t rectCount,
1034 const VkRect3D *pRects)
1035{
1036 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chris Forbes1e16cb82015-06-24 12:05:30 +12001037 struct intel_fb const *fb = cmd->bind.fb;
1038
1039 /* Convert each rect3d to clear into a subresource clear.
1040 * TODO: this currently only supports full layer clears --
1041 * cmd_meta_clear_depth_stencil_image does not provide a means to
1042 * specify the xy bounds.
1043 */
1044 for (uint32_t i = 0; i < rectCount; i++) {
1045 const struct intel_ds_view *ds = fb->ds;
1046
1047 VkImageSubresourceRange range = {
1048 VK_IMAGE_ASPECT_DEPTH,
1049 0, /* ds->mipLevel, */
1050 1,
1051 pRects[i].offset.z,
1052 pRects[i].extent.depth
1053 };
1054
1055 if (imageAspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
1056 cmd_meta_clear_depth_stencil_image(cmdBuffer, (VkImage) ds->img,
1057 imageLayout,
1058 depth, stencil,
1059 1,
1060 &range);
1061 }
1062 if (imageAspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
1063 range.aspect = VK_IMAGE_ASPECT_STENCIL;
1064 cmd_meta_clear_depth_stencil_image(cmdBuffer, (VkImage) ds->img,
1065 imageLayout,
1066 depth, stencil,
1067 1,
1068 &range);
1069 }
1070 }
Chris Forbes2951d7d2015-06-22 17:21:59 +12001071}
1072
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001073ICD_EXPORT void VKAPI vkCmdResolveImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001074 VkCmdBuffer cmdBuffer,
1075 VkImage srcImage,
1076 VkImageLayout srcImageLayout,
1077 VkImage destImage,
1078 VkImageLayout destImageLayout,
Tony Barbour11f74372015-04-13 15:02:52 -06001079 uint32_t regionCount,
1080 const VkImageResolve* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +08001081{
1082 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1083 struct intel_img *src = intel_img(srcImage);
1084 struct intel_img *dst = intel_img(destImage);
1085 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001086 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001087 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001088
1089 if (src->samples <= 1 || dst->samples > 1 ||
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -07001090 src->layout.format != dst->layout.format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001091 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001092 return;
1093 }
1094
1095 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +08001096 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001097
1098 switch (src->samples) {
1099 case 2:
1100 default:
1101 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_2X;
1102 break;
1103 case 4:
1104 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_4X;
1105 break;
1106 case 8:
1107 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_8X;
1108 break;
1109 case 16:
1110 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_16X;
1111 break;
1112 }
1113
1114 meta.samples = 1;
1115
1116 format = cmd_meta_img_raw_format(cmd, src->layout.format);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001117 cmd_meta_set_src_for_img(cmd, src, format, VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001118
Tony Barbour11f74372015-04-13 15:02:52 -06001119 for (i = 0; i < regionCount; i++) {
1120 const VkImageResolve *region = &pRegions[i];
Tony Barboure9f99942015-04-13 13:11:12 -06001121 int arraySlice;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001122
Tony Barbour11f74372015-04-13 15:02:52 -06001123 for(arraySlice = 0; arraySlice < region->extent.depth; arraySlice++) {
1124 meta.src.lod = region->srcSubresource.mipLevel;
1125 meta.src.layer = region->srcSubresource.arraySlice + arraySlice;
1126 meta.src.x = region->srcOffset.x;
1127 meta.src.y = region->srcOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001128
Tony Barbour11f74372015-04-13 15:02:52 -06001129 meta.dst.lod = region->destSubresource.mipLevel;
1130 meta.dst.layer = region->destSubresource.arraySlice + arraySlice;
1131 meta.dst.x = region->destOffset.x;
1132 meta.dst.y = region->destOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001133
Tony Barbour11f74372015-04-13 15:02:52 -06001134 meta.width = region->extent.width;
1135 meta.height = region->extent.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001136
Tony Barboure9f99942015-04-13 13:11:12 -06001137 cmd_meta_set_dst_for_img(cmd, dst, format,
1138 meta.dst.lod, meta.dst.layer, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001139
Tony Barboure9f99942015-04-13 13:11:12 -06001140 cmd_draw_meta(cmd, &meta);
1141 }
Chia-I Wuc14d1562014-10-17 09:49:22 +08001142 }
1143}