1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCopyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe Weather Channel (TM) funded Tungsten Graphics to develop the
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginitial release of the Radeon 8500 driver under the XFree86 license.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThis notice must be preserved.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPermission is hereby granted, free of charge, to any person obtaining
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orga copy of this software and associated documentation files (the
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org"Software"), to deal in the Software without restriction, including
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgwithout limitation the rights to use, copy, modify, merge, publish,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdistribute, sublicense, and/or sell copies of the Software, and to
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpermit persons to whom the Software is furnished to do so, subject to
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgthe following conditions:
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe above copyright notice and this permission notice (including the
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnext paragraph) shall be included in all copies or substantial
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgportions of the Software.
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   Keith Whitwell <keith@tungstengraphics.com>
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/enums.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/image.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mfeatures.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/simple_list.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/teximage.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/texobj.h"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/samplerobj.h"
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "radeon_mipmap_tree.h"
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_context.h"
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_ioctl.h"
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "r200_tex.h"
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xmlpool.h"
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the texture wrap modes.
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param t Texture object whose wrap modes are to be set
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param swrap Wrap mode for the \a s texture coordinate
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param twrap Wrap mode for the \a t texture coordinate
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200SetTexWrap( radeonTexObjPtr t, GLenum swrap, GLenum twrap, GLenum rwrap )
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean  is_clamp = GL_FALSE;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean  is_clamp_to_border = GL_FALSE;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *tObj = &t->base;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_print(RADEON_TEXTURE, RADEON_TRACE,
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		"%s(tex %p) sw %s, tw %s, rw %s\n",
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		__func__, t,
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_mesa_lookup_enum_by_nr(swrap),
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_mesa_lookup_enum_by_nr(twrap),
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_mesa_lookup_enum_by_nr(rwrap));
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t->pp_txfilter &= ~(R200_CLAMP_S_MASK | R200_CLAMP_T_MASK | R200_BORDER_MODE_D3D);
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( swrap ) {
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPEAT:
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_CLAMP_S_WRAP;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP:
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_CLAMP_S_CLAMP_GL;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      is_clamp = GL_TRUE;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP_TO_EDGE:
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_CLAMP_S_CLAMP_LAST;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP_TO_BORDER:
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_CLAMP_S_CLAMP_GL;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      is_clamp_to_border = GL_TRUE;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRRORED_REPEAT:
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_CLAMP_S_MIRROR;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRROR_CLAMP_EXT:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_CLAMP_S_MIRROR_CLAMP_GL;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      is_clamp = GL_TRUE;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_CLAMP_S_MIRROR_CLAMP_LAST;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_CLAMP_S_MIRROR_CLAMP_GL;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      is_clamp_to_border = GL_TRUE;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(NULL, "bad S wrap mode in %s", __FUNCTION__);
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tObj->Target != GL_TEXTURE_1D) {
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch ( twrap ) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_REPEAT:
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         t->pp_txfilter |= R200_CLAMP_T_WRAP;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_CLAMP:
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         t->pp_txfilter |= R200_CLAMP_T_CLAMP_GL;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         is_clamp = GL_TRUE;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_CLAMP_TO_EDGE:
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         t->pp_txfilter |= R200_CLAMP_T_CLAMP_LAST;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_CLAMP_TO_BORDER:
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         t->pp_txfilter |= R200_CLAMP_T_CLAMP_GL;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         is_clamp_to_border = GL_TRUE;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_MIRRORED_REPEAT:
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         t->pp_txfilter |= R200_CLAMP_T_MIRROR;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_MIRROR_CLAMP_EXT:
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         t->pp_txfilter |= R200_CLAMP_T_MIRROR_CLAMP_GL;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         is_clamp = GL_TRUE;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_MIRROR_CLAMP_TO_EDGE_EXT:
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         t->pp_txfilter |= R200_CLAMP_T_MIRROR_CLAMP_LAST;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_MIRROR_CLAMP_TO_BORDER_EXT:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         t->pp_txfilter |= R200_CLAMP_T_MIRROR_CLAMP_GL;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         is_clamp_to_border = GL_TRUE;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_problem(NULL, "bad T wrap mode in %s", __FUNCTION__);
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t->pp_txformat_x &= ~R200_CLAMP_Q_MASK;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( rwrap ) {
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_REPEAT:
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_CLAMP_Q_WRAP;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP:
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_CLAMP_Q_CLAMP_GL;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      is_clamp = GL_TRUE;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP_TO_EDGE:
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_CLAMP_Q_CLAMP_LAST;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_CLAMP_TO_BORDER:
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_CLAMP_Q_CLAMP_GL;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      is_clamp_to_border = GL_TRUE;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRRORED_REPEAT:
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_CLAMP_Q_MIRROR;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRROR_CLAMP_EXT:
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_CLAMP_Q_MIRROR_CLAMP_GL;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      is_clamp = GL_TRUE;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRROR_CLAMP_TO_EDGE_EXT:
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_CLAMP_Q_MIRROR_CLAMP_LAST;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_MIRROR_CLAMP_TO_BORDER_EXT:
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_CLAMP_Q_MIRROR_CLAMP_GL;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      is_clamp_to_border = GL_TRUE;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_problem(NULL, "bad R wrap mode in %s", __FUNCTION__);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( is_clamp_to_border ) {
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_BORDER_MODE_D3D;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t->border_fallback = (is_clamp && is_clamp_to_border);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200SetTexMaxAnisotropy( radeonTexObjPtr t, GLfloat max )
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t->pp_txfilter &= ~R200_MAX_ANISO_MASK;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_print(RADEON_TEXTURE, RADEON_TRACE,
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	"%s(tex %p) max %f.\n",
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	__func__, t, max);
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( max <= 1.0 ) {
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_MAX_ANISO_1_TO_1;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if ( max <= 2.0 ) {
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_MAX_ANISO_2_TO_1;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if ( max <= 4.0 ) {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_MAX_ANISO_4_TO_1;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if ( max <= 8.0 ) {
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_MAX_ANISO_8_TO_1;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_MAX_ANISO_16_TO_1;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the texture magnification and minification modes.
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param t Texture whose filter modes are to be set
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param minf Texture minification mode
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param magf Texture magnification mode
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200SetTexFilter( radeonTexObjPtr t, GLenum minf, GLenum magf )
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint anisotropy = (t->pp_txfilter & R200_MAX_ANISO_MASK);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Force revalidation to account for switches from/to mipmapping. */
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t->validated = GL_FALSE;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t->pp_txfilter &= ~(R200_MIN_FILTER_MASK | R200_MAG_FILTER_MASK);
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t->pp_txformat_x &= ~R200_VOLUME_FILTER_MASK;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_print(RADEON_TEXTURE, RADEON_TRACE,
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	"%s(tex %p) minf %s, maxf %s, anisotropy %d.\n",
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	__func__, t,
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_mesa_lookup_enum_by_nr(minf),
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	_mesa_lookup_enum_by_nr(magf),
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	anisotropy);
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ( anisotropy == R200_MAX_ANISO_1_TO_1 ) {
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch ( minf ) {
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST:
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_NEAREST;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR:
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_LINEAR;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST_MIPMAP_NEAREST:
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_NEAREST_MIP_NEAREST;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST_MIPMAP_LINEAR:
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_LINEAR_MIP_NEAREST;
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR_MIPMAP_NEAREST:
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_NEAREST_MIP_LINEAR;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR_MIPMAP_LINEAR:
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_LINEAR_MIP_LINEAR;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch ( minf ) {
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST:
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_ANISO_NEAREST;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR:
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_ANISO_LINEAR;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST_MIPMAP_NEAREST:
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR_MIPMAP_NEAREST:
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_NEAREST_MIPMAP_LINEAR:
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINEAR_MIPMAP_LINEAR:
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 t->pp_txfilter |= R200_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note we don't have 3D mipmaps so only use the mag filter setting
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * to set the 3D texture filter mode.
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( magf ) {
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_NEAREST:
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_MAG_FILTER_NEAREST;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_VOLUME_FILTER_NEAREST;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_LINEAR:
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txfilter |= R200_MAG_FILTER_LINEAR;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->pp_txformat_x |= R200_VOLUME_FILTER_LINEAR;
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200SetTexBorderColor( radeonTexObjPtr t, const GLfloat color[4] )
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLubyte c[4];
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t->pp_border_color = radeonPackColor( 4, c[0], c[1], c[2], c[3] );
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200TexEnv( struct gl_context *ctx, GLenum target,
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLenum pname, const GLfloat *param )
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint unit = ctx->Texture.CurrentUnit;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_print(RADEON_TEXTURE | RADEON_STATE, RADEON_VERBOSE, "%s( %s )\n",
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       __FUNCTION__, _mesa_lookup_enum_by_nr( pname ) );
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* This is incorrect: Need to maintain this data for each of
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * GL_TEXTURE_{123}D, GL_TEXTURE_RECTANGLE_NV, etc, and switch
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * between them according to _ReallyEnabled.
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( pname ) {
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_ENV_COLOR: {
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLubyte c[4];
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint envColor;
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_unclamped_float_rgba_to_ubyte(c, texUnit->EnvColor);
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      envColor = radeonPackColor( 4, c[0], c[1], c[2], c[3] );
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( rmesa->hw.tf.cmd[TF_TFACTOR_0 + unit] != envColor ) {
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, tf );
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tf.cmd[TF_TFACTOR_0 + unit] = envColor;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_LOD_BIAS_EXT: {
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLfloat bias, min;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint b;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const int fixed_one = R200_LOD_BIAS_FIXED_ONE;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* The R200's LOD bias is a signed 2's complement value with a
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * range of -16.0 <= bias < 16.0.
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * NOTE: Add a small bias to the bias for conform mipsel.c test.
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bias = *param;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      min = driQueryOptionb (&rmesa->radeon.optionCache, "no_neg_lod_bias") ?
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  0.0 : -16.0;
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bias = CLAMP( bias, min, 16.0 );
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      b = ((int)(bias * fixed_one)
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		+ R200_LOD_BIAS_CORRECTION) & R200_LOD_BIAS_MASK;
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( (rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT_X] & R200_LOD_BIAS_MASK) != b ) {
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, tex[unit] );
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT_X] &= ~R200_LOD_BIAS_MASK;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 rmesa->hw.tex[unit].cmd[TEX_PP_TXFORMAT_X] |= b;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_COORD_REPLACE_ARB:
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Point.PointSprite) {
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 R200_STATECHANGE( rmesa, spr );
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if ((GLenum)param[0]) {
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] |= R200_PS_GEN_TEX_0 << unit;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else {
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.spr.cmd[SPR_POINT_SPRITE_CNTL] &= ~(R200_PS_GEN_TEX_0 << unit);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200TexUpdateParameters(struct gl_context *ctx, GLuint unit)
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_sampler_object *samp = _mesa_get_samplerobj(ctx, unit);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeonTexObj* t = radeon_tex_obj(ctx->Texture.Unit[unit]._Current);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200SetTexMaxAnisotropy(t , samp->MaxAnisotropy);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200SetTexFilter(t, samp->MinFilter, samp->MagFilter);
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200SetTexWrap(t, samp->WrapS, samp->WrapT, samp->WrapR);
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200SetTexBorderColor(t, samp->BorderColor.f);
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Changes variables and flags for a state update, which will happen at the
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next UpdateTextureState
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200TexParameter( struct gl_context *ctx, GLenum target,
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				struct gl_texture_object *texObj,
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLenum pname, const GLfloat *params )
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeonTexObj* t = radeon_tex_obj(texObj);
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_print(RADEON_TEXTURE | RADEON_STATE, RADEON_VERBOSE,
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		"%s(%p, tex %p)  target %s, pname %s\n",
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		__FUNCTION__, ctx, texObj,
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		_mesa_lookup_enum_by_nr( target ),
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       _mesa_lookup_enum_by_nr( pname ) );
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch ( pname ) {
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_MIN_FILTER:
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_MAG_FILTER:
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_MAX_ANISOTROPY_EXT:
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_WRAP_S:
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_WRAP_T:
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_WRAP_R:
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_BORDER_COLOR:
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_BASE_LEVEL:
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_MAX_LEVEL:
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_MIN_LOD:
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_TEXTURE_MAX_LOD:
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      t->validated = GL_FALSE;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200DeleteTexture(struct gl_context * ctx, struct gl_texture_object *texObj)
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeonTexObj* t = radeon_tex_obj(texObj);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_print(RADEON_TEXTURE | RADEON_STATE, RADEON_NORMAL,
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           "%s( %p (target = %s) )\n", __FUNCTION__,
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   (void *)texObj,
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   _mesa_lookup_enum_by_nr(texObj->Target));
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (rmesa) {
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int i;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      radeon_firevertices(&rmesa->radeon);
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for ( i = 0 ; i < rmesa->radeon.glCtx->Const.MaxTextureUnits ; i++ ) {
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if ( t == rmesa->state.texture.unit[i].texobj ) {
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->state.texture.unit[i].texobj = NULL;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.tex[i].dirty = GL_FALSE;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    rmesa->hw.cube[i].dirty = GL_FALSE;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_miptree_unreference(&t->mt);
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_delete_texture_object(ctx, texObj);
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Need:
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *  - Same GEN_MODE for all active bits
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *  - Same EyePlane/ObjPlane for all active bits when using Eye/Obj
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *  - STRQ presumably all supported (matrix means incoming R values
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    can end up in STQ, this has implications for vertex support,
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    presumably ok if maos is used, though?)
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Basically impossible to do this on the fly - just collect some
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * basic info & do the checks from ValidateState().
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void r200TexGen( struct gl_context *ctx,
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLenum coord,
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  GLenum pname,
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  const GLfloat *params )
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint unit = ctx->Texture.CurrentUnit;
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rmesa->recheck_texgen[unit] = GL_TRUE;
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate a new texture object.
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via ctx->Driver.NewTextureObject.
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: this function will be called during context creation to
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * allocate the default texture objects.
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fixup MaxAnisotropy according to user preference.
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_texture_object *r200NewTextureObject(struct gl_context * ctx,
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						      GLuint name,
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						      GLenum target)
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_print(RADEON_STATE | RADEON_TEXTURE, RADEON_NORMAL,
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           "%s(%p) target %s, new texture %p.\n",
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   __FUNCTION__, ctx,
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	   _mesa_lookup_enum_by_nr(target), t);
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_initialize_texture_object(&t->base, name, target);
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   t->base.Sampler.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Initialize hardware state */
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200SetTexWrap( t, t->base.Sampler.WrapS, t->base.Sampler.WrapT, t->base.Sampler.WrapR );
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200SetTexMaxAnisotropy( t, t->base.Sampler.MaxAnisotropy );
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200SetTexFilter(t, t->base.Sampler.MinFilter, t->base.Sampler.MagFilter);
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200SetTexBorderColor(t, t->base.Sampler.BorderColor.f);
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &t->base;
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_sampler_object *
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgr200NewSamplerObject(struct gl_context *ctx, GLuint name)
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   r200ContextPtr rmesa = R200_CONTEXT(ctx);
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_sampler_object *samp = _mesa_new_sampler_object(ctx, name);
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (samp)
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      samp->MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return samp;
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid r200InitTextureFuncs( radeonContextPtr radeon, struct dd_function_table *functions )
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Note: we only plug in the functions we implement in the driver
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * since _mesa_init_driver_functions() was already called.
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   radeon_init_common_texture_funcs(radeon, functions);
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->NewTextureObject		= r200NewTextureObject;
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   //   functions->BindTexture		= r200BindTexture;
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->DeleteTexture		= r200DeleteTexture;
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->TexEnv			= r200TexEnv;
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->TexParameter		= r200TexParameter;
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->TexGen			= r200TexGen;
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   functions->NewSamplerObject		= r200NewSamplerObject;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
521