radeon_tex.c revision 79c55e55f808d77cb0dff7cda826719d5fda3c7d
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" 40ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/simple_list.h" 41ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/texformat.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" 475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_state.h" 485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_ioctl.h" 495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_swtcl.h" 505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_tex.h" 515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 52d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane#include "xmlpool.h" 53d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane 545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/** 575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Set the texture wrap modes. 585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param t Texture object whose wrap modes are to be set 605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param swrap Wrap mode for the \a s texture coordinate 615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * \param twrap Wrap mode for the \a t texture coordinate 625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonSetTexWrap( radeonTexObjPtr t, GLenum swrap, GLenum twrap ) 655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean is_clamp = GL_FALSE; 675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLboolean is_clamp_to_border = GL_FALSE; 685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter &= ~(RADEON_CLAMP_S_MASK | RADEON_CLAMP_T_MASK | RADEON_BORDER_MODE_D3D); 705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( swrap ) { 725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPEAT: 735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_S_WRAP; 745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLAMP: 765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_GL; 775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul is_clamp = GL_TRUE; 785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLAMP_TO_EDGE: 805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_LAST; 815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLAMP_TO_BORDER: 835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_S_CLAMP_GL; 845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul is_clamp_to_border = GL_TRUE; 855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_MIRRORED_REPEAT: 875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_S_MIRROR; 885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 89e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick case GL_MIRROR_CLAMP_EXT: 905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_GL; 915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul is_clamp = GL_TRUE; 925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 93e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick case GL_MIRROR_CLAMP_TO_EDGE_EXT: 945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_LAST; 955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 96e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick case GL_MIRROR_CLAMP_TO_BORDER_EXT: 97e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick t->pp_txfilter |= RADEON_CLAMP_S_MIRROR_CLAMP_GL; 98e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick is_clamp_to_border = GL_TRUE; 99e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick break; 1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_problem(NULL, "bad S wrap mode in %s", __FUNCTION__); 1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( twrap ) { 1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_REPEAT: 1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_T_WRAP; 1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLAMP: 1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_GL; 1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul is_clamp = GL_TRUE; 1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLAMP_TO_EDGE: 1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_LAST; 1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_CLAMP_TO_BORDER: 1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_T_CLAMP_GL; 1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul is_clamp_to_border = GL_TRUE; 1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_MIRRORED_REPEAT: 1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_T_MIRROR; 1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 122e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick case GL_MIRROR_CLAMP_EXT: 1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_GL; 1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul is_clamp = GL_TRUE; 1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 126e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick case GL_MIRROR_CLAMP_TO_EDGE_EXT: 1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_LAST; 1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 129e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick case GL_MIRROR_CLAMP_TO_BORDER_EXT: 130e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick t->pp_txfilter |= RADEON_CLAMP_T_MIRROR_CLAMP_GL; 131e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick is_clamp_to_border = GL_TRUE; 132e54f2601707a54be8869fb3b0be26503d1c9916eIan Romanick break; 1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_problem(NULL, "bad T wrap mode in %s", __FUNCTION__); 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 1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter &= ~(RADEON_MIN_FILTER_MASK | RADEON_MAG_FILTER_MASK); 1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 175247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger /* r100 chips can't handle mipmaps/aniso for cubemap/volume textures */ 176247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger if ( t->base.tObj->Target == GL_TEXTURE_CUBE_MAP ) { 177247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger switch ( minf ) { 178247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger case GL_NEAREST: 179247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger case GL_NEAREST_MIPMAP_NEAREST: 180247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger case GL_NEAREST_MIPMAP_LINEAR: 181247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST; 182247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger break; 183247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger case GL_LINEAR: 184247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger case GL_LINEAR_MIPMAP_NEAREST: 185247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger case GL_LINEAR_MIPMAP_LINEAR: 186247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR; 187247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger break; 188247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger default: 189247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger break; 190247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger } 191247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger } 192247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger else if ( anisotropy == RADEON_MAX_ANISO_1_TO_1 ) { 1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( minf ) { 1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEAREST: 1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST; 1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR: 1985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR; 1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEAREST_MIPMAP_NEAREST: 2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST_MIP_NEAREST; 2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEAREST_MIPMAP_LINEAR: 2045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR_MIP_NEAREST; 2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_MIPMAP_NEAREST: 2075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_NEAREST_MIP_LINEAR; 2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_MIPMAP_LINEAR: 2105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_LINEAR_MIP_LINEAR; 2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( minf ) { 2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEAREST: 2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST; 2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR: 2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_LINEAR; 2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEAREST_MIPMAP_NEAREST: 2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_MIPMAP_NEAREST: 2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST; 2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEAREST_MIPMAP_LINEAR: 2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR_MIPMAP_LINEAR: 2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR; 2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( magf ) { 2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_NEAREST: 2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MAG_FILTER_NEAREST; 2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LINEAR: 2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter |= RADEON_MAG_FILTER_LINEAR; 2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 24279c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paulstatic void radeonSetTexBorderColor( radeonTexObjPtr t, const GLfloat color[4] ) 2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 24479c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul GLubyte c[4]; 24579c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]); 24679c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]); 24779c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]); 24879c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]); 2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_border_color = radeonPackColor( 4, c[0], c[1], c[2], c[3] ); 2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/** 2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Allocate space for and load the mesa images into the texture memory block. 2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * This will happen before drawing with a new texture, or drawing with a 2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * texture after it was swapped out or teximaged again. 2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic radeonTexObjPtr radeonAllocTexObj( struct gl_texture_object *texObj ) 2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonTexObjPtr t; 2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t = CALLOC_STRUCT( radeon_tex_obj ); 2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul texObj->DriverData = t; 2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( t != NULL ) { 2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( RADEON_DEBUG & DEBUG_TEXTURE ) { 267462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane fprintf( stderr, "%s( %p, %p )\n", __FUNCTION__, (void *)texObj, (void *)t ); 2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Initialize non-image-dependent parts of the state: 2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->base.tObj = texObj; 2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->border_fallback = GL_FALSE; 2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txfilter = RADEON_BORDER_MODE_OGL; 2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->pp_txformat = (RADEON_TXFORMAT_ENDIAN_NO_SWAP | 2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_TXFORMAT_PERSPECTIVE_ENABLE); 2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul make_empty_list( & t->base ); 2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonSetTexWrap( t, texObj->WrapS, texObj->WrapT ); 2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonSetTexMaxAnisotropy( t, texObj->MaxAnisotropy ); 2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonSetTexFilter( t, texObj->MinFilter, texObj->MagFilter ); 28479c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul radeonSetTexBorderColor( t, texObj->BorderColor ); 2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return t; 2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const struct gl_texture_format * 2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulradeonChooseTextureFormat( GLcontext *ctx, GLint internalFormat, 2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum format, GLenum type ) 2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 296d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane const GLboolean do32bpt = 297d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane ( rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_32 ); 298d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane const GLboolean force16bpt = 299d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane ( rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_FORCE_16 ); 300d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane (void) format; 3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( internalFormat ) { 3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case 4: 3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGBA: 3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COMPRESSED_RGBA: 306d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane switch ( type ) { 307d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_INT_10_10_10_2: 308d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_INT_2_10_10_10_REV: 309f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_argb1555; 310d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_4_4_4_4: 311d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_4_4_4_4_REV: 312f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_argb4444; 313d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_5_5_5_1: 314d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_1_5_5_5_REV: 315f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_argb1555; 316d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane default: 3176babf624b72a34b7be78bbc896bd241db98deb2eRoland Scheidegger return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_argb4444; 3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case 3: 3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGB: 3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COMPRESSED_RGB: 323d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane switch ( type ) { 324d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_4_4_4_4: 325d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_4_4_4_4_REV: 326f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_argb4444; 327d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_5_5_5_1: 328d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_1_5_5_5_REV: 329f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_argb1555; 330d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_5_6_5: 331d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane case GL_UNSIGNED_SHORT_5_6_5_REV: 332f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_rgb565; 333d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane default: 3346babf624b72a34b7be78bbc896bd241db98deb2eRoland Scheidegger return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_rgb565; 3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGBA8: 3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGB10_A2: 3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGBA12: 3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGBA16: 341d907a75498360fb96ec2314bb0abb105be74d500Alan Hourihane return !force16bpt ? 3426babf624b72a34b7be78bbc896bd241db98deb2eRoland Scheidegger _dri_texformat_argb8888 : _dri_texformat_argb4444; 3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGBA4: 3455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGBA2: 346f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_argb4444; 3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGB5_A1: 349f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_argb1555; 3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGB8: 3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGB10: 3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGB12: 3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGB16: 3556babf624b72a34b7be78bbc896bd241db98deb2eRoland Scheidegger return !force16bpt ? _dri_texformat_argb8888 : _dri_texformat_rgb565; 3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGB5: 3585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_RGB4: 3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_R3_G3_B2: 360f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_rgb565; 3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALPHA: 3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALPHA4: 3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALPHA8: 3655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALPHA12: 3665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_ALPHA16: 3675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COMPRESSED_ALPHA: 368f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_a8; 3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case 1: 3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE: 3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE4: 3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE8: 3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE12: 3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE16: 3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COMPRESSED_LUMINANCE: 377f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_l8; 3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case 2: 3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE_ALPHA: 3815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE4_ALPHA4: 3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE6_ALPHA2: 3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE8_ALPHA8: 3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE12_ALPHA4: 3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE12_ALPHA12: 3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_LUMINANCE16_ALPHA16: 3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COMPRESSED_LUMINANCE_ALPHA: 388f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_al88; 3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INTENSITY: 3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INTENSITY4: 3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INTENSITY8: 3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INTENSITY12: 3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_INTENSITY16: 3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_COMPRESSED_INTENSITY: 396f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul return _dri_texformat_i8; 3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 3985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_YCBCR_MESA: 3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (type == GL_UNSIGNED_SHORT_8_8_APPLE || 4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul type == GL_UNSIGNED_BYTE) 4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return &_mesa_texformat_ycbcr; 4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else 4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return &_mesa_texformat_ycbcr_rev; 4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 405d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_RGB_S3TC: 406d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_RGB4_S3TC: 407d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 408d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt return &_mesa_texformat_rgb_dxt1; 409d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 410d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 411d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt return &_mesa_texformat_rgba_dxt1; 412d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 413d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_RGBA_S3TC: 414d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_RGBA4_S3TC: 415d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 416d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt return &_mesa_texformat_rgba_dxt3; 417d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 418d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 419d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt return &_mesa_texformat_rgba_dxt5; 420d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_problem(ctx, "unexpected texture format in %s", __FUNCTION__); 4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return NULL; 4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return NULL; /* never get here */ 4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexImage1D( GLcontext *ctx, GLenum target, GLint level, 4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint internalFormat, 4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint width, GLint border, 4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const struct gl_pixelstore_attrib *packing, 4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_object *texObj, 4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_image *texImage ) 4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driTextureObject * t = (driTextureObject *) texObj->DriverData; 4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( t ) { 4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driSwapOutTextureObject( t ); 4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t = (driTextureObject *) radeonAllocTexObj( texObj ); 4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!t) { 4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Note, this will call ChooseTextureFormat */ 4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_store_teximage1d(ctx, target, level, internalFormat, 4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul width, border, format, type, pixels, 4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul &ctx->Unpack, texObj, texImage); 4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->dirty_images[0] |= (1 << level); 4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexSubImage1D( GLcontext *ctx, GLenum target, GLint level, 4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint xoffset, 4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLsizei width, 4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum format, GLenum type, 4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLvoid *pixels, 4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const struct gl_pixelstore_attrib *packing, 4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_object *texObj, 4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_image *texImage ) 4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driTextureObject * t = (driTextureObject *) texObj->DriverData; 4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert( t ); /* this _should_ be true */ 4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( t ) { 4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driSwapOutTextureObject( t ); 4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t = (driTextureObject *) radeonAllocTexObj( texObj ); 4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!t) { 4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D"); 4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_store_texsubimage1d(ctx, target, level, xoffset, width, 4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul format, type, pixels, packing, texObj, 4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul texImage); 4865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->dirty_images[0] |= (1 << level); 4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexImage2D( GLcontext *ctx, GLenum target, GLint level, 4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint internalFormat, 4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint width, GLint height, GLint border, 4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const struct gl_pixelstore_attrib *packing, 4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_object *texObj, 4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_image *texImage ) 4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driTextureObject * t = (driTextureObject *) texObj->DriverData; 5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint face; 5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* which cube face or ordinary 2D image */ 5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (target) { 5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X; 5115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ASSERT(face < 6); 5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 5145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul face = 0; 5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( t != NULL ) { 5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driSwapOutTextureObject( t ); 5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t = (driTextureObject *) radeonAllocTexObj( texObj ); 5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!t) { 5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 5245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 5255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Note, this will call ChooseTextureFormat */ 5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_store_teximage2d(ctx, target, level, internalFormat, 5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul width, height, border, format, type, pixels, 5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul &ctx->Unpack, texObj, texImage); 5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->dirty_images[face] |= (1 << level); 5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexSubImage2D( GLcontext *ctx, GLenum target, GLint level, 5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLint xoffset, GLint yoffset, 5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLsizei width, GLsizei height, 5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum format, GLenum type, 5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLvoid *pixels, 5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const struct gl_pixelstore_attrib *packing, 5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_object *texObj, 5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_image *texImage ) 5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driTextureObject * t = (driTextureObject *) texObj->DriverData; 5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint face; 5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* which cube face or ordinary 2D image */ 5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch (target) { 5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X; 5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ASSERT(face < 6); 5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 5605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 5615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul face = 0; 5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul assert( t ); /* this _should_ be true */ 5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( t ) { 5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driSwapOutTextureObject( t ); 5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul else { 5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t = (driTextureObject *) radeonAllocTexObj( texObj ); 5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if (!t) { 5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D"); 5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width, 5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul height, format, type, pixels, packing, texObj, 5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul texImage); 5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->dirty_images[face] |= (1 << level); 5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 583d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholtstatic void radeonCompressedTexImage2D( GLcontext *ctx, GLenum target, GLint level, 584d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt GLint internalFormat, 585d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt GLint width, GLint height, GLint border, 586d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt GLsizei imageSize, const GLvoid *data, 587d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt struct gl_texture_object *texObj, 588d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt struct gl_texture_image *texImage ) 589d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt{ 590d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt driTextureObject * t = (driTextureObject *) texObj->DriverData; 591d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt GLuint face; 592d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 593d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt /* which cube face or ordinary 2D image */ 594d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt switch (target) { 595d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 596d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 597d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 598d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 599d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 600d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 601d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X; 602d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt ASSERT(face < 6); 603d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt break; 604d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt default: 605d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt face = 0; 606d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt } 607d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 608d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt if ( t != NULL ) { 609d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt driSwapOutTextureObject( t ); 610d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt } 611d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt else { 612d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt t = (driTextureObject *) radeonAllocTexObj( texObj ); 613d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt if (!t) { 614d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); 615d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt return; 616d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt } 617d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt } 618d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 619d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt /* Note, this will call ChooseTextureFormat */ 620d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt _mesa_store_compressed_teximage2d(ctx, target, level, internalFormat, width, 621d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt height, border, imageSize, data, texObj, texImage); 622d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 623d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt t->dirty_images[face] |= (1 << level); 624d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt} 6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 627d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholtstatic void radeonCompressedTexSubImage2D( GLcontext *ctx, GLenum target, GLint level, 628d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt GLint xoffset, GLint yoffset, 629d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt GLsizei width, GLsizei height, 630d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt GLenum format, 631d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt GLsizei imageSize, const GLvoid *data, 632d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt struct gl_texture_object *texObj, 633d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt struct gl_texture_image *texImage ) 634d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt{ 635d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt driTextureObject * t = (driTextureObject *) texObj->DriverData; 636d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt GLuint face; 637d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 638d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 639d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt /* which cube face or ordinary 2D image */ 640d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt switch (target) { 641d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 642d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 643d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 644d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 645d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 646d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 647d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X; 648d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt ASSERT(face < 6); 649d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt break; 650d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt default: 651d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt face = 0; 652d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt } 653d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 654d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt assert( t ); /* this _should_ be true */ 655d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt if ( t ) { 656d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt driSwapOutTextureObject( t ); 657d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt } 658d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt else { 659d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt t = (driTextureObject *) radeonAllocTexObj( texObj ); 660d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt if (!t) { 661d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D"); 662d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt return; 663d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt } 664d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt } 665d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 666d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt _mesa_store_compressed_texsubimage2d(ctx, target, level, xoffset, yoffset, width, 667d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt height, format, imageSize, data, texObj, texImage); 668d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 669d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt t->dirty_images[face] |= (1 << level); 670d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt} 671d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define SCALED_FLOAT_TO_BYTE( x, scale ) \ 6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul (((GLuint)((255.0F / scale) * (x))) / 2) 6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexEnv( GLcontext *ctx, GLenum target, 6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum pname, const GLfloat *param ) 6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint unit = ctx->Texture.CurrentUnit; 6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( RADEON_DEBUG & DEBUG_STATE ) { 6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf( stderr, "%s( %s )\n", 6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul __FUNCTION__, _mesa_lookup_enum_by_nr( pname ) ); 6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( pname ) { 6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_ENV_COLOR: { 6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLubyte c[4]; 6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint envColor; 6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul UNCLAMPED_FLOAT_TO_RGBA_CHAN( c, texUnit->EnvColor ); 6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul envColor = radeonPackColor( 4, c[0], c[1], c[2], c[3] ); 6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa->hw.tex[unit].cmd[TEX_PP_TFACTOR] != envColor ) { 6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tex[unit] ); 6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tex[unit].cmd[TEX_PP_TFACTOR] = envColor; 6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_LOD_BIAS_EXT: { 701effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling GLfloat bias, min; 7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint b; 7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* The Radeon's LOD bias is a signed 2's complement value with a 7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * range of -1.0 <= bias < 4.0. We break this into two linear 7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * functions, one mapping [-1.0,0.0] to [-128,0] and one mapping 7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * [0.0,4.0] to [0,127]. 7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 709effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling min = driQueryOptionb (&rmesa->optionCache, "no_neg_lod_bias") ? 710effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling 0.0 : -1.0; 711effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling bias = CLAMP( *param, min, 4.0 ); 7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( bias == 0 ) { 7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b = 0; 7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else if ( bias > 0 ) { 7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b = ((GLuint)SCALED_FLOAT_TO_BYTE( bias, 4.0 )) << RADEON_LOD_BIAS_SHIFT; 7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } else { 7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul b = ((GLuint)SCALED_FLOAT_TO_BYTE( bias, 1.0 )) << RADEON_LOD_BIAS_SHIFT; 7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( (rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] & RADEON_LOD_BIAS_MASK) != b ) { 7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_STATECHANGE( rmesa, tex[unit] ); 7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] &= ~RADEON_LOD_BIAS_MASK; 7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->hw.tex[unit].cmd[TEX_PP_TXFILTER] |= (b & RADEON_LOD_BIAS_MASK); 7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/** 7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Changes variables and flags for a state update, which will happen at the 7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * next UpdateTextureState 7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexParameter( GLcontext *ctx, GLenum target, 7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_object *texObj, 7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum pname, const GLfloat *params ) 7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonTexObjPtr t = (radeonTexObjPtr) texObj->DriverData; 7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( RADEON_DEBUG & (DEBUG_STATE|DEBUG_TEXTURE) ) { 7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul fprintf( stderr, "%s( %s )\n", __FUNCTION__, 7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_lookup_enum_by_nr( pname ) ); 7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul switch ( pname ) { 7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_MIN_FILTER: 7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_MAG_FILTER: 7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_MAX_ANISOTROPY_EXT: 7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonSetTexMaxAnisotropy( t, texObj->MaxAnisotropy ); 7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonSetTexFilter( t, texObj->MinFilter, texObj->MagFilter ); 7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_WRAP_S: 7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_WRAP_T: 7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonSetTexWrap( t, texObj->WrapS, texObj->WrapT ); 7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_BORDER_COLOR: 76379c55e55f808d77cb0dff7cda826719d5fda3c7dBrian Paul radeonSetTexBorderColor( t, texObj->BorderColor ); 7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_BASE_LEVEL: 7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_MAX_LEVEL: 7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_MIN_LOD: 7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul case GL_TEXTURE_MAX_LOD: 7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* This isn't the most efficient solution but there doesn't appear to 7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * be a nice alternative. Since there's no LOD clamping, 7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * we just have to rely on loading the right subset of mipmap levels 7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * to simulate a clamped LOD. 7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driSwapOutTextureObject( (driTextureObject *) t ); 7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul break; 7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul default: 7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul return; 7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul /* Mark this texobj as dirty (one bit per tex unit) 7835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul t->dirty_state = TEX_ALL; 7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonBindTexture( GLcontext *ctx, GLenum target, 7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_object *texObj ) 7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( RADEON_DEBUG & (DEBUG_STATE|DEBUG_TEXTURE) ) { 792462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane fprintf( stderr, "%s( %p ) unit=%d\n", __FUNCTION__, (void *)texObj, 7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul ctx->Texture.CurrentUnit ); 7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 7968135a445f3b0ae207ec5e4485b5936050d438320Felix Kuehling assert( (target != GL_TEXTURE_1D && target != GL_TEXTURE_2D && 797247f3b3e81fffa86c50531070fab573e26ffb452Roland Scheidegger target != GL_TEXTURE_RECTANGLE_NV && target != GL_TEXTURE_CUBE_MAP) || 7988135a445f3b0ae207ec5e4485b5936050d438320Felix Kuehling (texObj->DriverData != NULL) ); 7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8004e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul 8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonDeleteTexture( GLcontext *ctx, 8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul struct gl_texture_object *texObj ) 8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driTextureObject * t = (driTextureObject *) texObj->DriverData; 8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( RADEON_DEBUG & (DEBUG_STATE|DEBUG_TEXTURE) ) { 809462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihane fprintf( stderr, "%s( %p (target = %s) )\n", __FUNCTION__, (void *)texObj, 8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul _mesa_lookup_enum_by_nr( texObj->Target ) ); 8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( t != NULL ) { 8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul if ( rmesa ) { 8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul RADEON_FIREVERTICES( rmesa ); 8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul driDestroyTextureObject( t ); 8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul } 8208bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul 8218bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul /* Free mipmap images and the texture object itself */ 8228bc3ce92a2fa1b8b4ae2b928d4102389f2298917Brian Paul _mesa_delete_texture_object(ctx, texObj); 8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Need: 8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * - Same GEN_MODE for all active bits 8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * - Same EyePlane/ObjPlane for all active bits when using Eye/Obj 8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * - STRQ presumably all supported (matrix means incoming R values 8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * can end up in STQ, this has implications for vertex support, 8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * presumably ok if maos is used, though?) 8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Basically impossible to do this on the fly - just collect some 8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * basic info & do the checks from ValidateState(). 8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */ 8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void radeonTexGen( GLcontext *ctx, 8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum coord, 8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLenum pname, 8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul const GLfloat *params ) 8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul GLuint unit = ctx->Texture.CurrentUnit; 8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul rmesa->recheck_texgen[unit] = GL_TRUE; 8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 845d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul/** 846d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Allocate a new texture object. 847d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Called via ctx->Driver.NewTextureObject. 8484e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul * Note: we could use containment here to 'derive' the driver-specific 8494e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul * texture object from the core mesa gl_texture_object. Not done at this time. 850effc73931f86c7961b4eb296d2d4c5d91624a9e3Felix Kuehling */ 851d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paulstatic struct gl_texture_object * 852d3fd7ba8af15bead2f770d68a893449adeb11397Brian PaulradeonNewTextureObject( GLcontext *ctx, GLuint name, GLenum target ) 8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{ 8545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul radeonContextPtr rmesa = RADEON_CONTEXT(ctx); 855d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul struct gl_texture_object *obj; 856d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul obj = _mesa_new_texture_object(ctx, name, target); 857d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul if (!obj) 858d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul return NULL; 859d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul obj->MaxAnisotropy = rmesa->initialMaxAnisotropy; 8608135a445f3b0ae207ec5e4485b5936050d438320Felix Kuehling radeonAllocTexObj( obj ); 861d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul return obj; 862d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul} 8635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 8645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul 865d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paulvoid radeonInitTextureFuncs( struct dd_function_table *functions ) 866d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul{ 867d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->ChooseTextureFormat = radeonChooseTextureFormat; 868d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->TexImage1D = radeonTexImage1D; 869d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->TexImage2D = radeonTexImage2D; 870d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->TexSubImage1D = radeonTexSubImage1D; 871d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->TexSubImage2D = radeonTexSubImage2D; 872d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul 873d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->NewTextureObject = radeonNewTextureObject; 8744e713913fb88bc221eea1a18822cc782ca39af4dBrian Paul functions->BindTexture = radeonBindTexture; 875d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->DeleteTexture = radeonDeleteTexture; 876d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->IsTextureResident = driIsTextureResident; 877d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul 878d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->TexEnv = radeonTexEnv; 879d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->TexParameter = radeonTexParameter; 880d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul functions->TexGen = radeonTexGen; 881f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul 882d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt functions->CompressedTexImage2D = radeonCompressedTexImage2D; 883d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt functions->CompressedTexSubImage2D = radeonCompressedTexSubImage2D; 884d09209f5530e8bba78e4e0ec62b2027c588cc8f3Eric Anholt 885f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul driInitTextureFormats(); 8865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} 887