make: Remove duplicate occurence of driverfuncs.c
[mesa.git] / src / mesa / drivers / dri / r300 / r300_texstate.c
1 /*
2 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
3
4 The Weather Channel (TM) funded Tungsten Graphics to develop the
5 initial release of the Radeon 8500 driver under the XFree86 license.
6 This notice must be preserved.
7
8 Permission is hereby granted, free of charge, to any person obtaining
9 a copy of this software and associated documentation files (the
10 "Software"), to deal in the Software without restriction, including
11 without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense, and/or sell copies of the Software, and to
13 permit persons to whom the Software is furnished to do so, subject to
14 the following conditions:
15
16 The above copyright notice and this permission notice (including the
17 next paragraph) shall be included in all copies or substantial
18 portions of the Software.
19
20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 **************************************************************************/
29
30 /**
31 * \file
32 *
33 * \author Keith Whitwell <keith@tungstengraphics.com>
34 *
35 * \todo Enable R300 texture tiling code?
36 */
37
38 #include "main/glheader.h"
39 #include "main/imports.h"
40 #include "main/context.h"
41 #include "main/macros.h"
42 #include "main/teximage.h"
43 #include "main/texobj.h"
44 #include "main/enums.h"
45 #include "main/simple_list.h"
46
47 #include "r300_context.h"
48 #include "radeon_mipmap_tree.h"
49 #include "r300_tex.h"
50 #include "r300_reg.h"
51
52 /*
53 * Note that the _REV formats are the same as the non-REV formats. This is
54 * because the REV and non-REV formats are identical as a byte string, but
55 * differ when accessed as 16-bit or 32-bit words depending on the endianness of
56 * the host. Since the textures are transferred to the R300 as a byte string
57 * (i.e. without any byte-swapping), the R300 sees the REV and non-REV formats
58 * identically. -- paulus
59 */
60
61 int32_t r300TranslateTexFormat(gl_format mesaFormat)
62 {
63 switch (mesaFormat)
64 {
65 #ifdef MESA_LITTLE_ENDIAN
66 case MESA_FORMAT_RGBA8888:
67 return R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8);
68 case MESA_FORMAT_RGBA8888_REV:
69 return R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8);
70 case MESA_FORMAT_ARGB8888:
71 return R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
72 case MESA_FORMAT_ARGB8888_REV:
73 return R300_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8);
74 #else
75 case MESA_FORMAT_RGBA8888:
76 return R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8);
77 case MESA_FORMAT_RGBA8888_REV:
78 return R300_EASY_TX_FORMAT(Y, Z, W, X, W8Z8Y8X8);
79 case MESA_FORMAT_ARGB8888:
80 return R300_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8);
81 case MESA_FORMAT_ARGB8888_REV:
82 return R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
83 #endif
84 case MESA_FORMAT_XRGB8888:
85 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
86 case MESA_FORMAT_RGB888:
87 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
88 case MESA_FORMAT_RGB565:
89 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
90 case MESA_FORMAT_RGB565_REV:
91 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
92 case MESA_FORMAT_ARGB4444:
93 return R300_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4);
94 case MESA_FORMAT_ARGB4444_REV:
95 return R300_EASY_TX_FORMAT(X, Y, Z, W, W4Z4Y4X4);
96 case MESA_FORMAT_ARGB1555:
97 return R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5);
98 case MESA_FORMAT_ARGB1555_REV:
99 return R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5);
100 case MESA_FORMAT_AL88:
101 return R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8);
102 case MESA_FORMAT_AL88_REV:
103 return R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8);
104 case MESA_FORMAT_RGB332:
105 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z3Y3X2);
106 case MESA_FORMAT_A8:
107 return R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X8);
108 case MESA_FORMAT_L8:
109 return R300_EASY_TX_FORMAT(X, X, X, ONE, X8);
110 case MESA_FORMAT_I8:
111 return R300_EASY_TX_FORMAT(X, X, X, X, X8);
112 case MESA_FORMAT_YCBCR:
113 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE;
114 case MESA_FORMAT_YCBCR_REV:
115 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE;
116 case MESA_FORMAT_RGB_DXT1:
117 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1);
118 case MESA_FORMAT_RGBA_DXT1:
119 return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1);
120 case MESA_FORMAT_RGBA_DXT3:
121 return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3);
122 case MESA_FORMAT_RGBA_DXT5:
123 return R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5);
124 case MESA_FORMAT_RGBA_FLOAT32:
125 return R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R32G32B32A32);
126 case MESA_FORMAT_RGBA_FLOAT16:
127 return R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16);
128 case MESA_FORMAT_ALPHA_FLOAT32:
129 return R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I32);
130 case MESA_FORMAT_ALPHA_FLOAT16:
131 return R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I16);
132 case MESA_FORMAT_LUMINANCE_FLOAT32:
133 return R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I32);
134 case MESA_FORMAT_LUMINANCE_FLOAT16:
135 return R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I16);
136 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
137 return R300_EASY_TX_FORMAT(X, X, X, Y, FL_I32A32);
138 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
139 return R300_EASY_TX_FORMAT(X, X, X, Y, FL_I16A16);
140 case MESA_FORMAT_INTENSITY_FLOAT32:
141 return R300_EASY_TX_FORMAT(X, X, X, X, FL_I32);
142 case MESA_FORMAT_INTENSITY_FLOAT16:
143 return R300_EASY_TX_FORMAT(X, X, X, X, FL_I16);
144 case MESA_FORMAT_Z16:
145 return R300_EASY_TX_FORMAT(X, X, X, X, X16);
146 case MESA_FORMAT_Z24_S8:
147 return R300_EASY_TX_FORMAT(X, X, X, X, X24_Y8);
148 case MESA_FORMAT_S8_Z24:
149 return R300_EASY_TX_FORMAT(Y, Y, Y, Y, X24_Y8);
150 case MESA_FORMAT_Z32:
151 return R300_EASY_TX_FORMAT(X, X, X, X, X32);
152 /* EXT_texture_sRGB */
153 case MESA_FORMAT_SARGB8:
154 return R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8) | R300_TX_FORMAT_GAMMA;
155 case MESA_FORMAT_SLA8:
156 return R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8) | R300_TX_FORMAT_GAMMA;
157 case MESA_FORMAT_SL8:
158 return R300_EASY_TX_FORMAT(X, X, X, ONE, X8) | R300_TX_FORMAT_GAMMA;
159 case MESA_FORMAT_SRGB_DXT1:
160 return R300_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1) | R300_TX_FORMAT_GAMMA;
161 case MESA_FORMAT_SRGBA_DXT1:
162 return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1) | R300_TX_FORMAT_GAMMA;
163 case MESA_FORMAT_SRGBA_DXT3:
164 return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3) | R300_TX_FORMAT_GAMMA;
165 case MESA_FORMAT_SRGBA_DXT5:
166 return R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5) | R300_TX_FORMAT_GAMMA;
167 default:
168 return -1;
169 }
170 };
171
172 void r300SetDepthTexMode(struct gl_texture_object *tObj)
173 {
174 static const GLuint formats[3][3] = {
175 {
176 R300_EASY_TX_FORMAT(X, X, X, ONE, X16),
177 R300_EASY_TX_FORMAT(X, X, X, X, X16),
178 R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X16),
179 },
180 {
181 R300_EASY_TX_FORMAT(Y, Y, Y, ONE, X24_Y8),
182 R300_EASY_TX_FORMAT(Y, Y, Y, Y, X24_Y8),
183 R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, Y, X24_Y8),
184 },
185 {
186 R300_EASY_TX_FORMAT(X, X, X, ONE, X32),
187 R300_EASY_TX_FORMAT(X, X, X, X, X32),
188 R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X32),
189 },
190 };
191 const GLuint *format;
192 radeonTexObjPtr t;
193
194 if (!tObj)
195 return;
196
197 t = radeon_tex_obj(tObj);
198
199 switch (tObj->Image[0][tObj->BaseLevel]->TexFormat) {
200 case MESA_FORMAT_Z16:
201 format = formats[0];
202 break;
203 case MESA_FORMAT_S8_Z24:
204 format = formats[1];
205 break;
206 case MESA_FORMAT_Z32:
207 format = formats[2];
208 break;
209 default:
210 /* Error...which should have already been caught by higher
211 * levels of Mesa.
212 */
213 ASSERT(0);
214 return;
215 }
216
217 switch (tObj->Sampler.DepthMode) {
218 case GL_LUMINANCE:
219 t->pp_txformat = format[0];
220 break;
221 case GL_INTENSITY:
222 t->pp_txformat = format[1];
223 break;
224 case GL_ALPHA:
225 t->pp_txformat = format[2];
226 break;
227 default:
228 /* Error...which should have already been caught by higher
229 * levels of Mesa.
230 */
231 ASSERT(0);
232 return;
233 }
234 }
235
236
237 /**
238 * Compute the cached hardware register values for the given texture object.
239 *
240 * \param rmesa Context pointer
241 * \param t the r300 texture object
242 */
243 static void setup_hardware_state(r300ContextPtr rmesa, radeonTexObj *t)
244 {
245 const struct gl_texture_image *firstImage;
246 firstImage = t->base.Image[0][t->minLod];
247
248 if (!t->image_override) {
249 if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {
250 r300SetDepthTexMode(&t->base);
251 } else {
252 int32_t txformat = r300TranslateTexFormat(firstImage->TexFormat);
253 if (txformat < 0) {
254 _mesa_problem(rmesa->radeon.glCtx, "%s: Invalid format %s",
255 __FUNCTION__, _mesa_get_format_name(firstImage->TexFormat));
256 exit(1);
257 }
258 t->pp_txformat = (uint32_t) txformat;
259 }
260 }
261
262 if (t->image_override && t->bo)
263 return;
264
265 t->pp_txsize = (((R300_TX_WIDTHMASK_MASK & ((firstImage->Width - 1) << R300_TX_WIDTHMASK_SHIFT)))
266 | ((R300_TX_HEIGHTMASK_MASK & ((firstImage->Height - 1) << R300_TX_HEIGHTMASK_SHIFT)))
267 | ((R300_TX_DEPTHMASK_MASK & ((firstImage->DepthLog2) << R300_TX_DEPTHMASK_SHIFT)))
268 | ((R300_TX_MAX_MIP_LEVEL_MASK & ((t->maxLod - t->minLod) << R300_TX_MAX_MIP_LEVEL_SHIFT))));
269
270 t->tile_bits = 0;
271
272 if (t->base.Target == GL_TEXTURE_CUBE_MAP)
273 t->pp_txformat |= R300_TX_FORMAT_CUBIC_MAP;
274 if (t->base.Target == GL_TEXTURE_3D)
275 t->pp_txformat |= R300_TX_FORMAT_3D;
276
277
278 if (t->base.Target == GL_TEXTURE_RECTANGLE_NV) {
279 unsigned int align = (64 / _mesa_get_format_bytes(firstImage->TexFormat)) - 1;
280 t->pp_txsize |= R300_TX_SIZE_TXPITCH_EN;
281 if (!t->image_override)
282 t->pp_txpitch = ((firstImage->Width + align) & ~align) - 1;
283 }
284
285 if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
286 if (firstImage->Width > 2048)
287 t->pp_txpitch |= R500_TXWIDTH_BIT11;
288 else
289 t->pp_txpitch &= ~R500_TXWIDTH_BIT11;
290 if (firstImage->Height > 2048)
291 t->pp_txpitch |= R500_TXHEIGHT_BIT11;
292 else
293 t->pp_txpitch &= ~R500_TXHEIGHT_BIT11;
294 }
295 }
296
297 /**
298 * Ensure the given texture is ready for rendering.
299 *
300 * Mostly this means populating the texture object's mipmap tree.
301 */
302 static GLboolean r300_validate_texture(struct gl_context * ctx, struct gl_texture_object *texObj)
303 {
304 r300ContextPtr rmesa = R300_CONTEXT(ctx);
305 radeonTexObj *t = radeon_tex_obj(texObj);
306
307 if (!radeon_validate_texture_miptree(ctx, texObj))
308 return GL_FALSE;
309
310 /* Configure the hardware registers (more precisely, the cached version
311 * of the hardware registers). */
312 setup_hardware_state(rmesa, t);
313
314 t->validated = GL_TRUE;
315 return GL_TRUE;
316 }
317
318 /**
319 * Ensure all enabled and complete textures are uploaded along with any buffers being used.
320 */
321 GLboolean r300ValidateBuffers(struct gl_context * ctx)
322 {
323 r300ContextPtr rmesa = R300_CONTEXT(ctx);
324 struct radeon_renderbuffer *rrb;
325 int i;
326 int ret;
327
328 radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
329
330 rrb = radeon_get_colorbuffer(&rmesa->radeon);
331 /* color buffer */
332 if (rrb && rrb->bo) {
333 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
334 rrb->bo, 0,
335 RADEON_GEM_DOMAIN_VRAM);
336 }
337
338 /* depth buffer */
339 rrb = radeon_get_depthbuffer(&rmesa->radeon);
340 if (rrb && rrb->bo) {
341 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
342 rrb->bo, 0,
343 RADEON_GEM_DOMAIN_VRAM);
344 }
345
346 for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
347 radeonTexObj *t;
348
349 if (!ctx->Texture.Unit[i]._ReallyEnabled)
350 continue;
351
352 if (!r300_validate_texture(ctx, ctx->Texture.Unit[i]._Current)) {
353 _mesa_warning(ctx,
354 "failed to validate texture for unit %d.\n",
355 i);
356 }
357 t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
358 if (t->image_override && t->bo)
359 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
360 t->bo,
361 RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
362 else if (t->mt->bo)
363 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
364 t->mt->bo,
365 RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
366 }
367
368 ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, first_elem(&rmesa->radeon.dma.reserved)->bo, RADEON_GEM_DOMAIN_GTT, 0);
369 if (ret)
370 return GL_FALSE;
371 return GL_TRUE;
372 }
373
374 void r300SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
375 unsigned long long offset, GLint depth, GLuint pitch)
376 {
377 r300ContextPtr rmesa = pDRICtx->driverPrivate;
378 struct gl_texture_object *tObj =
379 _mesa_lookup_texture(rmesa->radeon.glCtx, texname);
380 radeonTexObjPtr t = radeon_tex_obj(tObj);
381 uint32_t pitch_val;
382
383 if (!tObj)
384 return;
385
386 t->image_override = GL_TRUE;
387
388 if (!offset)
389 return;
390
391 t->bo = NULL;
392 t->override_offset = offset;
393 t->pp_txpitch &= (1 << 13) -1;
394 pitch_val = pitch;
395
396 switch (depth) {
397 case 32:
398 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
399 pitch_val /= 4;
400 break;
401 case 24:
402 default:
403 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
404 pitch_val /= 4;
405 break;
406 case 16:
407 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
408 pitch_val /= 2;
409 break;
410 }
411 pitch_val--;
412
413 t->pp_txpitch |= pitch_val;
414 }
415
416 void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint texture_format, __DRIdrawable *dPriv)
417 {
418 struct gl_texture_unit *texUnit;
419 struct gl_texture_object *texObj;
420 struct gl_texture_image *texImage;
421 struct radeon_renderbuffer *rb;
422 radeon_texture_image *rImage;
423 radeonContextPtr radeon;
424 r300ContextPtr rmesa;
425 struct radeon_framebuffer *rfb;
426 radeonTexObjPtr t;
427 uint32_t pitch_val;
428 gl_format texFormat;
429
430 radeon = pDRICtx->driverPrivate;
431 rmesa = pDRICtx->driverPrivate;
432
433 rfb = dPriv->driverPrivate;
434 texUnit = &radeon->glCtx->Texture.Unit[radeon->glCtx->Texture.CurrentUnit];
435 texObj = _mesa_select_tex_object(radeon->glCtx, texUnit, target);
436 texImage = _mesa_get_tex_image(radeon->glCtx, texObj, target, 0);
437
438 rImage = get_radeon_texture_image(texImage);
439 t = radeon_tex_obj(texObj);
440 if (t == NULL) {
441 return;
442 }
443
444 radeon_update_renderbuffers(pDRICtx, dPriv, GL_TRUE);
445 rb = rfb->color_rb[0];
446 if (rb->bo == NULL) {
447 /* Failed to BO for the buffer */
448 return;
449 }
450
451 _mesa_lock_texture(radeon->glCtx, texObj);
452 if (t->bo) {
453 radeon_bo_unref(t->bo);
454 t->bo = NULL;
455 }
456 if (rImage->bo) {
457 radeon_bo_unref(rImage->bo);
458 rImage->bo = NULL;
459 }
460
461 radeon_miptree_unreference(&t->mt);
462 radeon_miptree_unreference(&rImage->mt);
463
464 rImage->bo = rb->bo;
465 radeon_bo_ref(rImage->bo);
466 t->bo = rb->bo;
467 radeon_bo_ref(t->bo);
468 t->tile_bits = 0;
469 t->image_override = GL_TRUE;
470 t->override_offset = 0;
471 t->pp_txpitch &= (1 << 13) -1;
472 pitch_val = rb->pitch;
473 switch (rb->cpp) {
474 case 4:
475 if (texture_format == __DRI_TEXTURE_FORMAT_RGB) {
476 texFormat = MESA_FORMAT_RGB888;
477 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
478 }
479 else {
480 texFormat = MESA_FORMAT_ARGB8888;
481 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
482 }
483 pitch_val /= 4;
484 break;
485 case 3:
486 default:
487 texFormat = MESA_FORMAT_RGB888;
488 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
489 pitch_val /= 4;
490 break;
491 case 2:
492 texFormat = MESA_FORMAT_RGB565;
493 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
494 pitch_val /= 2;
495 break;
496 }
497
498 _mesa_init_teximage_fields(radeon->glCtx, target, texImage,
499 rb->base.Width, rb->base.Height, 1, 0,
500 rb->cpp, texFormat);
501 texImage->RowStride = rb->pitch / rb->cpp;
502
503
504 pitch_val--;
505 t->pp_txsize = (((R300_TX_WIDTHMASK_MASK & ((rb->base.Width - 1) << R300_TX_WIDTHMASK_SHIFT)))
506 | ((R300_TX_HEIGHTMASK_MASK & ((rb->base.Height - 1) << R300_TX_HEIGHTMASK_SHIFT))));
507 t->pp_txsize |= R300_TX_SIZE_TXPITCH_EN;
508 t->pp_txpitch |= pitch_val;
509
510 if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
511 if (rb->base.Width > 2048)
512 t->pp_txpitch |= R500_TXWIDTH_BIT11;
513 else
514 t->pp_txpitch &= ~R500_TXWIDTH_BIT11;
515 if (rb->base.Height > 2048)
516 t->pp_txpitch |= R500_TXHEIGHT_BIT11;
517 else
518 t->pp_txpitch &= ~R500_TXHEIGHT_BIT11;
519 }
520 t->validated = GL_TRUE;
521 _mesa_unlock_texture(radeon->glCtx, texObj);
522 return;
523 }
524
525 void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
526 {
527 r300SetTexBuffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv);
528 }