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 void r600UpdateTextureState(GLcontext
* ctx
);
55 void r600UpdateTextureState(GLcontext
* ctx
)
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
;
63 R600_STATECHANGE(context
, tx
);
64 R600_STATECHANGE(context
, tx_smplr
);
65 R600_STATECHANGE(context
, tx_brdr_clr
);
67 for (unit
= 0; unit
< R700_MAX_TEXTURE_UNITS
; unit
++) {
68 texUnit
= &ctx
->Texture
.Unit
[unit
];
69 t
= radeon_tex_obj(ctx
->Texture
.Unit
[unit
]._Current
);
70 r700
->textures
[unit
] = NULL
;
71 if (texUnit
->_ReallyEnabled
) {
74 r700
->textures
[unit
] = t
;
79 static GLboolean
r600GetTexFormat(struct gl_texture_object
*tObj
, gl_format mesa_format
)
81 radeonTexObj
*t
= radeon_tex_obj(tObj
);
83 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
84 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
85 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
86 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
87 CLEARbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
89 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
90 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
91 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
92 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
93 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
94 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
95 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
96 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
98 CLEARbit(t
->SQ_TEX_RESOURCE0
, TILE_TYPE_bit
);
99 SETfield(t
->SQ_TEX_RESOURCE0
, ARRAY_LINEAR_GENERAL
,
100 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift
,
101 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask
);
103 switch (mesa_format
) /* This is mesa format. */
105 case MESA_FORMAT_RGBA8888
:
106 case MESA_FORMAT_SIGNED_RGBA8888
:
107 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
108 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
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 if (mesa_format
== MESA_FORMAT_SIGNED_RGBA8888
) {
119 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
120 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
121 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
122 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
123 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
124 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
125 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
126 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
129 case MESA_FORMAT_RGBA8888_REV
:
130 case MESA_FORMAT_SIGNED_RGBA8888_REV
:
131 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
132 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
134 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
135 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
136 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
137 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
138 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
139 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
140 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
141 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
142 if (mesa_format
== MESA_FORMAT_SIGNED_RGBA8888_REV
) {
143 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
144 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
145 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
146 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
147 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
148 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
149 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
150 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
153 case MESA_FORMAT_ARGB8888
:
154 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
155 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
157 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
158 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
159 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
160 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
161 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
162 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
163 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
164 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
166 case MESA_FORMAT_XRGB8888
:
167 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
168 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
170 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
171 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
172 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
173 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
174 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
175 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
176 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
177 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
179 case MESA_FORMAT_XRGB8888_REV
:
180 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
181 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
183 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
184 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
185 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
186 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
187 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
188 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
189 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
190 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
192 case MESA_FORMAT_ARGB8888_REV
:
193 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
194 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
196 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
197 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
198 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
199 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
200 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
201 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
202 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
203 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
205 case MESA_FORMAT_RGB888
:
206 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8
,
207 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
209 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
210 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
211 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
212 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
213 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
214 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
215 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
216 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
218 case MESA_FORMAT_RGB565
:
219 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_5_6_5
,
220 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
222 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
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_X
,
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
);
231 case MESA_FORMAT_RGB565_REV
:
232 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_5_6_5
,
233 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
235 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
236 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
237 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
238 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
239 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
240 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
241 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
242 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
244 case MESA_FORMAT_ARGB4444
:
245 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_4_4_4_4
,
246 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
248 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
249 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
250 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
251 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
252 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
253 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
254 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
255 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
257 case MESA_FORMAT_ARGB4444_REV
:
258 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_4_4_4_4
,
259 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
261 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
262 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
263 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
264 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
265 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
266 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
267 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
268 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
270 case MESA_FORMAT_ARGB1555
:
271 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_1_5_5_5
,
272 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
274 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
275 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
276 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
277 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
278 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
279 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
280 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
281 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
283 case MESA_FORMAT_ARGB1555_REV
:
284 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_1_5_5_5
,
285 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
287 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
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_Z
,
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_W
,
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
);
296 case MESA_FORMAT_AL88
:
297 case MESA_FORMAT_AL88_REV
: /* TODO : Check this. */
298 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8
,
299 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
301 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
302 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
303 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
304 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
305 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
306 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
307 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
308 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
310 case MESA_FORMAT_RGB332
:
311 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_3_3_2
,
312 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
314 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
315 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
316 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
317 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
318 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
319 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
320 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
321 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
323 case MESA_FORMAT_A8
: /* ZERO, ZERO, ZERO, X */
324 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
325 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
327 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
328 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
329 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
330 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
331 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
332 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
333 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
334 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
336 case MESA_FORMAT_L8
: /* X, X, X, ONE */
337 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
338 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
340 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
341 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
342 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
343 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
344 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
345 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
346 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
347 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
349 case MESA_FORMAT_I8
: /* X, X, X, X */
350 case MESA_FORMAT_CI8
:
351 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
352 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
354 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
355 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
356 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
357 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
358 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
359 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
360 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
361 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
363 /* YUV422 TODO conversion */ /* X, Y, Z, ONE, G8R8_G8B8 */
365 case MESA_FORMAT_YCBCR:
366 t->SQ_TEX_RESOURCE1.bitfields.DATA_FORMAT = ;
369 /* VUY422 TODO conversion */ /* X, Y, Z, ONE, G8R8_G8B8 */
371 case MESA_FORMAT_YCBCR_REV:
372 t->SQ_TEX_RESOURCE1.bitfields.DATA_FORMAT = ;
375 case MESA_FORMAT_RGB_DXT1
: /* not supported yet */
376 case MESA_FORMAT_RGBA_DXT1
: /* not supported yet */
377 case MESA_FORMAT_RGBA_DXT3
: /* not supported yet */
378 case MESA_FORMAT_RGBA_DXT5
: /* not supported yet */
381 case MESA_FORMAT_RGBA_FLOAT32
:
382 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_32_32_32_FLOAT
,
383 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
385 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
386 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
387 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
388 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
389 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
390 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
391 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
392 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
394 case MESA_FORMAT_RGBA_FLOAT16
:
395 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_16_16_16_FLOAT
,
396 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
398 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
399 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
400 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
401 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
402 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
403 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
404 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
405 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
407 case MESA_FORMAT_RGB_FLOAT32
: /* X, Y, Z, ONE */
408 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_32_32_FLOAT
,
409 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
411 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
412 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
413 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
414 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
415 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
416 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
417 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
418 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
420 case MESA_FORMAT_RGB_FLOAT16
:
421 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_16_16_FLOAT
,
422 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
424 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
425 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
426 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
427 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
428 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
429 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
430 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
431 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
433 case MESA_FORMAT_ALPHA_FLOAT32
: /* ZERO, ZERO, ZERO, X */
434 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_FLOAT
,
435 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
437 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
438 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
439 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
440 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
441 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
442 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
443 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
444 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
446 case MESA_FORMAT_ALPHA_FLOAT16
: /* ZERO, ZERO, ZERO, X */
447 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_FLOAT
,
448 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
450 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
451 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
452 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
453 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
454 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
455 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
456 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
457 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
459 case MESA_FORMAT_LUMINANCE_FLOAT32
: /* X, X, X, ONE */
460 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_FLOAT
,
461 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
463 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
464 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
465 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
466 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
467 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
468 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
469 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
470 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
472 case MESA_FORMAT_LUMINANCE_FLOAT16
: /* X, X, X, ONE */
473 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_FLOAT
,
474 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
476 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
477 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
478 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
479 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
480 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
481 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
482 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
483 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
485 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
:
486 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_32_FLOAT
,
487 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
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_Y
,
496 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
498 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
:
499 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_16_FLOAT
,
500 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
502 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
503 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
504 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
505 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
506 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
507 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
508 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
509 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
511 case MESA_FORMAT_INTENSITY_FLOAT32
: /* X, X, X, X */
512 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32_FLOAT
,
513 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
515 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
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_X
,
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_X
,
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
);
524 case MESA_FORMAT_INTENSITY_FLOAT16
: /* X, X, X, X */
525 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16_FLOAT
,
526 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
528 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
529 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
530 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
531 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
532 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
533 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
534 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
535 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
537 case MESA_FORMAT_Z16
:
538 case MESA_FORMAT_X8_Z24
:
539 case MESA_FORMAT_S8_Z24
:
540 case MESA_FORMAT_Z24_S8
:
541 case MESA_FORMAT_Z32
:
543 SETbit(t
->SQ_TEX_RESOURCE0
, TILE_TYPE_bit
);
544 SETfield(t
->SQ_TEX_RESOURCE0
, ARRAY_1D_TILED_THIN1
,
545 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift
,
546 SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask
);
547 switch (mesa_format
) {
548 case MESA_FORMAT_Z16
:
549 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_16
,
550 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
552 case MESA_FORMAT_X8_Z24
:
553 case MESA_FORMAT_S8_Z24
:
554 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_24
,
555 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
557 case MESA_FORMAT_Z24_S8
:
558 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_24_8
,
559 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
561 case MESA_FORMAT_Z32
:
562 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_32
,
563 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
566 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
567 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
572 switch (tObj
->DepthMode
) {
573 case GL_LUMINANCE
: /* X, X, X, ONE */
574 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
575 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
576 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
577 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
578 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
579 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
580 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
581 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
583 case GL_INTENSITY
: /* X, X, X, X */
584 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
585 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
586 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
587 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
588 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
589 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
590 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
591 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
593 case GL_ALPHA
: /* ZERO, ZERO, ZERO, X */
594 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
595 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
596 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
597 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
598 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
599 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
600 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
601 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
607 /* EXT_texture_sRGB */
608 case MESA_FORMAT_SRGBA8
:
609 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
610 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
612 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
613 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
614 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
615 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
616 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
617 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
618 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
619 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
620 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
622 case MESA_FORMAT_SLA8
:
623 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8
,
624 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
626 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
627 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
628 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
629 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
630 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
631 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
632 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
633 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
634 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
636 case MESA_FORMAT_SL8
: /* X, X, X, ONE */
637 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8
,
638 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
640 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
641 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
642 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
643 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
644 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
645 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
646 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
647 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
648 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
651 /* Not supported format */
658 static GLuint
r600_translate_shadow_func(GLenum func
)
662 return SQ_TEX_DEPTH_COMPARE_NEVER
;
664 return SQ_TEX_DEPTH_COMPARE_LESS
;
666 return SQ_TEX_DEPTH_COMPARE_LESSEQUAL
;
668 return SQ_TEX_DEPTH_COMPARE_GREATER
;
670 return SQ_TEX_DEPTH_COMPARE_GREATEREQUAL
;
672 return SQ_TEX_DEPTH_COMPARE_NOTEQUAL
;
674 return SQ_TEX_DEPTH_COMPARE_EQUAL
;
676 return SQ_TEX_DEPTH_COMPARE_ALWAYS
;
678 WARN_ONCE("Unknown shadow compare function! %d", func
);
683 static INLINE
uint32_t
684 S_FIXED(float value
, uint32_t frac_bits
)
686 return value
* (1 << frac_bits
);
689 void r600SetDepthTexMode(struct gl_texture_object
*tObj
)
696 t
= radeon_tex_obj(tObj
);
698 if(!r600GetTexFormat(tObj
, tObj
->Image
[0][tObj
->BaseLevel
]->TexFormat
))
699 t
->validated
= GL_FALSE
;
703 * Compute the cached hardware register values for the given texture object.
705 * \param rmesa Context pointer
706 * \param t the r300 texture object
708 static GLboolean
setup_hardware_state(GLcontext
* ctx
, struct gl_texture_object
*texObj
, int unit
)
710 context_t
*rmesa
= R700_CONTEXT(ctx
);
711 radeonTexObj
*t
= radeon_tex_obj(texObj
);
712 const struct gl_texture_image
*firstImage
;
713 GLuint uTexelPitch
, row_align
;
715 if (rmesa
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
&&
720 firstImage
= t
->base
.Image
[0][t
->minLod
];
722 if (!t
->image_override
) {
723 if (!r600GetTexFormat(texObj
, firstImage
->TexFormat
)) {
724 radeon_warning("unsupported texture format in %s\n",
730 switch (texObj
->Target
) {
732 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_1D
, DIM_shift
, DIM_mask
);
733 SETfield(t
->SQ_TEX_RESOURCE1
, 0, TEX_DEPTH_shift
, TEX_DEPTH_mask
);
736 case GL_TEXTURE_RECTANGLE_NV
:
737 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_2D
, DIM_shift
, DIM_mask
);
738 SETfield(t
->SQ_TEX_RESOURCE1
, 0, TEX_DEPTH_shift
, TEX_DEPTH_mask
);
741 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_3D
, DIM_shift
, DIM_mask
);
742 SETfield(t
->SQ_TEX_RESOURCE1
, firstImage
->Depth
- 1, // ???
743 TEX_DEPTH_shift
, TEX_DEPTH_mask
);
745 case GL_TEXTURE_CUBE_MAP
:
746 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_CUBEMAP
, DIM_shift
, DIM_mask
);
747 SETfield(t
->SQ_TEX_RESOURCE1
, 0, TEX_DEPTH_shift
, TEX_DEPTH_mask
);
750 radeon_error("unexpected texture target type in %s\n", __FUNCTION__
);
754 row_align
= rmesa
->radeon
.texture_row_align
- 1;
755 uTexelPitch
= (_mesa_format_row_stride(firstImage
->TexFormat
, firstImage
->Width
) + row_align
) & ~row_align
;
756 uTexelPitch
= uTexelPitch
/ _mesa_get_format_bytes(firstImage
->TexFormat
);
757 uTexelPitch
= (uTexelPitch
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
758 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
764 SETfield(t
->SQ_TEX_RESOURCE0
, (uTexelPitch
/8)-1, PITCH_shift
, PITCH_mask
);
765 SETfield(t
->SQ_TEX_RESOURCE0
, firstImage
->Width
- 1,
766 TEX_WIDTH_shift
, TEX_WIDTH_mask
);
767 SETfield(t
->SQ_TEX_RESOURCE1
, firstImage
->Height
- 1,
768 TEX_HEIGHT_shift
, TEX_HEIGHT_mask
);
770 t
->SQ_TEX_RESOURCE2
= get_base_teximage_offset(t
) / 256;
772 t
->SQ_TEX_RESOURCE3
= radeon_miptree_image_offset(t
->mt
, 0, t
->minLod
+ 1) / 256;
774 SETfield(t
->SQ_TEX_RESOURCE4
, 0, BASE_LEVEL_shift
, BASE_LEVEL_mask
);
775 SETfield(t
->SQ_TEX_RESOURCE5
, t
->maxLod
- t
->minLod
, LAST_LEVEL_shift
, LAST_LEVEL_mask
);
777 SETfield(t
->SQ_TEX_SAMPLER1
,
778 S_FIXED(CLAMP(t
->base
.MinLod
- t
->minLod
, 0, 15), 6),
779 MIN_LOD_shift
, MIN_LOD_mask
);
780 SETfield(t
->SQ_TEX_SAMPLER1
,
781 S_FIXED(CLAMP(t
->base
.MaxLod
- t
->minLod
, 0, 15), 6),
782 MAX_LOD_shift
, MAX_LOD_mask
);
783 SETfield(t
->SQ_TEX_SAMPLER1
,
784 S_FIXED(CLAMP(ctx
->Texture
.Unit
[unit
].LodBias
+ t
->base
.LodBias
, -16, 16), 6),
785 SQ_TEX_SAMPLER_WORD1_0__LOD_BIAS_shift
, SQ_TEX_SAMPLER_WORD1_0__LOD_BIAS_mask
);
787 if(texObj
->CompareMode
== GL_COMPARE_R_TO_TEXTURE_ARB
)
789 SETfield(t
->SQ_TEX_SAMPLER0
, r600_translate_shadow_func(texObj
->CompareFunc
), DEPTH_COMPARE_FUNCTION_shift
, DEPTH_COMPARE_FUNCTION_mask
);
793 CLEARfield(t
->SQ_TEX_SAMPLER0
, DEPTH_COMPARE_FUNCTION_mask
);
800 * Ensure the given texture is ready for rendering.
802 * Mostly this means populating the texture object's mipmap tree.
804 static GLboolean
r600_validate_texture(GLcontext
* ctx
, struct gl_texture_object
*texObj
, int unit
)
806 radeonTexObj
*t
= radeon_tex_obj(texObj
);
808 if (!radeon_validate_texture_miptree(ctx
, texObj
))
811 /* Configure the hardware registers (more precisely, the cached version
812 * of the hardware registers). */
813 if (!setup_hardware_state(ctx
, texObj
, unit
))
816 t
->validated
= GL_TRUE
;
821 * Ensure all enabled and complete textures are uploaded along with any buffers being used.
823 GLboolean
r600ValidateBuffers(GLcontext
* ctx
)
825 context_t
*rmesa
= R700_CONTEXT(ctx
);
826 struct radeon_renderbuffer
*rrb
;
827 struct radeon_bo
*pbo
;
831 radeon_cs_space_reset_bos(rmesa
->radeon
.cmdbuf
.cs
);
833 rrb
= radeon_get_colorbuffer(&rmesa
->radeon
);
835 if (rrb
&& rrb
->bo
) {
836 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
838 RADEON_GEM_DOMAIN_VRAM
);
842 rrb
= radeon_get_depthbuffer(&rmesa
->radeon
);
843 if (rrb
&& rrb
->bo
) {
844 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
846 RADEON_GEM_DOMAIN_VRAM
);
849 for (i
= 0; i
< ctx
->Const
.MaxTextureImageUnits
; ++i
) {
852 if (!ctx
->Texture
.Unit
[i
]._ReallyEnabled
)
855 if (!r600_validate_texture(ctx
, ctx
->Texture
.Unit
[i
]._Current
, i
)) {
856 radeon_warning("failed to validate texture for unit %d.\n", i
);
858 t
= radeon_tex_obj(ctx
->Texture
.Unit
[i
]._Current
);
859 if (t
->image_override
&& t
->bo
)
860 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
862 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
864 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
866 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
869 pbo
= (struct radeon_bo
*)r700GetActiveFpShaderBo(ctx
);
871 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
872 RADEON_GEM_DOMAIN_GTT
, 0);
875 pbo
= (struct radeon_bo
*)r700GetActiveVpShaderBo(ctx
);
877 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
878 RADEON_GEM_DOMAIN_GTT
, 0);
881 ret
= radeon_cs_space_check_with_bo(rmesa
->radeon
.cmdbuf
.cs
, first_elem(&rmesa
->radeon
.dma
.reserved
)->bo
, RADEON_GEM_DOMAIN_GTT
, 0);
887 void r600SetTexOffset(__DRIcontext
* pDRICtx
, GLint texname
,
888 unsigned long long offset
, GLint depth
, GLuint pitch
)
890 context_t
*rmesa
= pDRICtx
->driverPrivate
;
891 struct gl_texture_object
*tObj
=
892 _mesa_lookup_texture(rmesa
->radeon
.glCtx
, texname
);
893 radeonTexObjPtr t
= radeon_tex_obj(tObj
);
894 const struct gl_texture_image
*firstImage
;
895 uint32_t pitch_val
, size
, row_align
;
900 t
->image_override
= GL_TRUE
;
905 firstImage
= t
->base
.Image
[0][t
->minLod
];
906 row_align
= rmesa
->radeon
.texture_row_align
- 1;
907 size
= ((_mesa_format_row_stride(firstImage
->TexFormat
, firstImage
->Width
) + row_align
) & ~row_align
) * firstImage
->Height
;
909 radeon_bo_unref(t
->bo
);
912 t
->bo
= radeon_legacy_bo_alloc_fake(rmesa
->radeon
.radeonScreen
->bom
, size
, offset
);
913 t
->override_offset
= offset
;
917 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
918 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
920 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
921 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
922 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
923 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
924 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
925 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
926 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
927 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
932 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
933 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
935 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
936 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
937 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
938 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
939 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
940 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
941 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
942 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
946 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_5_6_5
,
947 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
949 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
950 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
951 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
952 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
953 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
954 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
955 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
956 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
961 pitch_val
= (pitch_val
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
962 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
968 SETfield(t
->SQ_TEX_RESOURCE0
, (pitch_val
/8)-1, PITCH_shift
, PITCH_mask
);
971 void r600SetTexBuffer2(__DRIcontext
*pDRICtx
, GLint target
, GLint glx_texture_format
, __DRIdrawable
*dPriv
)
973 struct gl_texture_unit
*texUnit
;
974 struct gl_texture_object
*texObj
;
975 struct gl_texture_image
*texImage
;
976 struct radeon_renderbuffer
*rb
;
977 radeon_texture_image
*rImage
;
978 radeonContextPtr radeon
;
980 struct radeon_framebuffer
*rfb
;
983 uint32_t internalFormat
, type
, format
;
986 format
= GL_UNSIGNED_BYTE
;
987 internalFormat
= (glx_texture_format
== __DRI_TEXTURE_FORMAT_RGB
? 3 : 4);
989 radeon
= pDRICtx
->driverPrivate
;
990 rmesa
= pDRICtx
->driverPrivate
;
992 rfb
= dPriv
->driverPrivate
;
993 texUnit
= &radeon
->glCtx
->Texture
.Unit
[radeon
->glCtx
->Texture
.CurrentUnit
];
994 texObj
= _mesa_select_tex_object(radeon
->glCtx
, texUnit
, target
);
995 texImage
= _mesa_get_tex_image(radeon
->glCtx
, texObj
, target
, 0);
997 rImage
= get_radeon_texture_image(texImage
);
998 t
= radeon_tex_obj(texObj
);
1003 radeon_update_renderbuffers(pDRICtx
, dPriv
, GL_TRUE
);
1004 rb
= rfb
->color_rb
[0];
1005 if (rb
->bo
== NULL
) {
1006 /* Failed to BO for the buffer */
1010 _mesa_lock_texture(radeon
->glCtx
, texObj
);
1012 radeon_bo_unref(t
->bo
);
1016 radeon_bo_unref(rImage
->bo
);
1020 radeon_miptree_unreference(&t
->mt
);
1021 radeon_miptree_unreference(&rImage
->mt
);
1023 _mesa_init_teximage_fields(radeon
->glCtx
, target
, texImage
,
1024 rb
->base
.Width
, rb
->base
.Height
, 1, 0, rb
->cpp
);
1025 texImage
->RowStride
= rb
->pitch
/ rb
->cpp
;
1027 rImage
->bo
= rb
->bo
;
1028 radeon_bo_ref(rImage
->bo
);
1030 radeon_bo_ref(t
->bo
);
1031 t
->image_override
= GL_TRUE
;
1032 t
->override_offset
= 0;
1033 pitch_val
= rb
->pitch
;
1036 if (glx_texture_format
== __DRI_TEXTURE_FORMAT_RGB
) {
1037 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
1038 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
1040 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1041 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1042 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1043 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1044 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1045 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1046 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1047 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1049 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
1050 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
1052 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1053 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1054 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1055 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1056 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1057 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1058 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1059 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1066 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_8_8_8_8
,
1067 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
1069 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1070 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1071 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1072 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1073 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1074 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1075 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1076 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1080 SETfield(t
->SQ_TEX_RESOURCE1
, FMT_5_6_5
,
1081 SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift
, SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask
);
1083 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1084 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1085 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1086 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1087 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1088 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1089 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1090 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1095 pitch_val
= (pitch_val
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
1096 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
1098 /* min pitch is 8 */
1102 SETfield(t
->SQ_TEX_RESOURCE0
, (pitch_val
/8)-1, PITCH_shift
, PITCH_mask
);
1103 SETfield(t
->SQ_TEX_RESOURCE0
, rb
->base
.Width
- 1,
1104 TEX_WIDTH_shift
, TEX_WIDTH_mask
);
1105 SETfield(t
->SQ_TEX_RESOURCE1
, rb
->base
.Height
- 1,
1106 TEX_HEIGHT_shift
, TEX_HEIGHT_mask
);
1108 t
->validated
= GL_TRUE
;
1109 _mesa_unlock_texture(radeon
->glCtx
, texObj
);
1113 void r600SetTexBuffer(__DRIcontext
*pDRICtx
, GLint target
, __DRIdrawable
*dPriv
)
1115 r600SetTexBuffer2(pDRICtx
, target
, __DRI_TEXTURE_FORMAT_RGBA
, dPriv
);