From c2a322e48f8a01ca6506d5be925a68145a70f29e Mon Sep 17 00:00:00 2001 From: Matthew Budd Date: Fri, 14 Aug 2020 20:42:54 -0400 Subject: [PATCH] Updated GTK GUI GLX window / context setup to better match glx code from snes9x GTK backend. --- src/drivers/sdl/glxwin.cpp | 80 +++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 6 deletions(-) diff --git a/src/drivers/sdl/glxwin.cpp b/src/drivers/sdl/glxwin.cpp index 228f5d25..8576144b 100644 --- a/src/drivers/sdl/glxwin.cpp +++ b/src/drivers/sdl/glxwin.cpp @@ -89,8 +89,14 @@ static void getAttrbList( GLint *buf ) int i=0; buf[i] = GLX_RGBA; i++; - buf[i] = GLX_DEPTH_SIZE; i++; - buf[i] = 24; i++; + //buf[i] = GLX_DEPTH_SIZE; i++; + //buf[i] = 24; i++; + buf[i] = GLX_RED_SIZE; i++; + buf[i] = 8; i++; + buf[i] = GLX_GREEN_SIZE; i++; + buf[i] = 8; i++; + buf[i] = GLX_BLUE_SIZE; i++; + buf[i] = 8; i++; if ( double_buffer_ena ) { @@ -392,6 +398,7 @@ int spawn_glxwin( int flags ) //************************************************************************ int init_gtk3_GLXContext( int flags ) { + int screenNumber; GLint att[32]; XWindowAttributes xattrb; @@ -410,12 +417,20 @@ int init_gtk3_GLXContext( int flags ) printf("Error: Failed to obtain gdkWindow Handle for evbox widget\n"); return -1; } + if (!GDK_IS_X11_WINDOW (gdkWin)) + { + printf("Error: GDK Window is not of X11 Type\n"); + return -1; + } + GdkDisplay *gdk_display = gdk_window_get_display (gdkWin); + GdkScreen *gdk_screen = gdk_window_get_screen (gdkWin); + screenNumber = gdk_x11_screen_get_screen_number (gdk_screen); + dpy = GDK_DISPLAY_XDISPLAY( gdk_display ); + win = GDK_WINDOW_XID( gdkWin ); root = GDK_ROOT_WINDOW(); - dpy = gdk_x11_get_default_xdisplay(); - if ( dpy == NULL ) { printf("Error: Failed to obtain X Display Handle for evbox widget\n"); @@ -431,16 +446,64 @@ int init_gtk3_GLXContext( int flags ) //printf("XWinSize: (%i x %i) \n", xattrb.width, xattrb.height ); //printf("XWinDepth: %i \n", xattrb.depth ); //printf("XWinVisual: %p \n", xattrb.visual ); + printf("XScreenNumber: %i \n", screenNumber ); - vi = glXChooseVisual(dpy, 0, att); + vi = glXChooseVisual(dpy, screenNumber, att); if (vi == NULL) { printf("\n\tno appropriate visual found\n\n"); exit(0); } - else { + else + { + int val; printf("\n\tvisual %p selected\n", (void *)vi->visualid); /* %p creates hexadecimal output like in glxinfo */ + + if ( glXGetConfig( dpy, vi, GLX_RGBA, &val ) == 0 ) + { + printf("GLX_RGBA: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_USE_GL, &val ) == 0 ) + { + printf("GLX_USE_GL: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_LEVEL, &val ) == 0 ) + { + printf("GLX_LEVEL: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_BUFFER_SIZE, &val ) == 0 ) + { + printf("GLX_BUFFER_SIZE: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_DOUBLEBUFFER, &val ) == 0 ) + { + printf("GLX_DOUBLEBUFFER: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_RED_SIZE, &val ) == 0 ) + { + printf("GLX_RED_SIZE: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_GREEN_SIZE, &val ) == 0 ) + { + printf("GLX_GREEN_SIZE: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_BLUE_SIZE, &val ) == 0 ) + { + printf("GLX_BLUE_SIZE: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_ALPHA_SIZE, &val ) == 0 ) + { + printf("GLX_ALPHA_SIZE: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_DEPTH_SIZE, &val ) == 0 ) + { + printf("GLX_DEPTH_SIZE: %i \n", val ); + } + if ( glXGetConfig( dpy, vi, GLX_STENCIL_SIZE, &val ) == 0 ) + { + printf("GLX_STENCIL_SIZE: %i \n", val ); + } } if ( glc == NULL ) @@ -454,6 +517,11 @@ int init_gtk3_GLXContext( int flags ) } XFree(vi); vi = NULL; + if ( glc == NULL ) + { + return -1; + } + glXMakeCurrent(dpy, win, glc); genTextures( flags & GLXWIN_PIXEL_LINEAR_FILTER ? 1 : 0 );