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