libs: add gl3_bind_texture_2d()
authorVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
Thu, 26 Nov 2015 09:26:10 +0000 (10:26 +0100)
committerVíctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
Mon, 30 Nov 2015 12:26:22 +0000 (13:26 +0100)
Since OpenGL3.1 removed the fixed pipelines[1] enabling 2D textures is not
needed. In particular, the Intel's Mesa implementation complains if it is
called.

This patch add a new binding function for 2D textures, without enabling
gl3_bind_texture_2d()[2].

1. https://www.opengl.org/wiki/Fixed_Function_Pipeline
2. https://www.opengl.org/wiki/Common_Mistakes#OOP_and_hidden_binding

Signed-off-by: Víctor Manuel Jáquez Leal <victorx.jaquez@intel.com>
https://bugzilla.gnome.org/show_bug.cgi?id=753099

gst-libs/gst/vaapi/gstvaapiutils_glx.c
gst-libs/gst/vaapi/gstvaapiutils_glx.h

index 974d3a0..37e9375 100644 (file)
@@ -465,25 +465,15 @@ gl_swap_buffers (GLContextState * cs)
   cs->swapped_buffers = TRUE;
 }
 
-/**
- * gl_bind_texture:
- * @ts: a #GLTextureState
- * @target: the target to which the texture is bound
- * @texture: the name of a texture
- *
- * Binds @texture to the specified @target, while recording the
- * previous state in @ts.
- *
- * Return value: %TRUE on success
- */
-gboolean
-gl_bind_texture (GLTextureState * ts, GLenum target, GLuint texture)
+static inline gboolean
+_init_texture_state (GLTextureState * ts, GLenum target, GLuint texture,
+    gboolean enabled)
 {
   GLenum binding;
 
   ts->target = target;
 
-  if (glIsEnabled (target)) {
+  if (enabled) {
     binding = gl_get_texture_binding (target);
     if (!binding)
       return FALSE;
@@ -491,15 +481,18 @@ gl_bind_texture (GLTextureState * ts, GLenum target, GLuint texture)
       return FALSE;
     ts->was_enabled = TRUE;
     ts->was_bound = texture == ts->old_texture;
-    if (ts->was_bound)
-      return TRUE;
   } else {
-    glEnable (target);
     ts->old_texture = 0;
     ts->was_enabled = FALSE;
     ts->was_bound = FALSE;
   }
 
+  return TRUE;
+}
+
+static inline gboolean
+_bind_enabled_texture (GLenum target, GLuint texture)
+{
   gl_purge_errors ();
   glBindTexture (target, texture);
   if (gl_check_error ())
@@ -508,6 +501,60 @@ gl_bind_texture (GLTextureState * ts, GLenum target, GLuint texture)
 }
 
 /**
+ * gl_bind_texture:
+ * @ts: a #GLTextureState
+ * @target: the target to which the texture is bound
+ * @texture: the name of a texture
+ *
+ * Binds @texture to the specified @target, while recording the
+ * previous state in @ts.
+ *
+ * Return value: %TRUE on success
+ */
+gboolean
+gl_bind_texture (GLTextureState * ts, GLenum target, GLuint texture)
+{
+  gboolean enabled;
+
+  enabled = (gboolean) glIsEnabled (target);
+  if (!_init_texture_state (ts, target, texture, enabled))
+    return FALSE;
+  if (ts->was_bound)
+    return TRUE;
+  if (!enabled)
+    glEnable (target);
+
+  return _bind_enabled_texture (target, texture);
+}
+
+/**
+ * gl3_bind_texture_2d:
+ * @ts: a #GLTextureState
+ * @target: the target to which the texture is bound
+ * @texture: the name of a texture
+ *
+ * Binds @texture to the specified @target, while recording the
+ * previous state in @ts.
+ *
+ * This function is for OpenGL3 API and for targets type GL_TEXTURE_2D.
+ *
+ * Return value: %TRUE on success
+ */
+gboolean
+gl3_bind_texture_2d (GLTextureState * ts, GLenum target, GLuint texture)
+{
+  if (target != GL_TEXTURE_2D)
+    return FALSE;
+
+  if (!_init_texture_state (ts, target, texture, TRUE))
+    return FALSE;
+  if (ts->was_bound)
+    return TRUE;
+
+  return _bind_enabled_texture (target, texture);
+}
+
+/**
  * gl_unbind_texture:
  * @ts: a #GLTextureState
  *
index 42e047f..3fafe5e 100644 (file)
@@ -121,6 +121,10 @@ gboolean
 gl_bind_texture (GLTextureState * ts, GLenum target, GLuint texture);
 
 G_GNUC_INTERNAL
+gboolean
+gl3_bind_texture_2d (GLTextureState * ts, GLenum target, GLuint texture);
+
+G_GNUC_INTERNAL
 void
 gl_unbind_texture (GLTextureState * ts);