From 7420ed88b753badcdf51e9c9b731765658bde2c4 Mon Sep 17 00:00:00 2001 From: waker Date: Thu, 12 Apr 2012 19:34:13 +0200 Subject: experimented with vsync; fixed xlib include --- README | 3 ++- plugins/gtkui/gtkui.c | 1 + plugins/gtkui/gtkuigl.c | 2 ++ plugins/gtkui/gtkuigl.h | 12 ++++++++++++ plugins/gtkui/widgets.c | 38 +++++++++++++++++++++++++++++++++----- 5 files changed, 50 insertions(+), 6 deletions(-) diff --git a/README b/README index ddf83475..5f398756 100644 --- a/README +++ b/README @@ -37,13 +37,14 @@ full list of dependencies: libsndfile: for sndfile plugin libcdio + libcddb: for cd audio plugin ffmpeg (libavcodec + libavformat): for ffmpeg plugin - xlib: for global hotkeys + xlib: for global hotkeys and for gtkui opengl support dbus: for notification daemon support (OSD current song notifications) pulseaudio: for PulseAudio output plugin faad2: for AAC plugin zlib: for Audio Overload plugin (psf, psf2, etc), GME (for vgz) libzip: for vfs_zip plugin yasm: required to build assembly portions of ffap plugin on supported platforms (x86, x86_64) + gtkglext: for gtkui opengl support actual package names for your Linux distribution may vary. diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c index 25654d5e..e7555170 100644 --- a/plugins/gtkui/gtkui.c +++ b/plugins/gtkui/gtkui.c @@ -47,6 +47,7 @@ #include "gtkui_api.h" #include "wingeom.h" #include "widgets.h" +#include "X11/Xlib.h" #define trace(...) { fprintf(stderr, __VA_ARGS__); } //#define trace(fmt,...) diff --git a/plugins/gtkui/gtkuigl.c b/plugins/gtkui/gtkuigl.c index 9d8df7da..def1dcf3 100644 --- a/plugins/gtkui/gtkuigl.c +++ b/plugins/gtkui/gtkuigl.c @@ -22,6 +22,7 @@ #include "gtkuigl.h" static int gl_initialized; +//PFNGLXSWAPINTERVALSGIPROC glXSwapIntervalSGI; int gtkui_gl_init (void) { @@ -35,6 +36,7 @@ gtkui_gl_init (void) { if (!success) { return -1; } +// glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) glXGetProcAddressARB((const GLubyte*)"glXSwapIntervalSGI"); return 0; } diff --git a/plugins/gtkui/gtkuigl.h b/plugins/gtkui/gtkuigl.h index 17fda004..ddba54dd 100644 --- a/plugins/gtkui/gtkuigl.h +++ b/plugins/gtkui/gtkuigl.h @@ -20,5 +20,17 @@ #define __GTKUIGL_H #include +#include +#include +//#include +//#include +// +//#ifndef GLX_SGI_swap_control +//typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); +//#endif +//extern PFNGLXSWAPINTERVALSGIPROC glXSwapIntervalSGI; + +int +gtkui_gl_init (void); #endif diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c index 50b6eabf..dbdbd50b 100644 --- a/plugins/gtkui/widgets.c +++ b/plugins/gtkui/widgets.c @@ -20,8 +20,6 @@ #include #include #include -#include -#include #include "gtkui.h" #include "widgets.h" #include "ddbtabstrip.h" @@ -1754,6 +1752,9 @@ scope_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data GdkGLDrawable *d = gtk_widget_get_gl_drawable (widget); gdk_gl_drawable_gl_begin (d, w->glcontext); +// if (glXSwapIntervalSGI) { +// glXSwapIntervalSGI (1); +// } glClear (GL_COLOR_BUFFER_BIT); glMatrixMode (GL_PROJECTION); @@ -1761,6 +1762,28 @@ scope_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data gluOrtho2D(0,a.width,a.height,0); glMatrixMode (GL_MODELVIEW); glViewport (0, 0, a.width, a.height); + +#if 0 + // vsync test + static int box = 0; + static int speed = 5; + if (box > a.width-50) { + box = a.width-50; + speed = -5; + } + else if (box < 0) { + box = 0; + speed = 5; + } + box += speed; + + glBegin (GL_QUADS); + glVertex2f (box, 0); + glVertex2f (box+50, 0); + glVertex2f (box+50, 50); + glVertex2f (box, 50); + glEnd (); +#endif glBegin (GL_LINE_STRIP); short *samples = (short *)data; @@ -1778,6 +1801,13 @@ scope_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data gdk_gl_drawable_gl_end (d); } + else { + GdkGLDrawable *d = gtk_widget_get_gl_drawable (widget); + gdk_gl_drawable_gl_begin (d, w->glcontext); + glClear (GL_COLOR_BUFFER_BIT); + gdk_gl_drawable_swap_buffers (d); + gdk_gl_drawable_gl_end (d); + } return FALSE; @@ -1790,6 +1820,7 @@ scope_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data void w_scope_init (ddb_gtkui_widget_t *w) { w_scope_t *s = (w_scope_t *)w; + gtkui_gl_init (); if (s->drawtimer) { g_source_remove (s->drawtimer); } @@ -1800,7 +1831,6 @@ void scope_realize (GtkWidget *widget, gpointer data) { w_scope_t *w = data; w->glcontext = gtk_widget_create_gl_context (w->drawarea, NULL, TRUE, GDK_GL_RGBA_TYPE); - printf ("ctx: %p\n", w->glcontext); } ddb_gtkui_widget_t * @@ -1815,9 +1845,7 @@ w_scope_create (void) { int attrlist[] = {GDK_GL_ATTRIB_LIST_NONE}; GdkGLConfig *conf = gdk_gl_config_new_by_mode ((GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DOUBLE)); - printf ("conf: %p\n", conf); gboolean cap = gtk_widget_set_gl_capability (w->drawarea, conf, NULL, TRUE, GDK_GL_RGBA_TYPE); - printf ("cap: %d\n", cap); gtk_widget_show (w->drawarea); gtk_container_add (GTK_CONTAINER (w->base.widget), w->drawarea); #if !GTK_CHECK_VERSION(3,0,0) -- cgit v1.2.3