Merge branch 'asm-shader-rework-1'
[mesa.git] / src / mesa / drivers / dri / r600 / r600_texstate.c
1 /*
2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
3
4 The Weather Channel (TM) funded Tungsten Graphics to develop the
5 initial release of the Radeon 8500 driver under the XFree86 license.
6 This notice must be preserved.
7
8 Permission is hereby granted, free of charge, to any person obtaining
9 a copy of this software and associated documentation files (the
10 "Software"), to deal in the Software without restriction, including
11 without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense, and/or sell copies of the Software, and to
13 permit persons to whom the Software is furnished to do so, subject to
14 the following conditions:
15
16 The above copyright notice and this permission notice (including the
17 next paragraph) shall be included in all copies or substantial
18 portions of the Software.
19
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 **************************************************************************/
29
30 /**
31 * \file
32 *
33 * \author Keith Whitwell <keith@tungstengraphics.com>
34 *
35 * \todo Enable R300 texture tiling code?
36 */
37
38 #include "main/glheader.h"
39 #include "main/imports.h"
40 #include "main/context.h"
41 #include "main/macros.h"
42 #include "main/texformat.h"
43 #include "main/teximage.h"
44 #include "main/texobj.h"
45 #include "main/enums.h"
46 #include "main/simple_list.h"
47
48 #include "r600_context.h"
49 #include "r700_state.h"
50 #include "radeon_mipmap_tree.h"
51 #include "r600_tex.h"
52
53 void r600UpdateTextureState(GLcontext * ctx);
54
55 void r600UpdateTextureState(GLcontext * ctx)
56 {
57 context_t *context = R700_CONTEXT(ctx);
58 R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
59 struct gl_texture_unit *texUnit;
60 struct radeon_tex_obj *t;
61 GLuint unit;
62
63 for (unit = 0; unit < R700_MAX_TEXTURE_UNITS; unit++) {
64 texUnit = &ctx->Texture.Unit[unit];
65 t = radeon_tex_obj(ctx->Texture.Unit[unit]._Current);
66
67 if (texUnit->_ReallyEnabled) {
68 if (!t)
69 continue;
70 r700->textures[unit] = t;
71 }
72 }
73 }
74
75 static GLboolean r600GetTexFormat(struct gl_texture_object *tObj, GLuint mesa_format)
76 {
77 radeonTexObj *t = radeon_tex_obj(tObj);
78
79 CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
80 CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
81 CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
82 CLEARfield(t->SQ_TEX_RESOURCE4, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
83
84 switch (mesa_format) /* This is mesa format. */
85 {
86 case MESA_FORMAT_RGBA8888:
87 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
88 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
89
90 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
91 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
92 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
93 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
94 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
95 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
96 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
97 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
98 break;
99 case MESA_FORMAT_RGBA8888_REV:
100 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
101 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
102
103 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
104 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
105 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
106 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
107 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
108 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
109 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
110 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
111 break;
112 case MESA_FORMAT_ARGB8888:
113 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
114 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
115
116 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
117 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
118 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
119 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
120 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
121 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
122 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
123 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
124 break;
125 case MESA_FORMAT_ARGB8888_REV:
126 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
127 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
128
129 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
130 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
131 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
132 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
133 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
134 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
135 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
136 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
137 break;
138 case MESA_FORMAT_RGB888:
139 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8,
140 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
141
142 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
143 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
144 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
145 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
146 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
147 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
148 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
149 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
150 break;
151 case MESA_FORMAT_RGB565:
152 SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
153 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
154
155 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
156 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
157 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
158 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
159 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
160 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
161 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
162 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
163 break;
164 case MESA_FORMAT_RGB565_REV:
165 SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
166 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
167
168 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
169 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
170 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
171 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
172 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
173 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
174 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
175 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
176 break;
177 case MESA_FORMAT_ARGB4444:
178 SETfield(t->SQ_TEX_RESOURCE1, FMT_4_4_4_4,
179 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
180
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 break;
190 case MESA_FORMAT_ARGB4444_REV:
191 SETfield(t->SQ_TEX_RESOURCE1, FMT_4_4_4_4,
192 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
193
194 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
195 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
196 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
197 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
198 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
199 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
200 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
201 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
202 break;
203 case MESA_FORMAT_ARGB1555:
204 SETfield(t->SQ_TEX_RESOURCE1, FMT_1_5_5_5,
205 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_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_W,
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_ARGB1555_REV:
217 SETfield(t->SQ_TEX_RESOURCE1, FMT_1_5_5_5,
218 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
219
220 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
221 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
222 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
223 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
224 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
225 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
226 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
227 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
228 break;
229 case MESA_FORMAT_AL88:
230 case MESA_FORMAT_AL88_REV: /* TODO : Check this. */
231 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8,
232 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
233
234 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
235 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
236 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
237 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
238 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
239 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
240 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
241 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
242 break;
243 case MESA_FORMAT_RGB332:
244 SETfield(t->SQ_TEX_RESOURCE1, FMT_3_3_2,
245 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
246
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_1,
254 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
255 break;
256 case MESA_FORMAT_A8: /* ZERO, ZERO, ZERO, X */
257 SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
258 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
259
260 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
261 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
262 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
263 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
264 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
265 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
266 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
267 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
268 break;
269 case MESA_FORMAT_L8: /* X, X, X, ONE */
270 SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
271 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
272
273 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
274 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
275 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
276 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
277 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
278 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
279 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
280 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
281 break;
282 case MESA_FORMAT_I8: /* X, X, X, X */
283 case MESA_FORMAT_CI8:
284 SETfield(t->SQ_TEX_RESOURCE1, FMT_8,
285 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
286
287 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
288 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
289 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
290 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
291 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
292 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
293 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
294 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
295 break;
296 /* YUV422 TODO conversion */ /* X, Y, Z, ONE, G8R8_G8B8 */
297 /*
298 case MESA_FORMAT_YCBCR:
299 t->SQ_TEX_RESOURCE1.bitfields.DATA_FORMAT = ;
300 break;
301 */
302 /* VUY422 TODO conversion */ /* X, Y, Z, ONE, G8R8_G8B8 */
303 /*
304 case MESA_FORMAT_YCBCR_REV:
305 t->SQ_TEX_RESOURCE1.bitfields.DATA_FORMAT = ;
306 break;
307 */
308 case MESA_FORMAT_RGB_DXT1: /* not supported yet */
309
310 break;
311 case MESA_FORMAT_RGBA_DXT1: /* not supported yet */
312
313 break;
314 case MESA_FORMAT_RGBA_DXT3: /* not supported yet */
315
316 break;
317 case MESA_FORMAT_RGBA_DXT5: /* not supported yet */
318
319 break;
320 case MESA_FORMAT_RGBA_FLOAT32:
321 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_32_32_FLOAT,
322 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
323
324 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
325 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
326 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
327 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
328 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
329 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
330 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
331 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
332 break;
333 case MESA_FORMAT_RGBA_FLOAT16:
334 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_16_16_16_FLOAT,
335 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
336
337 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
338 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
339 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
340 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
341 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
342 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
343 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
344 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
345 break;
346 case MESA_FORMAT_RGB_FLOAT32: /* X, Y, Z, ONE */
347 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_32_FLOAT,
348 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
349
350 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
351 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
352 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
353 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
354 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
355 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
356 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
357 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
358 break;
359 case MESA_FORMAT_RGB_FLOAT16:
360 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_16_16_FLOAT,
361 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
362
363 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
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_Y,
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_1,
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_ALPHA_FLOAT32: /* ZERO, ZERO, ZERO, X */
373 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_FLOAT,
374 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
375
376 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
377 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
378 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
379 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
380 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
381 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
382 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
383 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
384 break;
385 case MESA_FORMAT_ALPHA_FLOAT16: /* ZERO, ZERO, ZERO, X */
386 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_FLOAT,
387 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
388
389 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
390 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
391 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
392 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
393 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
394 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
395 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
396 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
397 break;
398 case MESA_FORMAT_LUMINANCE_FLOAT32: /* X, X, X, ONE */
399 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_FLOAT,
400 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
401
402 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
403 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
404 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
405 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
406 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
407 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
408 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
409 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
410 break;
411 case MESA_FORMAT_LUMINANCE_FLOAT16: /* X, X, X, ONE */
412 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_FLOAT,
413 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
414
415 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
416 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
417 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
418 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
419 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
420 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
421 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
422 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
423 break;
424 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
425 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_32_FLOAT,
426 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
427
428 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
429 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
430 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
431 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
432 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
433 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
434 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
435 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
436 break;
437 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
438 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_16_FLOAT,
439 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
440
441 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
442 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
443 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
444 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
445 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
446 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
447 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
448 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
449 break;
450 case MESA_FORMAT_INTENSITY_FLOAT32: /* X, X, X, X */
451 SETfield(t->SQ_TEX_RESOURCE1, FMT_32_FLOAT,
452 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
453
454 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
455 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
456 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
457 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
458 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
459 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
460 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
461 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
462 break;
463 case MESA_FORMAT_INTENSITY_FLOAT16: /* X, X, X, X */
464 SETfield(t->SQ_TEX_RESOURCE1, FMT_16_FLOAT,
465 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_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_X,
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_Z16:
477 case MESA_FORMAT_Z24_S8:
478 case MESA_FORMAT_Z32:
479 switch (mesa_format) {
480 case MESA_FORMAT_Z16:
481 SETfield(t->SQ_TEX_RESOURCE1, FMT_16,
482 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
483 break;
484 case MESA_FORMAT_Z24_S8:
485 SETfield(t->SQ_TEX_RESOURCE1, FMT_24_8,
486 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
487 break;
488 case MESA_FORMAT_Z32:
489 SETfield(t->SQ_TEX_RESOURCE1, FMT_32,
490 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
491 break;
492 };
493 switch (tObj->DepthMode) {
494 case GL_LUMINANCE: /* X, X, X, ONE */
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_1,
502 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
503 break;
504 case GL_INTENSITY: /* X, X, X, X */
505 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
506 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
507 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
508 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
509 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
510 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
511 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
512 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
513 break;
514 case GL_ALPHA: /* ZERO, ZERO, ZERO, X */
515 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
516 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
517 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
518 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
519 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_0,
520 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
521 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
522 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
523 break;
524 default:
525 return GL_FALSE;
526 }
527 break;
528 default:
529 /* Not supported format */
530 return GL_FALSE;
531 };
532
533 return GL_TRUE;
534 }
535
536 void r600SetDepthTexMode(struct gl_texture_object *tObj)
537 {
538 radeonTexObjPtr t;
539
540 if (!tObj)
541 return;
542
543 t = radeon_tex_obj(tObj);
544
545 r600GetTexFormat(tObj, tObj->Image[0][tObj->BaseLevel]->TexFormat->MesaFormat);
546
547 }
548
549 /**
550 * Compute the cached hardware register values for the given texture object.
551 *
552 * \param rmesa Context pointer
553 * \param t the r300 texture object
554 */
555 static void setup_hardware_state(context_t *rmesa, struct gl_texture_object *texObj)
556 {
557 radeonTexObj *t = radeon_tex_obj(texObj);
558 const struct gl_texture_image *firstImage;
559 int firstlevel = t->mt ? t->mt->firstLevel : 0;
560 GLuint uTexelPitch, row_align;
561
562 firstImage = t->base.Image[0][firstlevel];
563
564 if (!t->image_override) {
565 if (!r600GetTexFormat(texObj, firstImage->TexFormat->MesaFormat)) {
566 _mesa_problem(NULL, "unexpected texture format in %s",
567 __FUNCTION__);
568 return;
569 }
570 }
571
572 switch (texObj->Target) {
573 case GL_TEXTURE_1D:
574 SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_1D, DIM_shift, DIM_mask);
575 SETfield(t->SQ_TEX_RESOURCE1, 0, TEX_DEPTH_shift, TEX_DEPTH_mask);
576 break;
577 case GL_TEXTURE_2D:
578 case GL_TEXTURE_RECTANGLE_NV:
579 SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_2D, DIM_shift, DIM_mask);
580 SETfield(t->SQ_TEX_RESOURCE1, 0, TEX_DEPTH_shift, TEX_DEPTH_mask);
581 break;
582 case GL_TEXTURE_3D:
583 SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_3D, DIM_shift, DIM_mask);
584 SETfield(t->SQ_TEX_RESOURCE1, firstImage->Depth - 1, // ???
585 TEX_DEPTH_shift, TEX_DEPTH_mask);
586 break;
587 case GL_TEXTURE_CUBE_MAP:
588 SETfield(t->SQ_TEX_RESOURCE0, SQ_TEX_DIM_CUBEMAP, DIM_shift, DIM_mask);
589 SETfield(t->SQ_TEX_RESOURCE1, 0, TEX_DEPTH_shift, TEX_DEPTH_mask);
590 break;
591 default:
592 _mesa_problem(NULL, "unexpected texture target type in %s", __FUNCTION__);
593 return;
594 }
595
596 row_align = rmesa->radeon.texture_row_align - 1;
597 uTexelPitch = ((firstImage->Width * t->mt->bpp + row_align) & ~row_align) / t->mt->bpp;
598 uTexelPitch = (uTexelPitch + R700_TEXEL_PITCH_ALIGNMENT_MASK)
599 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
600
601 /* min pitch is 8 */
602 if (uTexelPitch < 8)
603 uTexelPitch = 8;
604
605 SETfield(t->SQ_TEX_RESOURCE0, (uTexelPitch/8)-1, PITCH_shift, PITCH_mask);
606 SETfield(t->SQ_TEX_RESOURCE0, firstImage->Width - 1,
607 TEX_WIDTH_shift, TEX_WIDTH_mask);
608 SETfield(t->SQ_TEX_RESOURCE1, firstImage->Height - 1,
609 TEX_HEIGHT_shift, TEX_HEIGHT_mask);
610
611 if ((t->mt->lastLevel - t->mt->firstLevel) > 0) {
612 t->SQ_TEX_RESOURCE3 = t->mt->levels[0].size / 256;
613 SETfield(t->SQ_TEX_RESOURCE4, t->mt->firstLevel, BASE_LEVEL_shift, BASE_LEVEL_mask);
614 SETfield(t->SQ_TEX_RESOURCE5, t->mt->lastLevel, LAST_LEVEL_shift, LAST_LEVEL_mask);
615 }
616 }
617
618 /**
619 * Ensure the given texture is ready for rendering.
620 *
621 * Mostly this means populating the texture object's mipmap tree.
622 */
623 static GLboolean r600_validate_texture(GLcontext * ctx, struct gl_texture_object *texObj)
624 {
625 context_t *rmesa = R700_CONTEXT(ctx);
626 radeonTexObj *t = radeon_tex_obj(texObj);
627
628 if (!radeon_validate_texture_miptree(ctx, texObj))
629 return GL_FALSE;
630
631 /* Configure the hardware registers (more precisely, the cached version
632 * of the hardware registers). */
633 setup_hardware_state(rmesa, texObj);
634
635 t->validated = GL_TRUE;
636 return GL_TRUE;
637 }
638
639 /**
640 * Ensure all enabled and complete textures are uploaded along with any buffers being used.
641 */
642 GLboolean r600ValidateBuffers(GLcontext * ctx)
643 {
644 context_t *rmesa = R700_CONTEXT(ctx);
645 struct radeon_renderbuffer *rrb;
646 int i;
647 int ret;
648
649 radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
650
651 rrb = radeon_get_colorbuffer(&rmesa->radeon);
652 /* color buffer */
653 if (rrb && rrb->bo) {
654 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
655 rrb->bo, 0,
656 RADEON_GEM_DOMAIN_VRAM);
657 }
658
659 /* depth buffer */
660 rrb = radeon_get_depthbuffer(&rmesa->radeon);
661 if (rrb && rrb->bo) {
662 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
663 rrb->bo, 0,
664 RADEON_GEM_DOMAIN_VRAM);
665 }
666
667 for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
668 radeonTexObj *t;
669
670 if (!ctx->Texture.Unit[i]._ReallyEnabled)
671 continue;
672
673 if (!r600_validate_texture(ctx, ctx->Texture.Unit[i]._Current)) {
674 _mesa_warning(ctx,
675 "failed to validate texture for unit %d.\n",
676 i);
677 }
678 t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
679 if (t->image_override && t->bo)
680 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
681 t->bo,
682 RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
683 else if (t->mt->bo)
684 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
685 t->mt->bo,
686 RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
687 }
688
689 ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, first_elem(&rmesa->radeon.dma.reserved)->bo, RADEON_GEM_DOMAIN_GTT, 0);
690 if (ret)
691 return GL_FALSE;
692 return GL_TRUE;
693 }
694
695 void r600SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
696 unsigned long long offset, GLint depth, GLuint pitch)
697 {
698 context_t *rmesa = pDRICtx->driverPrivate;
699 struct gl_texture_object *tObj =
700 _mesa_lookup_texture(rmesa->radeon.glCtx, texname);
701 radeonTexObjPtr t = radeon_tex_obj(tObj);
702 uint32_t pitch_val, size;
703
704 if (!tObj)
705 return;
706
707 t->image_override = GL_TRUE;
708
709 if (!offset)
710 return;
711
712 size = pitch;//h * w * (depth / 8);
713 if (t->bo) {
714 radeon_bo_unref(t->bo);
715 t->bo = NULL;
716 }
717 t->bo = radeon_legacy_bo_alloc_fake(rmesa->radeon.radeonScreen->bom, size, offset);
718 t->override_offset = offset;
719 pitch_val = pitch;
720 switch (depth) {
721 case 32:
722 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
723 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
724
725 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
726 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
727 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
728 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
729 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
730 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
731 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
732 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
733 pitch_val /= 4;
734 break;
735 case 24:
736 default:
737 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
738 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
739
740 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
741 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
742 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
743 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
744 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
745 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
746 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
747 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
748 pitch_val /= 4;
749 break;
750 case 16:
751 SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
752 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
753
754 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
755 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
756 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
757 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
758 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
759 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
760 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
761 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
762 pitch_val /= 2;
763 break;
764 }
765
766 pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
767 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
768
769 /* min pitch is 8 */
770 if (pitch_val < 8)
771 pitch_val = 8;
772
773 SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, PITCH_shift, PITCH_mask);
774 }
775
776 void r600SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_format, __DRIdrawable *dPriv)
777 {
778 struct gl_texture_unit *texUnit;
779 struct gl_texture_object *texObj;
780 struct gl_texture_image *texImage;
781 struct radeon_renderbuffer *rb;
782 radeon_texture_image *rImage;
783 radeonContextPtr radeon;
784 context_t *rmesa;
785 struct radeon_framebuffer *rfb;
786 radeonTexObjPtr t;
787 uint32_t pitch_val;
788 uint32_t internalFormat, type, format;
789
790 type = GL_BGRA;
791 format = GL_UNSIGNED_BYTE;
792 internalFormat = (glx_texture_format == GLX_TEXTURE_FORMAT_RGB_EXT ? 3 : 4);
793
794 radeon = pDRICtx->driverPrivate;
795 rmesa = pDRICtx->driverPrivate;
796
797 rfb = dPriv->driverPrivate;
798 texUnit = &radeon->glCtx->Texture.Unit[radeon->glCtx->Texture.CurrentUnit];
799 texObj = _mesa_select_tex_object(radeon->glCtx, texUnit, target);
800 texImage = _mesa_get_tex_image(radeon->glCtx, texObj, target, 0);
801
802 rImage = get_radeon_texture_image(texImage);
803 t = radeon_tex_obj(texObj);
804 if (t == NULL) {
805 return;
806 }
807
808 radeon_update_renderbuffers(pDRICtx, dPriv);
809 /* back & depth buffer are useless free them right away */
810 rb = (void*)rfb->base.Attachment[BUFFER_DEPTH].Renderbuffer;
811 if (rb && rb->bo) {
812 radeon_bo_unref(rb->bo);
813 rb->bo = NULL;
814 }
815 rb = (void*)rfb->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer;
816 if (rb && rb->bo) {
817 radeon_bo_unref(rb->bo);
818 rb->bo = NULL;
819 }
820 rb = rfb->color_rb[0];
821 if (rb->bo == NULL) {
822 /* Failed to BO for the buffer */
823 return;
824 }
825
826 _mesa_lock_texture(radeon->glCtx, texObj);
827 if (t->bo) {
828 radeon_bo_unref(t->bo);
829 t->bo = NULL;
830 }
831 if (rImage->bo) {
832 radeon_bo_unref(rImage->bo);
833 rImage->bo = NULL;
834 }
835 if (t->mt) {
836 radeon_miptree_unreference(t->mt);
837 t->mt = NULL;
838 }
839 if (rImage->mt) {
840 radeon_miptree_unreference(rImage->mt);
841 rImage->mt = NULL;
842 }
843 _mesa_init_teximage_fields(radeon->glCtx, target, texImage,
844 rb->base.Width, rb->base.Height, 1, 0, rb->cpp);
845 texImage->RowStride = rb->pitch / rb->cpp;
846 texImage->TexFormat = radeonChooseTextureFormat(radeon->glCtx,
847 internalFormat,
848 type, format, 0);
849 rImage->bo = rb->bo;
850 radeon_bo_ref(rImage->bo);
851 t->bo = rb->bo;
852 radeon_bo_ref(t->bo);
853 t->image_override = GL_TRUE;
854 t->override_offset = 0;
855 pitch_val = rb->pitch;
856 switch (rb->cpp) {
857 case 4:
858 if (glx_texture_format == GLX_TEXTURE_FORMAT_RGB_EXT) {
859 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
860 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
861
862 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
863 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
864 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
865 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
866 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
867 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
868 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
869 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
870 } else {
871 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
872 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
873
874 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
875 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
876 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
877 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
878 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
879 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
880 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
881 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
882 }
883 pitch_val /= 4;
884 break;
885 case 3:
886 default:
887 // FMT_8_8_8 ???
888 SETfield(t->SQ_TEX_RESOURCE1, FMT_8_8_8_8,
889 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
890
891 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_W,
892 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
893 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
894 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
895 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
896 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
897 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
898 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
899 pitch_val /= 4;
900 break;
901 case 2:
902 SETfield(t->SQ_TEX_RESOURCE1, FMT_5_6_5,
903 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask);
904
905 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Z,
906 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask);
907 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_Y,
908 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask);
909 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_X,
910 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask);
911 SETfield(t->SQ_TEX_RESOURCE4, SQ_SEL_1,
912 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask);
913 pitch_val /= 2;
914 break;
915 }
916
917 pitch_val = (pitch_val + R700_TEXEL_PITCH_ALIGNMENT_MASK)
918 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;
919
920 /* min pitch is 8 */
921 if (pitch_val < 8)
922 pitch_val = 8;
923
924 SETfield(t->SQ_TEX_RESOURCE0, (pitch_val/8)-1, PITCH_shift, PITCH_mask);
925 SETfield(t->SQ_TEX_RESOURCE0, rb->base.Width - 1,
926 TEX_WIDTH_shift, TEX_WIDTH_mask);
927 SETfield(t->SQ_TEX_RESOURCE1, rb->base.Height - 1,
928 TEX_HEIGHT_shift, TEX_HEIGHT_mask);
929
930 t->validated = GL_TRUE;
931 _mesa_unlock_texture(radeon->glCtx, texObj);
932 return;
933 }
934
935 void r600SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
936 {
937 r600SetTexBuffer2(pDRICtx, target, GLX_TEXTURE_FORMAT_RGBA_EXT, dPriv);
938 }