i965 VS: Change nr_userclip to nr_userclip_planes.
[mesa.git] / src / mesa / drivers / dri / r600 / evergreen_blit.c
1 /*
2 * Copyright (C) 2010 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 "evergreen_off.h"
32 #include "evergreen_diff.h"
33
34 #include "evergreen_blit.h"
35 #include "evergreen_blit_shaders.h"
36 #include "r600_cmdbuf.h"
37
38 /* common formats supported as both textures and render targets */
39 unsigned evergreen_check_blit(gl_format mesa_format)
40 {
41 switch (mesa_format) {
42 case MESA_FORMAT_RGBA8888:
43 case MESA_FORMAT_SIGNED_RGBA8888:
44 case MESA_FORMAT_RGBA8888_REV:
45 case MESA_FORMAT_SIGNED_RGBA8888_REV:
46 case MESA_FORMAT_ARGB8888:
47 case MESA_FORMAT_XRGB8888:
48 case MESA_FORMAT_ARGB8888_REV:
49 case MESA_FORMAT_XRGB8888_REV:
50 case MESA_FORMAT_RGB565:
51 case MESA_FORMAT_RGB565_REV:
52 case MESA_FORMAT_ARGB4444:
53 case MESA_FORMAT_ARGB4444_REV:
54 case MESA_FORMAT_ARGB1555:
55 case MESA_FORMAT_ARGB1555_REV:
56 case MESA_FORMAT_AL88:
57 case MESA_FORMAT_AL88_REV:
58 case MESA_FORMAT_RGB332:
59 case MESA_FORMAT_A8:
60 case MESA_FORMAT_I8:
61 case MESA_FORMAT_L8:
62 case MESA_FORMAT_RGBA_FLOAT32:
63 case MESA_FORMAT_RGBA_FLOAT16:
64 case MESA_FORMAT_ALPHA_FLOAT32:
65 case MESA_FORMAT_ALPHA_FLOAT16:
66 case MESA_FORMAT_LUMINANCE_FLOAT32:
67 case MESA_FORMAT_LUMINANCE_FLOAT16:
68 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
69 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
70 case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
71 case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
72 case MESA_FORMAT_X8_Z24:
73 case MESA_FORMAT_S8_Z24:
74 case MESA_FORMAT_Z24_S8:
75 case MESA_FORMAT_Z16:
76 case MESA_FORMAT_Z32:
77 case MESA_FORMAT_SARGB8:
78 case MESA_FORMAT_SLA8:
79 case MESA_FORMAT_SL8:
80 break;
81 default:
82 return 0;
83 }
84
85 /* ??? */
86 /* not sure blit to depth works or not yet */
87 if (_mesa_get_format_bits(mesa_format, GL_DEPTH_BITS) > 0)
88 return 0;
89
90 return 1;
91 }
92
93 static inline void
94 eg_set_render_target(context_t *context, struct radeon_bo *bo, gl_format mesa_format,
95 int nPitchInPixel, int w, int h, intptr_t dst_offset)
96 {
97 uint32_t cb_color0_base, cb_color0_info = 0;
98 uint32_t cb_color0_pitch = 0, cb_color0_slice = 0, cb_color0_attrib = 0;
99 int id = 0;
100 uint32_t endian, comp_swap, format, source_format, number_type;
101 BATCH_LOCALS(&context->radeon);
102
103 cb_color0_base = dst_offset / 256;
104 endian = ENDIAN_NONE;
105
106 /* pitch */
107 SETfield(cb_color0_pitch, (nPitchInPixel / 8) - 1,
108 EG_CB_COLOR0_PITCH__TILE_MAX_shift,
109 EG_CB_COLOR0_PITCH__TILE_MAX_mask);
110
111 /* slice */
112 SETfield(cb_color0_slice,
113 ((nPitchInPixel * h) / 64) - 1,
114 EG_CB_COLOR0_SLICE__TILE_MAX_shift,
115 EG_CB_COLOR0_SLICE__TILE_MAX_mask);
116
117 /* CB_COLOR0_ATTRIB */ /* TODO : for z clear, this should be set to 0 */
118 SETbit(cb_color0_attrib,
119 EG_CB_COLOR0_ATTRIB__NON_DISP_TILING_ORDER_bit);
120
121 SETfield(cb_color0_info,
122 ARRAY_LINEAR_GENERAL,
123 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
124 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
125
126 SETbit(cb_color0_info, EG_CB_COLOR0_INFO__BLEND_BYPASS_bit);
127
128 switch(mesa_format) {
129 case MESA_FORMAT_RGBA8888:
130 #ifdef MESA_BIG_ENDIAN
131 endian = ENDIAN_8IN32;
132 #endif
133 format = COLOR_8_8_8_8;
134 comp_swap = SWAP_STD_REV;
135 number_type = NUMBER_UNORM;
136 source_format = 1;
137 break;
138 case MESA_FORMAT_SIGNED_RGBA8888:
139 #ifdef MESA_BIG_ENDIAN
140 endian = ENDIAN_8IN32;
141 #endif
142 format = COLOR_8_8_8_8;
143 comp_swap = SWAP_STD_REV;
144 number_type = NUMBER_SNORM;
145 source_format = 1;
146 break;
147 case MESA_FORMAT_RGBA8888_REV:
148 #ifdef MESA_BIG_ENDIAN
149 endian = ENDIAN_8IN32;
150 #endif
151 format = COLOR_8_8_8_8;
152 comp_swap = SWAP_STD;
153 number_type = NUMBER_UNORM;
154 source_format = 1;
155 break;
156 case MESA_FORMAT_SIGNED_RGBA8888_REV:
157 #ifdef MESA_BIG_ENDIAN
158 endian = ENDIAN_8IN32;
159 #endif
160 format = COLOR_8_8_8_8;
161 comp_swap = SWAP_STD;
162 number_type = NUMBER_SNORM;
163 source_format = 1;
164 break;
165 case MESA_FORMAT_ARGB8888:
166 case MESA_FORMAT_XRGB8888:
167 #ifdef MESA_BIG_ENDIAN
168 endian = ENDIAN_8IN32;
169 #endif
170 format = COLOR_8_8_8_8;
171 comp_swap = SWAP_ALT;
172 number_type = NUMBER_UNORM;
173 source_format = 1;
174 break;
175 case MESA_FORMAT_ARGB8888_REV:
176 case MESA_FORMAT_XRGB8888_REV:
177 #ifdef MESA_BIG_ENDIAN
178 endian = ENDIAN_8IN32;
179 #endif
180 format = COLOR_8_8_8_8;
181 comp_swap = SWAP_ALT_REV;
182 number_type = NUMBER_UNORM;
183 source_format = 1;
184 break;
185 case MESA_FORMAT_RGB565:
186 #ifdef MESA_BIG_ENDIAN
187 endian = ENDIAN_8IN16;
188 #endif
189 format = COLOR_5_6_5;
190 comp_swap = SWAP_STD_REV;
191 number_type = NUMBER_UNORM;
192 source_format = 1;
193 break;
194 case MESA_FORMAT_RGB565_REV:
195 #ifdef MESA_BIG_ENDIAN
196 endian = ENDIAN_8IN16;
197 #endif
198 format = COLOR_5_6_5;
199 comp_swap = SWAP_STD;
200 number_type = NUMBER_UNORM;
201 source_format = 1;
202 break;
203 case MESA_FORMAT_ARGB4444:
204 #ifdef MESA_BIG_ENDIAN
205 endian = ENDIAN_8IN16;
206 #endif
207 format = COLOR_4_4_4_4;
208 comp_swap = SWAP_ALT;
209 number_type = NUMBER_UNORM;
210 source_format = 1;
211 break;
212 case MESA_FORMAT_ARGB4444_REV:
213 #ifdef MESA_BIG_ENDIAN
214 endian = ENDIAN_8IN16;
215 #endif
216 format = COLOR_4_4_4_4;
217 comp_swap = SWAP_ALT_REV;
218 number_type = NUMBER_UNORM;
219 source_format = 1;
220 break;
221 case MESA_FORMAT_ARGB1555:
222 #ifdef MESA_BIG_ENDIAN
223 endian = ENDIAN_8IN16;
224 #endif
225 format = COLOR_1_5_5_5;
226 comp_swap = SWAP_ALT;
227 number_type = NUMBER_UNORM;
228 source_format = 1;
229 break;
230 case MESA_FORMAT_ARGB1555_REV:
231 #ifdef MESA_BIG_ENDIAN
232 endian = ENDIAN_8IN16;
233 #endif
234 format = COLOR_1_5_5_5;
235 comp_swap = SWAP_ALT_REV;
236 number_type = NUMBER_UNORM;
237 source_format = 1;
238 break;
239 case MESA_FORMAT_AL88:
240 #ifdef MESA_BIG_ENDIAN
241 endian = ENDIAN_8IN16;
242 #endif
243 format = COLOR_8_8;
244 comp_swap = SWAP_STD;
245 number_type = NUMBER_UNORM;
246 source_format = 1;
247 break;
248 case MESA_FORMAT_AL88_REV:
249 #ifdef MESA_BIG_ENDIAN
250 endian = ENDIAN_8IN16;
251 #endif
252 format = COLOR_8_8;
253 comp_swap = SWAP_STD_REV;
254 number_type = NUMBER_UNORM;
255 source_format = 1;
256 break;
257 case MESA_FORMAT_RGB332:
258 format = COLOR_3_3_2;
259 comp_swap = SWAP_STD_REV;
260 number_type = NUMBER_UNORM;
261 source_format = 1;
262 break;
263 case MESA_FORMAT_A8:
264 format = COLOR_8;
265 comp_swap = SWAP_ALT_REV;
266 number_type = NUMBER_UNORM;
267 source_format = 1;
268 break;
269 case MESA_FORMAT_I8:
270 format = COLOR_8;
271 comp_swap = SWAP_STD;
272 number_type = NUMBER_UNORM;
273 source_format = 1;
274 break;
275 case MESA_FORMAT_L8:
276 format = COLOR_8;
277 comp_swap = SWAP_ALT;
278 number_type = NUMBER_UNORM;
279 source_format = 1;
280 break;
281 case MESA_FORMAT_RGBA_FLOAT32:
282 #ifdef MESA_BIG_ENDIAN
283 endian = ENDIAN_8IN32;
284 #endif
285 format = COLOR_32_32_32_32_FLOAT;
286 comp_swap = SWAP_STD;
287 number_type = NUMBER_FLOAT;
288 source_format = 0;
289 break;
290 case MESA_FORMAT_RGBA_FLOAT16:
291 #ifdef MESA_BIG_ENDIAN
292 endian = ENDIAN_8IN16;
293 #endif
294 format = COLOR_16_16_16_16_FLOAT;
295 comp_swap = SWAP_STD;
296 number_type = NUMBER_FLOAT;
297 source_format = 0;
298 break;
299 case MESA_FORMAT_ALPHA_FLOAT32:
300 #ifdef MESA_BIG_ENDIAN
301 endian = ENDIAN_8IN32;
302 #endif
303 format = COLOR_32_FLOAT;
304 comp_swap = SWAP_ALT_REV;
305 number_type = NUMBER_FLOAT;
306 source_format = 0;
307 break;
308 case MESA_FORMAT_ALPHA_FLOAT16:
309 #ifdef MESA_BIG_ENDIAN
310 endian = ENDIAN_8IN16;
311 #endif
312 format = COLOR_16_FLOAT;
313 comp_swap = SWAP_ALT_REV;
314 number_type = NUMBER_FLOAT;
315 source_format = 0;
316 break;
317 case MESA_FORMAT_LUMINANCE_FLOAT32:
318 #ifdef MESA_BIG_ENDIAN
319 endian = ENDIAN_8IN32;
320 #endif
321 format = COLOR_32_FLOAT;
322 comp_swap = SWAP_ALT;
323 number_type = NUMBER_FLOAT;
324 source_format = 0;
325 break;
326 case MESA_FORMAT_LUMINANCE_FLOAT16:
327 #ifdef MESA_BIG_ENDIAN
328 endian = ENDIAN_8IN16;
329 #endif
330 format = COLOR_16_FLOAT;
331 comp_swap = SWAP_ALT;
332 number_type = NUMBER_FLOAT;
333 source_format = 0;
334 break;
335 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
336 #ifdef MESA_BIG_ENDIAN
337 endian = ENDIAN_8IN32;
338 #endif
339 format = COLOR_32_32_FLOAT;
340 comp_swap = SWAP_ALT_REV;
341 number_type = NUMBER_FLOAT;
342 source_format = 0;
343 break;
344 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
345 #ifdef MESA_BIG_ENDIAN
346 endian = ENDIAN_8IN16;
347 #endif
348 format = COLOR_16_16_FLOAT;
349 comp_swap = SWAP_ALT_REV;
350 number_type = NUMBER_FLOAT;
351 source_format = 0;
352 break;
353 case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
354 #ifdef MESA_BIG_ENDIAN
355 endian = ENDIAN_8IN32;
356 #endif
357 format = COLOR_32_FLOAT;
358 comp_swap = SWAP_STD;
359 number_type = NUMBER_FLOAT;
360 source_format = 0;
361 break;
362 case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
363 #ifdef MESA_BIG_ENDIAN
364 endian = ENDIAN_8IN16;
365 #endif
366 format = COLOR_16_FLOAT;
367 comp_swap = SWAP_STD;
368 number_type = NUMBER_UNORM;
369 source_format = 0;
370 break;
371 case MESA_FORMAT_X8_Z24:
372 case MESA_FORMAT_S8_Z24:
373 #ifdef MESA_BIG_ENDIAN
374 endian = ENDIAN_8IN32;
375 #endif
376 format = COLOR_8_24;
377 comp_swap = SWAP_STD;
378 number_type = NUMBER_UNORM;
379 SETfield(cb_color0_info,
380 ARRAY_1D_TILED_THIN1,
381 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
382 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
383 source_format = 0;
384 break;
385 case MESA_FORMAT_Z24_S8:
386 #ifdef MESA_BIG_ENDIAN
387 endian = ENDIAN_8IN32;
388 #endif
389 format = COLOR_24_8;
390 comp_swap = SWAP_STD;
391 number_type = NUMBER_UNORM;
392 SETfield(cb_color0_info,
393 ARRAY_1D_TILED_THIN1,
394 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
395 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
396 source_format = 0;
397 break;
398 case MESA_FORMAT_Z16:
399 #ifdef MESA_BIG_ENDIAN
400 endian = ENDIAN_8IN16;
401 #endif
402 format = COLOR_16;
403 comp_swap = SWAP_STD;
404 number_type = NUMBER_UNORM;
405 SETfield(cb_color0_info,
406 ARRAY_1D_TILED_THIN1,
407 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
408 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
409 source_format = 0;
410 break;
411 case MESA_FORMAT_Z32:
412 #ifdef MESA_BIG_ENDIAN
413 endian = ENDIAN_8IN32;
414 #endif
415 format = COLOR_32;
416 comp_swap = SWAP_STD;
417 number_type = NUMBER_UNORM;
418 SETfield(cb_color0_info,
419 ARRAY_1D_TILED_THIN1,
420 EG_CB_COLOR0_INFO__ARRAY_MODE_shift,
421 EG_CB_COLOR0_INFO__ARRAY_MODE_mask);
422 source_format = 0;
423 break;
424 case MESA_FORMAT_SARGB8:
425 #ifdef MESA_BIG_ENDIAN
426 endian = ENDIAN_8IN32;
427 #endif
428 format = COLOR_8_8_8_8;
429 comp_swap = SWAP_ALT;
430 number_type = NUMBER_SRGB;
431 source_format = 1;
432 break;
433 case MESA_FORMAT_SLA8:
434 #ifdef MESA_BIG_ENDIAN
435 endian = ENDIAN_8IN16;
436 #endif
437 format = COLOR_8_8;
438 comp_swap = SWAP_ALT_REV;
439 number_type = NUMBER_SRGB;
440 source_format = 1;
441 break;
442 case MESA_FORMAT_SL8:
443 format = COLOR_8;
444 comp_swap = SWAP_ALT_REV;
445 number_type = NUMBER_SRGB;
446 source_format = 1;
447 break;
448 default:
449 fprintf(stderr,"Invalid format for copy %s\n",_mesa_get_format_name(mesa_format));
450 assert("Invalid format for US output\n");
451 return;
452 }
453
454 SETfield(cb_color0_info,
455 endian,
456 EG_CB_COLOR0_INFO__ENDIAN_shift,
457 EG_CB_COLOR0_INFO__ENDIAN_mask);
458 SETfield(cb_color0_info,
459 format,
460 EG_CB_COLOR0_INFO__FORMAT_shift,
461 EG_CB_COLOR0_INFO__FORMAT_mask);
462 SETfield(cb_color0_info,
463 comp_swap,
464 EG_CB_COLOR0_INFO__COMP_SWAP_shift,
465 EG_CB_COLOR0_INFO__COMP_SWAP_mask);
466 SETfield(cb_color0_info,
467 number_type,
468 EG_CB_COLOR0_INFO__NUMBER_TYPE_shift,
469 EG_CB_COLOR0_INFO__NUMBER_TYPE_mask);
470 SETfield(cb_color0_info,
471 source_format,
472 EG_CB_COLOR0_INFO__SOURCE_FORMAT_shift,
473 EG_CB_COLOR0_INFO__SOURCE_FORMAT_mask);
474
475 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
476 EVERGREEN_OUT_BATCH_REGSEQ(EG_CB_COLOR0_BASE + (4 * id), 1);
477 R600_OUT_BATCH(cb_color0_base);
478 R600_OUT_BATCH_RELOC(cb_color0_base,
479 bo,
480 cb_color0_base,
481 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0);
482 END_BATCH();
483
484 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
485 EVERGREEN_OUT_BATCH_REGVAL(EG_CB_COLOR0_INFO, cb_color0_info);
486 R600_OUT_BATCH_RELOC(cb_color0_info,
487 bo,
488 cb_color0_info,
489 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0);
490 END_BATCH();
491
492 BEGIN_BATCH_NO_AUTOSTATE(5);
493 EVERGREEN_OUT_BATCH_REGSEQ(EG_CB_COLOR0_PITCH, 3);
494 R600_OUT_BATCH(cb_color0_pitch);
495 R600_OUT_BATCH(cb_color0_slice);
496 R600_OUT_BATCH(0);
497 END_BATCH();
498
499 BEGIN_BATCH_NO_AUTOSTATE(4);
500 EVERGREEN_OUT_BATCH_REGSEQ(EG_CB_COLOR0_ATTRIB, 2);
501 R600_OUT_BATCH(cb_color0_attrib);
502 R600_OUT_BATCH(0);
503 /*
504 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_CMASK.u32All);
505 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_CMASK_SLICE.u32All);
506 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_FMASK.u32All);
507 R600_OUT_BATCH(evergreen->render_target[id].CB_COLOR0_FMASK_SLICE.u32All);
508 */
509 END_BATCH();
510
511 COMMIT_BATCH();
512
513 }
514
515 static inline void eg_load_shaders(struct gl_context * ctx)
516 {
517
518 radeonContextPtr radeonctx = RADEON_CONTEXT(ctx);
519 context_t *context = EVERGREEN_CONTEXT(ctx);
520 int i, size;
521 uint32_t *shader;
522
523 if (context->blit_bo_loaded == 1)
524 return;
525
526 size = 4096;
527 context->blit_bo = radeon_bo_open(radeonctx->radeonScreen->bom, 0,
528 size, 256, RADEON_GEM_DOMAIN_GTT, 0);
529 radeon_bo_map(context->blit_bo, 1);
530 shader = context->blit_bo->ptr;
531
532 for(i=0; i<sizeof(evergreen_vs)/4; i++) {
533 shader[128+i] = CPU_TO_LE32(evergreen_vs[i]);
534 }
535 for(i=0; i<sizeof(evergreen_ps)/4; i++) {
536 shader[256+i] = CPU_TO_LE32(evergreen_ps[i]);
537 }
538
539 radeon_bo_unmap(context->blit_bo);
540 context->blit_bo_loaded = 1;
541
542 }
543
544 static inline void
545 eg_set_shaders(context_t *context)
546 {
547 struct radeon_bo * pbo = context->blit_bo;
548 uint32_t sq_pgm_start_fs = (512 >> 8);
549 uint32_t sq_pgm_resources_fs = 0;
550
551 uint32_t sq_pgm_start_vs = (512 >> 8);
552 uint32_t sq_pgm_resources_vs = (2 << NUM_GPRS_shift);
553
554 uint32_t sq_pgm_start_ps = (1024 >> 8);
555 uint32_t sq_pgm_resources_ps = (1 << NUM_GPRS_shift);
556 uint32_t sq_pgm_exports_ps = (1 << 1);
557 BATCH_LOCALS(&context->radeon);
558
559 r700SyncSurf(context, pbo, RADEON_GEM_DOMAIN_GTT, 0, SH_ACTION_ENA_bit);
560
561 /* FS */
562 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
563 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_START_FS, 1);
564 R600_OUT_BATCH(sq_pgm_start_fs);
565 R600_OUT_BATCH_RELOC(sq_pgm_start_fs,
566 pbo,
567 sq_pgm_start_fs,
568 RADEON_GEM_DOMAIN_GTT, 0, 0);
569 END_BATCH();
570
571 BEGIN_BATCH_NO_AUTOSTATE(3);
572 EVERGREEN_OUT_BATCH_REGVAL(EG_SQ_PGM_RESOURCES_FS, sq_pgm_resources_fs);
573 END_BATCH();
574
575 /* VS */
576 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
577 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_START_VS, 1);
578 R600_OUT_BATCH(sq_pgm_start_vs);
579 R600_OUT_BATCH_RELOC(sq_pgm_start_vs,
580 pbo,
581 sq_pgm_start_vs,
582 RADEON_GEM_DOMAIN_GTT, 0, 0);
583 END_BATCH();
584
585 BEGIN_BATCH_NO_AUTOSTATE(4);
586 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_RESOURCES_VS, 2);
587 R600_OUT_BATCH(sq_pgm_resources_vs);
588 R600_OUT_BATCH(0);
589 END_BATCH();
590
591 /* PS */
592 BEGIN_BATCH_NO_AUTOSTATE(3 + 2);
593 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_START_PS, 1);
594 R600_OUT_BATCH(sq_pgm_start_ps);
595 R600_OUT_BATCH_RELOC(sq_pgm_start_ps,
596 pbo,
597 sq_pgm_start_ps,
598 RADEON_GEM_DOMAIN_GTT, 0, 0);
599 END_BATCH();
600
601 BEGIN_BATCH_NO_AUTOSTATE(5);
602 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_PGM_RESOURCES_PS, 3);
603 R600_OUT_BATCH(sq_pgm_resources_ps);
604 R600_OUT_BATCH(0);
605 R600_OUT_BATCH(sq_pgm_exports_ps);
606 END_BATCH();
607
608 COMMIT_BATCH();
609
610 }
611
612 static inline void
613 eg_set_vtx_resource(context_t *context)
614 {
615 struct radeon_bo *bo = context->blit_bo;
616 uint32_t sq_vtx_constant_word3 = 0;
617 uint32_t sq_vtx_constant_word2 = 0;
618 BATCH_LOCALS(&context->radeon);
619
620 BEGIN_BATCH_NO_AUTOSTATE(6);
621 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
622 R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
623 R600_OUT_BATCH(0);
624
625 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
626 R600_OUT_BATCH(mmSQ_VTX_START_INST_LOC - ASIC_CTL_CONST_BASE_INDEX);
627 R600_OUT_BATCH(0);
628 END_BATCH();
629
630 if (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_CEDAR)
631 r700SyncSurf(context, bo, RADEON_GEM_DOMAIN_GTT, 0, TC_ACTION_ENA_bit);
632 else
633 r700SyncSurf(context, bo, RADEON_GEM_DOMAIN_GTT, 0, VC_ACTION_ENA_bit);
634
635 SETfield(sq_vtx_constant_word3, SQ_SEL_X,
636 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_X_shift,
637 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_X_mask);
638 SETfield(sq_vtx_constant_word3, SQ_SEL_Y,
639 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Y_shift,
640 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Y_mask);
641 SETfield(sq_vtx_constant_word3, SQ_SEL_Z,
642 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Z_shift,
643 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Z_mask);
644 SETfield(sq_vtx_constant_word3, SQ_SEL_W,
645 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_W_shift,
646 EG_SQ_VTX_CONSTANT_WORD3_0__DST_SEL_W_mask);
647
648 sq_vtx_constant_word2 = 0
649 #ifdef MESA_BIG_ENDIAN
650 | (SQ_ENDIAN_8IN32 << SQ_VTX_CONSTANT_WORD2_0__ENDIAN_SWAP_shift)
651 #endif
652 | (16 << SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift);
653
654 BEGIN_BATCH_NO_AUTOSTATE(10 + 2);
655
656 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 8));
657 R600_OUT_BATCH(EG_SQ_FETCH_RESOURCE_VS_OFFSET * EG_FETCH_RESOURCE_STRIDE);
658 R600_OUT_BATCH(0);
659 R600_OUT_BATCH(48 - 1);
660 R600_OUT_BATCH(sq_vtx_constant_word2);
661 R600_OUT_BATCH(sq_vtx_constant_word3);
662 R600_OUT_BATCH(0);
663 R600_OUT_BATCH(0);
664 R600_OUT_BATCH(0);
665 R600_OUT_BATCH(SQ_TEX_VTX_VALID_BUFFER << SQ_TEX_RESOURCE_WORD6_0__TYPE_shift);
666 R600_OUT_BATCH_RELOC(0,
667 bo,
668 0,
669 RADEON_GEM_DOMAIN_GTT, 0, 0);
670 END_BATCH();
671 COMMIT_BATCH();
672
673 }
674
675 static inline void
676 eg_set_tex_resource(context_t * context,
677 gl_format mesa_format, struct radeon_bo *bo, int w, int h,
678 int TexelPitch, intptr_t src_offset)
679 {
680 uint32_t sq_tex_resource0, sq_tex_resource1, sq_tex_resource2, sq_tex_resource4, sq_tex_resource7;
681
682 sq_tex_resource0 = sq_tex_resource1 = sq_tex_resource2 = sq_tex_resource4 = sq_tex_resource7 = 0;
683 BATCH_LOCALS(&context->radeon);
684
685 SETfield(sq_tex_resource0, SQ_TEX_DIM_2D, DIM_shift, DIM_mask);
686 SETfield(sq_tex_resource0, ARRAY_LINEAR_GENERAL,
687 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
688 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
689
690 switch (mesa_format) {
691 case MESA_FORMAT_RGBA8888:
692 case MESA_FORMAT_SIGNED_RGBA8888:
693 SETfield(sq_tex_resource7, FMT_8_8_8_8,
694 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
695 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
696 SETfield(sq_tex_resource4, SQ_SEL_W,
697 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
698 SETfield(sq_tex_resource4, SQ_SEL_Z,
699 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
700 SETfield(sq_tex_resource4, SQ_SEL_Y,
701 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
702 SETfield(sq_tex_resource4, SQ_SEL_X,
703 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
704 if (mesa_format == MESA_FORMAT_SIGNED_RGBA8888) {
705 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
706 FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
707 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
708 FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
709 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
710 FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
711 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
712 FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
713 }
714 break;
715 case MESA_FORMAT_RGBA8888_REV:
716 case MESA_FORMAT_SIGNED_RGBA8888_REV:
717 SETfield(sq_tex_resource7, FMT_8_8_8_8,
718 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
719 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
720 SETfield(sq_tex_resource4, SQ_SEL_X,
721 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
722 SETfield(sq_tex_resource4, SQ_SEL_Y,
723 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
724 SETfield(sq_tex_resource4, SQ_SEL_Z,
725 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
726 SETfield(sq_tex_resource4, SQ_SEL_W,
727 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
728 if (mesa_format == MESA_FORMAT_SIGNED_RGBA8888_REV) {
729 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
730 FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
731 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
732 FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
733 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
734 FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
735 SETfield(sq_tex_resource4, SQ_FORMAT_COMP_SIGNED,
736 FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
737 }
738 break;
739 case MESA_FORMAT_ARGB8888:
740 SETfield(sq_tex_resource7, FMT_8_8_8_8,
741 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
742 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
743 SETfield(sq_tex_resource4, SQ_SEL_Z,
744 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
745 SETfield(sq_tex_resource4, SQ_SEL_Y,
746 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
747 SETfield(sq_tex_resource4, SQ_SEL_X,
748 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
749 SETfield(sq_tex_resource4, SQ_SEL_W,
750 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
751 break;
752 case MESA_FORMAT_XRGB8888:
753 SETfield(sq_tex_resource7, FMT_8_8_8_8,
754 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
755 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
756 SETfield(sq_tex_resource4, SQ_SEL_Z,
757 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
758 SETfield(sq_tex_resource4, SQ_SEL_Y,
759 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
760 SETfield(sq_tex_resource4, SQ_SEL_X,
761 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
762 SETfield(sq_tex_resource4, SQ_SEL_1,
763 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
764 break;
765 case MESA_FORMAT_ARGB8888_REV:
766 SETfield(sq_tex_resource7, FMT_8_8_8_8,
767 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
768 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
769 SETfield(sq_tex_resource4, SQ_SEL_Y,
770 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
771 SETfield(sq_tex_resource4, SQ_SEL_Z,
772 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
773 SETfield(sq_tex_resource4, SQ_SEL_W,
774 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
775 SETfield(sq_tex_resource4, SQ_SEL_X,
776 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
777 break;
778 case MESA_FORMAT_XRGB8888_REV:
779 SETfield(sq_tex_resource7, FMT_8_8_8_8,
780 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
781 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
782 SETfield(sq_tex_resource4, SQ_SEL_1,
783 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
784 SETfield(sq_tex_resource4, SQ_SEL_Z,
785 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
786 SETfield(sq_tex_resource4, SQ_SEL_W,
787 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
788 SETfield(sq_tex_resource4, SQ_SEL_X,
789 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
790 break;
791 case MESA_FORMAT_RGB565:
792 SETfield(sq_tex_resource7, FMT_5_6_5,
793 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
794 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
795 SETfield(sq_tex_resource4, SQ_SEL_Z,
796 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
797 SETfield(sq_tex_resource4, SQ_SEL_Y,
798 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
799 SETfield(sq_tex_resource4, SQ_SEL_X,
800 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
801 SETfield(sq_tex_resource4, SQ_SEL_1,
802 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
803 break;
804 case MESA_FORMAT_RGB565_REV:
805 SETfield(sq_tex_resource7, FMT_5_6_5,
806 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
807 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
808 SETfield(sq_tex_resource4, SQ_SEL_X,
809 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
810 SETfield(sq_tex_resource4, SQ_SEL_Y,
811 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
812 SETfield(sq_tex_resource4, SQ_SEL_Z,
813 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
814 SETfield(sq_tex_resource4, SQ_SEL_1,
815 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
816 break;
817 case MESA_FORMAT_ARGB4444:
818 SETfield(sq_tex_resource7, FMT_4_4_4_4,
819 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
820 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
821 SETfield(sq_tex_resource4, SQ_SEL_Z,
822 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
823 SETfield(sq_tex_resource4, SQ_SEL_Y,
824 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
825 SETfield(sq_tex_resource4, SQ_SEL_X,
826 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
827 SETfield(sq_tex_resource4, SQ_SEL_W,
828 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
829 break;
830 case MESA_FORMAT_ARGB4444_REV:
831 SETfield(sq_tex_resource7, FMT_4_4_4_4,
832 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
833 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
834 SETfield(sq_tex_resource4, SQ_SEL_Y,
835 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
836 SETfield(sq_tex_resource4, SQ_SEL_Z,
837 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
838 SETfield(sq_tex_resource4, SQ_SEL_W,
839 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
840 SETfield(sq_tex_resource4, SQ_SEL_X,
841 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
842 break;
843 case MESA_FORMAT_ARGB1555:
844 SETfield(sq_tex_resource7, FMT_1_5_5_5,
845 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
846 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
847 SETfield(sq_tex_resource4, SQ_SEL_Z,
848 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
849 SETfield(sq_tex_resource4, SQ_SEL_Y,
850 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
851 SETfield(sq_tex_resource4, SQ_SEL_X,
852 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
853 SETfield(sq_tex_resource4, SQ_SEL_W,
854 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
855 break;
856 case MESA_FORMAT_ARGB1555_REV:
857 SETfield(sq_tex_resource7, FMT_1_5_5_5,
858 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
859 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
860 SETfield(sq_tex_resource4, SQ_SEL_Y,
861 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
862 SETfield(sq_tex_resource4, SQ_SEL_Z,
863 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
864 SETfield(sq_tex_resource4, SQ_SEL_W,
865 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
866 SETfield(sq_tex_resource4, SQ_SEL_X,
867 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
868 break;
869 case MESA_FORMAT_AL88:
870 case MESA_FORMAT_AL88_REV: /* TODO : Check this. */
871 SETfield(sq_tex_resource7, FMT_8_8,
872 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
873 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
874 SETfield(sq_tex_resource4, SQ_SEL_X,
875 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
876 SETfield(sq_tex_resource4, SQ_SEL_X,
877 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
878 SETfield(sq_tex_resource4, SQ_SEL_X,
879 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
880 SETfield(sq_tex_resource4, SQ_SEL_Y,
881 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
882 break;
883 case MESA_FORMAT_RGB332:
884 SETfield(sq_tex_resource7, FMT_3_3_2,
885 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
886 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
887 SETfield(sq_tex_resource4, SQ_SEL_Z,
888 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
889 SETfield(sq_tex_resource4, SQ_SEL_Y,
890 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
891 SETfield(sq_tex_resource4, SQ_SEL_X,
892 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
893 SETfield(sq_tex_resource4, SQ_SEL_1,
894 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
895 break;
896 case MESA_FORMAT_A8: /* ZERO, ZERO, ZERO, X */
897 SETfield(sq_tex_resource7, FMT_8,
898 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
899 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
900 SETfield(sq_tex_resource4, SQ_SEL_0,
901 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
902 SETfield(sq_tex_resource4, SQ_SEL_0,
903 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
904 SETfield(sq_tex_resource4, SQ_SEL_0,
905 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
906 SETfield(sq_tex_resource4, SQ_SEL_X,
907 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
908 break;
909 case MESA_FORMAT_L8: /* X, X, X, ONE */
910 SETfield(sq_tex_resource7, FMT_8,
911 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
912 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
913 SETfield(sq_tex_resource4, SQ_SEL_X,
914 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
915 SETfield(sq_tex_resource4, SQ_SEL_X,
916 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
917 SETfield(sq_tex_resource4, SQ_SEL_X,
918 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
919 SETfield(sq_tex_resource4, SQ_SEL_1,
920 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
921 break;
922 case MESA_FORMAT_I8: /* X, X, X, X */
923 SETfield(sq_tex_resource7, FMT_8,
924 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
925 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
926 SETfield(sq_tex_resource4, SQ_SEL_X,
927 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
928 SETfield(sq_tex_resource4, SQ_SEL_X,
929 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
930 SETfield(sq_tex_resource4, SQ_SEL_X,
931 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
932 SETfield(sq_tex_resource4, SQ_SEL_X,
933 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
934 break;
935 case MESA_FORMAT_RGBA_FLOAT32:
936 SETfield(sq_tex_resource7, FMT_32_32_32_32_FLOAT,
937 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
938 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
939 SETfield(sq_tex_resource4, SQ_SEL_X,
940 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
941 SETfield(sq_tex_resource4, SQ_SEL_Y,
942 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
943 SETfield(sq_tex_resource4, SQ_SEL_Z,
944 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
945 SETfield(sq_tex_resource4, SQ_SEL_W,
946 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
947 break;
948 case MESA_FORMAT_RGBA_FLOAT16:
949 SETfield(sq_tex_resource7, FMT_16_16_16_16_FLOAT,
950 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
951 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
952 SETfield(sq_tex_resource4, SQ_SEL_X,
953 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
954 SETfield(sq_tex_resource4, SQ_SEL_Y,
955 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
956 SETfield(sq_tex_resource4, SQ_SEL_Z,
957 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
958 SETfield(sq_tex_resource4, SQ_SEL_W,
959 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
960 break;
961 case MESA_FORMAT_ALPHA_FLOAT32: /* ZERO, ZERO, ZERO, X */
962 SETfield(sq_tex_resource7, FMT_32_FLOAT,
963 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
964 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
965 SETfield(sq_tex_resource4, SQ_SEL_0,
966 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
967 SETfield(sq_tex_resource4, SQ_SEL_0,
968 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
969 SETfield(sq_tex_resource4, SQ_SEL_0,
970 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
971 SETfield(sq_tex_resource4, SQ_SEL_X,
972 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
973 break;
974 case MESA_FORMAT_ALPHA_FLOAT16: /* ZERO, ZERO, ZERO, X */
975 SETfield(sq_tex_resource7, FMT_16_FLOAT,
976 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
977 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
978 SETfield(sq_tex_resource4, SQ_SEL_0,
979 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
980 SETfield(sq_tex_resource4, SQ_SEL_0,
981 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
982 SETfield(sq_tex_resource4, SQ_SEL_0,
983 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
984 SETfield(sq_tex_resource4, SQ_SEL_X,
985 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
986 break;
987 case MESA_FORMAT_LUMINANCE_FLOAT32: /* X, X, X, ONE */
988 SETfield(sq_tex_resource7, FMT_32_FLOAT,
989 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
990 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
991 SETfield(sq_tex_resource4, SQ_SEL_X,
992 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
993 SETfield(sq_tex_resource4, SQ_SEL_X,
994 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
995 SETfield(sq_tex_resource4, SQ_SEL_X,
996 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
997 SETfield(sq_tex_resource4, SQ_SEL_1,
998 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
999 break;
1000 case MESA_FORMAT_LUMINANCE_FLOAT16: /* X, X, X, ONE */
1001 SETfield(sq_tex_resource7, FMT_16_FLOAT,
1002 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1003 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1004 SETfield(sq_tex_resource4, SQ_SEL_X,
1005 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1006 SETfield(sq_tex_resource4, SQ_SEL_X,
1007 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1008 SETfield(sq_tex_resource4, SQ_SEL_X,
1009 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1010 SETfield(sq_tex_resource4, SQ_SEL_1,
1011 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1012 break;
1013 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
1014 SETfield(sq_tex_resource7, FMT_32_32_FLOAT,
1015 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1016 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1017 SETfield(sq_tex_resource4, SQ_SEL_X,
1018 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1019 SETfield(sq_tex_resource4, SQ_SEL_X,
1020 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1021 SETfield(sq_tex_resource4, SQ_SEL_X,
1022 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1023 SETfield(sq_tex_resource4, SQ_SEL_Y,
1024 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1025 break;
1026 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
1027 SETfield(sq_tex_resource7, FMT_16_16_FLOAT,
1028 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1029 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1030 SETfield(sq_tex_resource4, SQ_SEL_X,
1031 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1032 SETfield(sq_tex_resource4, SQ_SEL_X,
1033 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1034 SETfield(sq_tex_resource4, SQ_SEL_X,
1035 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1036 SETfield(sq_tex_resource4, SQ_SEL_Y,
1037 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1038 break;
1039 case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
1040 SETfield(sq_tex_resource7, FMT_32_FLOAT,
1041 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1042 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1043 SETfield(sq_tex_resource4, SQ_SEL_X,
1044 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1045 SETfield(sq_tex_resource4, SQ_SEL_X,
1046 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1047 SETfield(sq_tex_resource4, SQ_SEL_X,
1048 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1049 SETfield(sq_tex_resource4, SQ_SEL_X,
1050 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1051 break;
1052 case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
1053 SETfield(sq_tex_resource7, FMT_16_FLOAT,
1054 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1055 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1056 SETfield(sq_tex_resource4, SQ_SEL_X,
1057 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1058 SETfield(sq_tex_resource4, SQ_SEL_X,
1059 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1060 SETfield(sq_tex_resource4, SQ_SEL_X,
1061 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1062 SETfield(sq_tex_resource4, SQ_SEL_X,
1063 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1064 break;
1065 case MESA_FORMAT_Z16:
1066 /* ??? */
1067 CLEARbit(sq_tex_resource0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);
1068 SETfield(sq_tex_resource1, ARRAY_1D_TILED_THIN1,
1069 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift,
1070 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);
1071 SETfield(sq_tex_resource7, FMT_16,
1072 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1073 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1074 SETfield(sq_tex_resource4, SQ_SEL_X,
1075 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1076 SETfield(sq_tex_resource4, SQ_SEL_X,
1077 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1078 SETfield(sq_tex_resource4, SQ_SEL_X,
1079 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1080 SETfield(sq_tex_resource4, SQ_SEL_X,
1081 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1082 break;
1083 case MESA_FORMAT_X8_Z24:
1084 /* ??? */
1085 CLEARbit(sq_tex_resource0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);
1086 SETfield(sq_tex_resource1, ARRAY_1D_TILED_THIN1,
1087 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift,
1088 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);
1089 SETfield(sq_tex_resource7, FMT_8_24,
1090 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1091 EG_SQ_TEX_RESOURCE_WORD7_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_1,
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_S8_Z24:
1102 /* ??? */
1103 CLEARbit(sq_tex_resource0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);
1104 SETfield(sq_tex_resource1, ARRAY_1D_TILED_THIN1,
1105 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift,
1106 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);
1107 SETbit(sq_tex_resource0, TILE_TYPE_bit);
1108 SETfield(sq_tex_resource0, ARRAY_1D_TILED_THIN1,
1109 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
1110 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
1111 SETfield(sq_tex_resource7, FMT_8_24,
1112 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1113 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1114 SETfield(sq_tex_resource4, SQ_SEL_X,
1115 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1116 SETfield(sq_tex_resource4, SQ_SEL_Y,
1117 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1118 SETfield(sq_tex_resource4, SQ_SEL_0,
1119 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1120 SETfield(sq_tex_resource4, SQ_SEL_1,
1121 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1122 break;
1123 case MESA_FORMAT_Z24_S8:
1124 /* ??? */
1125 CLEARbit(sq_tex_resource0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);
1126 SETfield(sq_tex_resource1, ARRAY_1D_TILED_THIN1,
1127 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift,
1128 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);
1129 SETbit(sq_tex_resource0, TILE_TYPE_bit);
1130 SETfield(sq_tex_resource0, ARRAY_1D_TILED_THIN1,
1131 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
1132 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
1133 SETfield(sq_tex_resource7, FMT_24_8,
1134 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1135 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1136 SETfield(sq_tex_resource4, SQ_SEL_X,
1137 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1138 SETfield(sq_tex_resource4, SQ_SEL_Y,
1139 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1140 SETfield(sq_tex_resource4, SQ_SEL_0,
1141 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1142 SETfield(sq_tex_resource4, SQ_SEL_1,
1143 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1144 break;
1145 case MESA_FORMAT_Z32:
1146 /* ??? */
1147 CLEARbit(sq_tex_resource0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);
1148 SETfield(sq_tex_resource1, ARRAY_1D_TILED_THIN1,
1149 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift,
1150 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);
1151 SETbit(sq_tex_resource0, TILE_TYPE_bit);
1152 SETfield(sq_tex_resource0, ARRAY_1D_TILED_THIN1,
1153 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
1154 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
1155 SETfield(sq_tex_resource7, FMT_32,
1156 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1157 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1158 SETfield(sq_tex_resource4, SQ_SEL_X,
1159 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1160 SETfield(sq_tex_resource4, SQ_SEL_X,
1161 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1162 SETfield(sq_tex_resource4, SQ_SEL_X,
1163 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1164 SETfield(sq_tex_resource4, SQ_SEL_X,
1165 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1166 break;
1167 case MESA_FORMAT_S8:
1168 /* ??? */
1169 CLEARbit(sq_tex_resource0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);
1170 SETfield(sq_tex_resource1, ARRAY_1D_TILED_THIN1,
1171 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift,
1172 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);
1173 SETfield(sq_tex_resource7, FMT_8,
1174 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1175 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1176 SETfield(sq_tex_resource4, SQ_SEL_X,
1177 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1178 SETfield(sq_tex_resource4, SQ_SEL_X,
1179 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1180 SETfield(sq_tex_resource4, SQ_SEL_X,
1181 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1182 SETfield(sq_tex_resource4, SQ_SEL_X,
1183 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1184 break;
1185 case MESA_FORMAT_SARGB8:
1186 SETfield(sq_tex_resource7, FMT_8_8_8_8,
1187 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1188 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1189 SETfield(sq_tex_resource4, SQ_SEL_Z,
1190 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1191 SETfield(sq_tex_resource4, SQ_SEL_Y,
1192 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1193 SETfield(sq_tex_resource4, SQ_SEL_X,
1194 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1195 SETfield(sq_tex_resource4, SQ_SEL_W,
1196 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1197 SETbit(sq_tex_resource4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
1198 break;
1199 case MESA_FORMAT_SLA8:
1200 SETfield(sq_tex_resource7, FMT_8_8,
1201 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1202 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1203 SETfield(sq_tex_resource4, SQ_SEL_X,
1204 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1205 SETfield(sq_tex_resource4, SQ_SEL_X,
1206 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1207 SETfield(sq_tex_resource4, SQ_SEL_X,
1208 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1209 SETfield(sq_tex_resource4, SQ_SEL_Y,
1210 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1211 SETbit(sq_tex_resource4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
1212 break;
1213 case MESA_FORMAT_SL8: /* X, X, X, ONE */
1214 SETfield(sq_tex_resource7, FMT_8,
1215 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift,
1216 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1217 SETfield(sq_tex_resource4, SQ_SEL_X,
1218 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1219 SETfield(sq_tex_resource4, SQ_SEL_X,
1220 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1221 SETfield(sq_tex_resource4, SQ_SEL_X,
1222 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1223 SETfield(sq_tex_resource4, SQ_SEL_1,
1224 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1225 SETbit(sq_tex_resource4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
1226 break;
1227 default:
1228 fprintf(stderr,"Invalid format for copy %s\n",_mesa_get_format_name(mesa_format));
1229 assert("Invalid format for US output\n");
1230 return;
1231 };
1232
1233 SETfield(sq_tex_resource0, (TexelPitch/8)-1,
1234 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift,
1235 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask);
1236 SETfield(sq_tex_resource0, w - 1,
1237 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_shift,
1238 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_mask);
1239 SETfield(sq_tex_resource1, h - 1,
1240 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_shift,
1241 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_mask);
1242
1243 sq_tex_resource2 = src_offset / 256;
1244
1245 SETfield(sq_tex_resource7, SQ_TEX_VTX_VALID_TEXTURE,
1246 SQ_TEX_RESOURCE_WORD6_0__TYPE_shift,
1247 SQ_TEX_RESOURCE_WORD6_0__TYPE_mask);
1248
1249 r700SyncSurf(context, bo,
1250 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM,
1251 0, TC_ACTION_ENA_bit);
1252
1253 BEGIN_BATCH_NO_AUTOSTATE(10 + 4);
1254 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_RESOURCE, 8));
1255 R600_OUT_BATCH(0 * 7);
1256 R600_OUT_BATCH(sq_tex_resource0);
1257 R600_OUT_BATCH(sq_tex_resource1);
1258 R600_OUT_BATCH(sq_tex_resource2);
1259 R600_OUT_BATCH(0);
1260 R600_OUT_BATCH(sq_tex_resource4);
1261 R600_OUT_BATCH(0);
1262 R600_OUT_BATCH(0);
1263 R600_OUT_BATCH(sq_tex_resource7);
1264 R600_OUT_BATCH_RELOC(0,
1265 bo,
1266 0,
1267 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
1268 R600_OUT_BATCH_RELOC(0,
1269 bo,
1270 0,
1271 RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
1272 END_BATCH();
1273 COMMIT_BATCH();
1274 }
1275
1276 static inline void
1277 eg_set_tex_sampler(context_t * context)
1278 {
1279 uint32_t sq_tex_sampler_word0 = 0, sq_tex_sampler_word1 = 0, sq_tex_sampler_word2 = 0;
1280 int i = 0;
1281
1282 SETbit(sq_tex_sampler_word2, EG_SQ_TEX_SAMPLER_WORD2_0__TYPE_bit);
1283
1284 BATCH_LOCALS(&context->radeon);
1285
1286 BEGIN_BATCH_NO_AUTOSTATE(5);
1287 R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_SAMPLER, 3));
1288 R600_OUT_BATCH(i * 3);
1289 R600_OUT_BATCH(sq_tex_sampler_word0);
1290 R600_OUT_BATCH(sq_tex_sampler_word1);
1291 R600_OUT_BATCH(sq_tex_sampler_word2);
1292 END_BATCH();
1293
1294 }
1295
1296 static inline void
1297 eg_set_scissors(context_t *context, int x1, int y1, int x2, int y2)
1298 {
1299 BATCH_LOCALS(&context->radeon);
1300
1301 BEGIN_BATCH_NO_AUTOSTATE(17);
1302 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_SCREEN_SCISSOR_TL, 2);
1303 R600_OUT_BATCH((x1 << 0) | (y1 << 16));
1304 R600_OUT_BATCH((x2 << 0) | (y2 << 16));
1305
1306 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_WINDOW_OFFSET, 3);
1307 R600_OUT_BATCH(0); //PA_SC_WINDOW_OFFSET
1308 R600_OUT_BATCH((x1 << 0) | (y1 << 16) | (WINDOW_OFFSET_DISABLE_bit)); //PA_SC_WINDOW_SCISSOR_TL
1309 R600_OUT_BATCH((x2 << 0) | (y2 << 16));
1310
1311 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_GENERIC_SCISSOR_TL, 2);
1312 R600_OUT_BATCH((x1 << 0) | (y1 << 16) | (WINDOW_OFFSET_DISABLE_bit));
1313 R600_OUT_BATCH((x2 << 0) | (y2 << 16));
1314
1315 /* XXX 16 of these PA_SC_VPORT_SCISSOR_0_TL_num ... */
1316 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_VPORT_SCISSOR_0_TL, 2);
1317 R600_OUT_BATCH((x1 << 0) | (y1 << 16) | (WINDOW_OFFSET_DISABLE_bit));
1318 R600_OUT_BATCH((x2 << 0) | (y2 << 16));
1319 END_BATCH();
1320
1321 COMMIT_BATCH();
1322
1323 }
1324
1325 static inline void
1326 eg_set_vb_data(context_t * context, int src_x, int src_y, int dst_x, int dst_y,
1327 int w, int h, int src_h, unsigned flip_y)
1328 {
1329 float *vb;
1330 radeon_bo_map(context->blit_bo, 1);
1331 vb = context->blit_bo->ptr;
1332
1333 vb[0] = (float)(dst_x);
1334 vb[1] = (float)(dst_y);
1335 vb[2] = (float)(src_x);
1336 vb[3] = (flip_y) ? (float)(src_h - src_y) : (float)src_y;
1337
1338 vb[4] = (float)(dst_x);
1339 vb[5] = (float)(dst_y + h);
1340 vb[6] = (float)(src_x);
1341 vb[7] = (flip_y) ? (float)(src_h - (src_y + h)) : (float)(src_y + h);
1342
1343 vb[8] = (float)(dst_x + w);
1344 vb[9] = (float)(dst_y + h);
1345 vb[10] = (float)(src_x + w);
1346 vb[11] = (flip_y) ? (float)(src_h - (src_y + h)) : (float)(src_y + h);
1347
1348 radeon_bo_unmap(context->blit_bo);
1349
1350 }
1351
1352 static inline void
1353 eg_draw_auto(context_t *context)
1354 {
1355 BATCH_LOCALS(&context->radeon);
1356 uint32_t vgt_primitive_type = 0, vgt_index_type = 0, vgt_draw_initiator = 0, vgt_num_indices;
1357
1358 SETfield(vgt_primitive_type, DI_PT_RECTLIST,
1359 VGT_PRIMITIVE_TYPE__PRIM_TYPE_shift,
1360 VGT_PRIMITIVE_TYPE__PRIM_TYPE_mask);
1361 SETfield(vgt_index_type, DI_INDEX_SIZE_16_BIT, INDEX_TYPE_shift,
1362 INDEX_TYPE_mask);
1363 SETfield(vgt_draw_initiator, DI_MAJOR_MODE_0, MAJOR_MODE_shift,
1364 MAJOR_MODE_mask);
1365 SETfield(vgt_draw_initiator, DI_SRC_SEL_AUTO_INDEX, SOURCE_SELECT_shift,
1366 SOURCE_SELECT_mask);
1367
1368 vgt_num_indices = 3;
1369
1370 BEGIN_BATCH_NO_AUTOSTATE(10);
1371 // prim
1372 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_PRIMITIVE_TYPE, 1);
1373 R600_OUT_BATCH(vgt_primitive_type);
1374 // index type
1375 R600_OUT_BATCH(CP_PACKET3(R600_IT_INDEX_TYPE, 0));
1376 R600_OUT_BATCH(vgt_index_type);
1377 // num instances
1378 R600_OUT_BATCH(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
1379 R600_OUT_BATCH(1);
1380 //
1381 R600_OUT_BATCH(CP_PACKET3(R600_IT_DRAW_INDEX_AUTO, 1));
1382 R600_OUT_BATCH(vgt_num_indices);
1383 R600_OUT_BATCH(vgt_draw_initiator);
1384
1385 END_BATCH();
1386 COMMIT_BATCH();
1387 }
1388
1389 static inline void
1390 eg_set_default_state(context_t *context)
1391 {
1392 int num_ps_gprs;
1393 int num_vs_gprs;
1394 int num_gs_gprs;
1395 int num_es_gprs;
1396 int num_hs_gprs;
1397 int num_ls_gprs;
1398 int num_temp_gprs;
1399 int num_ps_threads;
1400 int num_vs_threads;
1401 int num_gs_threads;
1402 int num_es_threads;
1403 int num_hs_threads;
1404 int num_ls_threads;
1405 int num_ps_stack_entries;
1406 int num_vs_stack_entries;
1407 int num_gs_stack_entries;
1408 int num_es_stack_entries;
1409 int num_hs_stack_entries;
1410 int num_ls_stack_entries;
1411 uint32_t sq_config = 0, sq_gpr_resource_mgmt_1 = 0, sq_gpr_resource_mgmt_2 = 0;
1412 uint32_t sq_gpr_resource_mgmt_3 = 0;
1413 uint32_t sq_thread_resource_mgmt = 0, sq_thread_resource_mgmt_2 = 0;
1414 uint32_t sq_stack_resource_mgmt_1 = 0, sq_stack_resource_mgmt_2 = 0, sq_stack_resource_mgmt_3 = 0;
1415 BATCH_LOCALS(&context->radeon);
1416
1417 switch (context->radeon.radeonScreen->chip_family) {
1418 case CHIP_FAMILY_CEDAR:
1419 default:
1420 num_ps_gprs = 93;
1421 num_vs_gprs = 46;
1422 num_temp_gprs = 4;
1423 num_gs_gprs = 31;
1424 num_es_gprs = 31;
1425 num_hs_gprs = 23;
1426 num_ls_gprs = 23;
1427 num_ps_threads = 96;
1428 num_vs_threads = 16;
1429 num_gs_threads = 16;
1430 num_es_threads = 16;
1431 num_hs_threads = 16;
1432 num_ls_threads = 16;
1433 num_ps_stack_entries = 42;
1434 num_vs_stack_entries = 42;
1435 num_gs_stack_entries = 42;
1436 num_es_stack_entries = 42;
1437 num_hs_stack_entries = 42;
1438 num_ls_stack_entries = 42;
1439 break;
1440 case CHIP_FAMILY_REDWOOD:
1441 num_ps_gprs = 93;
1442 num_vs_gprs = 46;
1443 num_temp_gprs = 4;
1444 num_gs_gprs = 31;
1445 num_es_gprs = 31;
1446 num_hs_gprs = 23;
1447 num_ls_gprs = 23;
1448 num_ps_threads = 128;
1449 num_vs_threads = 20;
1450 num_gs_threads = 20;
1451 num_es_threads = 20;
1452 num_hs_threads = 20;
1453 num_ls_threads = 20;
1454 num_ps_stack_entries = 42;
1455 num_vs_stack_entries = 42;
1456 num_gs_stack_entries = 42;
1457 num_es_stack_entries = 42;
1458 num_hs_stack_entries = 42;
1459 num_ls_stack_entries = 42;
1460 break;
1461 case CHIP_FAMILY_JUNIPER:
1462 num_ps_gprs = 93;
1463 num_vs_gprs = 46;
1464 num_temp_gprs = 4;
1465 num_gs_gprs = 31;
1466 num_es_gprs = 31;
1467 num_hs_gprs = 23;
1468 num_ls_gprs = 23;
1469 num_ps_threads = 128;
1470 num_vs_threads = 20;
1471 num_gs_threads = 20;
1472 num_es_threads = 20;
1473 num_hs_threads = 20;
1474 num_ls_threads = 20;
1475 num_ps_stack_entries = 85;
1476 num_vs_stack_entries = 85;
1477 num_gs_stack_entries = 85;
1478 num_es_stack_entries = 85;
1479 num_hs_stack_entries = 85;
1480 num_ls_stack_entries = 85;
1481 break;
1482 case CHIP_FAMILY_CYPRESS:
1483 case CHIP_FAMILY_HEMLOCK:
1484 num_ps_gprs = 93;
1485 num_vs_gprs = 46;
1486 num_temp_gprs = 4;
1487 num_gs_gprs = 31;
1488 num_es_gprs = 31;
1489 num_hs_gprs = 23;
1490 num_ls_gprs = 23;
1491 num_ps_threads = 128;
1492 num_vs_threads = 20;
1493 num_gs_threads = 20;
1494 num_es_threads = 20;
1495 num_hs_threads = 20;
1496 num_ls_threads = 20;
1497 num_ps_stack_entries = 85;
1498 num_vs_stack_entries = 85;
1499 num_gs_stack_entries = 85;
1500 num_es_stack_entries = 85;
1501 num_hs_stack_entries = 85;
1502 num_ls_stack_entries = 85;
1503 break;
1504 case CHIP_FAMILY_PALM:
1505 num_ps_gprs = 93;
1506 num_vs_gprs = 46;
1507 num_temp_gprs = 4;
1508 num_gs_gprs = 31;
1509 num_es_gprs = 31;
1510 num_hs_gprs = 23;
1511 num_ls_gprs = 23;
1512 num_ps_threads = 96;
1513 num_vs_threads = 16;
1514 num_gs_threads = 16;
1515 num_es_threads = 16;
1516 num_hs_threads = 16;
1517 num_ls_threads = 16;
1518 num_ps_stack_entries = 42;
1519 num_vs_stack_entries = 42;
1520 num_gs_stack_entries = 42;
1521 num_es_stack_entries = 42;
1522 num_hs_stack_entries = 42;
1523 num_ls_stack_entries = 42;
1524 break;
1525 case CHIP_FAMILY_SUMO:
1526 num_ps_gprs = 93;
1527 num_vs_gprs = 46;
1528 num_temp_gprs = 4;
1529 num_gs_gprs = 31;
1530 num_es_gprs = 31;
1531 num_hs_gprs = 23;
1532 num_ls_gprs = 23;
1533 num_ps_threads = 96;
1534 num_vs_threads = 25;
1535 num_gs_threads = 25;
1536 num_es_threads = 25;
1537 num_hs_threads = 25;
1538 num_ls_threads = 25;
1539 num_ps_stack_entries = 42;
1540 num_vs_stack_entries = 42;
1541 num_gs_stack_entries = 42;
1542 num_es_stack_entries = 42;
1543 num_hs_stack_entries = 42;
1544 num_ls_stack_entries = 42;
1545 break;
1546 case CHIP_FAMILY_SUMO2:
1547 num_ps_gprs = 93;
1548 num_vs_gprs = 46;
1549 num_temp_gprs = 4;
1550 num_gs_gprs = 31;
1551 num_es_gprs = 31;
1552 num_hs_gprs = 23;
1553 num_ls_gprs = 23;
1554 num_ps_threads = 96;
1555 num_vs_threads = 25;
1556 num_gs_threads = 25;
1557 num_es_threads = 25;
1558 num_hs_threads = 25;
1559 num_ls_threads = 25;
1560 num_ps_stack_entries = 85;
1561 num_vs_stack_entries = 85;
1562 num_gs_stack_entries = 85;
1563 num_es_stack_entries = 85;
1564 num_hs_stack_entries = 85;
1565 num_ls_stack_entries = 85;
1566 break;
1567 case CHIP_FAMILY_BARTS:
1568 num_ps_gprs = 93;
1569 num_vs_gprs = 46;
1570 num_temp_gprs = 4;
1571 num_gs_gprs = 31;
1572 num_es_gprs = 31;
1573 num_hs_gprs = 23;
1574 num_ls_gprs = 23;
1575 num_ps_threads = 128;
1576 num_vs_threads = 20;
1577 num_gs_threads = 20;
1578 num_es_threads = 20;
1579 num_hs_threads = 20;
1580 num_ls_threads = 20;
1581 num_ps_stack_entries = 85;
1582 num_vs_stack_entries = 85;
1583 num_gs_stack_entries = 85;
1584 num_es_stack_entries = 85;
1585 num_hs_stack_entries = 85;
1586 num_ls_stack_entries = 85;
1587 break;
1588 case CHIP_FAMILY_TURKS:
1589 num_ps_gprs = 93;
1590 num_vs_gprs = 46;
1591 num_temp_gprs = 4;
1592 num_gs_gprs = 31;
1593 num_es_gprs = 31;
1594 num_hs_gprs = 23;
1595 num_ls_gprs = 23;
1596 num_ps_threads = 128;
1597 num_vs_threads = 20;
1598 num_gs_threads = 20;
1599 num_es_threads = 20;
1600 num_hs_threads = 20;
1601 num_ls_threads = 20;
1602 num_ps_stack_entries = 42;
1603 num_vs_stack_entries = 42;
1604 num_gs_stack_entries = 42;
1605 num_es_stack_entries = 42;
1606 num_hs_stack_entries = 42;
1607 num_ls_stack_entries = 42;
1608 break;
1609 case CHIP_FAMILY_CAICOS:
1610 num_ps_gprs = 93;
1611 num_vs_gprs = 46;
1612 num_temp_gprs = 4;
1613 num_gs_gprs = 31;
1614 num_es_gprs = 31;
1615 num_hs_gprs = 23;
1616 num_ls_gprs = 23;
1617 num_ps_threads = 128;
1618 num_vs_threads = 10;
1619 num_gs_threads = 10;
1620 num_es_threads = 10;
1621 num_hs_threads = 10;
1622 num_ls_threads = 10;
1623 num_ps_stack_entries = 42;
1624 num_vs_stack_entries = 42;
1625 num_gs_stack_entries = 42;
1626 num_es_stack_entries = 42;
1627 num_hs_stack_entries = 42;
1628 num_ls_stack_entries = 42;
1629 break;
1630 }
1631
1632 if ((context->radeon.radeonScreen->chip_family == CHIP_FAMILY_CEDAR) ||
1633 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_PALM) ||
1634 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_SUMO) ||
1635 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_SUMO2) ||
1636 (context->radeon.radeonScreen->chip_family == CHIP_FAMILY_CAICOS))
1637 CLEARbit(sq_config, EG_SQ_CONFIG__VC_ENABLE_bit);
1638 else
1639 SETbit(sq_config, EG_SQ_CONFIG__VC_ENABLE_bit);
1640 SETbit(sq_config, EG_SQ_CONFIG__EXPORT_SRC_C_bit);
1641
1642 SETfield(sq_config, 0,
1643 EG_SQ_CONFIG__PS_PRIO_shift,
1644 EG_SQ_CONFIG__PS_PRIO_mask);
1645 SETfield(sq_config, 1,
1646 EG_SQ_CONFIG__VS_PRIO_shift,
1647 EG_SQ_CONFIG__VS_PRIO_mask);
1648 SETfield(sq_config, 2,
1649 EG_SQ_CONFIG__GS_PRIO_shift,
1650 EG_SQ_CONFIG__GS_PRIO_mask);
1651 SETfield(sq_config, 3,
1652 EG_SQ_CONFIG__ES_PRIO_shift,
1653 EG_SQ_CONFIG__ES_PRIO_mask);
1654
1655
1656 SETfield(sq_gpr_resource_mgmt_1, num_ps_gprs,
1657 NUM_PS_GPRS_shift, NUM_PS_GPRS_mask);
1658 SETfield(sq_gpr_resource_mgmt_1, num_vs_gprs,
1659 NUM_VS_GPRS_shift, NUM_VS_GPRS_mask);
1660 SETfield(sq_gpr_resource_mgmt_1, num_temp_gprs,
1661 NUM_CLAUSE_TEMP_GPRS_shift, NUM_CLAUSE_TEMP_GPRS_mask);
1662 SETfield(sq_gpr_resource_mgmt_2, num_gs_gprs,
1663 NUM_GS_GPRS_shift, NUM_GS_GPRS_mask);
1664 SETfield(sq_gpr_resource_mgmt_2, num_es_gprs,
1665 NUM_ES_GPRS_shift, NUM_ES_GPRS_mask);
1666 SETfield(sq_gpr_resource_mgmt_3, num_hs_gprs,
1667 NUM_PS_GPRS_shift, NUM_PS_GPRS_mask);
1668 SETfield(sq_gpr_resource_mgmt_3, num_ls_gprs,
1669 NUM_VS_GPRS_shift, NUM_VS_GPRS_mask);
1670
1671 SETfield(sq_thread_resource_mgmt, num_ps_threads,
1672 NUM_PS_THREADS_shift, NUM_PS_THREADS_mask);
1673 SETfield(sq_thread_resource_mgmt, num_vs_threads,
1674 NUM_VS_THREADS_shift, NUM_VS_THREADS_mask);
1675 SETfield(sq_thread_resource_mgmt, num_gs_threads,
1676 NUM_GS_THREADS_shift, NUM_GS_THREADS_mask);
1677 SETfield(sq_thread_resource_mgmt, num_es_threads,
1678 NUM_ES_THREADS_shift, NUM_ES_THREADS_mask);
1679 SETfield(sq_thread_resource_mgmt_2, num_hs_threads,
1680 NUM_PS_THREADS_shift, NUM_PS_THREADS_mask);
1681 SETfield(sq_thread_resource_mgmt_2, num_ls_threads,
1682 NUM_VS_THREADS_shift, NUM_VS_THREADS_mask);
1683
1684 SETfield(sq_stack_resource_mgmt_1, num_ps_stack_entries,
1685 NUM_PS_STACK_ENTRIES_shift, NUM_PS_STACK_ENTRIES_mask);
1686 SETfield(sq_stack_resource_mgmt_1, num_vs_stack_entries,
1687 NUM_VS_STACK_ENTRIES_shift, NUM_VS_STACK_ENTRIES_mask);
1688 SETfield(sq_stack_resource_mgmt_2, num_gs_stack_entries,
1689 NUM_GS_STACK_ENTRIES_shift, NUM_GS_STACK_ENTRIES_mask);
1690 SETfield(sq_stack_resource_mgmt_2, num_es_stack_entries,
1691 NUM_ES_STACK_ENTRIES_shift, NUM_ES_STACK_ENTRIES_mask);
1692 SETfield(sq_stack_resource_mgmt_3, num_hs_stack_entries,
1693 NUM_PS_STACK_ENTRIES_shift, NUM_PS_STACK_ENTRIES_mask);
1694 SETfield(sq_stack_resource_mgmt_3, num_ls_stack_entries,
1695 NUM_VS_STACK_ENTRIES_shift, NUM_VS_STACK_ENTRIES_mask);
1696
1697
1698 BEGIN_BATCH_NO_AUTOSTATE(196);
1699 //3
1700 EVERGREEN_OUT_BATCH_REGVAL(EG_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0);
1701 //6
1702 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_CONFIG, 4);
1703 R600_OUT_BATCH(sq_config);
1704 R600_OUT_BATCH(sq_gpr_resource_mgmt_1);
1705 R600_OUT_BATCH(sq_gpr_resource_mgmt_2);
1706 R600_OUT_BATCH(sq_gpr_resource_mgmt_3);
1707 //7
1708 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_THREAD_RESOURCE_MGMT, 5);
1709 R600_OUT_BATCH(sq_thread_resource_mgmt);
1710 R600_OUT_BATCH(sq_thread_resource_mgmt_2);
1711 R600_OUT_BATCH(sq_stack_resource_mgmt_1);
1712 R600_OUT_BATCH(sq_stack_resource_mgmt_2);
1713 R600_OUT_BATCH(sq_stack_resource_mgmt_3);
1714 //3
1715 R600_OUT_BATCH(CP_PACKET3(R600_IT_CONTEXT_CONTROL, 1));
1716 R600_OUT_BATCH(0x80000000);
1717 R600_OUT_BATCH(0x80000000);
1718 //3
1719 EVERGREEN_OUT_BATCH_REGVAL(EG_SQ_LDS_ALLOC_PS, 0);
1720 //8
1721 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_ESGS_RING_ITEMSIZE, 6);
1722 R600_OUT_BATCH(0);
1723 R600_OUT_BATCH(0);
1724 R600_OUT_BATCH(0);
1725 R600_OUT_BATCH(0);
1726 R600_OUT_BATCH(0);
1727 R600_OUT_BATCH(0);
1728 //6
1729 EVERGREEN_OUT_BATCH_REGSEQ(EG_SQ_GS_VERT_ITEMSIZE, 4);
1730 R600_OUT_BATCH(0);
1731 R600_OUT_BATCH(0);
1732 R600_OUT_BATCH(0);
1733 R600_OUT_BATCH(0);
1734 //3
1735 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_DEPTH_CONTROL, 0);
1736 //7
1737 EVERGREEN_OUT_BATCH_REGSEQ(EG_DB_RENDER_CONTROL, 5);
1738 R600_OUT_BATCH(0x00000060);
1739 R600_OUT_BATCH(0);
1740 R600_OUT_BATCH(0);
1741 R600_OUT_BATCH(0x0000002a);
1742 R600_OUT_BATCH(0);
1743 //4
1744 EVERGREEN_OUT_BATCH_REGSEQ(EG_DB_STENCIL_CLEAR, 2);
1745 R600_OUT_BATCH(0);
1746 R600_OUT_BATCH(0);
1747 //3
1748 EVERGREEN_OUT_BATCH_REGVAL(EG_DB_ALPHA_TO_MASK, 0x0000aa00);
1749 //15
1750 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_CLIPRECT_RULE, 13);
1751 R600_OUT_BATCH(0x0000ffff);
1752 R600_OUT_BATCH(0x00000000);
1753 R600_OUT_BATCH(0x20002000);
1754 R600_OUT_BATCH(0x00000000);
1755 R600_OUT_BATCH(0x20002000);
1756 R600_OUT_BATCH(0x00000000);
1757 R600_OUT_BATCH(0x20002000);
1758 R600_OUT_BATCH(0x00000000);
1759 R600_OUT_BATCH(0x20002000);
1760 R600_OUT_BATCH(0xaaaaaaaa);
1761 R600_OUT_BATCH(0);
1762 R600_OUT_BATCH(0x0000000f);
1763 R600_OUT_BATCH(0x0000000f);
1764 //4
1765 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_VPORT_ZMIN_0, 2);
1766 R600_OUT_BATCH(0);
1767 R600_OUT_BATCH(0x3f800000);
1768 //3
1769 EVERGREEN_OUT_BATCH_REGVAL(EG_SX_MISC, 0);
1770 //4
1771 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_MODE_CNTL_0, 2);
1772 R600_OUT_BATCH(0);
1773 R600_OUT_BATCH(0);
1774 //18
1775 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SC_LINE_CNTL, 16);
1776 R600_OUT_BATCH(0);
1777 R600_OUT_BATCH(0);
1778 R600_OUT_BATCH(0x00000005);
1779 R600_OUT_BATCH(0x3f800000);
1780 R600_OUT_BATCH(0x3f800000);
1781 R600_OUT_BATCH(0x3f800000);
1782 R600_OUT_BATCH(0x3f800000);
1783 R600_OUT_BATCH(0);
1784 R600_OUT_BATCH(0);
1785 R600_OUT_BATCH(0);
1786 R600_OUT_BATCH(0);
1787 R600_OUT_BATCH(0);
1788 R600_OUT_BATCH(0);
1789 R600_OUT_BATCH(0);
1790 R600_OUT_BATCH(0);
1791 R600_OUT_BATCH(0xffffffff);
1792 //15
1793 EVERGREEN_OUT_BATCH_REGSEQ(EG_CB_COLOR_CONTROL, 13);
1794 R600_OUT_BATCH(0x00cc0010);
1795 R600_OUT_BATCH(0x00000210);
1796 R600_OUT_BATCH(0x00010000);
1797 R600_OUT_BATCH(0x00000004);
1798 R600_OUT_BATCH(0x00000100);
1799 R600_OUT_BATCH(0);
1800 R600_OUT_BATCH(0);
1801 R600_OUT_BATCH(0);
1802 R600_OUT_BATCH(0);
1803 R600_OUT_BATCH(0);
1804 R600_OUT_BATCH(0);
1805 R600_OUT_BATCH(0);
1806 R600_OUT_BATCH(0);
1807 //8
1808 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SU_POLY_OFFSET_DB_FMT_CNTL, 6);
1809 R600_OUT_BATCH(0);
1810 R600_OUT_BATCH(0);
1811 R600_OUT_BATCH(0);
1812 R600_OUT_BATCH(0);
1813 R600_OUT_BATCH(0);
1814 R600_OUT_BATCH(0);
1815 //11
1816 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_MAX_VTX_INDX, 9);
1817 R600_OUT_BATCH(0x00ffffff);
1818 R600_OUT_BATCH(0);
1819 R600_OUT_BATCH(0);
1820 R600_OUT_BATCH(0);
1821 R600_OUT_BATCH(0);
1822 R600_OUT_BATCH(0);
1823 R600_OUT_BATCH(0);
1824 R600_OUT_BATCH(0);
1825 R600_OUT_BATCH(0);
1826 //4
1827 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_INSTANCE_STEP_RATE_0, 2);
1828 R600_OUT_BATCH(0);
1829 R600_OUT_BATCH(0);
1830 //4
1831 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_REUSE_OFF, 2);
1832 R600_OUT_BATCH(0);
1833 R600_OUT_BATCH(0);
1834 //19
1835 EVERGREEN_OUT_BATCH_REGSEQ(EG_PA_SU_POINT_SIZE, 17);
1836 R600_OUT_BATCH(0);
1837 R600_OUT_BATCH(0);
1838 R600_OUT_BATCH(0x00000008);
1839 R600_OUT_BATCH(0);
1840 R600_OUT_BATCH(0);
1841 R600_OUT_BATCH(0);
1842 R600_OUT_BATCH(0);
1843 R600_OUT_BATCH(0);
1844 R600_OUT_BATCH(0);
1845 R600_OUT_BATCH(0);
1846 R600_OUT_BATCH(0);
1847 R600_OUT_BATCH(0);
1848 R600_OUT_BATCH(0);
1849 R600_OUT_BATCH(0);
1850 R600_OUT_BATCH(0);
1851 R600_OUT_BATCH(0);
1852 R600_OUT_BATCH(0);
1853 //3
1854 EVERGREEN_OUT_BATCH_REGVAL(EG_VGT_PRIMITIVEID_EN, 0);
1855 //3
1856 EVERGREEN_OUT_BATCH_REGVAL(EG_VGT_MULTI_PRIM_IB_RESET_EN, 0);
1857 //3
1858 EVERGREEN_OUT_BATCH_REGVAL(EG_VGT_SHADER_STAGES_EN, 0);
1859 //4
1860 EVERGREEN_OUT_BATCH_REGSEQ(EG_VGT_STRMOUT_CONFIG, 2);
1861 R600_OUT_BATCH(0);
1862 R600_OUT_BATCH(0);
1863 //3
1864 EVERGREEN_OUT_BATCH_REGVAL(EG_CB_BLEND0_CONTROL, 0);
1865 //3
1866 EVERGREEN_OUT_BATCH_REGVAL(EG_SPI_VS_OUT_CONFIG, 0);
1867 //3
1868 EVERGREEN_OUT_BATCH_REGVAL(EG_SPI_VS_OUT_ID_0, 0);
1869 //3
1870 EVERGREEN_OUT_BATCH_REGVAL(EG_SPI_PS_INPUT_CNTL_0, 0);
1871 //13
1872 EVERGREEN_OUT_BATCH_REGSEQ(EG_SPI_PS_IN_CONTROL_0, 11);
1873 R600_OUT_BATCH(0x20000001);
1874 R600_OUT_BATCH(0);
1875 R600_OUT_BATCH(0);
1876 R600_OUT_BATCH(0);
1877 R600_OUT_BATCH(0);
1878 R600_OUT_BATCH(0x00100000);
1879 R600_OUT_BATCH(0);
1880 R600_OUT_BATCH(0);
1881 R600_OUT_BATCH(0);
1882 R600_OUT_BATCH(0);
1883 R600_OUT_BATCH(0);
1884
1885 END_BATCH();
1886 COMMIT_BATCH();
1887 }
1888
1889 static GLboolean eg_validate_buffers(context_t *rmesa,
1890 struct radeon_bo *src_bo,
1891 struct radeon_bo *dst_bo)
1892 {
1893 int ret;
1894
1895 radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
1896
1897 ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs,
1898 src_bo, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0);
1899 if (ret)
1900 return GL_FALSE;
1901
1902 ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs,
1903 dst_bo, 0, RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT);
1904 if (ret)
1905 return GL_FALSE;
1906
1907 ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs,
1908 rmesa->blit_bo,
1909 RADEON_GEM_DOMAIN_GTT, 0);
1910 if (ret)
1911 return GL_FALSE;
1912
1913 return GL_TRUE;
1914 }
1915
1916 unsigned evergreen_blit(struct gl_context *ctx,
1917 struct radeon_bo *src_bo,
1918 intptr_t src_offset,
1919 gl_format src_mesaformat,
1920 unsigned src_pitch,
1921 unsigned src_width,
1922 unsigned src_height,
1923 unsigned src_x,
1924 unsigned src_y,
1925 struct radeon_bo *dst_bo,
1926 intptr_t dst_offset,
1927 gl_format dst_mesaformat,
1928 unsigned dst_pitch,
1929 unsigned dst_width,
1930 unsigned dst_height,
1931 unsigned dst_x,
1932 unsigned dst_y,
1933 unsigned w,
1934 unsigned h,
1935 unsigned flip_y)
1936 {
1937 context_t *context = EVERGREEN_CONTEXT(ctx);
1938 int id = 0;
1939
1940 if (!evergreen_check_blit(dst_mesaformat))
1941 return GL_FALSE;
1942
1943 if (src_bo == dst_bo) {
1944 return GL_FALSE;
1945 }
1946
1947 if (src_offset % 256 || dst_offset % 256) {
1948 return GL_FALSE;
1949 }
1950
1951 if (0) {
1952 fprintf(stderr, "src: width %d, height %d, pitch %d vs %d, format %s\n",
1953 src_width, src_height, src_pitch,
1954 _mesa_format_row_stride(src_mesaformat, src_width),
1955 _mesa_get_format_name(src_mesaformat));
1956 fprintf(stderr, "dst: width %d, height %d, pitch %d, format %s\n",
1957 dst_width, dst_height,
1958 _mesa_format_row_stride(dst_mesaformat, dst_width),
1959 _mesa_get_format_name(dst_mesaformat));
1960 }
1961
1962 /* Flush is needed to make sure that source buffer has correct data */
1963 radeonFlush(ctx);
1964
1965 rcommonEnsureCmdBufSpace(&context->radeon, 327, __FUNCTION__);
1966
1967 /* load shaders */
1968 eg_load_shaders(context->radeon.glCtx);
1969
1970 if (!eg_validate_buffers(context, src_bo, dst_bo))
1971 return GL_FALSE;
1972
1973 /* set clear state */
1974 /* 196 */
1975 eg_set_default_state(context);
1976
1977 /* shaders */
1978 /* 34 */
1979 eg_set_shaders(context);
1980
1981 /* src */
1982 /* 21 */
1983 eg_set_tex_resource(context, src_mesaformat, src_bo,
1984 src_width, src_height, src_pitch, src_offset);
1985
1986 /* 5 */
1987 eg_set_tex_sampler(context);
1988
1989 /* dst */
1990 /* 19 */
1991 eg_set_render_target(context, dst_bo, dst_mesaformat,
1992 dst_pitch, dst_width, dst_height, dst_offset);
1993 /* scissors */
1994 /* 17 */
1995 eg_set_scissors(context, dst_x, dst_y, dst_x + dst_width, dst_y + dst_height);
1996
1997 eg_set_vb_data(context, src_x, src_y, dst_x, dst_y, w, h, src_height, flip_y);
1998 /* Vertex buffer setup */
1999 /* 18 */
2000 eg_set_vtx_resource(context);
2001
2002 /* draw */
2003 /* 10 */
2004 eg_draw_auto(context);
2005
2006 /* 7 */
2007 r700SyncSurf(context, dst_bo, 0,
2008 RADEON_GEM_DOMAIN_VRAM|RADEON_GEM_DOMAIN_GTT,
2009 CB_ACTION_ENA_bit | (1 << (id + 6)));
2010
2011 radeonFlush(ctx);
2012
2013 return GL_TRUE;
2014 }