i965 VS: Change nr_userclip to nr_userclip_planes.
[mesa.git] / src / mesa / drivers / dri / r600 / r600_blit.c
1 /*
2 * Copyright (C) 2009 Advanced Micro Devices, Inc.
3 *
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial
16 * portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 */
27
28 #include "radeon_common.h"
29 #include "r600_context.h"
30
31 #include "r600_blit.h"
32 #include "r600_blit_shaders.h"
33 #include "r600_cmdbuf.h"
34
35 /* common formats supported as both textures and render targets */
36 unsigned r600_check_blit(gl_format mesa_format)
37 {
38 switch (mesa_format) {
39 case MESA_FORMAT_RGBA8888:
40 case MESA_FORMAT_SIGNED_RGBA8888:
41 case MESA_FORMAT_RGBA8888_REV:
42 case MESA_FORMAT_SIGNED_RGBA8888_REV:
43 case MESA_FORMAT_ARGB8888:
44 case MESA_FORMAT_XRGB8888:
45 case MESA_FORMAT_ARGB8888_REV:
46 case MESA_FORMAT_XRGB8888_REV:
47 case MESA_FORMAT_RGB565:
48 case MESA_FORMAT_RGB565_REV:
49 case MESA_FORMAT_ARGB4444:
50 case MESA_FORMAT_ARGB4444_REV:
51 case MESA_FORMAT_ARGB1555:
52 case MESA_FORMAT_ARGB1555_REV:
53 case MESA_FORMAT_AL88:
54 case MESA_FORMAT_AL88_REV:
55 case MESA_FORMAT_RGB332:
56 case MESA_FORMAT_A8:
57 case MESA_FORMAT_I8:
58 case MESA_FORMAT_L8:
59 case MESA_FORMAT_RGBA_FLOAT32:
60 case MESA_FORMAT_RGBA_FLOAT16:
61 case MESA_FORMAT_ALPHA_FLOAT32:
62 case MESA_FORMAT_ALPHA_FLOAT16:
63 case MESA_FORMAT_LUMINANCE_FLOAT32:
64 case MESA_FORMAT_LUMINANCE_FLOAT16:
65 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
66 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
67 case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
68 case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
69 case MESA_FORMAT_X8_Z24:
70 case MESA_FORMAT_S8_Z24:
71 case MESA_FORMAT_Z24_S8:
72 case MESA_FORMAT_Z16:
73 case MESA_FORMAT_Z32:
74 case MESA_FORMAT_SARGB8:
75 case MESA_FORMAT_SLA8:
76 case MESA_FORMAT_SL8:
77 break;
78 default:
79 return 0;
80 }
81
82 /* ??? */
83 /* not sure blit to depth works or not yet */
84 if (_mesa_get_format_bits(mesa_format, GL_DEPTH_BITS) > 0)
85 return 0;
86
87 return 1;
88 }
89
90 static inline void
91 set_render_target(context_t *context, struct radeon_bo *bo, gl_format mesa_format,
92 int nPitchInPixel, int w, int h, intptr_t dst_offset)
93 {
94 uint32_t cb_color0_base, cb_color0_size = 0, cb_color0_info = 0, cb_color0_view = 0;
95 int id = 0;
96 uint32_t endian, comp_swap, format;
97 BATCH_LOCALS(&context->radeon);
98
99 cb_color0_base = dst_offset / 256;
100 endian = ENDIAN_NONE;
101
102 SETfield(cb_color0_size, (nPitchInPixel / 8) - 1,
103 PITCH_TILE_MAX_shift, PITCH_TILE_MAX_mask);
104 SETfield(cb_color0_size, ((nPitchInPixel * h) / 64) - 1,
105 SLICE_TILE_MAX_shift, SLICE_TILE_MAX_mask);
106
107 SETfield(cb_color0_info, ARRAY_LINEAR_GENERAL,
108 CB_COLOR0_INFO__ARRAY_MODE_shift, CB_COLOR0_INFO__ARRAY_MODE_mask);
109
110 SETbit(cb_color0_info, BLEND_BYPASS_bit);
111
112 switch(mesa_format) {
113 case MESA_FORMAT_RGBA8888:
114 #ifdef MESA_BIG_ENDIAN
115 endian = ENDIAN_8IN32;
116 #endif
117 format = COLOR_8_8_8_8;
118 comp_swap = SWAP_STD_REV;
119 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
120 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
121 break;
122 case MESA_FORMAT_SIGNED_RGBA8888:
123 #ifdef MESA_BIG_ENDIAN
124 endian = ENDIAN_8IN32;
125 #endif
126 format = COLOR_8_8_8_8;
127 comp_swap = SWAP_STD_REV;
128 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
129 SETfield(cb_color0_info, NUMBER_SNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
130 break;
131 case MESA_FORMAT_RGBA8888_REV:
132 #ifdef MESA_BIG_ENDIAN
133 endian = ENDIAN_8IN32;
134 #endif
135 format = COLOR_8_8_8_8;
136 comp_swap = SWAP_STD;
137 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
138 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
139 break;
140 case MESA_FORMAT_SIGNED_RGBA8888_REV:
141 #ifdef MESA_BIG_ENDIAN
142 endian = ENDIAN_8IN32;
143 #endif
144 format = COLOR_8_8_8_8;
145 comp_swap = SWAP_STD;
146 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
147 SETfield(cb_color0_info, NUMBER_SNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
148 break;
149 case MESA_FORMAT_ARGB8888:
150 case MESA_FORMAT_XRGB8888:
151 #ifdef MESA_BIG_ENDIAN
152 endian = ENDIAN_8IN32;
153 #endif
154 format = COLOR_8_8_8_8;
155 comp_swap = SWAP_ALT;
156 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
157 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
158 break;
159 case MESA_FORMAT_ARGB8888_REV:
160 case MESA_FORMAT_XRGB8888_REV:
161 #ifdef MESA_BIG_ENDIAN
162 endian = ENDIAN_8IN32;
163 #endif
164 format = COLOR_8_8_8_8;
165 comp_swap = SWAP_ALT_REV;
166 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
167 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
168 break;
169 case MESA_FORMAT_RGB565:
170 #ifdef MESA_BIG_ENDIAN
171 endian = ENDIAN_8IN16;
172 #endif
173 comp_swap = SWAP_STD_REV;
174 format = COLOR_5_6_5;
175 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
176 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
177 break;
178 case MESA_FORMAT_RGB565_REV:
179 #ifdef MESA_BIG_ENDIAN
180 endian = ENDIAN_8IN16;
181 #endif
182 comp_swap = SWAP_STD;
183 format = COLOR_5_6_5;
184 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
185 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
186 break;
187 case MESA_FORMAT_ARGB4444:
188 #ifdef MESA_BIG_ENDIAN
189 endian = ENDIAN_8IN16;
190 #endif
191 format = COLOR_4_4_4_4;
192 comp_swap = SWAP_ALT;
193 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
194 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
195 break;
196 case MESA_FORMAT_ARGB4444_REV:
197 #ifdef MESA_BIG_ENDIAN
198 endian = ENDIAN_8IN16;
199 #endif
200 format = COLOR_4_4_4_4;
201 comp_swap = SWAP_ALT_REV;
202 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
203 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
204 break;
205 case MESA_FORMAT_ARGB1555:
206 #ifdef MESA_BIG_ENDIAN
207 endian = ENDIAN_8IN16;
208 #endif
209 format = COLOR_1_5_5_5;
210 comp_swap = SWAP_ALT;
211 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
212 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
213 break;
214 case MESA_FORMAT_ARGB1555_REV:
215 #ifdef MESA_BIG_ENDIAN
216 endian = ENDIAN_8IN16;
217 #endif
218 format = COLOR_1_5_5_5;
219 comp_swap = SWAP_ALT_REV;
220 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
221 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
222 break;
223 case MESA_FORMAT_AL88:
224 #ifdef MESA_BIG_ENDIAN
225 endian = ENDIAN_8IN16;
226 #endif
227 format = COLOR_8_8;
228 comp_swap = SWAP_STD;
229 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
230 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
231 break;
232 case MESA_FORMAT_AL88_REV:
233 #ifdef MESA_BIG_ENDIAN
234 endian = ENDIAN_8IN16;
235 #endif
236 format = COLOR_8_8;
237 comp_swap = SWAP_STD_REV;
238 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
239 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
240 break;
241 case MESA_FORMAT_RGB332:
242 format = COLOR_3_3_2;
243 comp_swap = SWAP_STD_REV;
244 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
245 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
246 break;
247 case MESA_FORMAT_A8:
248 format = COLOR_8;
249 comp_swap = SWAP_ALT_REV;
250 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
251 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
252 break;
253 case MESA_FORMAT_I8:
254 format = COLOR_8;
255 comp_swap = SWAP_STD;
256 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
257 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
258 break;
259 case MESA_FORMAT_L8:
260 format = COLOR_8;
261 comp_swap = SWAP_ALT;
262 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
263 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
264 break;
265 case MESA_FORMAT_RGBA_FLOAT32:
266 #ifdef MESA_BIG_ENDIAN
267 endian = ENDIAN_8IN32;
268 #endif
269 format = COLOR_32_32_32_32_FLOAT;
270 comp_swap = SWAP_STD;
271 SETbit(cb_color0_info, BLEND_FLOAT32_bit);
272 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
273 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
274 break;
275 case MESA_FORMAT_RGBA_FLOAT16:
276 #ifdef MESA_BIG_ENDIAN
277 endian = ENDIAN_8IN16;
278 #endif
279 format = COLOR_16_16_16_16_FLOAT;
280 comp_swap = SWAP_STD;
281 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
282 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
283 break;
284 case MESA_FORMAT_ALPHA_FLOAT32:
285 #ifdef MESA_BIG_ENDIAN
286 endian = ENDIAN_8IN32;
287 #endif
288 format = COLOR_32_FLOAT;
289 comp_swap = SWAP_ALT_REV;
290 SETbit(cb_color0_info, BLEND_FLOAT32_bit);
291 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
292 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
293 break;
294 case MESA_FORMAT_ALPHA_FLOAT16:
295 #ifdef MESA_BIG_ENDIAN
296 endian = ENDIAN_8IN16;
297 #endif
298 format = COLOR_16_FLOAT;
299 comp_swap = SWAP_ALT_REV;
300 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
301 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
302 break;
303 case MESA_FORMAT_LUMINANCE_FLOAT32:
304 #ifdef MESA_BIG_ENDIAN
305 endian = ENDIAN_8IN32;
306 #endif
307 format = COLOR_32_FLOAT;
308 comp_swap = SWAP_ALT;
309 SETbit(cb_color0_info, BLEND_FLOAT32_bit);
310 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
311 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
312 break;
313 case MESA_FORMAT_LUMINANCE_FLOAT16:
314 #ifdef MESA_BIG_ENDIAN
315 endian = ENDIAN_8IN16;
316 #endif
317 format = COLOR_16_FLOAT;
318 comp_swap = SWAP_ALT;
319 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
320 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
321 break;
322 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
323 #ifdef MESA_BIG_ENDIAN
324 endian = ENDIAN_8IN32;
325 #endif
326 format = COLOR_32_32_FLOAT;
327 comp_swap = SWAP_ALT_REV;
328 SETbit(cb_color0_info, BLEND_FLOAT32_bit);
329 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
330 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
331 break;
332 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
333 #ifdef MESA_BIG_ENDIAN
334 endian = ENDIAN_8IN16;
335 #endif
336 format = COLOR_16_16_FLOAT;
337 comp_swap = SWAP_ALT_REV;
338 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
339 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
340 break;
341 case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
342 #ifdef MESA_BIG_ENDIAN
343 endian = ENDIAN_8IN32;
344 #endif
345 format = COLOR_32_FLOAT;
346 comp_swap = SWAP_STD;
347 SETbit(cb_color0_info, BLEND_FLOAT32_bit);
348 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
349 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
350 break;
351 case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
352 #ifdef MESA_BIG_ENDIAN
353 endian = ENDIAN_8IN16;
354 #endif
355 format = COLOR_16_FLOAT;
356 comp_swap = SWAP_STD;
357 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
358 SETfield(cb_color0_info, NUMBER_FLOAT, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
359 break;
360 case MESA_FORMAT_X8_Z24:
361 case MESA_FORMAT_S8_Z24:
362 #ifdef MESA_BIG_ENDIAN
363 endian = ENDIAN_8IN32;
364 #endif
365 format = COLOR_8_24;
366 comp_swap = SWAP_STD;
367 SETfield(cb_color0_info, ARRAY_1D_TILED_THIN1,
368 CB_COLOR0_INFO__ARRAY_MODE_shift, CB_COLOR0_INFO__ARRAY_MODE_mask);
369 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
370 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
371 break;
372 case MESA_FORMAT_Z24_S8:
373 #ifdef MESA_BIG_ENDIAN
374 endian = ENDIAN_8IN32;
375 #endif
376 format = COLOR_24_8;
377 comp_swap = SWAP_STD;
378 SETfield(cb_color0_info, ARRAY_1D_TILED_THIN1,
379 CB_COLOR0_INFO__ARRAY_MODE_shift, CB_COLOR0_INFO__ARRAY_MODE_mask);
380 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
381 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
382 break;
383 case MESA_FORMAT_Z16:
384 #ifdef MESA_BIG_ENDIAN
385 endian = ENDIAN_8IN16;
386 #endif
387 format = COLOR_16;
388 comp_swap = SWAP_STD;
389 SETfield(cb_color0_info, ARRAY_1D_TILED_THIN1,
390 CB_COLOR0_INFO__ARRAY_MODE_shift, CB_COLOR0_INFO__ARRAY_MODE_mask);
391 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
392 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
393 break;
394 case MESA_FORMAT_Z32:
395 #ifdef MESA_BIG_ENDIAN
396 endian = ENDIAN_8IN32;
397 #endif
398 format = COLOR_32;
399 comp_swap = SWAP_STD;
400 SETfield(cb_color0_info, ARRAY_1D_TILED_THIN1,
401 CB_COLOR0_INFO__ARRAY_MODE_shift, CB_COLOR0_INFO__ARRAY_MODE_mask);
402 CLEARbit(cb_color0_info, SOURCE_FORMAT_bit);
403 SETfield(cb_color0_info, NUMBER_UNORM, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
404 break;
405 case MESA_FORMAT_SARGB8:
406 #ifdef MESA_BIG_ENDIAN
407 endian = ENDIAN_8IN32;
408 #endif
409 format = COLOR_8_8_8_8;
410 comp_swap = SWAP_ALT;
411 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
412 SETfield(cb_color0_info, NUMBER_SRGB, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
413 break;
414 case MESA_FORMAT_SLA8:
415 #ifdef MESA_BIG_ENDIAN
416 endian = ENDIAN_8IN16;
417 #endif
418 format = COLOR_8_8;
419 comp_swap = SWAP_ALT_REV;
420 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
421 SETfield(cb_color0_info, NUMBER_SRGB, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
422 break;
423 case MESA_FORMAT_SL8:
424 format = COLOR_8;
425 comp_swap = SWAP_ALT_REV;
426 SETbit(cb_color0_info, SOURCE_FORMAT_bit);
427 SETfield(cb_color0_info, NUMBER_SRGB, NUMBER_TYPE_shift, NUMBER_TYPE_mask);
428 break;
429 default:
430 fprintf(stderr,"Invalid format for copy %s\n",_mesa_get_format_name(mesa_format));
431 assert("Invalid format for US output\n");
432 return;
433 }
434
435 /* must be 0 on r7xx */
436 if (context->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV770)
437 CLEARbit(cb_color0_info, BLEND_FLOAT32_bit);
438
439 SETfield(cb_color0_info, endian, ENDIAN_shift, ENDIAN_mask);
440 SETfield(cb_color0_info, format, CB_COLOR0_INFO__FORMAT_shift,
441 CB_COLOR0_INFO__FORMAT_mask);
442 SETfield(cb_color0_info, comp_swap, COMP_SWAP_shift, COMP_SWAP_mask);
443
444 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
445 R600_OUT_BATCH_REGSEQ(CB_COLOR0_BASE + (4 * id), 1);
446 R600_OUT_BATCH(cb_color0_base);
447 R600_OUT_BATCH_RELOC(0,
448 bo,
449 0,
450 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0);
451 END_BATCH();
452
453 if ((context->radeon.radeonScreen->chip_family > CHIP_FAMILY_R600) &&
454 (context->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV770)) {
455 BEGIN_BATCH_NO_AUTOSTATE(2);
456 R600_OUT_BATCH(CP_PACKET3(R600_IT_SURFACE_BASE_UPDATE, 0));
457 R600_OUT_BATCH((2 << id));
458 END_BATCH();
459 }
460
461 /* Set CMASK & TILE buffer to the offset of color buffer as
462 * we don't use those this shouldn't cause any issue and we
463 * then have a valid cmd stream
464 */
465 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
466 R600_OUT_BATCH_REGSEQ(CB_COLOR0_TILE + (4 * id), 1);
467 R600_OUT_BATCH(cb_color0_base);
468 R600_OUT_BATCH_RELOC(0,
469 bo,
470 0,
471 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0);
472 END_BATCH();
473 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
474 R600_OUT_BATCH_REGSEQ(CB_COLOR0_FRAG + (4 * id), 1);
475 R600_OUT_BATCH(cb_color0_base);
476 R600_OUT_BATCH_RELOC(0,
477 bo,
478 0,
479 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0);
480 END_BATCH();
481
482 BEGIN_BATCH_NO_AUTOSTATE(9);
483 R600_OUT_BATCH_REGVAL(CB_COLOR0_SIZE + (4 * id), cb_color0_size);
484 R600_OUT_BATCH_REGVAL(CB_COLOR0_VIEW + (4 * id), cb_color0_view);
485 R600_OUT_BATCH_REGVAL(CB_COLOR0_MASK + (4 * id), 0);
486 END_BATCH();
487
488 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
489 R600_OUT_BATCH_REGVAL(CB_COLOR0_INFO + (4 * id), cb_color0_info);
490 R600_OUT_BATCH_RELOC(0,
491 bo,
492 0,
493 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0);
494 END_BATCH();
495
496 COMMIT_BATCH();
497
498 }
499
500 static inline void load_shaders(struct gl_context * ctx)
501 {
502
503 radeonContextPtr radeonctx = RADEON_CONTEXT(ctx);
504 context_t *context = R700_CONTEXT(ctx);
505 int i, size;
506 uint32_t *shader;
507
508 if (context->blit_bo_loaded == 1)
509 return;
510
511 size = 4096;
512 context->blit_bo = radeon_bo_open(radeonctx->radeonScreen->bom, 0,
513 size, 256, RADEON_GEM_DOMAIN_GTT, 0);
514 radeon_bo_map(context->blit_bo, 1);
515 shader = context->blit_bo->ptr;
516
517 for(i=0; i<sizeof(r6xx_vs)/4; i++) {
518 shader[128+i] = CPU_TO_LE32(r6xx_vs[i]);
519 }
520 for(i=0; i<sizeof(r6xx_ps)/4; i++) {
521 shader[256+i] = CPU_TO_LE32(r6xx_ps[i]);
522 }
523
524 radeon_bo_unmap(context->blit_bo);
525 context->blit_bo_loaded = 1;
526
527 }
528
529 static inline void
530 set_shaders(context_t *context)
531 {
532 struct radeon_bo * pbo = context->blit_bo;
533 BATCH_LOCALS(&context->radeon);
534
535 uint32_t sq_pgm_start_fs = (512 >> 8);
536 uint32_t sq_pgm_resources_fs = 0;
537 uint32_t sq_pgm_cf_offset_fs = 0;
538
539 uint32_t sq_pgm_start_vs = (512 >> 8);
540 uint32_t sq_pgm_resources_vs = (1 << NUM_GPRS_shift);
541 uint32_t sq_pgm_cf_offset_vs = 0;
542
543 uint32_t sq_pgm_start_ps = (1024 >> 8);
544 uint32_t sq_pgm_resources_ps = (1 << NUM_GPRS_shift);
545 uint32_t sq_pgm_cf_offset_ps = 0;
546 uint32_t sq_pgm_exports_ps = (1 << 1);
547
548 r700SyncSurf(context, pbo, RADEON_GEM_DOMAIN_GTT, 0, SH_ACTION_ENA_bit);
549
550 /* FS */
551 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
552 R600_OUT_BATCH_REGSEQ(SQ_PGM_START_FS, 1);
553 R600_OUT_BATCH(sq_pgm_start_fs);
554 R600_OUT_BATCH_RELOC(sq_pgm_start_fs,
555 pbo,
556 sq_pgm_start_fs,
557 RADEON_GEM_DOMAIN_GTT, 0, 0);
558 END_BATCH();
559
560 BEGIN_BATCH_NO_AUTOSTATE(6);
561 R600_OUT_BATCH_REGVAL(SQ_PGM_RESOURCES_FS, sq_pgm_resources_fs);
562 R600_OUT_BATCH_REGVAL(SQ_PGM_CF_OFFSET_FS, sq_pgm_cf_offset_fs);
563 END_BATCH();
564
565 /* VS */
566 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
567 R600_OUT_BATCH_REGSEQ(SQ_PGM_START_VS, 1);
568 R600_OUT_BATCH(sq_pgm_start_vs);
569 R600_OUT_BATCH_RELOC(sq_pgm_start_vs,
570 pbo,
571 sq_pgm_start_vs,
572 RADEON_GEM_DOMAIN_GTT, 0, 0);
573 END_BATCH();
574
575 BEGIN_BATCH_NO_AUTOSTATE(6);
576 R600_OUT_BATCH_REGVAL(SQ_PGM_RESOURCES_VS, sq_pgm_resources_vs);
577 R600_OUT_BATCH_REGVAL(SQ_PGM_CF_OFFSET_VS, sq_pgm_cf_offset_vs);
578 END_BATCH();
579
580 /* PS */
581 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
582 R600_OUT_BATCH_REGSEQ(SQ_PGM_START_PS, 1);
583 R600_OUT_BATCH(sq_pgm_start_ps);
584 R600_OUT_BATCH_RELOC(sq_pgm_start_ps,
585 pbo,
586 sq_pgm_start_ps,
587 RADEON_GEM_DOMAIN_GTT, 0, 0);
588 END_BATCH();
589
590 BEGIN_BATCH_NO_AUTOSTATE(9);
591 R600_OUT_BATCH_REGVAL(SQ_PGM_RESOURCES_PS, sq_pgm_resources_ps);
592 R600_OUT_BATCH_REGVAL(SQ_PGM_EXPORTS_PS, sq_pgm_exports_ps);
593 R600_OUT_BATCH_REGVAL(SQ_PGM_CF_OFFSET_PS, sq_pgm_cf_offset_ps);
594 END_BATCH();
595
596 BEGIN_BATCH_NO_AUTOSTATE(18);
597 R600_OUT_BATCH_REGVAL(SPI_VS_OUT_CONFIG, 0); //EXPORT_COUNT is - 1
598 R600_OUT_BATCH_REGVAL(SPI_VS_OUT_ID_0, 0);
599 R600_OUT_BATCH_REGVAL(SPI_PS_INPUT_CNTL_0, SEL_CENTROID_bit);
600 R600_OUT_BATCH_REGVAL(SPI_PS_IN_CONTROL_0, (1 << NUM_INTERP_shift));
601 R600_OUT_BATCH_REGVAL(SPI_PS_IN_CONTROL_1, 0);
602 R600_OUT_BATCH_REGVAL(SPI_INTERP_CONTROL_0, 0);
603 END_BATCH();
604
605 COMMIT_BATCH();
606
607 }
608
609 static inline void
610 set_vtx_resource(context_t *context)
611 {
612 struct radeon_bo *bo = context->blit_bo;
613 uint32_t sq_vtx_constant_word2 = 0;
614
615 BATCH_LOCALS(&context->radeon);
616
617 BEGIN_BATCH_NO_AUTOSTATE(6);
618 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
619 R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
620 R600_OUT_BATCH(0);
621
622 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
623 R600_OUT_BATCH(mmSQ_VTX_START_INST_LOC - ASIC_CTL_CONST_BASE_INDEX);
624 R600_OUT_BATCH(0);
625 END_BATCH();
626 COMMIT_BATCH();
627
628 if ((context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV610) ||
629 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV620) ||
630 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RS780) ||
631 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RS880) ||
632 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV710))
633 r700SyncSurf(context, bo, RADEON_GEM_DOMAIN_GTT, 0, TC_ACTION_ENA_bit);
634 else
635 r700SyncSurf(context, bo, RADEON_GEM_DOMAIN_GTT, 0, VC_ACTION_ENA_bit);
636
637 sq_vtx_constant_word2 = 0
638 #ifdef MESA_BIG_ENDIAN
639 | (SQ_ENDIAN_8IN32 << SQ_VTX_CONSTANT_WORD2_0__ENDIAN_SWAP_shift)
640 #endif
641 | (16 << SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift);
642
643 BEGIN_BATCH_NO_AUTOSTATE(9 + 2);
644
645 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 7));
646 R600_OUT_BATCH(SQ_FETCH_RESOURCE_VS_OFFSET * FETCH_RESOURCE_STRIDE);
647 R600_OUT_BATCH(0);
648 R600_OUT_BATCH(48 - 1);
649 R600_OUT_BATCH(sq_vtx_constant_word2);
650 R600_OUT_BATCH(1 << MEM_REQUEST_SIZE_shift);
651 R600_OUT_BATCH(0);
652 R600_OUT_BATCH(0);
653 R600_OUT_BATCH(SQ_TEX_VTX_VALID_BUFFER << SQ_TEX_RESOURCE_WORD6_0__TYPE_shift);
654 R600_OUT_BATCH_RELOC(0,
655 bo,
656 0,
657 RADEON_GEM_DOMAIN_GTT, 0, 0);
658 END_BATCH();
659 COMMIT_BATCH();
660
661 }
662
663 static inline void
664 set_tex_resource(context_t * context,
665 gl_format mesa_format, struct radeon_bo *bo, int w, int h,
666 int TexelPitch, intptr_t src_offset)
667 {
668 uint32_t sq_tex_resource0, sq_tex_resource1, sq_tex_resource2, sq_tex_resource4, sq_tex_resource6;
669
670 sq_tex_resource0 = sq_tex_resource1 = sq_tex_resource2 = sq_tex_resource4 = sq_tex_resource6 = 0;
671 BATCH_LOCALS(&context->radeon);
672
673 SETfield(sq_tex_resource0, SQ_TEX_DIM_2D, DIM_shift, DIM_mask);
674 SETfield(sq_tex_resource0, ARRAY_LINEAR_GENERAL,
675 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
676 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
677
678 switch (mesa_format) {
679 case MESA_FORMAT_RGBA8888:
680 case MESA_FORMAT_SIGNED_RGBA8888:
681 SETfield(sq_tex_resource1, FMT_8_8_8_8,
682 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
683
684 SETfield(sq_tex_resource4, SQ_SEL_W,
685 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
686 SETfield(sq_tex_resource4, SQ_SEL_Z,
687 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
688 SETfield(sq_tex_resource4, SQ_SEL_Y,
689 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
690 SETfield(sq_tex_resource4, SQ_SEL_X,
691 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
692 if (mesa_format == MESA_FORMAT_SIGNED_RGBA8888) {
693 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
694 FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
695 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
696 FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
697 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
698 FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
699 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
700 FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
701 }
702 break;
703 case MESA_FORMAT_RGBA8888_REV:
704 case MESA_FORMAT_SIGNED_RGBA8888_REV:
705 SETfield(sq_tex_resource1, FMT_8_8_8_8,
706 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
707
708 SETfield(sq_tex_resource4, SQ_SEL_X,
709 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
710 SETfield(sq_tex_resource4, SQ_SEL_Y,
711 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
712 SETfield(sq_tex_resource4, SQ_SEL_Z,
713 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
714 SETfield(sq_tex_resource4, SQ_SEL_W,
715 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
716 if (mesa_format == MESA_FORMAT_SIGNED_RGBA8888_REV) {
717 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
718 FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
719 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
720 FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
721 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
722 FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
723 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
724 FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
725 }
726 break;
727 case MESA_FORMAT_ARGB8888:
728 SETfield(sq_tex_resource1, FMT_8_8_8_8,
729 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
730
731 SETfield(sq_tex_resource4, SQ_SEL_Z,
732 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
733 SETfield(sq_tex_resource4, SQ_SEL_Y,
734 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
735 SETfield(sq_tex_resource4, SQ_SEL_X,
736 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
737 SETfield(sq_tex_resource4, SQ_SEL_W,
738 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
739 break;
740 case MESA_FORMAT_XRGB8888:
741 SETfield(sq_tex_resource1, FMT_8_8_8_8,
742 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
743
744 SETfield(sq_tex_resource4, SQ_SEL_Z,
745 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
746 SETfield(sq_tex_resource4, SQ_SEL_Y,
747 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
748 SETfield(sq_tex_resource4, SQ_SEL_X,
749 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
750 SETfield(sq_tex_resource4, SQ_SEL_1,
751 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
752 break;
753 case MESA_FORMAT_ARGB8888_REV:
754 SETfield(sq_tex_resource1, FMT_8_8_8_8,
755 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
756
757 SETfield(sq_tex_resource4, SQ_SEL_Y,
758 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
759 SETfield(sq_tex_resource4, SQ_SEL_Z,
760 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
761 SETfield(sq_tex_resource4, SQ_SEL_W,
762 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
763 SETfield(sq_tex_resource4, SQ_SEL_X,
764 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
765 break;
766 case MESA_FORMAT_XRGB8888_REV:
767 SETfield(sq_tex_resource1, FMT_8_8_8_8,
768 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
769
770 SETfield(sq_tex_resource4, SQ_SEL_Y,
771 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
772 SETfield(sq_tex_resource4, SQ_SEL_Z,
773 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
774 SETfield(sq_tex_resource4, SQ_SEL_1,
775 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
776 SETfield(sq_tex_resource4, SQ_SEL_X,
777 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
778 break;
779 case MESA_FORMAT_RGB565:
780 SETfield(sq_tex_resource1, FMT_5_6_5,
781 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
782
783 SETfield(sq_tex_resource4, SQ_SEL_Z,
784 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
785 SETfield(sq_tex_resource4, SQ_SEL_Y,
786 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
787 SETfield(sq_tex_resource4, SQ_SEL_X,
788 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
789 SETfield(sq_tex_resource4, SQ_SEL_1,
790 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
791 break;
792 case MESA_FORMAT_RGB565_REV:
793 SETfield(sq_tex_resource1, FMT_5_6_5,
794 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
795
796 SETfield(sq_tex_resource4, SQ_SEL_X,
797 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
798 SETfield(sq_tex_resource4, SQ_SEL_Y,
799 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
800 SETfield(sq_tex_resource4, SQ_SEL_Z,
801 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
802 SETfield(sq_tex_resource4, SQ_SEL_1,
803 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
804 break;
805 case MESA_FORMAT_ARGB4444:
806 SETfield(sq_tex_resource1, FMT_4_4_4_4,
807 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
808
809 SETfield(sq_tex_resource4, SQ_SEL_Z,
810 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
811 SETfield(sq_tex_resource4, SQ_SEL_Y,
812 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
813 SETfield(sq_tex_resource4, SQ_SEL_X,
814 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
815 SETfield(sq_tex_resource4, SQ_SEL_W,
816 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
817 break;
818 case MESA_FORMAT_ARGB4444_REV:
819 SETfield(sq_tex_resource1, FMT_4_4_4_4,
820 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
821
822 SETfield(sq_tex_resource4, SQ_SEL_Y,
823 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
824 SETfield(sq_tex_resource4, SQ_SEL_Z,
825 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
826 SETfield(sq_tex_resource4, SQ_SEL_W,
827 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
828 SETfield(sq_tex_resource4, SQ_SEL_X,
829 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
830 break;
831 case MESA_FORMAT_ARGB1555:
832 SETfield(sq_tex_resource1, FMT_1_5_5_5,
833 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
834
835 SETfield(sq_tex_resource4, SQ_SEL_Z,
836 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
837 SETfield(sq_tex_resource4, SQ_SEL_Y,
838 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
839 SETfield(sq_tex_resource4, SQ_SEL_X,
840 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
841 SETfield(sq_tex_resource4, SQ_SEL_W,
842 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
843 break;
844 case MESA_FORMAT_ARGB1555_REV:
845 SETfield(sq_tex_resource1, FMT_1_5_5_5,
846 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
847
848 SETfield(sq_tex_resource4, SQ_SEL_Y,
849 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
850 SETfield(sq_tex_resource4, SQ_SEL_Z,
851 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
852 SETfield(sq_tex_resource4, SQ_SEL_W,
853 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
854 SETfield(sq_tex_resource4, SQ_SEL_X,
855 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
856 break;
857 case MESA_FORMAT_AL88:
858 case MESA_FORMAT_AL88_REV: /* TODO : Check this. */
859 SETfield(sq_tex_resource1, FMT_8_8,
860 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
861
862 SETfield(sq_tex_resource4, SQ_SEL_X,
863 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
864 SETfield(sq_tex_resource4, SQ_SEL_X,
865 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
866 SETfield(sq_tex_resource4, SQ_SEL_X,
867 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
868 SETfield(sq_tex_resource4, SQ_SEL_Y,
869 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
870 break;
871 case MESA_FORMAT_RGB332:
872 SETfield(sq_tex_resource1, FMT_3_3_2,
873 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
874
875 SETfield(sq_tex_resource4, SQ_SEL_Z,
876 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
877 SETfield(sq_tex_resource4, SQ_SEL_Y,
878 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
879 SETfield(sq_tex_resource4, SQ_SEL_X,
880 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
881 SETfield(sq_tex_resource4, SQ_SEL_1,
882 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
883 break;
884 case MESA_FORMAT_A8: /* ZERO, ZERO, ZERO, X */
885 SETfield(sq_tex_resource1, FMT_8,
886 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
887
888 SETfield(sq_tex_resource4, SQ_SEL_0,
889 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
890 SETfield(sq_tex_resource4, SQ_SEL_0,
891 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
892 SETfield(sq_tex_resource4, SQ_SEL_0,
893 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
894 SETfield(sq_tex_resource4, SQ_SEL_X,
895 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
896 break;
897 case MESA_FORMAT_L8: /* X, X, X, ONE */
898 SETfield(sq_tex_resource1, FMT_8,
899 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
900
901 SETfield(sq_tex_resource4, SQ_SEL_X,
902 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
903 SETfield(sq_tex_resource4, SQ_SEL_X,
904 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
905 SETfield(sq_tex_resource4, SQ_SEL_X,
906 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
907 SETfield(sq_tex_resource4, SQ_SEL_1,
908 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
909 break;
910 case MESA_FORMAT_I8: /* X, X, X, X */
911 SETfield(sq_tex_resource1, FMT_8,
912 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
913
914 SETfield(sq_tex_resource4, SQ_SEL_X,
915 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
916 SETfield(sq_tex_resource4, SQ_SEL_X,
917 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
918 SETfield(sq_tex_resource4, SQ_SEL_X,
919 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
920 SETfield(sq_tex_resource4, SQ_SEL_X,
921 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
922 break;
923 case MESA_FORMAT_RGBA_FLOAT32:
924 SETfield(sq_tex_resource1, FMT_32_32_32_32_FLOAT,
925 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
926
927 SETfield(sq_tex_resource4, SQ_SEL_X,
928 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
929 SETfield(sq_tex_resource4, SQ_SEL_Y,
930 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
931 SETfield(sq_tex_resource4, SQ_SEL_Z,
932 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
933 SETfield(sq_tex_resource4, SQ_SEL_W,
934 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
935 break;
936 case MESA_FORMAT_RGBA_FLOAT16:
937 SETfield(sq_tex_resource1, FMT_16_16_16_16_FLOAT,
938 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
939
940 SETfield(sq_tex_resource4, SQ_SEL_X,
941 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
942 SETfield(sq_tex_resource4, SQ_SEL_Y,
943 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
944 SETfield(sq_tex_resource4, SQ_SEL_Z,
945 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
946 SETfield(sq_tex_resource4, SQ_SEL_W,
947 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
948 break;
949 case MESA_FORMAT_ALPHA_FLOAT32: /* ZERO, ZERO, ZERO, X */
950 SETfield(sq_tex_resource1, FMT_32_FLOAT,
951 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
952
953 SETfield(sq_tex_resource4, SQ_SEL_0,
954 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
955 SETfield(sq_tex_resource4, SQ_SEL_0,
956 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
957 SETfield(sq_tex_resource4, SQ_SEL_0,
958 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
959 SETfield(sq_tex_resource4, SQ_SEL_X,
960 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
961 break;
962 case MESA_FORMAT_ALPHA_FLOAT16: /* ZERO, ZERO, ZERO, X */
963 SETfield(sq_tex_resource1, FMT_16_FLOAT,
964 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
965
966 SETfield(sq_tex_resource4, SQ_SEL_0,
967 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
968 SETfield(sq_tex_resource4, SQ_SEL_0,
969 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
970 SETfield(sq_tex_resource4, SQ_SEL_0,
971 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
972 SETfield(sq_tex_resource4, SQ_SEL_X,
973 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
974 break;
975 case MESA_FORMAT_LUMINANCE_FLOAT32: /* X, X, X, ONE */
976 SETfield(sq_tex_resource1, FMT_32_FLOAT,
977 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
978
979 SETfield(sq_tex_resource4, SQ_SEL_X,
980 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
981 SETfield(sq_tex_resource4, SQ_SEL_X,
982 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
983 SETfield(sq_tex_resource4, SQ_SEL_X,
984 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
985 SETfield(sq_tex_resource4, SQ_SEL_1,
986 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
987 break;
988 case MESA_FORMAT_LUMINANCE_FLOAT16: /* X, X, X, ONE */
989 SETfield(sq_tex_resource1, FMT_16_FLOAT,
990 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
991
992 SETfield(sq_tex_resource4, SQ_SEL_X,
993 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
994 SETfield(sq_tex_resource4, SQ_SEL_X,
995 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
996 SETfield(sq_tex_resource4, SQ_SEL_X,
997 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
998 SETfield(sq_tex_resource4, SQ_SEL_1,
999 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1000 break;
1001 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
1002 SETfield(sq_tex_resource1, FMT_32_32_FLOAT,
1003 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1004
1005 SETfield(sq_tex_resource4, SQ_SEL_X,
1006 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1007 SETfield(sq_tex_resource4, SQ_SEL_X,
1008 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1009 SETfield(sq_tex_resource4, SQ_SEL_X,
1010 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1011 SETfield(sq_tex_resource4, SQ_SEL_Y,
1012 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1013 break;
1014 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
1015 SETfield(sq_tex_resource1, FMT_16_16_FLOAT,
1016 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1017
1018 SETfield(sq_tex_resource4, SQ_SEL_X,
1019 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1020 SETfield(sq_tex_resource4, SQ_SEL_X,
1021 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1022 SETfield(sq_tex_resource4, SQ_SEL_X,
1023 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1024 SETfield(sq_tex_resource4, SQ_SEL_Y,
1025 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1026 break;
1027 case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
1028 SETfield(sq_tex_resource1, FMT_32_FLOAT,
1029 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1030
1031 SETfield(sq_tex_resource4, SQ_SEL_X,
1032 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1033 SETfield(sq_tex_resource4, SQ_SEL_X,
1034 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1035 SETfield(sq_tex_resource4, SQ_SEL_X,
1036 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1037 SETfield(sq_tex_resource4, SQ_SEL_X,
1038 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1039 break;
1040 case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
1041 SETfield(sq_tex_resource1, FMT_16_FLOAT,
1042 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1043
1044 SETfield(sq_tex_resource4, SQ_SEL_X,
1045 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1046 SETfield(sq_tex_resource4, SQ_SEL_X,
1047 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1048 SETfield(sq_tex_resource4, SQ_SEL_X,
1049 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1050 SETfield(sq_tex_resource4, SQ_SEL_X,
1051 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1052 break;
1053 case MESA_FORMAT_Z16:
1054 SETbit(sq_tex_resource0, TILE_TYPE_bit);
1055 SETfield(sq_tex_resource0, ARRAY_1D_TILED_THIN1,
1056 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
1057 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
1058 SETfield(sq_tex_resource1, FMT_16,
1059 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1060 SETfield(sq_tex_resource4, SQ_SEL_X,
1061 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1062 SETfield(sq_tex_resource4, SQ_SEL_X,
1063 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1064 SETfield(sq_tex_resource4, SQ_SEL_X,
1065 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1066 SETfield(sq_tex_resource4, SQ_SEL_X,
1067 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1068 break;
1069 case MESA_FORMAT_X8_Z24:
1070 SETbit(sq_tex_resource0, TILE_TYPE_bit);
1071 SETfield(sq_tex_resource0, ARRAY_1D_TILED_THIN1,
1072 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
1073 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
1074 SETfield(sq_tex_resource1, FMT_8_24,
1075 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1076 SETfield(sq_tex_resource4, SQ_SEL_X,
1077 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1078 SETfield(sq_tex_resource4, SQ_SEL_1,
1079 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1080 SETfield(sq_tex_resource4, SQ_SEL_0,
1081 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1082 SETfield(sq_tex_resource4, SQ_SEL_1,
1083 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1084 break;
1085 case MESA_FORMAT_S8_Z24:
1086 SETbit(sq_tex_resource0, TILE_TYPE_bit);
1087 SETfield(sq_tex_resource0, ARRAY_1D_TILED_THIN1,
1088 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
1089 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
1090 SETfield(sq_tex_resource1, FMT_8_24,
1091 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1092 SETfield(sq_tex_resource4, SQ_SEL_X,
1093 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1094 SETfield(sq_tex_resource4, SQ_SEL_Y,
1095 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1096 SETfield(sq_tex_resource4, SQ_SEL_0,
1097 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1098 SETfield(sq_tex_resource4, SQ_SEL_1,
1099 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1100 break;
1101 case MESA_FORMAT_Z24_S8:
1102 SETbit(sq_tex_resource0, TILE_TYPE_bit);
1103 SETfield(sq_tex_resource0, ARRAY_1D_TILED_THIN1,
1104 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
1105 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
1106 SETfield(sq_tex_resource1, FMT_24_8,
1107 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1108 SETfield(sq_tex_resource4, SQ_SEL_X,
1109 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1110 SETfield(sq_tex_resource4, SQ_SEL_Y,
1111 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1112 SETfield(sq_tex_resource4, SQ_SEL_0,
1113 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1114 SETfield(sq_tex_resource4, SQ_SEL_1,
1115 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1116 break;
1117 case MESA_FORMAT_Z32:
1118 SETbit(sq_tex_resource0, TILE_TYPE_bit);
1119 SETfield(sq_tex_resource0, ARRAY_1D_TILED_THIN1,
1120 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
1121 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
1122 SETfield(sq_tex_resource1, FMT_32,
1123 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1124 SETfield(sq_tex_resource4, SQ_SEL_X,
1125 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1126 SETfield(sq_tex_resource4, SQ_SEL_X,
1127 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1128 SETfield(sq_tex_resource4, SQ_SEL_X,
1129 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1130 SETfield(sq_tex_resource4, SQ_SEL_X,
1131 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1132 break;
1133 case MESA_FORMAT_S8:
1134 SETbit(sq_tex_resource0, TILE_TYPE_bit);
1135 SETfield(sq_tex_resource0, ARRAY_1D_TILED_THIN1,
1136 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
1137 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
1138 SETfield(sq_tex_resource1, FMT_8,
1139 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1140 SETfield(sq_tex_resource4, SQ_SEL_X,
1141 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1142 SETfield(sq_tex_resource4, SQ_SEL_X,
1143 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1144 SETfield(sq_tex_resource4, SQ_SEL_X,
1145 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1146 SETfield(sq_tex_resource4, SQ_SEL_X,
1147 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1148 break;
1149 case MESA_FORMAT_SARGB8:
1150 SETfield(sq_tex_resource1, FMT_8_8_8_8,
1151 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1152
1153 SETfield(sq_tex_resource4, SQ_SEL_Z,
1154 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1155 SETfield(sq_tex_resource4, SQ_SEL_Y,
1156 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1157 SETfield(sq_tex_resource4, SQ_SEL_X,
1158 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1159 SETfield(sq_tex_resource4, SQ_SEL_W,
1160 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1161 SETbit(sq_tex_resource4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
1162 break;
1163 case MESA_FORMAT_SLA8:
1164 SETfield(sq_tex_resource1, FMT_8_8,
1165 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1166
1167 SETfield(sq_tex_resource4, SQ_SEL_X,
1168 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1169 SETfield(sq_tex_resource4, SQ_SEL_X,
1170 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1171 SETfield(sq_tex_resource4, SQ_SEL_X,
1172 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1173 SETfield(sq_tex_resource4, SQ_SEL_Y,
1174 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1175 SETbit(sq_tex_resource4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
1176 break;
1177 case MESA_FORMAT_SL8: /* X, X, X, ONE */
1178 SETfield(sq_tex_resource1, FMT_8,
1179 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1180
1181 SETfield(sq_tex_resource4, SQ_SEL_X,
1182 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1183 SETfield(sq_tex_resource4, SQ_SEL_X,
1184 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1185 SETfield(sq_tex_resource4, SQ_SEL_X,
1186 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1187 SETfield(sq_tex_resource4, SQ_SEL_1,
1188 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1189 SETbit(sq_tex_resource4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
1190 break;
1191 default:
1192 fprintf(stderr,"Invalid format for copy %s\n",_mesa_get_format_name(mesa_format));
1193 assert("Invalid format for US output\n");
1194 return;
1195 };
1196
1197 SETfield(sq_tex_resource0, (TexelPitch/8)-1, PITCH_shift, PITCH_mask);
1198 SETfield(sq_tex_resource0, w - 1, TEX_WIDTH_shift, TEX_WIDTH_mask);
1199 SETfield(sq_tex_resource1, h - 1, TEX_HEIGHT_shift, TEX_HEIGHT_mask);
1200
1201 sq_tex_resource2 = src_offset / 256;
1202
1203 SETfield(sq_tex_resource6, SQ_TEX_VTX_VALID_TEXTURE,
1204 SQ_TEX_RESOURCE_WORD6_0__TYPE_shift,
1205 SQ_TEX_RESOURCE_WORD6_0__TYPE_mask);
1206
1207 r700SyncSurf(context, bo,
1208 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM,
1209 0, TC_ACTION_ENA_bit);
1210
1211 BEGIN_BATCH_NO_AUTOSTATE(9 + 4);
1212 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 7));
1213 R600_OUT_BATCH(0 * 7);
1214
1215 R600_OUT_BATCH(sq_tex_resource0);
1216 R600_OUT_BATCH(sq_tex_resource1);
1217 R600_OUT_BATCH(sq_tex_resource2);
1218 R600_OUT_BATCH(0); //SQ_TEX_RESOURCE3
1219 R600_OUT_BATCH(sq_tex_resource4);
1220 R600_OUT_BATCH(0); //SQ_TEX_RESOURCE5
1221 R600_OUT_BATCH(sq_tex_resource6);
1222 R600_OUT_BATCH_RELOC(0,
1223 bo,
1224 0,
1225 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
1226 R600_OUT_BATCH_RELOC(0,
1227 bo,
1228 0,
1229 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
1230 END_BATCH();
1231 COMMIT_BATCH();
1232 }
1233
1234 static inline void
1235 set_tex_sampler(context_t * context)
1236 {
1237 uint32_t sq_tex_sampler_word0 = 0, sq_tex_sampler_word1 = 0, sq_tex_sampler_word2 = 0;
1238 int i = 0;
1239
1240 SETbit(sq_tex_sampler_word2, SQ_TEX_SAMPLER_WORD2_0__TYPE_bit);
1241
1242 BATCH_LOCALS(&context->radeon);
1243
1244 BEGIN_BATCH_NO_AUTOSTATE(5);
1245 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER, 3));
1246 R600_OUT_BATCH(i * 3);
1247 R600_OUT_BATCH(sq_tex_sampler_word0);
1248 R600_OUT_BATCH(sq_tex_sampler_word1);
1249 R600_OUT_BATCH(sq_tex_sampler_word2);
1250 END_BATCH();
1251
1252 }
1253
1254 static inline void
1255 set_scissors(context_t *context, int x1, int y1, int x2, int y2)
1256 {
1257 BATCH_LOCALS(&context->radeon);
1258
1259 BEGIN_BATCH_NO_AUTOSTATE(17);
1260 R600_OUT_BATCH_REGSEQ(PA_SC_SCREEN_SCISSOR_TL, 2);
1261 R600_OUT_BATCH((x1 << 0) | (y1 << 16));
1262 R600_OUT_BATCH((x2 << 0) | (y2 << 16));
1263
1264 R600_OUT_BATCH_REGSEQ(PA_SC_WINDOW_OFFSET, 3);
1265 R600_OUT_BATCH(0); //PA_SC_WINDOW_OFFSET
1266 R600_OUT_BATCH((x1 << 0) | (y1 << 16) | (WINDOW_OFFSET_DISABLE_bit)); //PA_SC_WINDOW_SCISSOR_TL
1267 R600_OUT_BATCH((x2 << 0) | (y2 << 16));
1268
1269 R600_OUT_BATCH_REGSEQ(PA_SC_GENERIC_SCISSOR_TL, 2);
1270 R600_OUT_BATCH((x1 << 0) | (y1 << 16) | (WINDOW_OFFSET_DISABLE_bit));
1271 R600_OUT_BATCH((x2 << 0) | (y2 << 16));
1272
1273 /* XXX 16 of these PA_SC_VPORT_SCISSOR_0_TL_num ... */
1274 R600_OUT_BATCH_REGSEQ(PA_SC_VPORT_SCISSOR_0_TL, 2 );
1275 R600_OUT_BATCH((x1 << 0) | (y1 << 16) | (WINDOW_OFFSET_DISABLE_bit));
1276 R600_OUT_BATCH((x2 << 0) | (y2 << 16));
1277 END_BATCH();
1278
1279 COMMIT_BATCH();
1280
1281 }
1282
1283 static inline void
1284 set_vb_data(context_t * context, int src_x, int src_y, int dst_x, int dst_y,
1285 int w, int h, int src_h, unsigned flip_y)
1286 {
1287 float *vb;
1288 radeon_bo_map(context->blit_bo, 1);
1289 vb = context->blit_bo->ptr;
1290
1291 vb[0] = (float)(dst_x);
1292 vb[1] = (float)(dst_y);
1293 vb[2] = (float)(src_x);
1294 vb[3] = (flip_y) ? (float)(src_h - src_y) : (float)src_y;
1295
1296 vb[4] = (float)(dst_x);
1297 vb[5] = (float)(dst_y + h);
1298 vb[6] = (float)(src_x);
1299 vb[7] = (flip_y) ? (float)(src_h - (src_y + h)) : (float)(src_y + h);
1300
1301 vb[8] = (float)(dst_x + w);
1302 vb[9] = (float)(dst_y + h);
1303 vb[10] = (float)(src_x + w);
1304 vb[11] = (flip_y) ? (float)(src_h - (src_y + h)) : (float)(src_y + h);
1305
1306 radeon_bo_unmap(context->blit_bo);
1307
1308 }
1309
1310 static inline void
1311 draw_auto(context_t *context)
1312 {
1313 BATCH_LOCALS(&context->radeon);
1314 uint32_t vgt_primitive_type = 0, vgt_index_type = 0, vgt_draw_initiator = 0, vgt_num_indices;
1315
1316 SETfield(vgt_primitive_type, DI_PT_RECTLIST,
1317 VGT_PRIMITIVE_TYPE__PRIM_TYPE_shift,
1318 VGT_PRIMITIVE_TYPE__PRIM_TYPE_mask);
1319 SETfield(vgt_index_type, DI_INDEX_SIZE_16_BIT, INDEX_TYPE_shift,
1320 INDEX_TYPE_mask);
1321 SETfield(vgt_draw_initiator, DI_MAJOR_MODE_0, MAJOR_MODE_shift,
1322 MAJOR_MODE_mask);
1323 SETfield(vgt_draw_initiator, DI_SRC_SEL_AUTO_INDEX, SOURCE_SELECT_shift,
1324 SOURCE_SELECT_mask);
1325
1326 vgt_num_indices = 3;
1327
1328 BEGIN_BATCH_NO_AUTOSTATE(10);
1329 // prim
1330 R600_OUT_BATCH_REGSEQ(VGT_PRIMITIVE_TYPE, 1);
1331 R600_OUT_BATCH(vgt_primitive_type);
1332 // index type
1333 R600_OUT_BATCH(CP_PACKET3(R600_IT_INDEX_TYPE, 0));
1334 R600_OUT_BATCH(vgt_index_type);
1335 // num instances
1336 R600_OUT_BATCH(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
1337 R600_OUT_BATCH(1);
1338 //
1339 R600_OUT_BATCH(CP_PACKET3(R600_IT_DRAW_INDEX_AUTO, 1));
1340 R600_OUT_BATCH(vgt_num_indices);
1341 R600_OUT_BATCH(vgt_draw_initiator);
1342
1343 END_BATCH();
1344 COMMIT_BATCH();
1345 }
1346
1347 static inline void
1348 set_default_state(context_t *context)
1349 {
1350 int ps_prio = 0;
1351 int vs_prio = 1;
1352 int gs_prio = 2;
1353 int es_prio = 3;
1354 int num_ps_gprs;
1355 int num_vs_gprs;
1356 int num_gs_gprs;
1357 int num_es_gprs;
1358 int num_temp_gprs;
1359 int num_ps_threads;
1360 int num_vs_threads;
1361 int num_gs_threads;
1362 int num_es_threads;
1363 int num_ps_stack_entries;
1364 int num_vs_stack_entries;
1365 int num_gs_stack_entries;
1366 int num_es_stack_entries;
1367 uint32_t sq_config, sq_gpr_resource_mgmt_1, sq_gpr_resource_mgmt_2;
1368 uint32_t sq_thread_resource_mgmt, sq_stack_resource_mgmt_1, sq_stack_resource_mgmt_2;
1369 uint32_t ta_cntl_aux, db_watermarks, sq_dyn_gpr_cntl_ps_flush_req, db_debug;
1370 BATCH_LOCALS(&context->radeon);
1371
1372 switch (context->radeon.radeonScreen->chip_family) {
1373 case CHIP_FAMILY_R600:
1374 num_ps_gprs = 192;
1375 num_vs_gprs = 56;
1376 num_temp_gprs = 4;
1377 num_gs_gprs = 0;
1378 num_es_gprs = 0;
1379 num_ps_threads = 136;
1380 num_vs_threads = 48;
1381 num_gs_threads = 4;
1382 num_es_threads = 4;
1383 num_ps_stack_entries = 128;
1384 num_vs_stack_entries = 128;
1385 num_gs_stack_entries = 0;
1386 num_es_stack_entries = 0;
1387 break;
1388 case CHIP_FAMILY_RV630:
1389 case CHIP_FAMILY_RV635:
1390 num_ps_gprs = 84;
1391 num_vs_gprs = 36;
1392 num_temp_gprs = 4;
1393 num_gs_gprs = 0;
1394 num_es_gprs = 0;
1395 num_ps_threads = 144;
1396 num_vs_threads = 40;
1397 num_gs_threads = 4;
1398 num_es_threads = 4;
1399 num_ps_stack_entries = 40;
1400 num_vs_stack_entries = 40;
1401 num_gs_stack_entries = 32;
1402 num_es_stack_entries = 16;
1403 break;
1404 case CHIP_FAMILY_RV610:
1405 case CHIP_FAMILY_RV620:
1406 case CHIP_FAMILY_RS780:
1407 case CHIP_FAMILY_RS880:
1408 default:
1409 num_ps_gprs = 84;
1410 num_vs_gprs = 36;
1411 num_temp_gprs = 4;
1412 num_gs_gprs = 0;
1413 num_es_gprs = 0;
1414 num_ps_threads = 136;
1415 num_vs_threads = 48;
1416 num_gs_threads = 4;
1417 num_es_threads = 4;
1418 num_ps_stack_entries = 40;
1419 num_vs_stack_entries = 40;
1420 num_gs_stack_entries = 32;
1421 num_es_stack_entries = 16;
1422 break;
1423 case CHIP_FAMILY_RV670:
1424 num_ps_gprs = 144;
1425 num_vs_gprs = 40;
1426 num_temp_gprs = 4;
1427 num_gs_gprs = 0;
1428 num_es_gprs = 0;
1429 num_ps_threads = 136;
1430 num_vs_threads = 48;
1431 num_gs_threads = 4;
1432 num_es_threads = 4;
1433 num_ps_stack_entries = 40;
1434 num_vs_stack_entries = 40;
1435 num_gs_stack_entries = 32;
1436 num_es_stack_entries = 16;
1437 break;
1438 case CHIP_FAMILY_RV770:
1439 num_ps_gprs = 192;
1440 num_vs_gprs = 56;
1441 num_temp_gprs = 4;
1442 num_gs_gprs = 0;
1443 num_es_gprs = 0;
1444 num_ps_threads = 188;
1445 num_vs_threads = 60;
1446 num_gs_threads = 0;
1447 num_es_threads = 0;
1448 num_ps_stack_entries = 256;
1449 num_vs_stack_entries = 256;
1450 num_gs_stack_entries = 0;
1451 num_es_stack_entries = 0;
1452 break;
1453 case CHIP_FAMILY_RV730:
1454 case CHIP_FAMILY_RV740:
1455 num_ps_gprs = 84;
1456 num_vs_gprs = 36;
1457 num_temp_gprs = 4;
1458 num_gs_gprs = 0;
1459 num_es_gprs = 0;
1460 num_ps_threads = 188;
1461 num_vs_threads = 60;
1462 num_gs_threads = 0;
1463 num_es_threads = 0;
1464 num_ps_stack_entries = 128;
1465 num_vs_stack_entries = 128;
1466 num_gs_stack_entries = 0;
1467 num_es_stack_entries = 0;
1468 break;
1469 case CHIP_FAMILY_RV710:
1470 num_ps_gprs = 192;
1471 num_vs_gprs = 56;
1472 num_temp_gprs = 4;
1473 num_gs_gprs = 0;
1474 num_es_gprs = 0;
1475 num_ps_threads = 144;
1476 num_vs_threads = 48;
1477 num_gs_threads = 0;
1478 num_es_threads = 0;
1479 num_ps_stack_entries = 128;
1480 num_vs_stack_entries = 128;
1481 num_gs_stack_entries = 0;
1482 num_es_stack_entries = 0;
1483 break;
1484 }
1485
1486 sq_config = 0;
1487 if ((context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV610) ||
1488 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV620) ||
1489 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RS780) ||
1490 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RS880) ||
1491 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV710))
1492 CLEARbit(sq_config, VC_ENABLE_bit);
1493 else
1494 SETbit(sq_config, VC_ENABLE_bit);
1495 SETbit(sq_config, DX9_CONSTS_bit);
1496 SETbit(sq_config, ALU_INST_PREFER_VECTOR_bit);
1497 SETfield(sq_config, ps_prio, PS_PRIO_shift, PS_PRIO_mask);
1498 SETfield(sq_config, vs_prio, VS_PRIO_shift, VS_PRIO_mask);
1499 SETfield(sq_config, gs_prio, GS_PRIO_shift, GS_PRIO_mask);
1500 SETfield(sq_config, es_prio, ES_PRIO_shift, ES_PRIO_mask);
1501
1502 sq_gpr_resource_mgmt_1 = 0;
1503 SETfield(sq_gpr_resource_mgmt_1, num_ps_gprs, NUM_PS_GPRS_shift, NUM_PS_GPRS_mask);
1504 SETfield(sq_gpr_resource_mgmt_1, num_vs_gprs, NUM_VS_GPRS_shift, NUM_VS_GPRS_mask);
1505 SETfield(sq_gpr_resource_mgmt_1, num_temp_gprs,
1506 NUM_CLAUSE_TEMP_GPRS_shift, NUM_CLAUSE_TEMP_GPRS_mask);
1507
1508 sq_gpr_resource_mgmt_2 = 0;
1509 SETfield(sq_gpr_resource_mgmt_2, num_gs_gprs, NUM_GS_GPRS_shift, NUM_GS_GPRS_mask);
1510 SETfield(sq_gpr_resource_mgmt_2, num_es_gprs, NUM_ES_GPRS_shift, NUM_ES_GPRS_mask);
1511
1512 sq_thread_resource_mgmt = 0;
1513 SETfield(sq_thread_resource_mgmt, num_ps_threads,
1514 NUM_PS_THREADS_shift, NUM_PS_THREADS_mask);
1515 SETfield(sq_thread_resource_mgmt, num_vs_threads,
1516 NUM_VS_THREADS_shift, NUM_VS_THREADS_mask);
1517 SETfield(sq_thread_resource_mgmt, num_gs_threads,
1518 NUM_GS_THREADS_shift, NUM_GS_THREADS_mask);
1519 SETfield(sq_thread_resource_mgmt, num_es_threads,
1520 NUM_ES_THREADS_shift, NUM_ES_THREADS_mask);
1521
1522 sq_stack_resource_mgmt_1 = 0;
1523 SETfield(sq_stack_resource_mgmt_1, num_ps_stack_entries,
1524 NUM_PS_STACK_ENTRIES_shift, NUM_PS_STACK_ENTRIES_mask);
1525 SETfield(sq_stack_resource_mgmt_1, num_vs_stack_entries,
1526 NUM_VS_STACK_ENTRIES_shift, NUM_VS_STACK_ENTRIES_mask);
1527
1528 sq_stack_resource_mgmt_2 = 0;
1529 SETfield(sq_stack_resource_mgmt_2, num_gs_stack_entries,
1530 NUM_GS_STACK_ENTRIES_shift, NUM_GS_STACK_ENTRIES_mask);
1531 SETfield(sq_stack_resource_mgmt_2, num_es_stack_entries,
1532 NUM_ES_STACK_ENTRIES_shift, NUM_ES_STACK_ENTRIES_mask);
1533
1534 ta_cntl_aux = 0;
1535 SETfield(ta_cntl_aux, 28, TD_FIFO_CREDIT_shift, TD_FIFO_CREDIT_mask);
1536 db_watermarks = 0;
1537 SETfield(db_watermarks, 4, DEPTH_FREE_shift, DEPTH_FREE_mask);
1538 SETfield(db_watermarks, 16, DEPTH_FLUSH_shift, DEPTH_FLUSH_mask);
1539 SETfield(db_watermarks, 0, FORCE_SUMMARIZE_shift, FORCE_SUMMARIZE_mask);
1540 SETfield(db_watermarks, 4, DEPTH_PENDING_FREE_shift, DEPTH_PENDING_FREE_mask);
1541 sq_dyn_gpr_cntl_ps_flush_req = 0;
1542 db_debug = 0;
1543 if (context->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV770) {
1544 SETfield(ta_cntl_aux, 3, GRADIENT_CREDIT_shift, GRADIENT_CREDIT_mask);
1545 db_debug = 0x82000000;
1546 SETfield(db_watermarks, 16, DEPTH_CACHELINE_FREE_shift, DEPTH_CACHELINE_FREE_mask);
1547 } else {
1548 SETfield(ta_cntl_aux, 2, GRADIENT_CREDIT_shift, GRADIENT_CREDIT_mask);
1549 SETfield(db_watermarks, 4, DEPTH_CACHELINE_FREE_shift, DEPTH_CACHELINE_FREE_mask);
1550 SETbit(sq_dyn_gpr_cntl_ps_flush_req, VS_PC_LIMIT_ENABLE_bit);
1551 }
1552
1553 BEGIN_BATCH_NO_AUTOSTATE(120);
1554 R600_OUT_BATCH_REGSEQ(SQ_CONFIG, 6);
1555 R600_OUT_BATCH(sq_config);
1556 R600_OUT_BATCH(sq_gpr_resource_mgmt_1);
1557 R600_OUT_BATCH(sq_gpr_resource_mgmt_2);
1558 R600_OUT_BATCH(sq_thread_resource_mgmt);
1559 R600_OUT_BATCH(sq_stack_resource_mgmt_1);
1560 R600_OUT_BATCH(sq_stack_resource_mgmt_2);
1561
1562 R600_OUT_BATCH_REGVAL(TA_CNTL_AUX, ta_cntl_aux);
1563 R600_OUT_BATCH_REGVAL(VC_ENHANCE, 0);
1564 R600_OUT_BATCH_REGVAL(R7xx_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, sq_dyn_gpr_cntl_ps_flush_req);
1565 R600_OUT_BATCH_REGVAL(DB_DEBUG, db_debug);
1566 R600_OUT_BATCH_REGVAL(DB_WATERMARKS, db_watermarks);
1567
1568 R600_OUT_BATCH_REGSEQ(SQ_ESGS_RING_ITEMSIZE, 9);
1569 R600_OUT_BATCH(0);
1570 R600_OUT_BATCH(0);
1571 R600_OUT_BATCH(0);
1572 R600_OUT_BATCH(0);
1573 R600_OUT_BATCH(0);
1574 R600_OUT_BATCH(0);
1575 R600_OUT_BATCH(0);
1576 R600_OUT_BATCH(0);
1577 R600_OUT_BATCH(0);
1578
1579 R600_OUT_BATCH_REGVAL(CB_CLRCMP_CONTROL,
1580 (CLRCMP_SEL_SRC << CLRCMP_FCN_SEL_shift));
1581 R600_OUT_BATCH_REGVAL(SQ_VTX_BASE_VTX_LOC, 0);
1582 R600_OUT_BATCH_REGVAL(SQ_VTX_START_INST_LOC, 0);
1583 R600_OUT_BATCH_REGVAL(DB_DEPTH_CONTROL, 0);
1584 R600_OUT_BATCH_REGVAL(CB_SHADER_MASK, (OUTPUT0_ENABLE_mask));
1585 R600_OUT_BATCH_REGVAL(CB_TARGET_MASK, (TARGET0_ENABLE_mask));
1586 R600_OUT_BATCH_REGVAL(R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit));
1587 R600_OUT_BATCH_REGVAL(CB_COLOR_CONTROL, (0xcc << ROP3_shift));
1588
1589 R600_OUT_BATCH_REGVAL(PA_CL_VTE_CNTL, VTX_XY_FMT_bit);
1590 R600_OUT_BATCH_REGVAL(PA_CL_VS_OUT_CNTL, 0);
1591 R600_OUT_BATCH_REGVAL(PA_CL_CLIP_CNTL, CLIP_DISABLE_bit);
1592 R600_OUT_BATCH_REGVAL(PA_SU_SC_MODE_CNTL, (FACE_bit) |
1593 (POLYMODE_PTYPE__TRIANGLES << POLYMODE_FRONT_PTYPE_shift) |
1594 (POLYMODE_PTYPE__TRIANGLES << POLYMODE_BACK_PTYPE_shift));
1595 R600_OUT_BATCH_REGVAL(PA_SU_VTX_CNTL, (PIX_CENTER_bit) |
1596 (X_ROUND_TO_EVEN << PA_SU_VTX_CNTL__ROUND_MODE_shift) |
1597 (X_1_256TH << QUANT_MODE_shift));
1598 R600_OUT_BATCH_REGVAL(PA_SC_AA_CONFIG, 0);
1599
1600 R600_OUT_BATCH_REGSEQ(VGT_MAX_VTX_INDX, 4);
1601 R600_OUT_BATCH(0xffffff);
1602 R600_OUT_BATCH(0);
1603 R600_OUT_BATCH(0);
1604 R600_OUT_BATCH(0);
1605
1606 R600_OUT_BATCH_REGSEQ(VGT_OUTPUT_PATH_CNTL, 13);
1607 R600_OUT_BATCH(0);
1608 R600_OUT_BATCH(0);
1609 R600_OUT_BATCH(0);
1610 R600_OUT_BATCH(0);
1611 R600_OUT_BATCH(0);
1612 R600_OUT_BATCH(0);
1613 R600_OUT_BATCH(0);
1614 R600_OUT_BATCH(0);
1615 R600_OUT_BATCH(0);
1616 R600_OUT_BATCH(0);
1617 R600_OUT_BATCH(0);
1618 R600_OUT_BATCH(0);
1619 R600_OUT_BATCH(0);
1620
1621 R600_OUT_BATCH_REGVAL(VGT_PRIMITIVEID_EN, 0);
1622 R600_OUT_BATCH_REGVAL(VGT_MULTI_PRIM_IB_RESET_EN, 0);
1623 R600_OUT_BATCH_REGVAL(VGT_INSTANCE_STEP_RATE_0, 0);
1624 R600_OUT_BATCH_REGVAL(VGT_INSTANCE_STEP_RATE_1, 0);
1625
1626 R600_OUT_BATCH_REGSEQ(VGT_STRMOUT_EN, 3);
1627 R600_OUT_BATCH(0);
1628 R600_OUT_BATCH(0);
1629 R600_OUT_BATCH(0);
1630
1631 R600_OUT_BATCH_REGVAL(VGT_STRMOUT_BUFFER_EN, 0);
1632 R600_OUT_BATCH_REGVAL(SX_ALPHA_TEST_CONTROL, 0);
1633
1634 END_BATCH();
1635 COMMIT_BATCH();
1636 }
1637
1638 static GLboolean validate_buffers(context_t *rmesa,
1639 struct radeon_bo *src_bo,
1640 struct radeon_bo *dst_bo)
1641 {
1642 int ret;
1643
1644 radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
1645
1646 ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs,
1647 src_bo, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0);
1648 if (ret)
1649 return GL_FALSE;
1650
1651 ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs,
1652 dst_bo, 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT);
1653 if (ret)
1654 return GL_FALSE;
1655
1656 ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs,
1657 rmesa->blit_bo,
1658 RADEON_GEM_DOMAIN_GTT, 0);
1659 if (ret)
1660 return GL_FALSE;
1661
1662 return GL_TRUE;
1663 }
1664
1665 unsigned r600_blit(struct gl_context *ctx,
1666 struct radeon_bo *src_bo,
1667 intptr_t src_offset,
1668 gl_format src_mesaformat,
1669 unsigned src_pitch,
1670 unsigned src_width,
1671 unsigned src_height,
1672 unsigned src_x,
1673 unsigned src_y,
1674 struct radeon_bo *dst_bo,
1675 intptr_t dst_offset,
1676 gl_format dst_mesaformat,
1677 unsigned dst_pitch,
1678 unsigned dst_width,
1679 unsigned dst_height,
1680 unsigned dst_x,
1681 unsigned dst_y,
1682 unsigned w,
1683 unsigned h,
1684 unsigned flip_y)
1685 {
1686 context_t *context = R700_CONTEXT(ctx);
1687 int id = 0;
1688
1689 if (!r600_check_blit(dst_mesaformat))
1690 return GL_FALSE;
1691
1692 if (src_bo == dst_bo) {
1693 return GL_FALSE;
1694 }
1695
1696 if (src_offset % 256 || dst_offset % 256) {
1697 return GL_FALSE;
1698 }
1699
1700 if (0) {
1701 fprintf(stderr, "src: width %d, height %d, pitch %d vs %d, format %s\n",
1702 src_width, src_height, src_pitch,
1703 _mesa_format_row_stride(src_mesaformat, src_width),
1704 _mesa_get_format_name(src_mesaformat));
1705 fprintf(stderr, "dst: width %d, height %d, pitch %d, format %s\n",
1706 dst_width, dst_height,
1707 _mesa_format_row_stride(dst_mesaformat, dst_width),
1708 _mesa_get_format_name(dst_mesaformat));
1709 }
1710
1711 /* Flush is needed to make sure that source buffer has correct data */
1712 radeonFlush(ctx);
1713
1714 rcommonEnsureCmdBufSpace(&context->radeon, 311, __FUNCTION__);
1715
1716 /* load shaders */
1717 load_shaders(context->radeon.glCtx);
1718
1719 if (!validate_buffers(context, src_bo, dst_bo))
1720 return GL_FALSE;
1721
1722 /* set clear state */
1723 /* 120 */
1724 set_default_state(context);
1725
1726 /* shaders */
1727 /* 72 */
1728 set_shaders(context);
1729
1730 /* src */
1731 /* 20 */
1732 set_tex_resource(context, src_mesaformat, src_bo,
1733 src_width, src_height, src_pitch, src_offset);
1734
1735 /* 5 */
1736 set_tex_sampler(context);
1737
1738 /* dst */
1739 /* 31 */
1740 set_render_target(context, dst_bo, dst_mesaformat,
1741 dst_pitch, dst_width, dst_height, dst_offset);
1742 /* scissors */
1743 /* 17 */
1744 set_scissors(context, dst_x, dst_y, dst_x + dst_width, dst_y + dst_height);
1745
1746 set_vb_data(context, src_x, src_y, dst_x, dst_y, w, h, src_height, flip_y);
1747 /* Vertex buffer setup */
1748 /* 24 */
1749 set_vtx_resource(context);
1750
1751 /* draw */
1752 /* 10 */
1753 draw_auto(context);
1754
1755 /* 7 */
1756 r700SyncSurf(context, dst_bo, 0,
1757 RADEON_GEM_DOMAIN_VRAM|RADEON_GEM_DOMAIN_GTT,
1758 CB_ACTION_ENA_bit | (1 << (id + 6)));
1759
1760 /* 5 */
1761 /* XXX drm should handle this in fence submit */
1762 r700WaitForIdleClean(context);
1763
1764 radeonFlush(ctx);
1765
1766 return GL_TRUE;
1767 }