opengl (disabled) for hardware zoom / rot / etc...

This commit is contained in:
damdoum 2007-02-04 22:46:29 +00:00
parent 24356e4948
commit b9e2d6a8fc
8 changed files with 184 additions and 39 deletions

View File

@ -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

View File

@ -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);

View File

@ -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<RAW_H; y++) {
for (y=0; y<RAW_H*2; y++) {
for (x=0; x<RAW_W; x++) {
image[y][x] = pix_col_map[*pixel&0x07FFF];
pixel++;
@ -127,42 +132,167 @@ void decode_screen () {
/* load pixels in buffer accordingly */
if (ScreenRotate) {
W=RAW_H/2; H=RAW_W;
LOOP(x=RAW_W-1, x >= 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());
}

View File

@ -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);

View File

@ -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);
}

View File

@ -1055,7 +1055,7 @@
<property name="height_request">192</property>
<property name="visible">True</property>
<property name="events">GDK_EXPOSURE_MASK</property>
<signal name="realize" handler="on_wDraw_Main_realize" last_modification_time="Tue, 02 Jan 2007 10:27:08 GMT"/>
<signal name="realize" handler="on_wDraw_Main_realize" after="yes" last_modification_time="Tue, 02 Jan 2007 10:27:08 GMT"/>
<signal name="expose_event" handler="on_wDraw_Main_expose_event" last_modification_time="Tue, 02 Jan 2007 10:27:18 GMT"/>
</widget>
<packing>
@ -1219,7 +1219,7 @@
<property name="height_request">192</property>
<property name="visible">True</property>
<property name="events">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</property>
<signal name="realize" handler="on_wDraw_Sub_realize" last_modification_time="Tue, 02 Jan 2007 10:27:45 GMT"/>
<signal name="realize" handler="on_wDraw_Sub_realize" after="yes" last_modification_time="Tue, 02 Jan 2007 10:27:45 GMT"/>
<signal name="expose_event" handler="on_wDraw_Sub_expose_event" last_modification_time="Tue, 02 Jan 2007 10:27:52 GMT"/>
<signal name="button_press_event" handler="on_wDraw_Sub_button_press_event" last_modification_time="Tue, 02 Jan 2007 10:28:11 GMT"/>
<signal name="button_release_event" handler="on_wDraw_Sub_button_release_event" last_modification_time="Tue, 02 Jan 2007 10:28:18 GMT"/>

View File

@ -32,8 +32,17 @@
//#include <libgen.h>
#include <unistd.h>
#include <SDL.h>
//#include <SDL/SDL.h>
// more portable
#include "SDL.h"
#ifdef HAVE_LIBGDKGLEXT_X11_1_0
#include <GL/gl.h>
#include <gdk/gdkgl.h>
#include <gtk/gtkglwidget.h>
#endif
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <gdk/gdkkeysyms.h>
#include <glade/glade.h>

View File

@ -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);