mesa: Remove build infrastructure for r300c and r600c.
[profile/ivi/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         rImage->base.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 }