blob: 90a3e2d70317a060528fb24b397b1212541c2f63 [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;
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600129 struct intel_img_view tmp_view;
130 struct intel_img_view *view = &tmp_view;
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 Goeltzenleuchterec167682015-08-28 16:47:15 -0600170 info.subresourceRange.mipLevels = VK_REMAINING_MIP_LEVELS;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600171 info.subresourceRange.baseArrayLayer = 0;
172 info.subresourceRange.arraySize = VK_REMAINING_ARRAY_LAYERS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800173
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600174 intel_img_view_init(cmd->dev, &info, view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800175
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
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600186 /* Don't need tmp_view anymore */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800187}
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 Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600257 struct intel_att_view tmp_view;
258 struct intel_att_view *view = &tmp_view;
259 VkImageViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800260
261 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600262 info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tony Barbourde4124d2015-07-03 10:33:54 -0600263 info.image.handle = (uint64_t) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800264 info.format = format;
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600265 info.subresourceRange.baseMipLevel = lod;
266 info.subresourceRange.mipLevels = 1;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600267 info.subresourceRange.baseArrayLayer = layer;
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600268 info.subresourceRange.arraySize = 1;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800269
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600270 intel_att_view_init(cmd->dev, &info, view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800271
272 meta->dst.valid = true;
273
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800274 memcpy(meta->dst.surface, view->att_cmd,
275 sizeof(view->att_cmd[0]) * view->cmd_len);
276 meta->dst.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800277
278 meta->dst.reloc_target = (intptr_t) img->obj.mem->bo;
279 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800280 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800281
Chia-I Wu83084ba2014-12-04 12:49:52 +0800282 if (icd_format_is_compressed(img->layout.format))
283 cmd_meta_adjust_compressed_dst(cmd, img, meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800284}
285
286static void cmd_meta_set_src_for_writer(struct intel_cmd *cmd,
287 enum intel_cmd_writer_type writer,
Tony Barbour8205d902015-04-16 15:59:00 -0600288 VkDeviceSize size,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600289 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800290 struct intel_cmd_meta *meta)
291{
Chia-I Wu714df452015-01-01 07:55:04 +0800292 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600293 VkResult res;
Tony Barbourde4124d2015-07-03 10:33:54 -0600294 VkBuffer localbuf;
295 localbuf.handle = 0;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800296
Tony Barbourde4124d2015-07-03 10:33:54 -0600297 res = cmd_meta_create_buf_view(cmd, localbuf,
Chia-I Wu714df452015-01-01 07:55:04 +0800298 size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600299 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700300 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800301 return;
302 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800303
304 meta->src.valid = true;
305
Chia-I Wu714df452015-01-01 07:55:04 +0800306 memcpy(meta->src.surface, view->cmd,
307 sizeof(view->cmd[0]) * view->cmd_len);
308 meta->src.surface_len = view->cmd_len;
309
310 intel_buf_view_destroy(view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800311
312 meta->src.reloc_target = (intptr_t) writer;
313 meta->src.reloc_offset = 0;
314 meta->src.reloc_flags = INTEL_CMD_RELOC_TARGET_IS_WRITER;
315}
316
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800317static void cmd_meta_set_ds_view(struct intel_cmd *cmd,
318 const struct intel_img *img,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600319 uint32_t lod, uint32_t layer,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800320 struct intel_cmd_meta *meta)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800321{
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600322 VkImageViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800323
324 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600325 info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tony Barbourde4124d2015-07-03 10:33:54 -0600326 info.image.handle = (uint64_t)img;
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600327 info.subresourceRange.baseMipLevel = lod;
328 info.subresourceRange.mipLevels = 1;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600329 info.subresourceRange.baseArrayLayer = layer;
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600330 info.subresourceRange.arraySize = 1;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800331
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600332 intel_att_view_init(cmd->dev, &info, &meta->ds.view);
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800333}
334
335static void cmd_meta_set_ds_state(struct intel_cmd *cmd,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600336 VkImageAspect aspect,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600337 uint32_t stencil_ref,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800338 struct intel_cmd_meta *meta)
339{
Tony Barbourfa6cac72015-01-16 14:27:35 -0700340 meta->ds.stencil_ref = stencil_ref;
341 meta->ds.aspect = aspect;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800342}
343
344static enum intel_dev_meta_shader get_shader_id(const struct intel_dev *dev,
345 const struct intel_img *img,
346 bool copy_array)
347{
348 enum intel_dev_meta_shader shader_id;
349
350 switch (img->type) {
Tony Barbour8205d902015-04-16 15:59:00 -0600351 case VK_IMAGE_TYPE_1D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800352 shader_id = (copy_array) ?
353 INTEL_DEV_META_FS_COPY_1D_ARRAY : INTEL_DEV_META_FS_COPY_1D;
354 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600355 case VK_IMAGE_TYPE_2D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800356 shader_id = (img->samples > 1) ? INTEL_DEV_META_FS_COPY_2D_MS :
357 (copy_array) ? INTEL_DEV_META_FS_COPY_2D_ARRAY :
358 INTEL_DEV_META_FS_COPY_2D;
359 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600360 case VK_IMAGE_TYPE_3D:
Chia-I Wuc14d1562014-10-17 09:49:22 +0800361 default:
362 shader_id = INTEL_DEV_META_FS_COPY_2D_ARRAY;
363 break;
364 }
365
366 return shader_id;
367}
368
Chia-I Wuf3a27252014-11-24 15:27:01 +0800369static bool cmd_meta_mem_dword_aligned(const struct intel_cmd *cmd,
Tony Barbour8205d902015-04-16 15:59:00 -0600370 VkDeviceSize src_offset,
371 VkDeviceSize dst_offset,
372 VkDeviceSize size)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800373{
Chia-I Wuf3a27252014-11-24 15:27:01 +0800374 return !((src_offset | dst_offset | size) & 0x3);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800375}
376
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600377static VkFormat cmd_meta_img_raw_format(const struct intel_cmd *cmd,
378 VkFormat format)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800379{
Chia-I Wuffdde352014-12-20 15:12:16 +0800380 switch (icd_format_get_size(format)) {
381 case 1:
Tony Barbour8205d902015-04-16 15:59:00 -0600382 format = VK_FORMAT_R8_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800383 break;
384 case 2:
Tony Barbour8205d902015-04-16 15:59:00 -0600385 format = VK_FORMAT_R16_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800386 break;
387 case 4:
Tony Barbour8205d902015-04-16 15:59:00 -0600388 format = VK_FORMAT_R32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800389 break;
390 case 8:
Tony Barbour8205d902015-04-16 15:59:00 -0600391 format = VK_FORMAT_R32G32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800392 break;
393 case 16:
Tony Barbour8205d902015-04-16 15:59:00 -0600394 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800395 break;
396 default:
397 assert(!"unsupported image format for raw blit op");
Tony Barbour8205d902015-04-16 15:59:00 -0600398 format = VK_FORMAT_UNDEFINED;
Chia-I Wuffdde352014-12-20 15:12:16 +0800399 break;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800400 }
401
402 return format;
403}
404
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600405ICD_EXPORT void VKAPI vkCmdCopyBuffer(
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600406 VkCmdBuffer cmdBuffer,
407 VkBuffer srcBuffer,
408 VkBuffer destBuffer,
409 uint32_t regionCount,
410 const VkBufferCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800411{
412 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800413 struct intel_buf *src = intel_buf(srcBuffer);
414 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800415 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600416 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600417 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800418
419 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800420 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800421
Chia-I Wuc14d1562014-10-17 09:49:22 +0800422 meta.height = 1;
423 meta.samples = 1;
424
Tony Barbour8205d902015-04-16 15:59:00 -0600425 format = VK_FORMAT_UNDEFINED;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800426
427 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600428 const VkBufferCopy *region = &pRegions[i];
429 VkFormat fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800430
Chia-I Wuf3a27252014-11-24 15:27:01 +0800431 meta.src.x = region->srcOffset;
432 meta.dst.x = region->destOffset;
433 meta.width = region->copySize;
434
435 if (cmd_meta_mem_dword_aligned(cmd, region->srcOffset,
436 region->destOffset, region->copySize)) {
437 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
438 meta.src.x /= 4;
439 meta.dst.x /= 4;
440 meta.width /= 4;
441
442 /*
443 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to
444 * be 16
445 */
Tony Barbour8205d902015-04-16 15:59:00 -0600446 fmt = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800447 } else {
448 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600449 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
450 &cmd->obj.base, 0, 0,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600451 "unaligned vkCmdCopyBuffer unsupported");
452 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800453 continue;
454 }
455
456 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM_UNALIGNED;
457
458 /*
459 * INTEL_DEV_META_VS_COPY_MEM_UNALIGNED is untyped but expects the
460 * stride to be 4
461 */
Tony Barbour8205d902015-04-16 15:59:00 -0600462 fmt = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800463 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800464
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700465 if (format != fmt) {
466 format = fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800467
Chia-I Wu714df452015-01-01 07:55:04 +0800468 cmd_meta_set_src_for_buf(cmd, src, format, &meta);
469 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800470 }
471
Chia-I Wuc14d1562014-10-17 09:49:22 +0800472 cmd_draw_meta(cmd, &meta);
473 }
474}
475
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600476ICD_EXPORT void VKAPI vkCmdCopyImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600477 VkCmdBuffer cmdBuffer,
478 VkImage srcImage,
479 VkImageLayout srcImageLayout,
480 VkImage destImage,
481 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600482 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600483 const VkImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800484{
485 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
486 struct intel_img *src = intel_img(srcImage);
487 struct intel_img *dst = intel_img(destImage);
488 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600489 VkFormat raw_format;
Cody Northrop30a2b462015-02-10 09:28:30 -0700490 bool raw_copy = false;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600491 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800492
493 if (src->type != dst->type) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600494 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800495 return;
496 }
497
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700498 if (src->layout.format == dst->layout.format) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800499 raw_copy = true;
500 raw_format = cmd_meta_img_raw_format(cmd, src->layout.format);
501 } else if (icd_format_is_compressed(src->layout.format) ||
502 icd_format_is_compressed(dst->layout.format)) {
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
507 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800508 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800509
510 cmd_meta_set_src_for_img(cmd, src,
511 (raw_copy) ? raw_format : src->layout.format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600512 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800513
514 meta.samples = dst->samples;
515
516 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600517 const VkImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600518 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800519
520 meta.shader_id = get_shader_id(cmd->dev, src,
521 (region->extent.depth > 1));
522
523 meta.src.lod = region->srcSubresource.mipLevel;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600524 meta.src.layer = region->srcSubresource.arrayLayer +
Chia-I Wuc14d1562014-10-17 09:49:22 +0800525 region->srcOffset.z;
526 meta.src.x = region->srcOffset.x;
527 meta.src.y = region->srcOffset.y;
528
529 meta.dst.lod = region->destSubresource.mipLevel;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600530 meta.dst.layer = region->destSubresource.arrayLayer +
Chia-I Wuc14d1562014-10-17 09:49:22 +0800531 region->destOffset.z;
532 meta.dst.x = region->destOffset.x;
533 meta.dst.y = region->destOffset.y;
534
535 meta.width = region->extent.width;
536 meta.height = region->extent.height;
537
Chia-I Wueccc7682015-03-24 14:15:30 +0800538 if (raw_copy) {
539 const uint32_t block_width =
540 icd_format_get_block_width(raw_format);
541
542 meta.src.x /= block_width;
543 meta.src.y /= block_width;
544 meta.dst.x /= block_width;
545 meta.dst.y /= block_width;
546 meta.width /= block_width;
547 meta.height /= block_width;
548 }
549
Chia-I Wuc14d1562014-10-17 09:49:22 +0800550 for (j = 0; j < region->extent.depth; j++) {
551 cmd_meta_set_dst_for_img(cmd, dst,
552 (raw_copy) ? raw_format : dst->layout.format,
553 meta.dst.lod, meta.dst.layer, &meta);
554
555 cmd_draw_meta(cmd, &meta);
556
557 meta.src.layer++;
558 meta.dst.layer++;
559 }
560 }
561}
562
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600563ICD_EXPORT void VKAPI vkCmdBlitImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600564 VkCmdBuffer cmdBuffer,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500565 VkImage srcImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600566 VkImageLayout srcImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500567 VkImage destImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600568 VkImageLayout destImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500569 uint32_t regionCount,
570 const VkImageBlit* pRegions,
571 VkTexFilter filter)
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600572{
573 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
574
575 /*
576 * TODO: Implement actual blit function.
577 */
Courtney Goeltzenleuchtera54b76a2015-09-04 13:39:59 -0600578 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600579}
580
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600581ICD_EXPORT void VKAPI vkCmdCopyBufferToImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600582 VkCmdBuffer cmdBuffer,
583 VkBuffer srcBuffer,
584 VkImage destImage,
585 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600586 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600587 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800588{
589 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800590 struct intel_buf *buf = intel_buf(srcBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800591 struct intel_img *img = intel_img(destImage);
592 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600593 VkFormat format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800594 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800595
596 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800597 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800598
599 meta.shader_id = INTEL_DEV_META_FS_COPY_MEM_TO_IMG;
600 meta.samples = img->samples;
601
602 format = cmd_meta_img_raw_format(cmd, img->layout.format);
Mike Stroyanbc4e2ed2015-03-24 15:10:24 -0600603 block_width = icd_format_get_block_width(img->layout.format);
Chia-I Wu714df452015-01-01 07:55:04 +0800604 cmd_meta_set_src_for_buf(cmd, buf, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800605
606 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600607 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600608 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800609
Chia-I Wu714df452015-01-01 07:55:04 +0800610 meta.src.x = region->bufferOffset / icd_format_get_size(format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800611
612 meta.dst.lod = region->imageSubresource.mipLevel;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600613 meta.dst.layer = region->imageSubresource.arrayLayer +
Chia-I Wuc14d1562014-10-17 09:49:22 +0800614 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800615 meta.dst.x = region->imageOffset.x / block_width;
616 meta.dst.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800617
Chia-I Wueccc7682015-03-24 14:15:30 +0800618 meta.width = region->imageExtent.width / block_width;
619 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800620
621 for (j = 0; j < region->imageExtent.depth; j++) {
622 cmd_meta_set_dst_for_img(cmd, img, format,
623 meta.dst.lod, meta.dst.layer, &meta);
624
625 cmd_draw_meta(cmd, &meta);
626
627 meta.src.x += meta.width * meta.height;
628 meta.dst.layer++;
629 }
630 }
631}
632
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600633ICD_EXPORT void VKAPI vkCmdCopyImageToBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600634 VkCmdBuffer cmdBuffer,
635 VkImage srcImage,
636 VkImageLayout srcImageLayout,
637 VkBuffer destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600638 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600639 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800640{
641 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
642 struct intel_img *img = intel_img(srcImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800643 struct intel_buf *buf = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800644 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600645 VkFormat img_format, buf_format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800646 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800647
648 memset(&meta, 0, sizeof(meta));
Chia-I Wua44b6482014-12-20 14:58:01 +0800649 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800650
Chia-I Wua44b6482014-12-20 14:58:01 +0800651 img_format = cmd_meta_img_raw_format(cmd, img->layout.format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800652 block_width = icd_format_get_block_width(img_format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800653
Chia-I Wu714df452015-01-01 07:55:04 +0800654 /* buf_format is ignored by hw, but we derive stride from it */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700655 switch (img_format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600656 case VK_FORMAT_R8_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800657 meta.shader_id = INTEL_DEV_META_VS_COPY_R8_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600658 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800659 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600660 case VK_FORMAT_R16_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800661 meta.shader_id = INTEL_DEV_META_VS_COPY_R16_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600662 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800663 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600664 case VK_FORMAT_R32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800665 meta.shader_id = INTEL_DEV_META_VS_COPY_R32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600666 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800667 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600668 case VK_FORMAT_R32G32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800669 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600670 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800671 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600672 case VK_FORMAT_R32G32B32A32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800673 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32B32A32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600674 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800675 break;
676 default:
Tony Barbour8205d902015-04-16 15:59:00 -0600677 img_format = VK_FORMAT_UNDEFINED;
678 buf_format = VK_FORMAT_UNDEFINED;
Chia-I Wua44b6482014-12-20 14:58:01 +0800679 break;
680 }
681
Tony Barbour8205d902015-04-16 15:59:00 -0600682 if (img_format == VK_FORMAT_UNDEFINED ||
Chia-I Wua44b6482014-12-20 14:58:01 +0800683 (cmd_gen(cmd) == INTEL_GEN(6) &&
684 icd_format_get_size(img_format) < 4)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600685 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
686 &cmd->obj.base, 0, 0,
687 "vkCmdCopyImageToBuffer with bpp %d unsupported",
688 icd_format_get_size(img->layout.format));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600689 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wua44b6482014-12-20 14:58:01 +0800690 return;
691 }
692
693 cmd_meta_set_src_for_img(cmd, img, img_format,
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600694 VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800695 cmd_meta_set_dst_for_buf(cmd, buf, buf_format, &meta);
Chia-I Wua44b6482014-12-20 14:58:01 +0800696
Chia-I Wuc14d1562014-10-17 09:49:22 +0800697 meta.samples = 1;
698
699 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600700 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600701 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800702
Chia-I Wuc14d1562014-10-17 09:49:22 +0800703 meta.src.lod = region->imageSubresource.mipLevel;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600704 meta.src.layer = region->imageSubresource.arrayLayer +
Chia-I Wuc14d1562014-10-17 09:49:22 +0800705 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800706 meta.src.x = region->imageOffset.x / block_width;
707 meta.src.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800708
Chia-I Wu714df452015-01-01 07:55:04 +0800709 meta.dst.x = region->bufferOffset / icd_format_get_size(img_format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800710 meta.width = region->imageExtent.width / block_width;
711 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800712
713 for (j = 0; j < region->imageExtent.depth; j++) {
714 cmd_draw_meta(cmd, &meta);
715
716 meta.src.layer++;
Chia-I Wua44b6482014-12-20 14:58:01 +0800717 meta.dst.x += meta.width * meta.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800718 }
719 }
720}
721
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600722ICD_EXPORT void VKAPI vkCmdUpdateBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600723 VkCmdBuffer cmdBuffer,
724 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600725 VkDeviceSize destOffset,
726 VkDeviceSize dataSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600727 const uint32_t* pData)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800728{
729 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800730 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800731 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600732 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800733 uint32_t *ptr;
734 uint32_t offset;
735
Chia-I Wuf3a27252014-11-24 15:27:01 +0800736 /* must be 4-byte aligned */
737 if ((destOffset | dataSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600738 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800739 return;
740 }
741
Chia-I Wuc14d1562014-10-17 09:49:22 +0800742 /* write to dynamic state writer first */
743 offset = cmd_state_pointer(cmd, INTEL_CMD_ITEM_BLOB, 32,
744 (dataSize + 3) / 4, &ptr);
745 memcpy(ptr, pData, dataSize);
746
Chia-I Wuc14d1562014-10-17 09:49:22 +0800747 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800748 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800749
Chia-I Wuf3a27252014-11-24 15:27:01 +0800750 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
751
752 meta.src.x = offset / 4;
753 meta.dst.x = destOffset / 4;
754 meta.width = dataSize / 4;
755 meta.height = 1;
756 meta.samples = 1;
757
758 /*
759 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to be 16
760 */
Tony Barbour8205d902015-04-16 15:59:00 -0600761 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800762
763 cmd_meta_set_src_for_writer(cmd, INTEL_CMD_WRITER_STATE,
764 offset + dataSize, format, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800765 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800766
Chia-I Wuc14d1562014-10-17 09:49:22 +0800767 cmd_draw_meta(cmd, &meta);
768}
769
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600770ICD_EXPORT void VKAPI vkCmdFillBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600771 VkCmdBuffer cmdBuffer,
772 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600773 VkDeviceSize destOffset,
774 VkDeviceSize fillSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600775 uint32_t data)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800776{
777 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800778 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800779 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600780 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800781
782 /* must be 4-byte aligned */
783 if ((destOffset | fillSize) & 3) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600784 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800785 return;
786 }
787
788 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800789 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800790
Chia-I Wuf3a27252014-11-24 15:27:01 +0800791 meta.shader_id = INTEL_DEV_META_VS_FILL_MEM;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800792
793 meta.clear_val[0] = data;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800794
Chia-I Wuf3a27252014-11-24 15:27:01 +0800795 meta.dst.x = destOffset / 4;
796 meta.width = fillSize / 4;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800797 meta.height = 1;
798 meta.samples = 1;
799
Chia-I Wuf3a27252014-11-24 15:27:01 +0800800 /*
801 * INTEL_DEV_META_VS_FILL_MEM is untyped but expects the stride to be 16
802 */
Tony Barbour8205d902015-04-16 15:59:00 -0600803 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800804
Chia-I Wu714df452015-01-01 07:55:04 +0800805 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800806
Chia-I Wuc14d1562014-10-17 09:49:22 +0800807 cmd_draw_meta(cmd, &meta);
808}
809
810static void cmd_meta_clear_image(struct intel_cmd *cmd,
811 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600812 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800813 struct intel_cmd_meta *meta,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600814 const VkImageSubresourceRange *range)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800815{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600816 uint32_t mip_levels, array_size;
817 uint32_t i, j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800818
819 if (range->baseMipLevel >= img->mip_levels ||
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600820 range->baseArrayLayer >= img->array_size)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800821 return;
822
823 mip_levels = img->mip_levels - range->baseMipLevel;
824 if (mip_levels > range->mipLevels)
825 mip_levels = range->mipLevels;
826
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600827 array_size = img->array_size - range->baseArrayLayer;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800828 if (array_size > range->arraySize)
829 array_size = range->arraySize;
830
Chia-I Wuc14d1562014-10-17 09:49:22 +0800831 for (i = 0; i < mip_levels; i++) {
Chia-I Wufaaed472014-10-28 14:17:43 +0800832 meta->dst.lod = range->baseMipLevel + i;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600833 meta->dst.layer = range->baseArrayLayer;
Chia-I Wufaaed472014-10-28 14:17:43 +0800834
Chia-I Wu73520ac2015-02-19 11:17:45 -0700835 /* TODO INTEL_CMD_META_DS_HIZ_CLEAR requires 8x4 aligned rectangle */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800836 meta->width = u_minify(img->layout.width0, meta->dst.lod);
837 meta->height = u_minify(img->layout.height0, meta->dst.lod);
838
Chia-I Wu73520ac2015-02-19 11:17:45 -0700839 if (meta->ds.op != INTEL_CMD_META_DS_NOP &&
840 !intel_img_can_enable_hiz(img, meta->dst.lod))
841 continue;
842
Chia-I Wuc14d1562014-10-17 09:49:22 +0800843 for (j = 0; j < array_size; j++) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600844 if (range->aspect == VK_IMAGE_ASPECT_COLOR) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800845 cmd_meta_set_dst_for_img(cmd, img, format,
846 meta->dst.lod, meta->dst.layer, meta);
847
848 cmd_draw_meta(cmd, meta);
849 } else {
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800850 cmd_meta_set_ds_view(cmd, img, meta->dst.lod,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800851 meta->dst.layer, meta);
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800852 cmd_meta_set_ds_state(cmd, range->aspect,
853 meta->clear_val[1], meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800854
855 cmd_draw_meta(cmd, meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800856 }
857
858 meta->dst.layer++;
859 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800860 }
861}
862
Chia-I Wu73520ac2015-02-19 11:17:45 -0700863void cmd_meta_ds_op(struct intel_cmd *cmd,
864 enum intel_cmd_meta_ds_op op,
865 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600866 const VkImageSubresourceRange *range)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700867{
868 struct intel_cmd_meta meta;
869
870 if (img->layout.aux != INTEL_LAYOUT_AUX_HIZ)
871 return;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600872 if (range->aspect != VK_IMAGE_ASPECT_DEPTH)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700873 return;
874
875 memset(&meta, 0, sizeof(meta));
876 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
877 meta.samples = img->samples;
878
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600879 meta.ds.aspect = VK_IMAGE_ASPECT_DEPTH;
Chia-I Wu73520ac2015-02-19 11:17:45 -0700880 meta.ds.op = op;
881 meta.ds.optimal = true;
882
883 cmd_meta_clear_image(cmd, img, img->layout.format, &meta, range);
884}
885
Chris Forbesfff9bf42015-06-15 15:26:19 +1200886void cmd_meta_clear_color_image(
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600887 VkCmdBuffer cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -0600888 struct intel_img *img,
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600889 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200890 const VkClearColorValue *pClearColor,
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600891 uint32_t rangeCount,
892 const VkImageSubresourceRange *pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800893{
894 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800895 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600896 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600897 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800898
899 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800900 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800901
902 meta.shader_id = INTEL_DEV_META_FS_CLEAR_COLOR;
903 meta.samples = img->samples;
904
Cody Northrop2563a032015-08-25 15:26:38 -0600905 meta.clear_val[0] = pClearColor->uint32[0];
906 meta.clear_val[1] = pClearColor->uint32[1];
907 meta.clear_val[2] = pClearColor->uint32[2];
908 meta.clear_val[3] = pClearColor->uint32[3];
Chris Forbese3105972015-06-24 14:34:53 +1200909 format = img->layout.format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800910
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600911 for (i = 0; i < rangeCount; i++) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800912 cmd_meta_clear_image(cmd, img, format, &meta, &pRanges[i]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600913 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800914}
915
Chris Forbesfff9bf42015-06-15 15:26:19 +1200916ICD_EXPORT void VKAPI vkCmdClearColorImage(
917 VkCmdBuffer cmdBuffer,
918 VkImage image,
919 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200920 const VkClearColorValue *pClearColor,
Chris Forbesfff9bf42015-06-15 15:26:19 +1200921 uint32_t rangeCount,
922 const VkImageSubresourceRange *pRanges)
923{
Tony Barbourde4124d2015-07-03 10:33:54 -0600924 struct intel_img *img = intel_img(image);
925 cmd_meta_clear_color_image(cmdBuffer, img, imageLayout, pClearColor, rangeCount, pRanges);
Chris Forbesfff9bf42015-06-15 15:26:19 +1200926}
927
Chris Forbes4cf9d102015-06-22 18:46:05 +1200928void cmd_meta_clear_depth_stencil_image(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600929 VkCmdBuffer cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -0600930 struct intel_img* img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600931 VkImageLayout imageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600932 float depth,
933 uint32_t stencil,
934 uint32_t rangeCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600935 const VkImageSubresourceRange* pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800936{
937 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800938 struct intel_cmd_meta meta;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600939 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800940
941 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800942 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800943
944 meta.shader_id = INTEL_DEV_META_FS_CLEAR_DEPTH;
945 meta.samples = img->samples;
946
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800947 meta.clear_val[0] = u_fui(depth);
948 meta.clear_val[1] = stencil;
949
Mark Lobodzinski4e97c452015-07-01 15:18:26 -0600950 if (imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600951 imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) {
Courtney Goeltzenleuchter3b61a592015-03-30 15:07:58 -0600952 meta.ds.optimal = true;
953 }
Chia-I Wu73520ac2015-02-19 11:17:45 -0700954
Chia-I Wuc14d1562014-10-17 09:49:22 +0800955 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600956 const VkImageSubresourceRange *range = &pRanges[i];
Chia-I Wuc14d1562014-10-17 09:49:22 +0800957
Chia-I Wuc14d1562014-10-17 09:49:22 +0800958 cmd_meta_clear_image(cmd, img, img->layout.format,
959 &meta, range);
960 }
961}
962
Chris Forbes4cf9d102015-06-22 18:46:05 +1200963ICD_EXPORT void VKAPI vkCmdClearDepthStencilImage(
964 VkCmdBuffer cmdBuffer,
965 VkImage image,
966 VkImageLayout imageLayout,
967 float depth,
968 uint32_t stencil,
969 uint32_t rangeCount,
970 const VkImageSubresourceRange* pRanges)
971{
Tony Barbourde4124d2015-07-03 10:33:54 -0600972 struct intel_img *img = intel_img(image);
973 cmd_meta_clear_depth_stencil_image(cmdBuffer, img, imageLayout, depth, stencil, rangeCount, pRanges);
Chris Forbes4cf9d102015-06-22 18:46:05 +1200974}
975
Chris Forbes2951d7d2015-06-22 17:21:59 +1200976ICD_EXPORT void VKAPI vkCmdClearColorAttachment(
977 VkCmdBuffer cmdBuffer,
978 uint32_t colorAttachment,
979 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200980 const VkClearColorValue *pColor,
Chris Forbes2951d7d2015-06-22 17:21:59 +1200981 uint32_t rectCount,
982 const VkRect3D *pRects)
983{
984 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wubdeed152015-07-09 12:16:29 +0800985 const struct intel_render_pass_subpass *subpass =
986 cmd->bind.render_pass_subpass;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800987 const struct intel_fb *fb = cmd->bind.fb;
Chia-I Wubdeed152015-07-09 12:16:29 +0800988 const struct intel_att_view *view =
989 fb->views[subpass->color_indices[colorAttachment]];
Chris Forbes1e16cb82015-06-24 12:05:30 +1200990
991 /* Convert each rect3d to clear into a subresource clear.
992 * TODO: this currently only supports full layer clears --
993 * cmd_meta_clear_color_image does not provide a means to
994 * specify the xy bounds.
995 */
996 for (uint32_t i = 0; i < rectCount; i++) {
Chris Forbes1e16cb82015-06-24 12:05:30 +1200997 VkImageSubresourceRange range = {
998 VK_IMAGE_ASPECT_COLOR,
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800999 view->mipLevel,
Chris Forbes1e16cb82015-06-24 12:05:30 +12001000 1,
1001 pRects[i].offset.z,
1002 pRects[i].extent.depth
1003 };
1004
Tony Barbourde4124d2015-07-03 10:33:54 -06001005 cmd_meta_clear_color_image(cmdBuffer, view->img,
Chris Forbes1e16cb82015-06-24 12:05:30 +12001006 imageLayout,
1007 pColor,
1008 1,
1009 &range);
1010 }
Chris Forbes2951d7d2015-06-22 17:21:59 +12001011}
1012
1013ICD_EXPORT void VKAPI vkCmdClearDepthStencilAttachment(
1014 VkCmdBuffer cmdBuffer,
1015 VkImageAspectFlags imageAspectMask,
1016 VkImageLayout imageLayout,
1017 float depth,
1018 uint32_t stencil,
1019 uint32_t rectCount,
1020 const VkRect3D *pRects)
1021{
1022 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wubdeed152015-07-09 12:16:29 +08001023 const struct intel_render_pass_subpass *subpass =
1024 cmd->bind.render_pass_subpass;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001025 const struct intel_fb *fb = cmd->bind.fb;
Chia-I Wubdeed152015-07-09 12:16:29 +08001026 const struct intel_att_view *view = fb->views[subpass->ds_index];
Chris Forbes1e16cb82015-06-24 12:05:30 +12001027
1028 /* Convert each rect3d to clear into a subresource clear.
1029 * TODO: this currently only supports full layer clears --
1030 * cmd_meta_clear_depth_stencil_image does not provide a means to
1031 * specify the xy bounds.
1032 */
1033 for (uint32_t i = 0; i < rectCount; i++) {
Chris Forbes1e16cb82015-06-24 12:05:30 +12001034 VkImageSubresourceRange range = {
1035 VK_IMAGE_ASPECT_DEPTH,
1036 0, /* ds->mipLevel, */
1037 1,
1038 pRects[i].offset.z,
1039 pRects[i].extent.depth
1040 };
1041
1042 if (imageAspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001043 cmd_meta_clear_depth_stencil_image(cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -06001044 view->img, imageLayout,
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001045 depth, stencil, 1, &range);
Chris Forbes1e16cb82015-06-24 12:05:30 +12001046 }
1047 if (imageAspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
1048 range.aspect = VK_IMAGE_ASPECT_STENCIL;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001049 cmd_meta_clear_depth_stencil_image(cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -06001050 view->img, imageLayout,
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001051 depth, stencil, 1, &range);
Chris Forbes1e16cb82015-06-24 12:05:30 +12001052 }
1053 }
Chris Forbes2951d7d2015-06-22 17:21:59 +12001054}
1055
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001056ICD_EXPORT void VKAPI vkCmdResolveImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001057 VkCmdBuffer cmdBuffer,
1058 VkImage srcImage,
1059 VkImageLayout srcImageLayout,
1060 VkImage destImage,
1061 VkImageLayout destImageLayout,
Tony Barbour11f74372015-04-13 15:02:52 -06001062 uint32_t regionCount,
1063 const VkImageResolve* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +08001064{
1065 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1066 struct intel_img *src = intel_img(srcImage);
1067 struct intel_img *dst = intel_img(destImage);
1068 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001069 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001070 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001071
1072 if (src->samples <= 1 || dst->samples > 1 ||
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -07001073 src->layout.format != dst->layout.format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001074 cmd_fail(cmd, VK_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001075 return;
1076 }
1077
1078 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +08001079 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001080
1081 switch (src->samples) {
1082 case 2:
1083 default:
1084 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_2X;
1085 break;
1086 case 4:
1087 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_4X;
1088 break;
1089 case 8:
1090 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_8X;
1091 break;
1092 case 16:
1093 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_16X;
1094 break;
1095 }
1096
1097 meta.samples = 1;
1098
1099 format = cmd_meta_img_raw_format(cmd, src->layout.format);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001100 cmd_meta_set_src_for_img(cmd, src, format, VK_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001101
Tony Barbour11f74372015-04-13 15:02:52 -06001102 for (i = 0; i < regionCount; i++) {
1103 const VkImageResolve *region = &pRegions[i];
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -06001104 int arrayLayer;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001105
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -06001106 for(arrayLayer = 0; arrayLayer < region->extent.depth; arrayLayer++) {
Tony Barbour11f74372015-04-13 15:02:52 -06001107 meta.src.lod = region->srcSubresource.mipLevel;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -06001108 meta.src.layer = region->srcSubresource.arrayLayer + arrayLayer;
Tony Barbour11f74372015-04-13 15:02:52 -06001109 meta.src.x = region->srcOffset.x;
1110 meta.src.y = region->srcOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001111
Tony Barbour11f74372015-04-13 15:02:52 -06001112 meta.dst.lod = region->destSubresource.mipLevel;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -06001113 meta.dst.layer = region->destSubresource.arrayLayer + arrayLayer;
Tony Barbour11f74372015-04-13 15:02:52 -06001114 meta.dst.x = region->destOffset.x;
1115 meta.dst.y = region->destOffset.y;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001116
Tony Barbour11f74372015-04-13 15:02:52 -06001117 meta.width = region->extent.width;
1118 meta.height = region->extent.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001119
Tony Barboure9f99942015-04-13 13:11:12 -06001120 cmd_meta_set_dst_for_img(cmd, dst, format,
1121 meta.dst.lod, meta.dst.layer, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001122
Tony Barboure9f99942015-04-13 13:11:12 -06001123 cmd_draw_meta(cmd, &meta);
1124 }
Chia-I Wuc14d1562014-10-17 09:49:22 +08001125 }
1126}