Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / mesa / drivers / dri / r600 / evergreen_tex.c
1 /*
2  * Copyright (C) 2008-2010  Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included
12  * in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20  */
21
22 /*
23  * Authors:
24  *   Richard Li <RichardZ.Li@amd.com>, <richardradeon@gmail.com>
25  */
26
27 #include "main/glheader.h"
28 #include "main/imports.h"
29 #include "main/colormac.h"
30 #include "main/context.h"
31 #include "main/enums.h"
32 #include "main/image.h"
33 #include "main/teximage.h"
34 #include "main/simple_list.h"
35 #include "main/texobj.h"
36
37 #include "texmem.h"
38
39 #include "r600_context.h"
40 #include "radeon_mipmap_tree.h"
41 #include "evergreen_diff.h"
42 #include "evergreen_tex.h"
43 #include "evergreen_fragprog.h"
44 #include "evergreen_vertprog.h"
45
46 #include "r600_tex.h"
47
48 static unsigned int evergreen_translate_wrap_mode(GLenum wrapmode)
49 {
50         switch(wrapmode) {
51         case GL_REPEAT: return SQ_TEX_WRAP;
52         case GL_CLAMP: return SQ_TEX_CLAMP_HALF_BORDER;
53         case GL_CLAMP_TO_EDGE: return SQ_TEX_CLAMP_LAST_TEXEL;
54         case GL_CLAMP_TO_BORDER: return SQ_TEX_CLAMP_BORDER;
55         case GL_MIRRORED_REPEAT: return SQ_TEX_MIRROR;
56         case GL_MIRROR_CLAMP_EXT: return SQ_TEX_MIRROR_ONCE_HALF_BORDER;
57         case GL_MIRROR_CLAMP_TO_EDGE_EXT: return SQ_TEX_MIRROR_ONCE_LAST_TEXEL;
58         case GL_MIRROR_CLAMP_TO_BORDER_EXT: return SQ_TEX_MIRROR_ONCE_BORDER;
59         default:
60                 radeon_error("bad wrap mode in %s", __FUNCTION__);
61                 return 0;
62         }
63 }
64
65 static GLboolean evergreenGetTexFormat(struct gl_texture_object *tObj, gl_format mesa_format)
66 {
67         radeonTexObj *t = radeon_tex_obj(tObj);
68
69         CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
70         CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
71         CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
72         CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
73         CLEARbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
74
75         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
76                      FORMAT_COMP_X_shift, 
77              FORMAT_COMP_X_mask);
78         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
79                      FORMAT_COMP_Y_shift, 
80              FORMAT_COMP_Y_mask);
81         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
82                      FORMAT_COMP_Z_shift, 
83              FORMAT_COMP_Z_mask);
84         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
85                      FORMAT_COMP_W_shift, 
86              FORMAT_COMP_W_mask);
87         
88         SETfield(t->SQ_TEX_RESOURCE1, ARRAY_LINEAR_GENERAL,
89                      EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift,
90                      EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);
91
92         switch (mesa_format) /* This is mesa format. */
93         {
94         case MESA_FORMAT_RGBA8888:
95         case MESA_FORMAT_SIGNED_RGBA8888:
96                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
97                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
98                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
99
100 #ifdef MESA_BIG_ENDIAN
101                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
102                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
103                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
104                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
105                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
106                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
107                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
108                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
109 #else
110                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
111                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
112                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
113                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
114                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
115                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
116                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
117                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
118 #endif
119                 if (mesa_format == MESA_FORMAT_SIGNED_RGBA8888) {
120                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
121                                  FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
122                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
123                                  FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
124                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
125                                  FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
126                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
127                                  FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
128                 }
129                 break;
130         case MESA_FORMAT_RGBA8888_REV:
131         case MESA_FORMAT_SIGNED_RGBA8888_REV:
132                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
133                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
134                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
135
136 #ifdef MESA_BIG_ENDIAN
137                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
138                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
139                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
140                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
141                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
142                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
143                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
144                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
145 #else
146                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
147                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
148                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
149                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
150                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
151                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
152                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
153                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
154 #endif
155                 if (mesa_format == MESA_FORMAT_SIGNED_RGBA8888_REV) {
156                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
157                                  FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
158                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
159                                  FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
160                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
161                                  FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
162                         SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_SIGNED,
163                                  FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
164                 }
165                 break;
166         case MESA_FORMAT_ARGB8888:
167                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
168                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
169                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
170
171 #ifdef MESA_BIG_ENDIAN
172                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
173                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
174                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
175                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
176                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
177                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
178                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
179                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
180 #else
181                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
182                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
183                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
184                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
185                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
186                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
187                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
188                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
189 #endif
190                 break;
191         case MESA_FORMAT_XRGB8888:
192                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
193                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
194                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
195
196 #ifdef MESA_BIG_ENDIAN
197                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
198                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
199                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
200                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
201                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
202                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
203                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
204                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
205 #else
206                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
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_Y,
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_X,
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_1,
213                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
214 #endif
215                 break;
216         case MESA_FORMAT_XRGB8888_REV:
217                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
218                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
219                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
220
221 #ifdef MESA_BIG_ENDIAN
222                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
223                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
224                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
225                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
226                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
227                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
228                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
229                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
230 #else
231                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
232                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
233                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
234                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
235                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
236                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
237                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
238                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
239 #endif
240                 break;
241         case MESA_FORMAT_ARGB8888_REV:
242                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
243                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
244                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
245
246 #ifdef MESA_BIG_ENDIAN
247                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
248                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
249                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
250                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
251                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
252                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
253                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
254                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
255 #else
256                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
257                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
258                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
259                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
260                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
261                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
262                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
263                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
264 #endif
265                 break;
266         case MESA_FORMAT_RGB888:
267                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8,
268                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
269                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
270
271 #ifdef MESA_BIG_ENDIAN
272                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
273                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
274                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
275                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
276                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
277                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
278                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
279                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
280 #else
281                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
282                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
283                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
284                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
285                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
286                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
287                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
288                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
289 #endif
290                 break;
291         case MESA_FORMAT_RGB565:
292                 SETfield(t->SQ_TEX_RESOURCE7, FMT_5_6_5,
293                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
294                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
295
296 #ifdef MESA_BIG_ENDIAN
297                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
298                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
299                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
300                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
301                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
302                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
303                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
304                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
305 #else
306                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
307                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
308                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
309                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
310                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
311                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
312                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
313                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
314 #endif
315                 break;
316         case MESA_FORMAT_RGB565_REV:
317                 SETfield(t->SQ_TEX_RESOURCE7, FMT_5_6_5,
318                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
319                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
320
321 #ifdef MESA_BIG_ENDIAN
322         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
323                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
324                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
325                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
326                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
327                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
328                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
329                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
330 #else
331                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
332                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
333                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
334                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
335                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
336                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
337                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
338                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
339 #endif
340                 break;
341         case MESA_FORMAT_ARGB4444:
342                 SETfield(t->SQ_TEX_RESOURCE7, FMT_4_4_4_4,
343                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
344                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
345
346 #ifdef MESA_BIG_ENDIAN
347                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
348                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
349                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
350                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
351                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
352                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
353                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
354                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
355 #else
356                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
357                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
358                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
359                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
360                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
361                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
362                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
363                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
364 #endif
365                 break;
366         case MESA_FORMAT_ARGB4444_REV:
367                 SETfield(t->SQ_TEX_RESOURCE7, FMT_4_4_4_4,
368                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
369                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
370
371 #ifdef MESA_BIG_ENDIAN
372                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
373                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
374                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
375                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
376                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
377                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
378                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
379                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
380 #else
381                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
382                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
383                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
384                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
385                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
386                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
387                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
388                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
389 #endif
390                 break;
391         case MESA_FORMAT_ARGB1555:
392                 SETfield(t->SQ_TEX_RESOURCE7, FMT_1_5_5_5,
393                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
394                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
395
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_RESOURCE7, FMT_1_5_5_5,
418                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
419                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
420
421 #ifdef MESA_BIG_ENDIAN
422        SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
423                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
424                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
425                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
426                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
427                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
428                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
429                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
430 #else
431                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
432                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
433                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
434                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
435                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
436                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
437                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
438                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
439 #endif
440                 break;
441         case MESA_FORMAT_AL88:
442         case MESA_FORMAT_AL88_REV: /* TODO : Check this. */
443                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8,
444                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
445                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
446
447                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
448                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
449                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
450                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
451                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
452                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
453                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
454                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
455                 break;
456         case MESA_FORMAT_RGB332:
457                 SETfield(t->SQ_TEX_RESOURCE7, FMT_3_3_2,
458                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
459                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
460
461                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
462                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
463                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
464                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
465                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
466                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
467                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
468                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
469                 break;
470         case MESA_FORMAT_A8: /* ZERO, ZERO, ZERO, X */
471                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8,
472                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
473                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
474
475                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
476                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
477                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
478                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
479                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
480                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
481                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
482                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
483                 break;
484         case MESA_FORMAT_L8: /* X, X, X, ONE */
485                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8,
486                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
487                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
488
489                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
490                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
491                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
492                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
493                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
494                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
495                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
496                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
497                 break;
498         case MESA_FORMAT_I8: /* X, X, X, X */
499         case MESA_FORMAT_CI8:
500                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8,
501                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
502                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
503
504                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
505                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
506                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
507                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
508                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
509                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
510                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
511                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
512                 break;          
513         case MESA_FORMAT_RGB_DXT1: /* not supported yet */
514         case MESA_FORMAT_RGBA_DXT1: /* not supported yet */
515         case MESA_FORMAT_RGBA_DXT3: /* not supported yet */
516         case MESA_FORMAT_RGBA_DXT5: /* not supported yet */
517                 return GL_FALSE;
518
519         case MESA_FORMAT_RGBA_FLOAT32:
520                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_32_32_32_FLOAT,
521                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
522                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
523
524                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
525                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
526                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
527                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
528                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
529                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
530                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
531                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
532                 break;
533         case MESA_FORMAT_RGBA_FLOAT16:
534                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_16_16_16_FLOAT,
535                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
536                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
537
538                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
539                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
540                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
541                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
542                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
543                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
544                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
545                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
546                 break;
547         case MESA_FORMAT_RGB_FLOAT32: /* X, Y, Z, ONE */
548                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_32_32_FLOAT,
549                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
550                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
551
552                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
553                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
554                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
555                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
556                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
557                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
558                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
559                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
560                 break;
561         case MESA_FORMAT_RGB_FLOAT16:
562                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_16_16_FLOAT,
563                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
564                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
565
566                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
567                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
568                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
569                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
570                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
571                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
572                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
573                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
574                 break;
575         case MESA_FORMAT_ALPHA_FLOAT32: /* ZERO, ZERO, ZERO, X */
576                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_FLOAT,
577                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
578                  EG_SQ_TEX_RESOURCE_WORD7_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_RESOURCE7, FMT_16_FLOAT,
591                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
592                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
593
594                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
595                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
596                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
597                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
598                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
599                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
600                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
601                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
602                 break;
603         case MESA_FORMAT_LUMINANCE_FLOAT32: /* X, X, X, ONE */
604                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_FLOAT,
605                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
606                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
607
608                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
609                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
610                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
611                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
612                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
613                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
614                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
615                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
616                 break;
617         case MESA_FORMAT_LUMINANCE_FLOAT16: /* X, X, X, ONE */
618                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_FLOAT,
619                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
620                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
621
622                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
623                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
624                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
625                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
626                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
627                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
628                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
629                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
630                 break;
631         case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
632                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_32_FLOAT,
633                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
634                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
635
636                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
637                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
638                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
639                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
640                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
641                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
642                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
643                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
644                 break;
645         case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
646                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_16_FLOAT,
647                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
648                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
649
650                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
651                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
652                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
653                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
654                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
655                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
656                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
657                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
658                 break;
659         case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
660                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_FLOAT,
661                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
662                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
663
664                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
665                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
666                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
667                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
668                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
669                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
670                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
671                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
672                 break;
673         case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
674                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_FLOAT,
675                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
676                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
677
678                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
679                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
680                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
681                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
682                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
683                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
684                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
685                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
686                 break;
687         case MESA_FORMAT_Z16:
688         case MESA_FORMAT_X8_Z24:
689         case MESA_FORMAT_S8_Z24:
690         case MESA_FORMAT_Z24_S8:
691         case MESA_FORMAT_Z32:
692         case MESA_FORMAT_S8:            
693         CLEARbit(t->SQ_TEX_RESOURCE0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);        
694                 SETfield(t->SQ_TEX_RESOURCE1, ARRAY_1D_TILED_THIN1,
695                              EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift,
696                              EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);
697                 switch (mesa_format) {
698                 case MESA_FORMAT_Z16:
699                         SETfield(t->SQ_TEX_RESOURCE7, FMT_16,
700                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
701                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
702                         break;
703                 case MESA_FORMAT_X8_Z24:
704                 case MESA_FORMAT_S8_Z24:
705                         SETfield(t->SQ_TEX_RESOURCE7, FMT_8_24,
706                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
707                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
708                         break;
709                 case MESA_FORMAT_Z24_S8:
710                         SETfield(t->SQ_TEX_RESOURCE7, FMT_24_8,
711                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
712                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
713                         break;
714                 case MESA_FORMAT_Z32:
715                         SETfield(t->SQ_TEX_RESOURCE7, FMT_32,
716                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
717                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
718                         break;
719                 case MESA_FORMAT_S8:
720                         SETfield(t->SQ_TEX_RESOURCE7, FMT_8,
721                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
722                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
723                         break;
724                 default:
725                         break;
726                 };
727                 switch (tObj->Sampler.DepthMode) {
728                 case GL_LUMINANCE:  /* X, X, X, ONE */
729                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
730                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
731                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
732                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
733                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
734                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
735                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
736                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
737                         break;
738                 case GL_INTENSITY:  /* X, X, X, X */
739                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
740                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
741                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
742                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
743                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
744                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
745                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
746                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
747                         break;
748                 case GL_ALPHA:     /* ZERO, ZERO, ZERO, X */
749                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
750                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
751                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
752                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
753                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
754                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
755                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
756                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
757                         break;
758                 default:
759                         return GL_FALSE;
760                 }
761                 break;
762         /* EXT_texture_sRGB */
763         case MESA_FORMAT_SRGBA8:
764                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
765                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
766                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
767
768                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
769                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
770                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
771                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
772                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
773                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
774                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
775                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
776                 SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
777                 break;
778         case MESA_FORMAT_SLA8:
779                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8,
780                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
781                  EG_SQ_TEX_RESOURCE_WORD7_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_Y,
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         case MESA_FORMAT_SL8: /* X, X, X, ONE */
794                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8,
795                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
796                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
797
798                 SETfield(t->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(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
801                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
802                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
803                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
804                 SETfield(t->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                 SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
807                 break;
808         default:
809                 /* Not supported format */
810                 return GL_FALSE;
811         };
812
813         return GL_TRUE;
814 }
815
816 static GLuint evergreen_translate_shadow_func(GLenum func)
817 {
818    switch (func) {
819    case GL_NEVER:
820       return SQ_TEX_DEPTH_COMPARE_NEVER;
821    case GL_LESS:
822       return SQ_TEX_DEPTH_COMPARE_LESS;
823    case GL_LEQUAL:
824       return SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
825    case GL_GREATER:
826       return SQ_TEX_DEPTH_COMPARE_GREATER;
827    case GL_GEQUAL:
828       return SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
829    case GL_NOTEQUAL:
830       return SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
831    case GL_EQUAL:
832       return SQ_TEX_DEPTH_COMPARE_EQUAL;
833    case GL_ALWAYS:
834       return SQ_TEX_DEPTH_COMPARE_ALWAYS;
835    default:
836       WARN_ONCE("Unknown shadow compare function! %d", func);
837       return 0;
838    }
839 }
840
841 static void evergreenUpdateTexWrap(radeonTexObjPtr t)
842 {
843         struct gl_texture_object *tObj = &t->base;
844
845     SETfield(t->SQ_TEX_SAMPLER0, evergreen_translate_wrap_mode(tObj->Sampler.WrapS),
846              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift, 
847              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
848
849         if (tObj->Target != GL_TEXTURE_1D) 
850     {
851                 SETfield(t->SQ_TEX_SAMPLER0, evergreen_translate_wrap_mode(tObj->Sampler.WrapT),
852                              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Y_shift, 
853                  EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Y_mask);
854
855                 if (tObj->Target == GL_TEXTURE_3D)
856                         SETfield(t->SQ_TEX_SAMPLER0, evergreen_translate_wrap_mode(tObj->Sampler.WrapR),
857                                      EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Z_shift, 
858                      EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Z_mask);
859         }
860 }
861
862 static void evergreenSetTexDefaultState(radeonTexObjPtr t)
863 {       
864     /* Init text object to default states. */
865     t->SQ_TEX_RESOURCE0 = 0;
866     t->SQ_TEX_RESOURCE1 = 0;
867     t->SQ_TEX_RESOURCE2 = 0;
868     t->SQ_TEX_RESOURCE3 = 0;
869     t->SQ_TEX_RESOURCE4 = 0;
870     t->SQ_TEX_RESOURCE5 = 0;
871     t->SQ_TEX_RESOURCE6 = 0;
872     t->SQ_TEX_RESOURCE7 = 0;
873
874     SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_2D, 
875              EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
876              EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
877
878     CLEARbit(t->SQ_TEX_RESOURCE0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);
879
880     SETfield(t->SQ_TEX_RESOURCE1, ARRAY_LINEAR_GENERAL,
881              EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift, 
882              EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);       
883         
884     SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
885              FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
886     SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
887              FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
888     SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
889              FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
890     SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
891              FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
892     SETfield(t->SQ_TEX_RESOURCE4, SQ_NUM_FORMAT_NORM,
893              SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_shift, SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_mask);
894     CLEARbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__SRF_MODE_ALL_bit);
895     CLEARbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
896     SETfield(t->SQ_TEX_RESOURCE4, SQ_ENDIAN_NONE,
897              SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift, SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_mask);
898         
899     SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
900                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift,
901                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
902         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
903                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift,
904                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
905         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
906                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift,
907                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
908         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
909                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift,
910                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
911     SETfield(t->SQ_TEX_RESOURCE4, 0, 
912              BASE_LEVEL_shift, 
913              BASE_LEVEL_mask); /* mip-maps */            
914
915     SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
916              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
917              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
918     SETfield(t->SQ_TEX_RESOURCE7, SQ_TEX_VTX_VALID_TEXTURE,
919              EG_SQ_TEX_RESOURCE_WORD7_0__TYPE_shift, 
920              EG_SQ_TEX_RESOURCE_WORD7_0__TYPE_mask);
921
922     /* Initialize sampler registers */
923     t->SQ_TEX_SAMPLER0 = 0;
924     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, 
925              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift,
926                  EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
927     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, 
928              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift, 
929              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
930     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, 
931              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift, 
932              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
933     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, 
934              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift, 
935              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask);
936     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, 
937              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
938              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
939     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, 
940              EG_SQ_TEX_SAMPLER_WORD0_0__Z_FILTER_shift, 
941              EG_SQ_TEX_SAMPLER_WORD0_0__Z_FILTER_mask);
942     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, 
943              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
944              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
945     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_TRANS_BLACK, 
946              EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_shift, 
947              EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_mask);
948
949     t->SQ_TEX_SAMPLER1 = 0;
950     SETfield(t->SQ_TEX_SAMPLER1, 0x7ff, 
951              EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_shift, 
952              EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_mask);
953
954     t->SQ_TEX_SAMPLER2 = 0;
955     SETbit(t->SQ_TEX_SAMPLER2, EG_SQ_TEX_SAMPLER_WORD2_0__TYPE_bit);
956 }
957
958 static void evergreenSetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloat anisotropy)
959 {
960         /* Force revalidation to account for switches from/to mipmapping. */
961         t->validated = GL_FALSE;
962
963         /* Note that EXT_texture_filter_anisotropic is extremely vague about
964          * how anisotropic filtering interacts with the "normal" filter modes.
965          * When anisotropic filtering is enabled, we override min and mag
966          * filter settings completely. This includes driconf's settings.
967          */
968         if (anisotropy >= 2.0 && (minf != GL_NEAREST) && (magf != GL_NEAREST)) {
969                 /*t->pp_txfilter |= R300_TX_MAG_FILTER_ANISO
970                         | R300_TX_MIN_FILTER_ANISO
971                         | R300_TX_MIN_FILTER_MIP_LINEAR
972                         | aniso_filter(anisotropy);*/
973                 radeon_print(RADEON_TEXTURE, RADEON_NORMAL, "Using maximum anisotropy of %f\n", anisotropy);
974                 return;
975         }
976
977         switch (minf) 
978     {
979         case GL_NEAREST:
980                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
981                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
982                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
983                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_None,
984                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
985                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
986                 break;
987         case GL_LINEAR:
988                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
989                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
990                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
991                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_None,
992                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
993                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
994                 break;
995         case GL_NEAREST_MIPMAP_NEAREST:
996                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
997                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
998                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
999                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Point,
1000                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
1001                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
1002                 break;
1003         case GL_NEAREST_MIPMAP_LINEAR:
1004                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
1005                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
1006                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
1007                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Linear,
1008                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
1009                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
1010                 break;
1011         case GL_LINEAR_MIPMAP_NEAREST:
1012                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
1013                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
1014                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
1015                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Point,
1016                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
1017                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
1018                 break;
1019         case GL_LINEAR_MIPMAP_LINEAR:
1020                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
1021                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
1022                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
1023                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Linear,
1024                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
1025                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
1026                 break;
1027         }
1028
1029         /* Note we don't have 3D mipmaps so only use the mag filter setting
1030          * to set the 3D texture filter mode.
1031          */
1032         switch (magf) 
1033     {
1034         case GL_NEAREST:
1035                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
1036                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift, 
1037                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask);
1038                 break;
1039         case GL_LINEAR:
1040                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
1041                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift, 
1042                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask);
1043                 break;
1044         }
1045 }
1046
1047 static void evergreenSetTexBorderColor(radeonTexObjPtr t, const GLfloat color[4])
1048 {
1049         t->TD_PS_SAMPLER0_BORDER_ALPHA = *((uint32_t*)&(color[3]));
1050         t->TD_PS_SAMPLER0_BORDER_RED = *((uint32_t*)&(color[2]));
1051         t->TD_PS_SAMPLER0_BORDER_GREEN = *((uint32_t*)&(color[1]));
1052         t->TD_PS_SAMPLER0_BORDER_BLUE = *((uint32_t*)&(color[0]));
1053
1054     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_REGISTER,
1055                      EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_shift, 
1056              EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_mask);
1057 }
1058
1059 static void evergreenSetDepthTexMode(struct gl_texture_object *tObj)
1060 {
1061         radeonTexObjPtr t;
1062
1063         if (!tObj)
1064                 return;
1065
1066         t = radeon_tex_obj(tObj);
1067
1068         if(!evergreenGetTexFormat(tObj, tObj->Image[0][tObj->BaseLevel]->TexFormat))
1069           t->validated = GL_FALSE;
1070 }
1071
1072 static INLINE uint32_t
1073 EG_S_FIXED(float value, uint32_t frac_bits)
1074 {
1075    return value * (1 << frac_bits);
1076 }
1077
1078 static GLboolean evergreen_setup_hardware_state(struct gl_context * ctx, struct gl_texture_object *texObj, int unit)
1079 {
1080         context_t *context = EVERGREEN_CONTEXT(ctx);
1081         radeonTexObj *t = radeon_tex_obj(texObj);
1082         const struct gl_texture_image *firstImage;
1083         GLuint uTexelPitch, row_align;
1084
1085         if (context->radeon.radeonScreen->driScreen->dri2.enabled &&
1086             t->image_override &&
1087             t->bo)
1088                 return GL_TRUE;
1089
1090         firstImage = t->base.Image[0][t->minLod];
1091
1092         if (!t->image_override) {        
1093                 if (!evergreenGetTexFormat(texObj, firstImage->TexFormat)) {
1094                         radeon_warning("unsupported texture format in %s\n",
1095                                        __FUNCTION__);
1096                         return GL_FALSE;
1097                 }        
1098         }
1099
1100     switch (texObj->Target) 
1101     {
1102     case GL_TEXTURE_1D:
1103         SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_1D, 
1104                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
1105                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
1106         SETfield(t->SQ_TEX_RESOURCE1, 0, 
1107                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift, 
1108                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask);
1109         break;
1110     case GL_TEXTURE_2D:
1111     case GL_TEXTURE_RECTANGLE_NV:
1112         SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_2D, 
1113                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
1114                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
1115         SETfield(t->SQ_TEX_RESOURCE1, 0, 
1116                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift, 
1117                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask);
1118         break;
1119     case GL_TEXTURE_3D:
1120         SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_3D, 
1121                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
1122                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
1123         SETfield(t->SQ_TEX_RESOURCE1, (firstImage->Depth - 1), // ???
1124                      EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift, 
1125                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask);
1126         break;
1127     case GL_TEXTURE_CUBE_MAP:
1128         SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_CUBEMAP, 
1129                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
1130                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
1131         SETfield(t->SQ_TEX_RESOURCE1, 0, 
1132                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift, 
1133                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask);
1134         break;
1135     default:
1136         radeon_error("unexpected texture target type in %s\n", __FUNCTION__);
1137         return GL_FALSE;
1138     }
1139
1140     row_align = context->radeon.texture_row_align - 1;
1141     uTexelPitch = (_mesa_format_row_stride(firstImage->TexFormat, firstImage->Width) + row_align) & ~row_align;
1142     uTexelPitch = uTexelPitch / _mesa_get_format_bytes(firstImage->TexFormat);
1143     uTexelPitch = (uTexelPitch + R700_TEXEL_PITCH_ALIGNMENT_MASK)
1144                      & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
1145
1146         /* min pitch is 8 */
1147         if (uTexelPitch < 8)
1148                 uTexelPitch = 8;
1149
1150         SETfield(t->SQ_TEX_RESOURCE0, (uTexelPitch/8)-1, 
1151              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift, 
1152              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask);
1153         SETfield(t->SQ_TEX_RESOURCE0, firstImage->Width - 1,
1154                      EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_shift, 
1155              EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_mask);
1156         SETfield(t->SQ_TEX_RESOURCE1, firstImage->Height - 1,
1157                      EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_shift, 
1158              EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_mask);
1159
1160         t->SQ_TEX_RESOURCE2 = get_base_teximage_offset(t) / 256;
1161
1162         t->SQ_TEX_RESOURCE3 = radeon_miptree_image_offset(t->mt, 0, t->minLod + 1) / 256;
1163
1164         SETfield(t->SQ_TEX_RESOURCE4, 0, BASE_LEVEL_shift, BASE_LEVEL_mask);
1165         SETfield(t->SQ_TEX_RESOURCE5, t->maxLod - t->minLod, LAST_LEVEL_shift, LAST_LEVEL_mask);
1166     
1167         SETfield(t->SQ_TEX_SAMPLER1,
1168                      EG_S_FIXED(CLAMP(t->base.Sampler.MinLod - t->minLod, 0, 15), 8),
1169                      EG_SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_shift, 
1170              EG_SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_mask);
1171         SETfield(t->SQ_TEX_SAMPLER1,
1172                      EG_S_FIXED(CLAMP(t->base.Sampler.MaxLod - t->minLod, 0, 15), 8),
1173                      EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_shift, 
1174              EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_mask);
1175         SETfield(t->SQ_TEX_SAMPLER2,
1176                      EG_S_FIXED(CLAMP(ctx->Texture.Unit[unit].LodBias + t->base.Sampler.LodBias, -16, 16), 8),
1177                      EG_SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_shift, 
1178              EG_SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_mask);
1179
1180         if(texObj->Sampler.CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB)
1181         {
1182                 SETfield(t->SQ_TEX_SAMPLER0, evergreen_translate_shadow_func(texObj->Sampler.CompareFunc), 
1183                  EG_SQ_TEX_SAMPLER_WORD0_0__DCF_shift, 
1184                  EG_SQ_TEX_SAMPLER_WORD0_0__DCF_mask);
1185         }
1186         else
1187         {
1188                 CLEARfield(t->SQ_TEX_SAMPLER0, EG_SQ_TEX_SAMPLER_WORD0_0__DCF_mask);
1189         }
1190
1191         return GL_TRUE;
1192 }
1193
1194 void evergreenSetTexOffset(__DRIcontext * pDRICtx, GLint texname,
1195                       unsigned long long offset, GLint depth, GLuint pitch)
1196 {
1197         context_t *rmesa = pDRICtx->driverPrivate;
1198         struct gl_texture_object *tObj =
1199             _mesa_lookup_texture(rmesa->radeon.glCtx, texname);
1200         radeonTexObjPtr t = radeon_tex_obj(tObj);
1201         const struct gl_texture_image *firstImage;
1202         uint32_t pitch_val, size, row_align;
1203
1204         if (!tObj)
1205                 return;
1206
1207         t->image_override = GL_TRUE;
1208
1209         if (!offset)
1210                 return;
1211
1212         firstImage = t->base.Image[0][t->minLod];
1213         row_align = rmesa->radeon.texture_row_align - 1;
1214         size = ((_mesa_format_row_stride(firstImage->TexFormat, firstImage->Width) + row_align) & ~row_align) * firstImage->Height;
1215         if (t->bo) {
1216                 radeon_bo_unref(t->bo);
1217                 t->bo = NULL;
1218         }
1219         t->bo = radeon_legacy_bo_alloc_fake(rmesa->radeon.radeonScreen->bom, size, offset);
1220         t->override_offset = offset;
1221         pitch_val = pitch;
1222         switch (depth) {
1223         case 32:
1224                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1225                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1226                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1227
1228                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1229                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1230                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1231                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1232                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1233                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1234                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
1235                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1236                 pitch_val /= 4;
1237                 break;
1238         case 24:
1239         default:
1240                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1241                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1242                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1243
1244                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1245                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1246                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1247                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1248                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1249                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1250                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1251                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1252                 pitch_val /= 4;
1253                 break;
1254         case 16:
1255                 SETfield(t->SQ_TEX_RESOURCE7, FMT_5_6_5,
1256                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1257                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1258
1259                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1260                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1261                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1262                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1263                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1264                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1265                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1266                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1267                 pitch_val /= 2;
1268                 break;
1269         }
1270
1271         pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
1272                 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
1273
1274         /* min pitch is 8 */
1275         if (pitch_val < 8)
1276                 pitch_val = 8;
1277
1278         SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, 
1279              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift, 
1280              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask);
1281 }
1282
1283 void evergreenSetTexBuffer(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_format, __DRIdrawable *dPriv)
1284 {
1285         struct gl_texture_unit *texUnit;
1286         struct gl_texture_object *texObj;
1287         struct gl_texture_image *texImage;
1288         struct radeon_renderbuffer *rb;
1289         radeon_texture_image *rImage;
1290         radeonContextPtr radeon;
1291         context_t *rmesa;
1292         struct radeon_framebuffer *rfb;
1293         radeonTexObjPtr t;
1294         uint32_t pitch_val;
1295         uint32_t internalFormat, type, format;
1296         gl_format texFormat;
1297
1298         type = GL_BGRA;
1299         format = GL_UNSIGNED_BYTE;
1300         internalFormat = (glx_texture_format == __DRI_TEXTURE_FORMAT_RGB ? 3 : 4);
1301
1302         radeon = pDRICtx->driverPrivate;
1303         rmesa = pDRICtx->driverPrivate;
1304
1305         rfb = dPriv->driverPrivate;
1306         texUnit = &radeon->glCtx->Texture.Unit[radeon->glCtx->Texture.CurrentUnit];
1307         texObj = _mesa_select_tex_object(radeon->glCtx, texUnit, target);
1308         texImage = _mesa_get_tex_image(radeon->glCtx, texObj, target, 0);
1309
1310         rImage = get_radeon_texture_image(texImage);
1311         t = radeon_tex_obj(texObj);
1312         if (t == NULL) {
1313             return;
1314         }
1315
1316         radeon_update_renderbuffers(pDRICtx, dPriv, GL_TRUE);
1317         rb = rfb->color_rb[0];
1318         if (rb->bo == NULL) {
1319                 /* Failed to BO for the buffer */
1320                 return;
1321         }
1322
1323         _mesa_lock_texture(radeon->glCtx, texObj);
1324         if (t->bo) {
1325                 radeon_bo_unref(t->bo);
1326                 t->bo = NULL;
1327         }
1328         if (rImage->bo) {
1329                 radeon_bo_unref(rImage->bo);
1330                 rImage->bo = NULL;
1331         }
1332
1333         radeon_miptree_unreference(&t->mt);
1334         radeon_miptree_unreference(&rImage->mt);
1335
1336         rImage->bo = rb->bo;
1337         radeon_bo_ref(rImage->bo);
1338         t->bo = rb->bo;
1339         radeon_bo_ref(t->bo);
1340         t->image_override = GL_TRUE;
1341         t->override_offset = 0;
1342         pitch_val = rb->pitch;
1343         switch (rb->cpp) {
1344         case 4:
1345                 if (glx_texture_format == __DRI_TEXTURE_FORMAT_RGB) {
1346                         texFormat = MESA_FORMAT_RGB888;
1347                         SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1348                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1349                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1350
1351                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1352                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1353                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1354                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1355                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1356                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1357                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1358                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1359                 } else {
1360                         texFormat = MESA_FORMAT_ARGB8888;
1361                         SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1362                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1363                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1364
1365                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1366                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1367                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1368                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1369                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1370                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1371                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
1372                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1373                 }
1374                 pitch_val /= 4;
1375                 break;
1376         case 3:
1377         default:
1378                 // FMT_8_8_8 ???
1379                 texFormat = MESA_FORMAT_RGB888;
1380                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1381                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1382                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1383
1384                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
1385                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1386                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1387                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1388                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1389                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1390                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1391                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1392                 pitch_val /= 4;
1393                 break;
1394         case 2:
1395                 texFormat = MESA_FORMAT_RGB565;
1396                 SETfield(t->SQ_TEX_RESOURCE7, FMT_5_6_5,
1397                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1398                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1399
1400                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1401                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1402                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1403                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1404                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1405                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1406                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1407                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1408                 pitch_val /= 2;
1409                 break;
1410         }
1411
1412         _mesa_init_teximage_fields(radeon->glCtx, target, texImage,
1413                                    rb->base.Width, rb->base.Height, 1, 0,
1414                                    rb->cpp, texFormat);
1415         texImage->RowStride = rb->pitch / rb->cpp;
1416
1417         pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
1418                 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
1419
1420         /* min pitch is 8 */
1421         if (pitch_val < 8)
1422                 pitch_val = 8;
1423
1424         SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, 
1425              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift, 
1426              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask);
1427         SETfield(t->SQ_TEX_RESOURCE0, rb->base.Width - 1,
1428                      EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_shift, 
1429              EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_mask);
1430         SETfield(t->SQ_TEX_RESOURCE1, rb->base.Height - 1,
1431                      EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_shift, 
1432              EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_mask);
1433
1434         t->validated = GL_TRUE;
1435         _mesa_unlock_texture(radeon->glCtx, texObj);
1436         return;
1437 }
1438
1439 void evergreenUpdateTextureState(struct gl_context * ctx)
1440 {
1441         context_t *context = EVERGREEN_CONTEXT(ctx);
1442     EVERGREEN_CHIP_CONTEXT * evergreen = GET_EVERGREEN_CHIP(context);   
1443         struct gl_texture_unit *texUnit;
1444         struct radeon_tex_obj *t;
1445         GLuint    unit;
1446
1447         EVERGREEN_STATECHANGE(context, tx);    
1448
1449         for (unit = 0; unit < R700_MAX_TEXTURE_UNITS; unit++) {
1450                 texUnit = &ctx->Texture.Unit[unit];
1451                 t = radeon_tex_obj(ctx->Texture.Unit[unit]._Current);
1452                 evergreen->textures[unit] = NULL;
1453                 if (texUnit->_ReallyEnabled) {
1454                         if (!t)
1455                                 continue;
1456                         evergreen->textures[unit] = t;
1457                 }
1458         }
1459 }
1460
1461 static GLboolean evergreen_validate_texture(struct gl_context * ctx, struct gl_texture_object *texObj, int unit)
1462 {
1463         radeonTexObj *t = radeon_tex_obj(texObj);
1464
1465         if (!radeon_validate_texture_miptree(ctx, texObj))
1466                 return GL_FALSE;
1467
1468         /* Configure the hardware registers (more precisely, the cached version
1469          * of the hardware registers). */
1470         if (!evergreen_setup_hardware_state(ctx, texObj, unit))
1471                 return GL_FALSE;
1472
1473         t->validated = GL_TRUE;
1474         return GL_TRUE;
1475 }
1476
1477 GLboolean evergreenValidateBuffers(struct gl_context * ctx)
1478 {
1479         context_t *rmesa = EVERGREEN_CONTEXT(ctx);
1480         struct radeon_renderbuffer *rrb;
1481         struct radeon_bo *pbo;
1482         int i;
1483         int ret;
1484
1485         radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
1486
1487         rrb = radeon_get_colorbuffer(&rmesa->radeon);
1488         /* color buffer */
1489         if (rrb && rrb->bo) {
1490                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
1491                                                   rrb->bo, 0,
1492                                                   RADEON_GEM_DOMAIN_VRAM);
1493         }
1494
1495         /* depth buffer */
1496         rrb = radeon_get_depthbuffer(&rmesa->radeon);
1497         if (rrb && rrb->bo) {
1498                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
1499                                                   rrb->bo, 0,
1500                                                   RADEON_GEM_DOMAIN_VRAM);
1501         }
1502         
1503         for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
1504                 radeonTexObj *t;
1505
1506                 if (!ctx->Texture.Unit[i]._ReallyEnabled)
1507                         continue;
1508
1509                 if (!evergreen_validate_texture(ctx, ctx->Texture.Unit[i]._Current, i)) {
1510                         radeon_warning("failed to validate texture for unit %d.\n", i);
1511                 }
1512                 t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
1513                 if (t->image_override && t->bo)
1514                         radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
1515                                                           t->bo,
1516                                                           RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
1517                 else if (t->mt->bo)
1518                         radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
1519                                                           t->mt->bo,
1520                                                           RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
1521         }
1522
1523         pbo = (struct radeon_bo *)evergreenGetActiveFpShaderBo(ctx);
1524         if (pbo) {
1525                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1526                                                   RADEON_GEM_DOMAIN_GTT, 0);
1527         }
1528
1529         pbo = (struct radeon_bo *)evergreenGetActiveVpShaderBo(ctx);
1530         if (pbo) {
1531                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1532                                                   RADEON_GEM_DOMAIN_GTT, 0);
1533         }
1534
1535         pbo = (struct radeon_bo *)evergreenGetActiveFpShaderConstBo(ctx);
1536         if (pbo) {
1537                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1538                                                   RADEON_GEM_DOMAIN_GTT, 0);
1539         }
1540
1541         pbo = (struct radeon_bo *)evergreenGetActiveVpShaderConstBo(ctx);
1542         if (pbo) {
1543                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1544                                                   RADEON_GEM_DOMAIN_GTT, 0);
1545         }
1546         
1547         ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, first_elem(&rmesa->radeon.dma.reserved)->bo, RADEON_GEM_DOMAIN_GTT, 0);
1548         if (ret)
1549                 return GL_FALSE;
1550         return GL_TRUE;
1551 }
1552
1553 static struct gl_texture_object *evergreenNewTextureObject(struct gl_context * ctx,
1554                                                       GLuint name,
1555                                                       GLenum target)
1556 {
1557         context_t* rmesa = EVERGREEN_CONTEXT(ctx);
1558         radeonTexObj * t = CALLOC_STRUCT(radeon_tex_obj);
1559
1560
1561         radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_NORMAL,
1562                 "%s( %p (target = %s) )\n", __FUNCTION__,
1563                         t, _mesa_lookup_enum_by_nr(target));
1564
1565         _mesa_initialize_texture_object(&t->base, name, target);
1566         t->base.Sampler.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
1567     
1568         evergreenSetTexDefaultState(t);
1569         evergreenUpdateTexWrap(t);
1570         evergreenSetTexFilter(t, t->base.Sampler.MinFilter, t->base.Sampler.MagFilter, t->base.Sampler.MaxAnisotropy);
1571         evergreenSetTexBorderColor(t, t->base.Sampler.BorderColor.f);
1572
1573         return &t->base;
1574 }
1575
1576 static void evergreenDeleteTexture(struct gl_context * ctx, struct gl_texture_object *texObj)
1577 {
1578         context_t              * rmesa     = EVERGREEN_CONTEXT(ctx);
1579     EVERGREEN_CHIP_CONTEXT * evergreen = GET_EVERGREEN_CHIP(rmesa);
1580         radeonTexObj* t = radeon_tex_obj(texObj);
1581
1582         radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_NORMAL,
1583                 "%s( %p (target = %s) )\n", __FUNCTION__,
1584                         (void *)texObj,
1585                         _mesa_lookup_enum_by_nr(texObj->Target));
1586
1587         if (rmesa) {
1588                 int i;
1589                 radeon_firevertices(&rmesa->radeon);
1590
1591                 for(i = 0; i < R700_MAX_TEXTURE_UNITS; ++i)
1592                         if (evergreen->textures[i] == t)
1593                                 evergreen->textures[i] = 0;
1594         }
1595
1596         if (t->bo) {
1597                 radeon_bo_unref(t->bo);
1598                 t->bo = NULL;
1599         }
1600
1601         radeon_miptree_unreference(&t->mt);
1602
1603         _mesa_delete_texture_object(ctx, texObj);
1604 }
1605
1606 static void evergreenTexParameter(struct gl_context * ctx, GLenum target,
1607                              struct gl_texture_object *texObj,
1608                              GLenum pname, const GLfloat * params)
1609 {
1610     radeonTexObj* t = radeon_tex_obj(texObj);
1611         GLenum baseFormat;
1612
1613         radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_VERBOSE,
1614                         "%s( %s )\n", __FUNCTION__,
1615                         _mesa_lookup_enum_by_nr(pname));
1616
1617         switch (pname) {
1618         case GL_TEXTURE_MIN_FILTER:
1619         case GL_TEXTURE_MAG_FILTER:
1620         case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1621                 evergreenSetTexFilter(t, texObj->Sampler.MinFilter, texObj->Sampler.MagFilter, texObj->Sampler.MaxAnisotropy);
1622                 break;
1623
1624         case GL_TEXTURE_WRAP_S:
1625         case GL_TEXTURE_WRAP_T:
1626         case GL_TEXTURE_WRAP_R:
1627                 evergreenUpdateTexWrap(t);
1628                 break;
1629
1630         case GL_TEXTURE_BORDER_COLOR:
1631                 evergreenSetTexBorderColor(t, texObj->Sampler.BorderColor.f);
1632                 break;
1633
1634         case GL_TEXTURE_BASE_LEVEL:
1635         case GL_TEXTURE_MAX_LEVEL:
1636         case GL_TEXTURE_MIN_LOD:
1637         case GL_TEXTURE_MAX_LOD:
1638                 t->validated = GL_FALSE;
1639                 break;
1640
1641         case GL_DEPTH_TEXTURE_MODE:
1642                 if (!texObj->Image[0][texObj->BaseLevel])
1643                         return;
1644                 baseFormat = texObj->Image[0][texObj->BaseLevel]->_BaseFormat;
1645                 if (baseFormat == GL_DEPTH_COMPONENT ||
1646                     baseFormat == GL_DEPTH_STENCIL) {
1647                         evergreenSetDepthTexMode(texObj);
1648                         break;
1649                 } else {
1650                         /* If the texture isn't a depth texture, changing this
1651                          * state won't cause any changes to the hardware.
1652                          * Don't force a flush of texture state.
1653                          */
1654                         return;
1655                 }
1656
1657         default:
1658                 return;
1659         }
1660 }
1661
1662 void evergreenInitTextureFuncs(radeonContextPtr radeon, struct dd_function_table *functions)
1663 {
1664         /* Note: we only plug in the functions we implement in the driver
1665          * since _mesa_init_driver_functions() was already called.
1666          */
1667         functions->NewTextureImage = radeonNewTextureImage;
1668         functions->FreeTexImageData = radeonFreeTexImageData;
1669         functions->MapTexture = radeonMapTexture;
1670         functions->UnmapTexture = radeonUnmapTexture;
1671
1672         functions->ChooseTextureFormat = radeonChooseTextureFormat_mesa;
1673         functions->TexImage1D = radeonTexImage1D;
1674         functions->TexImage2D = radeonTexImage2D;
1675         functions->TexImage3D = radeonTexImage3D;
1676         functions->TexSubImage1D = radeonTexSubImage1D;
1677         functions->TexSubImage2D = radeonTexSubImage2D;
1678         functions->TexSubImage3D = radeonTexSubImage3D;
1679         functions->GetTexImage = radeonGetTexImage;
1680         functions->GetCompressedTexImage = radeonGetCompressedTexImage;
1681         functions->NewTextureObject = evergreenNewTextureObject;
1682         functions->DeleteTexture = evergreenDeleteTexture;
1683         functions->IsTextureResident = driIsTextureResident;
1684
1685         functions->TexParameter = evergreenTexParameter;
1686
1687         functions->CompressedTexImage2D = radeonCompressedTexImage2D;
1688         functions->CompressedTexSubImage2D = radeonCompressedTexSubImage2D;
1689
1690         if (radeon->radeonScreen->kernel_mm) {
1691                 functions->CopyTexImage2D = radeonCopyTexImage2D;
1692                 functions->CopyTexSubImage2D = radeonCopyTexSubImage2D;
1693         }
1694
1695         functions->GenerateMipmap = radeonGenerateMipmap;
1696
1697         driInitTextureFormats();
1698 }