Commit de198bc7 authored by Eric Petit's avatar Eric Petit

opengl.c, voutgl.m: restored smooth resizing on OS X

                     re-enabled OS X GL provider (QT output still default)
parent a272d13a
...@@ -55,11 +55,12 @@ ...@@ -55,11 +55,12 @@
struct vout_sys_t struct vout_sys_t
{ {
NSAutoreleasePool *o_pool; NSAutoreleasePool * o_pool;
VLCWindow * o_window; VLCWindow * o_window;
VLCGLView * o_glview; VLCGLView * o_glview;
vlc_bool_t b_saved_frame; vlc_bool_t b_saved_frame;
NSRect s_frame; NSRect s_frame;
vlc_bool_t * b_got_frame;
}; };
/***************************************************************************** /*****************************************************************************
...@@ -82,7 +83,6 @@ int E_(OpenVideoGL) ( vlc_object_t * p_this ) ...@@ -82,7 +83,6 @@ int E_(OpenVideoGL) ( vlc_object_t * p_this )
* - the green line is gone * - the green line is gone
* - other problems????? * - other problems?????
*/ */
return( 1 );
if( !CGDisplayUsesOpenGLAcceleration( kCGDirectMainDisplay ) ) if( !CGDisplayUsesOpenGLAcceleration( kCGDirectMainDisplay ) )
{ {
...@@ -176,6 +176,7 @@ int E_(OpenVideoGL) ( vlc_object_t * p_this ) ...@@ -176,6 +176,7 @@ int E_(OpenVideoGL) ( vlc_object_t * p_this )
} }
/* Spawn window */ /* Spawn window */
p_vout->p_sys->b_got_frame = VLC_FALSE;
p_vout->p_sys->o_window = [[VLCWindow alloc] initWithVout: p_vout p_vout->p_sys->o_window = [[VLCWindow alloc] initWithVout: p_vout
frame: nil]; frame: nil];
...@@ -279,6 +280,7 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) ...@@ -279,6 +280,7 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args )
static void Swap( vout_thread_t * p_vout ) static void Swap( vout_thread_t * p_vout )
{ {
p_vout->p_sys->b_got_frame = VLC_TRUE;
[[p_vout->p_sys->o_glview openGLContext] makeCurrentContext]; [[p_vout->p_sys->o_glview openGLContext] makeCurrentContext];
if( [p_vout->p_sys->o_glview lockFocusIfCanDraw] ) if( [p_vout->p_sys->o_glview lockFocusIfCanDraw] )
{ {
...@@ -349,7 +351,21 @@ static void Swap( vout_thread_t * p_vout ) ...@@ -349,7 +351,21 @@ static void Swap( vout_thread_t * p_vout )
} }
glViewport( ( bounds.size.width - x ) / 2, glViewport( ( bounds.size.width - x ) / 2,
( bounds.size.height - y ) / 2, x, y ); ( bounds.size.height - y ) / 2, x, y );
glClear( GL_COLOR_BUFFER_BIT );
if( p_vout->p_sys->b_got_frame )
{
/* Ask the opengl module to redraw */
vout_thread_t * p_parent;
p_parent = (vout_thread_t *) p_vout->p_parent;
if( p_parent && p_parent->pf_display )
{
p_parent->pf_display( p_parent, NULL );
}
}
else
{
glClear( GL_COLOR_BUFFER_BIT );
}
} }
- (void) drawRect: (NSRect) rect - (void) drawRect: (NSRect) rect
......
...@@ -451,19 +451,6 @@ static int Manage( vout_thread_t *p_vout ) ...@@ -451,19 +451,6 @@ static int Manage( vout_thread_t *p_vout )
static void Render( vout_thread_t *p_vout, picture_t *p_pic ) static void Render( vout_thread_t *p_vout, picture_t *p_pic )
{ {
vout_sys_t *p_sys = p_vout->p_sys; vout_sys_t *p_sys = p_vout->p_sys;
float f_width, f_height;
/* glTexCoord works differently with GL_TEXTURE_2D and
GL_TEXTURE_RECTANGLE_EXT */
#ifdef SYS_DARWIN
f_width = (float)p_vout->output.i_width;
f_height = (float)p_vout->output.i_height;
#else
f_width = (float)p_vout->output.i_width / p_sys->i_tex_width;
f_height = (float)p_vout->output.i_height / p_sys->i_tex_height;
#endif
glClear( GL_COLOR_BUFFER_BIT );
/* On Win32/GLX, we do this the usual way: /* On Win32/GLX, we do this the usual way:
+ Fill the buffer with new content, + Fill the buffer with new content,
...@@ -483,14 +470,53 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -483,14 +470,53 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic )
time. */ time. */
#ifdef SYS_DARWIN #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,
p_sys->i_tex_height, VLCGL_FORMAT, VLCGL_TYPE,
p_sys->pp_buffer[i_new_index] );
/* Bind to the previous texture for drawing */
glBindTexture( VLCGL_TARGET, p_sys->p_textures[p_sys->i_index] ); glBindTexture( VLCGL_TARGET, p_sys->p_textures[p_sys->i_index] );
#else
/* Switch buffers */
p_sys->i_index = i_new_index;
p_pic->p->p_pixels = p_sys->pp_buffer[p_sys->i_index];
#else
/* Update the texture */ /* Update the texture */
glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0,
p_vout->render.i_width, p_vout->render.i_height, p_vout->render.i_width, p_vout->render.i_height,
VLCGL_RGB_FORMAT, VLCGL_RGB_TYPE, p_sys->pp_buffer[0] ); VLCGL_RGB_FORMAT, VLCGL_RGB_TYPE, p_sys->pp_buffer[0] );
#endif #endif
}
/*****************************************************************************
* DisplayVideo: displays previously rendered output
*****************************************************************************/
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;
/* glTexCoord works differently with GL_TEXTURE_2D and
GL_TEXTURE_RECTANGLE_EXT */
#ifdef SYS_DARWIN
f_width = (float)p_vout->output.i_width;
f_height = (float)p_vout->output.i_height;
#else
f_width = (float)p_vout->output.i_width / p_sys->i_tex_width;
f_height = (float)p_vout->output.i_height / p_sys->i_tex_height;
#endif
/* Why drawing here and not in Render()? Because this way, the
OpenGL providers can call pf_display to force redraw. Currently,
the OS X provider uses it to get a smooth window resizing */
glClear( GL_COLOR_BUFFER_BIT );
if( p_sys->i_effect == OPENGL_EFFECT_NONE ) if( p_sys->i_effect == OPENGL_EFFECT_NONE )
{ {
...@@ -549,25 +575,6 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -549,25 +575,6 @@ static void Render( vout_thread_t *p_vout, picture_t *p_pic )
glDisable( VLCGL_TARGET ); glDisable( VLCGL_TARGET );
#ifdef SYS_DARWIN
/* Switch buffers */
p_sys->i_index = ( p_sys->i_index + 1 ) & 1;
p_pic->p->p_pixels = p_sys->pp_buffer[p_sys->i_index];
/* Update the texture */
glBindTexture( VLCGL_TARGET, p_sys->p_textures[p_sys->i_index] );
glTexSubImage2D( VLCGL_TARGET, 0, 0, 0, p_sys->i_tex_width,
p_sys->i_tex_height, VLCGL_FORMAT, VLCGL_TYPE,
p_sys->pp_buffer[p_sys->i_index] );
#endif
}
/*****************************************************************************
* DisplayVideo: displays previously rendered output
*****************************************************************************/
static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic )
{
vout_sys_t *p_sys = p_vout->p_sys;
p_sys->p_vout->pf_swap( p_sys->p_vout ); p_sys->p_vout->pf_swap( p_sys->p_vout );
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment