From bb7d5f8837a9c7658a18dbaf02d52583e29443e3 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Sat, 5 Feb 2005 18:12:59 +0000 Subject: Remove the Shared->TexObjectList pointer and Next field from gl_texture_object. Was only used by two drivers to walk over all texture objects. Can do that via the hash table instead. Cleaned up some comments for struct gl_texture_object. --- src/mesa/main/mtypes.h | 25 ++++++++--------- src/mesa/main/texobj.c | 76 +++++++++++++------------------------------------- src/mesa/main/texobj.h | 6 ---- 3 files changed, 30 insertions(+), 77 deletions(-) diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 416f77d25c8..15b5bd987f1 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1250,13 +1250,9 @@ struct gl_texture_object GLfloat Priority; /**< in [0,1] */ GLfloat BorderColor[4]; /**< unclamped */ GLchan _BorderChan[4]; /**< clamped, as GLchan */ - /** \name Wrap modes - * Are GL_CLAMP, REPEAT, GL_CLAMP_TO_EDGE, and GL_CLAMP_TO_BORDER_ARB. */ - /*@{*/ - GLenum WrapS; - GLenum WrapT; - GLenum WrapR; - /*@}*/ + GLenum WrapS; /**< S-axis texture image wrap mode */ + GLenum WrapT; /**< T-axis texture image wrap mode */ + GLenum WrapR; /**< R-axis texture image wrap mode */ GLenum MinFilter; /**< minification filter */ GLenum MagFilter; /**< magnification filter */ GLfloat MinLod; /**< min lambda, OpenGL 1.2 */ @@ -1267,7 +1263,7 @@ struct gl_texture_object GLfloat MaxAnisotropy; /**< GL_EXT_texture_filter_anisotropic */ GLboolean CompareFlag; /**< GL_SGIX_shadow */ GLenum CompareOperator; /**< GL_SGIX_shadow */ - GLfloat ShadowAmbient; + GLfloat ShadowAmbient; /**< GL_ARB_shadow_ambient */ GLenum CompareMode; /**< GL_ARB_shadow */ GLenum CompareFunc; /**< GL_ARB_shadow */ GLenum DepthMode; /**< GL_ARB_depth_texture */ @@ -1275,21 +1271,23 @@ struct gl_texture_object GLfloat _MaxLambda; /**< = _MaxLevel - BaseLevel (q - b in spec) */ GLboolean GenerateMipmap; /**< GL_SGIS_generate_mipmap */ GLboolean _IsPowerOfTwo; /**< Are all image dimensions powers of two? */ + GLboolean Complete; /**< Is texture object complete? */ + /** Actual texture images, indexed by [cube face] and [mipmap level] */ struct gl_texture_image *Image[MAX_FACES][MAX_TEXTURE_LEVELS]; /** GL_EXT_paletted_texture */ struct gl_color_table Palette; - GLboolean Complete; /**< Is texture object complete? */ - struct gl_texture_object *Next; /**< Next in linked list */ /** - * \name For device driver + * \name For device driver. + * Note: instead of attaching driver data to this pointer, it's preferable + * to instead use this struct as a base class for your own texture object + * class. Driver->NewTextureObject() can be used to implement the + * allocation. */ - /*@{*/ void *DriverData; /**< Arbitrary device driver data */ - /*@}*/ }; @@ -1935,7 +1933,6 @@ struct gl_shared_state GLint RefCount; /**< Reference count */ struct _mesa_HashTable *DisplayList; /**< Display lists hash table */ struct _mesa_HashTable *TexObjects; /**< Texture objects hash table */ - struct gl_texture_object *TexObjectList;/**< Linked list of texture objects */ /** * \name Default texture objects (shared by all multi-texture units) diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index 68fe79760d4..1691ae13879 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -157,63 +157,11 @@ _mesa_delete_texture_object( GLcontext *ctx, struct gl_texture_object *texObj ) } -/** - * Add the given texture object to the texture object pool. - */ -void -_mesa_save_texture_object( GLcontext *ctx, struct gl_texture_object *texObj ) -{ - /* insert into linked list */ - _glthread_LOCK_MUTEX(ctx->Shared->Mutex); - texObj->Next = ctx->Shared->TexObjectList; - ctx->Shared->TexObjectList = texObj; - _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); - - if (texObj->Name > 0) { - /* insert into hash table */ - _mesa_HashInsert(ctx->Shared->TexObjects, texObj->Name, texObj); - } -} - - -/** - * Remove the given texture object from the texture object pool. - * Do not deallocate the texture object though. - */ -void -_mesa_remove_texture_object( GLcontext *ctx, struct gl_texture_object *texObj ) -{ - struct gl_texture_object *tprev, *tcurr; - - _glthread_LOCK_MUTEX(ctx->Shared->Mutex); - /* unlink from the linked list */ - tprev = NULL; - tcurr = ctx->Shared->TexObjectList; - while (tcurr) { - if (tcurr == texObj) { - if (tprev) { - tprev->Next = texObj->Next; - } - else { - ctx->Shared->TexObjectList = texObj->Next; - } - break; - } - tprev = tcurr; - tcurr = tcurr->Next; - } - - _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); - - if (texObj->Name > 0) { - /* remove from hash table */ - _mesa_HashRemove(ctx->Shared->TexObjects, texObj->Name); - } -} /** * Copy texture object state from one texture object to another. + * Use for glPush/PopAttrib. * * \param dest destination texture object. * \param src source texture object. @@ -620,7 +568,12 @@ _mesa_GenTextures( GLsizei n, GLuint *textures ) _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenTextures"); return; } - _mesa_save_texture_object(ctx, texObj); + + /* insert into hash table */ + _glthread_LOCK_MUTEX(ctx->Shared->Mutex); + _mesa_HashInsert(ctx->Shared->TexObjects, texObj->Name, texObj); + _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); + textures[i] = name; } @@ -702,8 +655,13 @@ _mesa_DeleteTextures( GLsizei n, const GLuint *textures) } ctx->NewState |= _NEW_TEXTURE; - /* The texture _name_ is now free for re-use. */ - _mesa_remove_texture_object(ctx, delObj); + /* The texture _name_ is now free for re-use. + * Remove it from the hash table now. + */ + _glthread_LOCK_MUTEX(ctx->Shared->Mutex); + _mesa_HashRemove(ctx->Shared->TexObjects, delObj->Name); + _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); + /* The actual texture object will not be freed until it's no * longer bound in any context. * XXX all RefCount accesses should be protected by a mutex. @@ -848,7 +806,11 @@ _mesa_BindTexture( GLenum target, GLuint texName ) _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindTexture"); return; } - _mesa_save_texture_object(ctx, newTexObj); + + /* and insert it into hash table */ + _glthread_LOCK_MUTEX(ctx->Shared->Mutex); + _mesa_HashInsert(ctx->Shared->TexObjects, texName, newTexObj); + _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); } newTexObj->Target = target; } diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h index c5cce28c370..d00bf70a0d1 100644 --- a/src/mesa/main/texobj.h +++ b/src/mesa/main/texobj.h @@ -50,12 +50,6 @@ _mesa_initialize_texture_object( struct gl_texture_object *obj, extern void _mesa_delete_texture_object( GLcontext *ctx, struct gl_texture_object *obj ); -extern void -_mesa_save_texture_object( GLcontext *ctx, struct gl_texture_object *obj ); - -extern void -_mesa_remove_texture_object( GLcontext *ctx, struct gl_texture_object *obj ); - extern void _mesa_copy_texture_object( struct gl_texture_object *dest, const struct gl_texture_object *src ); -- cgit v1.2.3