Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / mesa / drivers / dri / r600 / r600_texstate.c
1 /*
2 Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
3
4 The Weather Channel (TM) funded Tungsten Graphics to develop the
5 initial release of the Radeon 8500 driver under the XFree86 license.
6 This notice must be preserved.
7
8 Permission is hereby granted, free of charge, to any person obtaining
9 a copy of this software and associated documentation files (the
10 "Software"), to deal in the Software without restriction, including
11 without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense, and/or sell copies of the Software, and to
13 permit persons to whom the Software is furnished to do so, subject to
14 the following conditions:
15
16 The above copyright notice and this permission notice (including the
17 next paragraph) shall be included in all copies or substantial
18 portions of the Software.
19
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 **************************************************************************/
29
30 /**
31  * \file
32  *
33  * \author Keith Whitwell <keith@tungstengraphics.com>
34  *
35  * \todo Enable R300 texture tiling code?
36  */
37
38 #include "main/glheader.h"
39 #include "main/imports.h"
40 #include "main/context.h"
41 #include "main/macros.h"
42 #include "main/teximage.h"
43 #include "main/texobj.h"
44 #include "main/enums.h"
45 #include "main/simple_list.h"
46
47 #include "r600_context.h"
48 #include "radeon_mipmap_tree.h"
49 #include "r600_tex.h"
50 #include "r700_fragprog.h"
51 #include "r700_vertprog.h"
52
53 #include "evergreen_tex.h"
54
55 void r600UpdateTextureState(struct gl_context * ctx);
56
57 void r600UpdateTextureState(struct gl_context * ctx)
58 {
59         context_t *context = R700_CONTEXT(ctx);
60         R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
61         struct gl_texture_unit *texUnit;
62         struct radeon_tex_obj *t;
63         GLuint    unit;
64
65         R600_STATECHANGE(context, tx);
66         R600_STATECHANGE(context, tx_smplr);
67         R600_STATECHANGE(context, tx_brdr_clr);
68
69         for (unit = 0; unit < R700_MAX_TEXTURE_UNITS; unit++) {
70                 texUnit = &ctx->Texture.Unit[unit];
71                 t = radeon_tex_obj(ctx->Texture.Unit[unit]._Current);
72                 r700->textures[unit] = NULL;
73                 if (texUnit->_ReallyEnabled) {
74                         if (!t)
75                                 continue;
76                         r700->textures[unit] = t;
77                 }
78         }
79 }
80
81 static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, gl_format mesa_format)
82 {
83         radeonTexObj *t = radeon_tex_obj(tObj);
84
85         CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
86         CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
87         CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
88         CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
89         CLEARbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
90
91         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
92                  FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
93         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
94                  FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
95         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
96                  FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
97         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
98                  FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
99
100         CLEARbit(t->SQ_TEX_RESOURCE0, TILE_TYPE_bit);
101         SETfield(t->SQ_TEX_RESOURCE0, ARRAY_LINEAR_GENERAL,
102                  SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
103                  SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
104
105         switch (mesa_format) /* This is mesa format. */
106         {
107         case MESA_FORMAT_RGBA8888:
108         case MESA_FORMAT_SIGNED_RGBA8888:
109                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
110                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
111
112 #ifdef MESA_BIG_ENDIAN
113                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
114                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
115                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
116                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
117                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
118                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
119                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
120                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
121 #else
122                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
123                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
124                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
125                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
126                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
127                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
128                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
129                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
130 #endif
131                 if (mesa_format == MESA_FORMAT_SIGNED_RGBA8888) {
132                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
133                                  FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
134                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
135                                  FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
136                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
137                                  FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
138                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
139                                  FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
140                 }
141                 break;
142         case MESA_FORMAT_RGBA8888_REV:
143         case MESA_FORMAT_SIGNED_RGBA8888_REV:
144                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
145                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
146
147 #ifdef MESA_BIG_ENDIAN
148                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
149                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
150                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
151                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
152                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
153                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
154                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
155                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
156 #else
157                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
158                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
159                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
160                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
161                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
162                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
163                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
164                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
165 #endif
166                 if (mesa_format == MESA_FORMAT_SIGNED_RGBA8888_REV) {
167                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
168                                  FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
169                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
170                                  FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
171                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
172                                  FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
173                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
174                                  FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
175                 }
176                 break;
177         case MESA_FORMAT_ARGB8888:
178                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
179                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
180
181 #ifdef MESA_BIG_ENDIAN
182                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
183                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
184                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
185                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
186                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
187                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
188                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
189                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
190 #else
191                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
192                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
193                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
194                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
195                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
196                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
197                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
198                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
199 #endif
200                 break;
201         case MESA_FORMAT_XRGB8888:
202                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
203                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
204
205 #ifdef MESA_BIG_ENDIAN
206                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
207                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
208                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
209                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
210                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
211                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
212                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
213                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
214 #else
215                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
216                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
217                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
218                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
219                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
220                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
221                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
222                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
223 #endif
224                 break;
225         case MESA_FORMAT_XRGB8888_REV:
226                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
227                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
228
229 #ifdef MESA_BIG_ENDIAN
230                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
231                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
232                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
233                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
234                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
235                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
236                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
237                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
238 #else
239                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
240                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
241                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
242                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
243                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
244                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
245                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
246                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
247 #endif
248                 break;
249         case MESA_FORMAT_ARGB8888_REV:
250                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
251                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
252
253 #ifdef MESA_BIG_ENDIAN
254                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
255                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
256                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
257                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
258                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
259                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
260                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
261                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
262 #else
263                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
264                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
265                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
266                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
267                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
268                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
269                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
270                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
271 #endif
272                 break;
273         case MESA_FORMAT_RGB888:
274                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8,
275                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
276
277 #ifdef MESA_BIG_ENDIAN
278                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
279                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
280                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
281                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
282                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
283                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
284                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
285                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
286 #else
287                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
288                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
289                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
290                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
291                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
292                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
293                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
294                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
295 #endif
296                 break;
297         case MESA_FORMAT_RGB565:
298                 SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
299                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
300
301 #ifdef MESA_BIG_ENDIAN
302                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
303                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
304                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
305                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
306                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
307                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
308                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
309                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
310 #else
311                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
312                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
313                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
314                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
315                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
316                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
317                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
318                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
319 #endif
320
321                 break;
322         case MESA_FORMAT_RGB565_REV:
323                 SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
324                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
325
326 #ifdef MESA_BIG_ENDIAN
327         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
328                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
329                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
330                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
331                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
332                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
333                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
334                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
335 #else
336                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
337                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
338                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
339                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
340                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
341                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
342                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
343                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
344 #endif
345                 break;
346         case MESA_FORMAT_ARGB4444:
347                 SETfield(t->SQ_TEX_RESOURCE1, FMT_4_4_4_4,
348                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
349
350 #ifdef MESA_BIG_ENDIAN
351                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
352                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
353                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
354                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
355                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
356                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
357                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
358                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
359 #else
360                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
361                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
362                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
363                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
364                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
365                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
366                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
367                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
368 #endif
369                 break;
370         case MESA_FORMAT_ARGB4444_REV:
371                 SETfield(t->SQ_TEX_RESOURCE1, FMT_4_4_4_4,
372                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
373 #ifdef MESA_BIG_ENDIAN
374                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
375                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
376                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
377                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
378                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
379                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
380                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
381                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
382 #else
383                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
384                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
385                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
386                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
387                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
388                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
389                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
390                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
391 #endif
392                 break;
393         case MESA_FORMAT_ARGB1555:
394                 SETfield(t->SQ_TEX_RESOURCE1, FMT_1_5_5_5,
395                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
396 #ifdef MESA_BIG_ENDIAN
397                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
398                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
399                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
400                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
401                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
402                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
403                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
404                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
405 #else
406                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
407                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
408                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
409                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
410                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
411                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
412                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
413                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
414 #endif
415                 break;
416         case MESA_FORMAT_ARGB1555_REV:
417                 SETfield(t->SQ_TEX_RESOURCE1, FMT_1_5_5_5,
418                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
419 #ifdef MESA_BIG_ENDIAN
420        SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
421                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
422                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
423                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
424                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
425                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
426                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
427                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
428 #else
429                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
430                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
431                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
432                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
433                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
434                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
435                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
436                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
437 #endif
438                 break;
439         case MESA_FORMAT_AL88:
440         case MESA_FORMAT_AL88_REV: /* TODO : Check this. */
441                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8,
442                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
443
444                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
445                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
446                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
447                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
448                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
449                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
450                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
451                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
452                 break;
453         case MESA_FORMAT_RGB332:
454                 SETfield(t->SQ_TEX_RESOURCE1, FMT_3_3_2,
455                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
456
457                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
458                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
459                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
460                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
461                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
462                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
463                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
464                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
465                 break;
466         case MESA_FORMAT_A8: /* ZERO, ZERO, ZERO, X */
467                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
468                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
469
470                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
471                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
472                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
473                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
474                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
475                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
476                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
477                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
478                 break;
479         case MESA_FORMAT_L8: /* X, X, X, ONE */
480                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
481                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
482
483                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
484                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
485                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
486                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
487                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
488                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
489                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
490                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
491                 break;
492         case MESA_FORMAT_I8: /* X, X, X, X */
493         case MESA_FORMAT_CI8:
494                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
495                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
496
497                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
498                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
499                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
500                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
501                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
502                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
503                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
504                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
505                 break;
506                 /* YUV422 TODO conversion */  /* X, Y, Z, ONE, G8R8_G8B8 */
507                 /*
508                   case MESA_FORMAT_YCBCR:
509                   t->SQ_TEX_RESOURCE1.bitfields.DATA_FORMAT = ;
510                   break;
511                 */
512                 /* VUY422 TODO conversion */  /* X, Y, Z, ONE, G8R8_G8B8 */
513                 /*
514                   case MESA_FORMAT_YCBCR_REV:
515                   t->SQ_TEX_RESOURCE1.bitfields.DATA_FORMAT = ;
516                   break;
517                 */
518         case MESA_FORMAT_RGB_DXT1: /* not supported yet */
519         case MESA_FORMAT_RGBA_DXT1: /* not supported yet */
520         case MESA_FORMAT_RGBA_DXT3: /* not supported yet */
521         case MESA_FORMAT_RGBA_DXT5: /* not supported yet */
522                 return GL_FALSE;
523
524         case MESA_FORMAT_RGBA_FLOAT32:
525                 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_32_32_FLOAT,
526                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
527
528                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
529                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
530                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
531                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
532                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
533                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
534                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
535                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
536                 break;
537         case MESA_FORMAT_RGBA_FLOAT16:
538                 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_16_16_16_FLOAT,
539                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
540
541                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
542                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
543                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
544                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
545                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
546                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
547                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
548                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
549                 break;
550         case MESA_FORMAT_RGB_FLOAT32: /* X, Y, Z, ONE */
551                 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_32_FLOAT,
552                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
553
554                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
555                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
556                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
557                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
558                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
559                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
560                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
561                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
562                 break;
563         case MESA_FORMAT_RGB_FLOAT16:
564                 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_16_16_FLOAT,
565                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
566
567                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
568                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
569                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
570                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
571                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
572                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
573                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
574                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
575                 break;
576         case MESA_FORMAT_ALPHA_FLOAT32: /* ZERO, ZERO, ZERO, X */
577                 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_FLOAT,
578                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
579
580                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
581                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
582                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
583                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
584                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
585                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
586                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
587                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
588                 break;
589         case MESA_FORMAT_ALPHA_FLOAT16: /* ZERO, ZERO, ZERO, X */
590                 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_FLOAT,
591                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
592
593                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
594                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
595                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
596                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
597                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
598                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
599                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
600                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
601                 break;
602         case MESA_FORMAT_LUMINANCE_FLOAT32: /* X, X, X, ONE */
603                 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_FLOAT,
604                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
605
606                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
607                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
608                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
609                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
610                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
611                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
612                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
613                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
614                 break;
615         case MESA_FORMAT_LUMINANCE_FLOAT16: /* X, X, X, ONE */
616                 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_FLOAT,
617                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
618
619                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
620                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
621                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
622                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
623                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
624                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
625                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
626                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
627                 break;
628         case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
629                 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_FLOAT,
630                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
631
632                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
633                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
634                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
635                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
636                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
637                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
638                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
639                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
640                 break;
641         case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
642                 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_16_FLOAT,
643                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
644
645                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
646                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
647                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
648                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
649                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
650                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
651                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
652                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
653                 break;
654         case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
655                 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_FLOAT,
656                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
657
658                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
659                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
660                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
661                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
662                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
663                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
664                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
665                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
666                 break;
667         case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
668                 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_FLOAT,
669                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
670
671                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
672                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
673                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
674                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
675                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
676                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
677                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
678                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
679                 break;
680         case MESA_FORMAT_Z16:
681         case MESA_FORMAT_X8_Z24:
682         case MESA_FORMAT_S8_Z24:
683         case MESA_FORMAT_Z24_S8:
684         case MESA_FORMAT_Z32:
685         case MESA_FORMAT_S8:
686                 SETbit(t->SQ_TEX_RESOURCE0, TILE_TYPE_bit);
687                 SETfield(t->SQ_TEX_RESOURCE0, ARRAY_1D_TILED_THIN1,
688                          SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift,
689                          SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask);
690                 switch (mesa_format) {
691                 case MESA_FORMAT_Z16:
692                         SETfield(t->SQ_TEX_RESOURCE1, FMT_16,
693                                  SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
694                         break;
695                 case MESA_FORMAT_X8_Z24:
696                 case MESA_FORMAT_S8_Z24:
697                         SETfield(t->SQ_TEX_RESOURCE1, FMT_8_24,
698                                  SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
699                         break;
700                 case MESA_FORMAT_Z24_S8:
701                         SETfield(t->SQ_TEX_RESOURCE1, FMT_24_8,
702                                  SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
703                         break;
704                 case MESA_FORMAT_Z32:
705                         SETfield(t->SQ_TEX_RESOURCE1, FMT_32,
706                                  SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
707                         break;
708                 case MESA_FORMAT_S8:
709                         SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
710                                  SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
711                         break;
712                 default:
713                         break;
714                 };
715                 switch (tObj->Sampler.DepthMode) {
716                 case GL_LUMINANCE:  /* X, X, X, ONE */
717                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
718                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
719                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
720                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
721                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
722                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
723                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
724                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
725                         break;
726                 case GL_INTENSITY:  /* X, X, X, X */
727                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
728                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
729                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
730                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
731                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
732                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
733                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
734                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
735                         break;
736                 case GL_ALPHA:     /* ZERO, ZERO, ZERO, X */
737                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
738                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
739                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
740                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
741                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
742                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
743                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
744                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
745                         break;
746                 default:
747                         return GL_FALSE;
748                 }
749                 break;
750         /* EXT_texture_sRGB */
751         case MESA_FORMAT_SARGB8:
752                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
753                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
754
755                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
756                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
757                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
758                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
759                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
760                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
761                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
762                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
763                 SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
764                 break;
765         case MESA_FORMAT_SLA8:
766                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8,
767                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
768
769                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
770                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
771                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
772                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
773                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
774                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
775                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
776                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
777                 SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
778                 break;
779         case MESA_FORMAT_SL8: /* X, X, X, ONE */
780                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
781                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
782
783                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
784                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
785                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
786                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
787                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
788                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
789                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
790                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
791                 SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
792                 break;
793         default:
794                 /* Not supported format */
795                 return GL_FALSE;
796         };
797
798         return GL_TRUE;
799 }
800
801 static GLuint r600_translate_shadow_func(GLenum func)
802 {
803    switch (func) {
804    case GL_NEVER:
805       return SQ_TEX_DEPTH_COMPARE_NEVER;
806    case GL_LESS:
807       return SQ_TEX_DEPTH_COMPARE_LESS;
808    case GL_LEQUAL:
809       return SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
810    case GL_GREATER:
811       return SQ_TEX_DEPTH_COMPARE_GREATER;
812    case GL_GEQUAL:
813       return SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
814    case GL_NOTEQUAL:
815       return SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
816    case GL_EQUAL:
817       return SQ_TEX_DEPTH_COMPARE_EQUAL;
818    case GL_ALWAYS:
819       return SQ_TEX_DEPTH_COMPARE_ALWAYS;
820    default:
821       WARN_ONCE("Unknown shadow compare function! %d", func);
822       return 0;
823    }
824 }
825
826 static INLINE uint32_t
827 S_FIXED(float value, uint32_t frac_bits)
828 {
829    return value * (1 << frac_bits);
830 }
831
832 void r600SetDepthTexMode(struct gl_texture_object *tObj)
833 {
834         radeonTexObjPtr t;
835
836         if (!tObj)
837                 return;
838
839         t = radeon_tex_obj(tObj);
840
841         if(!r600GetTexFormat(tObj, tObj->Image[0][tObj->BaseLevel]->TexFormat))
842           t->validated = GL_FALSE;
843 }
844
845 /**
846  * Compute the cached hardware register values for the given texture object.
847  *
848  * \param rmesa Context pointer
849  * \param t the r300 texture object
850  */
851 static GLboolean setup_hardware_state(struct gl_context * ctx, struct gl_texture_object *texObj, int unit)
852 {
853         context_t *rmesa = R700_CONTEXT(ctx);
854         radeonTexObj *t = radeon_tex_obj(texObj);
855         const struct gl_texture_image *firstImage;
856         GLuint uTexelPitch, row_align;
857
858         if (rmesa->radeon.radeonScreen->driScreen->dri2.enabled &&
859             t->image_override &&
860             t->bo)
861                 return GL_TRUE;
862
863         firstImage = t->base.Image[0][t->minLod];
864
865         if (!t->image_override) {
866                 if (!r600GetTexFormat(texObj, firstImage->TexFormat)) {
867                         radeon_warning("unsupported texture format in %s\n",
868                                        __FUNCTION__);
869                         return GL_FALSE;
870                 }
871         }
872
873         switch (texObj->Target) {
874         case GL_TEXTURE_1D:
875                 SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_1D, DIM_shift, DIM_mask);
876                 SETfield(t->SQ_TEX_RESOURCE1, 0, TEX_DEPTH_shift, TEX_DEPTH_mask);
877                 break;
878         case GL_TEXTURE_2D:
879         case GL_TEXTURE_RECTANGLE_NV:
880                 SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_2D, DIM_shift, DIM_mask);
881                 SETfield(t->SQ_TEX_RESOURCE1, 0, TEX_DEPTH_shift, TEX_DEPTH_mask);
882                 break;
883         case GL_TEXTURE_3D:
884                 SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_3D, DIM_shift, DIM_mask);
885                 SETfield(t->SQ_TEX_RESOURCE1, firstImage->Depth - 1, // ???
886                          TEX_DEPTH_shift, TEX_DEPTH_mask);
887                 break;
888         case GL_TEXTURE_CUBE_MAP:
889                 SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_CUBEMAP, DIM_shift, DIM_mask);
890                 SETfield(t->SQ_TEX_RESOURCE1, 0, TEX_DEPTH_shift, TEX_DEPTH_mask);
891                 break;
892         default:
893                 radeon_error("unexpected texture target type in %s\n", __FUNCTION__);
894                 return GL_FALSE;
895         }
896
897         row_align = rmesa->radeon.texture_row_align - 1;
898         uTexelPitch = (_mesa_format_row_stride(firstImage->TexFormat, firstImage->Width) + row_align) & ~row_align;
899         uTexelPitch = uTexelPitch / _mesa_get_format_bytes(firstImage->TexFormat);
900         uTexelPitch = (uTexelPitch + R700_TEXEL_PITCH_ALIGNMENT_MASK)
901                 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
902
903         /* min pitch is 8 */
904         if (uTexelPitch < 8)
905                 uTexelPitch = 8;
906
907         SETfield(t->SQ_TEX_RESOURCE0, (uTexelPitch/8)-1, PITCH_shift, PITCH_mask);
908         SETfield(t->SQ_TEX_RESOURCE0, firstImage->Width - 1,
909                  TEX_WIDTH_shift, TEX_WIDTH_mask);
910         SETfield(t->SQ_TEX_RESOURCE1, firstImage->Height - 1,
911                  TEX_HEIGHT_shift, TEX_HEIGHT_mask);
912
913         t->SQ_TEX_RESOURCE2 = get_base_teximage_offset(t) / 256;
914
915         t->SQ_TEX_RESOURCE3 = radeon_miptree_image_offset(t->mt, 0, t->minLod + 1) / 256;
916
917         SETfield(t->SQ_TEX_RESOURCE4, 0, BASE_LEVEL_shift, BASE_LEVEL_mask);
918         SETfield(t->SQ_TEX_RESOURCE5, t->maxLod - t->minLod, LAST_LEVEL_shift, LAST_LEVEL_mask);
919
920         SETfield(t->SQ_TEX_SAMPLER1,
921                 S_FIXED(CLAMP(t->base.Sampler.MinLod - t->minLod, 0, 15), 6),
922                 MIN_LOD_shift, MIN_LOD_mask);
923         SETfield(t->SQ_TEX_SAMPLER1,
924                 S_FIXED(CLAMP(t->base.Sampler.MaxLod - t->minLod, 0, 15), 6),
925                 MAX_LOD_shift, MAX_LOD_mask);
926         SETfield(t->SQ_TEX_SAMPLER1,
927                 S_FIXED(CLAMP(ctx->Texture.Unit[unit].LodBias + t->base.Sampler.LodBias, -16, 16), 6),
928                 SQ_TEX_SAMPLER_WORD1_0__LOD_BIAS_shift, SQ_TEX_SAMPLER_WORD1_0__LOD_BIAS_mask);
929
930         if(texObj->Sampler.CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB)
931         {
932                 SETfield(t->SQ_TEX_SAMPLER0, r600_translate_shadow_func(texObj->Sampler.CompareFunc), DEPTH_COMPARE_FUNCTION_shift, DEPTH_COMPARE_FUNCTION_mask);
933         }
934         else
935         {
936                 CLEARfield(t->SQ_TEX_SAMPLER0, DEPTH_COMPARE_FUNCTION_mask);
937         }
938
939         return GL_TRUE;
940 }
941
942 /**
943  * Ensure the given texture is ready for rendering.
944  *
945  * Mostly this means populating the texture object's mipmap tree.
946  */
947 static GLboolean r600_validate_texture(struct gl_context * ctx, struct gl_texture_object *texObj, int unit)
948 {
949         radeonTexObj *t = radeon_tex_obj(texObj);
950
951         if (!radeon_validate_texture_miptree(ctx, texObj))
952                 return GL_FALSE;
953
954         /* Configure the hardware registers (more precisely, the cached version
955          * of the hardware registers). */
956         if (!setup_hardware_state(ctx, texObj, unit))
957                 return GL_FALSE;
958
959         t->validated = GL_TRUE;
960         return GL_TRUE;
961 }
962
963 /**
964  * Ensure all enabled and complete textures are uploaded along with any buffers being used.
965  */
966 GLboolean r600ValidateBuffers(struct gl_context * ctx)
967 {
968         context_t *rmesa = R700_CONTEXT(ctx);
969         struct radeon_renderbuffer *rrb;
970         struct radeon_bo *pbo;
971         int i;
972         int ret;
973
974         radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
975
976         rrb = radeon_get_colorbuffer(&rmesa->radeon);
977         /* color buffer */
978         if (rrb && rrb->bo) {
979                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
980                                                   rrb->bo, 0,
981                                                   RADEON_GEM_DOMAIN_VRAM);
982         }
983
984         /* depth buffer */
985         rrb = radeon_get_depthbuffer(&rmesa->radeon);
986         if (rrb && rrb->bo) {
987                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
988                                                   rrb->bo, 0,
989                                                   RADEON_GEM_DOMAIN_VRAM);
990         }
991         
992         for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
993                 radeonTexObj *t;
994
995                 if (!ctx->Texture.Unit[i]._ReallyEnabled)
996                         continue;
997
998                 if (!r600_validate_texture(ctx, ctx->Texture.Unit[i]._Current, i)) {
999                         radeon_warning("failed to validate texture for unit %d.\n", i);
1000                 }
1001                 t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
1002                 if (t->image_override && t->bo)
1003                         radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
1004                                                           t->bo,
1005                                                           RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
1006                 else if (t->mt->bo)
1007                         radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
1008                                                           t->mt->bo,
1009                                                           RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
1010         }
1011
1012         pbo = (struct radeon_bo *)r700GetActiveFpShaderBo(ctx);
1013         if (pbo) {
1014                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1015                                                   RADEON_GEM_DOMAIN_GTT, 0);
1016         }
1017
1018         pbo = (struct radeon_bo *)r700GetActiveVpShaderBo(ctx);
1019         if (pbo) {
1020                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1021                                                   RADEON_GEM_DOMAIN_GTT, 0);
1022         }
1023
1024         pbo = (struct radeon_bo *)r700GetActiveFpShaderConstBo(ctx);
1025         if (pbo) {
1026                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1027                                                   RADEON_GEM_DOMAIN_GTT, 0);
1028         }
1029
1030         pbo = (struct radeon_bo *)r700GetActiveVpShaderConstBo(ctx);
1031         if (pbo) {
1032                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1033                                                   RADEON_GEM_DOMAIN_GTT, 0);
1034         }       
1035
1036         ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, first_elem(&rmesa->radeon.dma.reserved)->bo, RADEON_GEM_DOMAIN_GTT, 0);
1037         if (ret)
1038                 return GL_FALSE;
1039         return GL_TRUE;
1040 }
1041
1042 void r600SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
1043                       unsigned long long offset, GLint depth, GLuint pitch)
1044 {
1045         context_t *rmesa = pDRICtx->driverPrivate;
1046         struct gl_texture_object *tObj =
1047             _mesa_lookup_texture(rmesa->radeon.glCtx, texname);
1048         radeonTexObjPtr t = radeon_tex_obj(tObj);
1049         const struct gl_texture_image *firstImage;
1050         uint32_t pitch_val, size, row_align;
1051
1052         if (!tObj)
1053                 return;
1054
1055     if(rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_CEDAR)
1056     {
1057         evergreenSetTexOffset(pDRICtx, texname, offset, depth, pitch);
1058         return;
1059     }    
1060
1061         t->image_override = GL_TRUE;
1062
1063         if (!offset)
1064                 return;
1065
1066         firstImage = t->base.Image[0][t->minLod];
1067         row_align = rmesa->radeon.texture_row_align - 1;
1068         size = ((_mesa_format_row_stride(firstImage->TexFormat, firstImage->Width) + row_align) & ~row_align) * firstImage->Height;
1069         if (t->bo) {
1070                 radeon_bo_unref(t->bo);
1071                 t->bo = NULL;
1072         }
1073         t->bo = radeon_legacy_bo_alloc_fake(rmesa->radeon.radeonScreen->bom, size, offset);
1074         t->override_offset = offset;
1075         pitch_val = pitch;
1076         switch (depth) {
1077         case 32:
1078                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
1079                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1080
1081                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1082                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1083                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1084                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1085                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1086                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1087                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
1088                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1089                 pitch_val /= 4;
1090                 break;
1091         case 24:
1092         default:
1093                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
1094                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1095
1096                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1097                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1098                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1099                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1100                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1101                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1102                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1103                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1104                 pitch_val /= 4;
1105                 break;
1106         case 16:
1107                 SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
1108                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1109
1110                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1111                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1112                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1113                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1114                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1115                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1116                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1117                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1118                 pitch_val /= 2;
1119                 break;
1120         }
1121
1122         pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
1123                 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
1124
1125         /* min pitch is 8 */
1126         if (pitch_val < 8)
1127                 pitch_val = 8;
1128
1129         SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, PITCH_shift, PITCH_mask);
1130 }
1131
1132 void r600SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_format, __DRIdrawable *dPriv)
1133 {
1134         struct gl_texture_unit *texUnit;
1135         struct gl_texture_object *texObj;
1136         struct gl_texture_image *texImage;
1137         struct radeon_renderbuffer *rb;
1138         radeon_texture_image *rImage;
1139         radeonContextPtr radeon;
1140         context_t *rmesa;
1141         struct radeon_framebuffer *rfb;
1142         radeonTexObjPtr t;
1143         uint32_t pitch_val;
1144         uint32_t internalFormat, type, format;
1145         gl_format texFormat;
1146
1147         type = GL_BGRA;
1148         format = GL_UNSIGNED_BYTE;
1149         internalFormat = (glx_texture_format == __DRI_TEXTURE_FORMAT_RGB ? 3 : 4);
1150
1151         radeon = pDRICtx->driverPrivate;
1152         rmesa = pDRICtx->driverPrivate;
1153
1154     if(rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_CEDAR)
1155     {
1156         evergreenSetTexBuffer(pDRICtx, target, glx_texture_format, dPriv);
1157         return;
1158     }   
1159
1160         rfb = dPriv->driverPrivate;
1161         texUnit = &radeon->glCtx->Texture.Unit[radeon->glCtx->Texture.CurrentUnit];
1162         texObj = _mesa_select_tex_object(radeon->glCtx, texUnit, target);
1163         texImage = _mesa_get_tex_image(radeon->glCtx, texObj, target, 0);
1164
1165         rImage = get_radeon_texture_image(texImage);
1166         t = radeon_tex_obj(texObj);
1167         if (t == NULL) {
1168             return;
1169         }
1170
1171         radeon_update_renderbuffers(pDRICtx, dPriv, GL_TRUE);
1172         rb = rfb->color_rb[0];
1173         if (rb->bo == NULL) {
1174                 /* Failed to BO for the buffer */
1175                 return;
1176         }
1177
1178         _mesa_lock_texture(radeon->glCtx, texObj);
1179         if (t->bo) {
1180                 radeon_bo_unref(t->bo);
1181                 t->bo = NULL;
1182         }
1183         if (rImage->bo) {
1184                 radeon_bo_unref(rImage->bo);
1185                 rImage->bo = NULL;
1186         }
1187
1188         radeon_miptree_unreference(&t->mt);
1189         radeon_miptree_unreference(&rImage->mt);
1190
1191         rImage->bo = rb->bo;
1192         radeon_bo_ref(rImage->bo);
1193         t->bo = rb->bo;
1194         radeon_bo_ref(t->bo);
1195         t->image_override = GL_TRUE;
1196         t->override_offset = 0;
1197         pitch_val = rb->pitch;
1198         switch (rb->cpp) {
1199         case 4:
1200                 if (glx_texture_format == __DRI_TEXTURE_FORMAT_RGB) {
1201                         texFormat = MESA_FORMAT_RGB888;
1202                         SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
1203                                  SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1204
1205                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1206                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1207                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1208                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1209                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1210                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1211                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1212                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1213                 } else {
1214                         texFormat = MESA_FORMAT_ARGB8888;
1215                         SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
1216                                  SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1217
1218                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1219                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1220                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1221                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1222                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1223                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1224                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
1225                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1226                 }
1227                 pitch_val /= 4;
1228                 break;
1229         case 3:
1230         default:
1231                 // FMT_8_8_8 ???
1232                 texFormat = MESA_FORMAT_RGB888;
1233                 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
1234                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1235
1236                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
1237                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1238                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1239                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1240                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1241                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1242                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1243                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1244                 pitch_val /= 4;
1245                 break;
1246         case 2:
1247                 texFormat = MESA_FORMAT_RGB565;
1248                 SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
1249                          SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
1250
1251                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1252                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1253                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1254                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1255                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1256                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1257                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1258                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1259                 pitch_val /= 2;
1260                 break;
1261         }
1262
1263         _mesa_init_teximage_fields(radeon->glCtx, target, texImage,
1264                                    rb->base.Width, rb->base.Height, 1, 0,
1265                                    rb->cpp, texFormat);
1266         texImage->RowStride = rb->pitch / rb->cpp;
1267
1268         pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
1269                 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
1270
1271         /* min pitch is 8 */
1272         if (pitch_val < 8)
1273                 pitch_val = 8;
1274
1275         SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, PITCH_shift, PITCH_mask);
1276         SETfield(t->SQ_TEX_RESOURCE0, rb->base.Width - 1,
1277                  TEX_WIDTH_shift, TEX_WIDTH_mask);
1278         SETfield(t->SQ_TEX_RESOURCE1, rb->base.Height - 1,
1279                  TEX_HEIGHT_shift, TEX_HEIGHT_mask);
1280
1281         t->validated = GL_TRUE;
1282         _mesa_unlock_texture(radeon->glCtx, texObj);
1283         return;
1284 }
1285
1286 void r600SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
1287 {
1288         r600SetTexBuffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv);
1289 }