blob: 9313c221603bcdf6a8a2968babbf97e749b276ad [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;
Tony Barbourde4124d2015-07-03 10:33:54 -060069 VkBuffer localbuf;
70 localbuf.handle = (uint64_t) buf;
Chia-I Wuc14d1562014-10-17 09:49:22 +080071
Tony Barbourde4124d2015-07-03 10:33:54 -060072 res = cmd_meta_create_buf_view(cmd, localbuf,
Chia-I Wu714df452015-01-01 07:55:04 +080073 buf->size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060074 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -070075 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +080076 return;
77 }
Chia-I Wuc14d1562014-10-17 09:49:22 +080078
79 meta->src.valid = true;
80
Chia-I Wu714df452015-01-01 07:55:04 +080081 memcpy(meta->src.surface, view->cmd,
82 sizeof(view->cmd[0]) * view->cmd_len);
83 meta->src.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +080084
Chia-I Wu714df452015-01-01 07:55:04 +080085 intel_buf_view_destroy(view);
86
87 meta->src.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +080088 meta->src.reloc_offset = 0;
89 meta->src.reloc_flags = 0;
90}
91
Chia-I Wu714df452015-01-01 07:55:04 +080092static void cmd_meta_set_dst_for_buf(struct intel_cmd *cmd,
93 const struct intel_buf *buf,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060094 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +080095 struct intel_cmd_meta *meta)
96{
Chia-I Wu714df452015-01-01 07:55:04 +080097 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060098 VkResult res;
Tony Barbourde4124d2015-07-03 10:33:54 -060099 VkBuffer localbuf;
100 localbuf.handle = (uint64_t) buf;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800101
Tony Barbourde4124d2015-07-03 10:33:54 -0600102 res = cmd_meta_create_buf_view(cmd, localbuf,
Chia-I Wu714df452015-01-01 07:55:04 +0800103 buf->size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600104 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700105 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800106 return;
107 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800108
109 meta->dst.valid = true;
110
Chia-I Wu714df452015-01-01 07:55:04 +0800111 memcpy(meta->dst.surface, view->cmd,
112 sizeof(view->cmd[0]) * view->cmd_len);
113 meta->dst.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800114
Chia-I Wu714df452015-01-01 07:55:04 +0800115 intel_buf_view_destroy(view);
116
117 meta->dst.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800118 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800119 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800120}
121
122static void cmd_meta_set_src_for_img(struct intel_cmd *cmd,
123 const struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600124 VkFormat format,
125 VkImageAspect aspect,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800126 struct intel_cmd_meta *meta)
127{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600128 VkImageViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800129 struct intel_img_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600130 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800131
132 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600133 info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tony Barbourde4124d2015-07-03 10:33:54 -0600134 info.image.handle = (uint64_t) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800135
Mark Lobodzinskic4e83e32015-07-02 09:53:03 -0600136 if (img->array_size == 1) {
137 switch (img->type) {
138 case VK_IMAGE_TYPE_1D:
139 info.viewType = VK_IMAGE_VIEW_TYPE_1D;
140 break;
141 case VK_IMAGE_TYPE_2D:
142 info.viewType = VK_IMAGE_VIEW_TYPE_2D;
143 break;
144 default:
145 break;
146 }
147 } else {
148 switch (img->type) {
149 case VK_IMAGE_TYPE_1D:
150 info.viewType = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
151 break;
152 case VK_IMAGE_TYPE_2D:
153 info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
154 break;
155 case VK_IMAGE_TYPE_3D:
156 info.viewType = VK_IMAGE_VIEW_TYPE_3D;
157 break;
158 default:
159 break;
160 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800161 }
162
163 info.format = format;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600164 info.channels.r = VK_CHANNEL_SWIZZLE_R;
165 info.channels.g = VK_CHANNEL_SWIZZLE_G;
166 info.channels.b = VK_CHANNEL_SWIZZLE_B;
167 info.channels.a = VK_CHANNEL_SWIZZLE_A;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800168 info.subresourceRange.aspect = aspect;
169 info.subresourceRange.baseMipLevel = 0;
Courtney Goeltzenleuchterdac96cf2015-06-04 11:35:43 -0600170 info.subresourceRange.mipLevels = VK_LAST_MIP_LEVEL;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800171 info.subresourceRange.baseArraySlice = 0;
Courtney Goeltzenleuchterdac96cf2015-06-04 11:35:43 -0600172 info.subresourceRange.arraySize = VK_LAST_ARRAY_SLICE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800173
174 ret = intel_img_view_create(cmd->dev, &info, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600175 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700176 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800177 return;
178 }
179
180 meta->src.valid = true;
181
182 memcpy(meta->src.surface, view->cmd,
183 sizeof(view->cmd[0]) * view->cmd_len);
184 meta->src.surface_len = view->cmd_len;
185
186 meta->src.reloc_target = (intptr_t) img->obj.mem->bo;
187 meta->src.reloc_offset = 0;
188 meta->src.reloc_flags = 0;
189
190 intel_img_view_destroy(view);
191}
192
Chia-I Wu83084ba2014-12-04 12:49:52 +0800193static void cmd_meta_adjust_compressed_dst(struct intel_cmd *cmd,
194 const struct intel_img *img,
195 struct intel_cmd_meta *meta)
196{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600197 int32_t w, h, layer;
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800198 unsigned x_offset, y_offset;
Chia-I Wu83084ba2014-12-04 12:49:52 +0800199
200 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
201 w = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_WIDTH);
202 h = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800203 layer = GEN_EXTRACT(meta->dst.surface[4],
204 GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800205 } else {
206 w = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_WIDTH);
207 h = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800208 layer = GEN_EXTRACT(meta->dst.surface[4],
209 GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800210 }
211
212 /* note that the width/height fields have the real values minus 1 */
213 w = (w + img->layout.block_width) / img->layout.block_width - 1;
214 h = (h + img->layout.block_height) / img->layout.block_height - 1;
215
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800216 /* adjust width and height */
Chia-I Wu83084ba2014-12-04 12:49:52 +0800217 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800218 meta->dst.surface[2] &= ~(GEN7_SURFACE_DW2_WIDTH__MASK |
219 GEN7_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800220 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN7_SURFACE_DW2_WIDTH) |
221 GEN_SHIFT32(h, GEN7_SURFACE_DW2_HEIGHT);
222 } else {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800223 meta->dst.surface[2] &= ~(GEN6_SURFACE_DW2_WIDTH__MASK |
224 GEN6_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800225 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN6_SURFACE_DW2_WIDTH) |
226 GEN_SHIFT32(h, GEN6_SURFACE_DW2_HEIGHT);
227 }
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800228
229 if (!layer)
230 return;
231
232 meta->dst.reloc_offset = intel_layout_get_slice_tile_offset(&img->layout,
233 0, layer, &x_offset, &y_offset);
234
235 /*
236 * The lower 2 bits (or 1 bit for Y) are missing. This may be a problem
237 * for small images (16x16 or smaller). We will need to adjust the
238 * drawing rectangle instead.
239 */
240 x_offset = (x_offset / img->layout.block_width) >> 2;
241 y_offset = (y_offset / img->layout.block_height) >> 1;
242
243 /* adjust min array element and X/Y offsets */
244 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
245 meta->dst.surface[4] &= ~GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
246 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN7_SURFACE_DW5_X_OFFSET) |
247 GEN_SHIFT32(y_offset, GEN7_SURFACE_DW5_Y_OFFSET);
248 } else {
249 meta->dst.surface[4] &= ~GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
250 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN6_SURFACE_DW5_X_OFFSET) |
251 GEN_SHIFT32(y_offset, GEN6_SURFACE_DW5_Y_OFFSET);
252 }
Chia-I Wu83084ba2014-12-04 12:49:52 +0800253}
254
Chia-I Wuc14d1562014-10-17 09:49:22 +0800255static void cmd_meta_set_dst_for_img(struct intel_cmd *cmd,
256 const struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600257 VkFormat format,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600258 uint32_t lod, uint32_t layer,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800259 struct intel_cmd_meta *meta)
260{
Chia-I Wuc278df82015-07-07 11:50:03 +0800261 VkAttachmentViewCreateInfo info;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800262 struct intel_att_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600263 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800264
265 memset(&info, 0, sizeof(info));
Chia-I Wuc278df82015-07-07 11:50:03 +0800266 info.sType = VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO;
Tony Barbourde4124d2015-07-03 10:33:54 -0600267 info.image.handle = (uint64_t) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800268 info.format = format;
269 info.mipLevel = lod;
270 info.baseArraySlice = layer;
271 info.arraySize = 1;
272
Chia-I Wuc278df82015-07-07 11:50:03 +0800273 ret = intel_att_view_create(cmd->dev, &info, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600274 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700275 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800276 return;
277 }
278
279 meta->dst.valid = true;
280
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800281 memcpy(meta->dst.surface, view->att_cmd,
282 sizeof(view->att_cmd[0]) * view->cmd_len);
283 meta->dst.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800284
285 meta->dst.reloc_target = (intptr_t) img->obj.mem->bo;
286 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800287 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800288
Chia-I Wu83084ba2014-12-04 12:49:52 +0800289 if (icd_format_is_compressed(img->layout.format))
290 cmd_meta_adjust_compressed_dst(cmd, img, meta);
291
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800292 intel_att_view_destroy(view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800293}
294
295static void cmd_meta_set_src_for_writer(struct intel_cmd *cmd,
296 enum intel_cmd_writer_type writer,
Tony Barbour8205d902015-04-16 15:59:00 -0600297 VkDeviceSize size,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600298 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800299 struct intel_cmd_meta *meta)
300{
Chia-I Wu714df452015-01-01 07:55:04 +0800301 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600302 VkResult res;
Tony Barbourde4124d2015-07-03 10:33:54 -0600303 VkBuffer localbuf;
304 localbuf.handle = 0;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800305
Tony Barbourde4124d2015-07-03 10:33:54 -0600306 res = cmd_meta_create_buf_view(cmd, localbuf,
Chia-I Wu714df452015-01-01 07:55:04 +0800307 size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600308 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700309 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800310 return;
311 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800312
313 meta->src.valid = true;
314
Chia-I Wu714df452015-01-01 07:55:04 +0800315 memcpy(meta->src.surface, view->cmd,
316 sizeof(view->cmd[0]) * view->cmd_len);
317 meta->src.surface_len = view->cmd_len;
318
319 intel_buf_view_destroy(view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800320
321 meta->src.reloc_target = (intptr_t) writer;
322 meta->src.reloc_offset = 0;
323 meta->src.reloc_flags = INTEL_CMD_RELOC_TARGET_IS_WRITER;
324}
325
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800326static void cmd_meta_set_ds_view(struct intel_cmd *cmd,
327 const struct intel_img *img,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600328 uint32_t lod, uint32_t layer,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800329 struct intel_cmd_meta *meta)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800330{
Chia-I Wuc278df82015-07-07 11:50:03 +0800331 VkAttachmentViewCreateInfo info;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800332 struct intel_att_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600333 VkResult ret;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800334
335 memset(&info, 0, sizeof(info));
Chia-I Wuc278df82015-07-07 11:50:03 +0800336 info.sType = VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO;
Tony Barbourde4124d2015-07-03 10:33:54 -0600337 info.image.handle = (uint64_t)img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800338 info.mipLevel = lod;
339 info.baseArraySlice = layer;
340 info.arraySize = 1;
341
Chia-I Wuc278df82015-07-07 11:50:03 +0800342 ret = intel_att_view_create(cmd->dev, &info, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600343 if (ret != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700344 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800345 return;
346 }
347
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800348 meta->ds.view = view;
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800349}
350
351static void cmd_meta_set_ds_state(struct intel_cmd *cmd,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600352 VkImageAspect aspect,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600353 uint32_t stencil_ref,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800354 struct intel_cmd_meta *meta)
355{
Tony Barbourfa6cac72015-01-16 14:27:35 -0700356 meta->ds.stencil_ref = stencil_ref;
357 meta->ds.aspect = aspect;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800358}
359
360static enum intel_dev_meta_shader get_shader_id(const struct intel_dev *dev,
361 const struct intel_img *img,
362 bool copy_array)
363{
364 enum intel_dev_meta_shader shader_id;
365
366 switch (img->type) {
Tony Barbour8205d902015-04-16 15:59:00 -0600367 case VK_IMAGE_TYPE_1D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800368 shader_id = (copy_array) ?
369 INTEL_DEV_META_FS_COPY_1D_ARRAY : INTEL_DEV_META_FS_COPY_1D;
370 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600371 case VK_IMAGE_TYPE_2D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800372 shader_id = (img->samples > 1) ? INTEL_DEV_META_FS_COPY_2D_MS :
373 (copy_array) ? INTEL_DEV_META_FS_COPY_2D_ARRAY :
374 INTEL_DEV_META_FS_COPY_2D;
375 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600376 case VK_IMAGE_TYPE_3D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800377 default:
378 shader_id = INTEL_DEV_META_FS_COPY_2D_ARRAY;
379 break;
380 }
381
382 return shader_id;
383}
384
Chia-I Wuf3a27252014-11-24 15:27:01 +0800385static bool cmd_meta_mem_dword_aligned(const struct intel_cmd *cmd,
Tony Barbour8205d902015-04-16 15:59:00 -0600386 VkDeviceSize src_offset,
387 VkDeviceSize dst_offset,
388 VkDeviceSize size)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800389{
Chia-I Wuf3a27252014-11-24 15:27:01 +0800390 return !((src_offset | dst_offset | size) & 0x3);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800391}
392
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600393static VkFormat cmd_meta_img_raw_format(const struct intel_cmd *cmd,
394 VkFormat format)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800395{
Chia-I Wuffdde352014-12-20 15:12:16 +0800396 switch (icd_format_get_size(format)) {
397 case 1:
Tony Barbour8205d902015-04-16 15:59:00 -0600398 format = VK_FORMAT_R8_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800399 break;
400 case 2:
Tony Barbour8205d902015-04-16 15:59:00 -0600401 format = VK_FORMAT_R16_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800402 break;
403 case 4:
Tony Barbour8205d902015-04-16 15:59:00 -0600404 format = VK_FORMAT_R32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800405 break;
406 case 8:
Tony Barbour8205d902015-04-16 15:59:00 -0600407 format = VK_FORMAT_R32G32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800408 break;
409 case 16:
Tony Barbour8205d902015-04-16 15:59:00 -0600410 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800411 break;
412 default:
413 assert(!"unsupported image format for raw blit op");
Tony Barbour8205d902015-04-16 15:59:00 -0600414 format = VK_FORMAT_UNDEFINED;
Chia-I Wuffdde352014-12-20 15:12:16 +0800415 break;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800416 }
417
418 return format;
419}
420
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600421ICD_EXPORT void VKAPI vkCmdCopyBuffer(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600422 VkCmdBuffer cmdBuffer,
423 VkBuffer srcBuffer,
424 VkBuffer destBuffer,
425 uint32_t regionCount,
426 const VkBufferCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800427{
428 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800429 struct intel_buf *src = intel_buf(srcBuffer);
430 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800431 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600432 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600433 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800434
435 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800436 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800437
Chia-I Wuc14d1562014-10-17 09:49:22 +0800438 meta.height = 1;
439 meta.samples = 1;
440
Tony Barbour8205d902015-04-16 15:59:00 -0600441 format = VK_FORMAT_UNDEFINED;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800442
443 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600444 const VkBufferCopy *region = &pRegions[i];
445 VkFormat fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800446
Chia-I Wuf3a27252014-11-24 15:27:01 +0800447 meta.src.x = region->srcOffset;
448 meta.dst.x = region->destOffset;
449 meta.width = region->copySize;
450
451 if (cmd_meta_mem_dword_aligned(cmd, region->srcOffset,
452 region->destOffset, region->copySize)) {
453 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
454 meta.src.x /= 4;
455 meta.dst.x /= 4;
456 meta.width /= 4;
457
458 /*
459 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to
460 * be 16
461 */
Tony Barbour8205d902015-04-16 15:59:00 -0600462 fmt = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800463 } else {
464 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600465 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
466 &cmd->obj.base, 0, 0,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600467 "unaligned vkCmdCopyBuffer unsupported");
468 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800469 continue;
470 }
471
472 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM_UNALIGNED;
473
474 /*
475 * INTEL_DEV_META_VS_COPY_MEM_UNALIGNED is untyped but expects the
476 * stride to be 4
477 */
Tony Barbour8205d902015-04-16 15:59:00 -0600478 fmt = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800479 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800480
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700481 if (format != fmt) {
482 format = fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800483
Chia-I Wu714df452015-01-01 07:55:04 +0800484 cmd_meta_set_src_for_buf(cmd, src, format, &meta);
485 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800486 }
487
Chia-I Wuc14d1562014-10-17 09:49:22 +0800488 cmd_draw_meta(cmd, &meta);
489 }
490}
491
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600492ICD_EXPORT void VKAPI vkCmdCopyImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600493 VkCmdBuffer cmdBuffer,
494 VkImage srcImage,
495 VkImageLayout srcImageLayout,
496 VkImage destImage,
497 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600498 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600499 const VkImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800500{
501 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
502 struct intel_img *src = intel_img(srcImage);
503 struct intel_img *dst = intel_img(destImage);
504 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600505 VkFormat raw_format;
Cody Northrop30a2b462015-02-10 09:28:30 -0700506 bool raw_copy = false;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600507 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800508
509 if (src->type != dst->type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600510 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800511 return;
512 }
513
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700514 if (src->layout.format == dst->layout.format) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800515 raw_copy = true;
516 raw_format = cmd_meta_img_raw_format(cmd, src->layout.format);
517 } else if (icd_format_is_compressed(src->layout.format) ||
518 icd_format_is_compressed(dst->layout.format)) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600519 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800520 return;
521 }
522
523 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800524 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800525
526 cmd_meta_set_src_for_img(cmd, src,
527 (raw_copy) ? raw_format : src->layout.format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600528 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800529
530 meta.samples = dst->samples;
531
532 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600533 const VkImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600534 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800535
536 meta.shader_id = get_shader_id(cmd->dev, src,
537 (region->extent.depth > 1));
538
539 meta.src.lod = region->srcSubresource.mipLevel;
540 meta.src.layer = region->srcSubresource.arraySlice +
541 region->srcOffset.z;
542 meta.src.x = region->srcOffset.x;
543 meta.src.y = region->srcOffset.y;
544
545 meta.dst.lod = region->destSubresource.mipLevel;
546 meta.dst.layer = region->destSubresource.arraySlice +
547 region->destOffset.z;
548 meta.dst.x = region->destOffset.x;
549 meta.dst.y = region->destOffset.y;
550
551 meta.width = region->extent.width;
552 meta.height = region->extent.height;
553
Chia-I Wueccc7682015-03-24 14:15:30 +0800554 if (raw_copy) {
555 const uint32_t block_width =
556 icd_format_get_block_width(raw_format);
557
558 meta.src.x /= block_width;
559 meta.src.y /= block_width;
560 meta.dst.x /= block_width;
561 meta.dst.y /= block_width;
562 meta.width /= block_width;
563 meta.height /= block_width;
564 }
565
Chia-I Wuc14d1562014-10-17 09:49:22 +0800566 for (j = 0; j < region->extent.depth; j++) {
567 cmd_meta_set_dst_for_img(cmd, dst,
568 (raw_copy) ? raw_format : dst->layout.format,
569 meta.dst.lod, meta.dst.layer, &meta);
570
571 cmd_draw_meta(cmd, &meta);
572
573 meta.src.layer++;
574 meta.dst.layer++;
575 }
576 }
577}
578
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600579ICD_EXPORT void VKAPI vkCmdBlitImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600580 VkCmdBuffer cmdBuffer,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500581 VkImage srcImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600582 VkImageLayout srcImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500583 VkImage destImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600584 VkImageLayout destImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500585 uint32_t regionCount,
586 const VkImageBlit* pRegions,
587 VkTexFilter filter)
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600588{
589 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
590
591 /*
592 * TODO: Implement actual blit function.
593 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600594 cmd_fail(cmd, VK_ERROR_UNAVAILABLE);
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600595}
596
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600597ICD_EXPORT void VKAPI vkCmdCopyBufferToImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600598 VkCmdBuffer cmdBuffer,
599 VkBuffer srcBuffer,
600 VkImage destImage,
601 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600602 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600603 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800604{
605 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800606 struct intel_buf *buf = intel_buf(srcBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800607 struct intel_img *img = intel_img(destImage);
608 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600609 VkFormat format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800610 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800611
612 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800613 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800614
615 meta.shader_id = INTEL_DEV_META_FS_COPY_MEM_TO_IMG;
616 meta.samples = img->samples;
617
618 format = cmd_meta_img_raw_format(cmd, img->layout.format);
Mike Stroyanbc4e2ed2015-03-24 15:10:24 -0600619 block_width = icd_format_get_block_width(img->layout.format);
Chia-I Wu714df452015-01-01 07:55:04 +0800620 cmd_meta_set_src_for_buf(cmd, buf, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800621
622 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600623 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600624 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800625
Chia-I Wu714df452015-01-01 07:55:04 +0800626 meta.src.x = region->bufferOffset / icd_format_get_size(format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800627
628 meta.dst.lod = region->imageSubresource.mipLevel;
629 meta.dst.layer = region->imageSubresource.arraySlice +
630 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800631 meta.dst.x = region->imageOffset.x / block_width;
632 meta.dst.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800633
Chia-I Wueccc7682015-03-24 14:15:30 +0800634 meta.width = region->imageExtent.width / block_width;
635 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800636
637 for (j = 0; j < region->imageExtent.depth; j++) {
638 cmd_meta_set_dst_for_img(cmd, img, format,
639 meta.dst.lod, meta.dst.layer, &meta);
640
641 cmd_draw_meta(cmd, &meta);
642
643 meta.src.x += meta.width * meta.height;
644 meta.dst.layer++;
645 }
646 }
647}
648
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600649ICD_EXPORT void VKAPI vkCmdCopyImageToBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600650 VkCmdBuffer cmdBuffer,
651 VkImage srcImage,
652 VkImageLayout srcImageLayout,
653 VkBuffer destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600654 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600655 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800656{
657 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
658 struct intel_img *img = intel_img(srcImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800659 struct intel_buf *buf = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800660 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600661 VkFormat img_format, buf_format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800662 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800663
664 memset(&meta, 0, sizeof(meta));
Chia-I Wua44b6482014-12-20 14:58:01 +0800665 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800666
Chia-I Wua44b6482014-12-20 14:58:01 +0800667 img_format = cmd_meta_img_raw_format(cmd, img->layout.format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800668 block_width = icd_format_get_block_width(img_format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800669
Chia-I Wu714df452015-01-01 07:55:04 +0800670 /* buf_format is ignored by hw, but we derive stride from it */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700671 switch (img_format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600672 case VK_FORMAT_R8_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800673 meta.shader_id = INTEL_DEV_META_VS_COPY_R8_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600674 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800675 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600676 case VK_FORMAT_R16_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800677 meta.shader_id = INTEL_DEV_META_VS_COPY_R16_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600678 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800679 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600680 case VK_FORMAT_R32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800681 meta.shader_id = INTEL_DEV_META_VS_COPY_R32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600682 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800683 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600684 case VK_FORMAT_R32G32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800685 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600686 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800687 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600688 case VK_FORMAT_R32G32B32A32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800689 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32B32A32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600690 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800691 break;
692 default:
Tony Barbour8205d902015-04-16 15:59:00 -0600693 img_format = VK_FORMAT_UNDEFINED;
694 buf_format = VK_FORMAT_UNDEFINED;
Chia-I Wua44b6482014-12-20 14:58:01 +0800695 break;
696 }
697
Tony Barbour8205d902015-04-16 15:59:00 -0600698 if (img_format == VK_FORMAT_UNDEFINED ||
Chia-I Wua44b6482014-12-20 14:58:01 +0800699 (cmd_gen(cmd) == INTEL_GEN(6) &&
700 icd_format_get_size(img_format) < 4)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600701 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
702 &cmd->obj.base, 0, 0,
703 "vkCmdCopyImageToBuffer with bpp %d unsupported",
704 icd_format_get_size(img->layout.format));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600705 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wua44b6482014-12-20 14:58:01 +0800706 return;
707 }
708
709 cmd_meta_set_src_for_img(cmd, img, img_format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600710 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800711 cmd_meta_set_dst_for_buf(cmd, buf, buf_format, &meta);
Chia-I Wua44b6482014-12-20 14:58:01 +0800712
Chia-I Wuc14d1562014-10-17 09:49:22 +0800713 meta.samples = 1;
714
715 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600716 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600717 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800718
Chia-I Wuc14d1562014-10-17 09:49:22 +0800719 meta.src.lod = region->imageSubresource.mipLevel;
720 meta.src.layer = region->imageSubresource.arraySlice +
721 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800722 meta.src.x = region->imageOffset.x / block_width;
723 meta.src.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800724
Chia-I Wu714df452015-01-01 07:55:04 +0800725 meta.dst.x = region->bufferOffset / icd_format_get_size(img_format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800726 meta.width = region->imageExtent.width / block_width;
727 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800728
729 for (j = 0; j < region->imageExtent.depth; j++) {
730 cmd_draw_meta(cmd, &meta);
731
732 meta.src.layer++;
Chia-I Wua44b6482014-12-20 14:58:01 +0800733 meta.dst.x += meta.width * meta.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800734 }
735 }
736}
737
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600738ICD_EXPORT void VKAPI vkCmdUpdateBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600739 VkCmdBuffer cmdBuffer,
740 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600741 VkDeviceSize destOffset,
742 VkDeviceSize dataSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600743 const uint32_t* pData)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800744{
745 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800746 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800747 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600748 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800749 uint32_t *ptr;
750 uint32_t offset;
751
Chia-I Wuf3a27252014-11-24 15:27:01 +0800752 /* must be 4-byte aligned */
753 if ((destOffset | dataSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600754 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800755 return;
756 }
757
Chia-I Wuc14d1562014-10-17 09:49:22 +0800758 /* write to dynamic state writer first */
759 offset = cmd_state_pointer(cmd, INTEL_CMD_ITEM_BLOB, 32,
760 (dataSize + 3) / 4, &ptr);
761 memcpy(ptr, pData, dataSize);
762
Chia-I Wuc14d1562014-10-17 09:49:22 +0800763 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800764 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800765
Chia-I Wuf3a27252014-11-24 15:27:01 +0800766 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
767
768 meta.src.x = offset / 4;
769 meta.dst.x = destOffset / 4;
770 meta.width = dataSize / 4;
771 meta.height = 1;
772 meta.samples = 1;
773
774 /*
775 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to be 16
776 */
Tony Barbour8205d902015-04-16 15:59:00 -0600777 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800778
779 cmd_meta_set_src_for_writer(cmd, INTEL_CMD_WRITER_STATE,
780 offset + dataSize, format, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800781 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800782
Chia-I Wuc14d1562014-10-17 09:49:22 +0800783 cmd_draw_meta(cmd, &meta);
784}
785
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600786ICD_EXPORT void VKAPI vkCmdFillBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600787 VkCmdBuffer cmdBuffer,
788 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600789 VkDeviceSize destOffset,
790 VkDeviceSize fillSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600791 uint32_t data)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800792{
793 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800794 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800795 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600796 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800797
798 /* must be 4-byte aligned */
799 if ((destOffset | fillSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600800 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800801 return;
802 }
803
804 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800805 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800806
Chia-I Wuf3a27252014-11-24 15:27:01 +0800807 meta.shader_id = INTEL_DEV_META_VS_FILL_MEM;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800808
809 meta.clear_val[0] = data;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800810
Chia-I Wuf3a27252014-11-24 15:27:01 +0800811 meta.dst.x = destOffset / 4;
812 meta.width = fillSize / 4;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800813 meta.height = 1;
814 meta.samples = 1;
815
Chia-I Wuf3a27252014-11-24 15:27:01 +0800816 /*
817 * INTEL_DEV_META_VS_FILL_MEM is untyped but expects the stride to be 16
818 */
Tony Barbour8205d902015-04-16 15:59:00 -0600819 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800820
Chia-I Wu714df452015-01-01 07:55:04 +0800821 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800822
Chia-I Wuc14d1562014-10-17 09:49:22 +0800823 cmd_draw_meta(cmd, &meta);
824}
825
826static void cmd_meta_clear_image(struct intel_cmd *cmd,
827 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600828 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800829 struct intel_cmd_meta *meta,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600830 const VkImageSubresourceRange *range)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800831{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600832 uint32_t mip_levels, array_size;
833 uint32_t i, j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800834
835 if (range->baseMipLevel >= img->mip_levels ||
836 range->baseArraySlice >= img->array_size)
837 return;
838
839 mip_levels = img->mip_levels - range->baseMipLevel;
840 if (mip_levels > range->mipLevels)
841 mip_levels = range->mipLevels;
842
843 array_size = img->array_size - range->baseArraySlice;
844 if (array_size > range->arraySize)
845 array_size = range->arraySize;
846
Chia-I Wuc14d1562014-10-17 09:49:22 +0800847 for (i = 0; i < mip_levels; i++) {
Chia-I Wufaaed472014-10-28 14:17:43 +0800848 meta->dst.lod = range->baseMipLevel + i;
849 meta->dst.layer = range->baseArraySlice;
850
Chia-I Wu73520ac2015-02-19 11:17:45 -0700851 /* TODO INTEL_CMD_META_DS_HIZ_CLEAR requires 8x4 aligned rectangle */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800852 meta->width = u_minify(img->layout.width0, meta->dst.lod);
853 meta->height = u_minify(img->layout.height0, meta->dst.lod);
854
Chia-I Wu73520ac2015-02-19 11:17:45 -0700855 if (meta->ds.op != INTEL_CMD_META_DS_NOP &&
856 !intel_img_can_enable_hiz(img, meta->dst.lod))
857 continue;
858
Chia-I Wuc14d1562014-10-17 09:49:22 +0800859 for (j = 0; j < array_size; j++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600860 if (range->aspect == VK_IMAGE_ASPECT_COLOR) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800861 cmd_meta_set_dst_for_img(cmd, img, format,
862 meta->dst.lod, meta->dst.layer, meta);
863
864 cmd_draw_meta(cmd, meta);
865 } else {
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800866 cmd_meta_set_ds_view(cmd, img, meta->dst.lod,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800867 meta->dst.layer, meta);
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800868 cmd_meta_set_ds_state(cmd, range->aspect,
869 meta->clear_val[1], meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800870
871 cmd_draw_meta(cmd, meta);
872
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800873 intel_att_view_destroy(meta->ds.view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800874 }
875
876 meta->dst.layer++;
877 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800878 }
879}
880
Chia-I Wu73520ac2015-02-19 11:17:45 -0700881void cmd_meta_ds_op(struct intel_cmd *cmd,
882 enum intel_cmd_meta_ds_op op,
883 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600884 const VkImageSubresourceRange *range)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700885{
886 struct intel_cmd_meta meta;
887
888 if (img->layout.aux != INTEL_LAYOUT_AUX_HIZ)
889 return;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600890 if (range->aspect != VK_IMAGE_ASPECT_DEPTH)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700891 return;
892
893 memset(&meta, 0, sizeof(meta));
894 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
895 meta.samples = img->samples;
896
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600897 meta.ds.aspect = VK_IMAGE_ASPECT_DEPTH;
Chia-I Wu73520ac2015-02-19 11:17:45 -0700898 meta.ds.op = op;
899 meta.ds.optimal = true;
900
901 cmd_meta_clear_image(cmd, img, img->layout.format, &meta, range);
902}
903
Chris Forbesfff9bf42015-06-15 15:26:19 +1200904void cmd_meta_clear_color_image(
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600905 VkCmdBuffer cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -0600906 struct intel_img *img,
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600907 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200908 const VkClearColorValue *pClearColor,
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600909 uint32_t rangeCount,
910 const VkImageSubresourceRange *pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800911{
912 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800913 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600914 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600915 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800916
917 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800918 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800919
920 meta.shader_id = INTEL_DEV_META_FS_CLEAR_COLOR;
921 meta.samples = img->samples;
922
Chris Forbese3105972015-06-24 14:34:53 +1200923 meta.clear_val[0] = pClearColor->u32[0];
924 meta.clear_val[1] = pClearColor->u32[1];
925 meta.clear_val[2] = pClearColor->u32[2];
926 meta.clear_val[3] = pClearColor->u32[3];
927 format = img->layout.format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800928
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600929 for (i = 0; i < rangeCount; i++) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800930 cmd_meta_clear_image(cmd, img, format, &meta, &pRanges[i]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600931 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800932}
933
Chris Forbesfff9bf42015-06-15 15:26:19 +1200934ICD_EXPORT void VKAPI vkCmdClearColorImage(
935 VkCmdBuffer cmdBuffer,
936 VkImage image,
937 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200938 const VkClearColorValue *pClearColor,
Chris Forbesfff9bf42015-06-15 15:26:19 +1200939 uint32_t rangeCount,
940 const VkImageSubresourceRange *pRanges)
941{
Tony Barbourde4124d2015-07-03 10:33:54 -0600942 struct intel_img *img = intel_img(image);
943 cmd_meta_clear_color_image(cmdBuffer, img, imageLayout, pClearColor, rangeCount, pRanges);
Chris Forbesfff9bf42015-06-15 15:26:19 +1200944}
945
Chris Forbes4cf9d102015-06-22 18:46:05 +1200946void cmd_meta_clear_depth_stencil_image(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600947 VkCmdBuffer cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -0600948 struct intel_img* img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600949 VkImageLayout imageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600950 float depth,
951 uint32_t stencil,
952 uint32_t rangeCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600953 const VkImageSubresourceRange* pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800954{
955 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800956 struct intel_cmd_meta meta;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600957 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800958
959 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800960 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800961
962 meta.shader_id = INTEL_DEV_META_FS_CLEAR_DEPTH;
963 meta.samples = img->samples;
964
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800965 meta.clear_val[0] = u_fui(depth);
966 meta.clear_val[1] = stencil;
967
Mark Lobodzinski4e97c452015-07-01 15:18:26 -0600968 if (imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600969 imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) {
Courtney Goeltzenleuchter3b61a592015-03-30 15:07:58 -0600970 meta.ds.optimal = true;
971 }
Chia-I Wu73520ac2015-02-19 11:17:45 -0700972
Chia-I Wuc14d1562014-10-17 09:49:22 +0800973 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600974 const VkImageSubresourceRange *range = &pRanges[i];
Chia-I Wuc14d1562014-10-17 09:49:22 +0800975
Chia-I Wuc14d1562014-10-17 09:49:22 +0800976 cmd_meta_clear_image(cmd, img, img->layout.format,
977 &meta, range);
978 }
979}
980
Chris Forbes4cf9d102015-06-22 18:46:05 +1200981ICD_EXPORT void VKAPI vkCmdClearDepthStencilImage(
982 VkCmdBuffer cmdBuffer,
983 VkImage image,
984 VkImageLayout imageLayout,
985 float depth,
986 uint32_t stencil,
987 uint32_t rangeCount,
988 const VkImageSubresourceRange* pRanges)
989{
Tony Barbourde4124d2015-07-03 10:33:54 -0600990 struct intel_img *img = intel_img(image);
991 cmd_meta_clear_depth_stencil_image(cmdBuffer, img, imageLayout, depth, stencil, rangeCount, pRanges);
Chris Forbes4cf9d102015-06-22 18:46:05 +1200992}
993
Chris Forbes2951d7d2015-06-22 17:21:59 +1200994ICD_EXPORT void VKAPI vkCmdClearColorAttachment(
995 VkCmdBuffer cmdBuffer,
996 uint32_t colorAttachment,
997 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200998 const VkClearColorValue *pColor,
Chris Forbes2951d7d2015-06-22 17:21:59 +1200999 uint32_t rectCount,
1000 const VkRect3D *pRects)
1001{
1002 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wubdeed152015-07-09 12:16:29 +08001003 const struct intel_render_pass_subpass *subpass =
1004 cmd->bind.render_pass_subpass;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001005 const struct intel_fb *fb = cmd->bind.fb;
Chia-I Wubdeed152015-07-09 12:16:29 +08001006 const struct intel_att_view *view =
1007 fb->views[subpass->color_indices[colorAttachment]];
Chris Forbes1e16cb82015-06-24 12:05:30 +12001008
1009 /* Convert each rect3d to clear into a subresource clear.
1010 * TODO: this currently only supports full layer clears --
1011 * cmd_meta_clear_color_image does not provide a means to
1012 * specify the xy bounds.
1013 */
1014 for (uint32_t i = 0; i < rectCount; i++) {
Chris Forbes1e16cb82015-06-24 12:05:30 +12001015 VkImageSubresourceRange range = {
1016 VK_IMAGE_ASPECT_COLOR,
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001017 view->mipLevel,
Chris Forbes1e16cb82015-06-24 12:05:30 +12001018 1,
1019 pRects[i].offset.z,
1020 pRects[i].extent.depth
1021 };
1022
Tony Barbourde4124d2015-07-03 10:33:54 -06001023 cmd_meta_clear_color_image(cmdBuffer, view->img,
Chris Forbes1e16cb82015-06-24 12:05:30 +12001024 imageLayout,
1025 pColor,
1026 1,
1027 &range);
1028 }
Chris Forbes2951d7d2015-06-22 17:21:59 +12001029}
1030
1031ICD_EXPORT void VKAPI vkCmdClearDepthStencilAttachment(
1032 VkCmdBuffer cmdBuffer,
1033 VkImageAspectFlags imageAspectMask,
1034 VkImageLayout imageLayout,
1035 float depth,
1036 uint32_t stencil,
1037 uint32_t rectCount,
1038 const VkRect3D *pRects)
1039{
1040 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wubdeed152015-07-09 12:16:29 +08001041 const struct intel_render_pass_subpass *subpass =
1042 cmd->bind.render_pass_subpass;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001043 const struct intel_fb *fb = cmd->bind.fb;
Chia-I Wubdeed152015-07-09 12:16:29 +08001044 const struct intel_att_view *view = fb->views[subpass->ds_index];
Chris Forbes1e16cb82015-06-24 12:05:30 +12001045
1046 /* Convert each rect3d to clear into a subresource clear.
1047 * TODO: this currently only supports full layer clears --
1048 * cmd_meta_clear_depth_stencil_image does not provide a means to
1049 * specify the xy bounds.
1050 */
1051 for (uint32_t i = 0; i < rectCount; i++) {
Chris Forbes1e16cb82015-06-24 12:05:30 +12001052 VkImageSubresourceRange range = {
1053 VK_IMAGE_ASPECT_DEPTH,
1054 0, /* ds->mipLevel, */
1055 1,
1056 pRects[i].offset.z,
1057 pRects[i].extent.depth
1058 };
1059
1060 if (imageAspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001061 cmd_meta_clear_depth_stencil_image(cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -06001062 view->img, imageLayout,
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001063 depth, stencil, 1, &range);
Chris Forbes1e16cb82015-06-24 12:05:30 +12001064 }
1065 if (imageAspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
1066 range.aspect = VK_IMAGE_ASPECT_STENCIL;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001067 cmd_meta_clear_depth_stencil_image(cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -06001068 view->img, imageLayout,
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001069 depth, stencil, 1, &range);
Chris Forbes1e16cb82015-06-24 12:05:30 +12001070 }
1071 }
Chris Forbes2951d7d2015-06-22 17:21:59 +12001072}
1073
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001074ICD_EXPORT void VKAPI vkCmdResolveImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001075 VkCmdBuffer cmdBuffer,
1076 VkImage srcImage,
1077 VkImageLayout srcImageLayout,
1078 VkImage destImage,
1079 VkImageLayout destImageLayout,
Tony Barbour11f74372015-04-13 15:02:52 -06001080 uint32_t regionCount,
1081 const VkImageResolve* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +08001082{
1083 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1084 struct intel_img *src = intel_img(srcImage);
1085 struct intel_img *dst = intel_img(destImage);
1086 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001087 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001088 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001089
1090 if (src->samples <= 1 || dst->samples > 1 ||
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -07001091 src->layout.format != dst->layout.format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001092 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001093 return;
1094 }
1095
1096 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +08001097 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001098
1099 switch (src->samples) {
1100 case 2:
1101 default:
1102 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_2X;
1103 break;
1104 case 4:
1105 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_4X;
1106 break;
1107 case 8:
1108 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_8X;
1109 break;
1110 case 16:
1111 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_16X;
1112 break;
1113 }
1114
1115 meta.samples = 1;
1116
1117 format = cmd_meta_img_raw_format(cmd, src->layout.format);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001118 cmd_meta_set_src_for_img(cmd, src, format, VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001119
Tony Barbour11f74372015-04-13 15:02:52 -06001120 for (i = 0; i < regionCount; i++) {
1121 const VkImageResolve *region = &pRegions[i];
Tony Barboure9f99942015-04-13 13:11:12 -06001122 int arraySlice;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001123
Tony Barbour11f74372015-04-13 15:02:52 -06001124 for(arraySlice = 0; arraySlice < region->extent.depth; arraySlice++) {
1125 meta.src.lod = region->srcSubresource.mipLevel;
1126 meta.src.layer = region->srcSubresource.arraySlice + arraySlice;
1127 meta.src.x = region->srcOffset.x;
1128 meta.src.y = region->srcOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001129
Tony Barbour11f74372015-04-13 15:02:52 -06001130 meta.dst.lod = region->destSubresource.mipLevel;
1131 meta.dst.layer = region->destSubresource.arraySlice + arraySlice;
1132 meta.dst.x = region->destOffset.x;
1133 meta.dst.y = region->destOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001134
Tony Barbour11f74372015-04-13 15:02:52 -06001135 meta.width = region->extent.width;
1136 meta.height = region->extent.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001137
Tony Barboure9f99942015-04-13 13:11:12 -06001138 cmd_meta_set_dst_for_img(cmd, dst, format,
1139 meta.dst.lod, meta.dst.layer, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001140
Tony Barboure9f99942015-04-13 13:11:12 -06001141 cmd_draw_meta(cmd, &meta);
1142 }
Chia-I Wuc14d1562014-10-17 09:49:22 +08001143 }
1144}