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