From b9e2d6a8fc096915ae5a048d3a098405ab32dc59 Mon Sep 17 00:00:00 2001 From: damdoum Date: Sun, 4 Feb 2007 22:46:29 +0000 Subject: [PATCH] opengl (disabled) for hardware zoom / rot / etc... --- desmume/src/gtk-glade/Makefile.am | 4 +- desmume/src/gtk-glade/callbacks.c | 2 +- desmume/src/gtk-glade/callbacks_IO.c | 164 ++++++++++++++++-- desmume/src/gtk-glade/callbacks_IO.h | 3 + .../gtk-glade/dTools/callbacks_3_palview.c | 24 +-- desmume/src/gtk-glade/glade/DeSmuMe.glade | 4 +- desmume/src/gtk-glade/globals.h | 11 +- desmume/src/gtk-glade/main.c | 11 +- 8 files changed, 184 insertions(+), 39 deletions(-) diff --git a/desmume/src/gtk-glade/Makefile.am b/desmume/src/gtk-glade/Makefile.am index 1eb42f20c..d70ae33fd 100644 --- a/desmume/src/gtk-glade/Makefile.am +++ b/desmume/src/gtk-glade/Makefile.am @@ -7,6 +7,6 @@ desmume_glade_SOURCES = \ dTools/callbacks_3_palview.c dTools/callbacks_dtools.h \ dTools/dTools_display.h \ ../sndsdl.h ../sndsdl.c ../ctrlssdl.h ../ctrlssdl.c -desmume_glade_LDADD = ../libdesmume.a $(SDL_LIBS) $(LIBGLADE_LIBS) -desmume_glade_CFLAGS = $(SDL_CFLAGS) $(LIBGLADE_CFLAGS) +desmume_glade_LDADD = ../libdesmume.a $(SDL_LIBS) $(GDKGLEXT_LIBS) $(LIBGLADE_LIBS) +desmume_glade_CFLAGS = $(SDL_CFLAGS) $(GDKGLEXT_CFLAGS) $(LIBGLADE_CFLAGS) desmume_glade_LDFLAGS = -rdynamic diff --git a/desmume/src/gtk-glade/callbacks.c b/desmume/src/gtk-glade/callbacks.c index 2cd2004e3..9434131bb 100755 --- a/desmume/src/gtk-glade/callbacks.c +++ b/desmume/src/gtk-glade/callbacks.c @@ -352,7 +352,7 @@ void on_wgt_Exec_toggled (GtkToggleToolButton *toggletoolbutton, gpointer user /* LAYERS ***** ***** ***** ***** */ -void change_bgx_layer(int layer, gboolean state, Screen scr) { +void change_bgx_layer(int layer, gboolean state, NDS_Screen scr) { //if(!desmume_running()) return; if(state==TRUE) { if (!scr.gpu->dispBG[layer]) GPU_addBack(scr.gpu, layer); diff --git a/desmume/src/gtk-glade/callbacks_IO.c b/desmume/src/gtk-glade/callbacks_IO.c index 889a4b54f..1f9c61faf 100755 --- a/desmume/src/gtk-glade/callbacks_IO.c +++ b/desmume/src/gtk-glade/callbacks_IO.c @@ -22,6 +22,10 @@ #include "callbacks_IO.h" +// uncomment this if you want to debug +// non working opengl +#undef HAVE_LIBGDKGLEXT_X11_1_0 + static u16 Cur_Keypad = 0; int ScreenCoeff_Size=1; gboolean ScreenRotate=FALSE; @@ -77,12 +81,13 @@ void init_pix_col_map() { } #define RAW_W 256 -#define RAW_H 192*2 +#define RAW_H 192 +#define RAW_OFFSET 256*192*sizeof(u16) #define MAX_SIZE 3 -u32 on_screen_image32[RAW_W*RAW_H*MAX_SIZE*MAX_SIZE]; +u32 on_screen_image32[RAW_W*RAW_H*2*MAX_SIZE*MAX_SIZE]; int inline screen_size() { - return RAW_W*RAW_H*ScreenCoeff_Size*ScreenCoeff_Size*sizeof(u32); + return RAW_W*RAW_H*2*ScreenCoeff_Size*ScreenCoeff_Size*sizeof(u32); } int inline offset_pixels_lower_screen() { return screen_size()/2; @@ -96,13 +101,13 @@ void black_screen () { void decode_screen () { int x,y, m, W,H,L,BL; - u32 image[RAW_H][RAW_W], pix; + u32 image[RAW_H*2][RAW_W], pix; u16 * pixel = (u16*)&GPU_screen; u32 * rgb32 = &on_screen_image32[0]; /* decode colors */ init_pix_col_map(); - for (y=0; y= 0, x--, y=0, y < W, y++) - LOOP(x=RAW_W-1, x >= 0, x--, y=W, y < RAW_H, y++) + W=RAW_H; H=RAW_W; + LOOP(x=RAW_W-1, x >= 0, x--, y=0, y < RAW_H, y++) + LOOP(x=RAW_W-1, x >= 0, x--, y=RAW_H, y < RAW_H*2, y++) } else { - H=RAW_H; W=RAW_W; - LOOP(y=0, y < RAW_H, y++, x=0, x < RAW_W, x++) - + H=RAW_H*2; W=RAW_W; + LOOP(y=0, y < RAW_H*2, y++, x=0, x < RAW_W, x++) } } -int screen (GtkWidget * widget, int offset_pix) { +int unrealized=2; + +gboolean screen (GtkWidget * widget, int offset_pix) { int H,W,L; +#ifndef HAVE_LIBGDKGLEXT_X11_1_0 if (ScreenRotate) { - W=RAW_H/2; H=RAW_W; + W=RAW_H; H=RAW_W; } else { - H=RAW_H/2; W=RAW_W; + H=RAW_H; W=RAW_W; } L=W*ScreenCoeff_Size*sizeof(u32); + gdk_draw_rgb_32_image (widget->window, widget->style->fg_gc[widget->state],0,0, W*ScreenCoeff_Size, H*ScreenCoeff_Size, GDK_RGB_DITHER_NONE,((guchar*)on_screen_image32)+offset_pix,L); +#else + GdkGLDrawable * my_glDrawable; + GdkGLContext * my_glContext; + + if (unrealized) return TRUE; + + my_glDrawable = gtk_widget_get_gl_drawable(widget); + my_glContext = gtk_widget_get_gl_context(widget); + + printf("%08X %08X\n", my_glDrawable, my_glContext); + if (!gdk_gl_drawable_gl_begin(my_glDrawable, my_glContext)) + return FALSE; + + printf("ok\n"); + + glLoadIdentity(); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - return 1; + glBegin(GL_QUADS); + glColor3ub(255,0,0); glVertex2d(-0.75,-0.75); + glColor3ub(128,255,0); glVertex2d(-0.75, 0.75); + glColor3ub(0,255,128); glVertex2d( 0.75, 0.75); + glColor3ub(0,0,255); glVertex2d( 0.75,-0.75); + glEnd(); + + glPixelZoom(1.0f * ScreenCoeff_Size, -1.0f * ScreenCoeff_Size); + + if (ScreenRotate) { + W=RAW_H; H=RAW_W; + glRotatef(90.0, 0.5, 0.5, 1.0); + glRasterPos2f(-1.0,1.0); +// glBitmap(0,0,0,0,-1.0,1.0,NULL); + glDrawPixels(RAW_W,RAW_H,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV,GPU_screen); + glRasterPos2f(0.0,1.0); +// glBitmap(0,0,0,0,0.0,1.0,NULL); + glDrawPixels(RAW_W,RAW_H,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV,GPU_screen+RAW_OFFSET); + } else { + H=RAW_H; W=RAW_W; + glRasterPos2f(-1.0,1.0); +// glBitmap(0,0,0,0,-1.0,1.0,NULL); + glDrawPixels(RAW_W,RAW_H,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV,GPU_screen); + glRasterPos2f(-1.0,0.0); +// glBitmap(0,0,0,0,-1.0,0.0,NULL); + glDrawPixels(RAW_W,RAW_H,GL_RGBA,GL_UNSIGNED_SHORT_1_5_5_5_REV,GPU_screen+RAW_OFFSET); + } + + if (gdk_gl_drawable_is_double_buffered (my_glDrawable)) + gdk_gl_drawable_swap_buffers (my_glDrawable); + else + glFlush (); + + gdk_gl_drawable_gl_end(my_glDrawable); +#endif + return TRUE; } +GdkGLContext * last_glContext=NULL; +void init_GL_capabilities(GtkWidget * widget) { +#ifdef HAVE_LIBGDKGLEXT_X11_1_0 + GdkGLConfig * my_glConfig; + my_glConfig = gdk_gl_config_new_by_mode ( + GDK_GL_MODE_RGB + | GDK_GL_MODE_DEPTH + | GDK_GL_MODE_DOUBLE + ); + if (!gtk_widget_set_gl_capability( + widget, + my_glConfig, + last_glContext, + TRUE, + GDK_GL_RGBA_TYPE)) { + printf ("YOU FAIL ! \n"); + gtk_main_quit(); + } + last_glContext = gtk_widget_get_gl_context(widget); +#endif +} + +void init_GL(GtkWidget * widget) { +#ifdef HAVE_LIBGDKGLEXT_X11_1_0 + GdkGLDrawable * my_glDrawable; + GdkGLContext * my_glContext; + + init_GL_capabilities(widget); + + my_glDrawable = gtk_widget_get_gl_drawable(widget); + my_glContext = gtk_widget_get_gl_context(widget); + + printf("%08X %08X\n", my_glDrawable, my_glContext); + if (!gdk_gl_drawable_gl_begin(my_glDrawable, my_glContext)) + return; + + printf("ok\n"); + + /* Set the background black */ + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); + /* Depth buffer setup */ + glClearDepth(1.0f); + + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + if (gdk_gl_drawable_is_double_buffered (my_glDrawable)) + gdk_gl_drawable_swap_buffers (my_glDrawable); + else + glFlush (); + glViewport (0, 0, + widget->allocation.width, widget->allocation.height); + gdk_gl_drawable_gl_end(my_glDrawable); +#endif +} + + /* OUTPUT UPPER SCREEN */ -void on_wDraw_Main_realize (GtkWidget *widget, gpointer user_data) { } +void on_wDraw_Main_realize (GtkWidget *widget, gpointer user_data) { + init_GL(widget); + unrealized--; +} + gboolean on_wDraw_Main_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { +#ifndef HAVE_LIBGDKGLEXT_X11_1_0 decode_screen(); +#endif return screen(widget, 0); } /* OUTPUT LOWER SCREEN */ -void on_wDraw_Sub_realize (GtkWidget *widget, gpointer user_data) { } +void on_wDraw_Sub_realize (GtkWidget *widget, gpointer user_data) { + init_GL(widget); + unrealized--; +} gboolean on_wDraw_Sub_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { return screen(widget, offset_pixels_lower_screen()); } diff --git a/desmume/src/gtk-glade/callbacks_IO.h b/desmume/src/gtk-glade/callbacks_IO.h index c8cd5d698..a2c7ad459 100755 --- a/desmume/src/gtk-glade/callbacks_IO.h +++ b/desmume/src/gtk-glade/callbacks_IO.h @@ -22,6 +22,9 @@ #include "globals.h" +void init_GL_capabilities(GtkWidget * widget); + + /* INPUT BUTTONS / KEYBOARD */ G_MODULE_EXPORT gboolean on_wMainW_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); G_MODULE_EXPORT gboolean on_wMainW_key_release_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data); diff --git a/desmume/src/gtk-glade/dTools/callbacks_3_palview.c b/desmume/src/gtk-glade/dTools/callbacks_3_palview.c index 82b83ab20..626a58ede 100755 --- a/desmume/src/gtk-glade/dTools/callbacks_3_palview.c +++ b/desmume/src/gtk-glade/dTools/callbacks_3_palview.c @@ -33,20 +33,20 @@ static u16 mem[0x100]; static COLOR c; static COLOR32 c32; -static GdkGC * GC; +static GdkGC * gdkGC; static inline void paint_col(int x, int y, u16 col) { c.val = col; COLOR_16_32(c,c32) - gdk_rgb_gc_set_foreground(GC, c32.val); - gdk_draw_rectangle(wPaint->window, GC, TRUE, x, y, 15, 15); + gdk_rgb_gc_set_foreground(gdkGC, c32.val); + gdk_draw_rectangle(wPaint->window, gdkGC, TRUE, x, y, 15, 15); } static inline void paint_cross(int x, int y) { - gdk_rgb_gc_set_foreground(GC, 0x808080); - gdk_draw_rectangle(wPaint->window, GC, TRUE, x, y, 15, 15); - gdk_rgb_gc_set_foreground(GC, 0xFF0000); - gdk_draw_line(wPaint->window, GC, x+14, y+1, x+1, y+14); - gdk_draw_line(wPaint->window, GC, x+1, y+1, x+14, y+14); + gdk_rgb_gc_set_foreground(gdkGC, 0x808080); + gdk_draw_rectangle(wPaint->window, gdkGC, TRUE, x, y, 15, 15); + gdk_rgb_gc_set_foreground(gdkGC, 0xFF0000); + gdk_draw_line(wPaint->window, gdkGC, x+14, y+1, x+1, y+14); + gdk_draw_line(wPaint->window, gdkGC, x+1, y+1, x+14, y+14); } @@ -54,7 +54,7 @@ static void wtools_3_update() { int i,x,y,X,Y; u16 * addr = base_addr[palindex], tmp; - GC = gdk_gc_new(wPaint->window); + gdkGC = gdk_gc_new(wPaint->window); if (addr) { memcpy(mem, addr, 0x100*sizeof(u16)); i=0; @@ -69,7 +69,7 @@ static void wtools_3_update() { for(x=X= 0; x < 16; x++,X+=16) paint_cross(X,Y); } - g_object_unref(GC); + g_object_unref(gdkGC); } @@ -77,7 +77,7 @@ static void refresh() { int x,y,X,Y; u16 * addr = base_addr[palindex]; COLOR c; COLOR32 c32; - GC = gdk_gc_new(wPaint->window); + gdkGC = gdk_gc_new(wPaint->window); if (addr) { memcpy(mem, addr, 0x100*sizeof(u16)); for(y=Y= 0; y < 16; y++,Y+=16) @@ -88,7 +88,7 @@ static void refresh() { for(x=X= 0; x < 16; x++,X+=16) paint_cross(X,Y); } - g_object_unref(GC); + g_object_unref(gdkGC); } diff --git a/desmume/src/gtk-glade/glade/DeSmuMe.glade b/desmume/src/gtk-glade/glade/DeSmuMe.glade index 7fb97f31b..3e1376457 100755 --- a/desmume/src/gtk-glade/glade/DeSmuMe.glade +++ b/desmume/src/gtk-glade/glade/DeSmuMe.glade @@ -1055,7 +1055,7 @@ 192 True GDK_EXPOSURE_MASK - + @@ -1219,7 +1219,7 @@ 192 True GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - + diff --git a/desmume/src/gtk-glade/globals.h b/desmume/src/gtk-glade/globals.h index 7826a6442..90c09b62d 100755 --- a/desmume/src/gtk-glade/globals.h +++ b/desmume/src/gtk-glade/globals.h @@ -32,8 +32,17 @@ //#include #include -#include +//#include +// more portable +#include "SDL.h" +#ifdef HAVE_LIBGDKGLEXT_X11_1_0 + #include + #include + #include +#endif + #include +#include #include #include diff --git a/desmume/src/gtk-glade/main.c b/desmume/src/gtk-glade/main.c index bba89a553..35747eeba 100755 --- a/desmume/src/gtk-glade/main.c +++ b/desmume/src/gtk-glade/main.c @@ -201,15 +201,17 @@ int WinMain () int main(int argc, char *argv[]) { const char *commandLine_File = NULL; + gtk_init(&argc, &argv); +#ifdef HAVE_LIBGDKGLEXT_X11_1_0 + gtk_gl_init(&argc, &argv); +#endif if(argc == 2) commandLine_File = argv[1]; - #ifdef DEBUG LogStart(); #endif init_keyvals(); - - gtk_init(&argc, &argv); + if(SDL_Init(SDL_INIT_VIDEO) == -1) { fprintf(stderr, "Error trying to initialize SDL: %s\n", @@ -229,7 +231,8 @@ int main(int argc, char *argv[]) { pWindow = glade_xml_get_widget(xml, "wMainW"); pDrawingArea = glade_xml_get_widget(xml, "wDraw_Main"); pDrawingArea2 = glade_xml_get_widget(xml, "wDraw_Sub"); - + + /* connect the signals in the interface */ glade_xml_signal_autoconnect(xml); glade_xml_signal_autoconnect(xml_tools);