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