2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
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.
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:
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.
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.
28 **************************************************************************/
33 * \author Keith Whitwell <keith@tungstengraphics.com>
35 * \todo Enable R300 texture tiling code?
38 #include "main/glheader.h"
39 #include "main/imports.h"
40 #include "main/context.h"
41 #include "main/macros.h"
42 #include "main/teximage.h"
43 #include "main/texobj.h"
44 #include "main/enums.h"
45 #include "main/simple_list.h"
47 #include "r600_context.h"
48 #include "radeon_mipmap_tree.h"
50 #include "r700_fragprog.h"
51 #include "r700_vertprog.h"
53 #include "evergreen_tex.h"
55 void r600UpdateTextureState(GLcontext
* ctx
);
57 void r600UpdateTextureState(GLcontext
* ctx
)
59 context_t
*context
= R700_CONTEXT(ctx
);
60 R700_CHIP_CONTEXT
*r700
= (R700_CHIP_CONTEXT
*)(&context
->hw
);
61 struct gl_texture_unit
*texUnit
;
62 struct radeon_tex_obj
*t
;
65 R600_STATECHANGE(context
, tx
);
66 R600_STATECHANGE(context
, tx_smplr
);
67 R600_STATECHANGE(context
, tx_brdr_clr
);
69 for (unit
= 0; unit
< R700_MAX_TEXTURE_UNITS
; unit
++) {
70 texUnit
= &ctx
->Texture
.Unit
[unit
];
71 t
= radeon_tex_obj(ctx
->Texture
.Unit
[unit
]._Current
);
72 r700
->textures
[unit
] = NULL
;
73 if (texUnit
->_ReallyEnabled
) {
76 r700
->textures
[unit
] = t
;
81 static GLboolean
r600GetTexFormat(struct gl_texture_object
*tObj
, gl_format mesa_format
)
83 radeonTexObj
*t
= radeon_tex_obj(tObj
);
85 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
86 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
87 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
88 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
89 CLEARbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
91 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
92 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
93 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
94 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
95 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
96 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
97 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
98 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
100 CLEARbit(t
->SQ_TEX_RESOURCE0
, TILE_TYPE_bit
);
101 SETfield(t
->SQ_TEX_RESOURCE0
, ARRAY_LINEAR_GENERAL
,
102 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift
,
103 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask
);
105 switch (mesa_format
) /* This is mesa format. */
107 case MESA_FORMAT_RGBA8888
:
108 case MESA_FORMAT_SIGNED_RGBA8888
:
109 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
110 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
112 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
113 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
114 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
115 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
116 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
117 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
118 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
119 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
120 if (mesa_format
== MESA_FORMAT_SIGNED_RGBA8888
) {
121 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
122 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
123 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
124 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
125 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
126 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
127 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
128 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
131 case MESA_FORMAT_RGBA8888_REV
:
132 case MESA_FORMAT_SIGNED_RGBA8888_REV
:
133 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
134 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
136 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
137 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
138 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
139 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
140 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
141 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
142 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
143 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
144 if (mesa_format
== MESA_FORMAT_SIGNED_RGBA8888_REV
) {
145 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
146 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
147 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
148 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
149 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
150 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
151 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
152 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
155 case MESA_FORMAT_ARGB8888
:
156 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
157 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
159 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
160 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
161 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
162 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
163 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
164 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
165 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
166 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
168 case MESA_FORMAT_XRGB8888
:
169 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
170 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
172 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
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_Y
,
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_X
,
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_1
,
179 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
181 case MESA_FORMAT_XRGB8888_REV
:
182 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
183 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
185 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
186 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
187 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
188 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
189 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
190 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
191 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
192 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
194 case MESA_FORMAT_ARGB8888_REV
:
195 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
196 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
198 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
199 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
200 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
201 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
202 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
203 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
204 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
205 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
207 case MESA_FORMAT_RGB888
:
208 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8
,
209 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
211 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
212 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
213 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
214 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
215 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
216 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
217 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
218 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
220 case MESA_FORMAT_RGB565
:
221 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_5_6_5
,
222 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
224 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
225 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
226 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
227 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
228 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
229 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
230 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
231 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
233 case MESA_FORMAT_RGB565_REV
:
234 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_5_6_5
,
235 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
237 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
238 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
239 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
240 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
241 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
242 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
243 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
244 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
246 case MESA_FORMAT_ARGB4444
:
247 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_4_4_4_4
,
248 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
250 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
251 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
252 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
253 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
254 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
255 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
256 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
257 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
259 case MESA_FORMAT_ARGB4444_REV
:
260 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_4_4_4_4
,
261 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
263 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
264 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
265 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
266 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
267 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
268 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
269 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
270 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
272 case MESA_FORMAT_ARGB1555
:
273 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_1_5_5_5
,
274 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
276 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
277 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
278 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
279 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
280 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
281 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
282 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
283 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
285 case MESA_FORMAT_ARGB1555_REV
:
286 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_1_5_5_5
,
287 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
289 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
290 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
291 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
292 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
293 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
294 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
295 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
296 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
298 case MESA_FORMAT_AL88
:
299 case MESA_FORMAT_AL88_REV
: /* TODO : Check this. */
300 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8
,
301 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
303 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
304 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
305 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
306 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
307 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
308 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
309 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
310 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
312 case MESA_FORMAT_RGB332
:
313 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_3_3_2
,
314 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
316 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
317 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
318 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
319 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
320 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
321 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
322 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
323 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
325 case MESA_FORMAT_A8
: /* ZERO, ZERO, ZERO, X */
326 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
327 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
329 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
330 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
331 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
332 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
333 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
334 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
335 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
336 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
338 case MESA_FORMAT_L8
: /* X, X, X, ONE */
339 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
340 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
342 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
343 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
344 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
345 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
346 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
347 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
348 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
349 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
351 case MESA_FORMAT_I8
: /* X, X, X, X */
352 case MESA_FORMAT_CI8
:
353 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
354 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
356 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
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_X
,
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_X
,
363 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
365 /* YUV422 TODO conversion */ /* X, Y, Z, ONE, G8R8_G8B8 */
367 case MESA_FORMAT_YCBCR:
368 t->SQ_TEX_RESOURCE1.bitfields.DATA_FORMAT = ;
371 /* VUY422 TODO conversion */ /* X, Y, Z, ONE, G8R8_G8B8 */
373 case MESA_FORMAT_YCBCR_REV:
374 t->SQ_TEX_RESOURCE1.bitfields.DATA_FORMAT = ;
377 case MESA_FORMAT_RGB_DXT1
: /* not supported yet */
378 case MESA_FORMAT_RGBA_DXT1
: /* not supported yet */
379 case MESA_FORMAT_RGBA_DXT3
: /* not supported yet */
380 case MESA_FORMAT_RGBA_DXT5
: /* not supported yet */
383 case MESA_FORMAT_RGBA_FLOAT32
:
384 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_32_32_32_FLOAT
,
385 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
387 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
388 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
389 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
390 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
391 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
392 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
393 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
394 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
396 case MESA_FORMAT_RGBA_FLOAT16
:
397 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_16_16_16_FLOAT
,
398 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
400 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
401 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
402 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
403 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
404 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
405 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
406 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
407 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
409 case MESA_FORMAT_RGB_FLOAT32
: /* X, Y, Z, ONE */
410 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_32_32_FLOAT
,
411 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
413 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
414 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
415 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
416 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
417 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
418 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
419 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
420 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
422 case MESA_FORMAT_RGB_FLOAT16
:
423 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_16_16_FLOAT
,
424 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
426 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
427 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
428 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
429 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
430 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
431 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
432 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
433 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
435 case MESA_FORMAT_ALPHA_FLOAT32
: /* ZERO, ZERO, ZERO, X */
436 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_FLOAT
,
437 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
439 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
440 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
441 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
442 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
443 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
444 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
445 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
446 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
448 case MESA_FORMAT_ALPHA_FLOAT16
: /* ZERO, ZERO, ZERO, X */
449 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_FLOAT
,
450 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
452 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
453 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
454 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
455 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
456 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
457 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
458 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
459 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
461 case MESA_FORMAT_LUMINANCE_FLOAT32
: /* X, X, X, ONE */
462 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_FLOAT
,
463 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
465 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
466 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
467 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
468 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
469 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
470 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
471 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
472 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
474 case MESA_FORMAT_LUMINANCE_FLOAT16
: /* X, X, X, ONE */
475 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_FLOAT
,
476 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
478 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
479 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
480 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
481 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
482 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
483 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
484 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
485 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
487 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
:
488 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_32_FLOAT
,
489 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
491 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
492 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
493 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
494 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
495 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
496 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
497 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
498 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
500 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
:
501 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_16_FLOAT
,
502 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
504 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
505 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
506 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
507 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
508 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
509 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
510 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
511 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
513 case MESA_FORMAT_INTENSITY_FLOAT32
: /* X, X, X, X */
514 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_FLOAT
,
515 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
517 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
518 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
519 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
520 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
521 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
522 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
523 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
524 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
526 case MESA_FORMAT_INTENSITY_FLOAT16
: /* X, X, X, X */
527 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_FLOAT
,
528 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
530 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
531 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
532 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
533 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
534 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
535 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
536 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
537 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
539 case MESA_FORMAT_Z16
:
540 case MESA_FORMAT_X8_Z24
:
541 case MESA_FORMAT_S8_Z24
:
542 case MESA_FORMAT_Z24_S8
:
543 case MESA_FORMAT_Z32
:
545 SETbit(t
->SQ_TEX_RESOURCE0
, TILE_TYPE_bit
);
546 SETfield(t
->SQ_TEX_RESOURCE0
, ARRAY_1D_TILED_THIN1
,
547 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift
,
548 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask
);
549 switch (mesa_format
) {
550 case MESA_FORMAT_Z16
:
551 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16
,
552 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
554 case MESA_FORMAT_X8_Z24
:
555 case MESA_FORMAT_S8_Z24
:
556 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_24
,
557 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
559 case MESA_FORMAT_Z24_S8
:
560 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_24_8
,
561 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
563 case MESA_FORMAT_Z32
:
564 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32
,
565 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
568 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
569 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
574 switch (tObj
->DepthMode
) {
575 case GL_LUMINANCE
: /* X, X, X, ONE */
576 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
577 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
578 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
579 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
580 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
581 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
582 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
583 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
585 case GL_INTENSITY
: /* X, X, X, X */
586 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
587 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
588 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
589 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
590 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
591 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
592 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
593 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
595 case GL_ALPHA
: /* ZERO, ZERO, ZERO, X */
596 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
597 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
598 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
599 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
600 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
601 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
602 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
603 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
609 /* EXT_texture_sRGB */
610 case MESA_FORMAT_SARGB8
:
611 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
612 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
614 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
615 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
616 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
617 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
618 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
619 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
620 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
621 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
622 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
624 case MESA_FORMAT_SLA8
:
625 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8
,
626 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
628 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
629 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
630 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
631 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
632 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
633 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
634 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
635 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
636 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
638 case MESA_FORMAT_SL8
: /* X, X, X, ONE */
639 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
640 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
642 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
643 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
644 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
645 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
646 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
647 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
648 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
649 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
650 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
653 /* Not supported format */
660 static GLuint
r600_translate_shadow_func(GLenum func
)
664 return SQ_TEX_DEPTH_COMPARE_NEVER
;
666 return SQ_TEX_DEPTH_COMPARE_LESS
;
668 return SQ_TEX_DEPTH_COMPARE_LESSEQUAL
;
670 return SQ_TEX_DEPTH_COMPARE_GREATER
;
672 return SQ_TEX_DEPTH_COMPARE_GREATEREQUAL
;
674 return SQ_TEX_DEPTH_COMPARE_NOTEQUAL
;
676 return SQ_TEX_DEPTH_COMPARE_EQUAL
;
678 return SQ_TEX_DEPTH_COMPARE_ALWAYS
;
680 WARN_ONCE("Unknown shadow compare function! %d", func
);
685 static INLINE
uint32_t
686 S_FIXED(float value
, uint32_t frac_bits
)
688 return value
* (1 << frac_bits
);
691 void r600SetDepthTexMode(struct gl_texture_object
*tObj
)
698 t
= radeon_tex_obj(tObj
);
700 if(!r600GetTexFormat(tObj
, tObj
->Image
[0][tObj
->BaseLevel
]->TexFormat
))
701 t
->validated
= GL_FALSE
;
705 * Compute the cached hardware register values for the given texture object.
707 * \param rmesa Context pointer
708 * \param t the r300 texture object
710 static GLboolean
setup_hardware_state(GLcontext
* ctx
, struct gl_texture_object
*texObj
, int unit
)
712 context_t
*rmesa
= R700_CONTEXT(ctx
);
713 radeonTexObj
*t
= radeon_tex_obj(texObj
);
714 const struct gl_texture_image
*firstImage
;
715 GLuint uTexelPitch
, row_align
;
717 if (rmesa
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
&&
722 firstImage
= t
->base
.Image
[0][t
->minLod
];
724 if (!t
->image_override
) {
725 if (!r600GetTexFormat(texObj
, firstImage
->TexFormat
)) {
726 radeon_warning("unsupported texture format in %s\n",
732 switch (texObj
->Target
) {
734 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_1D
, DIM_shift
, DIM_mask
);
735 SETfield(t
->SQ_TEX_RESOURCE1
, 0, TEX_DEPTH_shift
, TEX_DEPTH_mask
);
738 case GL_TEXTURE_RECTANGLE_NV
:
739 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_2D
, DIM_shift
, DIM_mask
);
740 SETfield(t
->SQ_TEX_RESOURCE1
, 0, TEX_DEPTH_shift
, TEX_DEPTH_mask
);
743 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_3D
, DIM_shift
, DIM_mask
);
744 SETfield(t
->SQ_TEX_RESOURCE1
, firstImage
->Depth
- 1, // ???
745 TEX_DEPTH_shift
, TEX_DEPTH_mask
);
747 case GL_TEXTURE_CUBE_MAP
:
748 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_CUBEMAP
, DIM_shift
, DIM_mask
);
749 SETfield(t
->SQ_TEX_RESOURCE1
, 0, TEX_DEPTH_shift
, TEX_DEPTH_mask
);
752 radeon_error("unexpected texture target type in %s\n", __FUNCTION__
);
756 row_align
= rmesa
->radeon
.texture_row_align
- 1;
757 uTexelPitch
= (_mesa_format_row_stride(firstImage
->TexFormat
, firstImage
->Width
) + row_align
) & ~row_align
;
758 uTexelPitch
= uTexelPitch
/ _mesa_get_format_bytes(firstImage
->TexFormat
);
759 uTexelPitch
= (uTexelPitch
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
760 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
766 SETfield(t
->SQ_TEX_RESOURCE0
, (uTexelPitch
/8)-1, PITCH_shift
, PITCH_mask
);
767 SETfield(t
->SQ_TEX_RESOURCE0
, firstImage
->Width
- 1,
768 TEX_WIDTH_shift
, TEX_WIDTH_mask
);
769 SETfield(t
->SQ_TEX_RESOURCE1
, firstImage
->Height
- 1,
770 TEX_HEIGHT_shift
, TEX_HEIGHT_mask
);
772 t
->SQ_TEX_RESOURCE2
= get_base_teximage_offset(t
) / 256;
774 t
->SQ_TEX_RESOURCE3
= radeon_miptree_image_offset(t
->mt
, 0, t
->minLod
+ 1) / 256;
776 SETfield(t
->SQ_TEX_RESOURCE4
, 0, BASE_LEVEL_shift
, BASE_LEVEL_mask
);
777 SETfield(t
->SQ_TEX_RESOURCE5
, t
->maxLod
- t
->minLod
, LAST_LEVEL_shift
, LAST_LEVEL_mask
);
779 SETfield(t
->SQ_TEX_SAMPLER1
,
780 S_FIXED(CLAMP(t
->base
.MinLod
- t
->minLod
, 0, 15), 6),
781 MIN_LOD_shift
, MIN_LOD_mask
);
782 SETfield(t
->SQ_TEX_SAMPLER1
,
783 S_FIXED(CLAMP(t
->base
.MaxLod
- t
->minLod
, 0, 15), 6),
784 MAX_LOD_shift
, MAX_LOD_mask
);
785 SETfield(t
->SQ_TEX_SAMPLER1
,
786 S_FIXED(CLAMP(ctx
->Texture
.Unit
[unit
].LodBias
+ t
->base
.LodBias
, -16, 16), 6),
787 SQ_TEX_SAMPLER_WORD1_0__LOD_BIAS_shift
, SQ_TEX_SAMPLER_WORD1_0__LOD_BIAS_mask
);
789 if(texObj
->CompareMode
== GL_COMPARE_R_TO_TEXTURE_ARB
)
791 SETfield(t
->SQ_TEX_SAMPLER0
, r600_translate_shadow_func(texObj
->CompareFunc
), DEPTH_COMPARE_FUNCTION_shift
, DEPTH_COMPARE_FUNCTION_mask
);
795 CLEARfield(t
->SQ_TEX_SAMPLER0
, DEPTH_COMPARE_FUNCTION_mask
);
802 * Ensure the given texture is ready for rendering.
804 * Mostly this means populating the texture object's mipmap tree.
806 static GLboolean
r600_validate_texture(GLcontext
* ctx
, struct gl_texture_object
*texObj
, int unit
)
808 radeonTexObj
*t
= radeon_tex_obj(texObj
);
810 if (!radeon_validate_texture_miptree(ctx
, texObj
))
813 /* Configure the hardware registers (more precisely, the cached version
814 * of the hardware registers). */
815 if (!setup_hardware_state(ctx
, texObj
, unit
))
818 t
->validated
= GL_TRUE
;
823 * Ensure all enabled and complete textures are uploaded along with any buffers being used.
825 GLboolean
r600ValidateBuffers(GLcontext
* ctx
)
827 context_t
*rmesa
= R700_CONTEXT(ctx
);
828 struct radeon_renderbuffer
*rrb
;
829 struct radeon_bo
*pbo
;
833 radeon_cs_space_reset_bos(rmesa
->radeon
.cmdbuf
.cs
);
835 rrb
= radeon_get_colorbuffer(&rmesa
->radeon
);
837 if (rrb
&& rrb
->bo
) {
838 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
840 RADEON_GEM_DOMAIN_VRAM
);
844 rrb
= radeon_get_depthbuffer(&rmesa
->radeon
);
845 if (rrb
&& rrb
->bo
) {
846 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
848 RADEON_GEM_DOMAIN_VRAM
);
851 for (i
= 0; i
< ctx
->Const
.MaxTextureImageUnits
; ++i
) {
854 if (!ctx
->Texture
.Unit
[i
]._ReallyEnabled
)
857 if (!r600_validate_texture(ctx
, ctx
->Texture
.Unit
[i
]._Current
, i
)) {
858 radeon_warning("failed to validate texture for unit %d.\n", i
);
860 t
= radeon_tex_obj(ctx
->Texture
.Unit
[i
]._Current
);
861 if (t
->image_override
&& t
->bo
)
862 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
864 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
866 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
868 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
871 pbo
= (struct radeon_bo
*)r700GetActiveFpShaderBo(ctx
);
873 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
874 RADEON_GEM_DOMAIN_GTT
, 0);
877 pbo
= (struct radeon_bo
*)r700GetActiveVpShaderBo(ctx
);
879 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
880 RADEON_GEM_DOMAIN_GTT
, 0);
883 pbo
= (struct radeon_bo
*)r700GetActiveFpShaderConstBo(ctx
);
885 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
886 RADEON_GEM_DOMAIN_GTT
, 0);
889 pbo
= (struct radeon_bo
*)r700GetActiveVpShaderConstBo(ctx
);
891 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
892 RADEON_GEM_DOMAIN_GTT
, 0);
895 ret
= radeon_cs_space_check_with_bo(rmesa
->radeon
.cmdbuf
.cs
, first_elem(&rmesa
->radeon
.dma
.reserved
)->bo
, RADEON_GEM_DOMAIN_GTT
, 0);
901 void r600SetTexOffset(__DRIcontext
* pDRICtx
, GLint texname
,
902 unsigned long long offset
, GLint depth
, GLuint pitch
)
904 context_t
*rmesa
= pDRICtx
->driverPrivate
;
905 struct gl_texture_object
*tObj
=
906 _mesa_lookup_texture(rmesa
->radeon
.glCtx
, texname
);
907 radeonTexObjPtr t
= radeon_tex_obj(tObj
);
908 const struct gl_texture_image
*firstImage
;
909 uint32_t pitch_val
, size
, row_align
;
914 if(rmesa
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_CEDAR
)
916 evergreenSetTexOffset(pDRICtx
, texname
, offset
, depth
, pitch
);
920 t
->image_override
= GL_TRUE
;
925 firstImage
= t
->base
.Image
[0][t
->minLod
];
926 row_align
= rmesa
->radeon
.texture_row_align
- 1;
927 size
= ((_mesa_format_row_stride(firstImage
->TexFormat
, firstImage
->Width
) + row_align
) & ~row_align
) * firstImage
->Height
;
929 radeon_bo_unref(t
->bo
);
932 t
->bo
= radeon_legacy_bo_alloc_fake(rmesa
->radeon
.radeonScreen
->bom
, size
, offset
);
933 t
->override_offset
= offset
;
937 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
938 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
940 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
941 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
942 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
943 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
944 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
945 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
946 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
947 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
952 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
953 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
955 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
956 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
957 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
958 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
959 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
960 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
961 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
962 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
966 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_5_6_5
,
967 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
969 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
970 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
971 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
972 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
973 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
974 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
975 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
976 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
981 pitch_val
= (pitch_val
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
982 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
988 SETfield(t
->SQ_TEX_RESOURCE0
, (pitch_val
/8)-1, PITCH_shift
, PITCH_mask
);
991 void r600SetTexBuffer2(__DRIcontext
*pDRICtx
, GLint target
, GLint glx_texture_format
, __DRIdrawable
*dPriv
)
993 struct gl_texture_unit
*texUnit
;
994 struct gl_texture_object
*texObj
;
995 struct gl_texture_image
*texImage
;
996 struct radeon_renderbuffer
*rb
;
997 radeon_texture_image
*rImage
;
998 radeonContextPtr radeon
;
1000 struct radeon_framebuffer
*rfb
;
1003 uint32_t internalFormat
, type
, format
;
1006 format
= GL_UNSIGNED_BYTE
;
1007 internalFormat
= (glx_texture_format
== __DRI_TEXTURE_FORMAT_RGB
? 3 : 4);
1009 radeon
= pDRICtx
->driverPrivate
;
1010 rmesa
= pDRICtx
->driverPrivate
;
1012 if(rmesa
->radeon
.radeonScreen
->chip_family
>= CHIP_FAMILY_CEDAR
)
1014 evergreenSetTexBuffer(pDRICtx
, target
, glx_texture_format
, dPriv
);
1018 rfb
= dPriv
->driverPrivate
;
1019 texUnit
= &radeon
->glCtx
->Texture
.Unit
[radeon
->glCtx
->Texture
.CurrentUnit
];
1020 texObj
= _mesa_select_tex_object(radeon
->glCtx
, texUnit
, target
);
1021 texImage
= _mesa_get_tex_image(radeon
->glCtx
, texObj
, target
, 0);
1023 rImage
= get_radeon_texture_image(texImage
);
1024 t
= radeon_tex_obj(texObj
);
1029 radeon_update_renderbuffers(pDRICtx
, dPriv
, GL_TRUE
);
1030 rb
= rfb
->color_rb
[0];
1031 if (rb
->bo
== NULL
) {
1032 /* Failed to BO for the buffer */
1036 _mesa_lock_texture(radeon
->glCtx
, texObj
);
1038 radeon_bo_unref(t
->bo
);
1042 radeon_bo_unref(rImage
->bo
);
1046 radeon_miptree_unreference(&t
->mt
);
1047 radeon_miptree_unreference(&rImage
->mt
);
1049 _mesa_init_teximage_fields(radeon
->glCtx
, target
, texImage
,
1050 rb
->base
.Width
, rb
->base
.Height
, 1, 0, rb
->cpp
);
1051 texImage
->RowStride
= rb
->pitch
/ rb
->cpp
;
1053 rImage
->bo
= rb
->bo
;
1054 radeon_bo_ref(rImage
->bo
);
1056 radeon_bo_ref(t
->bo
);
1057 t
->image_override
= GL_TRUE
;
1058 t
->override_offset
= 0;
1059 pitch_val
= rb
->pitch
;
1062 if (glx_texture_format
== __DRI_TEXTURE_FORMAT_RGB
) {
1063 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
1064 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
1066 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1067 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1068 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1069 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1070 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1071 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1072 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1073 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1075 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
1076 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
1078 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1079 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1080 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1081 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1082 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1083 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1084 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1085 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1092 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
1093 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
1095 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1096 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1097 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1098 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1099 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1100 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1101 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1102 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1106 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_5_6_5
,
1107 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
1109 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1110 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1111 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1112 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1113 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1114 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1115 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1116 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1121 pitch_val
= (pitch_val
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
1122 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
1124 /* min pitch is 8 */
1128 SETfield(t
->SQ_TEX_RESOURCE0
, (pitch_val
/8)-1, PITCH_shift
, PITCH_mask
);
1129 SETfield(t
->SQ_TEX_RESOURCE0
, rb
->base
.Width
- 1,
1130 TEX_WIDTH_shift
, TEX_WIDTH_mask
);
1131 SETfield(t
->SQ_TEX_RESOURCE1
, rb
->base
.Height
- 1,
1132 TEX_HEIGHT_shift
, TEX_HEIGHT_mask
);
1134 t
->validated
= GL_TRUE
;
1135 _mesa_unlock_texture(radeon
->glCtx
, texObj
);
1139 void r600SetTexBuffer(__DRIcontext
*pDRICtx
, GLint target
, __DRIdrawable
*dPriv
)
1141 r600SetTexBuffer2(pDRICtx
, target
, __DRI_TEXTURE_FORMAT_RGBA
, dPriv
);