texobj.c revision 1eee1bac1f6d911e6124daafc9b9291666d91cef
16dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 26dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \file texobj.c 36dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Texture object management. 46dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 56dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 8145d762044f795bf9d68f28079cc5e5d3056920eBrian * Version: 7.1 95e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 10145d762044f795bf9d68f28079cc5e5d3056920eBrian * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"), 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions: 185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 215e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 31f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "mfeatures.h" 3234a61c66fd1b625a5606b795d192a49632ff1787Keith Whitwell#if FEATURE_colortable 334bdcfe50f8886e43714f9b7edd25cbff19e6a97dBrian Paul#include "colortab.h" 3434a61c66fd1b625a5606b795d192a49632ff1787Keith Whitwell#endif 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enums.h" 37519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul#include "fbobject.h" 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "hash.h" 393c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 40ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h" 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "teximage.h" 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "texstate.h" 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "texobj.h" 445e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 454a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul#include "shader/prog_instruction.h" 464a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul 47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 48519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/ 506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name Internal functions */ 516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/ 526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 53ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 54ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul/** 55ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Return the gl_texture_object for a given ID. 56ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 57ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paulstruct gl_texture_object * 58ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul_mesa_lookup_texture(GLcontext *ctx, GLuint id) 59ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul{ 60ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul return (struct gl_texture_object *) 61ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul _mesa_HashLookup(ctx->Shared->TexObjects, id); 62ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul} 63ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 64ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 65ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul 66a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 678a033fa13514e3b78612ba1678182c9ea8290cd4Brian Paul * Allocate and initialize a new texture object. But don't put it into the 688a033fa13514e3b78612ba1678182c9ea8290cd4Brian Paul * texture object hash table. 696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 70a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Called via ctx->Driver.NewTextureObject, unless overridden by a device 71a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * driver. 726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param shared the shared GL state structure to contain the texture object 746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param name integer name for the texture object 756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target either GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, 766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * GL_TEXTURE_CUBE_MAP_ARB or GL_TEXTURE_RECTANGLE_NV. zero is ok for the sake 776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * of GenTextures() 786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return pointer to new texture object. 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct gl_texture_object * 82a3f137094cd965d27e1b088499dd609b81a91906Brian Paul_mesa_new_texture_object( GLcontext *ctx, GLuint name, GLenum target ) 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_object *obj; 85a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 869c0b83556dae35cf7260567f30fc156efa8c9742Brian Paul obj = MALLOC_STRUCT(gl_texture_object); 87a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_initialize_texture_object(obj, name, target); 88a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return obj; 89a3f137094cd965d27e1b088499dd609b81a91906Brian Paul} 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 91a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 92a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 93f18fc687071a71a6f821a779a83b435f80d55b64Brian Paul * Initialize a new texture object to default values. 94a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * \param obj the texture object 95a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * \param name the texture name 96a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * \param target the texture target 97a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */ 98a3f137094cd965d27e1b088499dd609b81a91906Brian Paulvoid 99a3f137094cd965d27e1b088499dd609b81a91906Brian Paul_mesa_initialize_texture_object( struct gl_texture_object *obj, 100a3f137094cd965d27e1b088499dd609b81a91906Brian Paul GLuint name, GLenum target ) 101a3f137094cd965d27e1b088499dd609b81a91906Brian Paul{ 1028afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul ASSERT(target == 0 || 1038afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_1D || 1048afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_2D || 1058afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_3D || 1068afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_CUBE_MAP_ARB || 107bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick target == GL_TEXTURE_RECTANGLE_NV || 108bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick target == GL_TEXTURE_1D_ARRAY_EXT || 109bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick target == GL_TEXTURE_2D_ARRAY_EXT); 110420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul 111f18fc687071a71a6f821a779a83b435f80d55b64Brian Paul _mesa_bzero(obj, sizeof(*obj)); 112a3f137094cd965d27e1b088499dd609b81a91906Brian Paul /* init the non-zero fields */ 1139e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_INIT_MUTEX(obj->Mutex); 114a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->RefCount = 1; 115a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->Name = name; 116a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->Target = target; 117a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->Priority = 1.0F; 118a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (target == GL_TEXTURE_RECTANGLE_NV) { 119a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->WrapS = GL_CLAMP_TO_EDGE; 120a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->WrapT = GL_CLAMP_TO_EDGE; 121a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->WrapR = GL_CLAMP_TO_EDGE; 122a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->MinFilter = GL_LINEAR; 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 124a3f137094cd965d27e1b088499dd609b81a91906Brian Paul else { 125a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->WrapS = GL_REPEAT; 126a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->WrapT = GL_REPEAT; 127a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->WrapR = GL_REPEAT; 128a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->MinFilter = GL_NEAREST_MIPMAP_LINEAR; 129a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 130a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->MagFilter = GL_LINEAR; 131a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->MinLod = -1000.0; 132a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->MaxLod = 1000.0; 133781fb93877ea3a6faeefcdb48d9b463da7d954a3Brian Paul obj->LodBias = 0.0; 134a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->BaseLevel = 0; 135a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->MaxLevel = 1000; 136a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->MaxAnisotropy = 1.0; 137f0805670a1b8e624c6f9a468a14c4bfbca446d1cBrian Paul obj->CompareMode = GL_NONE; /* ARB_shadow */ 138a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->CompareFunc = GL_LEQUAL; /* ARB_shadow */ 13926da28c995557c8b913e5ccfe31b31dc32e6c735Brian Paul obj->CompareFailValue = 0.0F; /* ARB_shadow_ambient */ 140a3f137094cd965d27e1b088499dd609b81a91906Brian Paul obj->DepthMode = GL_LUMINANCE; /* ARB_depth_texture */ 1414a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul obj->Swizzle[0] = GL_RED; 1424a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul obj->Swizzle[1] = GL_GREEN; 1434a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul obj->Swizzle[2] = GL_BLUE; 1444a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul obj->Swizzle[3] = GL_ALPHA; 1454a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul obj->_Swizzle = SWIZZLE_NOOP; 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1506a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul * Some texture initialization can't be finished until we know which 1516a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul * target it's getting bound to (GL_TEXTURE_1D/2D/etc). 1526a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul */ 1536a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paulstatic void 1546a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paulfinish_texture_init(GLcontext *ctx, GLenum target, 1556a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul struct gl_texture_object *obj) 1566a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul{ 1576a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul assert(obj->Target == 0); 1586a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul 1596a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul if (target == GL_TEXTURE_RECTANGLE_NV) { 1606a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul /* have to init wrap and filter state here - kind of klunky */ 1616a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul obj->WrapS = GL_CLAMP_TO_EDGE; 1626a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul obj->WrapT = GL_CLAMP_TO_EDGE; 1636a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul obj->WrapR = GL_CLAMP_TO_EDGE; 1646a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul obj->MinFilter = GL_LINEAR; 1656a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul if (ctx->Driver.TexParameter) { 1666a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul static const GLfloat fparam_wrap[1] = {(GLfloat) GL_CLAMP_TO_EDGE}; 1676a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul static const GLfloat fparam_filter[1] = {(GLfloat) GL_LINEAR}; 1686a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_WRAP_S, fparam_wrap); 1696a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_WRAP_T, fparam_wrap); 1706a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_WRAP_R, fparam_wrap); 1716a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul ctx->Driver.TexParameter(ctx, target, obj, GL_TEXTURE_MIN_FILTER, fparam_filter); 1726a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul } 1736a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul } 1746a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul} 1756a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul 1766a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul 1776a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul/** 1786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Deallocate a texture object struct. It should have already been 1796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * removed from the texture object pool. 1809e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian * Called via ctx->Driver.DeleteTexture() if not overriden by a driver. 1816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param shared the shared GL state to which the object belongs. 1831eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param texObj the texture object to delete. 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 185a3f137094cd965d27e1b088499dd609b81a91906Brian Paulvoid 186a3f137094cd965d27e1b088499dd609b81a91906Brian Paul_mesa_delete_texture_object( GLcontext *ctx, struct gl_texture_object *texObj ) 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 18818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint i, face; 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 190a3f137094cd965d27e1b088499dd609b81a91906Brian Paul (void) ctx; 191a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 1929e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* Set Target to an invalid value. With some assertions elsewhere 1939e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * we can try to detect possible use of deleted textures. 1949e01b915f1243a3f551cb795b7124bd1e52ca15fBrian */ 1959e01b915f1243a3f551cb795b7124bd1e52ca15fBrian texObj->Target = 0x99; 1969e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 19734a61c66fd1b625a5606b795d192a49632ff1787Keith Whitwell#if FEATURE_colortable 19805944c031cd6bea985050f0e88a19f0794f57887Brian Paul _mesa_free_colortable_data(&texObj->Palette); 19934a61c66fd1b625a5606b795d192a49632ff1787Keith Whitwell#endif 200a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 201a3f137094cd965d27e1b088499dd609b81a91906Brian Paul /* free the texture images */ 20218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell for (face = 0; face < 6; face++) { 20318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell for (i = 0; i < MAX_TEXTURE_LEVELS; i++) { 20418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (texObj->Image[face][i]) { 2053e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell _mesa_delete_texture_image( ctx, texObj->Image[face][i] ); 20618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2109e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* destroy the mutex -- it may have allocated memory (eg on bsd) */ 2119e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_DESTROY_MUTEX(texObj->Mutex); 2129e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 213a3f137094cd965d27e1b088499dd609b81a91906Brian Paul /* free this object */ 214a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_free(texObj); 215a3f137094cd965d27e1b088499dd609b81a91906Brian Paul} 216a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 217a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 218a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 22185d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul * Copy texture object state from one texture object to another. 222bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul * Use for glPush/PopAttrib. 2236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 2246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dest destination texture object. 2256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param src source texture object. 22685d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul */ 22785d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paulvoid 22885d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul_mesa_copy_texture_object( struct gl_texture_object *dest, 22985d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul const struct gl_texture_object *src ) 23085d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul{ 231145d762044f795bf9d68f28079cc5e5d3056920eBrian dest->Target = src->Target; 23285d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->Name = src->Name; 23385d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->Priority = src->Priority; 23485d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BorderColor[0] = src->BorderColor[0]; 23585d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BorderColor[1] = src->BorderColor[1]; 23685d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BorderColor[2] = src->BorderColor[2]; 23785d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BorderColor[3] = src->BorderColor[3]; 23885d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->WrapS = src->WrapS; 23985d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->WrapT = src->WrapT; 24085d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->WrapR = src->WrapR; 24185d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MinFilter = src->MinFilter; 24285d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MagFilter = src->MagFilter; 24385d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MinLod = src->MinLod; 24485d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MaxLod = src->MaxLod; 245781fb93877ea3a6faeefcdb48d9b463da7d954a3Brian Paul dest->LodBias = src->LodBias; 24685d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BaseLevel = src->BaseLevel; 24785d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MaxLevel = src->MaxLevel; 24885d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MaxAnisotropy = src->MaxAnisotropy; 24985d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->CompareMode = src->CompareMode; 25085d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->CompareFunc = src->CompareFunc; 25126da28c995557c8b913e5ccfe31b31dc32e6c735Brian Paul dest->CompareFailValue = src->CompareFailValue; 25285d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->DepthMode = src->DepthMode; 25385d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->_MaxLevel = src->_MaxLevel; 25485d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->_MaxLambda = src->_MaxLambda; 25585d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->GenerateMipmap = src->GenerateMipmap; 25685d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->Palette = src->Palette; 257227315278dea9095cee6e508d03b28720b2e7880Brian dest->_Complete = src->_Complete; 2584a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul COPY_4V(dest->Swizzle, src->Swizzle); 2594a89e51c5f88b57040b361b62e80a57c8248ba4bBrian Paul dest->_Swizzle = src->_Swizzle; 26085d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul} 26185d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul 26285d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul 2636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 2649e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * Check if the given texture object is valid by examining its Target field. 2659e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * For debugging only. 2669e01b915f1243a3f551cb795b7124bd1e52ca15fBrian */ 2679e01b915f1243a3f551cb795b7124bd1e52ca15fBrianstatic GLboolean 2689e01b915f1243a3f551cb795b7124bd1e52ca15fBrianvalid_texture_object(const struct gl_texture_object *tex) 2699e01b915f1243a3f551cb795b7124bd1e52ca15fBrian{ 2709e01b915f1243a3f551cb795b7124bd1e52ca15fBrian switch (tex->Target) { 2719e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case 0: 2729e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_1D: 2739e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_2D: 2749e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_3D: 2759e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_CUBE_MAP_ARB: 2769e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_RECTANGLE_NV: 2779e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_1D_ARRAY_EXT: 2789e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_2D_ARRAY_EXT: 2799e01b915f1243a3f551cb795b7124bd1e52ca15fBrian return GL_TRUE; 2809e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case 0x99: 2819e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _mesa_problem(NULL, "invalid reference to a deleted texture object"); 2829e01b915f1243a3f551cb795b7124bd1e52ca15fBrian return GL_FALSE; 2839e01b915f1243a3f551cb795b7124bd1e52ca15fBrian default: 2849e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _mesa_problem(NULL, "invalid texture object Target value"); 2859e01b915f1243a3f551cb795b7124bd1e52ca15fBrian return GL_FALSE; 2869e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 2879e01b915f1243a3f551cb795b7124bd1e52ca15fBrian} 2889e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 2899e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 2909e01b915f1243a3f551cb795b7124bd1e52ca15fBrian/** 2919e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * Reference (or unreference) a texture object. 2929e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * If '*ptr', decrement *ptr's refcount (and delete if it becomes zero). 2939e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * If 'tex' is non-null, increment its refcount. 2949e01b915f1243a3f551cb795b7124bd1e52ca15fBrian */ 2959e01b915f1243a3f551cb795b7124bd1e52ca15fBrianvoid 2969e01b915f1243a3f551cb795b7124bd1e52ca15fBrian_mesa_reference_texobj(struct gl_texture_object **ptr, 2979e01b915f1243a3f551cb795b7124bd1e52ca15fBrian struct gl_texture_object *tex) 2989e01b915f1243a3f551cb795b7124bd1e52ca15fBrian{ 2999e01b915f1243a3f551cb795b7124bd1e52ca15fBrian assert(ptr); 3009e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (*ptr == tex) { 3019e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* no change */ 3029e01b915f1243a3f551cb795b7124bd1e52ca15fBrian return; 3039e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3049e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3059e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (*ptr) { 3069e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* Unreference the old texture */ 3079e01b915f1243a3f551cb795b7124bd1e52ca15fBrian GLboolean deleteFlag = GL_FALSE; 3089e01b915f1243a3f551cb795b7124bd1e52ca15fBrian struct gl_texture_object *oldTex = *ptr; 3099e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3109e01b915f1243a3f551cb795b7124bd1e52ca15fBrian assert(valid_texture_object(oldTex)); 3119e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3129e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_LOCK_MUTEX(oldTex->Mutex); 3139e01b915f1243a3f551cb795b7124bd1e52ca15fBrian ASSERT(oldTex->RefCount > 0); 3149e01b915f1243a3f551cb795b7124bd1e52ca15fBrian oldTex->RefCount--; 315145d762044f795bf9d68f28079cc5e5d3056920eBrian 3169e01b915f1243a3f551cb795b7124bd1e52ca15fBrian deleteFlag = (oldTex->RefCount == 0); 3179e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_UNLOCK_MUTEX(oldTex->Mutex); 3189e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3199e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (deleteFlag) { 3209e01b915f1243a3f551cb795b7124bd1e52ca15fBrian GET_CURRENT_CONTEXT(ctx); 321dc73217294efcba83c46183ed2f208250217486fBrian if (ctx) 322dc73217294efcba83c46183ed2f208250217486fBrian ctx->Driver.DeleteTexture(ctx, oldTex); 323dc73217294efcba83c46183ed2f208250217486fBrian else 324dc73217294efcba83c46183ed2f208250217486fBrian _mesa_problem(NULL, "Unable to delete texture, no context"); 3259e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3269e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3279e01b915f1243a3f551cb795b7124bd1e52ca15fBrian *ptr = NULL; 3289e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3299e01b915f1243a3f551cb795b7124bd1e52ca15fBrian assert(!*ptr); 3309e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3319e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (tex) { 3329e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* reference new texture */ 3339e01b915f1243a3f551cb795b7124bd1e52ca15fBrian assert(valid_texture_object(tex)); 3349e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_LOCK_MUTEX(tex->Mutex); 3359e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (tex->RefCount == 0) { 3369e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* this texture's being deleted (look just above) */ 3379e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* Not sure this can every really happen. Warn if it does. */ 3389e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _mesa_problem(NULL, "referencing deleted texture object"); 3399e01b915f1243a3f551cb795b7124bd1e52ca15fBrian *ptr = NULL; 3409e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3419e01b915f1243a3f551cb795b7124bd1e52ca15fBrian else { 3429e01b915f1243a3f551cb795b7124bd1e52ca15fBrian tex->RefCount++; 3439e01b915f1243a3f551cb795b7124bd1e52ca15fBrian *ptr = tex; 3449e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3459e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_UNLOCK_MUTEX(tex->Mutex); 3469e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3479e01b915f1243a3f551cb795b7124bd1e52ca15fBrian} 3489e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3499e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3509e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3519e01b915f1243a3f551cb795b7124bd1e52ca15fBrian/** 3526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Report why a texture object is incomplete. 3536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param t texture object. 3556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param why string describing why it's incomplete. 3566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \note For debug purposes only. 358a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul */ 35921d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#if 0 36021d073d55ad668494fa19977fe06369194eb1ec5Brian Paulstatic void 36121d073d55ad668494fa19977fe06369194eb1ec5Brian Paulincomplete(const struct gl_texture_object *t, const char *why) 36221d073d55ad668494fa19977fe06369194eb1ec5Brian Paul{ 3634e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_printf("Texture Obj %d incomplete because: %s\n", t->Name, why); 36421d073d55ad668494fa19977fe06369194eb1ec5Brian Paul} 36521d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#else 3666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#define incomplete(t, why) 36721d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#endif 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 371a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul * Examine a texture object to determine if it is complete. 3726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * The gl_texture_object::Complete flag will be set to GL_TRUE or GL_FALSE 3746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * accordingly. 3756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 3776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param t texture object. 3786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * According to the texture target, verifies that each of the mipmaps is 3806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * present and has the expected size. 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 38235d5301a54153930ee6fd60dff1010ce9f901397Brian Paulvoid 38335d5301a54153930ee6fd60dff1010ce9f901397Brian Paul_mesa_test_texobj_completeness( const GLcontext *ctx, 38435d5301a54153930ee6fd60dff1010ce9f901397Brian Paul struct gl_texture_object *t ) 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 38663ec4238236479a57420c6b43a09d79eff624928Brian Paul const GLint baseLevel = t->BaseLevel; 387cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul GLint maxLog2 = 0, maxLevels = 0; 38863ec4238236479a57420c6b43a09d79eff624928Brian Paul 389227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_TRUE; /* be optimistic */ 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3911126aa86bf9ca223218695eec1f41c6523068961Ian Romanick /* Detect cases where the application set the base level to an invalid 3921126aa86bf9ca223218695eec1f41c6523068961Ian Romanick * value. 3931126aa86bf9ca223218695eec1f41c6523068961Ian Romanick */ 3941126aa86bf9ca223218695eec1f41c6523068961Ian Romanick if ((baseLevel < 0) || (baseLevel > MAX_TEXTURE_LEVELS)) { 3951126aa86bf9ca223218695eec1f41c6523068961Ian Romanick char s[100]; 3965199774dc6a2a65d24ac26fe15715654f2568a02Brian Paul _mesa_sprintf(s, "base level = %d is invalid", baseLevel); 3971126aa86bf9ca223218695eec1f41c6523068961Ian Romanick incomplete(t, s); 3981126aa86bf9ca223218695eec1f41c6523068961Ian Romanick t->_Complete = GL_FALSE; 3991126aa86bf9ca223218695eec1f41c6523068961Ian Romanick return; 4001126aa86bf9ca223218695eec1f41c6523068961Ian Romanick } 4011126aa86bf9ca223218695eec1f41c6523068961Ian Romanick 402a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* Always need the base level image */ 40318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[0][baseLevel]) { 4047e86eb991b50e0f52e6a0404289ca73126da6414Brian Paul char s[100]; 4055199774dc6a2a65d24ac26fe15715654f2568a02Brian Paul _mesa_sprintf(s, "Image[baseLevel=%d] == NULL", baseLevel); 4067e86eb991b50e0f52e6a0404289ca73126da6414Brian Paul incomplete(t, s); 407227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 411973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul /* Check width/height/depth for zero */ 41218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][baseLevel]->Width == 0 || 41318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->Height == 0 || 41418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->Depth == 0) { 415973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul incomplete(t, "texture width = 0"); 416227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 417973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul return; 418973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul } 419973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul 420083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul /* Compute _MaxLevel */ 421bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick if ((t->Target == GL_TEXTURE_1D) || 422bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick (t->Target == GL_TEXTURE_1D_ARRAY_EXT)) { 42318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell maxLog2 = t->Image[0][baseLevel]->WidthLog2; 424cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul maxLevels = ctx->Const.MaxTextureLevels; 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 426bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick else if ((t->Target == GL_TEXTURE_2D) || 427bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick (t->Target == GL_TEXTURE_2D_ARRAY_EXT)) { 42818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell maxLog2 = MAX2(t->Image[0][baseLevel]->WidthLog2, 42918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->HeightLog2); 4308afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLevels = ctx->Const.MaxTextureLevels; 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 4328afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_3D) { 43318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLint max = MAX2(t->Image[0][baseLevel]->WidthLog2, 43418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->HeightLog2); 43518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell maxLog2 = MAX2(max, (GLint)(t->Image[0][baseLevel]->DepthLog2)); 436cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul maxLevels = ctx->Const.Max3DTextureLevels; 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 4388afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) { 43918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell maxLog2 = MAX2(t->Image[0][baseLevel]->WidthLog2, 44018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->HeightLog2); 4418afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLevels = ctx->Const.MaxCubeTextureLevels; 4428afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 4438afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_RECTANGLE_NV) { 4448afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLog2 = 0; /* not applicable */ 4458afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLevels = 1; /* no mipmapping */ 4468afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 447cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul else { 4488afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul _mesa_problem(ctx, "Bad t->Target in _mesa_test_texobj_completeness"); 449cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul return; 450cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul } 451cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul 452cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul ASSERT(maxLevels > 0); 453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 454083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->_MaxLevel = baseLevel + maxLog2; 455083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->_MaxLevel = MIN2(t->_MaxLevel, t->MaxLevel); 456cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul t->_MaxLevel = MIN2(t->_MaxLevel, maxLevels - 1); 457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 458083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul /* Compute _MaxLambda = q - b (see the 1.2 spec) used during mipmapping */ 459083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->_MaxLambda = (GLfloat) (t->_MaxLevel - t->BaseLevel); 460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4618afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) { 462a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* make sure that all six cube map level 0 images are the same size */ 46318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell const GLuint w = t->Image[0][baseLevel]->Width2; 46418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell const GLuint h = t->Image[0][baseLevel]->Height2; 46518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint face; 46618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell for (face = 1; face < 6; face++) { 46718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[face][baseLevel] == NULL || 46818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[face][baseLevel]->Width2 != w || 46918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[face][baseLevel]->Height2 != h) { 470227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 47118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "Non-quare cubemap image"); 47218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; 47318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 474ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 475ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 476ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul 477887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul /* extra checking for mipmaps */ 478ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (t->MinFilter != GL_NEAREST && t->MinFilter != GL_LINEAR) { 479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mipmapping: determine if we have a complete set of mipmaps 481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 48363ec4238236479a57420c6b43a09d79eff624928Brian Paul GLint minLevel = baseLevel; 484083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul GLint maxLevel = t->_MaxLevel; 485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (minLevel > maxLevel) { 487227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 48821d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "minLevel > maxLevel"); 489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test dimension-independent attributes */ 493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i = minLevel; i <= maxLevel; i++) { 49418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]) { 49518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->TexFormat != t->Image[0][baseLevel]->TexFormat) { 496227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 49721d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "Format[i] != Format[baseLevel]"); 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 50018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Border != t->Image[0][baseLevel]->Border) { 501227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 50221d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "Border[i] != Border[baseLevel]"); 503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test things which depend on number of texture image dimensions */ 509bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick if ((t->Target == GL_TEXTURE_1D) || 510bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick (t->Target == GL_TEXTURE_1D_ARRAY_EXT)) { 511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test 1-D mipmaps */ 51218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint width = t->Image[0][baseLevel]->Width2; 513cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 514ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width /= 2; 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i >= minLevel && i <= maxLevel) { 51818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[0][i]) { 519227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 52018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "1D Image[0][i] == NULL"); 521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 52318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Width2 != width ) { 524227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 52518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "1D Image[0][i] bad width"); 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 528afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 529ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width == 1) { 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; /* found smallest needed mipmap, all done! */ 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 534bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick else if ((t->Target == GL_TEXTURE_2D) || 535bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick (t->Target == GL_TEXTURE_2D_ARRAY_EXT)) { 536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test 2-D mipmaps */ 53718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint width = t->Image[0][baseLevel]->Width2; 53818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint height = t->Image[0][baseLevel]->Height2; 539cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 540ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width /= 2; 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 543ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (height > 1) { 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg height /= 2; 545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i >= minLevel && i <= maxLevel) { 54718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[0][i]) { 548227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 54918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "2D Image[0][i] == NULL"); 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 55218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Width2 != width) { 553227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 55418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "2D Image[0][i] bad width"); 555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 55718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Height2 != height) { 558227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 55918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "2D Image[0][i] bad height"); 560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (width==1 && height==1) { 563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; /* found smallest needed mipmap, all done! */ 564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 5688afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_3D) { 569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test 3-D mipmaps */ 57018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint width = t->Image[0][baseLevel]->Width2; 57118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint height = t->Image[0][baseLevel]->Height2; 57218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint depth = t->Image[0][baseLevel]->Depth2; 573cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 574ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width /= 2; 576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 577ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (height > 1) { 578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg height /= 2; 579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 580ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (depth > 1) { 581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg depth /= 2; 582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i >= minLevel && i <= maxLevel) { 58418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[0][i]) { 58518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "3D Image[0][i] == NULL"); 586227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 589a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul if (t->Image[0][i]->_BaseFormat == GL_DEPTH_COMPONENT) { 590227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 5914182cf60d96a077a66675e89694529b5f9e4b329Brian Paul incomplete(t, "GL_DEPTH_COMPONENT only works with 1/2D tex"); 5924182cf60d96a077a66675e89694529b5f9e4b329Brian Paul return; 5934182cf60d96a077a66675e89694529b5f9e4b329Brian Paul } 59418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Width2 != width) { 595227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 59618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "3D Image[0][i] bad width"); 597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 59918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Height2 != height) { 600227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 60118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "3D Image[0][i] bad height"); 602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 60418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Depth2 != depth) { 605227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 60618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "3D Image[0][i] bad depth"); 607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 610ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width == 1 && height == 1 && depth == 1) { 611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; /* found smallest needed mipmap, all done! */ 612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 6158afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) { 616ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul /* make sure 6 cube faces are consistant */ 61718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint width = t->Image[0][baseLevel]->Width2; 61818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint height = t->Image[0][baseLevel]->Height2; 619cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 620ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 621ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul width /= 2; 622ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 623ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (height > 1) { 624ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul height /= 2; 625ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 626ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (i >= minLevel && i <= maxLevel) { 62718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint face; 62818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell for (face = 0; face < 6; face++) { 62918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell /* check that we have images defined */ 63018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[face][i]) { 631227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 63218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "CubeMap Image[n][i] == NULL"); 63318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; 63418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 63518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell /* Don't support GL_DEPTH_COMPONENT for cube maps */ 636a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul if (t->Image[face][i]->_BaseFormat == GL_DEPTH_COMPONENT) { 637227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 63818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "GL_DEPTH_COMPONENT only works with 1/2D tex"); 63918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; 64018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 64118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell /* check that all six images have same size */ 64218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[face][i]->Width2!=width || 64318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[face][i]->Height2!=height) { 644227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 64518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "CubeMap Image[n][i] bad size"); 64618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; 64718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 64818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 64918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 65018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (width == 1 && height == 1) { 65118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; /* found smallest needed mipmap, all done! */ 652ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 653ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 654413d6a21f849a689b5c83ea04395856b44fc65a8Brian Paul } 6558afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_RECTANGLE_NV) { 6568afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul /* XXX special checking? */ 6578afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 658afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 6598afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul /* Target = ??? */ 66008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bug in gl_test_texture_object_completeness\n"); 661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 6656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 667832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 6686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/***********************************************************************/ 6696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name API functions */ 6706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/ 671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 6726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 6736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 6746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Generate texture names. 6756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of texture names to be generated. 677a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * \param textures an array in which will hold the generated texture names. 6786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glGenTextures(). 6806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6819e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian * Calls _mesa_HashFindFreeKeyBlock() to find a block of free texture 6829e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian * IDs which are stored in \p textures. Corresponding empty texture 6839e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian * objects are also generated. 6846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 685c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 686a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul_mesa_GenTextures( GLsizei n, GLuint *textures ) 687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 688fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint first; 690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 691cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 692afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 693507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (n < 0) { 69408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glGenTextures" ); 695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 698a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul if (!textures) 699507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return; 700832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 701832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul /* 702832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul * This must be atomic (generation and allocation of texture IDs) 703832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul */ 7049e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 705832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 706bb79790662f56eb71aafd3f020cd86ad810f56b2Brian Paul first = _mesa_HashFindFreeKeyBlock(ctx->Shared->TexObjects, n); 707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Allocate new, empty texture objects */ 709a3f137094cd965d27e1b088499dd609b81a91906Brian Paul for (i = 0; i < n; i++) { 710a3f137094cd965d27e1b088499dd609b81a91906Brian Paul struct gl_texture_object *texObj; 711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint name = first + i; 7128afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul GLenum target = 0; 713a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texObj = (*ctx->Driver.NewTextureObject)( ctx, name, target); 714a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texObj) { 7159e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 716a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenTextures"); 717a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return; 718a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 719bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul 720bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul /* insert into hash table */ 721bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _mesa_HashInsert(ctx->Shared->TexObjects, texObj->Name, texObj); 722bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul 723a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul textures[i] = name; 724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 725832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 7269e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 729a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul 7306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 731519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * Check if the given texture object is bound to the current draw or 732519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * read framebuffer. If so, Unbind it. 733519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul */ 734519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulstatic void 735519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulunbind_texobj_from_fbo(GLcontext *ctx, struct gl_texture_object *texObj) 736519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{ 737519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul const GLuint n = (ctx->DrawBuffer == ctx->ReadBuffer) ? 1 : 2; 738519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul GLuint i; 739519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 740519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul for (i = 0; i < n; i++) { 741519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul struct gl_framebuffer *fb = (i == 0) ? ctx->DrawBuffer : ctx->ReadBuffer; 742519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul if (fb->Name) { 743519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul GLuint j; 744519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul for (j = 0; j < BUFFER_COUNT; j++) { 745519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul if (fb->Attachment[j].Type == GL_TEXTURE && 746519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul fb->Attachment[j].Texture == texObj) { 747519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul _mesa_remove_attachment(ctx, fb->Attachment + j); 748519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 749519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 750519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 751519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 752519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul} 753519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 754519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 755519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul/** 756519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * Check if the given texture object is bound to any texture image units and 7579e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * unbind it if so (revert to default textures). 758519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul */ 759519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulstatic void 760519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulunbind_texobj_from_texunits(GLcontext *ctx, struct gl_texture_object *texObj) 761519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{ 7629818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul GLuint u, tex; 763519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 764519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul for (u = 0; u < MAX_TEXTURE_IMAGE_UNITS; u++) { 765519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul struct gl_texture_unit *unit = &ctx->Texture.Unit[u]; 7669818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul for (tex = 0; tex < NUM_TEXTURE_TARGETS; tex++) { 7679818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul if (texObj == unit->CurrentTex[tex]) { 7689818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul _mesa_reference_texobj(&unit->CurrentTex[tex], 7699818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul ctx->Shared->DefaultTex[TEXTURE_1D_INDEX]); 7709818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul ASSERT(unit->CurrentTex[tex]); 7719818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul break; 7729818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul } 773519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 774519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 775519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul} 776519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 777519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 778519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul/** 7796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Delete named textures. 7806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of textures to be deleted. 782a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * \param textures array of texture IDs to be deleted. 7836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glDeleteTextures(). 7856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 786a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * If we're about to delete a texture that's currently bound to any 787a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * texture unit, unbind the texture first. Decrement the reference 788a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * count on the texture object and delete it if it's zero. 789a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * Recall that texture objects can be shared among several rendering 790a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * contexts. 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 792c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 793a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul_mesa_DeleteTextures( GLsizei n, const GLuint *textures) 794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 795fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 797cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex */ 798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 799a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul if (!textures) 800507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return; 801507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul 802a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul for (i = 0; i < n; i++) { 803a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul if (textures[i] > 0) { 804ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *delObj 805ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul = _mesa_lookup_texture(ctx, textures[i]); 8065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 807a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (delObj) { 8085ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, delObj); 809519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 810519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul /* Check if texture is bound to any framebuffer objects. 811519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * If so, unbind. 812519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * See section 4.4.2.3 of GL_EXT_framebuffer_object. 813519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul */ 814519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul unbind_texobj_from_fbo(ctx, delObj); 815519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 816519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul /* Check if this texture is currently bound to any texture units. 8179e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * If so, unbind it. 81859d6da5365c876ba18a66cd51ed52b0e1d96704eBrian Paul */ 819519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul unbind_texobj_from_texunits(ctx, delObj); 820519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 8219e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _mesa_unlock_texture(ctx, delObj); 8229e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 823a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul ctx->NewState |= _NEW_TEXTURE; 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 825bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul /* The texture _name_ is now free for re-use. 826bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul * Remove it from the hash table now. 827bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul */ 828bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 829bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _mesa_HashRemove(ctx->Shared->TexObjects, delObj->Name); 830bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 831bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul 832145d762044f795bf9d68f28079cc5e5d3056920eBrian /* Unreference the texobj. If refcount hits zero, the texture 8339e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * will be deleted. 83442fee73aadd7f37a4f18e57c167e98b7a6294508Brian Paul */ 8359e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _mesa_reference_texobj(&delObj, NULL); 836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 841f18fc687071a71a6f821a779a83b435f80d55b64Brian Paul 8426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 8439818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul * Convert a GL texture target enum such as GL_TEXTURE_2D or GL_TEXTURE_3D 8449818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul * into the corresponding Mesa texture target index. 8459818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul * Return -1 if target is invalid. 8469818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul */ 8479818734e0148510967ca9ee0d1aa8b196b509f02Brian Paulstatic GLint 8489818734e0148510967ca9ee0d1aa8b196b509f02Brian Paultarget_enum_to_index(GLenum target) 8499818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul{ 8509818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul switch (target) { 8519818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_1D: 8529818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_1D_INDEX; 8539818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_2D: 8549818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_2D_INDEX; 8559818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_3D: 8569818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_3D_INDEX; 8579818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 8589818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_CUBE_INDEX; 8599818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_RECTANGLE_NV: 8609818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_RECT_INDEX; 8619818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 8629818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_1D_ARRAY_INDEX; 8639818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_2D_ARRAY_EXT: 8649818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_2D_ARRAY_INDEX; 8659818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul default: 8669818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return -1; 8679818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul } 8689818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul} 8699818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul 8709818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul 8719818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul/** 8726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Bind a named texture to a texturing target. 8736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 8756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texName texture name. 8766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glBindTexture(). 8786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Determines the old texture object bound and returns immediately if rebinding 8806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * the same texture. Get the current texture which is either a default texture 8816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * if name is null, a named texture from the hash, or a new texture if the 8826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * given texture name is new. Increments its reference count, binds it, and 8836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * calls dd_function_table::BindTexture. Decrements the old texture reference 8846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * count and deletes it if it reaches zero. 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 886c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 887fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_BindTexture( GLenum target, GLuint texName ) 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 889fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 890be906fe05e1fd6c488ff84b24379d7272a5ac5afBrian Paul const GLuint unit = ctx->Texture.CurrentUnit; 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 8926a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul struct gl_texture_object *newTexObj = NULL, *defaultTexObj = NULL; 8939818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul GLint targetIndex; 894cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 8974753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glBindTexture %s %d\n", 898d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul _mesa_lookup_enum_by_nr(target), (GLint) texName); 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 9009818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul targetIndex = target_enum_to_index(target); 9019818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul if (targetIndex < 0) { 9026a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glBindTexture(target)"); 9036a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul return; 9046a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul } 9059818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul assert(targetIndex < NUM_TEXTURE_TARGETS); 9069818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul defaultTexObj = ctx->Shared->DefaultTex[targetIndex]; 9076a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul 908f18fc687071a71a6f821a779a83b435f80d55b64Brian Paul /* 909a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul * Get pointer to new texture object (newTexObj) 910a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul */ 911fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul if (texName == 0) { 9126a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul newTexObj = defaultTexObj; 913fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 915a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* non-default texture object */ 916ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul newTexObj = _mesa_lookup_texture(ctx, texName); 917a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (newTexObj) { 918a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* error checking */ 9198afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (newTexObj->Target != 0 && newTexObj->Target != target) { 920fb71a484133c53d37e9510b96d14ab04724ead79Brian Paul /* the named texture object's target doesn't match the given target */ 9215a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul _mesa_error( ctx, GL_INVALID_OPERATION, 922ee8dfdf4c9f0bbf4f99a6b78dbddc4871fd80a1cBrian Paul "glBindTexture(target mismatch)" ); 923a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return; 924a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 9256a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul if (newTexObj->Target == 0) { 9266a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul finish_texture_init(ctx, target, newTexObj); 9278afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 929a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul else { 930a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* if this is a new texture id, allocate a texture object now */ 931a3f137094cd965d27e1b088499dd609b81a91906Brian Paul newTexObj = (*ctx->Driver.NewTextureObject)(ctx, texName, target); 932a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (!newTexObj) { 93308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindTexture"); 934a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return; 935a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 936bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul 937bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul /* and insert it into hash table */ 938bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 939bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _mesa_HashInsert(ctx->Shared->TexObjects, texName, newTexObj); 940bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 941a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 9428afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul newTexObj->Target = target; 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 9459e01b915f1243a3f551cb795b7124bd1e52ca15fBrian assert(valid_texture_object(newTexObj)); 9466e6d4c66bd7fd64162ee453b143d7388bb051444Brian Paul 9479e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* flush before changing binding */ 948cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell FLUSH_VERTICES(ctx, _NEW_TEXTURE); 949cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 9509e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* Do the actual binding. The refcount on the previously bound 9519e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * texture object will be decremented. It'll be deleted if the 9529e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * count hits zero. 9539e01b915f1243a3f551cb795b7124bd1e52ca15fBrian */ 9549818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul _mesa_reference_texobj(&texUnit->CurrentTex[targetIndex], newTexObj); 9559818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul ASSERT(texUnit->CurrentTex[targetIndex]); 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Pass BindTexture call to device driver */ 9585e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen if (ctx->Driver.BindTexture) 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (*ctx->Driver.BindTexture)( ctx, target, newTexObj ); 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 962f18fc687071a71a6f821a779a83b435f80d55b64Brian Paul 9636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 9646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Set texture priorities. 9656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 9666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of textures. 9676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texName texture names. 9686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param priorities corresponding texture priorities. 9696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 9706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glPrioritizeTextures(). 9716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 9726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Looks up each texture in the hash, clamps the corresponding priority between 9736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 0.0 and 1.0, and calls dd_function_table::PrioritizeTexture. 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 975c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 976fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PrioritizeTextures( GLsizei n, const GLuint *texName, 977fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLclampf *priorities ) 978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 979fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 981cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 9836d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul if (n < 0) { 98408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glPrioritizeTextures" ); 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 988507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (!priorities) 989507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return; 990507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul 9916d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul for (i = 0; i < n; i++) { 9926d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul if (texName[i] > 0) { 993ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *t = _mesa_lookup_texture(ctx, texName[i]); 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t) { 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Priority = CLAMP( priorities[i], 0.0F, 1.0F ); 99669cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell if (ctx->Driver.PrioritizeTexture) 99769cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell ctx->Driver.PrioritizeTexture( ctx, t, t->Priority ); 998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1001a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell 1002a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell ctx->NewState |= _NEW_TEXTURE; 1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 10056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 10066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * See if textures are loaded in texture memory. 10076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of textures to query. 10096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texName array with the texture names. 10106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param residences array which will hold the residence status. 10116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if all textures are resident and \p residences is left unchanged, 10136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glAreTexturesResident(). 10156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Looks up each texture in the hash and calls 10176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dd_function_table::IsTextureResident. 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1019c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall BennettGLboolean GLAPIENTRY 1020bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul_mesa_AreTexturesResident(GLsizei n, const GLuint *texName, 1021bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul GLboolean *residences) 1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1023fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1024bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul GLboolean allResident = GL_TRUE; 102524e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul GLint i, j; 1026cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1028bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul if (n < 0) { 102908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(n)"); 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1033507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (!texName || !residences) 1034507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return GL_FALSE; 1035507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul 1036bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul for (i = 0; i < n; i++) { 1037afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_object *t; 1038bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul if (texName[i] == 0) { 103924e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident"); 1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1042ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul t = _mesa_lookup_texture(ctx, texName[i]); 104324e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul if (!t) { 104424e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident"); 104524e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul return GL_FALSE; 104624e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul } 104724e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul if (!ctx->Driver.IsTextureResident || 104824e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul ctx->Driver.IsTextureResident(ctx, t)) { 104924e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul /* The texture is resident */ 105024e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul if (!allResident) 105169cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell residences[i] = GL_TRUE; 1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 105424e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul /* The texture is not resident */ 105524e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul if (allResident) { 105624e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul allResident = GL_FALSE; 105724e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul for (j = 0; j < i; j++) 105824e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul residences[j] = GL_TRUE; 105924e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul } 106024e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul residences[i] = GL_FALSE; 1061afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1062afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 106324e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul 1064bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul return allResident; 1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 10676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 10686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * See if a name corresponds to a texture. 10696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texture texture name. 10716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if texture name corresponds to a texture, or GL_FALSE 10736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * otherwise. 10746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glIsTexture(). 10766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Calls _mesa_HashLookup(). 1078afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1079c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall BennettGLboolean GLAPIENTRY 1080fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IsTexture( GLuint texture ) 1081afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 10823ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul struct gl_texture_object *t; 1083fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1084cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 10853ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul 1086b756990b8407d67a15cf7f63683d50dd7f9e3a4eDaniel Borca if (!texture) 10873ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul return GL_FALSE; 10883ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul 1089ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul t = _mesa_lookup_texture(ctx, texture); 10903ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul 10913ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul /* IsTexture is true only after object has been bound once. */ 10923ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul return t && t->Target; 1093afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 10946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 1095a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian 1096a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian/** 1097a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * Simplest implementation of texture locking: Grab the a new mutex in 10985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell * the shared context. Examine the shared context state timestamp and 10995ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell * if there has been a change, set the appropriate bits in 11005ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell * ctx->NewState. 11015ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell * 1102a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * This is used to deal with synchronizing things when a texture object 1103a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * is used/modified by different contexts (or threads) which are sharing 1104a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * the texture. 1105a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * 1106a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * See also _mesa_lock/unlock_texture() in teximage.h 11075ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell */ 1108a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brianvoid 1109a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian_mesa_lock_context_textures( GLcontext *ctx ) 11105ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{ 11115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _glthread_LOCK_MUTEX(ctx->Shared->TexMutex); 11125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 11135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (ctx->Shared->TextureStateStamp != ctx->TextureStateTimestamp) { 11145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 11155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->TextureStateTimestamp = ctx->Shared->TextureStateStamp; 11165ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 11175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell} 11185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 11195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 1120a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brianvoid 1121a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian_mesa_unlock_context_textures( GLcontext *ctx ) 11225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{ 11235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell assert(ctx->Shared->TextureStateStamp == ctx->TextureStateTimestamp); 11245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _glthread_UNLOCK_MUTEX(ctx->Shared->TexMutex); 11255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell} 11265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 11276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 11285ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 11295ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 1130