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