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