[vlc-commits] commit: opengl: Supports OpenGL ES. (Romain Goyet )

git at videolan.org git at videolan.org
Sun Oct 31 11:17:46 CET 2010


vlc | branch: master | Romain Goyet <romain.goyet at likid.org> | Sun Oct 31 10:44:16 2010 +0100| [f7a324a541aa8e382f0153932fb73969cc205911] | committer: Pierre d'Herbemont 

opengl: Supports OpenGL ES.

Signed-off-by: Pierre d'Herbemont <pdherbemont at free.fr>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f7a324a541aa8e382f0153932fb73969cc205911
---

 modules/video_output/opengl.h |  135 +++++++++++++++++++++++++++++++----------
 1 files changed, 102 insertions(+), 33 deletions(-)

diff --git a/modules/video_output/opengl.h b/modules/video_output/opengl.h
index c54258f..de581b1 100644
--- a/modules/video_output/opengl.h
+++ b/modules/video_output/opengl.h
@@ -30,7 +30,16 @@
 #include <vlc_picture_pool.h>
 #include <vlc_vout_opengl.h>
 
-#ifdef __APPLE__
+// Define USE_OPENGL_ES to the GL ES Version you want to select
+
+#if USE_OPENGL_ES == 1
+# include <OpenGLES/ES1/gl.h>
+# include <OpenGLES/ES1/glext.h>
+#elif USE_OPENGL_ES == 2
+# include <OpenGLES/ES2/gl.h>
+# include <OpenGLES/ES2/glext.h>
+#elif defindef(__APPLE__)
+# define MACOS_OPENGL
 # include <OpenGL/gl.h>
 # include <OpenGL/glext.h>
 #else
@@ -51,7 +60,21 @@
 # define GL_CLAMP_TO_EDGE 0x812F
 #endif
 
-#ifdef __APPLE__
+
+#if USE_OPENGL_ES
+# define VLCGL_TARGET GL_TEXTURE_2D
+
+# define VLCGL_RGB_FORMAT GL_RGB
+# define VLCGL_RGB_TYPE   GL_UNSIGNED_SHORT_5_6_5
+
+// Use RGB with OpenGLES
+# define VLCGL_FORMAT VLCGL_RGB_FORMAT
+# define VLCGL_TYPE   VLCGL_RGB_TYPE
+
+# define VLCGL_TEXTURE_COUNT (1)
+
+#elif defined(MACOS_OPENGL)
+
 /* On OS X, use GL_TEXTURE_RECTANGLE_EXT instead of GL_TEXTURE_2D.
    This allows sizes which are not powers of 2 */
 # define VLCGL_TARGET GL_TEXTURE_RECTANGLE_EXT
