Commit 5dca2e33 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Use a framebuffer whose visual matches that of the window - refs #1672

This might fix the X_GLXCreateWindow BadMatch error. I cannot reproduce
it, so I cannot confirm this.
parent a39cf798
...@@ -233,9 +233,9 @@ int InitGLX12( vout_thread_t *p_vout ) ...@@ -233,9 +233,9 @@ int InitGLX12( vout_thread_t *p_vout )
int InitGLX13( vout_thread_t *p_vout ) int InitGLX13( vout_thread_t *p_vout )
{ {
vout_sys_t *p_sys = p_vout->p_sys; vout_sys_t *p_sys = p_vout->p_sys;
int i_nbelem; int i_nb, ret = VLC_EGENERIC;
GLXFBConfig *p_fbconfs, fbconf; GLXFBConfig *p_fbconfs = NULL, fbconf;
XVisualInfo *p_vi; XWindowAttributes att;
static const int p_attr[] = { static const int p_attr[] = {
GLX_RED_SIZE, 5, GLX_GREEN_SIZE, 5, GLX_BLUE_SIZE, 5, GLX_RED_SIZE, 5, GLX_GREEN_SIZE, 5, GLX_BLUE_SIZE, 5,
GLX_DOUBLEBUFFER, True, GLX_X_RENDERABLE, True, GLX_DOUBLEBUFFER, True, GLX_X_RENDERABLE, True,
...@@ -244,23 +244,36 @@ int InitGLX13( vout_thread_t *p_vout ) ...@@ -244,23 +244,36 @@ int InitGLX13( vout_thread_t *p_vout )
}; };
/* Get the FB configuration */ /* Get the FB configuration */
p_fbconfs = glXChooseFBConfig( p_sys->p_display, p_sys->i_screen, p_attr, &i_nbelem ); p_fbconfs = glXChooseFBConfig( p_sys->p_display, p_sys->i_screen, p_attr, &i_nb );
if( p_fbconfs == NULL ) if( p_fbconfs == NULL )
{ {
msg_Err( p_vout, "Cannot get FB configurations"); msg_Err( p_vout, "Cannot get FB configurations");
return VLC_EGENERIC; return VLC_EGENERIC;
} }
fbconf = p_fbconfs[0];
/* Get the X11 visual */ /* We should really create the window _after_ the frame buffer
p_vi = glXGetVisualFromFBConfig( p_sys->p_display, fbconf ); * configuration was chosen, instead of selecting the frame buffer from
if( !p_vi ) * the window. That requires reworking xcommon.c though.
* -- Courmisch */
XGetWindowAttributes( p_sys->p_display, p_sys->p_win->video_window, &att );
for( int i = 0; i < i_nb && !fbconf; i++ )
{ {
msg_Err( p_vout, "Cannot get X11 visual" ); XVisualInfo *p_vi;
XFree( p_fbconfs );
return VLC_EGENERIC; /* Get the X11 visual */
p_vi = glXGetVisualFromFBConfig( p_sys->p_display, p_fbconfs[i] );
if( !p_vi )
continue; /* OoM? */
if( p_vi->visualid == att.visual->visualid )
fbconf = p_fbconfs[i];
XFree( p_vi );
}
if( !fbconf )
{
msg_Err( p_vout, "Cannot find matching frame buffer" );
goto out;
} }
XFree( p_vi );
/* Create the GLX window */ /* Create the GLX window */
p_sys->gwnd = glXCreateWindow( p_sys->p_display, fbconf, p_sys->gwnd = glXCreateWindow( p_sys->p_display, fbconf,
...@@ -268,21 +281,20 @@ int InitGLX13( vout_thread_t *p_vout ) ...@@ -268,21 +281,20 @@ int InitGLX13( vout_thread_t *p_vout )
if( p_sys->gwnd == None ) if( p_sys->gwnd == None )
{ {
msg_Err( p_vout, "Cannot create GLX window" ); msg_Err( p_vout, "Cannot create GLX window" );
XFree( p_fbconfs ); goto out;
return VLC_EGENERIC;
} }
/* Create an OpenGL context */ /* Create an OpenGL context */
p_sys->gwctx = glXCreateNewContext( p_sys->p_display, fbconf, p_sys->gwctx = glXCreateNewContext( p_sys->p_display, fbconf,
GLX_RGBA_TYPE, NULL, True ); GLX_RGBA_TYPE, NULL, True );
XFree( p_fbconfs );
if( !p_sys->gwctx ) if( !p_sys->gwctx )
{
msg_Err( p_vout, "Cannot create OpenGL context"); msg_Err( p_vout, "Cannot create OpenGL context");
return VLC_EGENERIC; else
} ret = VLC_SUCCESS;
return VLC_SUCCESS; out:
XFree( p_fbconfs );
return ret;
} }
/***************************************************************************** /*****************************************************************************
......
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