Bug fix for switching between openGL and cairo graphics contexts.

This commit is contained in:
Matthew Budd 2020-06-09 08:44:51 -04:00
parent 9db334275f
commit 3e2802a2de
3 changed files with 43 additions and 13 deletions

View File

@ -153,6 +153,8 @@ static int open_window(void)
{
printf("GLX Context Already Exists\n");
}
XFree(vi); vi = NULL;
glXMakeCurrent(dpy, win, glc);
genTextures();
@ -405,10 +407,10 @@ int init_gtk3_GLXContext( void )
printf("Error: XGetWindowAttributes failed\n");
return -1;
}
printf("XWinLocation: (%i,%i) \n", xattrb.x, xattrb.y );
printf("XWinSize: (%i x %i) \n", xattrb.width, xattrb.height );
printf("XWinDepth: %i \n", xattrb.depth );
printf("XWinVisual: %p \n", xattrb.visual );
//printf("XWinLocation: (%i,%i) \n", xattrb.x, xattrb.y );
//printf("XWinSize: (%i x %i) \n", xattrb.width, xattrb.height );
//printf("XWinDepth: %i \n", xattrb.depth );
//printf("XWinVisual: %p \n", xattrb.visual );
vi = glXChooseVisual(dpy, 0, att);
@ -430,6 +432,8 @@ int init_gtk3_GLXContext( void )
printf("Error: glXCreateContext Failed\n");
}
}
XFree(vi); vi = NULL;
glXMakeCurrent(dpy, win, glc);
genTextures();
@ -464,6 +468,11 @@ int destroy_gtk3_GLXContext(void)
printf("Destroying GLX Context\n");
glXDestroyContext(dpy, glc); glc = NULL;
}
if ( dpy != NULL )
{
XSync( dpy, False );
}
return 0;
}
//************************************************************************

View File

@ -84,6 +84,7 @@ unsigned int gtk_draw_area_width = NES_WIDTH;
unsigned int gtk_draw_area_height = NES_HEIGHT;
static GtkTreeStore *hotkey_store = NULL;
static cairo_surface_t *cairo_surface = NULL;
static cairo_pattern_t *cairo_pattern = NULL;
static int *cairo_pix_remapper = NULL;
static int numRendLines = 0;
static void cairo_recalc_mapper(void);
@ -3113,6 +3114,7 @@ static void transferPix2CairoSurface(void)
{
return;
}
//printf("Cairo Pixel ReMap\n");
cairo_surface_flush( cairo_surface );
if ( numRendLines != glx_shm->nrow )
@ -3135,7 +3137,7 @@ static void transferPix2CairoSurface(void)
if ( j < 0 )
{
p[i].u32 = 0;
p[i].u32 = 0xff000000;
}
else
{
@ -3144,9 +3146,13 @@ static void transferPix2CairoSurface(void)
p[i].u8[2] = g[j].u8[0];
p[i].u8[1] = g[j].u8[1];
p[i].u8[0] = g[j].u8[2];
p[i].u8[3] = g[j].u8[3];
p[i].u8[3] = 0xff; // Force Alpha to full
#else
p[i].u32 = g[j].u32;
// Big-Endian is untested.
p[i].u8[2] = g[j].u8[0];
p[i].u8[1] = g[j].u8[1];
p[i].u8[0] = g[j].u8[2];
p[i].u8[3] = 0xff; // Force Alpha to full
#endif
//p[i].u32 = 0xffffffff;
}
@ -3396,13 +3402,19 @@ static void cairo_handle_resize(void)
w = gtk_widget_get_allocated_width( evbox );
h = gtk_widget_get_allocated_height( evbox );
//cairo_surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, w, h );
cairo_surface = cairo_image_surface_create( CAIRO_FORMAT_RGB24, w, h );
cairo_surface = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, w, h );
//cairo_surface = cairo_image_surface_create( CAIRO_FORMAT_RGB24, w, h );
printf("Cairo Surface: %p \n", cairo_surface );
cairo_format = cairo_image_surface_get_format( cairo_surface );
if (cairo_pattern)
{
cairo_pattern_destroy (cairo_pattern); cairo_pattern = NULL;
}
cairo_pattern = cairo_pattern_create_for_surface( cairo_surface );
//printf("Cairo Format: %i \n", cairo_format );
cairo_recalc_mapper();
@ -3450,6 +3462,11 @@ void init_cairo_screen(void)
void destroy_cairo_screen(void)
{
if (cairo_pattern)
{
printf("Destroying Cairo Pattern\n");
cairo_pattern_destroy (cairo_pattern); cairo_pattern = NULL;
}
if (cairo_surface)
{
printf("Destroying Cairo Surface\n");
@ -3550,7 +3567,11 @@ static gboolean cairo_clear_cb (GtkWidget * widget, cairo_t * cr, gpointer data)
static gboolean cairo_draw_cb (GtkWidget * widget, cairo_t * cr, gpointer data)
{
cairo_set_source_surface (cr, cairo_surface, 0, 0);
//printf("Cairo Draw\n");
//cairo_clear_cb( widget, cr, data );
//cairo_surface_mark_dirty( cairo_surface );
//cairo_set_source_surface (cr, cairo_surface, 0, 0);
cairo_set_source (cr, cairo_pattern);
cairo_paint (cr);
return FALSE;

View File

@ -561,9 +561,9 @@ int main(int argc, char *argv[])
return(-1);
}
#ifdef OPENGL
SDL_GL_LoadLibrary(0);
#endif
//#ifdef OPENGL
// SDL_GL_LoadLibrary(0);
//#endif
// Initialize the configuration system
g_config = InitConfig();