diff --git a/src/drivers/sdl/glxwin.cpp b/src/drivers/sdl/glxwin.cpp index 6e496dfe..0ee7a691 100644 --- a/src/drivers/sdl/glxwin.cpp +++ b/src/drivers/sdl/glxwin.cpp @@ -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; } //************************************************************************ diff --git a/src/drivers/sdl/gui.cpp b/src/drivers/sdl/gui.cpp index 90e006ac..0c1ab7fc 100644 --- a/src/drivers/sdl/gui.cpp +++ b/src/drivers/sdl/gui.cpp @@ -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; diff --git a/src/drivers/sdl/sdl.cpp b/src/drivers/sdl/sdl.cpp index 2e8beda7..137a1deb 100644 --- a/src/drivers/sdl/sdl.cpp +++ b/src/drivers/sdl/sdl.cpp @@ -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();