texobj.c revision 3de8fff45d04fd7e702cd656ba97cafd348c3981
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/** 26442b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * Clear all texture images of the given texture object. 26542b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * 26642b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \param ctx GL context. 26742b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \param t texture object. 26842b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * 26942b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \sa _mesa_clear_texture_image(). 27042b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu */ 27142b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wuvoid 27242b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu_mesa_clear_texture_object(GLcontext *ctx, struct gl_texture_object *texObj) 27342b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu{ 27442b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu GLuint i, j; 27542b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu 27642b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu if (texObj->Target == 0) 27742b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu return; 27842b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu 27942b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu for (i = 0; i < MAX_FACES; i++) { 28042b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu for (j = 0; j < MAX_TEXTURE_LEVELS; j++) { 28142b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu struct gl_texture_image *texImage = texObj->Image[i][j]; 28242b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu if (texImage) 28342b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu _mesa_clear_texture_image(ctx, texImage); 28442b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu } 28542b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu } 28642b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu} 28742b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu 28842b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu 28942b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu/** 2909e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * Check if the given texture object is valid by examining its Target field. 2919e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * For debugging only. 2929e01b915f1243a3f551cb795b7124bd1e52ca15fBrian */ 2939e01b915f1243a3f551cb795b7124bd1e52ca15fBrianstatic GLboolean 2949e01b915f1243a3f551cb795b7124bd1e52ca15fBrianvalid_texture_object(const struct gl_texture_object *tex) 2959e01b915f1243a3f551cb795b7124bd1e52ca15fBrian{ 2969e01b915f1243a3f551cb795b7124bd1e52ca15fBrian switch (tex->Target) { 2979e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case 0: 2989e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_1D: 2999e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_2D: 3009e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_3D: 3019e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_CUBE_MAP_ARB: 3029e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_RECTANGLE_NV: 3039e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_1D_ARRAY_EXT: 3049e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case GL_TEXTURE_2D_ARRAY_EXT: 3059e01b915f1243a3f551cb795b7124bd1e52ca15fBrian return GL_TRUE; 3069e01b915f1243a3f551cb795b7124bd1e52ca15fBrian case 0x99: 3079e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _mesa_problem(NULL, "invalid reference to a deleted texture object"); 3089e01b915f1243a3f551cb795b7124bd1e52ca15fBrian return GL_FALSE; 3099e01b915f1243a3f551cb795b7124bd1e52ca15fBrian default: 31043d8ace88da80848035827c7bb4bbf5530b59a7cBrian Paul _mesa_problem(NULL, "invalid texture object Target 0x%x, Id = %u", 31143d8ace88da80848035827c7bb4bbf5530b59a7cBrian Paul tex->Target, tex->Name); 3129e01b915f1243a3f551cb795b7124bd1e52ca15fBrian return GL_FALSE; 3139e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3149e01b915f1243a3f551cb795b7124bd1e52ca15fBrian} 3159e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3169e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3179e01b915f1243a3f551cb795b7124bd1e52ca15fBrian/** 3189e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * Reference (or unreference) a texture object. 3199e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * If '*ptr', decrement *ptr's refcount (and delete if it becomes zero). 3209e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * If 'tex' is non-null, increment its refcount. 3219e01b915f1243a3f551cb795b7124bd1e52ca15fBrian */ 3229e01b915f1243a3f551cb795b7124bd1e52ca15fBrianvoid 3239e01b915f1243a3f551cb795b7124bd1e52ca15fBrian_mesa_reference_texobj(struct gl_texture_object **ptr, 3249e01b915f1243a3f551cb795b7124bd1e52ca15fBrian struct gl_texture_object *tex) 3259e01b915f1243a3f551cb795b7124bd1e52ca15fBrian{ 3269e01b915f1243a3f551cb795b7124bd1e52ca15fBrian assert(ptr); 3279e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (*ptr == tex) { 3289e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* no change */ 3299e01b915f1243a3f551cb795b7124bd1e52ca15fBrian return; 3309e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3319e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3329e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (*ptr) { 3339e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* Unreference the old texture */ 3349e01b915f1243a3f551cb795b7124bd1e52ca15fBrian GLboolean deleteFlag = GL_FALSE; 3359e01b915f1243a3f551cb795b7124bd1e52ca15fBrian struct gl_texture_object *oldTex = *ptr; 3369e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 337c10002361c3bc175ec12d667e762e51a2cc79b47Brian Paul ASSERT(valid_texture_object(oldTex)); 3389e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3399e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_LOCK_MUTEX(oldTex->Mutex); 3409e01b915f1243a3f551cb795b7124bd1e52ca15fBrian ASSERT(oldTex->RefCount > 0); 3419e01b915f1243a3f551cb795b7124bd1e52ca15fBrian oldTex->RefCount--; 342145d762044f795bf9d68f28079cc5e5d3056920eBrian 3439e01b915f1243a3f551cb795b7124bd1e52ca15fBrian deleteFlag = (oldTex->RefCount == 0); 3449e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_UNLOCK_MUTEX(oldTex->Mutex); 3459e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3469e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (deleteFlag) { 3479e01b915f1243a3f551cb795b7124bd1e52ca15fBrian GET_CURRENT_CONTEXT(ctx); 348dc73217294efcba83c46183ed2f208250217486fBrian if (ctx) 349dc73217294efcba83c46183ed2f208250217486fBrian ctx->Driver.DeleteTexture(ctx, oldTex); 350dc73217294efcba83c46183ed2f208250217486fBrian else 351dc73217294efcba83c46183ed2f208250217486fBrian _mesa_problem(NULL, "Unable to delete texture, no context"); 3529e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3539e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3549e01b915f1243a3f551cb795b7124bd1e52ca15fBrian *ptr = NULL; 3559e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3569e01b915f1243a3f551cb795b7124bd1e52ca15fBrian assert(!*ptr); 3579e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3589e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (tex) { 3599e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* reference new texture */ 360c10002361c3bc175ec12d667e762e51a2cc79b47Brian Paul ASSERT(valid_texture_object(tex)); 3619e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_LOCK_MUTEX(tex->Mutex); 3629e01b915f1243a3f551cb795b7124bd1e52ca15fBrian if (tex->RefCount == 0) { 3639e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* this texture's being deleted (look just above) */ 3649e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* Not sure this can every really happen. Warn if it does. */ 3659e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _mesa_problem(NULL, "referencing deleted texture object"); 3669e01b915f1243a3f551cb795b7124bd1e52ca15fBrian *ptr = NULL; 3679e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3689e01b915f1243a3f551cb795b7124bd1e52ca15fBrian else { 3699e01b915f1243a3f551cb795b7124bd1e52ca15fBrian tex->RefCount++; 3709e01b915f1243a3f551cb795b7124bd1e52ca15fBrian *ptr = tex; 3719e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3729e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _glthread_UNLOCK_MUTEX(tex->Mutex); 3739e01b915f1243a3f551cb795b7124bd1e52ca15fBrian } 3749e01b915f1243a3f551cb795b7124bd1e52ca15fBrian} 3759e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3769e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3779e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 3789e01b915f1243a3f551cb795b7124bd1e52ca15fBrian/** 3796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Report why a texture object is incomplete. 3806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param t texture object. 3826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param why string describing why it's incomplete. 3836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 3846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \note For debug purposes only. 385a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul */ 38621d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#if 0 38721d073d55ad668494fa19977fe06369194eb1ec5Brian Paulstatic void 38821d073d55ad668494fa19977fe06369194eb1ec5Brian Paulincomplete(const struct gl_texture_object *t, const char *why) 38921d073d55ad668494fa19977fe06369194eb1ec5Brian Paul{ 3904e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_printf("Texture Obj %d incomplete because: %s\n", t->Name, why); 39121d073d55ad668494fa19977fe06369194eb1ec5Brian Paul} 39221d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#else 3936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell#define incomplete(t, why) 39421d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#endif 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 398a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul * Examine a texture object to determine if it is complete. 3996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * The gl_texture_object::Complete flag will be set to GL_TRUE or GL_FALSE 4016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * accordingly. 4026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 4046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param t texture object. 4056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 4066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * According to the texture target, verifies that each of the mipmaps is 4076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * present and has the expected size. 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 40935d5301a54153930ee6fd60dff1010ce9f901397Brian Paulvoid 41035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul_mesa_test_texobj_completeness( const GLcontext *ctx, 41135d5301a54153930ee6fd60dff1010ce9f901397Brian Paul struct gl_texture_object *t ) 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 41363ec4238236479a57420c6b43a09d79eff624928Brian Paul const GLint baseLevel = t->BaseLevel; 414cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul GLint maxLog2 = 0, maxLevels = 0; 41563ec4238236479a57420c6b43a09d79eff624928Brian Paul 416227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_TRUE; /* be optimistic */ 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4181126aa86bf9ca223218695eec1f41c6523068961Ian Romanick /* Detect cases where the application set the base level to an invalid 4191126aa86bf9ca223218695eec1f41c6523068961Ian Romanick * value. 4201126aa86bf9ca223218695eec1f41c6523068961Ian Romanick */ 4213de8fff45d04fd7e702cd656ba97cafd348c3981Brian Paul if ((baseLevel < 0) || (baseLevel >= MAX_TEXTURE_LEVELS)) { 4221126aa86bf9ca223218695eec1f41c6523068961Ian Romanick char s[100]; 4235199774dc6a2a65d24ac26fe15715654f2568a02Brian Paul _mesa_sprintf(s, "base level = %d is invalid", baseLevel); 4241126aa86bf9ca223218695eec1f41c6523068961Ian Romanick incomplete(t, s); 4251126aa86bf9ca223218695eec1f41c6523068961Ian Romanick t->_Complete = GL_FALSE; 4261126aa86bf9ca223218695eec1f41c6523068961Ian Romanick return; 4271126aa86bf9ca223218695eec1f41c6523068961Ian Romanick } 4281126aa86bf9ca223218695eec1f41c6523068961Ian Romanick 429a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* Always need the base level image */ 43018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[0][baseLevel]) { 4317e86eb991b50e0f52e6a0404289ca73126da6414Brian Paul char s[100]; 4325199774dc6a2a65d24ac26fe15715654f2568a02Brian Paul _mesa_sprintf(s, "Image[baseLevel=%d] == NULL", baseLevel); 4337e86eb991b50e0f52e6a0404289ca73126da6414Brian Paul incomplete(t, s); 434227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 438973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul /* Check width/height/depth for zero */ 43918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][baseLevel]->Width == 0 || 44018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->Height == 0 || 44118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->Depth == 0) { 442973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul incomplete(t, "texture width = 0"); 443227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 444973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul return; 445973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul } 446973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul 447083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul /* Compute _MaxLevel */ 448bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick if ((t->Target == GL_TEXTURE_1D) || 449bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick (t->Target == GL_TEXTURE_1D_ARRAY_EXT)) { 45018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell maxLog2 = t->Image[0][baseLevel]->WidthLog2; 451cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul maxLevels = ctx->Const.MaxTextureLevels; 452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 453bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick else if ((t->Target == GL_TEXTURE_2D) || 454bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick (t->Target == GL_TEXTURE_2D_ARRAY_EXT)) { 45518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell maxLog2 = MAX2(t->Image[0][baseLevel]->WidthLog2, 45618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->HeightLog2); 4578afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLevels = ctx->Const.MaxTextureLevels; 458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 4598afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_3D) { 46018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLint max = MAX2(t->Image[0][baseLevel]->WidthLog2, 46118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->HeightLog2); 46218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell maxLog2 = MAX2(max, (GLint)(t->Image[0][baseLevel]->DepthLog2)); 463cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul maxLevels = ctx->Const.Max3DTextureLevels; 464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 4658afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) { 46618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell maxLog2 = MAX2(t->Image[0][baseLevel]->WidthLog2, 46718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[0][baseLevel]->HeightLog2); 4688afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLevels = ctx->Const.MaxCubeTextureLevels; 4698afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 4708afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_RECTANGLE_NV) { 4718afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLog2 = 0; /* not applicable */ 4728afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLevels = 1; /* no mipmapping */ 4738afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 474cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul else { 4758afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul _mesa_problem(ctx, "Bad t->Target in _mesa_test_texobj_completeness"); 476cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul return; 477cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul } 478cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul 479cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul ASSERT(maxLevels > 0); 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 481083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->_MaxLevel = baseLevel + maxLog2; 482083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->_MaxLevel = MIN2(t->_MaxLevel, t->MaxLevel); 483cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul t->_MaxLevel = MIN2(t->_MaxLevel, maxLevels - 1); 484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 485083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul /* Compute _MaxLambda = q - b (see the 1.2 spec) used during mipmapping */ 486083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->_MaxLambda = (GLfloat) (t->_MaxLevel - t->BaseLevel); 487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4888afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) { 489a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* make sure that all six cube map level 0 images are the same size */ 49018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell const GLuint w = t->Image[0][baseLevel]->Width2; 49118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell const GLuint h = t->Image[0][baseLevel]->Height2; 49218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint face; 49318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell for (face = 1; face < 6; face++) { 49418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[face][baseLevel] == NULL || 49518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[face][baseLevel]->Width2 != w || 49618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[face][baseLevel]->Height2 != h) { 497227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 49818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "Non-quare cubemap image"); 49918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; 50018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 501ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 502ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 503ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul 504887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul /* extra checking for mipmaps */ 505ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (t->MinFilter != GL_NEAREST && t->MinFilter != GL_LINEAR) { 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mipmapping: determine if we have a complete set of mipmaps 508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 51063ec4238236479a57420c6b43a09d79eff624928Brian Paul GLint minLevel = baseLevel; 511083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul GLint maxLevel = t->_MaxLevel; 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (minLevel > maxLevel) { 514227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 51521d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "minLevel > maxLevel"); 516afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 517afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test dimension-independent attributes */ 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i = minLevel; i <= maxLevel; i++) { 52118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]) { 52218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->TexFormat != t->Image[0][baseLevel]->TexFormat) { 523227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 52421d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "Format[i] != Format[baseLevel]"); 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 52718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Border != t->Image[0][baseLevel]->Border) { 528227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 52921d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "Border[i] != Border[baseLevel]"); 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test things which depend on number of texture image dimensions */ 536bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick if ((t->Target == GL_TEXTURE_1D) || 537bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick (t->Target == GL_TEXTURE_1D_ARRAY_EXT)) { 538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test 1-D mipmaps */ 53918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint width = t->Image[0][baseLevel]->Width2; 540cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 541ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width /= 2; 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i >= minLevel && i <= maxLevel) { 54518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[0][i]) { 546227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 54718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "1D Image[0][i] == NULL"); 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 55018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Width2 != width ) { 551227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 55218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "1D Image[0][i] bad width"); 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 556ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width == 1) { 557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; /* found smallest needed mipmap, all done! */ 558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 561bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick else if ((t->Target == GL_TEXTURE_2D) || 562bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick (t->Target == GL_TEXTURE_2D_ARRAY_EXT)) { 563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test 2-D mipmaps */ 56418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint width = t->Image[0][baseLevel]->Width2; 56518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint height = t->Image[0][baseLevel]->Height2; 566cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 567ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width /= 2; 569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 570ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (height > 1) { 571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg height /= 2; 572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i >= minLevel && i <= maxLevel) { 57418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[0][i]) { 575227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 57618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "2D Image[0][i] == NULL"); 577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 57918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Width2 != width) { 580227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 58118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "2D Image[0][i] bad width"); 582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 58418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Height2 != height) { 585227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 58618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "2D Image[0][i] bad height"); 587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (width==1 && height==1) { 590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; /* found smallest needed mipmap, all done! */ 591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 5958afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_3D) { 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test 3-D mipmaps */ 59718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint width = t->Image[0][baseLevel]->Width2; 59818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint height = t->Image[0][baseLevel]->Height2; 59918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint depth = t->Image[0][baseLevel]->Depth2; 600cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 601ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width /= 2; 603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 604ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (height > 1) { 605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg height /= 2; 606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 607ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (depth > 1) { 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg depth /= 2; 609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i >= minLevel && i <= maxLevel) { 61118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[0][i]) { 61218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "3D Image[0][i] == NULL"); 613227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 616a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul if (t->Image[0][i]->_BaseFormat == GL_DEPTH_COMPONENT) { 617227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 6184182cf60d96a077a66675e89694529b5f9e4b329Brian Paul incomplete(t, "GL_DEPTH_COMPONENT only works with 1/2D tex"); 6194182cf60d96a077a66675e89694529b5f9e4b329Brian Paul return; 6204182cf60d96a077a66675e89694529b5f9e4b329Brian Paul } 62118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Width2 != width) { 622227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 62318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "3D Image[0][i] bad width"); 624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 62618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Height2 != height) { 627227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 62818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "3D Image[0][i] bad height"); 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 63118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[0][i]->Depth2 != depth) { 632227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 63318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "3D Image[0][i] bad depth"); 634afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 637ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width == 1 && height == 1 && depth == 1) { 638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; /* found smallest needed mipmap, all done! */ 639afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 640afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 641afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 6428afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) { 643ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul /* make sure 6 cube faces are consistant */ 64418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint width = t->Image[0][baseLevel]->Width2; 64518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint height = t->Image[0][baseLevel]->Height2; 646cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 647ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 648ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul width /= 2; 649ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 650ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (height > 1) { 651ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul height /= 2; 652ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 653ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (i >= minLevel && i <= maxLevel) { 65418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint face; 65518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell for (face = 0; face < 6; face++) { 65618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell /* check that we have images defined */ 65718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (!t->Image[face][i]) { 658227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 65918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "CubeMap Image[n][i] == NULL"); 66018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; 66118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 66218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell /* Don't support GL_DEPTH_COMPONENT for cube maps */ 663a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul if (t->Image[face][i]->_BaseFormat == GL_DEPTH_COMPONENT) { 664227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 66518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "GL_DEPTH_COMPONENT only works with 1/2D tex"); 66618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; 66718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 66818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell /* check that all six images have same size */ 66918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (t->Image[face][i]->Width2!=width || 67018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell t->Image[face][i]->Height2!=height) { 671227315278dea9095cee6e508d03b28720b2e7880Brian t->_Complete = GL_FALSE; 67218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell incomplete(t, "CubeMap Image[n][i] bad size"); 67318fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; 67418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 67518fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 67618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 67718fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (width == 1 && height == 1) { 67818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell return; /* found smallest needed mipmap, all done! */ 679ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 680ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 681413d6a21f849a689b5c83ea04395856b44fc65a8Brian Paul } 6828afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_RECTANGLE_NV) { 6838afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul /* XXX special checking? */ 6848afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 6868afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul /* Target = ??? */ 68708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bug in gl_test_texture_object_completeness\n"); 688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 6923f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 6933f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul/** 69442b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * Mark a texture object dirty. It forces the object to be incomplete 69542b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * and optionally forces the context to re-validate its state. 69642b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * 69742b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \param ctx GL context. 69842b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \param texObj texture object. 69942b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \param invalidate_state also invalidate context state. 70042b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu */ 70142b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wuvoid 70242b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu_mesa_dirty_texobj(GLcontext *ctx, struct gl_texture_object *texObj, 70342b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu GLboolean invalidate_state) 70442b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu{ 70542b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu texObj->_Complete = GL_FALSE; 70642b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu if (invalidate_state) 70742b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu ctx->NewState |= _NEW_TEXTURE; 70842b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu} 70942b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu 71042b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu 71142b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu/** 7123f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul * Return pointer to a default/fallback texture. 7133f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul * The texture is a 2D 8x8 RGBA texture with all texels = (0,0,0,1). 7143f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul * That's the value a sampler should get when sampling from an 7153f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul * incomplete texture. 7163f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul */ 7173f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paulstruct gl_texture_object * 7183f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul_mesa_get_fallback_texture(GLcontext *ctx) 7193f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul{ 7203f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul if (!ctx->Shared->FallbackTex) { 7213f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul /* create fallback texture now */ 7223f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul static GLubyte texels[8 * 8][4]; 7233f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul struct gl_texture_object *texObj; 7243f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul struct gl_texture_image *texImage; 7253f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul GLuint i; 7263f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 7273f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul for (i = 0; i < 8 * 8; i++) { 7283f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul texels[i][0] = 7293f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul texels[i][1] = 7303f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul texels[i][2] = 0x0; 7313f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul texels[i][3] = 0xff; 7323f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul } 7333f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 7343f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul /* create texture object */ 7353f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul texObj = ctx->Driver.NewTextureObject(ctx, 0, GL_TEXTURE_2D); 7363f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul assert(texObj->RefCount == 1); 7373f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul texObj->MinFilter = GL_NEAREST; 7383f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul texObj->MagFilter = GL_NEAREST; 7393f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 7403f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul /* create level[0] texture image */ 7413f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul texImage = _mesa_get_tex_image(ctx, texObj, GL_TEXTURE_2D, 0); 7423f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 7433f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul /* init the image fields */ 7443f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul _mesa_init_teximage_fields(ctx, GL_TEXTURE_2D, texImage, 7453f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 8, 8, 1, 0, GL_RGBA); 7463f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 7473f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul /* set image data */ 7483f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul ctx->Driver.TexImage2D(ctx, GL_TEXTURE_2D, 0, GL_RGBA, 7493f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 8, 8, 0, 7503f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul GL_RGBA, GL_UNSIGNED_BYTE, texels, 7513f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul &ctx->DefaultPacking, texObj, texImage); 7523f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 7533f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul _mesa_test_texobj_completeness(ctx, texObj); 7543f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul assert(texObj->_Complete); 7553f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 7563f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul ctx->Shared->FallbackTex = texObj; 7573f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul } 7583f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul return ctx->Shared->FallbackTex; 7593f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul} 7603f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 7613f25219c7bf0f090502489928f0f018e62c4f6cfBrian Paul 7626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 764832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 7656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/***********************************************************************/ 7666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** \name API functions */ 7676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/ 768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 7696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 7706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 7716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Generate texture names. 7726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of texture names to be generated. 774a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * \param textures an array in which will hold the generated texture names. 7756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glGenTextures(). 7776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7789e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian * Calls _mesa_HashFindFreeKeyBlock() to find a block of free texture 7799e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian * IDs which are stored in \p textures. Corresponding empty texture 7809e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian * objects are also generated. 7816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 782c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 783a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul_mesa_GenTextures( GLsizei n, GLuint *textures ) 784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 785fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint first; 787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 788cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 790507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (n < 0) { 79108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glGenTextures" ); 792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 795a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul if (!textures) 796507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return; 797832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 798832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul /* 799832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul * This must be atomic (generation and allocation of texture IDs) 800832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul */ 8019e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 802832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 803bb79790662f56eb71aafd3f020cd86ad810f56b2Brian Paul first = _mesa_HashFindFreeKeyBlock(ctx->Shared->TexObjects, n); 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Allocate new, empty texture objects */ 806a3f137094cd965d27e1b088499dd609b81a91906Brian Paul for (i = 0; i < n; i++) { 807a3f137094cd965d27e1b088499dd609b81a91906Brian Paul struct gl_texture_object *texObj; 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint name = first + i; 8098afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul GLenum target = 0; 810a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texObj = (*ctx->Driver.NewTextureObject)( ctx, name, target); 811a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texObj) { 8129e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 813a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenTextures"); 814a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return; 815a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 816bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul 817bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul /* insert into hash table */ 818bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _mesa_HashInsert(ctx->Shared->TexObjects, texObj->Name, texObj); 819bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul 820a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul textures[i] = name; 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 822832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 8239e3e3883fa42ffee82e8e8ecbf75c153a2215acbBrian _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 826a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul 8276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 828519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * Check if the given texture object is bound to the current draw or 829519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * read framebuffer. If so, Unbind it. 830519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul */ 831519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulstatic void 832519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulunbind_texobj_from_fbo(GLcontext *ctx, struct gl_texture_object *texObj) 833519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{ 834519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul const GLuint n = (ctx->DrawBuffer == ctx->ReadBuffer) ? 1 : 2; 835519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul GLuint i; 836519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 837519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul for (i = 0; i < n; i++) { 838519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul struct gl_framebuffer *fb = (i == 0) ? ctx->DrawBuffer : ctx->ReadBuffer; 839519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul if (fb->Name) { 840519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul GLuint j; 841519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul for (j = 0; j < BUFFER_COUNT; j++) { 842519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul if (fb->Attachment[j].Type == GL_TEXTURE && 843519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul fb->Attachment[j].Texture == texObj) { 844519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul _mesa_remove_attachment(ctx, fb->Attachment + j); 845519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 846519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 847519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 848519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 849519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul} 850519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 851519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 852519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul/** 853519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * Check if the given texture object is bound to any texture image units and 8549e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * unbind it if so (revert to default textures). 855519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul */ 856519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulstatic void 857519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulunbind_texobj_from_texunits(GLcontext *ctx, struct gl_texture_object *texObj) 858519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{ 8599818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul GLuint u, tex; 860519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 861519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul for (u = 0; u < MAX_TEXTURE_IMAGE_UNITS; u++) { 862519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul struct gl_texture_unit *unit = &ctx->Texture.Unit[u]; 8639818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul for (tex = 0; tex < NUM_TEXTURE_TARGETS; tex++) { 8649818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul if (texObj == unit->CurrentTex[tex]) { 8659818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul _mesa_reference_texobj(&unit->CurrentTex[tex], 866e1bddd159f364fa04ddec22f568fbfeb775d3b47Brian Paul ctx->Shared->DefaultTex[tex]); 8679818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul ASSERT(unit->CurrentTex[tex]); 8689818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul break; 8699818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul } 870519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 871519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 872519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul} 873519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 874519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 875519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul/** 8766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Delete named textures. 8776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of textures to be deleted. 879a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * \param textures array of texture IDs to be deleted. 8806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glDeleteTextures(). 8826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 883a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * If we're about to delete a texture that's currently bound to any 884a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * texture unit, unbind the texture first. Decrement the reference 885a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * count on the texture object and delete it if it's zero. 886a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * Recall that texture objects can be shared among several rendering 887a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul * contexts. 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 889c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 890a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul_mesa_DeleteTextures( GLsizei n, const GLuint *textures) 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 892fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 894cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex */ 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 896a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul if (!textures) 897507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return; 898507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul 899a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul for (i = 0; i < n; i++) { 900a212e9670ba31b062c48ed9dd23f28f08fa15b5eBrian Paul if (textures[i] > 0) { 901ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *delObj 902ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul = _mesa_lookup_texture(ctx, textures[i]); 9035ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 904a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (delObj) { 9055ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, delObj); 906519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 907519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul /* Check if texture is bound to any framebuffer objects. 908519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * If so, unbind. 909519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * See section 4.4.2.3 of GL_EXT_framebuffer_object. 910519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul */ 911519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul unbind_texobj_from_fbo(ctx, delObj); 912519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 913519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul /* Check if this texture is currently bound to any texture units. 9149e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * If so, unbind it. 91559d6da5365c876ba18a66cd51ed52b0e1d96704eBrian Paul */ 916519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul unbind_texobj_from_texunits(ctx, delObj); 917519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 9189e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _mesa_unlock_texture(ctx, delObj); 9199e01b915f1243a3f551cb795b7124bd1e52ca15fBrian 920a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul ctx->NewState |= _NEW_TEXTURE; 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 922bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul /* The texture _name_ is now free for re-use. 923bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul * Remove it from the hash table now. 924bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul */ 925bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 926bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _mesa_HashRemove(ctx->Shared->TexObjects, delObj->Name); 927bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 928bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul 929145d762044f795bf9d68f28079cc5e5d3056920eBrian /* Unreference the texobj. If refcount hits zero, the texture 9309e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * will be deleted. 93142fee73aadd7f37a4f18e57c167e98b7a6294508Brian Paul */ 9329e01b915f1243a3f551cb795b7124bd1e52ca15fBrian _mesa_reference_texobj(&delObj, NULL); 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 938f18fc687071a71a6f821a779a83b435f80d55b64Brian Paul 9396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 9409818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul * Convert a GL texture target enum such as GL_TEXTURE_2D or GL_TEXTURE_3D 9419818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul * into the corresponding Mesa texture target index. 9429818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul * Return -1 if target is invalid. 9439818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul */ 9449818734e0148510967ca9ee0d1aa8b196b509f02Brian Paulstatic GLint 9459818734e0148510967ca9ee0d1aa8b196b509f02Brian Paultarget_enum_to_index(GLenum target) 9469818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul{ 9479818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul switch (target) { 9489818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_1D: 9499818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_1D_INDEX; 9509818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_2D: 9519818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_2D_INDEX; 9529818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_3D: 9539818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_3D_INDEX; 9549818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 9559818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_CUBE_INDEX; 9569818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_RECTANGLE_NV: 9579818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_RECT_INDEX; 9589818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 9599818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_1D_ARRAY_INDEX; 9609818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul case GL_TEXTURE_2D_ARRAY_EXT: 9619818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return TEXTURE_2D_ARRAY_INDEX; 9629818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul default: 9639818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return -1; 9649818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul } 9659818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul} 9669818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul 9679818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul 9689818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul/** 9696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Bind a named texture to a texturing target. 9706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 9716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 9726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texName texture name. 9736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 9746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glBindTexture(). 9756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 9766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Determines the old texture object bound and returns immediately if rebinding 9776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * the same texture. Get the current texture which is either a default texture 9786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * if name is null, a named texture from the hash, or a new texture if the 9796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * given texture name is new. Increments its reference count, binds it, and 9806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * calls dd_function_table::BindTexture. Decrements the old texture reference 9816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * count and deletes it if it reaches zero. 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 983c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 984fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_BindTexture( GLenum target, GLuint texName ) 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 986fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 987be906fe05e1fd6c488ff84b24379d7272a5ac5afBrian Paul const GLuint unit = ctx->Texture.CurrentUnit; 988afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 9896a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul struct gl_texture_object *newTexObj = NULL, *defaultTexObj = NULL; 9909818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul GLint targetIndex; 9917f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick GLboolean early_out = GL_FALSE; 992cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 9954753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glBindTexture %s %d\n", 996d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul _mesa_lookup_enum_by_nr(target), (GLint) texName); 997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 9989818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul targetIndex = target_enum_to_index(target); 9999818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul if (targetIndex < 0) { 10006a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glBindTexture(target)"); 10016a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul return; 10026a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul } 10039818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul assert(targetIndex < NUM_TEXTURE_TARGETS); 10049818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul defaultTexObj = ctx->Shared->DefaultTex[targetIndex]; 10056a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul 1006f18fc687071a71a6f821a779a83b435f80d55b64Brian Paul /* 1007a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul * Get pointer to new texture object (newTexObj) 1008a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul */ 1009fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul if (texName == 0) { 10106a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul newTexObj = defaultTexObj; 1011fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1013a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* non-default texture object */ 1014ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul newTexObj = _mesa_lookup_texture(ctx, texName); 1015a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (newTexObj) { 1016a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* error checking */ 10178afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (newTexObj->Target != 0 && newTexObj->Target != target) { 1018fb71a484133c53d37e9510b96d14ab04724ead79Brian Paul /* the named texture object's target doesn't match the given target */ 10195a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul _mesa_error( ctx, GL_INVALID_OPERATION, 1020ee8dfdf4c9f0bbf4f99a6b78dbddc4871fd80a1cBrian Paul "glBindTexture(target mismatch)" ); 1021a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return; 1022a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 10236a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul if (newTexObj->Target == 0) { 10246a00625fbb7e42a71daa87f982eee8e9077a0679Brian Paul finish_texture_init(ctx, target, newTexObj); 10258afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1027a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul else { 1028a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* if this is a new texture id, allocate a texture object now */ 1029a3f137094cd965d27e1b088499dd609b81a91906Brian Paul newTexObj = (*ctx->Driver.NewTextureObject)(ctx, texName, target); 1030a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (!newTexObj) { 103108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindTexture"); 1032a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return; 1033a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 1034bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul 1035bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul /* and insert it into hash table */ 1036bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 1037bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _mesa_HashInsert(ctx->Shared->TexObjects, texName, newTexObj); 1038bb7d5f8837a9c7658a18dbaf02d52583e29443e3Brian Paul _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 1039a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 10408afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul newTexObj->Target = target; 1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 10439e01b915f1243a3f551cb795b7124bd1e52ca15fBrian assert(valid_texture_object(newTexObj)); 10446e6d4c66bd7fd64162ee453b143d7388bb051444Brian Paul 10457f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick _glthread_LOCK_MUTEX(ctx->Shared->Mutex); 10467f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick if ((ctx->Shared->RefCount == 1) 10477f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick && (newTexObj == texUnit->CurrentTex[targetIndex])) { 10487f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick early_out = GL_TRUE; 10497f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick } 10507f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); 10517f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick 10527f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick if (early_out) { 10537f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick return; 10547f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick } 10557f8000db8bd45bb95bda4a4f8535c49b8ef74254Ian Romanick 10569e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* flush before changing binding */ 1057cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell FLUSH_VERTICES(ctx, _NEW_TEXTURE); 1058cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 10599e01b915f1243a3f551cb795b7124bd1e52ca15fBrian /* Do the actual binding. The refcount on the previously bound 10609e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * texture object will be decremented. It'll be deleted if the 10619e01b915f1243a3f551cb795b7124bd1e52ca15fBrian * count hits zero. 10629e01b915f1243a3f551cb795b7124bd1e52ca15fBrian */ 10639818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul _mesa_reference_texobj(&texUnit->CurrentTex[targetIndex], newTexObj); 10649818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul ASSERT(texUnit->CurrentTex[targetIndex]); 1065afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Pass BindTexture call to device driver */ 10675e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen if (ctx->Driver.BindTexture) 1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (*ctx->Driver.BindTexture)( ctx, target, newTexObj ); 1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1070afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1071f18fc687071a71a6f821a779a83b435f80d55b64Brian Paul 10726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 10736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Set texture priorities. 10746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of textures. 10766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texName texture names. 10776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param priorities corresponding texture priorities. 10786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glPrioritizeTextures(). 10806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Looks up each texture in the hash, clamps the corresponding priority between 10826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 0.0 and 1.0, and calls dd_function_table::PrioritizeTexture. 1083afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1084c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 1085fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PrioritizeTextures( GLsizei n, const GLuint *texName, 1086fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLclampf *priorities ) 1087afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1088fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1089afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 1090cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1091afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 10926d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul if (n < 0) { 109308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glPrioritizeTextures" ); 1094afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1095afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1097507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (!priorities) 1098507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return; 1099507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul 11006d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul for (i = 0; i < n; i++) { 11016d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul if (texName[i] > 0) { 1102ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *t = _mesa_lookup_texture(ctx, texName[i]); 1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t) { 1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Priority = CLAMP( priorities[i], 0.0F, 1.0F ); 110569cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell if (ctx->Driver.PrioritizeTexture) 110669cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell ctx->Driver.PrioritizeTexture( ctx, t, t->Priority ); 1107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1110a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell 1111a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell ctx->NewState |= _NEW_TEXTURE; 1112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 11146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 11156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * See if textures are loaded in texture memory. 11166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param n number of textures to query. 11186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texName array with the texture names. 11196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param residences array which will hold the residence status. 11206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if all textures are resident and \p residences is left unchanged, 11226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glAreTexturesResident(). 11246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Looks up each texture in the hash and calls 11266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * dd_function_table::IsTextureResident. 1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1128c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall BennettGLboolean GLAPIENTRY 1129bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul_mesa_AreTexturesResident(GLsizei n, const GLuint *texName, 1130bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul GLboolean *residences) 1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1132fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1133bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul GLboolean allResident = GL_TRUE; 113424e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul GLint i, j; 1135cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1137bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul if (n < 0) { 113808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(n)"); 1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1142507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (!texName || !residences) 1143507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return GL_FALSE; 1144507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul 1145bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul for (i = 0; i < n; i++) { 1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_object *t; 1147bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul if (texName[i] == 0) { 114824e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident"); 1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1151ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul t = _mesa_lookup_texture(ctx, texName[i]); 115224e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul if (!t) { 115324e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident"); 115424e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul return GL_FALSE; 115524e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul } 115624e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul if (!ctx->Driver.IsTextureResident || 115724e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul ctx->Driver.IsTextureResident(ctx, t)) { 115824e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul /* The texture is resident */ 115924e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul if (!allResident) 116069cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell residences[i] = GL_TRUE; 1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 116324e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul /* The texture is not resident */ 116424e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul if (allResident) { 116524e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul allResident = GL_FALSE; 116624e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul for (j = 0; j < i; j++) 116724e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul residences[j] = GL_TRUE; 116824e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul } 116924e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul residences[i] = GL_FALSE; 1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 117224e81fda4d3c55003294a818de7c0faf7ae1552dBrian Paul 1173bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul return allResident; 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 11766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 11776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * See if a name corresponds to a texture. 11786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texture texture name. 11806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if texture name corresponds to a texture, or GL_FALSE 11826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * otherwise. 11836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa glIsTexture(). 11856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Calls _mesa_HashLookup(). 1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1188c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall BennettGLboolean GLAPIENTRY 1189fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IsTexture( GLuint texture ) 1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 11913ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul struct gl_texture_object *t; 1192fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1193cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 11943ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul 1195b756990b8407d67a15cf7f63683d50dd7f9e3a4eDaniel Borca if (!texture) 11963ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul return GL_FALSE; 11973ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul 1198ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul t = _mesa_lookup_texture(ctx, texture); 11993ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul 12003ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul /* IsTexture is true only after object has been bound once. */ 12013ec0631e955cb79cf6009e391cd9b4f6a263b989Brian Paul return t && t->Target; 1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 12036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 1204a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian 1205a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian/** 12063105fd760b8a6fc34438d51d36b65670810626a2Brian Paul * Simplest implementation of texture locking: grab the shared tex 12073105fd760b8a6fc34438d51d36b65670810626a2Brian Paul * mutex. Examine the shared context state timestamp and if there has 12083105fd760b8a6fc34438d51d36b65670810626a2Brian Paul * been a change, set the appropriate bits in ctx->NewState. 12095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell * 1210a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * This is used to deal with synchronizing things when a texture object 1211a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * is used/modified by different contexts (or threads) which are sharing 1212a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * the texture. 1213a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * 1214a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian * See also _mesa_lock/unlock_texture() in teximage.h 12155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell */ 1216a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brianvoid 1217a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian_mesa_lock_context_textures( GLcontext *ctx ) 12185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{ 12195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _glthread_LOCK_MUTEX(ctx->Shared->TexMutex); 12205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 12215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (ctx->Shared->TextureStateStamp != ctx->TextureStateTimestamp) { 12225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 12235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->TextureStateTimestamp = ctx->Shared->TextureStateStamp; 12245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 12255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell} 12265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 12275ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 1228a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brianvoid 1229a01ee8ff0bdc9b80907f2fe48ebf1618ce2ded92Brian_mesa_unlock_context_textures( GLcontext *ctx ) 12305ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{ 12315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell assert(ctx->Shared->TextureStateStamp == ctx->TextureStateTimestamp); 12325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _glthread_UNLOCK_MUTEX(ctx->Shared->TexMutex); 12335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell} 12345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 12356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 12365ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 12375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 1238