radeon_tex.c revision 499f0685e8236eca410fce516de0e9bab7e25be8
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"
40fb9c6e681f91c986b7cbe2d6e9f6baceda00c415Vinson Lee#include "main/mfeatures.h"
41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/simple_list.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"
47b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#include "radeon_mipmap_tree.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h"
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
51d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane#include "xmlpool.h"
52d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Set the texture wrap modes.
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param t Texture object whose wrap modes are to be set
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param swrap Wrap mode for the \a s texture coordinate
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param twrap Wrap mode for the \a t texture coordinate
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonSetTexWrap( radeonTexObjPtr t, GLenum swrap, GLenum twrap )
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean  is_clamp = GL_FALSE;
665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean  is_clamp_to_border = GL_FALSE;
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_txfilter &= ~(RADEON_CLAMP_S_MASK | RADEON_CLAMP_T_MASK | RADEON_BORDER_MODE_D3D);
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( swrap ) {
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPEAT:
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_WRAP;
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP:
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_GL;
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_EDGE:
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_LAST;
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_BORDER:
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_GL;
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp_to_border = GL_TRUE;
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_MIRRORED_REPEAT:
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR;
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
88e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_EXT:
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_GL;
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
92e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_LAST;
945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
95e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
96e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_GL;
97e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      is_clamp_to_border = GL_TRUE;
98e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      break;
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_problem(NULL, "bad S wrap mode in %s", __FUNCTION__);
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( twrap ) {
1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPEAT:
1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_WRAP;
1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP:
1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_GL;
1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_EDGE:
1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_LAST;
1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_BORDER:
1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_GL;
1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp_to_border = GL_TRUE;
1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_MIRRORED_REPEAT:
1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_MIRROR;
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
121e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_EXT:
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_GL;
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
125e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_LAST;
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
128e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
129e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_GL;
130e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      is_clamp_to_border = GL_TRUE;
131e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      break;
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_problem(NULL, "bad T wrap mode in %s", __FUNCTION__);
1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( is_clamp_to_border ) {
1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_BORDER_MODE_D3D;
1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->border_fallback = (is_clamp && is_clamp_to_border);
1415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonSetTexMaxAnisotropy( radeonTexObjPtr t, GLfloat max )
1445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_txfilter &= ~RADEON_MAX_ANISO_MASK;
1465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ( max == 1.0 ) {
1485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_1_TO_1;
1495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if ( max <= 2.0 ) {
1505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_2_TO_1;
1515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if ( max <= 4.0 ) {
1525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_4_TO_1;
1535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else if ( max <= 8.0 ) {
1545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_8_TO_1;
1555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
1565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAX_ANISO_16_TO_1;
1575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Set the texture magnification and minification modes.
1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param t Texture whose filter modes are to be set
1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param minf Texture minification mode
1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param magf Texture magnification mode
1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonSetTexFilter( radeonTexObjPtr t, GLenum minf, GLenum magf )
1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint anisotropy = (t->pp_txfilter & RADEON_MAX_ANISO_MASK);
1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
172ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   /* Force revalidation to account for switches from/to mipmapping. */
173ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   t->validated = GL_FALSE;
174ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie
1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_txfilter &= ~(RADEON_MIN_FILTER_MASK | RADEON_MAG_FILTER_MASK);
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
177247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   /* r100 chips can't handle mipmaps/aniso for cubemap/volume textures */
17859b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   if ( t->base.Target == GL_TEXTURE_CUBE_MAP ) {
179247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      switch ( minf ) {
180247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_NEAREST:
181247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_NEAREST_MIPMAP_NEAREST:
182247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_NEAREST_MIPMAP_LINEAR:
183247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST;
184247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 break;
185247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_LINEAR:
186247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_LINEAR_MIPMAP_NEAREST:
187247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_LINEAR_MIPMAP_LINEAR:
188247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR;
189247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 break;
190247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      default:
191247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 break;
192247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      }
193247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   }
194247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   else if ( anisotropy == RADEON_MAX_ANISO_1_TO_1 ) {
1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( minf ) {
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST:
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST;
1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR;
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_NEAREST:
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST_MIP_NEAREST;
2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_LINEAR:
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR_MIP_NEAREST;
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_NEAREST:
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST_MIP_LINEAR;
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_LINEAR:
2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR_MIP_LINEAR;
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( minf ) {
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST:
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST;
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_LINEAR;
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_NEAREST:
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_NEAREST:
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST;
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_LINEAR:
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_LINEAR:
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR;
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( magf ) {
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEAREST:
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAG_FILTER_NEAREST;
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR:
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAG_FILTER_LINEAR;
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
24479c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paulstatic void radeonSetTexBorderColor( radeonTexObjPtr t, const GLfloat color[4] )
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
24679c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   GLubyte c[4];
24779c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
24879c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
24979c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
25079c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_border_color = radeonPackColor( 4, c[0], c[1], c[2], c[3] );
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SCALED_FLOAT_TO_BYTE( x, scale ) \
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		(((GLuint)((255.0F / scale) * (x))) / 2)
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
257f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonTexEnv( struct gl_context *ctx, GLenum target,
2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLenum pname, const GLfloat *param )
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2604637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint unit = ctx->Texture.CurrentUnit;
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2644e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   if ( RADEON_DEBUG & RADEON_STATE ) {
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf( stderr, "%s( %s )\n",
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       __FUNCTION__, _mesa_lookup_enum_by_nr( pname ) );
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( pname ) {
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_ENV_COLOR: {
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLubyte c[4];
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint envColor;
273499f0685e8236eca410fce516de0e9bab7e25be8Brian Paul      _mesa_unclamped_float_rgba_to_ubyte(c, texUnit->EnvColor);
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      envColor = radeonPackColor( 4, c[0], c[1], c[2], c[3] );
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( rmesa->hw.tex[unit].cmd[TEX_PP_TFACTOR] != envColor ) {
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tex[unit] );
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tex[unit].cmd[TEX_PP_TFACTOR] = envColor;
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_LOD_BIAS_EXT: {
283effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling      GLfloat bias, min;
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint b;
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* The Radeon's LOD bias is a signed 2's complement value with a
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * range of -1.0 <= bias < 4.0.  We break this into two linear
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * functions, one mapping [-1.0,0.0] to [-128,0] and one mapping
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * [0.0,4.0] to [0,127].
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
2914637235183b80963536f2364e4d50fcb894886ddDave Airlie      min = driQueryOptionb (&rmesa->radeon.optionCache, "no_neg_lod_bias") ?
292effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling	  0.0 : -1.0;
293effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling      bias = CLAMP( *param, min, 4.0 );
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( bias == 0 ) {
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b = 0;
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else if ( bias > 0 ) {
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b = ((GLuint)SCALED_FLOAT_TO_BYTE( bias, 4.0 )) << RADEON_LOD_BIAS_SHIFT;
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b = ((GLuint)SCALED_FLOAT_TO_BYTE( bias, 1.0 )) << RADEON_LOD_BIAS_SHIFT;
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( (rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] & RADEON_LOD_BIAS_MASK) != b ) {
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tex[unit] );
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] &= ~RADEON_LOD_BIAS_MASK;
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] |= (b & RADEON_LOD_BIAS_MASK);
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Changes variables and flags for a state update, which will happen at the
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * next UpdateTextureState
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
320f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonTexParameter( struct gl_context *ctx, GLenum target,
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				struct gl_texture_object *texObj,
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				GLenum pname, const GLfloat *params )
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3243fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   radeonTexObj* t = radeon_tex_obj(texObj);
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3264e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   radeon_print(RADEON_TEXTURE, RADEON_VERBOSE, "%s( %s )\n", __FUNCTION__,
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( pname ) );
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( pname ) {
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MIN_FILTER:
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAG_FILTER:
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAX_ANISOTROPY_EXT:
333ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul      radeonSetTexMaxAnisotropy( t, texObj->Sampler.MaxAnisotropy );
334ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul      radeonSetTexFilter( t, texObj->Sampler.MinFilter, texObj->Sampler.MagFilter );
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_WRAP_S:
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_WRAP_T:
339ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul      radeonSetTexWrap( t, texObj->Sampler.WrapS, texObj->Sampler.WrapT );
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_BORDER_COLOR:
343ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul      radeonSetTexBorderColor( t, texObj->Sampler.BorderColor.f );
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_BASE_LEVEL:
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAX_LEVEL:
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MIN_LOD:
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAX_LOD:
35093eb2ab8c395f81e40fa298d78805bb2c777f891Maciej Cencora      t->validated = GL_FALSE;
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
358f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonDeleteTexture( struct gl_context *ctx,
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				 struct gl_texture_object *texObj )
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3614637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
36259b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   radeonTexObj* t = radeon_tex_obj(texObj);
363639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie   int i;
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3654e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
3664e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	 "%s( %p (target = %s) )\n", __FUNCTION__, (void *)texObj,
3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( texObj->Target ) );
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
36959b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   if ( rmesa ) {
3701090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie     radeon_firevertices(&rmesa->radeon);
371639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie     for ( i = 0 ; i < rmesa->radeon.glCtx->Const.MaxTextureUnits ; i++ ) {
372639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie       if ( t == rmesa->state.texture.unit[i].texobj ) {
373639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie	 rmesa->state.texture.unit[i].texobj = NULL;
374639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie	 rmesa->hw.tex[i].dirty = GL_FALSE;
375639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie	 rmesa->hw.cube[i].dirty = GL_FALSE;
376639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie       }
377639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie     }
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3798bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul
38093eb2ab8c395f81e40fa298d78805bb2c777f891Maciej Cencora   radeon_miptree_unreference(&t->mt);
38193eb2ab8c395f81e40fa298d78805bb2c777f891Maciej Cencora
3828bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul   /* Free mipmap images and the texture object itself */
3838bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul   _mesa_delete_texture_object(ctx, texObj);
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Need:
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *  - Same GEN_MODE for all active bits
3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *  - Same EyePlane/ObjPlane for all active bits when using Eye/Obj
3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *  - STRQ presumably all supported (matrix means incoming R values
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    can end up in STQ, this has implications for vertex support,
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    presumably ok if maos is used, though?)
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Basically impossible to do this on the fly - just collect some
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * basic info & do the checks from ValidateState().
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
396f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonTexGen( struct gl_context *ctx,
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLenum coord,
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLenum pname,
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  const GLfloat *params )
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4014637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint unit = ctx->Texture.CurrentUnit;
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->recheck_texgen[unit] = GL_TRUE;
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
406d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul/**
407d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Allocate a new texture object.
408d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Called via ctx->Driver.NewTextureObject.
4094e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul * Note: we could use containment here to 'derive' the driver-specific
4104e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul * texture object from the core mesa gl_texture_object.  Not done at this time.
411effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling */
412d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paulstatic struct gl_texture_object *
413f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergradeonNewTextureObject( struct gl_context *ctx, GLuint name, GLenum target )
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4154637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
41659b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);
41759b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
41859b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   _mesa_initialize_texture_object(&t->base, name, target);
419ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   t->base.Sampler.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
42059b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
42159b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   t->border_fallback = GL_FALSE;
42259b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
42359b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   t->pp_txfilter = RADEON_BORDER_MODE_OGL;
42459b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   t->pp_txformat = (RADEON_TXFORMAT_ENDIAN_NO_SWAP |
42559b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie		     RADEON_TXFORMAT_PERSPECTIVE_ENABLE);
42659b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
427ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   radeonSetTexWrap( t, t->base.Sampler.WrapS, t->base.Sampler.WrapT );
428ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   radeonSetTexMaxAnisotropy( t, t->base.Sampler.MaxAnisotropy );
429ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   radeonSetTexFilter( t, t->base.Sampler.MinFilter, t->base.Sampler.MagFilter );
430ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   radeonSetTexBorderColor( t, t->base.Sampler.BorderColor.f );
43159b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   return &t->base;
432d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul}
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
43559b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
4365170d2452beafc4a6f5859792d6c6b267c549e46Maciej Cencoravoid radeonInitTextureFuncs( radeonContextPtr radeon, struct dd_function_table *functions )
437d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul{
438ff68e3d30415712e0c3d36dc48b47345c852da01Eric Anholt   radeon_init_common_texture_funcs(radeon, functions);
439d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
440d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->NewTextureObject		= radeonNewTextureObject;
44159b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   //   functions->BindTexture		= radeonBindTexture;
442d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->DeleteTexture		= radeonDeleteTexture;
443d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
444d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexEnv			= radeonTexEnv;
445d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexParameter		= radeonTexParameter;
446d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexGen			= radeonTexGen;
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
448