macosx/vout* : OpenGL VRAM texturing finaly works correctly now.
authorEric Petit <titer@videolan.org>
Tue, 3 Feb 2004 13:00:27 +0000 (13:00 +0000)
committerEric Petit <titer@videolan.org>
Tue, 3 Feb 2004 13:00:27 +0000 (13:00 +0000)
AUTHORS
modules/gui/macosx/vout.h
modules/gui/macosx/vout.m

diff --git a/AUTHORS b/AUTHORS
index 76fbc14..6f97e93 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,4 +1,4 @@
-# $Id: AUTHORS,v 1.101 2004/01/05 12:37:52 jlj Exp $
+# $Id: AUTHORS,v 1.102 2004/02/03 13:00:27 titer Exp $
 # 
 # The format of this file was inspired by the Linux kernel CREDITS file.
 # Authors are listed alphabetically.
@@ -255,6 +255,7 @@ E: titer@videolan.org
 C: titer
 D: BeOS module fixes and enhancements
 D: Stream output
+D: Mac OS X OpenGL video output
 S: France
 
 N: Jean-Paul Saman
index c55b5fb..fc72e26 100644 (file)
@@ -2,11 +2,12 @@
  * vout.h: MacOS X interface module
  *****************************************************************************
  * Copyright (C) 2001-2003 VideoLAN
- * $Id: vout.h,v 1.21 2004/02/02 08:50:41 titer Exp $
+ * $Id: vout.h,v 1.22 2004/02/03 13:00:27 titer Exp $
  *
  * Authors: Colin Delacroix <colin@zoy.org>
  *          Florian G. Pflug <fgp@phlo.org>
  *          Jon Lech Johansen <jon-vl@nanocrew.net>
+ *          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
 {
     vout_thread_t * p_vout;
     int             b_init_done;
-    unsigned long   i_cur_texture;
+    unsigned long   i_texture;
     float           f_x;
     float           f_y;
 }
 
 - (id) initWithFrame: (NSRect) frame vout: (vout_thread_t*) p_vout;
 - (void) initTextures;
-- (void) reloadTexture: (picture_t *) p_pic;
+- (void) reloadTexture;
 
 @end
 
index de699e3..7ec30c6 100644 (file)
@@ -2,12 +2,13 @@
  * vout.m: MacOS X video output module
  *****************************************************************************
  * Copyright (C) 2001-2003 VideoLAN
- * $Id: vout.m,v 1.76 2004/02/02 08:50:41 titer Exp $
+ * $Id: vout.m,v 1.77 2004/02/03 13:00:27 titer Exp $
  *
  * Authors: Colin Delacroix <colin@zoy.org>
  *          Florian G. Pflug <fgp@phlo.org>
  *          Jon Lech Johansen <jon-vl@nanocrew.net>
  *          Derk-Jan Hartman <thedj@users.sourceforge.net>
+ *          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
@@ -291,7 +292,8 @@ static int vout_Init( vout_thread_t *p_vout )
     }
 
     /* Try to initialize up to QT_MAX_DIRECTBUFFERS direct buffers */
