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