c94a717c0aeba59b393ac7240161a6774f56f7e8
[profile/ivi/mesa.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                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8,
500                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
501                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
502
503                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
504                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
505                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
506                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
507                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
508                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
509                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
510                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
511                 break;          
512         case MESA_FORMAT_RGB_DXT1: /* not supported yet */
513         case MESA_FORMAT_RGBA_DXT1: /* not supported yet */
514         case MESA_FORMAT_RGBA_DXT3: /* not supported yet */
515         case MESA_FORMAT_RGBA_DXT5: /* not supported yet */
516                 return GL_FALSE;
517
518         case MESA_FORMAT_RGBA_FLOAT32:
519                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_32_32_32_FLOAT,
520                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
521                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
522
523                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
524                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
525                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
526                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
527                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
528                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
529                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
530                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
531                 break;
532         case MESA_FORMAT_RGBA_FLOAT16:
533                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_16_16_16_FLOAT,
534                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
535                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
536
537                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
538                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
539                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
540                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
541                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
542                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
543                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
544                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
545                 break;
546         case MESA_FORMAT_RGB_FLOAT32: /* X, Y, Z, ONE */
547                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_32_32_FLOAT,
548                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
549                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
550
551                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
552                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
553                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
554                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
555                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
556                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
557                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
558                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
559                 break;
560         case MESA_FORMAT_RGB_FLOAT16:
561                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_16_16_FLOAT,
562                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
563                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
564
565                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
566                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
567                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
568                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
569                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
570                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
571                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
572                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
573                 break;
574         case MESA_FORMAT_ALPHA_FLOAT32: /* ZERO, ZERO, ZERO, X */
575                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_FLOAT,
576                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
577                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
578
579                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
580                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
581                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
582                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
583                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
584                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
585                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
586                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
587                 break;
588         case MESA_FORMAT_ALPHA_FLOAT16: /* ZERO, ZERO, ZERO, X */
589                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_FLOAT,
590                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
591                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
592
593                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
594                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
595                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
596                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
597                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
598                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
599                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
600                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
601                 break;
602         case MESA_FORMAT_LUMINANCE_FLOAT32: /* X, X, X, ONE */
603                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_FLOAT,
604                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
605                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
606
607                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
608                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
609                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
610                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
611                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
612                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
613                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
614                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
615                 break;
616         case MESA_FORMAT_LUMINANCE_FLOAT16: /* X, X, X, ONE */
617                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_FLOAT,
618                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
619                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
620
621                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
622                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
623                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
624                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
625                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
626                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
627                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
628                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
629                 break;
630         case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
631                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_32_FLOAT,
632                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
633                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
634
635                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
636                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
637                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
638                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
639                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
640                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
641                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
642                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
643                 break;
644         case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
645                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_16_FLOAT,
646                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
647                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
648
649                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
650                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
651                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
652                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
653                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
654                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
655                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
656                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
657                 break;
658         case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
659                 SETfield(t->SQ_TEX_RESOURCE7, FMT_32_FLOAT,
660                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
661                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
662
663                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
664                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
665                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
666                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
667                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
668                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
669                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
670                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
671                 break;
672         case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
673                 SETfield(t->SQ_TEX_RESOURCE7, FMT_16_FLOAT,
674                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
675                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
676
677                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
678                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
679                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
680                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
681                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
682                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
683                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
684                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
685                 break;
686         case MESA_FORMAT_Z16:
687         case MESA_FORMAT_X8_Z24:
688         case MESA_FORMAT_S8_Z24:
689         case MESA_FORMAT_Z24_S8:
690         case MESA_FORMAT_Z32:
691         case MESA_FORMAT_S8:            
692         CLEARbit(t->SQ_TEX_RESOURCE0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);        
693                 SETfield(t->SQ_TEX_RESOURCE1, ARRAY_1D_TILED_THIN1,
694                              EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift,
695                              EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);
696                 switch (mesa_format) {
697                 case MESA_FORMAT_Z16:
698                         SETfield(t->SQ_TEX_RESOURCE7, FMT_16,
699                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
700                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
701                         break;
702                 case MESA_FORMAT_X8_Z24:
703                 case MESA_FORMAT_S8_Z24:
704                         SETfield(t->SQ_TEX_RESOURCE7, FMT_8_24,
705                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
706                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
707                         break;
708                 case MESA_FORMAT_Z24_S8:
709                         SETfield(t->SQ_TEX_RESOURCE7, FMT_24_8,
710                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
711                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
712                         break;
713                 case MESA_FORMAT_Z32:
714                         SETfield(t->SQ_TEX_RESOURCE7, FMT_32,
715                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
716                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
717                         break;
718                 case MESA_FORMAT_S8:
719                         SETfield(t->SQ_TEX_RESOURCE7, FMT_8,
720                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
721                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
722                         break;
723                 default:
724                         break;
725                 };
726                 switch (tObj->Sampler.DepthMode) {
727                 case GL_LUMINANCE:  /* X, X, X, ONE */
728                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
729                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
730                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
731                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
732                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
733                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
734                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
735                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
736                         break;
737                 case GL_INTENSITY:  /* X, X, X, X */
738                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
739                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
740                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
741                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
742                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
743                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
744                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
745                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
746                         break;
747                 case GL_ALPHA:     /* ZERO, ZERO, ZERO, X */
748                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
749                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
750                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
751                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
752                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
753                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
754                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
755                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
756                         break;
757                 default:
758                         return GL_FALSE;
759                 }
760                 break;
761         /* EXT_texture_sRGB */
762         case MESA_FORMAT_SRGBA8:
763                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
764                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
765                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
766
767                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
768                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
769                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
770                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
771                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
772                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
773                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
774                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
775                 SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
776                 break;
777         case MESA_FORMAT_SLA8:
778                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8,
779                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
780                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
781
782                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
783                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
784                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
785                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
786                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
787                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
788                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
789                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
790                 SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
791                 break;
792         case MESA_FORMAT_SL8: /* X, X, X, ONE */
793                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8,
794                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
795                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
796
797                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
798                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
799                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
800                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
801                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
802                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
803                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
804                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
805                 SETbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
806                 break;
807         default:
808                 /* Not supported format */
809                 return GL_FALSE;
810         };
811
812         return GL_TRUE;
813 }
814
815 static GLuint evergreen_translate_shadow_func(GLenum func)
816 {
817    switch (func) {
818    case GL_NEVER:
819       return SQ_TEX_DEPTH_COMPARE_NEVER;
820    case GL_LESS:
821       return SQ_TEX_DEPTH_COMPARE_LESS;
822    case GL_LEQUAL:
823       return SQ_TEX_DEPTH_COMPARE_LESSEQUAL;
824    case GL_GREATER:
825       return SQ_TEX_DEPTH_COMPARE_GREATER;
826    case GL_GEQUAL:
827       return SQ_TEX_DEPTH_COMPARE_GREATEREQUAL;
828    case GL_NOTEQUAL:
829       return SQ_TEX_DEPTH_COMPARE_NOTEQUAL;
830    case GL_EQUAL:
831       return SQ_TEX_DEPTH_COMPARE_EQUAL;
832    case GL_ALWAYS:
833       return SQ_TEX_DEPTH_COMPARE_ALWAYS;
834    default:
835       WARN_ONCE("Unknown shadow compare function! %d", func);
836       return 0;
837    }
838 }
839
840 static void evergreenUpdateTexWrap(radeonTexObjPtr t)
841 {
842         struct gl_texture_object *tObj = &t->base;
843
844     SETfield(t->SQ_TEX_SAMPLER0, evergreen_translate_wrap_mode(tObj->Sampler.WrapS),
845              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift, 
846              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
847
848         if (tObj->Target != GL_TEXTURE_1D) 
849     {
850                 SETfield(t->SQ_TEX_SAMPLER0, evergreen_translate_wrap_mode(tObj->Sampler.WrapT),
851                              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Y_shift, 
852                  EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Y_mask);
853
854                 if (tObj->Target == GL_TEXTURE_3D)
855                         SETfield(t->SQ_TEX_SAMPLER0, evergreen_translate_wrap_mode(tObj->Sampler.WrapR),
856                                      EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Z_shift, 
857                      EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Z_mask);
858         }
859 }
860
861 static void evergreenSetTexDefaultState(radeonTexObjPtr t)
862 {       
863     /* Init text object to default states. */
864     t->SQ_TEX_RESOURCE0 = 0;
865     t->SQ_TEX_RESOURCE1 = 0;
866     t->SQ_TEX_RESOURCE2 = 0;
867     t->SQ_TEX_RESOURCE3 = 0;
868     t->SQ_TEX_RESOURCE4 = 0;
869     t->SQ_TEX_RESOURCE5 = 0;
870     t->SQ_TEX_RESOURCE6 = 0;
871     t->SQ_TEX_RESOURCE7 = 0;
872
873     SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_2D, 
874              EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
875              EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
876
877     CLEARbit(t->SQ_TEX_RESOURCE0, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit);
878
879     SETfield(t->SQ_TEX_RESOURCE1, ARRAY_LINEAR_GENERAL,
880              EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift, 
881              EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask);       
882         
883     SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
884              FORMAT_COMP_X_shift, FORMAT_COMP_X_mask);
885     SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
886              FORMAT_COMP_Y_shift, FORMAT_COMP_Y_mask);
887     SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
888              FORMAT_COMP_Z_shift, FORMAT_COMP_Z_mask);
889     SETfield(t->SQ_TEX_RESOURCE4, SQ_FORMAT_COMP_UNSIGNED,
890              FORMAT_COMP_W_shift, FORMAT_COMP_W_mask);
891     SETfield(t->SQ_TEX_RESOURCE4, SQ_NUM_FORMAT_NORM,
892              SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_shift, SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_mask);
893     CLEARbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__SRF_MODE_ALL_bit);
894     CLEARbit(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit);
895     SETfield(t->SQ_TEX_RESOURCE4, SQ_ENDIAN_NONE,
896              SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift, SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_mask);
897         
898     SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
899                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift,
900                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
901         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
902                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift,
903                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
904         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
905                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift,
906                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
907         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
908                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift,
909                      SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
910     SETfield(t->SQ_TEX_RESOURCE4, 0, 
911              BASE_LEVEL_shift, 
912              BASE_LEVEL_mask); /* mip-maps */            
913
914     SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
915              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
916              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
917     SETfield(t->SQ_TEX_RESOURCE7, SQ_TEX_VTX_VALID_TEXTURE,
918              EG_SQ_TEX_RESOURCE_WORD7_0__TYPE_shift, 
919              EG_SQ_TEX_RESOURCE_WORD7_0__TYPE_mask);
920
921     /* Initialize sampler registers */
922     t->SQ_TEX_SAMPLER0 = 0;
923     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, 
924              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift,
925                  EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
926     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, 
927              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift, 
928              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
929     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_WRAP, 
930              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift, 
931              EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask);
932     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, 
933              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift, 
934              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask);
935     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_XY_FILTER_POINT, 
936              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
937              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
938     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, 
939              EG_SQ_TEX_SAMPLER_WORD0_0__Z_FILTER_shift, 
940              EG_SQ_TEX_SAMPLER_WORD0_0__Z_FILTER_mask);
941     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_Z_FILTER_NONE, 
942              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
943              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
944     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_TRANS_BLACK, 
945              EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_shift, 
946              EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_mask);
947
948     t->SQ_TEX_SAMPLER1 = 0;
949     SETfield(t->SQ_TEX_SAMPLER1, 0x7ff, 
950              EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_shift, 
951              EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_mask);
952
953     t->SQ_TEX_SAMPLER2 = 0;
954     SETbit(t->SQ_TEX_SAMPLER2, EG_SQ_TEX_SAMPLER_WORD2_0__TYPE_bit);
955 }
956
957 static void evergreenSetTexFilter(radeonTexObjPtr t, GLenum minf, GLenum magf, GLfloat anisotropy)
958 {
959         /* Force revalidation to account for switches from/to mipmapping. */
960         t->validated = GL_FALSE;
961
962         /* Note that EXT_texture_filter_anisotropic is extremely vague about
963          * how anisotropic filtering interacts with the "normal" filter modes.
964          * When anisotropic filtering is enabled, we override min and mag
965          * filter settings completely. This includes driconf's settings.
966          */
967         if (anisotropy >= 2.0 && (minf != GL_NEAREST) && (magf != GL_NEAREST)) {
968                 /*t->pp_txfilter |= R300_TX_MAG_FILTER_ANISO
969                         | R300_TX_MIN_FILTER_ANISO
970                         | R300_TX_MIN_FILTER_MIP_LINEAR
971                         | aniso_filter(anisotropy);*/
972                 radeon_print(RADEON_TEXTURE, RADEON_NORMAL, "Using maximum anisotropy of %f\n", anisotropy);
973                 return;
974         }
975
976         switch (minf) 
977     {
978         case GL_NEAREST:
979                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
980                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
981                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
982                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_None,
983                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
984                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
985                 break;
986         case GL_LINEAR:
987                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
988                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
989                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
990                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_None,
991                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
992                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
993                 break;
994         case GL_NEAREST_MIPMAP_NEAREST:
995                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
996                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
997                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
998                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Point,
999                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
1000                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
1001                 break;
1002         case GL_NEAREST_MIPMAP_LINEAR:
1003                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
1004                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
1005                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
1006                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Linear,
1007                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
1008                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
1009                 break;
1010         case GL_LINEAR_MIPMAP_NEAREST:
1011                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
1012                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
1013                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
1014                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Point,
1015                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
1016                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
1017                 break;
1018         case GL_LINEAR_MIPMAP_LINEAR:
1019                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
1020                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift, 
1021                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask);
1022                 SETfield(t->SQ_TEX_SAMPLER0, TEX_MipFilter_Linear,
1023                              EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift, 
1024                  EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask);
1025                 break;
1026         }
1027
1028         /* Note we don't have 3D mipmaps so only use the mag filter setting
1029          * to set the 3D texture filter mode.
1030          */
1031         switch (magf) 
1032     {
1033         case GL_NEAREST:
1034                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Point,
1035                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift, 
1036                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask);
1037                 break;
1038         case GL_LINEAR:
1039                 SETfield(t->SQ_TEX_SAMPLER0, TEX_XYFilter_Linear,
1040                              EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift, 
1041                  EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask);
1042                 break;
1043         }
1044 }
1045
1046 static void evergreenSetTexBorderColor(radeonTexObjPtr t, const GLfloat color[4])
1047 {
1048         t->TD_PS_SAMPLER0_BORDER_ALPHA = *((uint32_t*)&(color[3]));
1049         t->TD_PS_SAMPLER0_BORDER_RED = *((uint32_t*)&(color[2]));
1050         t->TD_PS_SAMPLER0_BORDER_GREEN = *((uint32_t*)&(color[1]));
1051         t->TD_PS_SAMPLER0_BORDER_BLUE = *((uint32_t*)&(color[0]));
1052
1053     SETfield(t->SQ_TEX_SAMPLER0, SQ_TEX_BORDER_COLOR_REGISTER,
1054                      EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_shift, 
1055              EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_mask);
1056 }
1057
1058 static void evergreenSetDepthTexMode(struct gl_texture_object *tObj)
1059 {
1060         radeonTexObjPtr t;
1061
1062         if (!tObj)
1063                 return;
1064
1065         t = radeon_tex_obj(tObj);
1066
1067         if(!evergreenGetTexFormat(tObj, tObj->Image[0][tObj->BaseLevel]->TexFormat))
1068           t->validated = GL_FALSE;
1069 }
1070
1071 static INLINE uint32_t
1072 EG_S_FIXED(float value, uint32_t frac_bits)
1073 {
1074    return value * (1 << frac_bits);
1075 }
1076
1077 static GLboolean evergreen_setup_hardware_state(struct gl_context * ctx, struct gl_texture_object *texObj, int unit)
1078 {
1079         context_t *context = EVERGREEN_CONTEXT(ctx);
1080         radeonTexObj *t = radeon_tex_obj(texObj);
1081         const struct gl_texture_image *firstImage;
1082         GLuint uTexelPitch, row_align;
1083
1084         if (context->radeon.radeonScreen->driScreen->dri2.enabled &&
1085             t->image_override &&
1086             t->bo)
1087                 return GL_TRUE;
1088
1089         firstImage = t->base.Image[0][t->minLod];
1090
1091         if (!t->image_override) {        
1092                 if (!evergreenGetTexFormat(texObj, firstImage->TexFormat)) {
1093                         radeon_warning("unsupported texture format in %s\n",
1094                                        __FUNCTION__);
1095                         return GL_FALSE;
1096                 }        
1097         }
1098
1099     switch (texObj->Target) 
1100     {
1101     case GL_TEXTURE_1D:
1102         SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_1D, 
1103                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
1104                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
1105         SETfield(t->SQ_TEX_RESOURCE1, 0, 
1106                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift, 
1107                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask);
1108         break;
1109     case GL_TEXTURE_2D:
1110     case GL_TEXTURE_RECTANGLE_NV:
1111         SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_2D, 
1112                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
1113                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
1114         SETfield(t->SQ_TEX_RESOURCE1, 0, 
1115                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift, 
1116                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask);
1117         break;
1118     case GL_TEXTURE_3D:
1119         SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_3D, 
1120                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
1121                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
1122         SETfield(t->SQ_TEX_RESOURCE1, (firstImage->Depth - 1), // ???
1123                      EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift, 
1124                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask);
1125         break;
1126     case GL_TEXTURE_CUBE_MAP:
1127         SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_CUBEMAP, 
1128                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift, 
1129                  EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask);
1130         SETfield(t->SQ_TEX_RESOURCE1, 0, 
1131                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift, 
1132                  EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask);
1133         break;
1134     default:
1135         radeon_error("unexpected texture target type in %s\n", __FUNCTION__);
1136         return GL_FALSE;
1137     }
1138
1139     row_align = context->radeon.texture_row_align - 1;
1140     uTexelPitch = (_mesa_format_row_stride(firstImage->TexFormat, firstImage->Width) + row_align) & ~row_align;
1141     uTexelPitch = uTexelPitch / _mesa_get_format_bytes(firstImage->TexFormat);
1142     uTexelPitch = (uTexelPitch + R700_TEXEL_PITCH_ALIGNMENT_MASK)
1143                      & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
1144
1145         /* min pitch is 8 */
1146         if (uTexelPitch < 8)
1147                 uTexelPitch = 8;
1148
1149         SETfield(t->SQ_TEX_RESOURCE0, (uTexelPitch/8)-1, 
1150              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift, 
1151              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask);
1152         SETfield(t->SQ_TEX_RESOURCE0, firstImage->Width - 1,
1153                      EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_shift, 
1154              EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_mask);
1155         SETfield(t->SQ_TEX_RESOURCE1, firstImage->Height - 1,
1156                      EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_shift, 
1157              EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_mask);
1158
1159         t->SQ_TEX_RESOURCE2 = get_base_teximage_offset(t) / 256;
1160
1161         t->SQ_TEX_RESOURCE3 = radeon_miptree_image_offset(t->mt, 0, t->minLod + 1) / 256;
1162
1163         SETfield(t->SQ_TEX_RESOURCE4, 0, BASE_LEVEL_shift, BASE_LEVEL_mask);
1164         SETfield(t->SQ_TEX_RESOURCE5, t->maxLod - t->minLod, LAST_LEVEL_shift, LAST_LEVEL_mask);
1165     
1166         SETfield(t->SQ_TEX_SAMPLER1,
1167                      EG_S_FIXED(CLAMP(t->base.Sampler.MinLod - t->minLod, 0, 15), 8),
1168                      EG_SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_shift, 
1169              EG_SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_mask);
1170         SETfield(t->SQ_TEX_SAMPLER1,
1171                      EG_S_FIXED(CLAMP(t->base.Sampler.MaxLod - t->minLod, 0, 15), 8),
1172                      EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_shift, 
1173              EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_mask);
1174         SETfield(t->SQ_TEX_SAMPLER2,
1175                      EG_S_FIXED(CLAMP(ctx->Texture.Unit[unit].LodBias + t->base.Sampler.LodBias, -16, 16), 8),
1176                      EG_SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_shift, 
1177              EG_SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_mask);
1178
1179         if(texObj->Sampler.CompareMode == GL_COMPARE_R_TO_TEXTURE_ARB)
1180         {
1181                 SETfield(t->SQ_TEX_SAMPLER0, evergreen_translate_shadow_func(texObj->Sampler.CompareFunc), 
1182                  EG_SQ_TEX_SAMPLER_WORD0_0__DCF_shift, 
1183                  EG_SQ_TEX_SAMPLER_WORD0_0__DCF_mask);
1184         }
1185         else
1186         {
1187                 CLEARfield(t->SQ_TEX_SAMPLER0, EG_SQ_TEX_SAMPLER_WORD0_0__DCF_mask);
1188         }
1189
1190         return GL_TRUE;
1191 }
1192
1193 void evergreenSetTexOffset(__DRIcontext * pDRICtx, GLint texname,
1194                       unsigned long long offset, GLint depth, GLuint pitch)
1195 {
1196         context_t *rmesa = pDRICtx->driverPrivate;
1197         struct gl_texture_object *tObj =
1198             _mesa_lookup_texture(rmesa->radeon.glCtx, texname);
1199         radeonTexObjPtr t = radeon_tex_obj(tObj);
1200         const struct gl_texture_image *firstImage;
1201         uint32_t pitch_val, size, row_align;
1202
1203         if (!tObj)
1204                 return;
1205
1206         t->image_override = GL_TRUE;
1207
1208         if (!offset)
1209                 return;
1210
1211         firstImage = t->base.Image[0][t->minLod];
1212         row_align = rmesa->radeon.texture_row_align - 1;
1213         size = ((_mesa_format_row_stride(firstImage->TexFormat, firstImage->Width) + row_align) & ~row_align) * firstImage->Height;
1214         if (t->bo) {
1215                 radeon_bo_unref(t->bo);
1216                 t->bo = NULL;
1217         }
1218         t->bo = radeon_legacy_bo_alloc_fake(rmesa->radeon.radeonScreen->bom, size, offset);
1219         t->override_offset = offset;
1220         pitch_val = pitch;
1221         switch (depth) {
1222         case 32:
1223                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1224                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1225                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1226
1227                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1228                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1229                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1230                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1231                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1232                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1233                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
1234                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1235                 pitch_val /= 4;
1236                 break;
1237         case 24:
1238         default:
1239                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1240                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1241                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1242
1243                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1244                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1245                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1246                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1247                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1248                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1249                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1250                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1251                 pitch_val /= 4;
1252                 break;
1253         case 16:
1254                 SETfield(t->SQ_TEX_RESOURCE7, FMT_5_6_5,
1255                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1256                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1257
1258                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1259                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1260                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1261                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1262                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1263                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1264                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1265                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1266                 pitch_val /= 2;
1267                 break;
1268         }
1269
1270         pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
1271                 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
1272
1273         /* min pitch is 8 */
1274         if (pitch_val < 8)
1275                 pitch_val = 8;
1276
1277         SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, 
1278              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift, 
1279              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask);
1280 }
1281
1282 void evergreenSetTexBuffer(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_format, __DRIdrawable *dPriv)
1283 {
1284         struct gl_texture_unit *texUnit;
1285         struct gl_texture_object *texObj;
1286         struct gl_texture_image *texImage;
1287         struct radeon_renderbuffer *rb;
1288         radeon_texture_image *rImage;
1289         radeonContextPtr radeon;
1290         struct radeon_framebuffer *rfb;
1291         radeonTexObjPtr t;
1292         uint32_t pitch_val;
1293         gl_format texFormat;
1294
1295         radeon = pDRICtx->driverPrivate;
1296
1297         rfb = dPriv->driverPrivate;
1298         texUnit = &radeon->glCtx->Texture.Unit[radeon->glCtx->Texture.CurrentUnit];
1299         texObj = _mesa_select_tex_object(radeon->glCtx, texUnit, target);
1300         texImage = _mesa_get_tex_image(radeon->glCtx, texObj, target, 0);
1301
1302         rImage = get_radeon_texture_image(texImage);
1303         t = radeon_tex_obj(texObj);
1304         if (t == NULL) {
1305             return;
1306         }
1307
1308         radeon_update_renderbuffers(pDRICtx, dPriv, GL_TRUE);
1309         rb = rfb->color_rb[0];
1310         if (rb->bo == NULL) {
1311                 /* Failed to BO for the buffer */
1312                 return;
1313         }
1314
1315         _mesa_lock_texture(radeon->glCtx, texObj);
1316         if (t->bo) {
1317                 radeon_bo_unref(t->bo);
1318                 t->bo = NULL;
1319         }
1320         if (rImage->bo) {
1321                 radeon_bo_unref(rImage->bo);
1322                 rImage->bo = NULL;
1323         }
1324
1325         radeon_miptree_unreference(&t->mt);
1326         radeon_miptree_unreference(&rImage->mt);
1327
1328         rImage->bo = rb->bo;
1329         radeon_bo_ref(rImage->bo);
1330         t->bo = rb->bo;
1331         radeon_bo_ref(t->bo);
1332         t->image_override = GL_TRUE;
1333         t->override_offset = 0;
1334         pitch_val = rb->pitch;
1335         switch (rb->cpp) {
1336         case 4:
1337                 if (glx_texture_format == __DRI_TEXTURE_FORMAT_RGB) {
1338                         texFormat = MESA_FORMAT_RGB888;
1339                         SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1340                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1341                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1342
1343                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1344                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1345                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1346                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1347                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1348                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1349                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1350                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1351                 } else {
1352                         texFormat = MESA_FORMAT_ARGB8888;
1353                         SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1354                                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1355                      EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1356
1357                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1358                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1359                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1360                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1361                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1362                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1363                         SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
1364                                  SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1365                 }
1366                 pitch_val /= 4;
1367                 break;
1368         case 3:
1369         default:
1370                 // FMT_8_8_8 ???
1371                 texFormat = MESA_FORMAT_RGB888;
1372                 SETfield(t->SQ_TEX_RESOURCE7, FMT_8_8_8_8,
1373                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1374                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1375
1376                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
1377                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1378                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1379                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1380                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1381                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1382                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1383                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1384                 pitch_val /= 4;
1385                 break;
1386         case 2:
1387                 texFormat = MESA_FORMAT_RGB565;
1388                 SETfield(t->SQ_TEX_RESOURCE7, FMT_5_6_5,
1389                              EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift, 
1390                  EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask);
1391
1392                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
1393                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
1394                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
1395                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
1396                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
1397                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
1398                 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
1399                          SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
1400                 pitch_val /= 2;
1401                 break;
1402         }
1403
1404         _mesa_init_teximage_fields(radeon->glCtx, target, texImage,
1405                                    rb->base.Width, rb->base.Height, 1, 0,
1406                                    rb->cpp, texFormat);
1407         rImage->base.RowStride = rb->pitch / rb->cpp;
1408
1409         pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
1410                 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
1411
1412         /* min pitch is 8 */
1413         if (pitch_val < 8)
1414                 pitch_val = 8;
1415
1416         SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, 
1417              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift, 
1418              EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask);
1419         SETfield(t->SQ_TEX_RESOURCE0, rb->base.Width - 1,
1420                      EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_shift, 
1421              EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_mask);
1422         SETfield(t->SQ_TEX_RESOURCE1, rb->base.Height - 1,
1423                      EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_shift, 
1424              EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_mask);
1425
1426         t->validated = GL_TRUE;
1427         _mesa_unlock_texture(radeon->glCtx, texObj);
1428         return;
1429 }
1430
1431 void evergreenUpdateTextureState(struct gl_context * ctx)
1432 {
1433         context_t *context = EVERGREEN_CONTEXT(ctx);
1434     EVERGREEN_CHIP_CONTEXT * evergreen = GET_EVERGREEN_CHIP(context);   
1435         struct gl_texture_unit *texUnit;
1436         struct radeon_tex_obj *t;
1437         GLuint    unit;
1438
1439         EVERGREEN_STATECHANGE(context, tx);    
1440
1441         for (unit = 0; unit < R700_MAX_TEXTURE_UNITS; unit++) {
1442                 texUnit = &ctx->Texture.Unit[unit];
1443                 t = radeon_tex_obj(ctx->Texture.Unit[unit]._Current);
1444                 evergreen->textures[unit] = NULL;
1445                 if (texUnit->_ReallyEnabled) {
1446                         if (!t)
1447                                 continue;
1448                         evergreen->textures[unit] = t;
1449                 }
1450         }
1451 }
1452
1453 static GLboolean evergreen_validate_texture(struct gl_context * ctx, struct gl_texture_object *texObj, int unit)
1454 {
1455         radeonTexObj *t = radeon_tex_obj(texObj);
1456
1457         if (!radeon_validate_texture_miptree(ctx, texObj))
1458                 return GL_FALSE;
1459
1460         /* Configure the hardware registers (more precisely, the cached version
1461          * of the hardware registers). */
1462         if (!evergreen_setup_hardware_state(ctx, texObj, unit))
1463                 return GL_FALSE;
1464
1465         t->validated = GL_TRUE;
1466         return GL_TRUE;
1467 }
1468
1469 GLboolean evergreenValidateBuffers(struct gl_context * ctx)
1470 {
1471         context_t *rmesa = EVERGREEN_CONTEXT(ctx);
1472         struct radeon_renderbuffer *rrb;
1473         struct radeon_bo *pbo;
1474         int i;
1475         int ret;
1476
1477         radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
1478
1479         rrb = radeon_get_colorbuffer(&rmesa->radeon);
1480         /* color buffer */
1481         if (rrb && rrb->bo) {
1482                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
1483                                                   rrb->bo, 0,
1484                                                   RADEON_GEM_DOMAIN_VRAM);
1485         }
1486
1487         /* depth buffer */
1488         rrb = radeon_get_depthbuffer(&rmesa->radeon);
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         for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
1496                 radeonTexObj *t;
1497
1498                 if (!ctx->Texture.Unit[i]._ReallyEnabled)
1499                         continue;
1500
1501                 if (!evergreen_validate_texture(ctx, ctx->Texture.Unit[i]._Current, i)) {
1502                         radeon_warning("failed to validate texture for unit %d.\n", i);
1503                 }
1504                 t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
1505                 if (t->image_override && t->bo)
1506                         radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
1507                                                           t->bo,
1508                                                           RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
1509                 else if (t->mt->bo)
1510                         radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
1511                                                           t->mt->bo,
1512                                                           RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
1513         }
1514
1515         pbo = (struct radeon_bo *)evergreenGetActiveFpShaderBo(ctx);
1516         if (pbo) {
1517                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1518                                                   RADEON_GEM_DOMAIN_GTT, 0);
1519         }
1520
1521         pbo = (struct radeon_bo *)evergreenGetActiveVpShaderBo(ctx);
1522         if (pbo) {
1523                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1524                                                   RADEON_GEM_DOMAIN_GTT, 0);
1525         }
1526
1527         pbo = (struct radeon_bo *)evergreenGetActiveFpShaderConstBo(ctx);
1528         if (pbo) {
1529                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1530                                                   RADEON_GEM_DOMAIN_GTT, 0);
1531         }
1532
1533         pbo = (struct radeon_bo *)evergreenGetActiveVpShaderConstBo(ctx);
1534         if (pbo) {
1535                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs, pbo,
1536                                                   RADEON_GEM_DOMAIN_GTT, 0);
1537         }
1538         
1539         ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, first_elem(&rmesa->radeon.dma.reserved)->bo, RADEON_GEM_DOMAIN_GTT, 0);
1540         if (ret)
1541                 return GL_FALSE;
1542         return GL_TRUE;
1543 }
1544
1545 static struct gl_texture_object *evergreenNewTextureObject(struct gl_context * ctx,
1546                                                       GLuint name,
1547                                                       GLenum target)
1548 {
1549         context_t* rmesa = EVERGREEN_CONTEXT(ctx);
1550         radeonTexObj * t = CALLOC_STRUCT(radeon_tex_obj);
1551
1552
1553         radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_NORMAL,
1554                 "%s( %p (target = %s) )\n", __FUNCTION__,
1555                         t, _mesa_lookup_enum_by_nr(target));
1556
1557         _mesa_initialize_texture_object(&t->base, name, target);
1558         t->base.Sampler.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
1559     
1560         evergreenSetTexDefaultState(t);
1561         evergreenUpdateTexWrap(t);
1562         evergreenSetTexFilter(t, t->base.Sampler.MinFilter, t->base.Sampler.MagFilter, t->base.Sampler.MaxAnisotropy);
1563         evergreenSetTexBorderColor(t, t->base.Sampler.BorderColor.f);
1564
1565         return &t->base;
1566 }
1567
1568 static void evergreenDeleteTexture(struct gl_context * ctx, struct gl_texture_object *texObj)
1569 {
1570         context_t              * rmesa     = EVERGREEN_CONTEXT(ctx);
1571     EVERGREEN_CHIP_CONTEXT * evergreen = GET_EVERGREEN_CHIP(rmesa);
1572         radeonTexObj* t = radeon_tex_obj(texObj);
1573
1574         radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_NORMAL,
1575                 "%s( %p (target = %s) )\n", __FUNCTION__,
1576                         (void *)texObj,
1577                         _mesa_lookup_enum_by_nr(texObj->Target));
1578
1579         if (rmesa) {
1580                 int i;
1581                 radeon_firevertices(&rmesa->radeon);
1582
1583                 for(i = 0; i < R700_MAX_TEXTURE_UNITS; ++i)
1584                         if (evergreen->textures[i] == t)
1585                                 evergreen->textures[i] = 0;
1586         }
1587
1588         if (t->bo) {
1589                 radeon_bo_unref(t->bo);
1590                 t->bo = NULL;
1591         }
1592
1593         radeon_miptree_unreference(&t->mt);
1594
1595         _mesa_delete_texture_object(ctx, texObj);
1596 }
1597
1598 static void evergreenTexParameter(struct gl_context * ctx, GLenum target,
1599                              struct gl_texture_object *texObj,
1600                              GLenum pname, const GLfloat * params)
1601 {
1602     radeonTexObj* t = radeon_tex_obj(texObj);
1603         GLenum baseFormat;
1604
1605         radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_VERBOSE,
1606                         "%s( %s )\n", __FUNCTION__,
1607                         _mesa_lookup_enum_by_nr(pname));
1608
1609         switch (pname) {
1610         case GL_TEXTURE_MIN_FILTER:
1611         case GL_TEXTURE_MAG_FILTER:
1612         case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1613                 evergreenSetTexFilter(t, texObj->Sampler.MinFilter, texObj->Sampler.MagFilter, texObj->Sampler.MaxAnisotropy);
1614                 break;
1615
1616         case GL_TEXTURE_WRAP_S:
1617         case GL_TEXTURE_WRAP_T:
1618         case GL_TEXTURE_WRAP_R:
1619                 evergreenUpdateTexWrap(t);
1620                 break;
1621
1622         case GL_TEXTURE_BORDER_COLOR:
1623                 evergreenSetTexBorderColor(t, texObj->Sampler.BorderColor.f);
1624                 break;
1625
1626         case GL_TEXTURE_BASE_LEVEL:
1627         case GL_TEXTURE_MAX_LEVEL:
1628         case GL_TEXTURE_MIN_LOD:
1629         case GL_TEXTURE_MAX_LOD:
1630                 t->validated = GL_FALSE;
1631                 break;
1632
1633         case GL_DEPTH_TEXTURE_MODE:
1634                 if (!texObj->Image[0][texObj->BaseLevel])
1635                         return;
1636                 baseFormat = texObj->Image[0][texObj->BaseLevel]->_BaseFormat;
1637                 if (baseFormat == GL_DEPTH_COMPONENT ||
1638                     baseFormat == GL_DEPTH_STENCIL) {
1639                         evergreenSetDepthTexMode(texObj);
1640                         break;
1641                 } else {
1642                         /* If the texture isn't a depth texture, changing this
1643                          * state won't cause any changes to the hardware.
1644                          * Don't force a flush of texture state.
1645                          */
1646                         return;
1647                 }
1648
1649         default:
1650                 return;
1651         }
1652 }
1653
1654 void evergreenInitTextureFuncs(radeonContextPtr radeon, struct dd_function_table *functions)
1655 {
1656         /* Note: we only plug in the functions we implement in the driver
1657          * since _mesa_init_driver_functions() was already called.
1658          */
1659
1660         radeon_init_common_texture_funcs(radeon, functions);
1661
1662         functions->NewTextureObject = evergreenNewTextureObject;
1663         functions->DeleteTexture = evergreenDeleteTexture;
1664         functions->IsTextureResident = driIsTextureResident;
1665
1666         functions->TexParameter = evergreenTexParameter;
1667 }