diff options
author | Pierre-Eric Pelloux-Prayer <[email protected]> | 2019-06-25 16:53:49 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-06-28 15:41:30 -0400 |
commit | 274104ec381ebb1505e0e078959f94724b51ec58 (patch) | |
tree | 68f8fde63a74615b34041b337b3230eb78bb4ebd /src/mesa/main/texobj.c | |
parent | 6535964fdf77a3f4bd356b089629f783957a3cd9 (diff) |
mesa: refactor bind_texture
Splits texture lookup and binding actions.
The new _mesa_lookup_or_create_texture will be useful to implement the EXT_direct_state_access extension.
Reviewed-by: Marek Olšák <[email protected]>
Signed-off-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa/main/texobj.c')
-rw-r--r-- | src/mesa/main/texobj.c | 47 |
1 files changed, 30 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); } |