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/teximage.h"
43ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/texobj.h"
445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
46b584b0728d3a001a142f76dde22f9e8ed7d2dd16Dave Airlie#include "radeon_mipmap_tree.h"
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h"
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h"
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
50d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane#include "xmlpool.h"
51d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Set the texture wrap modes.
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param t Texture object whose wrap modes are to be set
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param swrap Wrap mode for the \a s texture coordinate
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param twrap Wrap mode for the \a t texture coordinate
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonSetTexWrap( radeonTexObjPtr t, GLenum swrap, GLenum twrap )
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean  is_clamp = GL_FALSE;
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLboolean  is_clamp_to_border = GL_FALSE;
665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_txfilter &= ~(RADEON_CLAMP_S_MASK | RADEON_CLAMP_T_MASK | RADEON_BORDER_MODE_D3D);
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( swrap ) {
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_REPEAT:
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_WRAP;
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP:
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_GL;
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_EDGE:
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_LAST;
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_CLAMP_TO_BORDER:
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_GL;
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp_to_border = GL_TRUE;
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_MIRRORED_REPEAT:
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR;
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
87e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_EXT:
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_GL;
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      is_clamp = GL_TRUE;
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
91e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_LAST;
935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
94e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
95e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_GL;
96e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      is_clamp_to_border = GL_TRUE;
97e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick      break;
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      _mesa_problem(NULL, "bad S wrap mode in %s", __FUNCTION__);
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
102216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie   if (t->base.Target != GL_TEXTURE_1D) {
103216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      switch ( twrap ) {
104216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      case GL_REPEAT:
105216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 t->pp_txfilter |= RADEON_CLAMP_T_WRAP;
106216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 break;
107216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      case GL_CLAMP:
108216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_GL;
109216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 is_clamp = GL_TRUE;
110216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 break;
111216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      case GL_CLAMP_TO_EDGE:
112216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_LAST;
113216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 break;
114216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      case GL_CLAMP_TO_BORDER:
115216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_GL;
116216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 is_clamp_to_border = GL_TRUE;
117216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 break;
118216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      case GL_MIRRORED_REPEAT:
119216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 t->pp_txfilter |= RADEON_CLAMP_T_MIRROR;
120216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 break;
121216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      case GL_MIRROR_CLAMP_EXT:
122216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_GL;
123216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 is_clamp = GL_TRUE;
124216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 break;
125216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      case GL_MIRROR_CLAMP_TO_EDGE_EXT:
126216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_LAST;
127216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 break;
128216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      case GL_MIRROR_CLAMP_TO_BORDER_EXT:
129216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_GL;
130216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 is_clamp_to_border = GL_TRUE;
131216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 break;
132216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      default:
133216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie	 _mesa_problem(NULL, "bad T wrap mode in %s", __FUNCTION__);
134216be4120dd31393efa23e8b1e29e8aecd125c70Dave Airlie      }
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
173ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   /* Force revalidation to account for switches from/to mipmapping. */
174ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie   t->validated = GL_FALSE;
175ccf7814a315f0be05cdc36ca358e2917a3d4ac19Dave Airlie
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_txfilter &= ~(RADEON_MIN_FILTER_MASK | RADEON_MAG_FILTER_MASK);
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
178247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   /* r100 chips can't handle mipmaps/aniso for cubemap/volume textures */
17959b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   if ( t->base.Target == GL_TEXTURE_CUBE_MAP ) {
180247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      switch ( minf ) {
181247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_NEAREST:
182247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_NEAREST_MIPMAP_NEAREST:
183247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_NEAREST_MIPMAP_LINEAR:
184247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST;
185247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 break;
186247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_LINEAR:
187247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_LINEAR_MIPMAP_NEAREST:
188247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      case GL_LINEAR_MIPMAP_LINEAR:
189247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR;
190247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 break;
191247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      default:
192247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger	 break;
193247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger      }
194247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   }
195247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger   else if ( anisotropy == RADEON_MAX_ANISO_1_TO_1 ) {
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( minf ) {
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST:
1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST;
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR;
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_NEAREST:
2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST_MIP_NEAREST;
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_LINEAR:
2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR_MIP_NEAREST;
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_NEAREST:
2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST_MIP_LINEAR;
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_LINEAR:
2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR_MIP_LINEAR;
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   } else {
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch ( minf ) {
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST:
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST;
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR:
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_LINEAR;
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_NEAREST:
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_NEAREST:
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST;
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_NEAREST_MIPMAP_LINEAR:
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case GL_LINEAR_MIPMAP_LINEAR:
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR;
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( magf ) {
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_NEAREST:
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAG_FILTER_NEAREST;
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_LINEAR:
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      t->pp_txfilter |= RADEON_MAG_FILTER_LINEAR;
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
24579c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paulstatic void radeonSetTexBorderColor( radeonTexObjPtr t, const GLfloat color[4] )
2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
24779c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   GLubyte c[4];
24879c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
24979c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
25079c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
25179c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul   CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   t->pp_border_color = radeonPackColor( 4, c[0], c[1], c[2], c[3] );
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SCALED_FLOAT_TO_BYTE( x, scale ) \
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		(((GLuint)((255.0F / scale) * (x))) / 2)
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
258f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonTexEnv( struct gl_context *ctx, GLenum target,
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLenum pname, const GLfloat *param )
2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
2614637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint unit = ctx->Texture.CurrentUnit;
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2654e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   if ( RADEON_DEBUG & RADEON_STATE ) {
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf( stderr, "%s( %s )\n",
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       __FUNCTION__, _mesa_lookup_enum_by_nr( pname ) );
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( pname ) {
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_ENV_COLOR: {
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLubyte c[4];
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint envColor;
274499f0685e8236eca410fce516de0e9bab7e25be8Brian Paul      _mesa_unclamped_float_rgba_to_ubyte(c, texUnit->EnvColor);
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      envColor = radeonPackColor( 4, c[0], c[1], c[2], c[3] );
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( rmesa->hw.tex[unit].cmd[TEX_PP_TFACTOR] != envColor ) {
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tex[unit] );
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tex[unit].cmd[TEX_PP_TFACTOR] = envColor;
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_LOD_BIAS_EXT: {
284effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling      GLfloat bias, min;
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      GLuint b;
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      /* The Radeon's LOD bias is a signed 2's complement value with a
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * range of -1.0 <= bias < 4.0.  We break this into two linear
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * functions, one mapping [-1.0,0.0] to [-128,0] and one mapping
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       * [0.0,4.0] to [0,127].
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       */
2924637235183b80963536f2364e4d50fcb894886ddDave Airlie      min = driQueryOptionb (&rmesa->radeon.optionCache, "no_neg_lod_bias") ?
293effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling	  0.0 : -1.0;
294effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling      bias = CLAMP( *param, min, 4.0 );
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( bias == 0 ) {
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b = 0;
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else if ( bias > 0 ) {
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b = ((GLuint)SCALED_FLOAT_TO_BYTE( bias, 4.0 )) << RADEON_LOD_BIAS_SHIFT;
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 b = ((GLuint)SCALED_FLOAT_TO_BYTE( bias, 1.0 )) << RADEON_LOD_BIAS_SHIFT;
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( (rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] & RADEON_LOD_BIAS_MASK) != b ) {
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 RADEON_STATECHANGE( rmesa, tex[unit] );
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] &= ~RADEON_LOD_BIAS_MASK;
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] |= (b & RADEON_LOD_BIAS_MASK);
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3156f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminenvoid radeonTexUpdateParameters(struct gl_context *ctx, GLuint unit)
3166f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen{
3176f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   struct gl_sampler_object *samp = _mesa_get_samplerobj(ctx, unit);
3186f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   radeonTexObj* t = radeon_tex_obj(ctx->Texture.Unit[unit]._Current);
3196f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen
3206f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   radeonSetTexMaxAnisotropy(t , samp->MaxAnisotropy);
3216f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   radeonSetTexFilter(t, samp->MinFilter, samp->MagFilter);
3226f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   radeonSetTexWrap(t, samp->WrapS, samp->WrapT);
3236f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   radeonSetTexBorderColor(t, samp->BorderColor.f);
3246f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen}
3256f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Changes variables and flags for a state update, which will happen at the
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * next UpdateTextureState
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
332f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonTexParameter( struct gl_context *ctx, GLenum target,
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				struct gl_texture_object *texObj,
3345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				GLenum pname, const GLfloat *params )
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3363fafaf8959681cc41c988607bb6e387bab4fe1b5Dave Airlie   radeonTexObj* t = radeon_tex_obj(texObj);
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3384e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   radeon_print(RADEON_TEXTURE, RADEON_VERBOSE, "%s( %s )\n", __FUNCTION__,
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( pname ) );
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch ( pname ) {
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_BASE_LEVEL:
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAX_LEVEL:
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MIN_LOD:
3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case GL_TEXTURE_MAX_LOD:
34693eb2ab8c395f81e40fa298d78805bb2c777f891Maciej Cencora      t->validated = GL_FALSE;
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return;
3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
354f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonDeleteTexture( struct gl_context *ctx,
3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul				 struct gl_texture_object *texObj )
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3574637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
35859b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   radeonTexObj* t = radeon_tex_obj(texObj);
359639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie   int i;
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3614e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen   radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
3624e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen	 "%s( %p (target = %s) )\n", __FUNCTION__, (void *)texObj,
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       _mesa_lookup_enum_by_nr( texObj->Target ) );
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
36559b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   if ( rmesa ) {
3661090d206de011a67d236d8c4ae32d2d42b2f6337Dave Airlie     radeon_firevertices(&rmesa->radeon);
367639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie     for ( i = 0 ; i < rmesa->radeon.glCtx->Const.MaxTextureUnits ; i++ ) {
368639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie       if ( t == rmesa->state.texture.unit[i].texobj ) {
369639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie	 rmesa->state.texture.unit[i].texobj = NULL;
370639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie	 rmesa->hw.tex[i].dirty = GL_FALSE;
371639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie	 rmesa->hw.cube[i].dirty = GL_FALSE;
372639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie       }
373639b5fca0c5cea26a9dc393b538508aece16ce6bDave Airlie     }
3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3758bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul
37693eb2ab8c395f81e40fa298d78805bb2c777f891Maciej Cencora   radeon_miptree_unreference(&t->mt);
37793eb2ab8c395f81e40fa298d78805bb2c777f891Maciej Cencora
3788bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul   /* Free mipmap images and the texture object itself */
3798bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul   _mesa_delete_texture_object(ctx, texObj);
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Need:
3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *  - Same GEN_MODE for all active bits
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *  - Same EyePlane/ObjPlane for all active bits when using Eye/Obj
3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *  - STRQ presumably all supported (matrix means incoming R values
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    can end up in STQ, this has implications for vertex support,
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *    presumably ok if maos is used, though?)
3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Basically impossible to do this on the fly - just collect some
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * basic info & do the checks from ValidateState().
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
392f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic void radeonTexGen( struct gl_context *ctx,
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLenum coord,
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  GLenum pname,
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			  const GLfloat *params )
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3974637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   GLuint unit = ctx->Texture.CurrentUnit;
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   rmesa->recheck_texgen[unit] = GL_TRUE;
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
402d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul/**
403d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Allocate a new texture object.
404d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Called via ctx->Driver.NewTextureObject.
4054e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul * Note: we could use containment here to 'derive' the driver-specific
4064e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul * texture object from the core mesa gl_texture_object.  Not done at this time.
407effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling */
408d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paulstatic struct gl_texture_object *
409f9995b30756140724f41daf963fa06167912be7fKristian HøgsbergradeonNewTextureObject( struct gl_context *ctx, GLuint name, GLenum target )
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4114637235183b80963536f2364e4d50fcb894886ddDave Airlie   r100ContextPtr rmesa = R100_CONTEXT(ctx);
41259b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);
41359b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
41459b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   _mesa_initialize_texture_object(&t->base, name, target);
415ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   t->base.Sampler.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
41659b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
41759b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   t->border_fallback = GL_FALSE;
41859b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
41959b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   t->pp_txfilter = RADEON_BORDER_MODE_OGL;
42059b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   t->pp_txformat = (RADEON_TXFORMAT_ENDIAN_NO_SWAP |
42159b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie		     RADEON_TXFORMAT_PERSPECTIVE_ENABLE);
42259b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
423ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   radeonSetTexWrap( t, t->base.Sampler.WrapS, t->base.Sampler.WrapT );
424ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   radeonSetTexMaxAnisotropy( t, t->base.Sampler.MaxAnisotropy );
425ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   radeonSetTexFilter( t, t->base.Sampler.MinFilter, t->base.Sampler.MagFilter );
426ecfaab88b2577bd0395bc05d75a036126806a9c4Brian Paul   radeonSetTexBorderColor( t, t->base.Sampler.BorderColor.f );
42759b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   return &t->base;
428d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul}
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4316f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminenstatic struct gl_sampler_object *
4326f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli NieminenradeonNewSamplerObject(struct gl_context *ctx, GLuint name)
4336f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen{
4346f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   r100ContextPtr rmesa = R100_CONTEXT(ctx);
4356f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   struct gl_sampler_object *samp = _mesa_new_sampler_object(ctx, name);
4366f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   if (samp)
4376f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen      samp->MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
4386f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   return samp;
4396f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen}
4406f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen
44159b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie
4425170d2452beafc4a6f5859792d6c6b267c549e46Maciej Cencoravoid radeonInitTextureFuncs( radeonContextPtr radeon, struct dd_function_table *functions )
443d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul{
444ff68e3d30415712e0c3d36dc48b47345c852da01Eric Anholt   radeon_init_common_texture_funcs(radeon, functions);
445d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
446d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->NewTextureObject		= radeonNewTextureObject;
44759b183ce0fc8fd8ab73b9321e609fdb3c29bb078Dave Airlie   //   functions->BindTexture		= radeonBindTexture;
448d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->DeleteTexture		= radeonDeleteTexture;
449d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
450d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexEnv			= radeonTexEnv;
451d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexParameter		= radeonTexParameter;
452d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   functions->TexGen			= radeonTexGen;
4536f6bd8aedcf2b2f0e1ca9a1fa7ded1cb1f5a88edPauli Nieminen   functions->NewSamplerObject		= radeonNewSamplerObject;
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
455