mesa: refactor bind_texture
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Tue, 25 Jun 2019 14:53:49 +0000 (16:53 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 28 Jun 2019 19:41:30 +0000 (15:41 -0400)
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 <marek.olsak@amd.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/main/texobj.c
src/mesa/main/texobj.h

index fa8a4d88dcbc4d17af87c4f1a99c99ad92926ef9..6dbe56fa19c9e468d1b77d163fbb3e22af26e5c7 100644 (file)
@@ -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);
 }
 
index 80e95d1f91ae4a352f5d786109f9977d0746c83d..3ebfa6715db4da746082b6d67a0bca9bd72f5847 100644 (file)
@@ -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);
+
 /*@}*/
 
 /**