diff options
-rw-r--r-- | src/mesa/main/texobj.c | 47 | ||||
-rw-r--r-- | src/mesa/main/texobj.h | 6 |
2 files changed, 36 insertions, 17 deletions
diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index fa8a4d88dcb..6dbe56fa19c 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -1703,17 +1703,10 @@ _mesa_bind_texture(struct gl_context *ctx, GLenum target, bind_texture_object(ctx, ctx->Texture.CurrentUnit, tex_obj); } -/** - * Implement glBindTexture(). Do error checking, look-up or create a new - * texture object, then bind it in the current texture unit. - * - * \param target texture target. - * \param texName texture name. - * \param texunit texture unit. - */ -static ALWAYS_INLINE void -bind_texture(struct gl_context *ctx, GLenum target, GLuint texName, - GLenum texunit, bool no_error, const char *caller) +struct gl_texture_object * +_mesa_lookup_or_create_texture(struct gl_context *ctx, GLenum target, + GLuint texName, bool no_error, + const char *caller) { struct gl_texture_object *newTexObj = NULL; int targetIndex; @@ -1722,7 +1715,7 @@ bind_texture(struct gl_context *ctx, GLenum target, GLuint texName, if (!no_error && targetIndex < 0) { _mesa_error(ctx, GL_INVALID_ENUM, "%s(target = %s)", caller, _mesa_enum_to_string(target)); - return; + return NULL; } assert(targetIndex < NUM_TEXTURE_TARGETS); @@ -1744,24 +1737,23 @@ bind_texture(struct gl_context *ctx, GLenum target, GLuint texName, */ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(target mismatch)", caller); - return; + return NULL; } if (newTexObj->Target == 0) { finish_texture_init(ctx, target, newTexObj, targetIndex); } - } - else { + } else { if (!no_error && ctx->API == API_OPENGL_CORE) { _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-gen name)", caller); - return; + return NULL; } /* if this is a new texture id, allocate a texture object now */ newTexObj = ctx->Driver.NewTextureObject(ctx, texName, target); if (!newTexObj) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller); - return; + return NULL; } /* and insert it into hash table */ @@ -1772,6 +1764,27 @@ bind_texture(struct gl_context *ctx, GLenum target, GLuint texName, assert(newTexObj->Target == target); assert(newTexObj->TargetIndex == targetIndex); + return newTexObj; +} + +/** + * Implement glBindTexture(). Do error checking, look-up or create a new + * texture object, then bind it in the current texture unit. + * + * \param target texture target. + * \param texName texture name. + * \param texunit texture unit. + */ +static ALWAYS_INLINE void +bind_texture(struct gl_context *ctx, GLenum target, GLuint texName, + GLenum texunit, bool no_error, const char *caller) +{ + struct gl_texture_object *newTexObj = + _mesa_lookup_or_create_texture(ctx, target, texName, no_error, + "glBindTexture"); + if (!newTexObj) + return; + bind_texture_object(ctx, texunit, newTexObj); } diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h index 80e95d1f91a..3ebfa6715db 100644 --- a/src/mesa/main/texobj.h +++ b/src/mesa/main/texobj.h @@ -176,6 +176,12 @@ _mesa_delete_nameless_texture(struct gl_context *ctx, extern void _mesa_bind_texture(struct gl_context *ctx, GLenum target, struct gl_texture_object *tex_obj); + +extern struct gl_texture_object * +_mesa_lookup_or_create_texture(struct gl_context *ctx, GLenum target, + GLuint texName, bool no_error, + const char *name); + /*@}*/ /** |