@@ -91,7 +114,7 @@ static inline int GetAlignedSize(int i_size)
 }
 
 typedef struct {
-	vout_opengl_t  *gl;
+    vout_opengl_t  *gl;
 
     video_format_t fmt;
 
@@ -109,7 +132,7 @@ static int vout_display_opengl_Init(vout_display_opengl_t *vgl,
                                     video_format_t *fmt,
                                     vout_opengl_t *gl)
 {
-	vgl->gl = gl;
+    vgl->gl = gl;
 
     /* Find the chroma we will use and update fmt */
     /* TODO: We use YCbCr on Mac which is Y422, but on OSX it seems to == YUY2. Verify */
@@ -161,23 +184,44 @@ static int vout_display_opengl_Init(vout_display_opengl_t *vgl,
 
     vgl->fmt = *fmt;
 
-    /* Texture size */
-#ifdef __APPLE__
-    vgl->tex_width  = fmt->i_width;
-    vgl->tex_height = fmt->i_height;
-#else
-    /* A texture must have a size aligned on a power of 2 */
-    vgl->tex_width  = GetAlignedSize(fmt->i_width);
-    vgl->tex_height = GetAlignedSize(fmt->i_height);
-#endif
-
     /* */
-	for (int i = 0; i < VLCGL_TEXTURE_COUNT; i++) {
-		vgl->texture[i] = 0;
-		vgl->buffer[i]  = NULL;
-	}
+    for (int i = 0; i < VLCGL_TEXTURE_COUNT; i++) {
+        vgl->texture[i] = 0;
+        vgl->buffer[i]  = NULL;
+    }
     vgl->pool = NULL;
 
+    bool supports_npot = false;
+#if USE_OPENGL_ES == 2
+    supports_npot = true;
+#elif defined(MACOS_OPENGL)
+    supports_npot = true;
+#endif
+
+#if defined(__APPLE__) && USE_OPENGL_ES == 1
+    if (!vout_opengl_Lock(vgl->gl)) {
+        const char* extensions = (char*) glGetString(GL_EXTENSIONS);
+        if (extensions) {
+            bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0;
+            if (npot)
+                supports_npot = true;
+        }
+        vout_opengl_Unlock(vgl->gl);
+    }
+#endif
+
+    /* Texture size */
+    if (supports_npot) {
+        vgl->tex_width  = fmt->i_width;
+        vgl->tex_height = fmt->i_height;
+    }
+    else {
+        /* A texture must have a size aligned on a power of 2 */
+        vgl->tex_width  = GetAlignedSize(fmt->i_width);
+        vgl->tex_height = GetAlignedSize(fmt->i_height);
+    }
+
+
     /* */
     if (!vout_opengl_Lock(vgl->gl)) {
 
@@ -190,8 +234,9 @@ static int vout_display_opengl_Init(vout_display_opengl_t *vgl,
 
         vout_opengl_Unlock(vgl->gl);
     }
-	return VLC_SUCCESS;
+    return VLC_SUCCESS;
 }
+
 static void vout_display_opengl_Clean(vout_display_opengl_t *vgl)
 {
     /* */
@@ -221,18 +266,18 @@ static int vout_display_opengl_ResetTextures(vout_display_opengl_t *vgl)
     for (int i = 0; i < VLCGL_TEXTURE_COUNT; i++) {
         glBindTexture(VLCGL_TARGET, vgl->texture[i]);
 
+#if !USE_OPENGL_ES
         /* Set the texture parameters */
         glTexParameterf(VLCGL_TARGET, GL_TEXTURE_PRIORITY, 1.0);
-
-        glTexParameteri(VLCGL_TARGET, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-        glTexParameteri(VLCGL_TARGET, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+#endif
 
         glTexParameteri(VLCGL_TARGET, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
         glTexParameteri(VLCGL_TARGET, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+        glTexParameteri(VLCGL_TARGET, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameteri(VLCGL_TARGET, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
-        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-
-#ifdef __APPLE__
+#ifdef MACOS_OPENGL
         /* Tell the driver not to make a copy of the texture but to use
            our buffer */
         glEnable(GL_UNPACK_CLIENT_STORAGE_APPLE);
@@ -250,16 +295,18 @@ static int vout_display_opengl_ResetTextures(vout_display_opengl_t *vgl)
 #endif
 
         /* Call glTexImage2D only once, and use glTexSubImage2D later */
-        if (vgl->buffer[i])
-            glTexImage2D(VLCGL_TARGET, 0, 3, vgl->tex_width, vgl->tex_height,
-                         0, VLCGL_FORMAT, VLCGL_TYPE, vgl->buffer[i]);
+        if (vgl->buffer[i]) {
+            glTexImage2D(VLCGL_TARGET, 0, VLCGL_FORMAT, vgl->tex_width,
+                         vgl->tex_height, 0, VLCGL_FORMAT, VLCGL_TYPE,
+                         vgl->buffer[i]);
+        }
     }
 
     vout_opengl_Unlock(vgl->gl);
     return VLC_SUCCESS;
 }
 
-#ifdef __APPLE__
+#ifdef MACOS_OPENGL
 /* XXX See comment vout_display_opengl_Prepare */
 struct picture_sys_t {
     vout_display_opengl_t *vgl;
@@ -279,7 +326,6 @@ static int PictureLock(picture_t *picture)
 
     vout_display_opengl_t *vgl = picture->p_sys->vgl;
     if (!vout_opengl_Lock(vgl->gl)) {
-
         glBindTexture(VLCGL_TARGET, get_texture(picture));
         glTexSubImage2D(VLCGL_TARGET, 0, 0, 0,
                         vgl->fmt.i_width, vgl->fmt.i_height,
@@ -309,7 +355,7 @@ static picture_pool_t *vout_display_opengl_GetPool(vout_display_opengl_t *vgl)
 
         picture_resource_t rsc;
         memset(&rsc, 0, sizeof(rsc));
-#ifdef __APPLE__
+#ifdef MACOS_OPENGL
         rsc.p_sys = malloc(sizeof(*rsc.p_sys));
         if (rsc.p_sys)
         {
@@ -336,7 +382,7 @@ static picture_pool_t *vout_display_opengl_GetPool(vout_display_opengl_t *vgl)
     memset(&cfg, 0, sizeof(cfg));
     cfg.picture_count = i;
     cfg.picture = picture;
-#ifdef __APPLE__
+#ifdef MACOS_OPENGL
     cfg.lock = PictureLock;
     cfg.unlock = PictureUnlock;
 #endif
@@ -378,7 +424,7 @@ static int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
     if (vout_opengl_Lock(vgl->gl))
         return VLC_EGENERIC;
 
-#ifdef __APPLE__
+#ifdef MACOS_OPENGL
     /* Bind to the texture for drawing */
     glBindTexture(VLCGL_TARGET, get_texture(picture));
 #else
@@ -422,12 +468,35 @@ static int vout_display_opengl_Display(vout_display_opengl_t *vgl,
 
     glEnable(VLCGL_TARGET);
 
+#if USE_OPENGL_ES
+    static const GLfloat vertexCoord[] = {
+        -1.0f, -1.0f,
+         1.0f, -1.0f,
+        -1.0f,  1.0f,
+         1.0f,  1.0f,
+    };
+
+    const GLfloat textureCoord[8] = {
+        f_x,     f_height,
+        f_width, f_height,
+        f_x,     f_y,
+        f_width, f_y
+    };
+
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+    glVertexPointer(2, GL_FLOAT, 0, vertexCoord);
+    glTexCoordPointer(2, GL_FLOAT, 0, textureCoord);
+
+    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+#else
     glBegin(GL_POLYGON);
     glTexCoord2f(f_x,      f_y);      glVertex2f(-1.0,  1.0);
     glTexCoord2f(f_width,  f_y);      glVertex2f( 1.0,  1.0);
     glTexCoord2f(f_width,  f_height); glVertex2f( 1.0, -1.0);
     glTexCoord2f(f_x,      f_height); glVertex2f(-1.0, -1.0);
     glEnd();
+#endif
 
     glDisable(VLCGL_TARGET);
 



More information about the vlc-commits mailing list