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