+ (Thanks to gcc from the Arstechnica forums for the tip)
+
+ Therefore, we have to use two buffers and textures. On Win32/GLX,
+ we reload the texture to be displayed and use it right away. On
+ 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 __APPLE__
+ 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_vout->fmt_out.i_width,
+ p_vout->fmt_out.i_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] );
+
+ /* 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 */
+ glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0,
+ p_vout->fmt_out.i_width,
+ p_vout->fmt_out.i_height,
+ VLCGL_FORMAT, VLCGL_TYPE, p_sys->pp_buffer[0] );
+#endif
+
+ if( p_sys->p_vout->pf_unlock )
+ {
+ p_sys->p_vout->pf_unlock( p_sys->p_vout );
+ }
+}
+
+/*****************************************************************************
+ * 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, f_x, f_y;
+
+ 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 __APPLE__
+ f_x = (float)p_vout->fmt_out.i_x_offset;
+ f_y = (float)p_vout->fmt_out.i_y_offset;
+ f_width = (float)p_vout->fmt_out.i_x_offset +
+ (float)p_vout->fmt_out.i_visible_width;
+ f_height = (float)p_vout->fmt_out.i_y_offset +
+ (float)p_vout->fmt_out.i_visible_height;
+#else
+ f_x = (float)p_vout->fmt_out.i_x_offset / p_sys->i_tex_width;
+ f_y = (float)p_vout->fmt_out.i_y_offset / p_sys->i_tex_height;
+ f_width = ( (float)p_vout->fmt_out.i_x_offset +
+ p_vout->fmt_out.i_visible_width ) / p_sys->i_tex_width;
+ f_height = ( (float)p_vout->fmt_out.i_y_offset +
+ p_vout->fmt_out.i_visible_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 );