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/mipmap.h"
35 #include "main/simple_list.h"
36 #include "main/texstore.h"
37 #include "main/texobj.h"
41 #include "r600_context.h"
42 #include "radeon_mipmap_tree.h"
43 #include "evergreen_diff.h"
44 #include "evergreen_tex.h"
45 #include "evergreen_fragprog.h"
46 #include "evergreen_vertprog.h"
50 static unsigned int evergreen_translate_wrap_mode(GLenum wrapmode
)
53 case GL_REPEAT
: return SQ_TEX_WRAP
;
54 case GL_CLAMP
: return SQ_TEX_CLAMP_HALF_BORDER
;
55 case GL_CLAMP_TO_EDGE
: return SQ_TEX_CLAMP_LAST_TEXEL
;
56 case GL_CLAMP_TO_BORDER
: return SQ_TEX_CLAMP_BORDER
;
57 case GL_MIRRORED_REPEAT
: return SQ_TEX_MIRROR
;
58 case GL_MIRROR_CLAMP_EXT
: return SQ_TEX_MIRROR_ONCE_HALF_BORDER
;
59 case GL_MIRROR_CLAMP_TO_EDGE_EXT
: return SQ_TEX_MIRROR_ONCE_LAST_TEXEL
;
60 case GL_MIRROR_CLAMP_TO_BORDER_EXT
: return SQ_TEX_MIRROR_ONCE_BORDER
;
62 radeon_error("bad wrap mode in %s", __FUNCTION__
);
67 static GLboolean
evergreenGetTexFormat(struct gl_texture_object
*tObj
, gl_format mesa_format
)
69 radeonTexObj
*t
= radeon_tex_obj(tObj
);
71 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
72 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
73 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
74 CLEARfield(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
75 CLEARbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
77 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
80 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
83 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
86 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
90 SETfield(t
->SQ_TEX_RESOURCE1
, ARRAY_LINEAR_GENERAL
,
91 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift
,
92 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask
);
94 switch (mesa_format
) /* This is mesa format. */
96 case MESA_FORMAT_RGBA8888
:
97 case MESA_FORMAT_SIGNED_RGBA8888
:
98 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
99 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
100 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
102 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
103 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
104 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
105 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
106 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
107 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
108 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
109 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
110 if (mesa_format
== MESA_FORMAT_SIGNED_RGBA8888
) {
111 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
112 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
113 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
114 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
115 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
116 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
117 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
118 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
121 case MESA_FORMAT_RGBA8888_REV
:
122 case MESA_FORMAT_SIGNED_RGBA8888_REV
:
123 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
124 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
125 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
127 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
128 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
129 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
130 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
131 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
132 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
133 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
134 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
135 if (mesa_format
== MESA_FORMAT_SIGNED_RGBA8888_REV
) {
136 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
137 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
138 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
139 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
140 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
141 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
142 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_SIGNED
,
143 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
146 case MESA_FORMAT_ARGB8888
:
147 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
148 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
149 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
151 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
152 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
153 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
154 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
155 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
156 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
157 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
158 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
160 case MESA_FORMAT_XRGB8888
:
161 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
162 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
163 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
165 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
166 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
167 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
168 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
169 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
170 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
171 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
172 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
174 case MESA_FORMAT_XRGB8888_REV
:
175 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
176 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
177 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
179 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
180 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
181 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
182 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
183 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
184 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
185 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
186 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
188 case MESA_FORMAT_ARGB8888_REV
:
189 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
190 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
191 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
193 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
194 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
195 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
196 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
197 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
198 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
199 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
200 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
202 case MESA_FORMAT_RGB888
:
203 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8
,
204 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
205 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
207 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
208 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
209 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
210 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
211 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
212 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
213 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
214 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
216 case MESA_FORMAT_RGB565
:
217 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_5_6_5
,
218 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
219 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
221 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
222 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
223 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
224 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
225 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
226 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
227 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
228 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
230 case MESA_FORMAT_RGB565_REV
:
231 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_5_6_5
,
232 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
233 EG_SQ_TEX_RESOURCE_WORD7_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_RESOURCE7
, FMT_4_4_4_4
,
246 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
247 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
249 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
250 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
251 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
252 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
253 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
254 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
255 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
256 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
258 case MESA_FORMAT_ARGB4444_REV
:
259 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_4_4_4_4
,
260 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
261 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
263 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
264 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
265 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
266 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
267 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
268 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
269 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
270 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
272 case MESA_FORMAT_ARGB1555
:
273 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_1_5_5_5
,
274 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
275 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
277 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
278 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
279 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
280 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
281 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
282 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
283 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
284 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
286 case MESA_FORMAT_ARGB1555_REV
:
287 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_1_5_5_5
,
288 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
289 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
291 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
292 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
293 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
294 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
295 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
296 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
297 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
298 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
300 case MESA_FORMAT_AL88
:
301 case MESA_FORMAT_AL88_REV
: /* TODO : Check this. */
302 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8
,
303 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
304 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
306 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
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_X
,
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_Y
,
313 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
315 case MESA_FORMAT_RGB332
:
316 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_3_3_2
,
317 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
318 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
320 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
321 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
322 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
323 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
324 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
325 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
326 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
327 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
329 case MESA_FORMAT_A8
: /* ZERO, ZERO, ZERO, X */
330 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
331 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
332 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
334 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
335 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
336 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
337 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
338 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
339 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
340 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
341 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
343 case MESA_FORMAT_L8
: /* X, X, X, ONE */
344 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
345 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
346 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
348 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
349 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
350 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
351 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
352 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
353 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
354 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
355 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
357 case MESA_FORMAT_I8
: /* X, X, X, X */
358 case MESA_FORMAT_CI8
:
359 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
360 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
361 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
363 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
364 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
365 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
366 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
367 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
368 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
369 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
370 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
372 case MESA_FORMAT_RGB_DXT1
: /* not supported yet */
373 case MESA_FORMAT_RGBA_DXT1
: /* not supported yet */
374 case MESA_FORMAT_RGBA_DXT3
: /* not supported yet */
375 case MESA_FORMAT_RGBA_DXT5
: /* not supported yet */
378 case MESA_FORMAT_RGBA_FLOAT32
:
379 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_32_32_32_FLOAT
,
380 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
381 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
383 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
384 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
385 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
386 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
387 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
388 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
389 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
390 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
392 case MESA_FORMAT_RGBA_FLOAT16
:
393 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_16_16_16_FLOAT
,
394 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
395 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
397 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
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_Y
,
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_Z
,
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_W
,
404 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
406 case MESA_FORMAT_RGB_FLOAT32
: /* X, Y, Z, ONE */
407 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_32_32_FLOAT
,
408 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
409 EG_SQ_TEX_RESOURCE_WORD7_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_RESOURCE7
, FMT_16_16_16_FLOAT
,
422 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
423 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
425 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
426 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
427 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
428 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
429 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
430 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
431 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
432 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
434 case MESA_FORMAT_ALPHA_FLOAT32
: /* ZERO, ZERO, ZERO, X */
435 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_FLOAT
,
436 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
437 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
439 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
440 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
441 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
442 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
443 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
444 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
445 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
446 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
448 case MESA_FORMAT_ALPHA_FLOAT16
: /* ZERO, ZERO, ZERO, X */
449 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_FLOAT
,
450 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
451 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
453 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
454 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
455 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
456 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
457 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
458 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
459 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
460 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
462 case MESA_FORMAT_LUMINANCE_FLOAT32
: /* X, X, X, ONE */
463 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_FLOAT
,
464 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
465 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
467 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
468 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
469 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
470 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
471 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
472 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
473 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
474 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
476 case MESA_FORMAT_LUMINANCE_FLOAT16
: /* X, X, X, ONE */
477 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_FLOAT
,
478 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
479 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
481 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
482 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
483 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
484 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
485 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
486 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
487 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
488 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
490 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
:
491 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_32_FLOAT
,
492 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
493 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
495 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
496 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
497 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
498 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
499 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
500 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
501 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
502 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
504 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
:
505 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_16_FLOAT
,
506 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
507 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
509 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
510 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
511 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
512 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
513 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
514 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
515 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
516 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
518 case MESA_FORMAT_INTENSITY_FLOAT32
: /* X, X, X, X */
519 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32_FLOAT
,
520 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
521 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
523 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
524 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
525 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
526 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
527 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
528 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
529 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
530 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
532 case MESA_FORMAT_INTENSITY_FLOAT16
: /* X, X, X, X */
533 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16_FLOAT
,
534 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
535 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
537 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
538 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
539 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
540 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
541 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
542 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
543 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
544 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
546 case MESA_FORMAT_Z16
:
547 case MESA_FORMAT_X8_Z24
:
548 case MESA_FORMAT_S8_Z24
:
549 case MESA_FORMAT_Z24_S8
:
550 case MESA_FORMAT_Z32
:
552 CLEARbit(t
->SQ_TEX_RESOURCE0
, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit
);
553 SETfield(t
->SQ_TEX_RESOURCE1
, ARRAY_1D_TILED_THIN1
,
554 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift
,
555 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask
);
556 switch (mesa_format
) {
557 case MESA_FORMAT_Z16
:
558 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_16
,
559 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
560 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
562 case MESA_FORMAT_X8_Z24
:
563 case MESA_FORMAT_S8_Z24
:
564 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_24
,
565 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
566 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
568 case MESA_FORMAT_Z24_S8
:
569 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_24_8
,
570 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
571 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
573 case MESA_FORMAT_Z32
:
574 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_32
,
575 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
576 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
579 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
580 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
581 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
586 switch (tObj
->DepthMode
) {
587 case GL_LUMINANCE
: /* X, X, X, ONE */
588 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
589 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
590 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
591 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
592 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
593 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
594 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
595 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
597 case GL_INTENSITY
: /* X, X, X, X */
598 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
599 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
600 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
601 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
602 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
603 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
604 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
605 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
607 case GL_ALPHA
: /* ZERO, ZERO, ZERO, X */
608 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_0
,
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_0
,
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_0
,
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_X
,
615 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
621 /* EXT_texture_sRGB */
622 case MESA_FORMAT_SRGBA8
:
623 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
624 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
625 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
627 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
628 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
629 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
630 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
631 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
632 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
633 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
634 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
635 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
637 case MESA_FORMAT_SLA8
:
638 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8
,
639 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
640 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
642 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
643 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
644 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
645 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
646 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
647 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
648 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
649 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
650 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
652 case MESA_FORMAT_SL8
: /* X, X, X, ONE */
653 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8
,
654 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
655 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
657 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
658 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
659 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
660 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
661 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
662 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
663 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
664 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
665 SETbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
668 /* Not supported format */
675 static GLuint
evergreen_translate_shadow_func(GLenum func
)
679 return SQ_TEX_DEPTH_COMPARE_NEVER
;
681 return SQ_TEX_DEPTH_COMPARE_LESS
;
683 return SQ_TEX_DEPTH_COMPARE_LESSEQUAL
;
685 return SQ_TEX_DEPTH_COMPARE_GREATER
;
687 return SQ_TEX_DEPTH_COMPARE_GREATEREQUAL
;
689 return SQ_TEX_DEPTH_COMPARE_NOTEQUAL
;
691 return SQ_TEX_DEPTH_COMPARE_EQUAL
;
693 return SQ_TEX_DEPTH_COMPARE_ALWAYS
;
695 WARN_ONCE("Unknown shadow compare function! %d", func
);
700 static void evergreenUpdateTexWrap(radeonTexObjPtr t
)
702 struct gl_texture_object
*tObj
= &t
->base
;
704 SETfield(t
->SQ_TEX_SAMPLER0
, evergreen_translate_wrap_mode(tObj
->WrapS
),
705 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
,
706 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask
);
708 if (tObj
->Target
!= GL_TEXTURE_1D
)
710 SETfield(t
->SQ_TEX_SAMPLER0
, evergreen_translate_wrap_mode(tObj
->WrapT
),
711 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Y_shift
,
712 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Y_mask
);
714 if (tObj
->Target
== GL_TEXTURE_3D
)
715 SETfield(t
->SQ_TEX_SAMPLER0
, evergreen_translate_wrap_mode(tObj
->WrapR
),
716 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Z_shift
,
717 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_Z_mask
);
721 static void evergreenSetTexDefaultState(radeonTexObjPtr t
)
723 /* Init text object to default states. */
724 t
->SQ_TEX_RESOURCE0
= 0;
725 t
->SQ_TEX_RESOURCE1
= 0;
726 t
->SQ_TEX_RESOURCE2
= 0;
727 t
->SQ_TEX_RESOURCE3
= 0;
728 t
->SQ_TEX_RESOURCE4
= 0;
729 t
->SQ_TEX_RESOURCE5
= 0;
730 t
->SQ_TEX_RESOURCE6
= 0;
731 t
->SQ_TEX_RESOURCE7
= 0;
733 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_2D
,
734 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
735 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
737 CLEARbit(t
->SQ_TEX_RESOURCE0
, EG_SQ_TEX_RESOURCE_WORD0_0__NDTO_bit
);
739 SETfield(t
->SQ_TEX_RESOURCE1
, ARRAY_LINEAR_GENERAL
,
740 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift
,
741 EG_SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask
);
743 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
744 FORMAT_COMP_X_shift
, FORMAT_COMP_X_mask
);
745 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
746 FORMAT_COMP_Y_shift
, FORMAT_COMP_Y_mask
);
747 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
748 FORMAT_COMP_Z_shift
, FORMAT_COMP_Z_mask
);
749 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_FORMAT_COMP_UNSIGNED
,
750 FORMAT_COMP_W_shift
, FORMAT_COMP_W_mask
);
751 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_NUM_FORMAT_NORM
,
752 SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_shift
, SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_mask
);
753 CLEARbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__SRF_MODE_ALL_bit
);
754 CLEARbit(t
->SQ_TEX_RESOURCE4
, SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit
);
755 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_ENDIAN_NONE
,
756 SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift
, SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_mask
);
758 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
759 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
,
760 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
761 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
762 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
,
763 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
764 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
765 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
,
766 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
767 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
768 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
,
769 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
770 SETfield(t
->SQ_TEX_RESOURCE4
, 0,
772 BASE_LEVEL_mask
); /* mip-maps */
774 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
775 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
776 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
777 SETfield(t
->SQ_TEX_RESOURCE7
, SQ_TEX_VTX_VALID_TEXTURE
,
778 EG_SQ_TEX_RESOURCE_WORD7_0__TYPE_shift
,
779 EG_SQ_TEX_RESOURCE_WORD7_0__TYPE_mask
);
781 /* Initialize sampler registers */
782 t
->SQ_TEX_SAMPLER0
= 0;
783 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_WRAP
,
784 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
,
785 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask
);
786 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_WRAP
,
787 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
,
788 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask
);
789 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_WRAP
,
790 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift
,
791 EG_SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask
);
792 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_XY_FILTER_POINT
,
793 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift
,
794 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask
);
795 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_XY_FILTER_POINT
,
796 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
797 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
798 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_Z_FILTER_NONE
,
799 EG_SQ_TEX_SAMPLER_WORD0_0__Z_FILTER_shift
,
800 EG_SQ_TEX_SAMPLER_WORD0_0__Z_FILTER_mask
);
801 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_Z_FILTER_NONE
,
802 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
803 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
804 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_BORDER_COLOR_TRANS_BLACK
,
805 EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_shift
,
806 EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_mask
);
808 t
->SQ_TEX_SAMPLER1
= 0;
809 SETfield(t
->SQ_TEX_SAMPLER1
, 0x7ff,
810 EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_shift
,
811 EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_mask
);
813 t
->SQ_TEX_SAMPLER2
= 0;
814 SETbit(t
->SQ_TEX_SAMPLER2
, EG_SQ_TEX_SAMPLER_WORD2_0__TYPE_bit
);
817 static void evergreenSetTexFilter(radeonTexObjPtr t
, GLenum minf
, GLenum magf
, GLfloat anisotropy
)
819 /* Force revalidation to account for switches from/to mipmapping. */
820 t
->validated
= GL_FALSE
;
822 /* Note that EXT_texture_filter_anisotropic is extremely vague about
823 * how anisotropic filtering interacts with the "normal" filter modes.
824 * When anisotropic filtering is enabled, we override min and mag
825 * filter settings completely. This includes driconf's settings.
827 if (anisotropy
>= 2.0 && (minf
!= GL_NEAREST
) && (magf
!= GL_NEAREST
)) {
828 /*t->pp_txfilter |= R300_TX_MAG_FILTER_ANISO
829 | R300_TX_MIN_FILTER_ANISO
830 | R300_TX_MIN_FILTER_MIP_LINEAR
831 | aniso_filter(anisotropy);*/
832 radeon_print(RADEON_TEXTURE
, RADEON_NORMAL
, "Using maximum anisotropy of %f\n", anisotropy
);
839 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Point
,
840 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
841 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
842 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_None
,
843 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
844 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
847 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Linear
,
848 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
849 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
850 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_None
,
851 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
852 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
854 case GL_NEAREST_MIPMAP_NEAREST
:
855 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Point
,
856 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
857 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
858 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_Point
,
859 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
860 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
862 case GL_NEAREST_MIPMAP_LINEAR
:
863 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Point
,
864 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
865 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
866 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_Linear
,
867 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
868 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
870 case GL_LINEAR_MIPMAP_NEAREST
:
871 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Linear
,
872 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
873 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
874 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_Point
,
875 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
876 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
878 case GL_LINEAR_MIPMAP_LINEAR
:
879 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Linear
,
880 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_shift
,
881 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MIN_FILTER_mask
);
882 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_MipFilter_Linear
,
883 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_shift
,
884 EG_SQ_TEX_SAMPLER_WORD0_0__MIP_FILTER_mask
);
888 /* Note we don't have 3D mipmaps so only use the mag filter setting
889 * to set the 3D texture filter mode.
894 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Point
,
895 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift
,
896 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask
);
899 SETfield(t
->SQ_TEX_SAMPLER0
, TEX_XYFilter_Linear
,
900 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_shift
,
901 EG_SQ_TEX_SAMPLER_WORD0_0__XY_MAG_FILTER_mask
);
906 static void evergreenSetTexBorderColor(radeonTexObjPtr t
, const GLfloat color
[4])
908 t
->TD_PS_SAMPLER0_BORDER_ALPHA
= *((uint32_t*)&(color
[3]));
909 t
->TD_PS_SAMPLER0_BORDER_RED
= *((uint32_t*)&(color
[2]));
910 t
->TD_PS_SAMPLER0_BORDER_GREEN
= *((uint32_t*)&(color
[1]));
911 t
->TD_PS_SAMPLER0_BORDER_BLUE
= *((uint32_t*)&(color
[0]));
913 SETfield(t
->SQ_TEX_SAMPLER0
, SQ_TEX_BORDER_COLOR_REGISTER
,
914 EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_shift
,
915 EG_SQ_TEX_SAMPLER_WORD0_0__BORDER_COLOR_TYPE_mask
);
918 static void evergreenSetDepthTexMode(struct gl_texture_object
*tObj
)
925 t
= radeon_tex_obj(tObj
);
927 if(!evergreenGetTexFormat(tObj
, tObj
->Image
[0][tObj
->BaseLevel
]->TexFormat
))
928 t
->validated
= GL_FALSE
;
931 static INLINE
uint32_t
932 EG_S_FIXED(float value
, uint32_t frac_bits
)
934 return value
* (1 << frac_bits
);
937 static GLboolean
evergreen_setup_hardware_state(GLcontext
* ctx
, struct gl_texture_object
*texObj
, int unit
)
939 context_t
*context
= EVERGREEN_CONTEXT(ctx
);
940 radeonTexObj
*t
= radeon_tex_obj(texObj
);
941 const struct gl_texture_image
*firstImage
;
942 GLuint uTexelPitch
, row_align
;
944 if (context
->radeon
.radeonScreen
->driScreen
->dri2
.enabled
&&
949 firstImage
= t
->base
.Image
[0][t
->minLod
];
951 if (!t
->image_override
) {
952 if (!evergreenGetTexFormat(texObj
, firstImage
->TexFormat
)) {
953 radeon_warning("unsupported texture format in %s\n",
959 switch (texObj
->Target
)
962 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_1D
,
963 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
964 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
965 SETfield(t
->SQ_TEX_RESOURCE1
, 0,
966 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift
,
967 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask
);
970 case GL_TEXTURE_RECTANGLE_NV
:
971 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_2D
,
972 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
973 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
974 SETfield(t
->SQ_TEX_RESOURCE1
, 0,
975 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift
,
976 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask
);
979 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_3D
,
980 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
981 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
982 SETfield(t
->SQ_TEX_RESOURCE1
, (firstImage
->Depth
- 1), // ???
983 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift
,
984 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask
);
986 case GL_TEXTURE_CUBE_MAP
:
987 SETfield(t
->SQ_TEX_RESOURCE0
, SQ_TEX_DIM_CUBEMAP
,
988 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_shift
,
989 EG_SQ_TEX_RESOURCE_WORD0_0__DIM_mask
);
990 SETfield(t
->SQ_TEX_RESOURCE1
, 0,
991 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_shift
,
992 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_DEPTH_mask
);
995 radeon_error("unexpected texture target type in %s\n", __FUNCTION__
);
999 row_align
= context
->radeon
.texture_row_align
- 1;
1000 uTexelPitch
= (_mesa_format_row_stride(firstImage
->TexFormat
, firstImage
->Width
) + row_align
) & ~row_align
;
1001 uTexelPitch
= uTexelPitch
/ _mesa_get_format_bytes(firstImage
->TexFormat
);
1002 uTexelPitch
= (uTexelPitch
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
1003 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
1005 /* min pitch is 8 */
1006 if (uTexelPitch
< 8)
1009 SETfield(t
->SQ_TEX_RESOURCE0
, (uTexelPitch
/8)-1,
1010 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift
,
1011 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask
);
1012 SETfield(t
->SQ_TEX_RESOURCE0
, firstImage
->Width
- 1,
1013 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_shift
,
1014 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_mask
);
1015 SETfield(t
->SQ_TEX_RESOURCE1
, firstImage
->Height
- 1,
1016 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_shift
,
1017 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_mask
);
1019 t
->SQ_TEX_RESOURCE2
= get_base_teximage_offset(t
) / 256;
1021 t
->SQ_TEX_RESOURCE3
= radeon_miptree_image_offset(t
->mt
, 0, t
->minLod
+ 1) / 256;
1023 SETfield(t
->SQ_TEX_RESOURCE4
, 0, BASE_LEVEL_shift
, BASE_LEVEL_mask
);
1024 SETfield(t
->SQ_TEX_RESOURCE5
, t
->maxLod
- t
->minLod
, LAST_LEVEL_shift
, LAST_LEVEL_mask
);
1026 SETfield(t
->SQ_TEX_SAMPLER1
,
1027 EG_S_FIXED(CLAMP(t
->base
.MinLod
- t
->minLod
, 0, 15), 6),
1028 EG_SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_shift
,
1029 EG_SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_mask
);
1030 SETfield(t
->SQ_TEX_SAMPLER1
,
1031 EG_S_FIXED(CLAMP(t
->base
.MaxLod
- t
->minLod
, 0, 15), 6),
1032 EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_shift
,
1033 EG_SQ_TEX_SAMPLER_WORD1_0__MAX_LOD_mask
);
1034 SETfield(t
->SQ_TEX_SAMPLER2
,
1035 EG_S_FIXED(CLAMP(ctx
->Texture
.Unit
[unit
].LodBias
+ t
->base
.LodBias
, -16, 16), 6),
1036 EG_SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_shift
,
1037 EG_SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_mask
);
1039 if(texObj
->CompareMode
== GL_COMPARE_R_TO_TEXTURE_ARB
)
1041 SETfield(t
->SQ_TEX_SAMPLER0
, evergreen_translate_shadow_func(texObj
->CompareFunc
),
1042 EG_SQ_TEX_SAMPLER_WORD0_0__DCF_shift
,
1043 EG_SQ_TEX_SAMPLER_WORD0_0__DCF_mask
);
1047 CLEARfield(t
->SQ_TEX_SAMPLER0
, EG_SQ_TEX_SAMPLER_WORD0_0__DCF_mask
);
1053 void evergreenSetTexOffset(__DRIcontext
* pDRICtx
, GLint texname
,
1054 unsigned long long offset
, GLint depth
, GLuint pitch
)
1056 context_t
*rmesa
= pDRICtx
->driverPrivate
;
1057 struct gl_texture_object
*tObj
=
1058 _mesa_lookup_texture(rmesa
->radeon
.glCtx
, texname
);
1059 radeonTexObjPtr t
= radeon_tex_obj(tObj
);
1060 const struct gl_texture_image
*firstImage
;
1061 uint32_t pitch_val
, size
, row_align
;
1066 t
->image_override
= GL_TRUE
;
1071 firstImage
= t
->base
.Image
[0][t
->minLod
];
1072 row_align
= rmesa
->radeon
.texture_row_align
- 1;
1073 size
= ((_mesa_format_row_stride(firstImage
->TexFormat
, firstImage
->Width
) + row_align
) & ~row_align
) * firstImage
->Height
;
1075 radeon_bo_unref(t
->bo
);
1078 t
->bo
= radeon_legacy_bo_alloc_fake(rmesa
->radeon
.radeonScreen
->bom
, size
, offset
);
1079 t
->override_offset
= offset
;
1083 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1084 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1085 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1087 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1088 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1089 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1090 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1091 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1092 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1093 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1094 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1099 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1100 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1101 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1103 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1104 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1105 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1106 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1107 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1108 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1109 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1110 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1114 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_5_6_5
,
1115 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1116 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1118 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1119 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1120 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1121 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1122 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1123 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1124 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1125 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1130 pitch_val
= (pitch_val
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
1131 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
1133 /* min pitch is 8 */
1137 SETfield(t
->SQ_TEX_RESOURCE0
, (pitch_val
/8)-1,
1138 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift
,
1139 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask
);
1142 void evergreenSetTexBuffer(__DRIcontext
*pDRICtx
, GLint target
, GLint glx_texture_format
, __DRIdrawable
*dPriv
)
1144 struct gl_texture_unit
*texUnit
;
1145 struct gl_texture_object
*texObj
;
1146 struct gl_texture_image
*texImage
;
1147 struct radeon_renderbuffer
*rb
;
1148 radeon_texture_image
*rImage
;
1149 radeonContextPtr radeon
;
1151 struct radeon_framebuffer
*rfb
;
1154 uint32_t internalFormat
, type
, format
;
1157 format
= GL_UNSIGNED_BYTE
;
1158 internalFormat
= (glx_texture_format
== __DRI_TEXTURE_FORMAT_RGB
? 3 : 4);
1160 radeon
= pDRICtx
->driverPrivate
;
1161 rmesa
= pDRICtx
->driverPrivate
;
1163 rfb
= dPriv
->driverPrivate
;
1164 texUnit
= &radeon
->glCtx
->Texture
.Unit
[radeon
->glCtx
->Texture
.CurrentUnit
];
1165 texObj
= _mesa_select_tex_object(radeon
->glCtx
, texUnit
, target
);
1166 texImage
= _mesa_get_tex_image(radeon
->glCtx
, texObj
, target
, 0);
1168 rImage
= get_radeon_texture_image(texImage
);
1169 t
= radeon_tex_obj(texObj
);
1174 radeon_update_renderbuffers(pDRICtx
, dPriv
, GL_TRUE
);
1175 rb
= rfb
->color_rb
[0];
1176 if (rb
->bo
== NULL
) {
1177 /* Failed to BO for the buffer */
1181 _mesa_lock_texture(radeon
->glCtx
, texObj
);
1183 radeon_bo_unref(t
->bo
);
1187 radeon_bo_unref(rImage
->bo
);
1191 radeon_miptree_unreference(&t
->mt
);
1192 radeon_miptree_unreference(&rImage
->mt
);
1194 _mesa_init_teximage_fields(radeon
->glCtx
, target
, texImage
,
1195 rb
->base
.Width
, rb
->base
.Height
, 1, 0, rb
->cpp
);
1196 texImage
->RowStride
= rb
->pitch
/ rb
->cpp
;
1198 rImage
->bo
= rb
->bo
;
1199 radeon_bo_ref(rImage
->bo
);
1201 radeon_bo_ref(t
->bo
);
1202 t
->image_override
= GL_TRUE
;
1203 t
->override_offset
= 0;
1204 pitch_val
= rb
->pitch
;
1207 if (glx_texture_format
== __DRI_TEXTURE_FORMAT_RGB
) {
1208 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1209 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1210 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1212 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1213 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1214 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1215 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1216 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1217 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1218 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1219 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1221 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1222 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1223 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1225 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1226 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1227 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1228 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1229 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1230 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1231 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1232 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1239 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_8_8_8_8
,
1240 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1241 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1243 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_W
,
1244 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1245 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1246 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1247 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1248 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1249 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1250 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1254 SETfield(t
->SQ_TEX_RESOURCE7
, FMT_5_6_5
,
1255 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift
,
1256 EG_SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask
);
1258 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Z
,
1259 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask
);
1260 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_Y
,
1261 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask
);
1262 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_X
,
1263 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask
);
1264 SETfield(t
->SQ_TEX_RESOURCE4
, SQ_SEL_1
,
1265 SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift
, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask
);
1270 pitch_val
= (pitch_val
+ R700_TEXEL_PITCH_ALIGNMENT_MASK
)
1271 & ~R700_TEXEL_PITCH_ALIGNMENT_MASK
;
1273 /* min pitch is 8 */
1277 SETfield(t
->SQ_TEX_RESOURCE0
, (pitch_val
/8)-1,
1278 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_shift
,
1279 EG_SQ_TEX_RESOURCE_WORD0_0__PITCH_mask
);
1280 SETfield(t
->SQ_TEX_RESOURCE0
, rb
->base
.Width
- 1,
1281 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_shift
,
1282 EG_SQ_TEX_RESOURCE_WORD0_0__TEX_WIDTH_mask
);
1283 SETfield(t
->SQ_TEX_RESOURCE1
, rb
->base
.Height
- 1,
1284 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_shift
,
1285 EG_SQ_TEX_RESOURCE_WORD1_0__TEX_HEIGHT_mask
);
1287 t
->validated
= GL_TRUE
;
1288 _mesa_unlock_texture(radeon
->glCtx
, texObj
);
1292 void evergreenUpdateTextureState(GLcontext
* ctx
)
1294 context_t
*context
= EVERGREEN_CONTEXT(ctx
);
1295 EVERGREEN_CHIP_CONTEXT
* evergreen
= GET_EVERGREEN_CHIP(context
);
1296 struct gl_texture_unit
*texUnit
;
1297 struct radeon_tex_obj
*t
;
1300 EVERGREEN_STATECHANGE(context
, tx
);
1302 for (unit
= 0; unit
< R700_MAX_TEXTURE_UNITS
; unit
++) {
1303 texUnit
= &ctx
->Texture
.Unit
[unit
];
1304 t
= radeon_tex_obj(ctx
->Texture
.Unit
[unit
]._Current
);
1305 evergreen
->textures
[unit
] = NULL
;
1306 if (texUnit
->_ReallyEnabled
) {
1309 evergreen
->textures
[unit
] = t
;
1314 static GLboolean
evergreen_validate_texture(GLcontext
* ctx
, struct gl_texture_object
*texObj
, int unit
)
1316 radeonTexObj
*t
= radeon_tex_obj(texObj
);
1318 if (!radeon_validate_texture_miptree(ctx
, texObj
))
1321 /* Configure the hardware registers (more precisely, the cached version
1322 * of the hardware registers). */
1323 if (!evergreen_setup_hardware_state(ctx
, texObj
, unit
))
1326 t
->validated
= GL_TRUE
;
1330 GLboolean
evergreenValidateBuffers(GLcontext
* ctx
)
1332 context_t
*rmesa
= EVERGREEN_CONTEXT(ctx
);
1333 struct radeon_renderbuffer
*rrb
;
1334 struct radeon_bo
*pbo
;
1338 radeon_cs_space_reset_bos(rmesa
->radeon
.cmdbuf
.cs
);
1340 rrb
= radeon_get_colorbuffer(&rmesa
->radeon
);
1342 if (rrb
&& rrb
->bo
) {
1343 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
1345 RADEON_GEM_DOMAIN_VRAM
);
1349 rrb
= radeon_get_depthbuffer(&rmesa
->radeon
);
1350 if (rrb
&& rrb
->bo
) {
1351 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
1353 RADEON_GEM_DOMAIN_VRAM
);
1356 for (i
= 0; i
< ctx
->Const
.MaxTextureImageUnits
; ++i
) {
1359 if (!ctx
->Texture
.Unit
[i
]._ReallyEnabled
)
1362 if (!evergreen_validate_texture(ctx
, ctx
->Texture
.Unit
[i
]._Current
, i
)) {
1363 radeon_warning("failed to validate texture for unit %d.\n", i
);
1365 t
= radeon_tex_obj(ctx
->Texture
.Unit
[i
]._Current
);
1366 if (t
->image_override
&& t
->bo
)
1367 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
1369 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
1371 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
,
1373 RADEON_GEM_DOMAIN_GTT
| RADEON_GEM_DOMAIN_VRAM
, 0);
1376 pbo
= (struct radeon_bo
*)evergreenGetActiveFpShaderBo(ctx
);
1378 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
1379 RADEON_GEM_DOMAIN_GTT
, 0);
1382 pbo
= (struct radeon_bo
*)evergreenGetActiveVpShaderBo(ctx
);
1384 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
1385 RADEON_GEM_DOMAIN_GTT
, 0);
1388 pbo
= (struct radeon_bo
*)evergreenGetActiveFpShaderConstBo(ctx
);
1390 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
1391 RADEON_GEM_DOMAIN_GTT
, 0);
1394 pbo
= (struct radeon_bo
*)evergreenGetActiveVpShaderConstBo(ctx
);
1396 radeon_cs_space_add_persistent_bo(rmesa
->radeon
.cmdbuf
.cs
, pbo
,
1397 RADEON_GEM_DOMAIN_GTT
, 0);
1400 ret
= radeon_cs_space_check_with_bo(rmesa
->radeon
.cmdbuf
.cs
, first_elem(&rmesa
->radeon
.dma
.reserved
)->bo
, RADEON_GEM_DOMAIN_GTT
, 0);
1406 static struct gl_texture_object
*evergreenNewTextureObject(GLcontext
* ctx
,
1410 context_t
* rmesa
= EVERGREEN_CONTEXT(ctx
);
1411 radeonTexObj
* t
= CALLOC_STRUCT(radeon_tex_obj
);
1414 radeon_print(RADEON_STATE
| RADEON_TEXTURE
, RADEON_NORMAL
,
1415 "%s( %p (target = %s) )\n", __FUNCTION__
,
1416 t
, _mesa_lookup_enum_by_nr(target
));
1418 _mesa_initialize_texture_object(&t
->base
, name
, target
);
1419 t
->base
.MaxAnisotropy
= rmesa
->radeon
.initialMaxAnisotropy
;
1421 evergreenSetTexDefaultState(t
);
1422 evergreenUpdateTexWrap(t
);
1423 evergreenSetTexFilter(t
, t
->base
.MinFilter
, t
->base
.MagFilter
, t
->base
.MaxAnisotropy
);
1424 evergreenSetTexBorderColor(t
, t
->base
.BorderColor
.f
);
1429 static void evergreenDeleteTexture(GLcontext
* ctx
, struct gl_texture_object
*texObj
)
1431 context_t
* rmesa
= EVERGREEN_CONTEXT(ctx
);
1432 EVERGREEN_CHIP_CONTEXT
* evergreen
= GET_EVERGREEN_CHIP(rmesa
);
1433 radeonTexObj
* t
= radeon_tex_obj(texObj
);
1435 radeon_print(RADEON_STATE
| RADEON_TEXTURE
, RADEON_NORMAL
,
1436 "%s( %p (target = %s) )\n", __FUNCTION__
,
1438 _mesa_lookup_enum_by_nr(texObj
->Target
));
1442 radeon_firevertices(&rmesa
->radeon
);
1444 for(i
= 0; i
< R700_MAX_TEXTURE_UNITS
; ++i
)
1445 if (evergreen
->textures
[i
] == t
)
1446 evergreen
->textures
[i
] = 0;
1450 radeon_bo_unref(t
->bo
);
1454 radeon_miptree_unreference(&t
->mt
);
1456 _mesa_delete_texture_object(ctx
, texObj
);
1459 static void evergreenTexParameter(GLcontext
* ctx
, GLenum target
,
1460 struct gl_texture_object
*texObj
,
1461 GLenum pname
, const GLfloat
* params
)
1463 radeonTexObj
* t
= radeon_tex_obj(texObj
);
1466 radeon_print(RADEON_STATE
| RADEON_TEXTURE
, RADEON_VERBOSE
,
1467 "%s( %s )\n", __FUNCTION__
,
1468 _mesa_lookup_enum_by_nr(pname
));
1471 case GL_TEXTURE_MIN_FILTER
:
1472 case GL_TEXTURE_MAG_FILTER
:
1473 case GL_TEXTURE_MAX_ANISOTROPY_EXT
:
1474 evergreenSetTexFilter(t
, texObj
->MinFilter
, texObj
->MagFilter
, texObj
->MaxAnisotropy
);
1477 case GL_TEXTURE_WRAP_S
:
1478 case GL_TEXTURE_WRAP_T
:
1479 case GL_TEXTURE_WRAP_R
:
1480 evergreenUpdateTexWrap(t
);
1483 case GL_TEXTURE_BORDER_COLOR
:
1484 evergreenSetTexBorderColor(t
, texObj
->BorderColor
.f
);
1487 case GL_TEXTURE_BASE_LEVEL
:
1488 case GL_TEXTURE_MAX_LEVEL
:
1489 case GL_TEXTURE_MIN_LOD
:
1490 case GL_TEXTURE_MAX_LOD
:
1491 t
->validated
= GL_FALSE
;
1494 case GL_DEPTH_TEXTURE_MODE
:
1495 if (!texObj
->Image
[0][texObj
->BaseLevel
])
1497 baseFormat
= texObj
->Image
[0][texObj
->BaseLevel
]->_BaseFormat
;
1498 if (baseFormat
== GL_DEPTH_COMPONENT
||
1499 baseFormat
== GL_DEPTH_STENCIL
) {
1500 evergreenSetDepthTexMode(texObj
);
1503 /* If the texture isn't a depth texture, changing this
1504 * state won't cause any changes to the hardware.
1505 * Don't force a flush of texture state.
1515 void evergreenInitTextureFuncs(radeonContextPtr radeon
, struct dd_function_table
*functions
)
1517 /* Note: we only plug in the functions we implement in the driver
1518 * since _mesa_init_driver_functions() was already called.
1520 functions
->NewTextureImage
= radeonNewTextureImage
;
1521 functions
->FreeTexImageData
= radeonFreeTexImageData
;
1522 functions
->MapTexture
= radeonMapTexture
;
1523 functions
->UnmapTexture
= radeonUnmapTexture
;
1525 functions
->ChooseTextureFormat
= radeonChooseTextureFormat_mesa
;
1526 functions
->TexImage1D
= radeonTexImage1D
;
1527 functions
->TexImage2D
= radeonTexImage2D
;
1528 functions
->TexImage3D
= radeonTexImage3D
;
1529 functions
->TexSubImage1D
= radeonTexSubImage1D
;
1530 functions
->TexSubImage2D
= radeonTexSubImage2D
;
1531 functions
->TexSubImage3D
= radeonTexSubImage3D
;
1532 functions
->GetTexImage
= radeonGetTexImage
;
1533 functions
->GetCompressedTexImage
= radeonGetCompressedTexImage
;
1534 functions
->NewTextureObject
= evergreenNewTextureObject
;
1535 functions
->DeleteTexture
= evergreenDeleteTexture
;
1536 functions
->IsTextureResident
= driIsTextureResident
;
1538 functions
->TexParameter
= evergreenTexParameter
;
1540 functions
->CompressedTexImage2D
= radeonCompressedTexImage2D
;
1541 functions
->CompressedTexSubImage2D
= radeonCompressedTexSubImage2D
;
1543 if (radeon
->radeonScreen
->kernel_mm
) {
1544 functions
->CopyTexImage2D
= radeonCopyTexImage2D
;
1545 functions
->CopyTexSubImage2D
= radeonCopyTexSubImage2D
;
1548 functions
->GenerateMipmap
= radeonGenerateMipmap
;
1550 driInitTextureFormats();