]> git.sesse.net Git - vlc/blobdiff - modules/video_output/opengl.c
* backport of [11424]
[vlc] / modules / video_output / opengl.c
index 020059099a707d61b2eb1a9c1b1bbc0a2b7fbf18..336d4c66bd8ea852859fbecbc2afc78eaeae8587 100644 (file)
@@ -6,6 +6,7 @@
  *
  * Authors: Cyril Deguet <asmax@videolan.org>
  *          Gildas Bazin <gbazin@videolan.org>
+ *          Eric Petit <titer@m0k.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #define VLCGL_TYPE   VLCGL_RGB_TYPE
 #endif
 
+#ifndef GL_CLAMP_TO_EDGE
+#   define GL_CLAMP_TO_EDGE 0x812F
+#endif
+
 /* OpenGL effects */
 #define OPENGL_EFFECT_NONE             1
 #define OPENGL_EFFECT_CUBE             2
@@ -108,6 +113,9 @@ static char *ppsz_effects_text[] = {
         N_("None"), N_("Cube"), N_("Transparent Cube") };
 
 vlc_module_begin();
+    set_shortname( "OpenGL" );
+    set_category( CAT_VIDEO );
+    set_subcategory( SUBCAT_VIDEO_VOUT );
     set_description( _("OpenGL video output") );
 #ifdef SYS_DARWIN
     set_capability( "video output", 200 );
@@ -116,10 +124,10 @@ vlc_module_begin();
 #endif
     add_shortcut( "opengl" );
     add_float( "opengl-cube-speed", 2.0, NULL, SPEED_TEXT,
-                    SPEED_LONGTEXT, VLC_FALSE );
+                    SPEED_LONGTEXT, VLC_TRUE );
     set_callbacks( CreateVout, DestroyVout );
     add_string( "opengl-effect", "none", NULL, EFFECT_TEXT,
-                 EFFECT_LONGTEXT, VLC_TRUE );
+                 EFFECT_LONGTEXT, VLC_FALSE );
         change_string_list( ppsz_effects, ppsz_effects_text, 0 );
 vlc_module_end();
 
@@ -310,6 +318,13 @@ static int Init( vout_thread_t *p_vout )
 
     I_OUTPUTPICTURES = 1;
 
+    if( p_sys->p_vout->pf_lock &&
+        p_sys->p_vout->pf_lock( p_sys->p_vout ) )
+    {
+        msg_Warn( p_vout, "could not lock OpenGL provider" );
+        return 0;
+    }
+
     InitTextures( p_vout );
 
     glDisable(GL_BLEND);
@@ -359,6 +374,11 @@ static int Init( vout_thread_t *p_vout )
         glTranslatef( 0.0, 0.0, - 5.0 );
     }
 
+    if( p_sys->p_vout->pf_unlock )
+    {
+        p_sys->p_vout->pf_unlock( p_sys->p_vout );
+    }
+
     return 0;
 }
 
@@ -367,8 +387,22 @@ static int Init( vout_thread_t *p_vout )
  *****************************************************************************/
 static void End( vout_thread_t *p_vout )
 {
+    vout_sys_t *p_sys = p_vout->p_sys;
+
+    if( p_sys->p_vout->pf_lock &&
+        p_sys->p_vout->pf_lock( p_sys->p_vout ) )
+    {
+        msg_Warn( p_vout, "could not lock OpenGL provider" );
+        return;
+    }
+
     glFinish();
     glFlush();
+
+    if( p_sys->p_vout->pf_unlock )
+    {
+        p_sys->p_vout->pf_unlock( p_sys->p_vout );
+    }
 }
 
 /*****************************************************************************
@@ -410,6 +444,13 @@ static int Manage( vout_thread_t *p_vout )
     p_vout->i_changes = p_sys->p_vout->i_changes;
 
 #ifdef SYS_DARWIN
+    if( p_sys->p_vout->pf_lock &&
+        p_sys->p_vout->pf_lock( p_sys->p_vout ) )
+    {
+        msg_Warn( p_vout, "could not lock OpenGL provider" );
+        return i_ret;
+    }
+
     /* On OS X, we create the window and the GL view when entering
        fullscreen - the textures have to be inited again */
     if( i_fullscreen_change )
@@ -441,6 +482,11 @@ static int Manage( vout_thread_t *p_vout )
             glTranslatef( 0.0, 0.0, - 5.0 );
         }
     }
+
+    if( p_sys->p_vout->pf_unlock )
+    {
+        p_sys->p_vout->pf_unlock( p_sys->p_vout );
+    }
 #endif
 
     return i_ret;
@@ -470,10 +516,18 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic )
        OS X, we first render, then reload the texture to be used next
        time. */
 
+    if( p_sys->p_vout->pf_lock &&
+        p_sys->p_vout->pf_lock( p_sys->p_vout ) )
+    {
+        msg_Warn( p_vout, "could not lock OpenGL provider" );
+        return;
+    }
+
 #ifdef SYS_DARWIN
     int i_new_index;
     i_new_index = ( p_sys->i_index + 1 ) & 1;
 
+
     /* Update the texture */
     glBindTexture( VLCGL_TARGET, p_sys->p_textures[i_new_index] );
     glTexSubImage2D( VLCGL_TARGET, 0, 0, 0, p_sys->i_tex_width,
@@ -493,6 +547,11 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic )
                      p_vout->render.i_width, p_vout->render.i_height,
                      VLCGL_RGB_FORMAT, VLCGL_RGB_TYPE, p_sys->pp_buffer[0] );
 #endif
+
+    if( p_sys->p_vout->pf_unlock )
+    {
+        p_sys->p_vout->pf_unlock( p_sys->p_vout );
+    }
 }
 
 /*****************************************************************************
@@ -503,6 +562,13 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
     vout_sys_t *p_sys = p_vout->p_sys;
     float f_width, f_height;
 
+    if( p_sys->p_vout->pf_lock &&
+        p_sys->p_vout->pf_lock( p_sys->p_vout ) )
+    {
+        msg_Warn( p_vout, "could not lock OpenGL provider" );
+        return;
+    }
+
     /* glTexCoord works differently with GL_TEXTURE_2D and
        GL_TEXTURE_RECTANGLE_EXT */
 #ifdef SYS_DARWIN
@@ -577,6 +643,11 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
     glDisable( VLCGL_TARGET );
 
     p_sys->p_vout->pf_swap( p_sys->p_vout );
+
+    if( p_sys->p_vout->pf_unlock )
+    {
+        p_sys->p_vout->pf_unlock( p_sys->p_vout );
+    }
 }
 
 int GetAlignedSize( int i_size )
@@ -597,10 +668,17 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args )
 {
     vout_sys_t *p_sys = p_vout->p_sys;
 
-    if( p_sys->p_vout->pf_control )
-        return p_sys->p_vout->pf_control( p_sys->p_vout, i_query, args );
-    else
+    switch( i_query )
+    {
+    case VOUT_SNAPSHOT:
         return vout_vaControlDefault( p_vout, i_query, args );
+
+    default:
+        if( p_sys->p_vout->pf_control )
+            return p_sys->p_vout->pf_control( p_sys->p_vout, i_query, args );
+        else
+            return vout_vaControlDefault( p_vout, i_query, args );
+    }
 }
 
 static int InitTextures( vout_thread_t *p_vout )
@@ -621,8 +699,8 @@ static int InitTextures( vout_thread_t *p_vout )
         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 );
-        glTexParameteri( VLCGL_TARGET, GL_TEXTURE_WRAP_T, GL_CLAMP );
+        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 );