2 * Copyright (C) 2008-2010 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 * Richard Li <RichardZ.Li@amd.com>, <richardradeon@gmail.com>
27 #include "main/glheader.h"
28 #include "main/imports.h"
29 #include "main/colormac.h"
30 #include "main/context.h"
31 #include "main/enums.h"
32 #include "main/image.h"
33 #include "main/teximage.h"
34 #include "main/simple_list.h"
35 #include "main/texobj.h"
39 #include "r600_context.h"
40 #include "radeon_mipmap_tree.h"
41 #include "evergreen_diff.h"
42 #include "evergreen_tex.h"
43 #include "evergreen_fragprog.h"
44 #include "evergreen_vertprog.h"
48 static unsigned int evergreen_translate_wrap_mode(GLenum wrapmode
)
51 case GL_REPEAT
: return SQ_TEX_WRAP
;
52 case GL_CLAMP
: return SQ_TEX_CLAMP_HALF_BORDER
;
53 case GL_CLAMP_TO_EDGE
: return SQ_TEX_CLAMP_LAST_TEXEL
;
54 case GL_CLAMP_TO_BORDER
: return SQ_TEX_CLAMP_BORDER
;
55 case GL_MIRRORED_REPEAT
: return SQ_TEX_MIRROR
;
56 case GL_MIRROR_CLAMP_EXT
: return SQ_TEX_MIRROR_ONCE_HALF_BORDER
;
57 case GL_MIRROR_CLAMP_TO_EDGE_EXT
: return SQ_TEX_MIRROR_ONCE_LAST_TEXEL
;
58 case GL_MIRROR_CLAMP_TO_BORDER_EXT
: return SQ_TEX_MIRROR_ONCE_BORDER
;
60 radeon_error("bad wrap mode in %s", __FUNCTION__
);
65 static GLboolean
evergreenGetTexFormat(struct gl_texture_object
*tObj
, gl_format mesa_format
)
67 radeonTexObj
*t
= radeon_tex_obj(tObj
);
69 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
70 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
71 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
72 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
73 CLEARbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
75 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
78 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
81 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
84 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
88 SETfield(t
->SQ_TEX_RESOURCE1
, ARRAY_LINEAR_GENERAL
,
89 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift
,
90 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask
);
92 switch (mesa_format
) /* This is mesa format. */
94 case MESA_FORMAT_RGBA8888
:
95 case MESA_FORMAT_SIGNED_RGBA8888
:
96 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
97 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
98 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
100 #ifdef MESA_BIG_ENDIAN
101 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
102 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
103 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
104 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
105 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
106 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
107 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
108 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
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
);
119 if (mesa_format
== MESA_FORMAT_SIGNED_RGBA8888
) {
120 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
121 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
122 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
123 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
124 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
125 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
126 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
127 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
130 case MESA_FORMAT_RGBA8888_REV
:
131 case MESA_FORMAT_SIGNED_RGBA8888_REV
:
132 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
133 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
134 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
136 #ifdef MESA_BIG_ENDIAN
137 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
138 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
139 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
140 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
141 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
142 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
143 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
144 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
146 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
147 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
148 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
149 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
150 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
151 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
152 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
153 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
155 if (mesa_format
== MESA_FORMAT_SIGNED_RGBA8888_REV
) {
156 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
157 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
158 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
159 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
160 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
161 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
162 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
163 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
166 case MESA_FORMAT_ARGB8888
:
167 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
168 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
169 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
171 #ifdef MESA_BIG_ENDIAN
172 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
173 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
174 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
175 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
176 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
177 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
178 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
179 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
181 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
182 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
183 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
184 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
185 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
186 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
187 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
188 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
191 case MESA_FORMAT_XRGB8888
:
192 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
193 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
194 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
196 #ifdef MESA_BIG_ENDIAN
197 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
198 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
199 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
200 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
201 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
202 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
203 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
204 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
206 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
207 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
208 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
209 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
210 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
211 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
212 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
213 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
216 case MESA_FORMAT_XRGB8888_REV
:
217 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
218 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
219 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
221 #ifdef MESA_BIG_ENDIAN
222 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
223 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
224 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
225 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
226 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
227 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
228 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
229 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
231 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
232 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
233 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
234 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
235 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
236 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
237 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
238 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
241 case MESA_FORMAT_ARGB8888_REV
:
242 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
243 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
244 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
246 #ifdef MESA_BIG_ENDIAN
247 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
248 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
249 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
250 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
251 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
252 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
253 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
254 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
256 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
257 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
258 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
259 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
260 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
261 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
262 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
263 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
266 case MESA_FORMAT_RGB888
:
267 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8
,
268 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
269 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
271 #ifdef MESA_BIG_ENDIAN
272 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
273 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
274 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
275 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
276 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
277 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
278 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
279 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
281 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
282 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
283 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
284 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
285 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
286 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
287 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
288 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
291 case MESA_FORMAT_RGB565
:
292 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_5_6_5
,
293 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
294 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
296 #ifdef MESA_BIG_ENDIAN
297 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
298 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
299 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
300 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
301 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
302 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
303 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
304 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
306 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
307 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
308 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
309 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
310 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
311 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
312 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
313 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
316 case MESA_FORMAT_RGB565_REV
:
317 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_5_6_5
,
318 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
319 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
321 #ifdef MESA_BIG_ENDIAN
322 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
323 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
324 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
325 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
326 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
327 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
328 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
329 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
331 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
332 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
333 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
334 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
335 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
336 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
337 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
338 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
341 case MESA_FORMAT_ARGB4444
:
342 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_4_4_4_4
,
343 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
344 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
346 #ifdef MESA_BIG_ENDIAN
347 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
348 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
349 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
350 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
351 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
352 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
353 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
354 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
356 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
357 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
358 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
359 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
360 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
361 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
362 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
363 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
366 case MESA_FORMAT_ARGB4444_REV
:
367 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_4_4_4_4
,
368 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
369 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
371 #ifdef MESA_BIG_ENDIAN
372 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
373 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
374 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
375 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
376 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
377 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
378 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
379 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
381 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
382 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
383 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
384 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
385 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
386 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
387 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
388 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
391 case MESA_FORMAT_ARGB1555
:
392 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_1_5_5_5
,
393 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
394 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
396 #ifdef MESA_BIG_ENDIAN
397 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
398 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
399 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
400 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
401 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
402 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
403 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
404 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
406 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
407 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
408 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
409 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
410 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
411 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
412 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
413 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
416 case MESA_FORMAT_ARGB1555_REV
:
417 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_1_5_5_5
,
418 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
419 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
421 #ifdef MESA_BIG_ENDIAN
422 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
423 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
424 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
425 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
426 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
427 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
428 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
429 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
431 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
432 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
433 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
434 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
435 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
436 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
437 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
438 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
441 case MESA_FORMAT_AL88
:
442 case MESA_FORMAT_AL88_REV
: /* TODO : Check this. */
443 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8
,
444 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
445 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
447 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
448 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
449 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
450 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
451 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
452 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
453 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
454 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
456 case MESA_FORMAT_RGB332
:
457 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_3_3_2
,
458 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
459 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
461 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
462 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
463 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
464 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
465 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
466 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
467 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
468 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
470 case MESA_FORMAT_A8
: /* ZERO, ZERO, ZERO, X */
471 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
472 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
473 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
475 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
476 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
477 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
478 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
479 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
480 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
481 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
482 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
484 case MESA_FORMAT_L8
: /* X, X, X, ONE */
485 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
486 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
487 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
489 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
490 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
491 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
492 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
493 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
494 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
495 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
496 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
498 case MESA_FORMAT_I8
: /* X, X, X, X */
499 case MESA_FORMAT_CI8
:
500 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
501 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
502 EG_SQ_TEX_RESOURCE_WORD7_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_X
,
511 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
513 case MESA_FORMAT_RGB_DXT1
: /* not supported yet */
514 case MESA_FORMAT_RGBA_DXT1
: /* not supported yet */
515 case MESA_FORMAT_RGBA_DXT3
: /* not supported yet */
516 case MESA_FORMAT_RGBA_DXT5
: /* not supported yet */
519 case MESA_FORMAT_RGBA_FLOAT32
:
520 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_32_32_32_FLOAT
,
521 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
522 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
524 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
525 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
526 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
527 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
528 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
529 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
530 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
531 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
533 case MESA_FORMAT_RGBA_FLOAT16
:
534 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_16_16_16_FLOAT
,
535 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
536 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
538 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
539 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
540 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
541 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
542 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
543 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
544 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
545 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
547 case MESA_FORMAT_RGB_FLOAT32
: /* X, Y, Z, ONE */
548 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_32_32_FLOAT
,
549 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
550 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
552 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
553 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
554 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
555 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
556 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
557 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
558 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
559 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
561 case MESA_FORMAT_RGB_FLOAT16
:
562 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_16_16_FLOAT
,
563 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
564 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
566 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
567 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
568 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
569 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
570 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
571 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
572 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
573 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
575 case MESA_FORMAT_ALPHA_FLOAT32
: /* ZERO, ZERO, ZERO, X */
576 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_FLOAT
,
577 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
578 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
580 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
581 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
582 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
583 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
584 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
585 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
586 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
587 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
589 case MESA_FORMAT_ALPHA_FLOAT16
: /* ZERO, ZERO, ZERO, X */
590 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_FLOAT
,
591 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
592 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
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
);
603 case MESA_FORMAT_LUMINANCE_FLOAT32
: /* X, X, X, ONE */
604 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_FLOAT
,
605 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
606 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
608 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
609 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
610 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
611 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
612 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
613 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
614 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
615 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
617 case MESA_FORMAT_LUMINANCE_FLOAT16
: /* X, X, X, ONE */
618 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_FLOAT
,
619 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
620 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
622 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
623 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
624 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
625 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
626 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
627 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
628 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
629 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
631 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
:
632 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_32_FLOAT
,
633 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
634 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
636 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
637 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
638 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
639 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
640 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
641 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
642 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
643 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
645 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
:
646 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_16_FLOAT
,
647 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
648 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
650 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
651 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
652 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
653 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
654 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
655 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
656 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
657 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
659 case MESA_FORMAT_INTENSITY_FLOAT32
: /* X, X, X, X */
660 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_FLOAT
,
661 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
662 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
664 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
665 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
666 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
667 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
668 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
669 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
670 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
671 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
673 case MESA_FORMAT_INTENSITY_FLOAT16
: /* X, X, X, X */
674 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_FLOAT
,
675 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
676 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
678 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
679 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
680 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
681 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
682 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
683 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
684 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
685 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
687 case MESA_FORMAT_Z16
:
688 case MESA_FORMAT_X8_Z24
:
689 case MESA_FORMAT_S8_Z24
:
690 case MESA_FORMAT_Z24_S8
:
691 case MESA_FORMAT_Z32
:
693 CLEARbit(t
->SQ_TEX_RESOURCE0
, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit
);
694 SETfield(t
->SQ_TEX_RESOURCE1
, ARRAY_1D_TILED_THIN1
,
695 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift
,
696 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask
);
697 switch (mesa_format
) {
698 case MESA_FORMAT_Z16
:
699 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16
,
700 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
701 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
703 case MESA_FORMAT_X8_Z24
:
704 case MESA_FORMAT_S8_Z24
:
705 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_24
,
706 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
707 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
709 case MESA_FORMAT_Z24_S8
:
710 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_24_8
,
711 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
712 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
714 case MESA_FORMAT_Z32
:
715 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32
,
716 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
717 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
720 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
721 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
722 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
727 switch (tObj
->Sampler
.DepthMode
) {
728 case GL_LUMINANCE
: /* X, X, X, ONE */
729 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
730 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
731 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
732 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
733 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
734 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
735 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
736 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
738 case GL_INTENSITY
: /* X, X, X, X */
739 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
740 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
741 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
742 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
743 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
744 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
745 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
746 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
748 case GL_ALPHA
: /* ZERO, ZERO, ZERO, X */
749 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
750 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
751 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
752 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
753 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
754 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
755 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
756 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
762 /* EXT_texture_sRGB */
763 case MESA_FORMAT_SRGBA8
:
764 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
765 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
766 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
768 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
769 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
770 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
771 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
772 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
773 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
774 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
775 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
776 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
778 case MESA_FORMAT_SLA8
:
779 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8
,
780 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
781 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
783 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
784 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
785 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
786 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
787 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
788 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
789 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
790 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
791 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
793 case MESA_FORMAT_SL8
: /* X, X, X, ONE */
794 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
795 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
796 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
798 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
799 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
800 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
801 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
802 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
803 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
804 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
805 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
806 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
809 /* Not supported format */
816 static GLuint
evergreen_translate_shadow_func(GLenum func
)
820 return SQ_TEX_DEPTH_COMPARE_NEVER
;
822 return SQ_TEX_DEPTH_COMPARE_LESS
;
824 return SQ_TEX_DEPTH_COMPARE_LESSEQUAL
;
826 return SQ_TEX_DEPTH_COMPARE_GREATER
;
828 return SQ_TEX_DEPTH_COMPARE_GREATEREQUAL
;
830 return SQ_TEX_DEPTH_COMPARE_NOTEQUAL
;
832 return SQ_TEX_DEPTH_COMPARE_EQUAL
;
834 return SQ_TEX_DEPTH_COMPARE_ALWAYS
;
836 WARN_ONCE("Unknown shadow compare function! %d", func
);
841 static void evergreenUpdateTexWrap(radeonTexObjPtr t
)
843 struct gl_texture_object
*tObj
= &t
->base
;
845 SETfield(t
->SQ_TEX_SAMPLER0
, evergreen_translate_wrap_mode(tObj
->Sampler
.WrapS
),
846 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
,
847 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask
);
849 if (tObj
->Target
!= GL_TEXTURE_1D
)
851 SETfield(t
->SQ_TEX_SAMPLER0
, evergreen_translate_wrap_mode(tObj
->Sampler
.WrapT
),
852 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Y_shift
,
853 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Y_mask
);
855 if (tObj
->Target
== GL_TEXTURE_3D
)
856 SETfield(t
->SQ_TEX_SAMPLER0
, evergreen_translate_wrap_mode(tObj
->Sampler
.WrapR
),
857 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Z_shift
,
858 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Z_mask
);
862 static void evergreenSetTexDefaultState(radeonTexObjPtr t
)
864 /* Init text object to default states. */
865 t
->SQ_TEX_RESOURCE0
= 0;
866 t
->SQ_TEX_RESOURCE1
= 0;
867 t
->SQ_TEX_RESOURCE2
= 0;
868 t
->SQ_TEX_RESOURCE3
= 0;
869 t
->SQ_TEX_RESOURCE4
= 0;
870 t
->SQ_TEX_RESOURCE5
= 0;
871 t
->SQ_TEX_RESOURCE6
= 0;
872 t
->SQ_TEX_RESOURCE7
= 0;
874 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_2D
,
875 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
876 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
878 CLEARbit(t
->SQ_TEX_RESOURCE0
, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit
);
880 SETfield(t
->SQ_TEX_RESOURCE1
, ARRAY_LINEAR_GENERAL
,
881 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift
,
882 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask
);
884 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
885 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
886 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
887 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
888 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
889 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
890 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
891 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
892 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_NUM_FORMAT_NORM
,
893 SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_shift
, SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_mask
);
894 CLEARbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__SRF_MODE_ALL_bit
);
895 CLEARbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
896 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_ENDIAN_NONE
,
897 SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift
, SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_mask
);
899 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
900 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
,
901 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
902 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
903 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
,
904 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
905 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
906 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
,
907 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
908 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
909 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
,
910 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
911 SETfield(t
->SQ_TEX_RESOURCE4
, 0,
913 BASE_LEVEL_mask
); /* mip-maps */
915 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
916 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
917 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
918 SETfield(t
->SQ_TEX_RESOURCE7
, SQ_TEX_VTX_VALID_TEXTURE
,
919 EG_SQ_TEX_RESOURCE_WORD7_0__TYPE_shift
,
920 EG_SQ_TEX_RESOURCE_WORD7_0__TYPE_mask
);
922 /* Initialize sampler registers */
923 t
->SQ_TEX_SAMPLER0
= 0;
924 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_WRAP
,
925 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
,
926 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask
);
927 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_WRAP
,
928 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
,
929 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask
);
930 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_WRAP
,
931 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
,
932 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask
);
933 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_XY_FILTER_POINT
,
934 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift
,
935 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask
);
936 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_XY_FILTER_POINT
,
937 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
938 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
939 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_Z_FILTER_NONE
,
940 EG_SQ_TEX_SAMPLER_WORD0_0__Z_FILTER_shift
,
941 EG_SQ_TEX_SAMPLER_WORD0_0__Z_FILTER_mask
);
942 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_Z_FILTER_NONE
,
943 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
944 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
945 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_BORDER_COLOR_TRANS_BLACK
,
946 EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_shift
,
947 EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_mask
);
949 t
->SQ_TEX_SAMPLER1
= 0;
950 SETfield(t
->SQ_TEX_SAMPLER1
, 0x7ff,
951 EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_shift
,
952 EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_mask
);
954 t
->SQ_TEX_SAMPLER2
= 0;
955 SETbit(t
->SQ_TEX_SAMPLER2
, EG_SQ_TEX_SAMPLER_WORD2_0__TYPE_bit
);
958 static void evergreenSetTexFilter(radeonTexObjPtr t
, GLenum minf
, GLenum magf
, GLfloat anisotropy
)
960 /* Force revalidation to account for switches from/to mipmapping. */
961 t
->validated
= GL_FALSE
;
963 /* Note that EXT_texture_filter_anisotropic is extremely vague about
964 * how anisotropic filtering interacts with the "normal" filter modes.
965 * When anisotropic filtering is enabled, we override min and mag
966 * filter settings completely. This includes driconf's settings.
968 if (anisotropy
>= 2.0 && (minf
!= GL_NEAREST
) && (magf
!= GL_NEAREST
)) {
969 /*t->pp_txfilter |= R300_TX_MAG_FILTER_ANISO
970 | R300_TX_MIN_FILTER_ANISO
971 | R300_TX_MIN_FILTER_MIP_LINEAR
972 | aniso_filter(anisotropy);*/
973 radeon_print(RADEON_TEXTURE
, RADEON_NORMAL
, "Using maximum anisotropy of %f\n", anisotropy
);
980 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Point
,
981 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
982 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
983 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_None
,
984 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
985 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
988 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Linear
,
989 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
990 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
991 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_None
,
992 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
993 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
995 case GL_NEAREST_MIPMAP_NEAREST
:
996 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Point
,
997 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
998 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
999 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_Point
,
1000 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
1001 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
1003 case GL_NEAREST_MIPMAP_LINEAR
:
1004 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Point
,
1005 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
1006 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
1007 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_Linear
,
1008 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
1009 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
1011 case GL_LINEAR_MIPMAP_NEAREST
:
1012 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Linear
,
1013 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
1014 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
1015 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_Point
,
1016 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
1017 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
1019 case GL_LINEAR_MIPMAP_LINEAR
:
1020 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Linear
,
1021 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
1022 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
1023 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_Linear
,
1024 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
1025 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
1029 /* Note we don't have 3D mipmaps so only use the mag filter setting
1030 * to set the 3D texture filter mode.
1035 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Point
,
1036 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift
,
1037 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask
);
1040 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Linear
,
1041 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift
,
1042 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask
);
1047 static void evergreenSetTexBorderColor(radeonTexObjPtr t
, const GLfloat color
[4])
1049 t
->TD_PS_SAMPLER0_BORDER_ALPHA
= *((uint32_t*)&(color
[3]));
1050 t
->TD_PS_SAMPLER0_BORDER_RED
= *((uint32_t*)&(color
[2]));
1051 t
->TD_PS_SAMPLER0_BORDER_GREEN
= *((uint32_t*)&(color
[1]));
1052 t
->TD_PS_SAMPLER0_BORDER_BLUE
= *((uint32_t*)&(color
[0]));
1054 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_BORDER_COLOR_REGISTER
,
1055 EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_shift
,
1056 EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_mask
);
1059 static void evergreenSetDepthTexMode(struct gl_texture_object
*tObj
)
1066 t
= radeon_tex_obj(tObj
);
1068 if(!evergreenGetTexFormat(tObj
, tObj
->Image
[0][tObj
->BaseLevel
]->TexFormat
))
1069 t
->validated
= GL_FALSE
;
1072 static INLINE
uint32_t
1073 EG_S_FIXED(float value
, uint32_t frac_bits
)
1075 return value
* (1 << frac_bits
);
1078 static GLboolean
evergreen_setup_hardware_state(struct gl_context
* ctx
, struct gl_texture_object
*texObj
, int unit
)
1080 context_t
*context
= EVERGREEN_CONTEXT(ctx
);
1081 radeonTexObj
*t
= radeon_tex_obj(texObj
);
1082 const struct gl_texture_image
*firstImage
;
1083 GLuint uTexelPitch
, row_align
;
1085 if (context
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
&&
1086 t
->image_override
&&
1090 firstImage
= t
->base
.Image
[0][t
->minLod
];
1092 if (!t
->image_override
) {
1093 if (!evergreenGetTexFormat(texObj
, firstImage
->TexFormat
)) {
1094 radeon_warning("unsupported texture format in %s\n",
1100 switch (texObj
->Target
)
1103 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_1D
,
1104 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
1105 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
1106 SETfield(t
->SQ_TEX_RESOURCE1
, 0,
1107 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift
,
1108 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask
);
1111 case GL_TEXTURE_RECTANGLE_NV
:
1112 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_2D
,
1113 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
1114 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
1115 SETfield(t
->SQ_TEX_RESOURCE1
, 0,
1116 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift
,
1117 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask
);
1120 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_3D
,
1121 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
1122 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
1123 SETfield(t
->SQ_TEX_RESOURCE1
, (firstImage
->Depth
- 1), // ???
1124 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift
,
1125 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask
);
1127 case GL_TEXTURE_CUBE_MAP
:
1128 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_CUBEMAP
,
1129 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
1130 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
1131 SETfield(t
->SQ_TEX_RESOURCE1
, 0,
1132 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift
,
1133 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask
);
1136 radeon_error("unexpected texture target type in %s\n", __FUNCTION__
);
1140 row_align
= context
->radeon
.texture_row_align
- 1;
1141 uTexelPitch
= (_mesa_format_row_stride(firstImage
->TexFormat
, firstImage
->Width
) + row_align
) & ~row_align
;
1142 uTexelPitch
= uTexelPitch
/ _mesa_get_format_bytes(firstImage
->TexFormat
);
1143 uTexelPitch
= (uTexelPitch
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
1144 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
1146 /* min pitch is 8 */
1147 if (uTexelPitch
< 8)
1150 SETfield(t
->SQ_TEX_RESOURCE0
, (uTexelPitch
/8)-1,
1151 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift
,
1152 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask
);
1153 SETfield(t
->SQ_TEX_RESOURCE0
, firstImage
->Width
- 1,
1154 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_shift
,
1155 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_mask
);
1156 SETfield(t
->SQ_TEX_RESOURCE1
, firstImage
->Height
- 1,
1157 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_shift
,
1158 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_mask
);
1160 t
->SQ_TEX_RESOURCE2
= get_base_teximage_offset(t
) / 256;
1162 t
->SQ_TEX_RESOURCE3
= radeon_miptree_image_offset(t
->mt
, 0, t
->minLod
+ 1) / 256;
1164 SETfield(t
->SQ_TEX_RESOURCE4
, 0, BASE_LEVEL_shift
, BASE_LEVEL_mask
);
1165 SETfield(t
->SQ_TEX_RESOURCE5
, t
->maxLod
- t
->minLod
, LAST_LEVEL_shift
, LAST_LEVEL_mask
);
1167 SETfield(t
->SQ_TEX_SAMPLER1
,
1168 EG_S_FIXED(CLAMP(t
->base
.Sampler
.MinLod
- t
->minLod
, 0, 15), 8),
1169 EG_SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_shift
,
1170 EG_SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_mask
);
1171 SETfield(t
->SQ_TEX_SAMPLER1
,
1172 EG_S_FIXED(CLAMP(t
->base
.Sampler
.MaxLod
- t
->minLod
, 0, 15), 8),
1173 EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_shift
,
1174 EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_mask
);
1175 SETfield(t
->SQ_TEX_SAMPLER2
,
1176 EG_S_FIXED(CLAMP(ctx
->Texture
.Unit
[unit
].LodBias
+ t
->base
.Sampler
.LodBias
, -16, 16), 8),
1177 EG_SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_shift
,
1178 EG_SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_mask
);
1180 if(texObj
->Sampler
.CompareMode
== GL_COMPARE_R_TO_TEXTURE_ARB
)
1182 SETfield(t
->SQ_TEX_SAMPLER0
, evergreen_translate_shadow_func(texObj
->Sampler
.CompareFunc
),
1183 EG_SQ_TEX_SAMPLER_WORD0_0__DCF_shift
,
1184 EG_SQ_TEX_SAMPLER_WORD0_0__DCF_mask
);
1188 CLEARfield(t
->SQ_TEX_SAMPLER0
, EG_SQ_TEX_SAMPLER_WORD0_0__DCF_mask
);
1194 void evergreenSetTexOffset(__DRIcontext
* pDRICtx
, GLint texname
,
1195 unsigned long long offset
, GLint depth
, GLuint pitch
)
1197 context_t
*rmesa
= pDRICtx
->driverPrivate
;
1198 struct gl_texture_object
*tObj
=
1199 _mesa_lookup_texture(rmesa
->radeon
.glCtx
, texname
);
1200 radeonTexObjPtr t
= radeon_tex_obj(tObj
);
1201 const struct gl_texture_image
*firstImage
;
1202 uint32_t pitch_val
, size
, row_align
;
1207 t
->image_override
= GL_TRUE
;
1212 firstImage
= t
->base
.Image
[0][t
->minLod
];
1213 row_align
= rmesa
->radeon
.texture_row_align
- 1;
1214 size
= ((_mesa_format_row_stride(firstImage
->TexFormat
, firstImage
->Width
) + row_align
) & ~row_align
) * firstImage
->Height
;
1216 radeon_bo_unref(t
->bo
);
1219 t
->bo
= radeon_legacy_bo_alloc_fake(rmesa
->radeon
.radeonScreen
->bom
, size
, offset
);
1220 t
->override_offset
= offset
;
1224 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1225 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1226 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1228 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1229 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1230 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1231 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1232 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1233 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1234 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1235 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1240 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1241 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1242 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1244 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1245 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1246 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1247 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1248 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1249 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1250 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1251 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1255 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_5_6_5
,
1256 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1257 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1259 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1260 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1261 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1262 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1263 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1264 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1265 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1266 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1271 pitch_val
= (pitch_val
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
1272 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
1274 /* min pitch is 8 */
1278 SETfield(t
->SQ_TEX_RESOURCE0
, (pitch_val
/8)-1,
1279 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift
,
1280 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask
);
1283 void evergreenSetTexBuffer(__DRIcontext
*pDRICtx
, GLint target
, GLint glx_texture_format
, __DRIdrawable
*dPriv
)
1285 struct gl_texture_unit
*texUnit
;
1286 struct gl_texture_object
*texObj
;
1287 struct gl_texture_image
*texImage
;
1288 struct radeon_renderbuffer
*rb
;
1289 radeon_texture_image
*rImage
;
1290 radeonContextPtr radeon
;
1292 struct radeon_framebuffer
*rfb
;
1295 uint32_t internalFormat
, type
, format
;
1296 gl_format texFormat
;
1299 format
= GL_UNSIGNED_BYTE
;
1300 internalFormat
= (glx_texture_format
== __DRI_TEXTURE_FORMAT_RGB
? 3 : 4);
1302 radeon
= pDRICtx
->driverPrivate
;
1303 rmesa
= pDRICtx
->driverPrivate
;
1305 rfb
= dPriv
->driverPrivate
;
1306 texUnit
= &radeon
->glCtx
->Texture
.Unit
[radeon
->glCtx
->Texture
.CurrentUnit
];
1307 texObj
= _mesa_select_tex_object(radeon
->glCtx
, texUnit
, target
);
1308 texImage
= _mesa_get_tex_image(radeon
->glCtx
, texObj
, target
, 0);
1310 rImage
= get_radeon_texture_image(texImage
);
1311 t
= radeon_tex_obj(texObj
);
1316 radeon_update_renderbuffers(pDRICtx
, dPriv
, GL_TRUE
);
1317 rb
= rfb
->color_rb
[0];
1318 if (rb
->bo
== NULL
) {
1319 /* Failed to BO for the buffer */
1323 _mesa_lock_texture(radeon
->glCtx
, texObj
);
1325 radeon_bo_unref(t
->bo
);
1329 radeon_bo_unref(rImage
->bo
);
1333 radeon_miptree_unreference(&t
->mt
);
1334 radeon_miptree_unreference(&rImage
->mt
);
1336 rImage
->bo
= rb
->bo
;
1337 radeon_bo_ref(rImage
->bo
);
1339 radeon_bo_ref(t
->bo
);
1340 t
->image_override
= GL_TRUE
;
1341 t
->override_offset
= 0;
1342 pitch_val
= rb
->pitch
;
1345 if (glx_texture_format
== __DRI_TEXTURE_FORMAT_RGB
) {
1346 texFormat
= MESA_FORMAT_RGB888
;
1347 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1348 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1349 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1351 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1352 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1353 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1354 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1355 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1356 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1357 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1358 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1360 texFormat
= MESA_FORMAT_ARGB8888
;
1361 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1362 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1363 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1365 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1366 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1367 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1368 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1369 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1370 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1371 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1372 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1379 texFormat
= MESA_FORMAT_RGB888
;
1380 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1381 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1382 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1384 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1385 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1386 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1387 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1388 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1389 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1390 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1391 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1395 texFormat
= MESA_FORMAT_RGB565
;
1396 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_5_6_5
,
1397 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1398 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1400 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1401 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1402 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1403 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1404 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1405 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1406 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1407 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1412 _mesa_init_teximage_fields(radeon
->glCtx
, target
, texImage
,
1413 rb
->base
.Width
, rb
->base
.Height
, 1, 0,
1414 rb
->cpp
, texFormat
);
1415 texImage
->RowStride
= rb
->pitch
/ rb
->cpp
;
1417 pitch_val
= (pitch_val
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
1418 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
1420 /* min pitch is 8 */
1424 SETfield(t
->SQ_TEX_RESOURCE0
, (pitch_val
/8)-1,
1425 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift
,
1426 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask
);
1427 SETfield(t
->SQ_TEX_RESOURCE0
, rb
->base
.Width
- 1,
1428 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_shift
,
1429 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_mask
);
1430 SETfield(t
->SQ_TEX_RESOURCE1
, rb
->base
.Height
- 1,
1431 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_shift
,
1432 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_mask
);
1434 t
->validated
= GL_TRUE
;
1435 _mesa_unlock_texture(radeon
->glCtx
, texObj
);
1439 void evergreenUpdateTextureState(struct gl_context
* ctx
)
1441 context_t
*context
= EVERGREEN_CONTEXT(ctx
);
1442 EVERGREEN_CHIP_CONTEXT
* evergreen
= GET_EVERGREEN_CHIP(context
);
1443 struct gl_texture_unit
*texUnit
;
1444 struct radeon_tex_obj
*t
;
1447 EVERGREEN_STATECHANGE(context
, tx
);
1449 for (unit
= 0; unit
< R700_MAX_TEXTURE_UNITS
; unit
++) {
1450 texUnit
= &ctx
->Texture
.Unit
[unit
];
1451 t
= radeon_tex_obj(ctx
->Texture
.Unit
[unit
]._Current
);
1452 evergreen
->textures
[unit
] = NULL
;
1453 if (texUnit
->_ReallyEnabled
) {
1456 evergreen
->textures
[unit
] = t
;
1461 static GLboolean
evergreen_validate_texture(struct gl_context
* ctx
, struct gl_texture_object
*texObj
, int unit
)
1463 radeonTexObj
*t
= radeon_tex_obj(texObj
);
1465 if (!radeon_validate_texture_miptree(ctx
, texObj
))
1468 /* Configure the hardware registers (more precisely, the cached version
1469 * of the hardware registers). */
1470 if (!evergreen_setup_hardware_state(ctx
, texObj
, unit
))
1473 t
->validated
= GL_TRUE
;
1477 GLboolean
evergreenValidateBuffers(struct gl_context
* ctx
)
1479 context_t
*rmesa
= EVERGREEN_CONTEXT(ctx
);
1480 struct radeon_renderbuffer
*rrb
;
1481 struct radeon_bo
*pbo
;
1485 radeon_cs_space_reset_bos(rmesa
->radeon
.cmdbuf
.cs
);
1487 rrb
= radeon_get_colorbuffer(&rmesa
->radeon
);
1489 if (rrb
&& rrb
->bo
) {
1490 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
1492 RADEON_GEM_DOMAIN_VRAM
);
1496 rrb
= radeon_get_depthbuffer(&rmesa
->radeon
);
1497 if (rrb
&& rrb
->bo
) {
1498 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
1500 RADEON_GEM_DOMAIN_VRAM
);
1503 for (i
= 0; i
< ctx
->Const
.MaxTextureImageUnits
; ++i
) {
1506 if (!ctx
->Texture
.Unit
[i
]._ReallyEnabled
)
1509 if (!evergreen_validate_texture(ctx
, ctx
->Texture
.Unit
[i
]._Current
, i
)) {
1510 radeon_warning("failed to validate texture for unit %d.\n", i
);
1512 t
= radeon_tex_obj(ctx
->Texture
.Unit
[i
]._Current
);
1513 if (t
->image_override
&& t
->bo
)
1514 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
1516 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
1518 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
1520 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
1523 pbo
= (struct radeon_bo
*)evergreenGetActiveFpShaderBo(ctx
);
1525 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
1526 RADEON_GEM_DOMAIN_GTT
, 0);
1529 pbo
= (struct radeon_bo
*)evergreenGetActiveVpShaderBo(ctx
);
1531 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
1532 RADEON_GEM_DOMAIN_GTT
, 0);
1535 pbo
= (struct radeon_bo
*)evergreenGetActiveFpShaderConstBo(ctx
);
1537 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
1538 RADEON_GEM_DOMAIN_GTT
, 0);
1541 pbo
= (struct radeon_bo
*)evergreenGetActiveVpShaderConstBo(ctx
);
1543 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
1544 RADEON_GEM_DOMAIN_GTT
, 0);
1547 ret
= radeon_cs_space_check_with_bo(rmesa
->radeon
.cmdbuf
.cs
, first_elem(&rmesa
->radeon
.dma
.reserved
)->bo
, RADEON_GEM_DOMAIN_GTT
, 0);
1553 static struct gl_texture_object
*evergreenNewTextureObject(struct gl_context
* ctx
,
1557 context_t
* rmesa
= EVERGREEN_CONTEXT(ctx
);
1558 radeonTexObj
* t
= CALLOC_STRUCT(radeon_tex_obj
);
1561 radeon_print(RADEON_STATE
| RADEON_TEXTURE
, RADEON_NORMAL
,
1562 "%s( %p (target = %s) )\n", __FUNCTION__
,
1563 t
, _mesa_lookup_enum_by_nr(target
));
1565 _mesa_initialize_texture_object(&t
->base
, name
, target
);
1566 t
->base
.Sampler
.MaxAnisotropy
= rmesa
->radeon
.initialMaxAnisotropy
;
1568 evergreenSetTexDefaultState(t
);
1569 evergreenUpdateTexWrap(t
);
1570 evergreenSetTexFilter(t
, t
->base
.Sampler
.MinFilter
, t
->base
.Sampler
.MagFilter
, t
->base
.Sampler
.MaxAnisotropy
);
1571 evergreenSetTexBorderColor(t
, t
->base
.Sampler
.BorderColor
.f
);
1576 static void evergreenDeleteTexture(struct gl_context
* ctx
, struct gl_texture_object
*texObj
)
1578 context_t
* rmesa
= EVERGREEN_CONTEXT(ctx
);
1579 EVERGREEN_CHIP_CONTEXT
* evergreen
= GET_EVERGREEN_CHIP(rmesa
);
1580 radeonTexObj
* t
= radeon_tex_obj(texObj
);
1582 radeon_print(RADEON_STATE
| RADEON_TEXTURE
, RADEON_NORMAL
,
1583 "%s( %p (target = %s) )\n", __FUNCTION__
,
1585 _mesa_lookup_enum_by_nr(texObj
->Target
));
1589 radeon_firevertices(&rmesa
->radeon
);
1591 for(i
= 0; i
< R700_MAX_TEXTURE_UNITS
; ++i
)
1592 if (evergreen
->textures
[i
] == t
)
1593 evergreen
->textures
[i
] = 0;
1597 radeon_bo_unref(t
->bo
);
1601 radeon_miptree_unreference(&t
->mt
);
1603 _mesa_delete_texture_object(ctx
, texObj
);
1606 static void evergreenTexParameter(struct gl_context
* ctx
, GLenum target
,
1607 struct gl_texture_object
*texObj
,
1608 GLenum pname
, const GLfloat
* params
)
1610 radeonTexObj
* t
= radeon_tex_obj(texObj
);
1613 radeon_print(RADEON_STATE
| RADEON_TEXTURE
, RADEON_VERBOSE
,
1614 "%s( %s )\n", __FUNCTION__
,
1615 _mesa_lookup_enum_by_nr(pname
));
1618 case GL_TEXTURE_MIN_FILTER
:
1619 case GL_TEXTURE_MAG_FILTER
:
1620 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1621 evergreenSetTexFilter(t
, texObj
->Sampler
.MinFilter
, texObj
->Sampler
.MagFilter
, texObj
->Sampler
.MaxAnisotropy
);
1624 case GL_TEXTURE_WRAP_S
:
1625 case GL_TEXTURE_WRAP_T
:
1626 case GL_TEXTURE_WRAP_R
:
1627 evergreenUpdateTexWrap(t
);
1630 case GL_TEXTURE_BORDER_COLOR
:
1631 evergreenSetTexBorderColor(t
, texObj
->Sampler
.BorderColor
.f
);
1634 case GL_TEXTURE_BASE_LEVEL
:
1635 case GL_TEXTURE_MAX_LEVEL
:
1636 case GL_TEXTURE_MIN_LOD
:
1637 case GL_TEXTURE_MAX_LOD
:
1638 t
->validated
= GL_FALSE
;
1641 case GL_DEPTH_TEXTURE_MODE
:
1642 if (!texObj
->Image
[0][texObj
->BaseLevel
])
1644 baseFormat
= texObj
->Image
[0][texObj
->BaseLevel
]->_BaseFormat
;
1645 if (baseFormat
== GL_DEPTH_COMPONENT
||
1646 baseFormat
== GL_DEPTH_STENCIL
) {
1647 evergreenSetDepthTexMode(texObj
);
1650 /* If the texture isn't a depth texture, changing this
1651 * state won't cause any changes to the hardware.
1652 * Don't force a flush of texture state.
1662 void evergreenInitTextureFuncs(radeonContextPtr radeon
, struct dd_function_table
*functions
)
1664 /* Note: we only plug in the functions we implement in the driver
1665 * since _mesa_init_driver_functions() was already called.
1667 functions
->NewTextureImage
= radeonNewTextureImage
;
1668 functions
->FreeTexImageData
= radeonFreeTexImageData
;
1669 functions
->MapTexture
= radeonMapTexture
;
1670 functions
->UnmapTexture
= radeonUnmapTexture
;
1672 functions
->ChooseTextureFormat
= radeonChooseTextureFormat_mesa
;
1673 functions
->TexImage1D
= radeonTexImage1D
;
1674 functions
->TexImage2D
= radeonTexImage2D
;
1675 functions
->TexImage3D
= radeonTexImage3D
;
1676 functions
->TexSubImage1D
= radeonTexSubImage1D
;
1677 functions
->TexSubImage2D
= radeonTexSubImage2D
;
1678 functions
->TexSubImage3D
= radeonTexSubImage3D
;
1679 functions
->GetTexImage
= radeonGetTexImage
;
1680 functions
->GetCompressedTexImage
= radeonGetCompressedTexImage
;
1681 functions
->NewTextureObject
= evergreenNewTextureObject
;
1682 functions
->DeleteTexture
= evergreenDeleteTexture
;
1683 functions
->IsTextureResident
= driIsTextureResident
;
1685 functions
->TexParameter
= evergreenTexParameter
;
1687 functions
->CompressedTexImage2D
= radeonCompressedTexImage2D
;
1688 functions
->CompressedTexSubImage2D
= radeonCompressedTexSubImage2D
;
1690 if (radeon
->radeonScreen
->kernel_mm
) {
1691 functions
->CopyTexSubImage2D
= radeonCopyTexSubImage2D
;
1694 functions
->GenerateMipmap
= radeonGenerateMipmap
;
1696 driInitTextureFormats();