radeon_tex.c revision 79c55e55f808d77cb0dff7cda826719d5fda3c7d
15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                     VA Linux Systems Inc., Fremont, California.
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved.
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paula copy of this software and associated documentation files (the
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul"Software"), to deal in the Software without restriction, including
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulwithout limitation the rights to use, copy, modify, merge, publish,
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Pauldistribute, sublicense, and/or sell copies of the Software, and to
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulpermit persons to whom the Software is furnished to do so, subject to
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe following conditions:
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnext paragraph) shall be included in all copies or substantial
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulportions of the Software.
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul*/
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors:
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    Gareth Hughes <gareth@valinux.com>
315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    Brian Paul <brianp@valinux.com>
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
34ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
35ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/imports.h"
36ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/colormac.h"
37ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h"
38ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/enums.h"
39ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/image.h"
40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/simple_list.h"
41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/texformat.h"
42ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/texstore.h"
43ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/teximage.h"
44ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/texobj.h"
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h"
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h"
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
52d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane#include "xmlpool.h"
53d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Set the texture wrap modes.
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param t Texture object whose wrap modes are to be set
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param swrap Wrap mode for the \a s texture coordinate
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param twrap Wrap mode for the \a t texture coordinate
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonSetTexWrap( radeonTexObjPtr t, GLenum swrap, GLenum twrap )
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean  is_clamp = GL_FALSE;
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean  is_clamp_to_border = GL_FALSE;
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_txfilter &= ~(RADEON_CLAMP_S_MASK | RADEON_CLAMP_T_MASK | RADEON_BORDER_MODE_D3D);
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( swrap ) {
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPEAT:
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_WRAP;
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP:
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_GL;
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_EDGE:
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_LAST;
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_BORDER:
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_GL;
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp_to_border = GL_TRUE;
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_MIRRORED_REPEAT:
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR;
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
89e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_EXT:
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_GL;
915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
93e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_LAST;
955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
96e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
97e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_GL;
98e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      is_clamp_to_border = GL_TRUE;
99e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      break;
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_problem(NULL, "bad S wrap mode in %s", __FUNCTION__);
1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( twrap ) {
1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPEAT:
1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_WRAP;
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP:
1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_GL;
1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_EDGE:
1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_LAST;
1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_BORDER:
1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_GL;
1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp_to_border = GL_TRUE;
1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_MIRRORED_REPEAT:
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_MIRROR;
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
122e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_EXT:
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_GL;
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
126e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_LAST;
1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
129e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
130e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_GL;
131e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      is_clamp_to_border = GL_TRUE;
132e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      break;
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_problem(NULL, "bad T wrap mode in %s", __FUNCTION__);
1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( is_clamp_to_border ) {
1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_BORDER_MODE_D3D;
1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->border_fallback = (is_clamp && is_clamp_to_border);
1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonSetTexMaxAnisotropy( radeonTexObjPtr t, GLfloat max )
1455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_txfilter &= ~RADEON_MAX_ANISO_MASK;
1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( max == 1.0 ) {
1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_1_TO_1;
1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if ( max <= 2.0 ) {
1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_2_TO_1;
1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if ( max <= 4.0 ) {
1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_4_TO_1;
1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if ( max <= 8.0 ) {
1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_8_TO_1;
1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_16_TO_1;
1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Set the texture magnification and minification modes.
1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param t Texture whose filter modes are to be set
1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param minf Texture minification mode
1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param magf Texture magnification mode
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonSetTexFilter( radeonTexObjPtr t, GLenum minf, GLenum magf )
1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint anisotropy = (t->pp_txfilter & RADEON_MAX_ANISO_MASK);
1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_txfilter &= ~(RADEON_MIN_FILTER_MASK | RADEON_MAG_FILTER_MASK);
1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
175247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   /* r100 chips can't handle mipmaps/aniso for cubemap/volume textures */
176247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   if ( t->base.tObj->Target == GL_TEXTURE_CUBE_MAP ) {
177247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      switch ( minf ) {
178247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_NEAREST:
179247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_NEAREST_MIPMAP_NEAREST:
180247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_NEAREST_MIPMAP_LINEAR:
181247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST;
182247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 break;
183247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_LINEAR:
184247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_LINEAR_MIPMAP_NEAREST:
185247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_LINEAR_MIPMAP_LINEAR:
186247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR;
187247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 break;
188247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      default:
189247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 break;
190247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      }
191247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   }
192247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   else if ( anisotropy == RADEON_MAX_ANISO_1_TO_1 ) {
1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( minf ) {
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST:
1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST;
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR;
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_NEAREST:
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST_MIP_NEAREST;
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_LINEAR:
2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR_MIP_NEAREST;
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_NEAREST:
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST_MIP_LINEAR;
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_LINEAR:
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR_MIP_LINEAR;
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( minf ) {
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST:
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST;
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_LINEAR;
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_NEAREST:
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_NEAREST:
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST;
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_LINEAR:
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_LINEAR:
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR;
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( magf ) {
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEAREST:
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAG_FILTER_NEAREST;
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR:
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAG_FILTER_LINEAR;
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
24279c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paulstatic void radeonSetTexBorderColor( radeonTexObjPtr t, const GLfloat color[4] )
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
24479c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   GLubyte c[4];
24579c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
24679c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
24779c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
24879c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_border_color = radeonPackColor( 4, c[0], c[1], c[2], c[3] );
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Allocate space for and load the mesa images into the texture memory block.
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * This will happen before drawing with a new texture, or drawing with a
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texture after it was swapped out or teximaged again.
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic radeonTexObjPtr radeonAllocTexObj( struct gl_texture_object *texObj )
2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonTexObjPtr t;
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t = CALLOC_STRUCT( radeon_tex_obj );
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   texObj->DriverData = t;
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( t != NULL ) {
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( RADEON_DEBUG & DEBUG_TEXTURE ) {
267462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane	 fprintf( stderr, "%s( %p, %p )\n", __FUNCTION__, (void *)texObj, (void *)t );
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* Initialize non-image-dependent parts of the state:
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->base.tObj = texObj;
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->border_fallback = GL_FALSE;
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter = RADEON_BORDER_MODE_OGL;
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txformat = (RADEON_TXFORMAT_ENDIAN_NO_SWAP |
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			RADEON_TXFORMAT_PERSPECTIVE_ENABLE);
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      make_empty_list( & t->base );
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonSetTexWrap( t, texObj->WrapS, texObj->WrapT );
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonSetTexMaxAnisotropy( t, texObj->MaxAnisotropy );
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonSetTexFilter( t, texObj->MinFilter, texObj->MagFilter );
28479c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul      radeonSetTexBorderColor( t, texObj->BorderColor );
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return t;
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const struct gl_texture_format *
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulradeonChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                           GLenum format, GLenum type )
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
296d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane   const GLboolean do32bpt =
297d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane       ( rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_32 );
298d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane   const GLboolean force16bpt =
299d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane       ( rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_FORCE_16 );
300d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane   (void) format;
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( internalFormat ) {
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case 4:
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGBA:
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COMPRESSED_RGBA:
306d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      switch ( type ) {
307d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_INT_10_10_10_2:
308d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_INT_2_10_10_10_REV:
309f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul	 return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_argb1555;
310d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_4_4_4_4:
311d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
312f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul	 return _dri_texformat_argb4444;
313d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_5_5_5_1:
314d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
315f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul	 return _dri_texformat_argb1555;
316d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      default:
3176babf624b72a34b7be78bbc896bd241db98deb2eRoland Scheidegger         return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_argb4444;
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case 3:
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGB:
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COMPRESSED_RGB:
323d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      switch ( type ) {
324d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_4_4_4_4:
325d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
326f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul	 return _dri_texformat_argb4444;
327d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_5_5_5_1:
328d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
329f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul	 return _dri_texformat_argb1555;
330d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_5_6_5:
331d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      case GL_UNSIGNED_SHORT_5_6_5_REV:
332f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul	 return _dri_texformat_rgb565;
333d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      default:
3346babf624b72a34b7be78bbc896bd241db98deb2eRoland Scheidegger         return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_rgb565;
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGBA8:
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGB10_A2:
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGBA12:
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGBA16:
341d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane      return !force16bpt ?
3426babf624b72a34b7be78bbc896bd241db98deb2eRoland Scheidegger	  _dri_texformat_argb8888 : _dri_texformat_argb4444;
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGBA4:
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGBA2:
346f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul      return _dri_texformat_argb4444;
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGB5_A1:
349f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul      return _dri_texformat_argb1555;
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGB8:
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGB10:
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGB12:
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGB16:
3556babf624b72a34b7be78bbc896bd241db98deb2eRoland Scheidegger      return !force16bpt ? _dri_texformat_argb8888 : _dri_texformat_rgb565;
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGB5:
3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_RGB4:
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_R3_G3_B2:
360f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul      return _dri_texformat_rgb565;
3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALPHA:
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALPHA4:
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALPHA8:
3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALPHA12:
3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_ALPHA16:
3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COMPRESSED_ALPHA:
368f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul      return _dri_texformat_a8;
3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case 1:
3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE:
3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE4:
3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE8:
3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE12:
3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE16:
3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COMPRESSED_LUMINANCE:
377f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul      return _dri_texformat_l8;
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case 2:
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE_ALPHA:
3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE4_ALPHA4:
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE6_ALPHA2:
3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE8_ALPHA8:
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE12_ALPHA4:
3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE12_ALPHA12:
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LUMINANCE16_ALPHA16:
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COMPRESSED_LUMINANCE_ALPHA:
388f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul      return _dri_texformat_al88;
3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INTENSITY:
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INTENSITY4:
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INTENSITY8:
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INTENSITY12:
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_INTENSITY16:
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_COMPRESSED_INTENSITY:
396f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul      return _dri_texformat_i8;
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_YCBCR_MESA:
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (type == GL_UNSIGNED_SHORT_8_8_APPLE ||
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul          type == GL_UNSIGNED_BYTE)
4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         return &_mesa_texformat_ycbcr;
4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         return &_mesa_texformat_ycbcr_rev;
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
405d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_RGB_S3TC:
406d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_RGB4_S3TC:
407d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
408d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      return &_mesa_texformat_rgb_dxt1;
409d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
410d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
411d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      return &_mesa_texformat_rgba_dxt1;
412d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
413d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_RGBA_S3TC:
414d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_RGBA4_S3TC:
415d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
416d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      return &_mesa_texformat_rgba_dxt3;
417d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
418d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
419d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      return &_mesa_texformat_rgba_dxt5;
420d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_problem(ctx, "unexpected texture format in %s", __FUNCTION__);
4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return NULL;
4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return NULL; /* never get here */
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexImage1D( GLcontext *ctx, GLenum target, GLint level,
4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              GLint internalFormat,
4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              GLint width, GLint border,
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              GLenum format, GLenum type, const GLvoid *pixels,
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              const struct gl_pixelstore_attrib *packing,
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              struct gl_texture_object *texObj,
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              struct gl_texture_image *texImage )
4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   driTextureObject * t = (driTextureObject *) texObj->DriverData;
4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( t ) {
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      driSwapOutTextureObject( t );
4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t = (driTextureObject *) radeonAllocTexObj( texObj );
4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!t) {
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         return;
4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Note, this will call ChooseTextureFormat */
4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _mesa_store_teximage1d(ctx, target, level, internalFormat,
4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                          width, border, format, type, pixels,
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                          &ctx->Unpack, texObj, texImage);
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->dirty_images[0] |= (1 << level);
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexSubImage1D( GLcontext *ctx, GLenum target, GLint level,
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 GLint xoffset,
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 GLsizei width,
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 GLenum format, GLenum type,
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 const GLvoid *pixels,
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 const struct gl_pixelstore_attrib *packing,
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 struct gl_texture_object *texObj,
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 struct gl_texture_image *texImage )
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   driTextureObject * t = (driTextureObject *) texObj->DriverData;
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert( t ); /* this _should_ be true */
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( t ) {
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      driSwapOutTextureObject( t );
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t = (driTextureObject *) radeonAllocTexObj( texObj );
4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!t) {
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D");
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         return;
4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _mesa_store_texsubimage1d(ctx, target, level, xoffset, width,
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     format, type, pixels, packing, texObj,
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     texImage);
4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->dirty_images[0] |= (1 << level);
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexImage2D( GLcontext *ctx, GLenum target, GLint level,
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              GLint internalFormat,
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              GLint width, GLint height, GLint border,
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              GLenum format, GLenum type, const GLvoid *pixels,
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              const struct gl_pixelstore_attrib *packing,
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              struct gl_texture_object *texObj,
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                              struct gl_texture_image *texImage )
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   driTextureObject * t = (driTextureObject *) texObj->DriverData;
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint face;
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* which cube face or ordinary 2D image */
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (target) {
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ASSERT(face < 6);
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      face = 0;
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( t != NULL ) {
5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      driSwapOutTextureObject( t );
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t = (driTextureObject *) radeonAllocTexObj( texObj );
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!t) {
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         return;
5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Note, this will call ChooseTextureFormat */
5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _mesa_store_teximage2d(ctx, target, level, internalFormat,
5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                          width, height, border, format, type, pixels,
5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                          &ctx->Unpack, texObj, texImage);
5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->dirty_images[face] |= (1 << level);
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexSubImage2D( GLcontext *ctx, GLenum target, GLint level,
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 GLint xoffset, GLint yoffset,
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 GLsizei width, GLsizei height,
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 GLenum format, GLenum type,
5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 const GLvoid *pixels,
5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 const struct gl_pixelstore_attrib *packing,
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 struct gl_texture_object *texObj,
5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul                                 struct gl_texture_image *texImage )
5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   driTextureObject * t = (driTextureObject *) texObj->DriverData;
5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint face;
5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* which cube face or ordinary 2D image */
5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (target) {
5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      ASSERT(face < 6);
5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      face = 0;
5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   assert( t ); /* this _should_ be true */
5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( t ) {
5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      driSwapOutTextureObject( t );
5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t = (driTextureObject *) radeonAllocTexObj( texObj );
5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!t) {
5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");
5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         return;
5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width,
5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     height, format, type, pixels, packing, texObj,
5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			     texImage);
5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->dirty_images[face] |= (1 << level);
5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
583d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholtstatic void radeonCompressedTexImage2D( GLcontext *ctx, GLenum target, GLint level,
584d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                              GLint internalFormat,
585d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                              GLint width, GLint height, GLint border,
586d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                              GLsizei imageSize, const GLvoid *data,
587d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                              struct gl_texture_object *texObj,
588d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                              struct gl_texture_image *texImage )
589d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt{
590d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   driTextureObject * t = (driTextureObject *) texObj->DriverData;
591d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   GLuint face;
592d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
593d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   /* which cube face or ordinary 2D image */
594d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   switch (target) {
595d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
596d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
597d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
598d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
599d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
600d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
601d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
602d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      ASSERT(face < 6);
603d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      break;
604d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   default:
605d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      face = 0;
606d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
607d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
608d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if ( t != NULL ) {
609d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      driSwapOutTextureObject( t );
610d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
611d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   else {
612d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      t = (driTextureObject *) radeonAllocTexObj( texObj );
613d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      if (!t) {
614d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
615d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt         return;
616d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      }
617d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
618d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
619d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   /* Note, this will call ChooseTextureFormat */
620d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   _mesa_store_compressed_teximage2d(ctx, target, level, internalFormat, width,
621d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                                 height, border, imageSize, data, texObj, texImage);
622d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
623d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   t->dirty_images[face] |= (1 << level);
624d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt}
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
627d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholtstatic void radeonCompressedTexSubImage2D( GLcontext *ctx, GLenum target, GLint level,
628d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                                 GLint xoffset, GLint yoffset,
629d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                                 GLsizei width, GLsizei height,
630d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                                 GLenum format,
631d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                                 GLsizei imageSize, const GLvoid *data,
632d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                                 struct gl_texture_object *texObj,
633d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                                 struct gl_texture_image *texImage )
634d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt{
635d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   driTextureObject * t = (driTextureObject *) texObj->DriverData;
636d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   GLuint face;
637d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
638d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
639d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   /* which cube face or ordinary 2D image */
640d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   switch (target) {
641d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
642d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
643d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
644d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
645d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
646d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
647d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
648d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      ASSERT(face < 6);
649d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      break;
650d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   default:
651d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      face = 0;
652d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
653d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
654d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   assert( t ); /* this _should_ be true */
655d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   if ( t ) {
656d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      driSwapOutTextureObject( t );
657d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
658d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   else {
659d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      t = (driTextureObject *) radeonAllocTexObj( texObj );
660d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      if (!t) {
661d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D");
662d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt         return;
663d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt      }
664d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   }
665d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
666d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   _mesa_store_compressed_texsubimage2d(ctx, target, level, xoffset, yoffset, width,
667d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt                                 height, format, imageSize, data, texObj, texImage);
668d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
669d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   t->dirty_images[face] |= (1 << level);
670d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt}
671d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SCALED_FLOAT_TO_BYTE( x, scale ) \
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		(((GLuint)((255.0F / scale) * (x))) / 2)
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexEnv( GLcontext *ctx, GLenum target,
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLenum pname, const GLfloat *param )
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint unit = ctx->Texture.CurrentUnit;
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( RADEON_DEBUG & DEBUG_STATE ) {
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf( stderr, "%s( %s )\n",
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       __FUNCTION__, _mesa_lookup_enum_by_nr( pname ) );
6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( pname ) {
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_ENV_COLOR: {
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLubyte c[4];
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint envColor;
6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      UNCLAMPED_FLOAT_TO_RGBA_CHAN( c, texUnit->EnvColor );
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      envColor = radeonPackColor( 4, c[0], c[1], c[2], c[3] );
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( rmesa->hw.tex[unit].cmd[TEX_PP_TFACTOR] != envColor ) {
6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tex[unit] );
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tex[unit].cmd[TEX_PP_TFACTOR] = envColor;
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_LOD_BIAS_EXT: {
701effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling      GLfloat bias, min;
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint b;
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* The Radeon's LOD bias is a signed 2's complement value with a
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * range of -1.0 <= bias < 4.0.  We break this into two linear
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * functions, one mapping [-1.0,0.0] to [-128,0] and one mapping
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * [0.0,4.0] to [0,127].
7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
709effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling      min = driQueryOptionb (&rmesa->optionCache, "no_neg_lod_bias") ?
710effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling	  0.0 : -1.0;
711effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling      bias = CLAMP( *param, min, 4.0 );
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( bias == 0 ) {
7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b = 0;
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else if ( bias > 0 ) {
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b = ((GLuint)SCALED_FLOAT_TO_BYTE( bias, 4.0 )) << RADEON_LOD_BIAS_SHIFT;
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b = ((GLuint)SCALED_FLOAT_TO_BYTE( bias, 1.0 )) << RADEON_LOD_BIAS_SHIFT;
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( (rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] & RADEON_LOD_BIAS_MASK) != b ) {
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tex[unit] );
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] &= ~RADEON_LOD_BIAS_MASK;
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] |= (b & RADEON_LOD_BIAS_MASK);
7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Changes variables and flags for a state update, which will happen at the
7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * next UpdateTextureState
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexParameter( GLcontext *ctx, GLenum target,
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				struct gl_texture_object *texObj,
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				GLenum pname, const GLfloat *params )
7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonTexObjPtr t = (radeonTexObjPtr) texObj->DriverData;
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( RADEON_DEBUG & (DEBUG_STATE|DEBUG_TEXTURE) ) {
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf( stderr, "%s( %s )\n", __FUNCTION__,
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( pname ) );
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( pname ) {
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MIN_FILTER:
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAG_FILTER:
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAX_ANISOTROPY_EXT:
7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonSetTexMaxAnisotropy( t, texObj->MaxAnisotropy );
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonSetTexFilter( t, texObj->MinFilter, texObj->MagFilter );
7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_WRAP_S:
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_WRAP_T:
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      radeonSetTexWrap( t, texObj->WrapS, texObj->WrapT );
7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_BORDER_COLOR:
76379c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul      radeonSetTexBorderColor( t, texObj->BorderColor );
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_BASE_LEVEL:
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAX_LEVEL:
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MIN_LOD:
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAX_LOD:
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* This isn't the most efficient solution but there doesn't appear to
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * be a nice alternative.  Since there's no LOD clamping,
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * we just have to rely on loading the right subset of mipmap levels
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * to simulate a clamped LOD.
7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      driSwapOutTextureObject( (driTextureObject *) t );
7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   /* Mark this texobj as dirty (one bit per tex unit)
7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul    */
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->dirty_state = TEX_ALL;
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonBindTexture( GLcontext *ctx, GLenum target,
7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			       struct gl_texture_object *texObj )
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( RADEON_DEBUG & (DEBUG_STATE|DEBUG_TEXTURE) ) {
792462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane      fprintf( stderr, "%s( %p ) unit=%d\n", __FUNCTION__, (void *)texObj,
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       ctx->Texture.CurrentUnit );
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7968135a445f3b0ae207ec5e4485b5936050d438320Felix Kuehling   assert( (target != GL_TEXTURE_1D && target != GL_TEXTURE_2D &&
797247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger            target != GL_TEXTURE_RECTANGLE_NV && target != GL_TEXTURE_CUBE_MAP) ||
7988135a445f3b0ae207ec5e4485b5936050d438320Felix Kuehling           (texObj->DriverData != NULL) );
7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8004e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul
8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDeleteTexture( GLcontext *ctx,
8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				 struct gl_texture_object *texObj )
8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   driTextureObject * t = (driTextureObject *) texObj->DriverData;
8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( RADEON_DEBUG & (DEBUG_STATE|DEBUG_TEXTURE) ) {
809462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane      fprintf( stderr, "%s( %p (target = %s) )\n", __FUNCTION__, (void *)texObj,
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( texObj->Target ) );
8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( t != NULL ) {
8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( rmesa ) {
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul         RADEON_FIREVERTICES( rmesa );
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      driDestroyTextureObject( t );
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8208bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul
8218bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul   /* Free mipmap images and the texture object itself */
8228bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul   _mesa_delete_texture_object(ctx, texObj);
8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Need:
8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *  - Same GEN_MODE for all active bits
8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *  - Same EyePlane/ObjPlane for all active bits when using Eye/Obj
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *  - STRQ presumably all supported (matrix means incoming R values
8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    can end up in STQ, this has implications for vertex support,
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    presumably ok if maos is used, though?)
8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Basically impossible to do this on the fly - just collect some
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * basic info & do the checks from ValidateState().
8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexGen( GLcontext *ctx,
8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLenum coord,
8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLenum pname,
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  const GLfloat *params )
8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint unit = ctx->Texture.CurrentUnit;
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->recheck_texgen[unit] = GL_TRUE;
8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
845d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul/**
846d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Allocate a new texture object.
847d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Called via ctx->Driver.NewTextureObject.
8484e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul * Note: we could use containment here to 'derive' the driver-specific
8494e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul * texture object from the core mesa gl_texture_object.  Not done at this time.
850effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling */
851d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paulstatic struct gl_texture_object *
852d3fd7ba8af15bead2f770d68a893449adeb11397Brian PaulradeonNewTextureObject( GLcontext *ctx, GLuint name, GLenum target )
8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
8545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
855d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct gl_texture_object *obj;
856d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   obj = _mesa_new_texture_object(ctx, name, target);
857d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   if (!obj)
858d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul      return NULL;
859d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   obj->MaxAnisotropy = rmesa->initialMaxAnisotropy;
8608135a445f3b0ae207ec5e4485b5936050d438320Felix Kuehling   radeonAllocTexObj( obj );
861d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   return obj;
862d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul}
8635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
865d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paulvoid radeonInitTextureFuncs( struct dd_function_table *functions )
866d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul{
867d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->ChooseTextureFormat	= radeonChooseTextureFormat;
868d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexImage1D		= radeonTexImage1D;
869d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexImage2D		= radeonTexImage2D;
870d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexSubImage1D		= radeonTexSubImage1D;
871d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexSubImage2D		= radeonTexSubImage2D;
872d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
873d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->NewTextureObject		= radeonNewTextureObject;
8744e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul   functions->BindTexture		= radeonBindTexture;
875d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->DeleteTexture		= radeonDeleteTexture;
876d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->IsTextureResident		= driIsTextureResident;
877d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
878d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexEnv			= radeonTexEnv;
879d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexParameter		= radeonTexParameter;
880d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexGen			= radeonTexGen;
881f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul
882d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   functions->CompressedTexImage2D	= radeonCompressedTexImage2D;
883d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt   functions->CompressedTexSubImage2D	= radeonCompressedTexSubImage2D;
884d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt
885f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul   driInitTextureFormats();
8865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
887