texobj.c revision 85d816028a2472e0378afda65e7ab6f7ff4d76b4
185d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul/* $Id: texobj.c,v 1.56 2002/06/17 23:36:31 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 54182cf60d96a077a66675e89694529b5f9e4b329Brian Paul * Version: 4.1 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 74182cf60d96a077a66675e89694529b5f9e4b329Brian Paul * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. 85e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"), 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions: 155e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 185e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef PC_HEADER 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "all.h" 30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 31fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h" 324bdcfe50f8886e43714f9b7edd25cbff19e6a97dBrian Paul#include "colortab.h" 33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enums.h" 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "hash.h" 36ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h" 37fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h" 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "teximage.h" 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "texstate.h" 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "texobj.h" 415e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Allocate a new texture object and add it to the linked list of texture 48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * objects. If name>0 then also insert the new texture object into the hash 49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * table. 50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: shared - the shared GL state structure to contain the texture object 51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * name - integer name for the texture object 528afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul * target - either GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, 538afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul * GL_TEXTURE_CUBE_MAP_ARB or GL_TEXTURE_RECTANGLE_NV 54a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul * zero is ok for the sake of GenTextures() 55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: pointer to new texture object 56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstruct gl_texture_object * 5822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes_mesa_alloc_texture_object( struct gl_shared_state *shared, 598afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul GLuint name, GLenum target ) 60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_object *obj; 62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 638afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul ASSERT(target == 0 || 648afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_1D || 658afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_2D || 668afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_3D || 678afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_CUBE_MAP_ARB || 688afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_RECTANGLE_NV); 69420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul 70420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul obj = CALLOC_STRUCT(gl_texture_object); 71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (obj) { 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* init the non-zero fields */ 74e4b684ce49188f906ff032e2df7675257143ec21Brian Paul _glthread_INIT_MUTEX(obj->Mutex); 756e6d4c66bd7fd64162ee453b143d7388bb051444Brian Paul obj->RefCount = 1; 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg obj->Name = name; 778afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul obj->Target = target; 786d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul obj->Priority = 1.0F; 798afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (target == GL_TEXTURE_RECTANGLE_NV) { 808afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul obj->WrapS = GL_CLAMP_TO_EDGE; 818afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul obj->WrapT = GL_CLAMP_TO_EDGE; 828afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul obj->WrapR = GL_CLAMP_TO_EDGE; 838afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul obj->MinFilter = GL_LINEAR; 848afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 858afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else { 868afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul obj->WrapS = GL_REPEAT; 878afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul obj->WrapT = GL_REPEAT; 888afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul obj->WrapR = GL_REPEAT; 898afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul obj->MinFilter = GL_NEAREST_MIPMAP_LINEAR; 908afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg obj->MagFilter = GL_LINEAR; 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg obj->MinLod = -1000.0; 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg obj->MaxLod = 1000.0; 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg obj->BaseLevel = 0; 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg obj->MaxLevel = 1000; 962c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes obj->MaxAnisotropy = 1.0; 97014ec1ac5e98e86836285a176d7674bc43a00cd7Brian Paul obj->CompareFlag = GL_FALSE; /* SGIX_shadow */ 98014ec1ac5e98e86836285a176d7674bc43a00cd7Brian Paul obj->CompareOperator = GL_TEXTURE_LEQUAL_R_SGIX; /* SGIX_shadow */ 99014ec1ac5e98e86836285a176d7674bc43a00cd7Brian Paul obj->CompareMode = GL_LUMINANCE; /* ARB_shadow */ 100014ec1ac5e98e86836285a176d7674bc43a00cd7Brian Paul obj->CompareFunc = GL_LEQUAL; /* ARB_shadow */ 1014182cf60d96a077a66675e89694529b5f9e4b329Brian Paul obj->DepthMode = GL_LUMINANCE; /* ARB_depth_texture */ 102014ec1ac5e98e86836285a176d7674bc43a00cd7Brian Paul obj->ShadowAmbient = 0; /* ARB/SGIX_shadow_ambient */ 1034bdcfe50f8886e43714f9b7edd25cbff19e6a97dBrian Paul _mesa_init_colortable(&obj->Palette); 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* insert into linked list */ 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (shared) { 1079560f05deffaf0321bba1bd0fcc8eeef4199e6e0Brian Paul _glthread_LOCK_MUTEX(shared->Mutex); 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg obj->Next = shared->TexObjectList; 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg shared->TexObjectList = obj; 1109560f05deffaf0321bba1bd0fcc8eeef4199e6e0Brian Paul _glthread_UNLOCK_MUTEX(shared->Mutex); 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (name > 0) { 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* insert into hash table */ 115bb79790662f56eb71aafd3f020cd86ad810f56b2Brian Paul _mesa_HashInsert(shared->TexObjects, name, obj); 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return obj; 119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Deallocate a texture object struct and remove it from the given 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * shared GL state. 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: shared - the shared GL state to which the object belongs 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * t - the texture object to delete 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 128a852378a6289d154364dde440f89a39bbfc33e2dBrian Paulvoid _mesa_free_texture_object( struct gl_shared_state *shared, 129a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul struct gl_texture_object *t ) 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_object *tprev, *tcurr; 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg assert(t); 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* unlink t from the linked list */ 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (shared) { 1379560f05deffaf0321bba1bd0fcc8eeef4199e6e0Brian Paul _glthread_LOCK_MUTEX(shared->Mutex); 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tprev = NULL; 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcurr = shared->TexObjectList; 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg while (tcurr) { 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (tcurr==t) { 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (tprev) { 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tprev->Next = t->Next; 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg shared->TexObjectList = t->Next; 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tprev = tcurr; 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcurr = tcurr->Next; 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1539560f05deffaf0321bba1bd0fcc8eeef4199e6e0Brian Paul _glthread_UNLOCK_MUTEX(shared->Mutex); 154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t->Name) { 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* remove from hash table */ 158bb79790662f56eb71aafd3f020cd86ad810f56b2Brian Paul _mesa_HashRemove(shared->TexObjects, t->Name); 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1614bdcfe50f8886e43714f9b7edd25cbff19e6a97dBrian Paul _mesa_free_colortable_data(&t->Palette); 1624bdcfe50f8886e43714f9b7edd25cbff19e6a97dBrian Paul 163a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* free the texture images */ 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg { 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint i; 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<MAX_TEXTURE_LEVELS;i++) { 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t->Image[i]) { 168021a525616bef2bafc8f60edc193b975ed2b0efaBrian Paul _mesa_free_texture_image( t->Image[i] ); 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 172a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* free this object */ 174bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( t ); 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 177a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul 178a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul/* 17985d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul * Copy texture object state from one texture object to another. 18085d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul */ 18185d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paulvoid 18285d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul_mesa_copy_texture_object( struct gl_texture_object *dest, 18385d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul const struct gl_texture_object *src ) 18485d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul{ 18585d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->Name = src->Name; 18685d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->Priority = src->Priority; 18785d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BorderColor[0] = src->BorderColor[0]; 18885d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BorderColor[1] = src->BorderColor[1]; 18985d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BorderColor[2] = src->BorderColor[2]; 19085d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BorderColor[3] = src->BorderColor[3]; 19185d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->WrapS = src->WrapS; 19285d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->WrapT = src->WrapT; 19385d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->WrapR = src->WrapR; 19485d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MinFilter = src->MinFilter; 19585d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MagFilter = src->MagFilter; 19685d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MinLod = src->MinLod; 19785d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MaxLod = src->MaxLod; 19885d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->BaseLevel = src->BaseLevel; 19985d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MaxLevel = src->MaxLevel; 20085d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->MaxAnisotropy = src->MaxAnisotropy; 20185d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->CompareFlag = src->CompareFlag; 20285d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->CompareOperator = src->CompareOperator; 20385d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->ShadowAmbient = src->ShadowAmbient; 20485d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->CompareMode = src->CompareMode; 20585d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->CompareFunc = src->CompareFunc; 20685d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->DepthMode = src->DepthMode; 20785d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->_MaxLevel = src->_MaxLevel; 20885d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->_MaxLambda = src->_MaxLambda; 20985d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->GenerateMipmap = src->GenerateMipmap; 21085d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->Palette = src->Palette; 21185d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul dest->Complete = src->Complete; 21285d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul} 21385d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul 21485d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul 21585d816028a2472e0378afda65e7ab6f7ff4d76b4Brian Paul/* 216a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul * Report why a texture object is incomplete. (for debug only) 217a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul */ 21821d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#if 0 21921d073d55ad668494fa19977fe06369194eb1ec5Brian Paulstatic void 22021d073d55ad668494fa19977fe06369194eb1ec5Brian Paulincomplete(const struct gl_texture_object *t, const char *why) 22121d073d55ad668494fa19977fe06369194eb1ec5Brian Paul{ 22221d073d55ad668494fa19977fe06369194eb1ec5Brian Paul printf("Texture Obj %d incomplete because: %s\n", t->Name, why); 22321d073d55ad668494fa19977fe06369194eb1ec5Brian Paul} 22421d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#else 22521d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#define incomplete(a, b) 22621d073d55ad668494fa19977fe06369194eb1ec5Brian Paul#endif 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 230a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul * Examine a texture object to determine if it is complete. 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The t->Complete flag will be set to GL_TRUE or GL_FALSE accordingly. 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 23335d5301a54153930ee6fd60dff1010ce9f901397Brian Paulvoid 23435d5301a54153930ee6fd60dff1010ce9f901397Brian Paul_mesa_test_texobj_completeness( const GLcontext *ctx, 23535d5301a54153930ee6fd60dff1010ce9f901397Brian Paul struct gl_texture_object *t ) 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 23763ec4238236479a57420c6b43a09d79eff624928Brian Paul const GLint baseLevel = t->BaseLevel; 238cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul GLint maxLog2 = 0, maxLevels = 0; 23963ec4238236479a57420c6b43a09d79eff624928Brian Paul 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_TRUE; /* be optimistic */ 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 242a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* Always need the base level image */ 24363ec4238236479a57420c6b43a09d79eff624928Brian Paul if (!t->Image[baseLevel]) { 24421d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "Image[baseLevel] == NULL"); 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 249083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul /* Compute _MaxLevel */ 2508afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (t->Target == GL_TEXTURE_1D) { 251083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul maxLog2 = t->Image[baseLevel]->WidthLog2; 252cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul maxLevels = ctx->Const.MaxTextureLevels; 253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2548afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_2D) { 255083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul maxLog2 = MAX2(t->Image[baseLevel]->WidthLog2, 256083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->Image[baseLevel]->HeightLog2); 2578afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLevels = ctx->Const.MaxTextureLevels; 258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2598afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_3D) { 26063ec4238236479a57420c6b43a09d79eff624928Brian Paul GLint max = MAX2(t->Image[baseLevel]->WidthLog2, 26163ec4238236479a57420c6b43a09d79eff624928Brian Paul t->Image[baseLevel]->HeightLog2); 262083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul maxLog2 = MAX2(max, (GLint)(t->Image[baseLevel]->DepthLog2)); 263cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul maxLevels = ctx->Const.Max3DTextureLevels; 264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2658afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) { 2668afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLog2 = MAX2(t->Image[baseLevel]->WidthLog2, 2678afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul t->Image[baseLevel]->HeightLog2); 2688afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLevels = ctx->Const.MaxCubeTextureLevels; 2698afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 2708afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_RECTANGLE_NV) { 2718afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLog2 = 0; /* not applicable */ 2728afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul maxLevels = 1; /* no mipmapping */ 2738afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 274cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul else { 2758afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul _mesa_problem(ctx, "Bad t->Target in _mesa_test_texobj_completeness"); 276cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul return; 277cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul } 278cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul 279cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul ASSERT(maxLevels > 0); 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 281083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->_MaxLevel = baseLevel + maxLog2; 282083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->_MaxLevel = MIN2(t->_MaxLevel, t->MaxLevel); 283cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul t->_MaxLevel = MIN2(t->_MaxLevel, maxLevels - 1); 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 285083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul /* Compute _MaxLambda = q - b (see the 1.2 spec) used during mipmapping */ 286083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul t->_MaxLambda = (GLfloat) (t->_MaxLevel - t->BaseLevel); 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2888afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) { 289a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* make sure that all six cube map level 0 images are the same size */ 29001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul const GLuint w = t->Image[baseLevel]->Width2; 29101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul const GLuint h = t->Image[baseLevel]->Height2; 29263ec4238236479a57420c6b43a09d79eff624928Brian Paul if (!t->NegX[baseLevel] || 29363ec4238236479a57420c6b43a09d79eff624928Brian Paul t->NegX[baseLevel]->Width2 != w || 29463ec4238236479a57420c6b43a09d79eff624928Brian Paul t->NegX[baseLevel]->Height2 != h || 29563ec4238236479a57420c6b43a09d79eff624928Brian Paul !t->PosY[baseLevel] || 29663ec4238236479a57420c6b43a09d79eff624928Brian Paul t->PosY[baseLevel]->Width2 != w || 29763ec4238236479a57420c6b43a09d79eff624928Brian Paul t->PosY[baseLevel]->Height2 != h || 29863ec4238236479a57420c6b43a09d79eff624928Brian Paul !t->NegY[baseLevel] || 29963ec4238236479a57420c6b43a09d79eff624928Brian Paul t->NegY[baseLevel]->Width2 != w || 30063ec4238236479a57420c6b43a09d79eff624928Brian Paul t->NegY[baseLevel]->Height2 != h || 30163ec4238236479a57420c6b43a09d79eff624928Brian Paul !t->PosZ[baseLevel] || 30263ec4238236479a57420c6b43a09d79eff624928Brian Paul t->PosZ[baseLevel]->Width2 != w || 30363ec4238236479a57420c6b43a09d79eff624928Brian Paul t->PosZ[baseLevel]->Height2 != h || 30463ec4238236479a57420c6b43a09d79eff624928Brian Paul !t->NegZ[baseLevel] || 30563ec4238236479a57420c6b43a09d79eff624928Brian Paul t->NegZ[baseLevel]->Width2 != w || 30663ec4238236479a57420c6b43a09d79eff624928Brian Paul t->NegZ[baseLevel]->Height2 != h) { 307ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul t->Complete = GL_FALSE; 30821d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "Non-quare cubemap image"); 309ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul return; 310ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 311ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 312ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul 313ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (t->MinFilter != GL_NEAREST && t->MinFilter != GL_LINEAR) { 314afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 315afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mipmapping: determine if we have a complete set of mipmaps 316afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 31863ec4238236479a57420c6b43a09d79eff624928Brian Paul GLint minLevel = baseLevel; 319083e466f88e1203f08b7699fa34b05d0e45b3172Brian Paul GLint maxLevel = t->_MaxLevel; 320afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 321afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (minLevel > maxLevel) { 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 32321d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "minLevel > maxLevel"); 324afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test dimension-independent attributes */ 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i = minLevel; i <= maxLevel; i++) { 329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t->Image[i]) { 3305bfaa2f12e35a9de4a4116968e34ee24007973e7Brian Paul if (t->Image[i]->TexFormat != t->Image[baseLevel]->TexFormat) { 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 33221d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "Format[i] != Format[baseLevel]"); 333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 33563ec4238236479a57420c6b43a09d79eff624928Brian Paul if (t->Image[i]->Border != t->Image[baseLevel]->Border) { 336afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 33721d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "Border[i] != Border[baseLevel]"); 338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test things which depend on number of texture image dimensions */ 3448afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (t->Target == GL_TEXTURE_1D) { 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test 1-D mipmaps */ 34663ec4238236479a57420c6b43a09d79eff624928Brian Paul GLuint width = t->Image[baseLevel]->Width2; 347cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 348ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width /= 2; 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i >= minLevel && i <= maxLevel) { 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!t->Image[i]) { 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 35421d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "1D Image[i] == NULL"); 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t->Image[i]->Width2 != width ) { 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 35921d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "1D Image[i] bad width"); 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 363ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width == 1) { 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; /* found smallest needed mipmap, all done! */ 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 3688afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_2D) { 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test 2-D mipmaps */ 37063ec4238236479a57420c6b43a09d79eff624928Brian Paul GLuint width = t->Image[baseLevel]->Width2; 37163ec4238236479a57420c6b43a09d79eff624928Brian Paul GLuint height = t->Image[baseLevel]->Height2; 372cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 373ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width /= 2; 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 376ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (height > 1) { 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg height /= 2; 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i >= minLevel && i <= maxLevel) { 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!t->Image[i]) { 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 38221d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "2D Image[i] == NULL"); 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t->Image[i]->Width2 != width) { 386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 38721d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "2D Image[i] bad width"); 388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t->Image[i]->Height2 != height) { 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 39221d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "2D Image[i] bad height"); 393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (width==1 && height==1) { 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; /* found smallest needed mipmap, all done! */ 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 4018afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_3D) { 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Test 3-D mipmaps */ 40363ec4238236479a57420c6b43a09d79eff624928Brian Paul GLuint width = t->Image[baseLevel]->Width2; 40463ec4238236479a57420c6b43a09d79eff624928Brian Paul GLuint height = t->Image[baseLevel]->Height2; 40563ec4238236479a57420c6b43a09d79eff624928Brian Paul GLuint depth = t->Image[baseLevel]->Depth2; 406cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 407ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width /= 2; 409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 410ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (height > 1) { 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg height /= 2; 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 413ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (depth > 1) { 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg depth /= 2; 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i >= minLevel && i <= maxLevel) { 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!t->Image[i]) { 41821d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "3D Image[i] == NULL"); 419afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 420afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 421afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 4224182cf60d96a077a66675e89694529b5f9e4b329Brian Paul if (t->Image[i]->Format == GL_DEPTH_COMPONENT) { 4234182cf60d96a077a66675e89694529b5f9e4b329Brian Paul t->Complete = GL_FALSE; 4244182cf60d96a077a66675e89694529b5f9e4b329Brian Paul incomplete(t, "GL_DEPTH_COMPONENT only works with 1/2D tex"); 4254182cf60d96a077a66675e89694529b5f9e4b329Brian Paul return; 4264182cf60d96a077a66675e89694529b5f9e4b329Brian Paul } 427afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t->Image[i]->Width2 != width) { 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 42921d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "3D Image[i] bad width"); 430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t->Image[i]->Height2 != height) { 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 43421d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "3D Image[i] bad height"); 435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t->Image[i]->Depth2 != depth) { 438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Complete = GL_FALSE; 43921d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "3D Image[i] bad depth"); 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 443ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width == 1 && height == 1 && depth == 1) { 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; /* found smallest needed mipmap, all done! */ 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 4488afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_CUBE_MAP_ARB) { 449ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul /* make sure 6 cube faces are consistant */ 45063ec4238236479a57420c6b43a09d79eff624928Brian Paul GLuint width = t->Image[baseLevel]->Width2; 45163ec4238236479a57420c6b43a09d79eff624928Brian Paul GLuint height = t->Image[baseLevel]->Height2; 452cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul for (i = baseLevel + 1; i < maxLevels; i++) { 453ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width > 1) { 454ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul width /= 2; 455ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 456ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (height > 1) { 457ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul height /= 2; 458ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 459ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (i >= minLevel && i <= maxLevel) { 4604182cf60d96a077a66675e89694529b5f9e4b329Brian Paul /* Don't support GL_DEPTH_COMPONENT for cube maps */ 4614182cf60d96a077a66675e89694529b5f9e4b329Brian Paul if (t->Image[i]->Format == GL_DEPTH_COMPONENT) { 4624182cf60d96a077a66675e89694529b5f9e4b329Brian Paul t->Complete = GL_FALSE; 4634182cf60d96a077a66675e89694529b5f9e4b329Brian Paul incomplete(t, "GL_DEPTH_COMPONENT only works with 1/2D tex"); 4644182cf60d96a077a66675e89694529b5f9e4b329Brian Paul return; 4654182cf60d96a077a66675e89694529b5f9e4b329Brian Paul } 466ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul /* check that we have images defined */ 467ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (!t->Image[i] || !t->NegX[i] || 468ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul !t->PosY[i] || !t->NegY[i] || 469ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul !t->PosZ[i] || !t->NegZ[i]) { 470ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul t->Complete = GL_FALSE; 47121d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "CubeMap Image[i] == NULL"); 472ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul return; 473ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 474ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul /* check that all six images have same size */ 475ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (t->NegX[i]->Width2!=width || t->NegX[i]->Height2!=height || 476ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul t->PosY[i]->Width2!=width || t->PosY[i]->Height2!=height || 477ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul t->NegY[i]->Width2!=width || t->NegY[i]->Height2!=height || 478ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul t->PosZ[i]->Width2!=width || t->PosZ[i]->Height2!=height || 479ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul t->NegZ[i]->Width2!=width || t->NegZ[i]->Height2!=height) { 480ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul t->Complete = GL_FALSE; 48121d073d55ad668494fa19977fe06369194eb1ec5Brian Paul incomplete(t, "CubeMap Image[i] bad size"); 482ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul return; 483ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 484ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 485ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul if (width == 1 && height == 1) { 486ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul return; /* found smallest needed mipmap, all done! */ 487ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 488ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 489413d6a21f849a689b5c83ea04395856b44fc65a8Brian Paul } 4908afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (t->Target == GL_TEXTURE_RECTANGLE_NV) { 4918afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul /* XXX special checking? */ 4928afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul 4938afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 4958afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul /* Target = ??? */ 49608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bug in gl_test_texture_object_completeness\n"); 497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 502832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul_glthread_DECLARE_STATIC_MUTEX(GenTexturesLock); 503832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Execute glGenTextures 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 508fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 509fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_GenTextures( GLsizei n, GLuint *texName ) 510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 511fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint first; 513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 514cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 515afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 516507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (n < 0) { 51708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glGenTextures" ); 518afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 521507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (!texName) 522507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return; 523832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 524832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul /* 525832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul * This must be atomic (generation and allocation of texture IDs) 526832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul */ 527832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul _glthread_LOCK_MUTEX(GenTexturesLock); 528832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 529bb79790662f56eb71aafd3f020cd86ad810f56b2Brian Paul first = _mesa_HashFindFreeKeyBlock(ctx->Shared->TexObjects, n); 530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 531afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Return the texture names */ 532afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 533afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texName[i] = first + i; 534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 535afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 536afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Allocate new, empty texture objects */ 537afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint name = first + i; 5398afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul GLenum target = 0; 5408afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul (void) _mesa_alloc_texture_object( ctx->Shared, name, target); 541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 542832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul 543832179c50e2cf5de9735241e4767aea4d6fc33bfBrian Paul _glthread_UNLOCK_MUTEX(GenTexturesLock); 544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Execute glDeleteTextures 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_DeleteTextures( GLsizei n, const GLuint *texName) 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 556cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex */ 557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 558507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (!texName) 559507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return; 560507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<n;i++) { 562a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (texName[i] > 0) { 563a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul struct gl_texture_object *delObj = (struct gl_texture_object *) 564bb79790662f56eb71aafd3f020cd86ad810f56b2Brian Paul _mesa_HashLookup(ctx->Shared->TexObjects, texName[i]); 565a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (delObj) { 56659d6da5365c876ba18a66cd51ed52b0e1d96704eBrian Paul /* First check if this texture is currently bound. 56759d6da5365c876ba18a66cd51ed52b0e1d96704eBrian Paul * If so, unbind it and decrement the reference count. 56859d6da5365c876ba18a66cd51ed52b0e1d96704eBrian Paul */ 569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint u; 57059d6da5365c876ba18a66cd51ed52b0e1d96704eBrian Paul for (u = 0; u < MAX_TEXTURE_UNITS; u++) { 571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_unit *unit = &ctx->Texture.Unit[u]; 572a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (delObj == unit->Current1D) { 573a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul unit->Current1D = ctx->Shared->Default1D; 574a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul ctx->Shared->Default1D->RefCount++; 575dae1774e206188d951332d2285ea9cf8796d1a64Brian Paul if (delObj == unit->_Current) 576dae1774e206188d951332d2285ea9cf8796d1a64Brian Paul unit->_Current = unit->Current1D; 577a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 578a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul else if (delObj == unit->Current2D) { 579a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul unit->Current2D = ctx->Shared->Default2D; 580a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul ctx->Shared->Default2D->RefCount++; 581dae1774e206188d951332d2285ea9cf8796d1a64Brian Paul if (delObj == unit->_Current) 582dae1774e206188d951332d2285ea9cf8796d1a64Brian Paul unit->_Current = unit->Current2D; 583a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 584a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul else if (delObj == unit->Current3D) { 585a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul unit->Current3D = ctx->Shared->Default3D; 586a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul ctx->Shared->Default3D->RefCount++; 587dae1774e206188d951332d2285ea9cf8796d1a64Brian Paul if (delObj == unit->_Current) 588dae1774e206188d951332d2285ea9cf8796d1a64Brian Paul unit->_Current = unit->Current3D; 589a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 590a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul else if (delObj == unit->CurrentCubeMap) { 591a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul unit->CurrentCubeMap = ctx->Shared->DefaultCubeMap; 592a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul ctx->Shared->DefaultCubeMap->RefCount++; 593dae1774e206188d951332d2285ea9cf8796d1a64Brian Paul if (delObj == unit->_Current) 594dae1774e206188d951332d2285ea9cf8796d1a64Brian Paul unit->_Current = unit->CurrentCubeMap; 595a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 597a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul ctx->NewState |= _NEW_TEXTURE; 598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 59959d6da5365c876ba18a66cd51ed52b0e1d96704eBrian Paul /* Decrement reference count and delete if zero */ 600a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul delObj->RefCount--; 6015a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul ASSERT(delObj->RefCount >= 0); 6025a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul 603a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (delObj->RefCount == 0) { 6045a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul ASSERT(delObj->Name != 0); 60559d6da5365c876ba18a66cd51ed52b0e1d96704eBrian Paul if (ctx->Driver.DeleteTexture) 606a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul (*ctx->Driver.DeleteTexture)( ctx, delObj ); 607a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul _mesa_free_texture_object(ctx->Shared, delObj); 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Execute glBindTexture 618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 619fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 620fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_BindTexture( GLenum target, GLuint texName ) 621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 622fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLuint unit = ctx->Texture.CurrentUnit; 624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_object *oldTexObj; 6265c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell struct gl_texture_object *newTexObj = 0; 627cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END(ctx); 628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 6304753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glBindTexture %s %d\n", 631d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul _mesa_lookup_enum_by_nr(target), (GLint) texName); 632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 633420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul switch (target) { 634420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul case GL_TEXTURE_1D: 635a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul oldTexObj = texUnit->Current1D; 636420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul break; 637420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul case GL_TEXTURE_2D: 638a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul oldTexObj = texUnit->Current2D; 639420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul break; 640420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul case GL_TEXTURE_3D: 641a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul oldTexObj = texUnit->Current3D; 642420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul break; 643fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 6448afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) { 6458afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glBindTexture(target)" ); 6468afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return; 6478afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 6488afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul oldTexObj = texUnit->CurrentCubeMap; 6498afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul break; 6508afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_TEXTURE_RECTANGLE_NV: 6518afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (!ctx->Extensions.NV_texture_rectangle) { 6528afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glBindTexture(target)" ); 6538afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return; 654fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 6558afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul oldTexObj = texUnit->CurrentRect; 6568afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul break; 657420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul default: 65808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glBindTexture(target)" ); 659420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul return; 660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (oldTexObj->Name == texName) 663a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return; /* rebinding the same texture- no change */ 664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 665a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* 666a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul * Get pointer to new texture object (newTexObj) 667a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul */ 668fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul if (texName == 0) { 669a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* newTexObj = a default texture object */ 670a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul switch (target) { 671a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul case GL_TEXTURE_1D: 672a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul newTexObj = ctx->Shared->Default1D; 673a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul break; 674a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul case GL_TEXTURE_2D: 675a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul newTexObj = ctx->Shared->Default2D; 676a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul break; 677a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul case GL_TEXTURE_3D: 678a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul newTexObj = ctx->Shared->Default3D; 679a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul break; 680a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul case GL_TEXTURE_CUBE_MAP_ARB: 681a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul newTexObj = ctx->Shared->DefaultCubeMap; 682a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul break; 6838afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_TEXTURE_RECTANGLE_NV: 6848afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul newTexObj = ctx->Shared->DefaultRect; 6858afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul break; 686a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul default: 687a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul ; /* Bad targets are caught above */ 688a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 689fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 691a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* non-default texture object */ 692a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul const struct _mesa_HashTable *hash = ctx->Shared->TexObjects; 693c79fab4aa6d4c2d399c2ca888fdf0e6c310f7303Brian Paul newTexObj = (struct gl_texture_object *) _mesa_HashLookup(hash, texName); 694a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (newTexObj) { 695a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* error checking */ 6968afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (newTexObj->Target != 0 && newTexObj->Target != target) { 697420ef64f18208a54b97e96936b741dc1531e45c8Brian Paul /* the named texture object's dimensions don't match the target */ 6985a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul _mesa_error( ctx, GL_INVALID_OPERATION, 6995a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul "glBindTexture(wrong dimensionality)" ); 700a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return; 701a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 7028afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (newTexObj->Target == 0 && target == GL_TEXTURE_RECTANGLE_NV) { 7038afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul /* have to init wrap and filter state here - kind of klunky */ 7048afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul newTexObj->WrapS = GL_CLAMP_TO_EDGE; 7058afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul newTexObj->WrapT = GL_CLAMP_TO_EDGE; 7068afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul newTexObj->WrapR = GL_CLAMP_TO_EDGE; 7078afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul newTexObj->MinFilter = GL_LINEAR; 7088afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 710a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul else { 711a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul /* if this is a new texture id, allocate a texture object now */ 7125c1e7fa6ee72f4403d9ec9d12830dd689b966e71Keith Whitwell newTexObj = _mesa_alloc_texture_object( ctx->Shared, texName, 7138afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target); 714a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul if (!newTexObj) { 71508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindTexture"); 716a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return; 717a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 718a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul } 7198afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul newTexObj->Target = target; 720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg newTexObj->RefCount++; 7236e6d4c66bd7fd64162ee453b143d7388bb051444Brian Paul 724cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell /* do the actual binding, but first flush outstanding vertices: 725cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 726cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell FLUSH_VERTICES(ctx, _NEW_TEXTURE); 727cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 728fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul switch (target) { 729fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_1D: 730a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul texUnit->Current1D = newTexObj; 731fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul break; 732fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_2D: 733a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul texUnit->Current2D = newTexObj; 734fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul break; 735fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_3D: 736a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul texUnit->Current3D = newTexObj; 737fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul break; 738fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 739fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul texUnit->CurrentCubeMap = newTexObj; 740fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul break; 7418afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_TEXTURE_RECTANGLE_NV: 7428afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul texUnit->CurrentRect = newTexObj; 7438afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul break; 744fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul default: 74508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "bad target in BindTexture"); 7468afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return; 747fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Pass BindTexture call to device driver */ 7505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen if (ctx->Driver.BindTexture) 751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (*ctx->Driver.BindTexture)( ctx, target, newTexObj ); 7526e6d4c66bd7fd64162ee453b143d7388bb051444Brian Paul 7535a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul oldTexObj->RefCount--; 7545a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul assert(oldTexObj->RefCount >= 0); 7555a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul if (oldTexObj->RefCount == 0) { 7565a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul assert(oldTexObj->Name != 0); 7575a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul if (ctx->Driver.DeleteTexture) { 7585a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul (*ctx->Driver.DeleteTexture)( ctx, oldTexObj ); 7596e6d4c66bd7fd64162ee453b143d7388bb051444Brian Paul } 7605a2f32b102ab862fb10ba6b89e0b68a71552c674Brian Paul _mesa_free_texture_object(ctx->Shared, oldTexObj); 7616e6d4c66bd7fd64162ee453b143d7388bb051444Brian Paul } 762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Execute glPrioritizeTextures 768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 769fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 770fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PrioritizeTextures( GLsizei n, const GLuint *texName, 771fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLclampf *priorities ) 772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 773fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 775cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 7776d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul if (n < 0) { 77808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glPrioritizeTextures" ); 779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 782507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (!priorities) 783507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return; 784507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul 7856d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul for (i = 0; i < n; i++) { 7866d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul if (texName[i] > 0) { 7876d04725282f32cbd32acbc8b79294a2a056b2158Brian Paul struct gl_texture_object *t = (struct gl_texture_object *) 788bb79790662f56eb71aafd3f020cd86ad810f56b2Brian Paul _mesa_HashLookup(ctx->Shared->TexObjects, texName[i]); 789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t) { 790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t->Priority = CLAMP( priorities[i], 0.0F, 1.0F ); 79169cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell if (ctx->Driver.PrioritizeTexture) 79269cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell ctx->Driver.PrioritizeTexture( ctx, t, t->Priority ); 793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 796a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell 797a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell ctx->NewState |= _NEW_TEXTURE; 798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 8035e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * Execute glAreTexturesResident 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 805fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulGLboolean 806bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul_mesa_AreTexturesResident(GLsizei n, const GLuint *texName, 807bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul GLboolean *residences) 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 809fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 810bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul GLboolean allResident = GL_TRUE; 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 812cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 814bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul if (n < 0) { 81508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(n)"); 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 819507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul if (!texName || !residences) 820507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul return GL_FALSE; 821507d83e4cc0eb2fbc4a5ce3b87ed0b40634df5a8Brian Paul 822bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul for (i = 0; i < n; i++) { 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_object *t; 824bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul if (texName[i] == 0) { 82508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(textures)"); 826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg t = (struct gl_texture_object *) 829bb79790662f56eb71aafd3f020cd86ad810f56b2Brian Paul _mesa_HashLookup(ctx->Shared->TexObjects, texName[i]); 830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (t) { 831bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul if (ctx->Driver.IsTextureResident) { 832bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul residences[i] = ctx->Driver.IsTextureResident(ctx, t); 833bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul if (!residences[i]) 834bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul allResident = GL_FALSE; 835bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul } 836bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul else { 83769cfdb2fcb6c6d5538aff6533b587a54fb2e74c3Keith Whitwell residences[i] = GL_TRUE; 838bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul } 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 84108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glAreTexturesResident(textures)"); 842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 845bd0f7f42d6413577b78c342ab2f73b8d05c81d2fBrian Paul return allResident; 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Execute glIsTexture 852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 853fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian PaulGLboolean 854fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IsTexture( GLuint texture ) 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 856fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 857cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 858cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return texture > 0 && _mesa_HashLookup(ctx->Shared->TexObjects, texture); 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 860