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