-    while( I_OUTPUTPICTURES < QT_MAX_DIRECTBUFFERS )
+    while( I_OUTPUTPICTURES <
+           p_vout->p_sys->i_opengl ? 1 : QT_MAX_DIRECTBUFFERS )
     {
         p_pic = NULL;
 
@@ -478,9 +480,11 @@ static void vout_Display( vout_thread_t *p_vout, picture_t *p_pic )
     {
         if( [p_vout->p_sys->o_glview lockFocusIfCanDraw] )
         {
-            [p_vout->p_sys->o_glview reloadTexture: p_pic];
+            /* Texture gotta be reload before the buffer is filled
+               (thanks to gcc from arstechnica forums) */
             [p_vout->p_sys->o_glview drawRect:
                 [p_vout->p_sys->o_glview bounds]];
+            [p_vout->p_sys->o_glview reloadTexture];
             [p_vout->p_sys->o_glview unlockFocus];
         }
     }
@@ -1330,70 +1334,51 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic )
 
 - (void) initTextures
 {
-    int    i;
-    GLuint pi_textures[QT_MAX_DIRECTBUFFERS];
-
     [[self openGLContext] makeCurrentContext];
 
     /* Create textures */
-    glGenTextures( QT_MAX_DIRECTBUFFERS, pi_textures );
-
-    for( i = 0; i < I_OUTPUTPICTURES; i++ )
-    {
-        glEnable( GL_TEXTURE_RECTANGLE_EXT );
-        glEnable( GL_UNPACK_CLIENT_STORAGE_APPLE );
-        glEnable( GL_APPLE_texture_range );
-
-        glBindTexture( GL_TEXTURE_RECTANGLE_EXT, pi_textures[i] );
-
-#if 0
-        FIXME: the lines below are supposed to avoid a memcpy and get
-        a noticeable performance boost, but they are annoying side
-        effects at the moment -- titer
-
-        /* Use AGP texturing */
-        glTextureRangeAPPLE( GL_TEXTURE_RECTANGLE_EXT, 0, NULL );
-        glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
-                GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_SHARED_APPLE );
-#endif
-
-        /* Tell the driver not to make a copy of the texture but to use
-           our buffer */
-        glPixelStorei( GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE );
-
-        /* Linear interpolation */
-        glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
-                GL_TEXTURE_MIN_FILTER, GL_LINEAR );
-        glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
-                GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-
-        /* I have no idea what this exactly does, but it seems to be
-           necessary for scaling */
-        glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
-                GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE );
-        glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
-                GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-        glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
-
-        glTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA,
-                p_vout->output.i_width, p_vout->output.i_height, 0,
-                GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE,
-                PP_OUTPUTPICTURE[i]->p_data );
-
-        PP_OUTPUTPICTURE[i]->p_sys = malloc( sizeof( GLuint ) );
-        *((GLuint*) PP_OUTPUTPICTURE[i]->p_sys) = pi_textures[i];
-    }
+    glGenTextures( 1, &i_texture );
+
+    glEnable( GL_TEXTURE_RECTANGLE_EXT );
+    glEnable( GL_UNPACK_CLIENT_STORAGE_APPLE );
+
+    glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_texture );
+
+    /* Use VRAM texturing */
+    glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+            GL_TEXTURE_STORAGE_HINT_APPLE, GL_STORAGE_CACHED_APPLE );
+
+    /* Tell the driver not to make a copy of the texture but to use
+       our buffer */
+    glPixelStorei( GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE );
+
+    /* Linear interpolation */
+    glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+            GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+    glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+            GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+
+    /* I have no idea what this exactly does, but it seems to be
+       necessary for scaling */
+    glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+            GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+    glTexParameteri( GL_TEXTURE_RECTANGLE_EXT,
+            GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+    glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
+
+    glTexImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA,
+            p_vout->output.i_width, p_vout->output.i_height, 0,
+            GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE,
+            PP_OUTPUTPICTURE[0]->p_data );
 
     b_init_done = 1;
 }
 
-- (void) reloadTexture: (picture_t *) p_pic
+- (void) reloadTexture
 {
-    i_cur_texture = *((GLuint*) p_pic->p_sys);
-    
     [[self openGLContext] makeCurrentContext];
 
-    glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_cur_texture );
+    glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_texture );
 
     /* glTexSubImage2D is faster than glTexImage2D
        http://developer.apple.com/samplecode/Sample_Code/Graphics_3D/
@@ -1401,7 +1386,7 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic )
     glTexSubImage2D( GL_TEXTURE_RECTANGLE_EXT, 0, 0, 0,
             p_vout->output.i_width, p_vout->output.i_height,
             GL_YCBCR_422_APPLE, GL_UNSIGNED_SHORT_8_8_APPLE,
-            p_pic->p_data );
+            PP_OUTPUTPICTURE[0]->p_data );
 }
 
 - (void) drawRect: (NSRect) rect
@@ -1425,7 +1410,7 @@ static void QTFreePicture( vout_thread_t *p_vout, picture_t *p_pic )
     }
 
     /* Draw a quad with our texture on it */
-    glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_cur_texture );
+    glBindTexture( GL_TEXTURE_RECTANGLE_EXT, i_texture );
     glBegin( GL_QUADS );
         /* Top left */
         glTexCoord2f( 0.0, 0.0 );