blob: ad03a27f7629956a00033805b94e8ad33e64f1de [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;
Chia-I Wuc14d1562014-10-17 09:49:22 +080047 info.format = format;
Chia-I Wu714df452015-01-01 07:55:04 +080048 info.range = range;
Chia-I Wuc14d1562014-10-17 09:49:22 +080049
Chia-I Wubc7a30c2014-12-13 15:54:10 +080050 /*
51 * We do not rely on the hardware to avoid out-of-bound access. But we do
52 * not want the hardware to ignore the last element either.
53 */
Courtney Goeltzenleuchterba093032015-03-25 16:31:58 -060054 stride = icd_format_get_size(format);
55 if (info.range % stride)
56 info.range += stride - (info.range % stride);
Chia-I Wubc7a30c2014-12-13 15:54:10 +080057
Chia-I Wu714df452015-01-01 07:55:04 +080058 return intel_buf_view_create(cmd->dev, &info, view);
Chia-I Wuc14d1562014-10-17 09:49:22 +080059}
60
Chia-I Wu714df452015-01-01 07:55:04 +080061static void cmd_meta_set_src_for_buf(struct intel_cmd *cmd,
62 const struct intel_buf *buf,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060063 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +080064 struct intel_cmd_meta *meta)
65{
Chia-I Wu714df452015-01-01 07:55:04 +080066 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060067 VkResult res;
Tony Barbourde4124d2015-07-03 10:33:54 -060068 VkBuffer localbuf;
69 localbuf.handle = (uint64_t) buf;
Chia-I Wuc14d1562014-10-17 09:49:22 +080070
Tony Barbourde4124d2015-07-03 10:33:54 -060071 res = cmd_meta_create_buf_view(cmd, localbuf,
Chia-I Wu714df452015-01-01 07:55:04 +080072 buf->size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060073 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -070074 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +080075 return;
76 }
Chia-I Wuc14d1562014-10-17 09:49:22 +080077
78 meta->src.valid = true;
79
Chia-I Wu714df452015-01-01 07:55:04 +080080 memcpy(meta->src.surface, view->cmd,
81 sizeof(view->cmd[0]) * view->cmd_len);
82 meta->src.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +080083
Chia-I Wu714df452015-01-01 07:55:04 +080084 intel_buf_view_destroy(view);
85
86 meta->src.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +080087 meta->src.reloc_offset = 0;
88 meta->src.reloc_flags = 0;
89}
90
Chia-I Wu714df452015-01-01 07:55:04 +080091static void cmd_meta_set_dst_for_buf(struct intel_cmd *cmd,
92 const struct intel_buf *buf,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060093 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +080094 struct intel_cmd_meta *meta)
95{
Chia-I Wu714df452015-01-01 07:55:04 +080096 struct intel_buf_view *view;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -060097 VkResult res;
Tony Barbourde4124d2015-07-03 10:33:54 -060098 VkBuffer localbuf;
99 localbuf.handle = (uint64_t) buf;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800100
Tony Barbourde4124d2015-07-03 10:33:54 -0600101 res = cmd_meta_create_buf_view(cmd, localbuf,
Chia-I Wu714df452015-01-01 07:55:04 +0800102 buf->size, format, &view);
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600103 if (res != VK_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700104 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800105 return;
106 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800107
108 meta->dst.valid = true;
109
Chia-I Wu714df452015-01-01 07:55:04 +0800110 memcpy(meta->dst.surface, view->cmd,
111 sizeof(view->cmd[0]) * view->cmd_len);
112 meta->dst.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800113
Chia-I Wu714df452015-01-01 07:55:04 +0800114 intel_buf_view_destroy(view);
115
116 meta->dst.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800117 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800118 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800119}
120
121static void cmd_meta_set_src_for_img(struct intel_cmd *cmd,
122 const struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600123 VkFormat format,
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -0600124 VkImageAspectFlagBits aspect,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800125 struct intel_cmd_meta *meta)
126{
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600127 VkImageViewCreateInfo info;
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600128 struct intel_img_view tmp_view;
129 struct intel_img_view *view = &tmp_view;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800130
131 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600132 info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tony Barbourde4124d2015-07-03 10:33:54 -0600133 info.image.handle = (uint64_t) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800134
Mark Lobodzinskic4e83e32015-07-02 09:53:03 -0600135 if (img->array_size == 1) {
136 switch (img->type) {
137 case VK_IMAGE_TYPE_1D:
138 info.viewType = VK_IMAGE_VIEW_TYPE_1D;
139 break;
140 case VK_IMAGE_TYPE_2D:
141 info.viewType = VK_IMAGE_VIEW_TYPE_2D;
142 break;
143 default:
144 break;
145 }
146 } else {
147 switch (img->type) {
148 case VK_IMAGE_TYPE_1D:
149 info.viewType = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
150 break;
151 case VK_IMAGE_TYPE_2D:
152 info.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
153 break;
154 case VK_IMAGE_TYPE_3D:
155 info.viewType = VK_IMAGE_VIEW_TYPE_3D;
156 break;
157 default:
158 break;
159 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800160 }
161
162 info.format = format;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600163 info.channels.r = VK_CHANNEL_SWIZZLE_R;
164 info.channels.g = VK_CHANNEL_SWIZZLE_G;
165 info.channels.b = VK_CHANNEL_SWIZZLE_B;
166 info.channels.a = VK_CHANNEL_SWIZZLE_A;
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600167 info.subresourceRange.aspectMask = aspect;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800168 info.subresourceRange.baseMipLevel = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600169 info.subresourceRange.numLevels = VK_REMAINING_MIP_LEVELS;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600170 info.subresourceRange.baseArrayLayer = 0;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600171 info.subresourceRange.numLayers = VK_REMAINING_ARRAY_LAYERS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800172
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600173 intel_img_view_init(cmd->dev, &info, view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800174
175 meta->src.valid = true;
176
177 memcpy(meta->src.surface, view->cmd,
178 sizeof(view->cmd[0]) * view->cmd_len);
179 meta->src.surface_len = view->cmd_len;
180
181 meta->src.reloc_target = (intptr_t) img->obj.mem->bo;
182 meta->src.reloc_offset = 0;
183 meta->src.reloc_flags = 0;
184
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600185 /* Don't need tmp_view anymore */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800186}
187
Chia-I Wu83084ba2014-12-04 12:49:52 +0800188static void cmd_meta_adjust_compressed_dst(struct intel_cmd *cmd,
189 const struct intel_img *img,
190 struct intel_cmd_meta *meta)
191{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600192 int32_t w, h, layer;
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800193 unsigned x_offset, y_offset;
Chia-I Wu83084ba2014-12-04 12:49:52 +0800194
195 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
196 w = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_WIDTH);
197 h = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800198 layer = GEN_EXTRACT(meta->dst.surface[4],
199 GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800200 } else {
201 w = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_WIDTH);
202 h = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800203 layer = GEN_EXTRACT(meta->dst.surface[4],
204 GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800205 }
206
207 /* note that the width/height fields have the real values minus 1 */
208 w = (w + img->layout.block_width) / img->layout.block_width - 1;
209 h = (h + img->layout.block_height) / img->layout.block_height - 1;
210
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800211 /* adjust width and height */
Chia-I Wu83084ba2014-12-04 12:49:52 +0800212 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800213 meta->dst.surface[2] &= ~(GEN7_SURFACE_DW2_WIDTH__MASK |
214 GEN7_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800215 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN7_SURFACE_DW2_WIDTH) |
216 GEN_SHIFT32(h, GEN7_SURFACE_DW2_HEIGHT);
217 } else {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800218 meta->dst.surface[2] &= ~(GEN6_SURFACE_DW2_WIDTH__MASK |
219 GEN6_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800220 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN6_SURFACE_DW2_WIDTH) |
221 GEN_SHIFT32(h, GEN6_SURFACE_DW2_HEIGHT);
222 }
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800223
224 if (!layer)
225 return;
226
227 meta->dst.reloc_offset = intel_layout_get_slice_tile_offset(&img->layout,
228 0, layer, &x_offset, &y_offset);
229
230 /*
231 * The lower 2 bits (or 1 bit for Y) are missing. This may be a problem
232 * for small images (16x16 or smaller). We will need to adjust the
233 * drawing rectangle instead.
234 */
235 x_offset = (x_offset / img->layout.block_width) >> 2;
236 y_offset = (y_offset / img->layout.block_height) >> 1;
237
238 /* adjust min array element and X/Y offsets */
239 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
240 meta->dst.surface[4] &= ~GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
241 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN7_SURFACE_DW5_X_OFFSET) |
242 GEN_SHIFT32(y_offset, GEN7_SURFACE_DW5_Y_OFFSET);
243 } else {
244 meta->dst.surface[4] &= ~GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
245 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN6_SURFACE_DW5_X_OFFSET) |
246 GEN_SHIFT32(y_offset, GEN6_SURFACE_DW5_Y_OFFSET);
247 }
Chia-I Wu83084ba2014-12-04 12:49:52 +0800248}
249
Chia-I Wuc14d1562014-10-17 09:49:22 +0800250static void cmd_meta_set_dst_for_img(struct intel_cmd *cmd,
251 const struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600252 VkFormat format,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600253 uint32_t lod, uint32_t layer,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800254 struct intel_cmd_meta *meta)
255{
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600256 struct intel_att_view tmp_view;
257 struct intel_att_view *view = &tmp_view;
258 VkImageViewCreateInfo info;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800259
260 memset(&info, 0, sizeof(info));
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600261 info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tony Barbourde4124d2015-07-03 10:33:54 -0600262 info.image.handle = (uint64_t) img;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800263 info.format = format;
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -0600264 info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Courtney Goeltzenleuchter1856d6f2015-09-01 17:30:39 -0600265 info.subresourceRange.baseMipLevel = lod;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600266 info.subresourceRange.numLevels = 1;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600267 info.subresourceRange.baseArrayLayer = layer;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600268 info.subresourceRange.numLayers = 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;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600328 info.subresourceRange.numLevels = 1;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600329 info.subresourceRange.baseArrayLayer = layer;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600330 info.subresourceRange.numLayers = 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 Goeltzenleuchterba11ebe2015-10-21 17:00:51 -0600336 VkImageAspectFlagBits 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");
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600452 cmd_fail(cmd, VK_ERROR_VALIDATION_FAILED);
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
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700493 if (src->layout.format == dst->layout.format) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800494 raw_copy = true;
495 raw_format = cmd_meta_img_raw_format(cmd, src->layout.format);
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600496 } else {
497 assert((icd_format_is_compressed(src->layout.format) ||
498 icd_format_is_compressed(dst->layout.format)) && "Compressed formats not supported");
Chia-I Wuc14d1562014-10-17 09:49:22 +0800499 }
500
501 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800502 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800503
504 cmd_meta_set_src_for_img(cmd, src,
505 (raw_copy) ? raw_format : src->layout.format,
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -0600506 VK_IMAGE_ASPECT_COLOR_BIT, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800507
508 meta.samples = dst->samples;
509
510 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600511 const VkImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600512 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800513
514 meta.shader_id = get_shader_id(cmd->dev, src,
515 (region->extent.depth > 1));
516
517 meta.src.lod = region->srcSubresource.mipLevel;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600518 meta.src.layer = region->srcSubresource.baseArrayLayer +
Chia-I Wuc14d1562014-10-17 09:49:22 +0800519 region->srcOffset.z;
520 meta.src.x = region->srcOffset.x;
521 meta.src.y = region->srcOffset.y;
522
523 meta.dst.lod = region->destSubresource.mipLevel;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600524 meta.dst.layer = region->destSubresource.baseArrayLayer +
Chia-I Wuc14d1562014-10-17 09:49:22 +0800525 region->destOffset.z;
526 meta.dst.x = region->destOffset.x;
527 meta.dst.y = region->destOffset.y;
528
529 meta.width = region->extent.width;
530 meta.height = region->extent.height;
531
Chia-I Wueccc7682015-03-24 14:15:30 +0800532 if (raw_copy) {
533 const uint32_t block_width =
534 icd_format_get_block_width(raw_format);
535
536 meta.src.x /= block_width;
537 meta.src.y /= block_width;
538 meta.dst.x /= block_width;
539 meta.dst.y /= block_width;
540 meta.width /= block_width;
541 meta.height /= block_width;
542 }
543
Chia-I Wuc14d1562014-10-17 09:49:22 +0800544 for (j = 0; j < region->extent.depth; j++) {
545 cmd_meta_set_dst_for_img(cmd, dst,
546 (raw_copy) ? raw_format : dst->layout.format,
547 meta.dst.lod, meta.dst.layer, &meta);
548
549 cmd_draw_meta(cmd, &meta);
550
551 meta.src.layer++;
552 meta.dst.layer++;
553 }
554 }
555}
556
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600557ICD_EXPORT void VKAPI vkCmdBlitImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600558 VkCmdBuffer cmdBuffer,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500559 VkImage srcImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600560 VkImageLayout srcImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500561 VkImage destImage,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600562 VkImageLayout destImageLayout,
Mark Lobodzinski20f68592015-05-22 14:43:25 -0500563 uint32_t regionCount,
564 const VkImageBlit* pRegions,
565 VkTexFilter filter)
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600566{
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600567 /*
568 * TODO: Implement actual blit function.
569 */
Courtney Goeltzenleuchterac544f32015-09-14 18:01:17 -0600570 assert(0 && "vkCmdBlitImage not implemented");
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600571}
572
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600573ICD_EXPORT void VKAPI vkCmdCopyBufferToImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600574 VkCmdBuffer cmdBuffer,
575 VkBuffer srcBuffer,
576 VkImage destImage,
577 VkImageLayout destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600578 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600579 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800580{
581 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800582 struct intel_buf *buf = intel_buf(srcBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800583 struct intel_img *img = intel_img(destImage);
584 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600585 VkFormat format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800586 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800587
588 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800589 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800590
591 meta.shader_id = INTEL_DEV_META_FS_COPY_MEM_TO_IMG;
592 meta.samples = img->samples;
593
594 format = cmd_meta_img_raw_format(cmd, img->layout.format);
Mike Stroyanbc4e2ed2015-03-24 15:10:24 -0600595 block_width = icd_format_get_block_width(img->layout.format);
Chia-I Wu714df452015-01-01 07:55:04 +0800596 cmd_meta_set_src_for_buf(cmd, buf, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800597
598 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600599 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600600 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800601
Chia-I Wu714df452015-01-01 07:55:04 +0800602 meta.src.x = region->bufferOffset / icd_format_get_size(format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800603
604 meta.dst.lod = region->imageSubresource.mipLevel;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600605 meta.dst.layer = region->imageSubresource.baseArrayLayer +
Chia-I Wuc14d1562014-10-17 09:49:22 +0800606 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800607 meta.dst.x = region->imageOffset.x / block_width;
608 meta.dst.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800609
Chia-I Wueccc7682015-03-24 14:15:30 +0800610 meta.width = region->imageExtent.width / block_width;
611 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800612
613 for (j = 0; j < region->imageExtent.depth; j++) {
614 cmd_meta_set_dst_for_img(cmd, img, format,
615 meta.dst.lod, meta.dst.layer, &meta);
616
617 cmd_draw_meta(cmd, &meta);
618
619 meta.src.x += meta.width * meta.height;
620 meta.dst.layer++;
621 }
622 }
623}
624
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600625ICD_EXPORT void VKAPI vkCmdCopyImageToBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600626 VkCmdBuffer cmdBuffer,
627 VkImage srcImage,
628 VkImageLayout srcImageLayout,
629 VkBuffer destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600630 uint32_t regionCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600631 const VkBufferImageCopy* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800632{
633 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
634 struct intel_img *img = intel_img(srcImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800635 struct intel_buf *buf = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800636 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600637 VkFormat img_format, buf_format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800638 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800639
640 memset(&meta, 0, sizeof(meta));
Chia-I Wua44b6482014-12-20 14:58:01 +0800641 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800642
Chia-I Wua44b6482014-12-20 14:58:01 +0800643 img_format = cmd_meta_img_raw_format(cmd, img->layout.format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800644 block_width = icd_format_get_block_width(img_format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800645
Chia-I Wu714df452015-01-01 07:55:04 +0800646 /* buf_format is ignored by hw, but we derive stride from it */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700647 switch (img_format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600648 case VK_FORMAT_R8_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800649 meta.shader_id = INTEL_DEV_META_VS_COPY_R8_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600650 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800651 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600652 case VK_FORMAT_R16_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800653 meta.shader_id = INTEL_DEV_META_VS_COPY_R16_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600654 buf_format = VK_FORMAT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800655 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600656 case VK_FORMAT_R32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800657 meta.shader_id = INTEL_DEV_META_VS_COPY_R32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600658 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800659 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600660 case VK_FORMAT_R32G32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800661 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32_TO_MEM;
Tony Barbour8205d902015-04-16 15:59:00 -0600662 buf_format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800663 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600664 case VK_FORMAT_R32G32B32A32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800665 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32B32A32_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;
668 default:
Tony Barbour8205d902015-04-16 15:59:00 -0600669 img_format = VK_FORMAT_UNDEFINED;
670 buf_format = VK_FORMAT_UNDEFINED;
Chia-I Wua44b6482014-12-20 14:58:01 +0800671 break;
672 }
673
Tony Barbour8205d902015-04-16 15:59:00 -0600674 if (img_format == VK_FORMAT_UNDEFINED ||
Chia-I Wua44b6482014-12-20 14:58:01 +0800675 (cmd_gen(cmd) == INTEL_GEN(6) &&
676 icd_format_get_size(img_format) < 4)) {
Courtney Goeltzenleuchter1c7c65d2015-06-10 17:39:03 -0600677 intel_dev_log(cmd->dev, VK_DBG_REPORT_ERROR_BIT,
678 &cmd->obj.base, 0, 0,
679 "vkCmdCopyImageToBuffer with bpp %d unsupported",
680 icd_format_get_size(img->layout.format));
Chia-I Wua44b6482014-12-20 14:58:01 +0800681 return;
682 }
683
684 cmd_meta_set_src_for_img(cmd, img, img_format,
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -0600685 VK_IMAGE_ASPECT_COLOR_BIT, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800686 cmd_meta_set_dst_for_buf(cmd, buf, buf_format, &meta);
Chia-I Wua44b6482014-12-20 14:58:01 +0800687
Chia-I Wuc14d1562014-10-17 09:49:22 +0800688 meta.samples = 1;
689
690 for (i = 0; i < regionCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600691 const VkBufferImageCopy *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600692 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800693
Chia-I Wuc14d1562014-10-17 09:49:22 +0800694 meta.src.lod = region->imageSubresource.mipLevel;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600695 meta.src.layer = region->imageSubresource.baseArrayLayer +
Chia-I Wuc14d1562014-10-17 09:49:22 +0800696 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800697 meta.src.x = region->imageOffset.x / block_width;
698 meta.src.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800699
Chia-I Wu714df452015-01-01 07:55:04 +0800700 meta.dst.x = region->bufferOffset / icd_format_get_size(img_format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800701 meta.width = region->imageExtent.width / block_width;
702 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800703
704 for (j = 0; j < region->imageExtent.depth; j++) {
705 cmd_draw_meta(cmd, &meta);
706
707 meta.src.layer++;
Chia-I Wua44b6482014-12-20 14:58:01 +0800708 meta.dst.x += meta.width * meta.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800709 }
710 }
711}
712
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600713ICD_EXPORT void VKAPI vkCmdUpdateBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600714 VkCmdBuffer cmdBuffer,
715 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600716 VkDeviceSize destOffset,
717 VkDeviceSize dataSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600718 const uint32_t* pData)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800719{
720 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800721 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800722 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600723 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800724 uint32_t *ptr;
725 uint32_t offset;
726
727 /* write to dynamic state writer first */
728 offset = cmd_state_pointer(cmd, INTEL_CMD_ITEM_BLOB, 32,
729 (dataSize + 3) / 4, &ptr);
730 memcpy(ptr, pData, dataSize);
731
Chia-I Wuc14d1562014-10-17 09:49:22 +0800732 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800733 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800734
Chia-I Wuf3a27252014-11-24 15:27:01 +0800735 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
736
737 meta.src.x = offset / 4;
738 meta.dst.x = destOffset / 4;
739 meta.width = dataSize / 4;
740 meta.height = 1;
741 meta.samples = 1;
742
743 /*
744 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to be 16
745 */
Tony Barbour8205d902015-04-16 15:59:00 -0600746 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800747
748 cmd_meta_set_src_for_writer(cmd, INTEL_CMD_WRITER_STATE,
749 offset + dataSize, format, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800750 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800751
Chia-I Wuc14d1562014-10-17 09:49:22 +0800752 cmd_draw_meta(cmd, &meta);
753}
754
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600755ICD_EXPORT void VKAPI vkCmdFillBuffer(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600756 VkCmdBuffer cmdBuffer,
757 VkBuffer destBuffer,
Tony Barbour8205d902015-04-16 15:59:00 -0600758 VkDeviceSize destOffset,
759 VkDeviceSize fillSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600760 uint32_t data)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800761{
762 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800763 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800764 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600765 VkFormat format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800766
Chia-I Wuc14d1562014-10-17 09:49:22 +0800767 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800768 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800769
Chia-I Wuf3a27252014-11-24 15:27:01 +0800770 meta.shader_id = INTEL_DEV_META_VS_FILL_MEM;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800771
772 meta.clear_val[0] = data;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800773
Chia-I Wuf3a27252014-11-24 15:27:01 +0800774 meta.dst.x = destOffset / 4;
775 meta.width = fillSize / 4;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800776 meta.height = 1;
777 meta.samples = 1;
778
Chia-I Wuf3a27252014-11-24 15:27:01 +0800779 /*
780 * INTEL_DEV_META_VS_FILL_MEM is untyped but expects the stride to be 16
781 */
Tony Barbour8205d902015-04-16 15:59:00 -0600782 format = VK_FORMAT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800783
Chia-I Wu714df452015-01-01 07:55:04 +0800784 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800785
Chia-I Wuc14d1562014-10-17 09:49:22 +0800786 cmd_draw_meta(cmd, &meta);
787}
788
789static void cmd_meta_clear_image(struct intel_cmd *cmd,
790 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600791 VkFormat format,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800792 struct intel_cmd_meta *meta,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600793 const VkImageSubresourceRange *range)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800794{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600795 uint32_t mip_levels, array_size;
796 uint32_t i, j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800797
798 if (range->baseMipLevel >= img->mip_levels ||
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600799 range->baseArrayLayer >= img->array_size)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800800 return;
801
802 mip_levels = img->mip_levels - range->baseMipLevel;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600803 if (mip_levels > range->numLevels)
804 mip_levels = range->numLevels;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800805
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600806 array_size = img->array_size - range->baseArrayLayer;
Courtney Goeltzenleuchter63f0ead2015-10-16 09:46:00 -0600807 if (array_size > range->numLayers)
808 array_size = range->numLayers;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800809
Chia-I Wuc14d1562014-10-17 09:49:22 +0800810 for (i = 0; i < mip_levels; i++) {
Chia-I Wufaaed472014-10-28 14:17:43 +0800811 meta->dst.lod = range->baseMipLevel + i;
Courtney Goeltzenleuchter3dee8082015-09-10 16:38:41 -0600812 meta->dst.layer = range->baseArrayLayer;
Chia-I Wufaaed472014-10-28 14:17:43 +0800813
Chia-I Wu73520ac2015-02-19 11:17:45 -0700814 /* TODO INTEL_CMD_META_DS_HIZ_CLEAR requires 8x4 aligned rectangle */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800815 meta->width = u_minify(img->layout.width0, meta->dst.lod);
816 meta->height = u_minify(img->layout.height0, meta->dst.lod);
817
Chia-I Wu73520ac2015-02-19 11:17:45 -0700818 if (meta->ds.op != INTEL_CMD_META_DS_NOP &&
819 !intel_img_can_enable_hiz(img, meta->dst.lod))
820 continue;
821
Chia-I Wuc14d1562014-10-17 09:49:22 +0800822 for (j = 0; j < array_size; j++) {
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600823 if (range->aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800824 cmd_meta_set_dst_for_img(cmd, img, format,
825 meta->dst.lod, meta->dst.layer, meta);
826
827 cmd_draw_meta(cmd, meta);
828 } else {
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800829 cmd_meta_set_ds_view(cmd, img, meta->dst.lod,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800830 meta->dst.layer, meta);
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600831 if (range->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -0600832 cmd_meta_set_ds_state(cmd, VK_IMAGE_ASPECT_DEPTH_BIT,
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600833 meta->clear_val[1], meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800834
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600835 cmd_draw_meta(cmd, meta);
836 }
837 if (range->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
Courtney Goeltzenleuchterba11ebe2015-10-21 17:00:51 -0600838 cmd_meta_set_ds_state(cmd, VK_IMAGE_ASPECT_STENCIL_BIT,
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600839 meta->clear_val[1], meta);
840
841 cmd_draw_meta(cmd, meta);
842 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800843 }
844
845 meta->dst.layer++;
846 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800847 }
848}
849
Chia-I Wu73520ac2015-02-19 11:17:45 -0700850void cmd_meta_ds_op(struct intel_cmd *cmd,
851 enum intel_cmd_meta_ds_op op,
852 struct intel_img *img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600853 const VkImageSubresourceRange *range)
Chia-I Wu73520ac2015-02-19 11:17:45 -0700854{
855 struct intel_cmd_meta meta;
856
857 if (img->layout.aux != INTEL_LAYOUT_AUX_HIZ)
858 return;
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600859 if (!(range->aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)))
Chia-I Wu73520ac2015-02-19 11:17:45 -0700860 return;
861
862 memset(&meta, 0, sizeof(meta));
863 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
864 meta.samples = img->samples;
865
Chia-I Wu73520ac2015-02-19 11:17:45 -0700866 meta.ds.op = op;
867 meta.ds.optimal = true;
868
869 cmd_meta_clear_image(cmd, img, img->layout.format, &meta, range);
870}
871
Chris Forbesfff9bf42015-06-15 15:26:19 +1200872void cmd_meta_clear_color_image(
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600873 VkCmdBuffer cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -0600874 struct intel_img *img,
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600875 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200876 const VkClearColorValue *pClearColor,
Courtney Goeltzenleuchterda4a99e2015-04-23 17:49:22 -0600877 uint32_t rangeCount,
878 const VkImageSubresourceRange *pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800879{
880 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800881 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600882 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600883 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800884
885 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800886 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800887
888 meta.shader_id = INTEL_DEV_META_FS_CLEAR_COLOR;
889 meta.samples = img->samples;
890
Cody Northrop2563a032015-08-25 15:26:38 -0600891 meta.clear_val[0] = pClearColor->uint32[0];
892 meta.clear_val[1] = pClearColor->uint32[1];
893 meta.clear_val[2] = pClearColor->uint32[2];
894 meta.clear_val[3] = pClearColor->uint32[3];
Chris Forbese3105972015-06-24 14:34:53 +1200895 format = img->layout.format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800896
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600897 for (i = 0; i < rangeCount; i++) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800898 cmd_meta_clear_image(cmd, img, format, &meta, &pRanges[i]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600899 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800900}
901
Chris Forbesfff9bf42015-06-15 15:26:19 +1200902ICD_EXPORT void VKAPI vkCmdClearColorImage(
903 VkCmdBuffer cmdBuffer,
904 VkImage image,
905 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200906 const VkClearColorValue *pClearColor,
Chris Forbesfff9bf42015-06-15 15:26:19 +1200907 uint32_t rangeCount,
908 const VkImageSubresourceRange *pRanges)
909{
Tony Barbourde4124d2015-07-03 10:33:54 -0600910 struct intel_img *img = intel_img(image);
911 cmd_meta_clear_color_image(cmdBuffer, img, imageLayout, pClearColor, rangeCount, pRanges);
Chris Forbesfff9bf42015-06-15 15:26:19 +1200912}
913
Chris Forbes4cf9d102015-06-22 18:46:05 +1200914void cmd_meta_clear_depth_stencil_image(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600915 VkCmdBuffer cmdBuffer,
Tony Barbourde4124d2015-07-03 10:33:54 -0600916 struct intel_img* img,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600917 VkImageLayout imageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600918 float depth,
919 uint32_t stencil,
920 uint32_t rangeCount,
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600921 const VkImageSubresourceRange* pRanges)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800922{
923 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800924 struct intel_cmd_meta meta;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600925 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800926
927 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800928 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800929
930 meta.shader_id = INTEL_DEV_META_FS_CLEAR_DEPTH;
931 meta.samples = img->samples;
932
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800933 meta.clear_val[0] = u_fui(depth);
934 meta.clear_val[1] = stencil;
935
Mark Lobodzinski4e97c452015-07-01 15:18:26 -0600936 if (imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600937 imageLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) {
Courtney Goeltzenleuchter3b61a592015-03-30 15:07:58 -0600938 meta.ds.optimal = true;
939 }
Chia-I Wu73520ac2015-02-19 11:17:45 -0700940
Chia-I Wuc14d1562014-10-17 09:49:22 +0800941 for (i = 0; i < rangeCount; i++) {
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600942 const VkImageSubresourceRange *range = &pRanges[i];
Chia-I Wuc14d1562014-10-17 09:49:22 +0800943
Chia-I Wuc14d1562014-10-17 09:49:22 +0800944 cmd_meta_clear_image(cmd, img, img->layout.format,
945 &meta, range);
946 }
947}
948
Chris Forbes4cf9d102015-06-22 18:46:05 +1200949ICD_EXPORT void VKAPI vkCmdClearDepthStencilImage(
Courtney Goeltzenleuchter315ad992015-09-15 18:03:22 -0600950 VkCmdBuffer cmdBuffer,
951 VkImage image,
952 VkImageLayout imageLayout,
953 const VkClearDepthStencilValue* pDepthStencil,
Chris Forbes4cf9d102015-06-22 18:46:05 +1200954 uint32_t rangeCount,
Courtney Goeltzenleuchter315ad992015-09-15 18:03:22 -0600955 const VkImageSubresourceRange* pRanges)
Chris Forbes4cf9d102015-06-22 18:46:05 +1200956{
Tony Barbourde4124d2015-07-03 10:33:54 -0600957 struct intel_img *img = intel_img(image);
Courtney Goeltzenleuchter315ad992015-09-15 18:03:22 -0600958 cmd_meta_clear_depth_stencil_image(cmdBuffer, img, imageLayout, pDepthStencil->depth, pDepthStencil->stencil, rangeCount, pRanges);
Chris Forbes4cf9d102015-06-22 18:46:05 +1200959}
960
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -0600961void cmd_clear_color_attachment(
Chris Forbes2951d7d2015-06-22 17:21:59 +1200962 VkCmdBuffer cmdBuffer,
963 uint32_t colorAttachment,
964 VkImageLayout imageLayout,
Chris Forbese3105972015-06-24 14:34:53 +1200965 const VkClearColorValue *pColor,
Chris Forbes2951d7d2015-06-22 17:21:59 +1200966 uint32_t rectCount,
Courtney Goeltzenleuchtera12e2912015-10-15 18:22:08 -0600967 const VkClearRect *pRects)
Chris Forbes2951d7d2015-06-22 17:21:59 +1200968{
969 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wubdeed152015-07-09 12:16:29 +0800970 const struct intel_render_pass_subpass *subpass =
971 cmd->bind.render_pass_subpass;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800972 const struct intel_fb *fb = cmd->bind.fb;
Chia-I Wubdeed152015-07-09 12:16:29 +0800973 const struct intel_att_view *view =
974 fb->views[subpass->color_indices[colorAttachment]];
Chris Forbes1e16cb82015-06-24 12:05:30 +1200975
976 /* Convert each rect3d to clear into a subresource clear.
977 * TODO: this currently only supports full layer clears --
978 * cmd_meta_clear_color_image does not provide a means to
979 * specify the xy bounds.
980 */
981 for (uint32_t i = 0; i < rectCount; i++) {
Chris Forbes1e16cb82015-06-24 12:05:30 +1200982 VkImageSubresourceRange range = {
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -0600983 VK_IMAGE_ASPECT_COLOR_BIT,
Chia-I Wu3d4d4a62015-07-09 10:34:10 +0800984 view->mipLevel,
Chris Forbes1e16cb82015-06-24 12:05:30 +1200985 1,
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -0600986 0,
987 1
Chris Forbes1e16cb82015-06-24 12:05:30 +1200988 };
989
Tony Barbourde4124d2015-07-03 10:33:54 -0600990 cmd_meta_clear_color_image(cmdBuffer, view->img,
Chris Forbes1e16cb82015-06-24 12:05:30 +1200991 imageLayout,
992 pColor,
993 1,
994 &range);
995 }
Chris Forbes2951d7d2015-06-22 17:21:59 +1200996}
997
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -0600998void cmd_clear_depth_stencil_attachment(
Chris Forbes2951d7d2015-06-22 17:21:59 +1200999 VkCmdBuffer cmdBuffer,
Courtney Goeltzenleuchteraeffeae2015-09-10 17:58:54 -06001000 VkImageAspectFlags aspectMask,
Chris Forbes2951d7d2015-06-22 17:21:59 +12001001 VkImageLayout imageLayout,
Courtney Goeltzenleuchter315ad992015-09-15 18:03:22 -06001002 const VkClearDepthStencilValue* pDepthStencil,
Chris Forbes2951d7d2015-06-22 17:21:59 +12001003 uint32_t rectCount,
Courtney Goeltzenleuchtera12e2912015-10-15 18:22:08 -06001004 const VkClearRect *pRects)
Chris Forbes2951d7d2015-06-22 17:21:59 +12001005{
1006 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wubdeed152015-07-09 12:16:29 +08001007 const struct intel_render_pass_subpass *subpass =
1008 cmd->bind.render_pass_subpass;
Chia-I Wu3d4d4a62015-07-09 10:34:10 +08001009 const struct intel_fb *fb = cmd->bind.fb;
Chia-I Wubdeed152015-07-09 12:16:29 +08001010 const struct intel_att_view *view = fb->views[subpass->ds_index];
Chris Forbes1e16cb82015-06-24 12:05:30 +12001011
1012 /* Convert each rect3d to clear into a subresource clear.
1013 * TODO: this currently only supports full layer clears --
1014 * cmd_meta_clear_depth_stencil_image does not provide a means to
1015 * specify the xy bounds.
1016 */
1017 for (uint32_t i = 0; i < rectCount; i++) {
Chris Forbes6871cda2015-09-18 12:52:51 +12001018 VkImageSubresourceRange range = {
1019 aspectMask,
1020 view->mipLevel,
1021 1,
Courtney Goeltzenleuchter2ebc2342015-10-21 17:57:31 -06001022 0,
1023 1
Chris Forbes6871cda2015-09-18 12:52:51 +12001024 };
Chris Forbes1e16cb82015-06-24 12:05:30 +12001025
Chris Forbes6871cda2015-09-18 12:52:51 +12001026 cmd_meta_clear_depth_stencil_image(cmdBuffer,
1027 view->img, imageLayout,
1028 pDepthStencil->depth, pDepthStencil->stencil, 1, &range);
Chris Forbes1e16cb82015-06-24 12:05:30 +12001029 }
Chris Forbes2951d7d2015-06-22 17:21:59 +12001030}
1031
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06001032void VKAPI vkCmdClearAttachments(
1033 VkCmdBuffer cmdBuffer,
1034 uint32_t attachmentCount,
1035 const VkClearAttachment* pAttachments,
1036 uint32_t rectCount,
Courtney Goeltzenleuchtera12e2912015-10-15 18:22:08 -06001037 const VkClearRect* pRects)
Courtney Goeltzenleuchter9feb0732015-10-15 16:51:05 -06001038{
1039 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1040
1041 for (uint32_t i = 0; i < attachmentCount; i++) {
1042 if (pAttachments[i].aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) {
1043 cmd_clear_color_attachment(
1044 cmdBuffer,
1045 pAttachments[i].colorAttachment,
1046 cmd->bind.render_pass->attachments[i].final_layout,
1047 &pAttachments[i].clearValue.color,
1048 rectCount,
1049 pRects);
1050 } else {
1051 cmd_clear_depth_stencil_attachment(
1052 cmdBuffer,
1053 pAttachments[i].aspectMask,
1054 cmd->bind.render_pass_subpass->ds_layout,
1055 &pAttachments[i].clearValue.depthStencil,
1056 rectCount,
1057 pRects);
1058 }
1059 }
1060}
1061
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06001062ICD_EXPORT void VKAPI vkCmdResolveImage(
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001063 VkCmdBuffer cmdBuffer,
1064 VkImage srcImage,
1065 VkImageLayout srcImageLayout,
1066 VkImage destImage,
1067 VkImageLayout destImageLayout,
Tony Barbour11f74372015-04-13 15:02:52 -06001068 uint32_t regionCount,
1069 const VkImageResolve* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +08001070{
1071 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1072 struct intel_img *src = intel_img(srcImage);
1073 struct intel_img *dst = intel_img(destImage);
1074 struct intel_cmd_meta meta;
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -06001075 VkFormat format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001076 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001077
Chia-I Wuc14d1562014-10-17 09:49:22 +08001078 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 Goeltzenleuchterba11ebe2015-10-21 17:00:51 -06001100 cmd_meta_set_src_for_img(cmd, src, format, VK_IMAGE_ASPECT_COLOR_BIT, &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 Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06001108 meta.src.layer = region->srcSubresource.baseArrayLayer + 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 Goeltzenleuchter63f0ead2015-10-16 09:46:00 -06001113 meta.dst.layer = region->destSubresource.baseArrayLayer + 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}