blob: 88b6f28ec1cc8cda59402593fc5830077a059442 [file] [log] [blame]
Chia-I Wuc14d1562014-10-17 09:49:22 +08001/*
2 * XGL
3 *
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"
33
Chia-I Wu714df452015-01-01 07:55:04 +080034static XGL_RESULT cmd_meta_create_buf_view(struct intel_cmd *cmd,
35 XGL_BUFFER buf,
36 XGL_GPU_SIZE range,
37 XGL_FORMAT format,
38 struct intel_buf_view **view)
Chia-I Wuc14d1562014-10-17 09:49:22 +080039{
Chia-I Wu714df452015-01-01 07:55:04 +080040 XGL_BUFFER_VIEW_CREATE_INFO info;
Chia-I Wuc14d1562014-10-17 09:49:22 +080041
42 memset(&info, 0, sizeof(info));
Chia-I Wu714df452015-01-01 07:55:04 +080043 info.sType = XGL_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
44 info.buffer = buf;
45 info.viewType = XGL_BUFFER_VIEW_TYPED;
Chia-I Wuc14d1562014-10-17 09:49:22 +080046 info.stride = icd_format_get_size(format);
47 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 */
54 if (info.range % info.stride)
55 info.range += info.stride - (info.range % info.stride);
56
Chia-I Wu714df452015-01-01 07:55:04 +080057 return intel_buf_view_create(cmd->dev, &info, view);
Chia-I Wuc14d1562014-10-17 09:49:22 +080058}
59
Chia-I Wu714df452015-01-01 07:55:04 +080060static void cmd_meta_set_src_for_buf(struct intel_cmd *cmd,
61 const struct intel_buf *buf,
Chia-I Wuc14d1562014-10-17 09:49:22 +080062 XGL_FORMAT format,
63 struct intel_cmd_meta *meta)
64{
Chia-I Wu714df452015-01-01 07:55:04 +080065 struct intel_buf_view *view;
66 XGL_RESULT res;
Chia-I Wuc14d1562014-10-17 09:49:22 +080067
Chia-I Wu714df452015-01-01 07:55:04 +080068 res = cmd_meta_create_buf_view(cmd, (XGL_BUFFER) buf,
69 buf->size, format, &view);
70 if (res != XGL_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -070071 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +080072 return;
73 }
Chia-I Wuc14d1562014-10-17 09:49:22 +080074
75 meta->src.valid = true;
76
Chia-I Wu714df452015-01-01 07:55:04 +080077 memcpy(meta->src.surface, view->cmd,
78 sizeof(view->cmd[0]) * view->cmd_len);
79 meta->src.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +080080
Chia-I Wu714df452015-01-01 07:55:04 +080081 intel_buf_view_destroy(view);
82
83 meta->src.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +080084 meta->src.reloc_offset = 0;
85 meta->src.reloc_flags = 0;
86}
87
Chia-I Wu714df452015-01-01 07:55:04 +080088static void cmd_meta_set_dst_for_buf(struct intel_cmd *cmd,
89 const struct intel_buf *buf,
Chia-I Wuc14d1562014-10-17 09:49:22 +080090 XGL_FORMAT format,
91 struct intel_cmd_meta *meta)
92{
Chia-I Wu714df452015-01-01 07:55:04 +080093 struct intel_buf_view *view;
94 XGL_RESULT res;
Chia-I Wuc14d1562014-10-17 09:49:22 +080095
Chia-I Wu714df452015-01-01 07:55:04 +080096 res = cmd_meta_create_buf_view(cmd, (XGL_BUFFER) buf,
97 buf->size, format, &view);
98 if (res != XGL_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -070099 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800100 return;
101 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800102
103 meta->dst.valid = true;
104
Chia-I Wu714df452015-01-01 07:55:04 +0800105 memcpy(meta->dst.surface, view->cmd,
106 sizeof(view->cmd[0]) * view->cmd_len);
107 meta->dst.surface_len = view->cmd_len;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800108
Chia-I Wu714df452015-01-01 07:55:04 +0800109 intel_buf_view_destroy(view);
110
111 meta->dst.reloc_target = (intptr_t) buf->obj.mem->bo;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800112 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800113 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800114}
115
116static void cmd_meta_set_src_for_img(struct intel_cmd *cmd,
117 const struct intel_img *img,
118 XGL_FORMAT format,
119 XGL_IMAGE_ASPECT aspect,
120 struct intel_cmd_meta *meta)
121{
122 XGL_IMAGE_VIEW_CREATE_INFO info;
123 struct intel_img_view *view;
124 XGL_RESULT ret;
125
126 memset(&info, 0, sizeof(info));
127 info.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
128 info.image = (XGL_IMAGE) img;
129
130 switch (img->type) {
131 case XGL_IMAGE_1D:
132 info.viewType = XGL_IMAGE_VIEW_1D;
133 break;
134 case XGL_IMAGE_2D:
135 info.viewType = XGL_IMAGE_VIEW_2D;
136 break;
137 case XGL_IMAGE_3D:
138 info.viewType = XGL_IMAGE_VIEW_3D;
139 break;
140 default:
141 break;
142 }
143
144 info.format = format;
145 info.channels.r = XGL_CHANNEL_SWIZZLE_R;
146 info.channels.g = XGL_CHANNEL_SWIZZLE_G;
147 info.channels.b = XGL_CHANNEL_SWIZZLE_B;
148 info.channels.a = XGL_CHANNEL_SWIZZLE_A;
149 info.subresourceRange.aspect = aspect;
150 info.subresourceRange.baseMipLevel = 0;
151 info.subresourceRange.mipLevels = XGL_LAST_MIP_OR_SLICE;
152 info.subresourceRange.baseArraySlice = 0;
153 info.subresourceRange.arraySize = XGL_LAST_MIP_OR_SLICE;
154
155 ret = intel_img_view_create(cmd->dev, &info, &view);
156 if (ret != XGL_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700157 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800158 return;
159 }
160
161 meta->src.valid = true;
162
163 memcpy(meta->src.surface, view->cmd,
164 sizeof(view->cmd[0]) * view->cmd_len);
165 meta->src.surface_len = view->cmd_len;
166
167 meta->src.reloc_target = (intptr_t) img->obj.mem->bo;
168 meta->src.reloc_offset = 0;
169 meta->src.reloc_flags = 0;
170
171 intel_img_view_destroy(view);
172}
173
Chia-I Wu83084ba2014-12-04 12:49:52 +0800174static void cmd_meta_adjust_compressed_dst(struct intel_cmd *cmd,
175 const struct intel_img *img,
176 struct intel_cmd_meta *meta)
177{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600178 int32_t w, h, layer;
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800179 unsigned x_offset, y_offset;
Chia-I Wu83084ba2014-12-04 12:49:52 +0800180
181 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
182 w = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_WIDTH);
183 h = GEN_EXTRACT(meta->dst.surface[2], GEN7_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800184 layer = GEN_EXTRACT(meta->dst.surface[4],
185 GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800186 } else {
187 w = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_WIDTH);
188 h = GEN_EXTRACT(meta->dst.surface[2], GEN6_SURFACE_DW2_HEIGHT);
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800189 layer = GEN_EXTRACT(meta->dst.surface[4],
190 GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800191 }
192
193 /* note that the width/height fields have the real values minus 1 */
194 w = (w + img->layout.block_width) / img->layout.block_width - 1;
195 h = (h + img->layout.block_height) / img->layout.block_height - 1;
196
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800197 /* adjust width and height */
Chia-I Wu83084ba2014-12-04 12:49:52 +0800198 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800199 meta->dst.surface[2] &= ~(GEN7_SURFACE_DW2_WIDTH__MASK |
200 GEN7_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800201 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN7_SURFACE_DW2_WIDTH) |
202 GEN_SHIFT32(h, GEN7_SURFACE_DW2_HEIGHT);
203 } else {
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800204 meta->dst.surface[2] &= ~(GEN6_SURFACE_DW2_WIDTH__MASK |
205 GEN6_SURFACE_DW2_HEIGHT__MASK);
Chia-I Wu83084ba2014-12-04 12:49:52 +0800206 meta->dst.surface[2] |= GEN_SHIFT32(w, GEN6_SURFACE_DW2_WIDTH) |
207 GEN_SHIFT32(h, GEN6_SURFACE_DW2_HEIGHT);
208 }
Chia-I Wu0d8c2ee2014-12-04 13:06:45 +0800209
210 if (!layer)
211 return;
212
213 meta->dst.reloc_offset = intel_layout_get_slice_tile_offset(&img->layout,
214 0, layer, &x_offset, &y_offset);
215
216 /*
217 * The lower 2 bits (or 1 bit for Y) are missing. This may be a problem
218 * for small images (16x16 or smaller). We will need to adjust the
219 * drawing rectangle instead.
220 */
221 x_offset = (x_offset / img->layout.block_width) >> 2;
222 y_offset = (y_offset / img->layout.block_height) >> 1;
223
224 /* adjust min array element and X/Y offsets */
225 if (cmd_gen(cmd) >= INTEL_GEN(7)) {
226 meta->dst.surface[4] &= ~GEN7_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
227 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN7_SURFACE_DW5_X_OFFSET) |
228 GEN_SHIFT32(y_offset, GEN7_SURFACE_DW5_Y_OFFSET);
229 } else {
230 meta->dst.surface[4] &= ~GEN6_SURFACE_DW4_MIN_ARRAY_ELEMENT__MASK;
231 meta->dst.surface[5] |= GEN_SHIFT32(x_offset, GEN6_SURFACE_DW5_X_OFFSET) |
232 GEN_SHIFT32(y_offset, GEN6_SURFACE_DW5_Y_OFFSET);
233 }
Chia-I Wu83084ba2014-12-04 12:49:52 +0800234}
235
Chia-I Wuc14d1562014-10-17 09:49:22 +0800236static void cmd_meta_set_dst_for_img(struct intel_cmd *cmd,
237 const struct intel_img *img,
238 XGL_FORMAT format,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600239 uint32_t lod, uint32_t layer,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800240 struct intel_cmd_meta *meta)
241{
242 XGL_COLOR_ATTACHMENT_VIEW_CREATE_INFO info;
243 struct intel_rt_view *rt;
244 XGL_RESULT ret;
245
246 memset(&info, 0, sizeof(info));
247 info.sType = XGL_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO;
248 info.image = (XGL_IMAGE) img;
249 info.format = format;
250 info.mipLevel = lod;
251 info.baseArraySlice = layer;
252 info.arraySize = 1;
253
254 ret = intel_rt_view_create(cmd->dev, &info, &rt);
255 if (ret != XGL_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700256 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800257 return;
258 }
259
260 meta->dst.valid = true;
261
262 memcpy(meta->dst.surface, rt->cmd, sizeof(rt->cmd[0]) * rt->cmd_len);
263 meta->dst.surface_len = rt->cmd_len;
264
265 meta->dst.reloc_target = (intptr_t) img->obj.mem->bo;
266 meta->dst.reloc_offset = 0;
Chia-I Wuc5e2ae32014-11-25 11:00:12 +0800267 meta->dst.reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800268
Chia-I Wu83084ba2014-12-04 12:49:52 +0800269 if (icd_format_is_compressed(img->layout.format))
270 cmd_meta_adjust_compressed_dst(cmd, img, meta);
271
Chia-I Wuc14d1562014-10-17 09:49:22 +0800272 intel_rt_view_destroy(rt);
273}
274
275static void cmd_meta_set_src_for_writer(struct intel_cmd *cmd,
276 enum intel_cmd_writer_type writer,
277 XGL_GPU_SIZE size,
278 XGL_FORMAT format,
279 struct intel_cmd_meta *meta)
280{
Chia-I Wu714df452015-01-01 07:55:04 +0800281 struct intel_buf_view *view;
282 XGL_RESULT res;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800283
Chia-I Wu714df452015-01-01 07:55:04 +0800284 res = cmd_meta_create_buf_view(cmd, (XGL_BUFFER) XGL_NULL_HANDLE,
285 size, format, &view);
286 if (res != XGL_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700287 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800288 return;
289 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800290
291 meta->src.valid = true;
292
Chia-I Wu714df452015-01-01 07:55:04 +0800293 memcpy(meta->src.surface, view->cmd,
294 sizeof(view->cmd[0]) * view->cmd_len);
295 meta->src.surface_len = view->cmd_len;
296
297 intel_buf_view_destroy(view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800298
299 meta->src.reloc_target = (intptr_t) writer;
300 meta->src.reloc_offset = 0;
301 meta->src.reloc_flags = INTEL_CMD_RELOC_TARGET_IS_WRITER;
302}
303
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800304static void cmd_meta_set_ds_view(struct intel_cmd *cmd,
305 const struct intel_img *img,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600306 uint32_t lod, uint32_t layer,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800307 struct intel_cmd_meta *meta)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800308{
309 XGL_DEPTH_STENCIL_VIEW_CREATE_INFO info;
310 struct intel_ds_view *ds;
311 XGL_RESULT ret;
312
313 memset(&info, 0, sizeof(info));
314 info.sType = XGL_STRUCTURE_TYPE_DEPTH_STENCIL_VIEW_CREATE_INFO;
315 info.image = (XGL_IMAGE) img;
316 info.mipLevel = lod;
317 info.baseArraySlice = layer;
318 info.arraySize = 1;
319
320 ret = intel_ds_view_create(cmd->dev, &info, &ds);
321 if (ret != XGL_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700322 cmd_fail(cmd, ret);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800323 return;
324 }
325
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800326 meta->ds.view = ds;
327}
328
329static void cmd_meta_set_ds_state(struct intel_cmd *cmd,
330 XGL_IMAGE_ASPECT aspect,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600331 uint32_t stencil_ref,
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800332 struct intel_cmd_meta *meta)
333{
Tony Barbourfa6cac72015-01-16 14:27:35 -0700334 meta->ds.stencil_ref = stencil_ref;
335 meta->ds.aspect = aspect;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800336}
337
338static enum intel_dev_meta_shader get_shader_id(const struct intel_dev *dev,
339 const struct intel_img *img,
340 bool copy_array)
341{
342 enum intel_dev_meta_shader shader_id;
343
344 switch (img->type) {
345 case XGL_IMAGE_1D:
346 shader_id = (copy_array) ?
347 INTEL_DEV_META_FS_COPY_1D_ARRAY : INTEL_DEV_META_FS_COPY_1D;
348 break;
349 case XGL_IMAGE_2D:
350 shader_id = (img->samples > 1) ? INTEL_DEV_META_FS_COPY_2D_MS :
351 (copy_array) ? INTEL_DEV_META_FS_COPY_2D_ARRAY :
352 INTEL_DEV_META_FS_COPY_2D;
353 break;
354 case XGL_IMAGE_3D:
355 default:
356 shader_id = INTEL_DEV_META_FS_COPY_2D_ARRAY;
357 break;
358 }
359
360 return shader_id;
361}
362
Chia-I Wuf3a27252014-11-24 15:27:01 +0800363static bool cmd_meta_mem_dword_aligned(const struct intel_cmd *cmd,
364 XGL_GPU_SIZE src_offset,
365 XGL_GPU_SIZE dst_offset,
366 XGL_GPU_SIZE size)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800367{
Chia-I Wuf3a27252014-11-24 15:27:01 +0800368 return !((src_offset | dst_offset | size) & 0x3);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800369}
370
371static XGL_FORMAT cmd_meta_img_raw_format(const struct intel_cmd *cmd,
372 XGL_FORMAT format)
373{
Chia-I Wuffdde352014-12-20 15:12:16 +0800374 switch (icd_format_get_size(format)) {
375 case 1:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700376 format = XGL_FMT_R8_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800377 break;
378 case 2:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700379 format = XGL_FMT_R16_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800380 break;
381 case 4:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700382 format = XGL_FMT_R32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800383 break;
384 case 8:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700385 format = XGL_FMT_R32G32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800386 break;
387 case 16:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700388 format = XGL_FMT_R32G32B32A32_UINT;
Chia-I Wuffdde352014-12-20 15:12:16 +0800389 break;
390 default:
391 assert(!"unsupported image format for raw blit op");
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700392 format = XGL_FMT_UNDEFINED;
Chia-I Wuffdde352014-12-20 15:12:16 +0800393 break;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800394 }
395
396 return format;
397}
398
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600399ICD_EXPORT void XGLAPI xglCmdCopyBuffer(
Chia-I Wuc14d1562014-10-17 09:49:22 +0800400 XGL_CMD_BUFFER cmdBuffer,
Chia-I Wu714df452015-01-01 07:55:04 +0800401 XGL_BUFFER srcBuffer,
402 XGL_BUFFER destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600403 uint32_t regionCount,
Chia-I Wu714df452015-01-01 07:55:04 +0800404 const XGL_BUFFER_COPY* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800405{
406 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800407 struct intel_buf *src = intel_buf(srcBuffer);
408 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800409 struct intel_cmd_meta meta;
410 XGL_FORMAT format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600411 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800412
413 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800414 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800415
Chia-I Wuc14d1562014-10-17 09:49:22 +0800416 meta.height = 1;
417 meta.samples = 1;
418
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700419 format = XGL_FMT_UNDEFINED;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800420
421 for (i = 0; i < regionCount; i++) {
Chia-I Wu714df452015-01-01 07:55:04 +0800422 const XGL_BUFFER_COPY *region = &pRegions[i];
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700423 XGL_FORMAT fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800424
Chia-I Wuf3a27252014-11-24 15:27:01 +0800425 meta.src.x = region->srcOffset;
426 meta.dst.x = region->destOffset;
427 meta.width = region->copySize;
428
429 if (cmd_meta_mem_dword_aligned(cmd, region->srcOffset,
430 region->destOffset, region->copySize)) {
431 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
432 meta.src.x /= 4;
433 meta.dst.x /= 4;
434 meta.width /= 4;
435
436 /*
437 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to
438 * be 16
439 */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700440 fmt = XGL_FMT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800441 } else {
442 if (cmd_gen(cmd) == INTEL_GEN(6)) {
443 intel_dev_log(cmd->dev, XGL_DBG_MSG_ERROR,
444 XGL_VALIDATION_LEVEL_0, XGL_NULL_HANDLE, 0, 0,
Chia-I Wu714df452015-01-01 07:55:04 +0800445 "unaligned xglCmdCopyBuffer unsupported");
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700446 cmd_fail(cmd, XGL_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800447 continue;
448 }
449
450 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM_UNALIGNED;
451
452 /*
453 * INTEL_DEV_META_VS_COPY_MEM_UNALIGNED is untyped but expects the
454 * stride to be 4
455 */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700456 fmt = XGL_FMT_R8G8B8A8_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800457 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800458
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700459 if (format != fmt) {
460 format = fmt;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800461
Chia-I Wu714df452015-01-01 07:55:04 +0800462 cmd_meta_set_src_for_buf(cmd, src, format, &meta);
463 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800464 }
465
Chia-I Wuc14d1562014-10-17 09:49:22 +0800466 cmd_draw_meta(cmd, &meta);
467 }
468}
469
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600470ICD_EXPORT void XGLAPI xglCmdCopyImage(
Chia-I Wuc14d1562014-10-17 09:49:22 +0800471 XGL_CMD_BUFFER cmdBuffer,
472 XGL_IMAGE srcImage,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -0600473 XGL_IMAGE_LAYOUT srcImageLayout,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800474 XGL_IMAGE destImage,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -0600475 XGL_IMAGE_LAYOUT destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600476 uint32_t regionCount,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800477 const XGL_IMAGE_COPY* pRegions)
478{
479 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
480 struct intel_img *src = intel_img(srcImage);
481 struct intel_img *dst = intel_img(destImage);
482 struct intel_cmd_meta meta;
483 XGL_FORMAT raw_format;
Cody Northrop30a2b462015-02-10 09:28:30 -0700484 bool raw_copy = false;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600485 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800486
487 if (src->type != dst->type) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700488 cmd_fail(cmd, XGL_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800489 return;
490 }
491
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700492 if (src->layout.format == dst->layout.format) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800493 raw_copy = true;
494 raw_format = cmd_meta_img_raw_format(cmd, src->layout.format);
495 } else if (icd_format_is_compressed(src->layout.format) ||
496 icd_format_is_compressed(dst->layout.format)) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700497 cmd_fail(cmd, XGL_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800498 return;
499 }
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,
506 XGL_IMAGE_ASPECT_COLOR, &meta);
507
508 meta.samples = dst->samples;
509
510 for (i = 0; i < regionCount; i++) {
511 const XGL_IMAGE_COPY *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;
518 meta.src.layer = region->srcSubresource.arraySlice +
519 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;
524 meta.dst.layer = region->destSubresource.arraySlice +
525 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 Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600557ICD_EXPORT void XGLAPI xglCmdBlitImage(
558 XGL_CMD_BUFFER cmdBuffer,
559 XGL_IMAGE srcImage,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -0600560 XGL_IMAGE_LAYOUT srcImageLayout,
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600561 XGL_IMAGE destImage,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -0600562 XGL_IMAGE_LAYOUT destImageLayout,
Courtney Goeltzenleuchterb787a1e2015-03-08 17:02:18 -0600563 uint32_t regionCount,
564 const XGL_IMAGE_BLIT* pRegions)
565{
566 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
567
568 /*
569 * TODO: Implement actual blit function.
570 */
571 cmd_fail(cmd, XGL_ERROR_UNAVAILABLE);
572}
573
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600574ICD_EXPORT void XGLAPI xglCmdCopyBufferToImage(
Chia-I Wuc14d1562014-10-17 09:49:22 +0800575 XGL_CMD_BUFFER cmdBuffer,
Chia-I Wu714df452015-01-01 07:55:04 +0800576 XGL_BUFFER srcBuffer,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800577 XGL_IMAGE destImage,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -0600578 XGL_IMAGE_LAYOUT destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600579 uint32_t regionCount,
Chia-I Wu714df452015-01-01 07:55:04 +0800580 const XGL_BUFFER_IMAGE_COPY* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800581{
582 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800583 struct intel_buf *buf = intel_buf(srcBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800584 struct intel_img *img = intel_img(destImage);
585 struct intel_cmd_meta meta;
586 XGL_FORMAT format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800587 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800588
589 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800590 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800591
592 meta.shader_id = INTEL_DEV_META_FS_COPY_MEM_TO_IMG;
593 meta.samples = img->samples;
594
595 format = cmd_meta_img_raw_format(cmd, img->layout.format);
Mike Stroyanbc4e2ed2015-03-24 15:10:24 -0600596 block_width = icd_format_get_block_width(img->layout.format);
Chia-I Wu714df452015-01-01 07:55:04 +0800597 cmd_meta_set_src_for_buf(cmd, buf, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800598
599 for (i = 0; i < regionCount; i++) {
Chia-I Wu714df452015-01-01 07:55:04 +0800600 const XGL_BUFFER_IMAGE_COPY *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600601 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800602
Chia-I Wu714df452015-01-01 07:55:04 +0800603 meta.src.x = region->bufferOffset / icd_format_get_size(format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800604
605 meta.dst.lod = region->imageSubresource.mipLevel;
606 meta.dst.layer = region->imageSubresource.arraySlice +
607 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800608 meta.dst.x = region->imageOffset.x / block_width;
609 meta.dst.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800610
Chia-I Wueccc7682015-03-24 14:15:30 +0800611 meta.width = region->imageExtent.width / block_width;
612 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800613
614 for (j = 0; j < region->imageExtent.depth; j++) {
615 cmd_meta_set_dst_for_img(cmd, img, format,
616 meta.dst.lod, meta.dst.layer, &meta);
617
618 cmd_draw_meta(cmd, &meta);
619
620 meta.src.x += meta.width * meta.height;
621 meta.dst.layer++;
622 }
623 }
624}
625
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600626ICD_EXPORT void XGLAPI xglCmdCopyImageToBuffer(
Chia-I Wuc14d1562014-10-17 09:49:22 +0800627 XGL_CMD_BUFFER cmdBuffer,
628 XGL_IMAGE srcImage,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -0600629 XGL_IMAGE_LAYOUT srcImageLayout,
Chia-I Wu714df452015-01-01 07:55:04 +0800630 XGL_BUFFER destBuffer,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600631 uint32_t regionCount,
Chia-I Wu714df452015-01-01 07:55:04 +0800632 const XGL_BUFFER_IMAGE_COPY* pRegions)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800633{
634 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
635 struct intel_img *img = intel_img(srcImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800636 struct intel_buf *buf = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800637 struct intel_cmd_meta meta;
Chia-I Wu714df452015-01-01 07:55:04 +0800638 XGL_FORMAT img_format, buf_format;
Chia-I Wueccc7682015-03-24 14:15:30 +0800639 uint32_t block_width, i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800640
641 memset(&meta, 0, sizeof(meta));
Chia-I Wua44b6482014-12-20 14:58:01 +0800642 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800643
Chia-I Wua44b6482014-12-20 14:58:01 +0800644 img_format = cmd_meta_img_raw_format(cmd, img->layout.format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800645 block_width = icd_format_get_block_width(img_format);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800646
Chia-I Wu714df452015-01-01 07:55:04 +0800647 /* buf_format is ignored by hw, but we derive stride from it */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700648 switch (img_format) {
649 case XGL_FMT_R8_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800650 meta.shader_id = INTEL_DEV_META_VS_COPY_R8_TO_MEM;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700651 buf_format = XGL_FMT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800652 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700653 case XGL_FMT_R16_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800654 meta.shader_id = INTEL_DEV_META_VS_COPY_R16_TO_MEM;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700655 buf_format = XGL_FMT_R8G8B8A8_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800656 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700657 case XGL_FMT_R32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800658 meta.shader_id = INTEL_DEV_META_VS_COPY_R32_TO_MEM;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700659 buf_format = XGL_FMT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800660 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700661 case XGL_FMT_R32G32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800662 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32_TO_MEM;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700663 buf_format = XGL_FMT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800664 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700665 case XGL_FMT_R32G32B32A32_UINT:
Chia-I Wua44b6482014-12-20 14:58:01 +0800666 meta.shader_id = INTEL_DEV_META_VS_COPY_R32G32B32A32_TO_MEM;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700667 buf_format = XGL_FMT_R32G32B32A32_UINT;
Chia-I Wua44b6482014-12-20 14:58:01 +0800668 break;
669 default:
Chia-I Wub93638e2015-02-18 10:30:50 -0700670 img_format = XGL_FMT_UNDEFINED;
671 buf_format = XGL_FMT_UNDEFINED;
Chia-I Wua44b6482014-12-20 14:58:01 +0800672 break;
673 }
674
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700675 if (img_format == XGL_FMT_UNDEFINED ||
Chia-I Wua44b6482014-12-20 14:58:01 +0800676 (cmd_gen(cmd) == INTEL_GEN(6) &&
677 icd_format_get_size(img_format) < 4)) {
678 intel_dev_log(cmd->dev, XGL_DBG_MSG_ERROR,
679 XGL_VALIDATION_LEVEL_0, XGL_NULL_HANDLE, 0, 0,
Chia-I Wu714df452015-01-01 07:55:04 +0800680 "xglCmdCopyImageToBuffer with bpp %d unsupported",
Chia-I Wua44b6482014-12-20 14:58:01 +0800681 icd_format_get_size(img->layout.format));
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700682 cmd_fail(cmd, XGL_ERROR_UNKNOWN);
Chia-I Wua44b6482014-12-20 14:58:01 +0800683 return;
684 }
685
686 cmd_meta_set_src_for_img(cmd, img, img_format,
687 XGL_IMAGE_ASPECT_COLOR, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800688 cmd_meta_set_dst_for_buf(cmd, buf, buf_format, &meta);
Chia-I Wua44b6482014-12-20 14:58:01 +0800689
Chia-I Wuc14d1562014-10-17 09:49:22 +0800690 meta.samples = 1;
691
692 for (i = 0; i < regionCount; i++) {
Chia-I Wu714df452015-01-01 07:55:04 +0800693 const XGL_BUFFER_IMAGE_COPY *region = &pRegions[i];
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600694 uint32_t j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800695
Chia-I Wuc14d1562014-10-17 09:49:22 +0800696 meta.src.lod = region->imageSubresource.mipLevel;
697 meta.src.layer = region->imageSubresource.arraySlice +
698 region->imageOffset.z;
Chia-I Wueccc7682015-03-24 14:15:30 +0800699 meta.src.x = region->imageOffset.x / block_width;
700 meta.src.y = region->imageOffset.y / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800701
Chia-I Wu714df452015-01-01 07:55:04 +0800702 meta.dst.x = region->bufferOffset / icd_format_get_size(img_format);
Chia-I Wueccc7682015-03-24 14:15:30 +0800703 meta.width = region->imageExtent.width / block_width;
704 meta.height = region->imageExtent.height / block_width;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800705
706 for (j = 0; j < region->imageExtent.depth; j++) {
707 cmd_draw_meta(cmd, &meta);
708
709 meta.src.layer++;
Chia-I Wua44b6482014-12-20 14:58:01 +0800710 meta.dst.x += meta.width * meta.height;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800711 }
712 }
713}
714
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600715ICD_EXPORT void XGLAPI xglCmdCloneImageData(
Chia-I Wuc14d1562014-10-17 09:49:22 +0800716 XGL_CMD_BUFFER cmdBuffer,
717 XGL_IMAGE srcImage,
Mike Stroyan55658c22014-12-04 11:08:39 +0000718 XGL_IMAGE_LAYOUT srcImageLayout,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800719 XGL_IMAGE destImage,
Mike Stroyan55658c22014-12-04 11:08:39 +0000720 XGL_IMAGE_LAYOUT destImageLayout)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800721{
Chia-I Wud788fc62014-12-22 14:24:11 +0800722 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
723 struct intel_img *src = intel_img(srcImage);
724 struct intel_img *dst = intel_img(destImage);
Chia-I Wu714df452015-01-01 07:55:04 +0800725 struct intel_buf *src_buf, *dst_buf;
726 XGL_BUFFER_CREATE_INFO buf_info;
727 XGL_BUFFER_COPY buf_region;
728 XGL_RESULT res;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800729
Chia-I Wu714df452015-01-01 07:55:04 +0800730 memset(&buf_info, 0, sizeof(buf_info));
731 buf_info.sType = XGL_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
732 buf_info.size = src->obj.mem->size;
733
734 memset(&buf_region, 0, sizeof(buf_region));
735 buf_region.copySize = src->obj.mem->size;
736
737 res = intel_buf_create(cmd->dev, &buf_info, &src_buf);
738 if (res != XGL_SUCCESS) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700739 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800740 return;
741 }
742
743 res = intel_buf_create(cmd->dev, &buf_info, &dst_buf);
744 if (res != XGL_SUCCESS) {
745 intel_buf_destroy(src_buf);
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700746 cmd_fail(cmd, res);
Chia-I Wu714df452015-01-01 07:55:04 +0800747 return;
748 }
749
750 intel_obj_bind_mem(&src_buf->obj, src->obj.mem, 0);
751 intel_obj_bind_mem(&dst_buf->obj, dst->obj.mem, 0);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800752
Chia-I Wud788fc62014-12-22 14:24:11 +0800753 cmd_batch_flush(cmd, GEN6_PIPE_CONTROL_RENDER_CACHE_FLUSH);
Chia-I Wu714df452015-01-01 07:55:04 +0800754 xglCmdCopyBuffer(cmdBuffer, (XGL_BUFFER) src_buf,
755 (XGL_BUFFER) dst_buf, 1, &buf_region);
756
757 intel_buf_destroy(src_buf);
758 intel_buf_destroy(dst_buf);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800759}
760
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600761ICD_EXPORT void XGLAPI xglCmdUpdateBuffer(
Chia-I Wuc14d1562014-10-17 09:49:22 +0800762 XGL_CMD_BUFFER cmdBuffer,
Chia-I Wu714df452015-01-01 07:55:04 +0800763 XGL_BUFFER destBuffer,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800764 XGL_GPU_SIZE destOffset,
765 XGL_GPU_SIZE dataSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600766 const uint32_t* pData)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800767{
768 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800769 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800770 struct intel_cmd_meta meta;
771 XGL_FORMAT format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800772 uint32_t *ptr;
773 uint32_t offset;
774
Chia-I Wuf3a27252014-11-24 15:27:01 +0800775 /* must be 4-byte aligned */
776 if ((destOffset | dataSize) & 3) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700777 cmd_fail(cmd, XGL_ERROR_UNKNOWN);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800778 return;
779 }
780
Chia-I Wuc14d1562014-10-17 09:49:22 +0800781 /* write to dynamic state writer first */
782 offset = cmd_state_pointer(cmd, INTEL_CMD_ITEM_BLOB, 32,
783 (dataSize + 3) / 4, &ptr);
784 memcpy(ptr, pData, dataSize);
785
Chia-I Wuc14d1562014-10-17 09:49:22 +0800786 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800787 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800788
Chia-I Wuf3a27252014-11-24 15:27:01 +0800789 meta.shader_id = INTEL_DEV_META_VS_COPY_MEM;
790
791 meta.src.x = offset / 4;
792 meta.dst.x = destOffset / 4;
793 meta.width = dataSize / 4;
794 meta.height = 1;
795 meta.samples = 1;
796
797 /*
798 * INTEL_DEV_META_VS_COPY_MEM is untyped but expects the stride to be 16
799 */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700800 format = XGL_FMT_R32G32B32A32_UINT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800801
802 cmd_meta_set_src_for_writer(cmd, INTEL_CMD_WRITER_STATE,
803 offset + dataSize, format, &meta);
Chia-I Wu714df452015-01-01 07:55:04 +0800804 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800805
Chia-I Wuc14d1562014-10-17 09:49:22 +0800806 cmd_draw_meta(cmd, &meta);
807}
808
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600809ICD_EXPORT void XGLAPI xglCmdFillBuffer(
Chia-I Wuc14d1562014-10-17 09:49:22 +0800810 XGL_CMD_BUFFER cmdBuffer,
Chia-I Wu714df452015-01-01 07:55:04 +0800811 XGL_BUFFER destBuffer,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800812 XGL_GPU_SIZE destOffset,
813 XGL_GPU_SIZE fillSize,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600814 uint32_t data)
Chia-I Wuc14d1562014-10-17 09:49:22 +0800815{
816 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
Chia-I Wu714df452015-01-01 07:55:04 +0800817 struct intel_buf *dst = intel_buf(destBuffer);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800818 struct intel_cmd_meta meta;
819 XGL_FORMAT format;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800820
821 /* must be 4-byte aligned */
822 if ((destOffset | fillSize) & 3) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -0700823 cmd_fail(cmd, XGL_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800824 return;
825 }
826
827 memset(&meta, 0, sizeof(meta));
Chia-I Wuf3a27252014-11-24 15:27:01 +0800828 meta.mode = INTEL_CMD_META_VS_POINTS;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800829
Chia-I Wuf3a27252014-11-24 15:27:01 +0800830 meta.shader_id = INTEL_DEV_META_VS_FILL_MEM;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800831
832 meta.clear_val[0] = data;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800833
Chia-I Wuf3a27252014-11-24 15:27:01 +0800834 meta.dst.x = destOffset / 4;
835 meta.width = fillSize / 4;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800836 meta.height = 1;
837 meta.samples = 1;
838
Chia-I Wuf3a27252014-11-24 15:27:01 +0800839 /*
840 * INTEL_DEV_META_VS_FILL_MEM is untyped but expects the stride to be 16
841 */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700842 format = XGL_FMT_R32G32B32A32_UINT;
Chia-I Wuf3a27252014-11-24 15:27:01 +0800843
Chia-I Wu714df452015-01-01 07:55:04 +0800844 cmd_meta_set_dst_for_buf(cmd, dst, format, &meta);
Chia-I Wuf3a27252014-11-24 15:27:01 +0800845
Chia-I Wuc14d1562014-10-17 09:49:22 +0800846 cmd_draw_meta(cmd, &meta);
847}
848
849static void cmd_meta_clear_image(struct intel_cmd *cmd,
850 struct intel_img *img,
851 XGL_FORMAT format,
852 struct intel_cmd_meta *meta,
853 const XGL_IMAGE_SUBRESOURCE_RANGE *range)
854{
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600855 uint32_t mip_levels, array_size;
856 uint32_t i, j;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800857
858 if (range->baseMipLevel >= img->mip_levels ||
859 range->baseArraySlice >= img->array_size)
860 return;
861
862 mip_levels = img->mip_levels - range->baseMipLevel;
863 if (mip_levels > range->mipLevels)
864 mip_levels = range->mipLevels;
865
866 array_size = img->array_size - range->baseArraySlice;
867 if (array_size > range->arraySize)
868 array_size = range->arraySize;
869
Chia-I Wuc14d1562014-10-17 09:49:22 +0800870 for (i = 0; i < mip_levels; i++) {
Chia-I Wufaaed472014-10-28 14:17:43 +0800871 meta->dst.lod = range->baseMipLevel + i;
872 meta->dst.layer = range->baseArraySlice;
873
Chia-I Wu73520ac2015-02-19 11:17:45 -0700874 /* TODO INTEL_CMD_META_DS_HIZ_CLEAR requires 8x4 aligned rectangle */
Chia-I Wuc14d1562014-10-17 09:49:22 +0800875 meta->width = u_minify(img->layout.width0, meta->dst.lod);
876 meta->height = u_minify(img->layout.height0, meta->dst.lod);
877
Chia-I Wu73520ac2015-02-19 11:17:45 -0700878 if (meta->ds.op != INTEL_CMD_META_DS_NOP &&
879 !intel_img_can_enable_hiz(img, meta->dst.lod))
880 continue;
881
Chia-I Wuc14d1562014-10-17 09:49:22 +0800882 for (j = 0; j < array_size; j++) {
883 if (range->aspect == XGL_IMAGE_ASPECT_COLOR) {
884 cmd_meta_set_dst_for_img(cmd, img, format,
885 meta->dst.lod, meta->dst.layer, meta);
886
887 cmd_draw_meta(cmd, meta);
888 } else {
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800889 cmd_meta_set_ds_view(cmd, img, meta->dst.lod,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800890 meta->dst.layer, meta);
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800891 cmd_meta_set_ds_state(cmd, range->aspect,
892 meta->clear_val[1], meta);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800893
894 cmd_draw_meta(cmd, meta);
895
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800896 intel_ds_view_destroy(meta->ds.view);
Chia-I Wuc14d1562014-10-17 09:49:22 +0800897 }
898
899 meta->dst.layer++;
900 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800901 }
902}
903
Chia-I Wu73520ac2015-02-19 11:17:45 -0700904void cmd_meta_ds_op(struct intel_cmd *cmd,
905 enum intel_cmd_meta_ds_op op,
906 struct intel_img *img,
907 const XGL_IMAGE_SUBRESOURCE_RANGE *range)
908{
909 struct intel_cmd_meta meta;
910
911 if (img->layout.aux != INTEL_LAYOUT_AUX_HIZ)
912 return;
913 if (range->aspect != XGL_IMAGE_ASPECT_DEPTH)
914 return;
915
916 memset(&meta, 0, sizeof(meta));
917 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
918 meta.samples = img->samples;
919
920 meta.ds.aspect = XGL_IMAGE_ASPECT_DEPTH;
921 meta.ds.op = op;
922 meta.ds.optimal = true;
923
924 cmd_meta_clear_image(cmd, img, img->layout.format, &meta, range);
925}
926
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600927ICD_EXPORT void XGLAPI xglCmdClearColorImage(
Chia-I Wuc14d1562014-10-17 09:49:22 +0800928 XGL_CMD_BUFFER cmdBuffer,
929 XGL_IMAGE image,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -0600930 XGL_IMAGE_LAYOUT imageLayout,
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600931 XGL_CLEAR_COLOR clearColor,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600932 uint32_t rangeCount,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800933 const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
934{
935 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
936 struct intel_img *img = intel_img(image);
937 struct intel_cmd_meta meta;
938 XGL_FORMAT format;
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_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800943
944 meta.shader_id = INTEL_DEV_META_FS_CLEAR_COLOR;
945 meta.samples = img->samples;
946
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600947 if (clearColor.useRawValue) {
948 icd_format_get_raw_value(img->layout.format, clearColor.color.rawColor, meta.clear_val);
949 format = cmd_meta_img_raw_format(cmd, img->layout.format);
950 } else {
951 meta.clear_val[0] = u_fui(clearColor.color.floatColor[0]);
952 meta.clear_val[1] = u_fui(clearColor.color.floatColor[1]);
953 meta.clear_val[2] = u_fui(clearColor.color.floatColor[2]);
954 meta.clear_val[3] = u_fui(clearColor.color.floatColor[3]);
955 format = img->layout.format;
956 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800957
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600958 for (i = 0; i < rangeCount; i++) {
Chia-I Wuc14d1562014-10-17 09:49:22 +0800959 cmd_meta_clear_image(cmd, img, format, &meta, &pRanges[i]);
Courtney Goeltzenleuchter9a1ded82015-04-03 16:35:32 -0600960 }
Chia-I Wuc14d1562014-10-17 09:49:22 +0800961}
962
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600963ICD_EXPORT void XGLAPI xglCmdClearDepthStencil(
Chia-I Wuc14d1562014-10-17 09:49:22 +0800964 XGL_CMD_BUFFER cmdBuffer,
965 XGL_IMAGE image,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -0600966 XGL_IMAGE_LAYOUT imageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600967 float depth,
968 uint32_t stencil,
969 uint32_t rangeCount,
Chia-I Wuc14d1562014-10-17 09:49:22 +0800970 const XGL_IMAGE_SUBRESOURCE_RANGE* pRanges)
971{
972 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
973 struct intel_img *img = intel_img(image);
974 struct intel_cmd_meta meta;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600975 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800976
977 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +0800978 meta.mode = INTEL_CMD_META_DEPTH_STENCIL_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +0800979
980 meta.shader_id = INTEL_DEV_META_FS_CLEAR_DEPTH;
981 meta.samples = img->samples;
982
Chia-I Wu429a0aa2014-10-24 11:57:51 +0800983 meta.clear_val[0] = u_fui(depth);
984 meta.clear_val[1] = stencil;
985
Courtney Goeltzenleuchter3b61a592015-03-30 15:07:58 -0600986 if (imageLayout == XGL_IMAGE_LAYOUT_CLEAR_OPTIMAL ||
987 imageLayout == XGL_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
988 imageLayout == XGL_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) {
989 meta.ds.optimal = true;
990 }
Chia-I Wu73520ac2015-02-19 11:17:45 -0700991
Chia-I Wuc14d1562014-10-17 09:49:22 +0800992 for (i = 0; i < rangeCount; i++) {
993 const XGL_IMAGE_SUBRESOURCE_RANGE *range = &pRanges[i];
994
Chia-I Wuc14d1562014-10-17 09:49:22 +0800995 cmd_meta_clear_image(cmd, img, img->layout.format,
996 &meta, range);
997 }
998}
999
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001000ICD_EXPORT void XGLAPI xglCmdResolveImage(
Chia-I Wuc14d1562014-10-17 09:49:22 +08001001 XGL_CMD_BUFFER cmdBuffer,
1002 XGL_IMAGE srcImage,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -06001003 XGL_IMAGE_LAYOUT srcImageLayout,
Chia-I Wuc14d1562014-10-17 09:49:22 +08001004 XGL_IMAGE destImage,
Courtney Goeltzenleuchter51cbf302015-03-25 11:25:10 -06001005 XGL_IMAGE_LAYOUT destImageLayout,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001006 uint32_t rectCount,
Chia-I Wuc14d1562014-10-17 09:49:22 +08001007 const XGL_IMAGE_RESOLVE* pRects)
1008{
1009 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
1010 struct intel_img *src = intel_img(srcImage);
1011 struct intel_img *dst = intel_img(destImage);
1012 struct intel_cmd_meta meta;
1013 XGL_FORMAT format;
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -06001014 uint32_t i;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001015
1016 if (src->samples <= 1 || dst->samples > 1 ||
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -07001017 src->layout.format != dst->layout.format) {
Chia-I Wu4e5577a2015-02-10 11:04:44 -07001018 cmd_fail(cmd, XGL_ERROR_UNKNOWN);
Chia-I Wuc14d1562014-10-17 09:49:22 +08001019 return;
1020 }
1021
1022 memset(&meta, 0, sizeof(meta));
Chia-I Wu29e6f502014-11-24 14:27:29 +08001023 meta.mode = INTEL_CMD_META_FS_RECT;
Chia-I Wuc14d1562014-10-17 09:49:22 +08001024
1025 switch (src->samples) {
1026 case 2:
1027 default:
1028 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_2X;
1029 break;
1030 case 4:
1031 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_4X;
1032 break;
1033 case 8:
1034 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_8X;
1035 break;
1036 case 16:
1037 meta.shader_id = INTEL_DEV_META_FS_RESOLVE_16X;
1038 break;
1039 }
1040
1041 meta.samples = 1;
1042
1043 format = cmd_meta_img_raw_format(cmd, src->layout.format);
1044 cmd_meta_set_src_for_img(cmd, src, format, XGL_IMAGE_ASPECT_COLOR, &meta);
1045
1046 for (i = 0; i < rectCount; i++) {
1047 const XGL_IMAGE_RESOLVE *rect = &pRects[i];
1048
1049 meta.src.lod = rect->srcSubresource.mipLevel;
1050 meta.src.layer = rect->srcSubresource.arraySlice;
1051 meta.src.x = rect->srcOffset.x;
1052 meta.src.y = rect->srcOffset.y;
1053
1054 meta.dst.lod = rect->destSubresource.mipLevel;
1055 meta.dst.layer = rect->destSubresource.arraySlice;
1056 meta.dst.x = rect->destOffset.x;
1057 meta.dst.y = rect->destOffset.y;
1058
1059 meta.width = rect->extent.width;
1060 meta.height = rect->extent.height;
1061
1062 cmd_meta_set_dst_for_img(cmd, dst, format,
1063 meta.dst.lod, meta.dst.layer, &meta);
1064
1065 cmd_draw_meta(cmd, &meta);
1066 }
1067}