Tizen 2.0 Release
[profile/ivi/osmesa.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_CI8:
113                         return R300_EASY_TX_FORMAT(X, X, X, X, X8);
114                 case MESA_FORMAT_YCBCR:
115                         return R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE;
116                 case MESA_FORMAT_YCBCR_REV:
117                         return R300_EASY_TX_FORMAT(X, Y, Z, ONE, G8R8_G8B8) | R300_TX_FORMAT_YUV_MODE;
118                 case MESA_FORMAT_RGB_DXT1:
119                         return R300_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1);
120                 case MESA_FORMAT_RGBA_DXT1:
121                         return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1);
122                 case MESA_FORMAT_RGBA_DXT3:
123                         return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3);
124                 case MESA_FORMAT_RGBA_DXT5:
125                         return R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5);
126                 case MESA_FORMAT_RGBA_FLOAT32:
127                         return R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R32G32B32A32);
128                 case MESA_FORMAT_RGBA_FLOAT16:
129                         return R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16);
130                 case MESA_FORMAT_ALPHA_FLOAT32:
131                         return R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I32);
132                 case MESA_FORMAT_ALPHA_FLOAT16:
133                         return R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I16);
134                 case MESA_FORMAT_LUMINANCE_FLOAT32:
135                         return R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I32);
136                 case MESA_FORMAT_LUMINANCE_FLOAT16:
137                         return R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I16);
138                 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
139                         return R300_EASY_TX_FORMAT(X, X, X, Y, FL_I32A32);
140                 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
141                         return R300_EASY_TX_FORMAT(X, X, X, Y, FL_I16A16);
142                 case MESA_FORMAT_INTENSITY_FLOAT32:
143                         return R300_EASY_TX_FORMAT(X, X, X, X, FL_I32);
144                 case MESA_FORMAT_INTENSITY_FLOAT16:
145                         return R300_EASY_TX_FORMAT(X, X, X, X, FL_I16);
146                 case MESA_FORMAT_Z16:
147                         return R300_EASY_TX_FORMAT(X, X, X, X, X16);
148                 case MESA_FORMAT_Z24_S8:
149                         return R300_EASY_TX_FORMAT(X, X, X, X, X24_Y8);
150                 case MESA_FORMAT_S8_Z24:
151                         return R300_EASY_TX_FORMAT(Y, Y, Y, Y, X24_Y8);
152                 case MESA_FORMAT_Z32:
153                         return R300_EASY_TX_FORMAT(X, X, X, X, X32);
154                 /* EXT_texture_sRGB */
155                 case MESA_FORMAT_SARGB8:
156                         return R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8) | R300_TX_FORMAT_GAMMA;
157                 case MESA_FORMAT_SLA8:
158                         return R300_EASY_TX_FORMAT(X, X, X, Y, Y8X8) | R300_TX_FORMAT_GAMMA;
159                 case MESA_FORMAT_SL8:
160                         return R300_EASY_TX_FORMAT(X, X, X, ONE, X8) | R300_TX_FORMAT_GAMMA;
161                 case MESA_FORMAT_SRGB_DXT1:
162                         return R300_EASY_TX_FORMAT(X, Y, Z, ONE, DXT1) | R300_TX_FORMAT_GAMMA;
163                 case MESA_FORMAT_SRGBA_DXT1:
164                         return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1) | R300_TX_FORMAT_GAMMA;
165                 case MESA_FORMAT_SRGBA_DXT3:
166                         return R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3) | R300_TX_FORMAT_GAMMA;
167                 case MESA_FORMAT_SRGBA_DXT5:
168                         return R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5) | R300_TX_FORMAT_GAMMA;
169                 default:
170                         return -1;
171         }
172 };
173
174 void r300SetDepthTexMode(struct gl_texture_object *tObj)
175 {
176         static const GLuint formats[3][3] = {
177                 {
178                         R300_EASY_TX_FORMAT(X, X, X, ONE, X16),
179                         R300_EASY_TX_FORMAT(X, X, X, X, X16),
180                         R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X16),
181                 },
182                 {
183                         R300_EASY_TX_FORMAT(Y, Y, Y, ONE, X24_Y8),
184                         R300_EASY_TX_FORMAT(Y, Y, Y, Y, X24_Y8),
185                         R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, Y, X24_Y8),
186                 },
187                 {
188                         R300_EASY_TX_FORMAT(X, X, X, ONE, X32),
189                         R300_EASY_TX_FORMAT(X, X, X, X, X32),
190                         R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X32),
191                 },
192         };
193         const GLuint *format;
194         radeonTexObjPtr t;
195
196         if (!tObj)
197                 return;
198
199         t = radeon_tex_obj(tObj);
200
201         switch (tObj->Image[0][tObj->BaseLevel]->TexFormat) {
202         case MESA_FORMAT_Z16:
203                 format = formats[0];
204                 break;
205         case MESA_FORMAT_S8_Z24:
206                 format = formats[1];
207                 break;
208         case MESA_FORMAT_Z32:
209                 format = formats[2];
210                 break;
211         default:
212                 /* Error...which should have already been caught by higher
213                  * levels of Mesa.
214                  */
215                 ASSERT(0);
216                 return;
217         }
218
219         switch (tObj->Sampler.DepthMode) {
220         case GL_LUMINANCE:
221                 t->pp_txformat = format[0];
222                 break;
223         case GL_INTENSITY:
224                 t->pp_txformat = format[1];
225                 break;
226         case GL_ALPHA:
227                 t->pp_txformat = format[2];
228                 break;
229         default:
230                 /* Error...which should have already been caught by higher
231                  * levels of Mesa.
232                  */
233                 ASSERT(0);
234                 return;
235         }
236 }
237
238
239 /**
240  * Compute the cached hardware register values for the given texture object.
241  *
242  * \param rmesa Context pointer
243  * \param t the r300 texture object
244  */
245 static void setup_hardware_state(r300ContextPtr rmesa, radeonTexObj *t)
246 {
247         const struct gl_texture_image *firstImage;
248         firstImage = t->base.Image[0][t->minLod];
249
250         if (!t->image_override) {
251                 if (firstImage->_BaseFormat == GL_DEPTH_COMPONENT) {
252                         r300SetDepthTexMode(&t->base);
253                 } else {
254                         int32_t txformat = r300TranslateTexFormat(firstImage->TexFormat);
255                         if (txformat < 0) {
256                                 _mesa_problem(rmesa->radeon.glCtx, "%s: Invalid format %s",
257                                                           __FUNCTION__, _mesa_get_format_name(firstImage->TexFormat));
258                                 exit(1);
259                         }
260                         t->pp_txformat = (uint32_t) txformat;
261                 }
262         }
263
264         if (t->image_override && t->bo)
265                 return;
266
267         t->pp_txsize = (((R300_TX_WIDTHMASK_MASK & ((firstImage->Width - 1) << R300_TX_WIDTHMASK_SHIFT)))
268                         | ((R300_TX_HEIGHTMASK_MASK & ((firstImage->Height - 1) << R300_TX_HEIGHTMASK_SHIFT)))
269                         | ((R300_TX_DEPTHMASK_MASK & ((firstImage->DepthLog2) << R300_TX_DEPTHMASK_SHIFT)))
270                         | ((R300_TX_MAX_MIP_LEVEL_MASK & ((t->maxLod - t->minLod) << R300_TX_MAX_MIP_LEVEL_SHIFT))));
271
272         t->tile_bits = 0;
273
274         if (t->base.Target == GL_TEXTURE_CUBE_MAP)
275                 t->pp_txformat |= R300_TX_FORMAT_CUBIC_MAP;
276         if (t->base.Target == GL_TEXTURE_3D)
277                 t->pp_txformat |= R300_TX_FORMAT_3D;
278
279
280         if (t->base.Target == GL_TEXTURE_RECTANGLE_NV) {
281                 unsigned int align = (64 / _mesa_get_format_bytes(firstImage->TexFormat)) - 1;
282                 t->pp_txsize |= R300_TX_SIZE_TXPITCH_EN;
283                 if (!t->image_override)
284                         t->pp_txpitch = ((firstImage->Width + align) & ~align) - 1;
285         }
286
287         if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
288             if (firstImage->Width > 2048)
289                 t->pp_txpitch |= R500_TXWIDTH_BIT11;
290             else
291                 t->pp_txpitch &= ~R500_TXWIDTH_BIT11;
292             if (firstImage->Height > 2048)
293                 t->pp_txpitch |= R500_TXHEIGHT_BIT11;
294             else
295                 t->pp_txpitch &= ~R500_TXHEIGHT_BIT11;
296         }
297 }
298
299 /**
300  * Ensure the given texture is ready for rendering.
301  *
302  * Mostly this means populating the texture object's mipmap tree.
303  */
304 static GLboolean r300_validate_texture(struct gl_context * ctx, struct gl_texture_object *texObj)
305 {
306         r300ContextPtr rmesa = R300_CONTEXT(ctx);
307         radeonTexObj *t = radeon_tex_obj(texObj);
308
309         if (!radeon_validate_texture_miptree(ctx, texObj))
310                 return GL_FALSE;
311
312         /* Configure the hardware registers (more precisely, the cached version
313          * of the hardware registers). */
314         setup_hardware_state(rmesa, t);
315
316         t->validated = GL_TRUE;
317         return GL_TRUE;
318 }
319
320 /**
321  * Ensure all enabled and complete textures are uploaded along with any buffers being used.
322  */
323 GLboolean r300ValidateBuffers(struct gl_context * ctx)
324 {
325         r300ContextPtr rmesa = R300_CONTEXT(ctx);
326         struct radeon_renderbuffer *rrb;
327         int i;
328         int ret;
329
330         radeon_cs_space_reset_bos(rmesa->radeon.cmdbuf.cs);
331
332         rrb = radeon_get_colorbuffer(&rmesa->radeon);
333         /* color buffer */
334         if (rrb && rrb->bo) {
335                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
336                                                   rrb->bo, 0,
337                                                   RADEON_GEM_DOMAIN_VRAM);
338         }
339
340         /* depth buffer */
341         rrb = radeon_get_depthbuffer(&rmesa->radeon);
342         if (rrb && rrb->bo) {
343                 radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
344                                                   rrb->bo, 0,
345                                                   RADEON_GEM_DOMAIN_VRAM);
346         }
347         
348         for (i = 0; i < ctx->Const.MaxTextureImageUnits; ++i) {
349                 radeonTexObj *t;
350
351                 if (!ctx->Texture.Unit[i]._ReallyEnabled)
352                         continue;
353
354                 if (!r300_validate_texture(ctx, ctx->Texture.Unit[i]._Current)) {
355                         _mesa_warning(ctx,
356                                       "failed to validate texture for unit %d.\n",
357                                       i);
358                 }
359                 t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
360                 if (t->image_override && t->bo)
361                         radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
362                                                           t->bo,
363                                                           RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
364                 else if (t->mt->bo)
365                         radeon_cs_space_add_persistent_bo(rmesa->radeon.cmdbuf.cs,
366                                                           t->mt->bo,
367                                                           RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0);
368         }
369
370         ret = radeon_cs_space_check_with_bo(rmesa->radeon.cmdbuf.cs, first_elem(&rmesa->radeon.dma.reserved)->bo, RADEON_GEM_DOMAIN_GTT, 0);
371         if (ret)
372                 return GL_FALSE;
373         return GL_TRUE;
374 }
375
376 void r300SetTexOffset(__DRIcontext * pDRICtx, GLint texname,
377                       unsigned long long offset, GLint depth, GLuint pitch)
378 {
379         r300ContextPtr rmesa = pDRICtx->driverPrivate;
380         struct gl_texture_object *tObj =
381             _mesa_lookup_texture(rmesa->radeon.glCtx, texname);
382         radeonTexObjPtr t = radeon_tex_obj(tObj);
383         uint32_t pitch_val;
384
385         if (!tObj)
386                 return;
387
388         t->image_override = GL_TRUE;
389
390         if (!offset)
391                 return;
392
393         t->bo = NULL;
394         t->override_offset = offset;
395         t->pp_txpitch &= (1 << 13) -1;
396         pitch_val = pitch;
397
398         switch (depth) {
399         case 32:
400                 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
401                 pitch_val /= 4;
402                 break;
403         case 24:
404         default:
405                 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
406                 pitch_val /= 4;
407                 break;
408         case 16:
409                 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
410                 pitch_val /= 2;
411                 break;
412         }
413         pitch_val--;
414
415         t->pp_txpitch |= pitch_val;
416 }
417
418 void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint texture_format, __DRIdrawable *dPriv)
419 {
420         struct gl_texture_unit *texUnit;
421         struct gl_texture_object *texObj;
422         struct gl_texture_image *texImage;
423         struct radeon_renderbuffer *rb;
424         radeon_texture_image *rImage;
425         radeonContextPtr radeon;
426         r300ContextPtr rmesa;
427         struct radeon_framebuffer *rfb;
428         radeonTexObjPtr t;
429         uint32_t pitch_val;
430         uint32_t internalFormat, type, format;
431         gl_format texFormat;
432
433         type = GL_BGRA;
434         format = GL_UNSIGNED_BYTE;
435         internalFormat = (texture_format == __DRI_TEXTURE_FORMAT_RGB ? 3 : 4);
436
437         radeon = pDRICtx->driverPrivate;
438         rmesa = pDRICtx->driverPrivate;
439
440         rfb = dPriv->driverPrivate;
441         texUnit = &radeon->glCtx->Texture.Unit[radeon->glCtx->Texture.CurrentUnit];
442         texObj = _mesa_select_tex_object(radeon->glCtx, texUnit, target);
443         texImage = _mesa_get_tex_image(radeon->glCtx, texObj, target, 0);
444
445         rImage = get_radeon_texture_image(texImage);
446         t = radeon_tex_obj(texObj);
447         if (t == NULL) {
448             return;
449         }
450
451         radeon_update_renderbuffers(pDRICtx, dPriv, GL_TRUE);
452         rb = rfb->color_rb[0];
453         if (rb->bo == NULL) {
454                 /* Failed to BO for the buffer */
455                 return;
456         }
457         
458         _mesa_lock_texture(radeon->glCtx, texObj);
459         if (t->bo) {
460                 radeon_bo_unref(t->bo);
461                 t->bo = NULL;
462         }
463         if (rImage->bo) {
464                 radeon_bo_unref(rImage->bo);
465                 rImage->bo = NULL;
466         }
467
468         radeon_miptree_unreference(&t->mt);
469         radeon_miptree_unreference(&rImage->mt);
470
471         rImage->bo = rb->bo;
472         radeon_bo_ref(rImage->bo);
473         t->bo = rb->bo;
474         radeon_bo_ref(t->bo);
475         t->tile_bits = 0;
476         t->image_override = GL_TRUE;
477         t->override_offset = 0;
478         t->pp_txpitch &= (1 << 13) -1;
479         pitch_val = rb->pitch;
480         switch (rb->cpp) {
481         case 4:
482                 if (texture_format == __DRI_TEXTURE_FORMAT_RGB) {
483                         texFormat = MESA_FORMAT_RGB888;
484                         t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
485                 }
486                 else {
487                         texFormat = MESA_FORMAT_ARGB8888;
488                         t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8);
489                 }
490                 pitch_val /= 4;
491                 break;
492         case 3:
493         default:
494                 texFormat = MESA_FORMAT_RGB888;
495                 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8);
496                 pitch_val /= 4;
497                 break;
498         case 2:
499                 texFormat = MESA_FORMAT_RGB565;
500                 t->pp_txformat = R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5);
501                 pitch_val /= 2;
502                 break;
503         }
504
505         _mesa_init_teximage_fields(radeon->glCtx, target, texImage,
506                                    rb->base.Width, rb->base.Height, 1, 0,
507                                    rb->cpp, texFormat);
508         texImage->RowStride = rb->pitch / rb->cpp;
509
510
511         pitch_val--;
512         t->pp_txsize = (((R300_TX_WIDTHMASK_MASK & ((rb->base.Width - 1) << R300_TX_WIDTHMASK_SHIFT)))
513                         | ((R300_TX_HEIGHTMASK_MASK & ((rb->base.Height - 1) << R300_TX_HEIGHTMASK_SHIFT))));
514         t->pp_txsize |= R300_TX_SIZE_TXPITCH_EN;
515         t->pp_txpitch |= pitch_val;
516
517         if (rmesa->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
518             if (rb->base.Width > 2048)
519                 t->pp_txpitch |= R500_TXWIDTH_BIT11;
520             else
521                 t->pp_txpitch &= ~R500_TXWIDTH_BIT11;
522             if (rb->base.Height > 2048)
523                 t->pp_txpitch |= R500_TXHEIGHT_BIT11;
524             else
525                 t->pp_txpitch &= ~R500_TXHEIGHT_BIT11;
526         }
527         t->validated = GL_TRUE;
528         _mesa_unlock_texture(radeon->glCtx, texObj);
529         return;
530 }
531
532 void r300SetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv)
533 {
534         r300SetTexBuffer2(pDRICtx, target, __DRI_TEXTURE_FORMAT_RGBA, dPriv);
535 }