From 7e7dd95dc6516da3ce7e16a480558c6d76bed25f Mon Sep 17 00:00:00 2001 From: martin-s Date: Sun, 4 Mar 2012 08:48:50 +0000 Subject: [PATCH] Add:Build:Cmake-Options for OpenGLES and OpenGLES2 git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4960 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/CMakeLists.txt | 16 ++++- navit/config.h.cmake | 4 ++ navit/navit/graphics/opengl/CMakeLists.txt | 6 +- navit/navit/graphics/opengl/graphics_opengl.c | 84 +++++++++++++-------------- navit/navit/graphics/opengl/window.c | 11 ++-- 5 files changed, 69 insertions(+), 52 deletions(-) diff --git a/navit/CMakeLists.txt b/navit/CMakeLists.txt index 2a69b93..4c72980 100755 --- a/navit/CMakeLists.txt +++ b/navit/CMakeLists.txt @@ -238,11 +238,21 @@ if(GTK2_FOUND) endif(GTK2_FOUND) CHECK_LIBRARY_EXISTS(freeimage FreeImage_Load "" HAVE_FREEIMAGE) +if (USE_OPENGLES OR USE_OPENGLES2) + CHECK_LIBRARY_EXISTS(EGL eglInitialize "" HAVE_EGL) +endif(USE_OPENGLES OR USE_OPENGLES2) if (FREETYPE_FOUND) if (OPENGL_FOUND AND OPENGL_GLU_FOUND AND GLUT_FOUND AND OPENGL_INCLUDE_DIR) message (STATUS "opengl found: ${OPENGL_gl_LIBRARY}") include_directories(${OPENGL_INCLUDE_DIR}) - set(GRAPHICS_OPENGL_LIBRARY ${OPENGL_gl_LIBRARY};${OPENGL_glu_LIBRARY};${GLUT_glut_LIBRARY}) + if (USE_OPENGLES2) + set(USE_OPENGLES TRUE) + set(GRAPHICS_OPENGL_LIBRARY GLESv2 EGL) + elseif (USE_OPENGLES) + set(GRAPHICS_OPENGL_LIBRARY GLESv1_CM EGL) + else() + set(GRAPHICS_OPENGL_LIBRARY ${OPENGL_gl_LIBRARY};${OPENGL_glu_LIBRARY};${GLUT_glut_LIBRARY}) + endif(USE_OPENGLES2) if (HAVE_FREEIMAGE) list(APPEND GRAPHICS_OPENGL_LIBRARY freeimage) endif(HAVE_FREEIMAGE) @@ -251,8 +261,8 @@ if (FREETYPE_FOUND) message (STATUS "opengl not found") endif() else() - message (STATUS "no glc implementation found. Install Quesoglc for OpenGL support") -endif(QUESOGLC_FOUND AND FREETYPE_FOUND) + message (STATUS "no Freetype found") +endif(FREETYPE_FOUND) if(SDL_FOUND AND SDLIMAGE_FOUND AND FREETYPE_FOUND) set(SDL_IMAGE 1) diff --git a/navit/config.h.cmake b/navit/config.h.cmake index 58783ee..2749ef5 100644 --- a/navit/config.h.cmake +++ b/navit/config.h.cmake @@ -81,3 +81,7 @@ #cmakedefine HAVE_ENDIAN_H 1 #cmakedefine HAVE_FREEIMAGE 1 + +#cmakedefine USE_OPENGLES 1 + +#cmakedefine USE_OPENGLES2 1 diff --git a/navit/navit/graphics/opengl/CMakeLists.txt b/navit/navit/graphics/opengl/CMakeLists.txt index 335d27f..e103048 100644 --- a/navit/navit/graphics/opengl/CMakeLists.txt +++ b/navit/navit/graphics/opengl/CMakeLists.txt @@ -1,2 +1,6 @@ -module_add_library(graphics_opengl graphics_opengl.c) +set(graphics_opengl_SOURCES graphics_opengl.c) +if (USE_OPENGLES) + LIST(APPEND graphics_opengl_SOURCES window.c) +endif (USE_OPENGLES) +module_add_library(graphics_opengl ${graphics_opengl_SOURCES}) diff --git a/navit/navit/graphics/opengl/graphics_opengl.c b/navit/navit/graphics/opengl/graphics_opengl.c index 40a959a..90806f1 100644 --- a/navit/navit/graphics/opengl/graphics_opengl.c +++ b/navit/navit/graphics/opengl/graphics_opengl.c @@ -17,8 +17,6 @@ * Boston, MA 02110-1301, USA. */ -#define USE_OPENGLES 0 -#define USE_OPENGLES2 0 #define USE_FLOAT 0 #define REQUIRES_POWER_OF_2 0 @@ -55,8 +53,8 @@ #include #endif -#if USE_OPENGLES -#if USE_OPENGLES2 +#ifdef USE_OPENGLES +#ifdef USE_OPENGLES2 #include #include #undef USE_FLOAT @@ -137,7 +135,7 @@ struct graphics_priv { void (*button_callback) (void *data, int press, int button, struct point * p); void *button_callback_data; -#if USE_OPENGLES +#ifdef USE_OPENGLES GLuint program; GLint mvp_location, position_location, color_location, texture_position_location, use_texture_location, texture_location; #else @@ -179,7 +177,7 @@ static struct mouse_event_queue_element mouse_queue[100]; //hastable for uncompressed image data static GHashTable *hImageData; -#if USE_OPENGLES +#ifdef USE_OPENGLES #else /* prototypes */ void APIENTRY tessBeginCB(GLenum which); @@ -198,7 +196,7 @@ static void display(void); static void resize_callback(int w, int h); static void glut_close(); -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 const char vertex_src [] = " \ attribute vec2 position; \ @@ -513,12 +511,12 @@ image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, #endif } -#if USE_OPENGLES +#ifdef USE_OPENGLES static void set_color(struct graphics_priv *gr, struct graphics_gc_priv *gc) { -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 GLfloat col[4]; col[0]=gc->fr; col[1]=gc->fg; @@ -540,7 +538,7 @@ draw_array(struct graphics_priv *gr, struct point *p, int count, GLenum mode) x[i*2]=glF(p[i].x); x[i*2+1]=glF(p[i].y); } -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 glVertexAttribPointer (gr->position_location, 2, GL_FLOAT, 0, 0, x ); #else glVertexPointer(2, GL_F, 0, x); @@ -595,7 +593,7 @@ draw_image_es(struct graphics_priv *gr, struct point *p, int w, int h, unsigned x[2]+=glF(1); x[3]+=glF(1); x[7]+=glF(1); -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 glUniform1i(gr->use_texture_location, 1); glEnableVertexAttribArray(gr->texture_position_location); glVertexAttribPointer (gr->texture_position_location, 2, GL_FLOAT, 0, 0, x ); @@ -607,7 +605,7 @@ draw_image_es(struct graphics_priv *gr, struct point *p, int w, int h, unsigned glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); draw_rectangle_es(gr, p, w, h); -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 glUniform1i(gr->use_texture_location, 0); glDisableVertexAttribArray(gr->texture_position_location); #else @@ -719,10 +717,10 @@ draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, && !gr->overlay_enabled)) { return; } -#if !USE_OPENGLES || USE_OPENGLES2 +#if !defined(USE_OPENGLES) || defined(USE_OPENGLES2) glLineWidth(gc->linewidth); #endif -#if USE_OPENGLES +#ifdef USE_OPENGLES set_color(gr, gc); draw_array(gr, p, count, GL_LINE_STRIP); #else @@ -749,7 +747,7 @@ draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, #endif } -#if USE_OPENGLES +#ifdef USE_OPENGLES #else void APIENTRY tessCombineCB(GLdouble c[3], void *d[4], GLfloat w[4], void **out) @@ -767,14 +765,12 @@ static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) { - int i; - if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled && !gr->overlay_enabled)) { return; } -#if USE_OPENGLES +#ifdef USE_OPENGLES set_color(gr, gc); draw_array(gr, p, count, GL_LINE_STRIP); #else @@ -785,6 +781,7 @@ draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, return; // failed to create tessellation object, return 0 GLdouble quad1[count][3]; + int i; for (i = 0; i < count; i++) { quad1[i][0] = (GLdouble) (p[i].x); quad1[i][1] = (GLdouble) (p[i].y); @@ -830,7 +827,7 @@ draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, && !gr->overlay_enabled)) { return; } -#if USE_OPENGLES +#ifdef USE_OPENGLES set_color(gr, gc); draw_rectangle_es(gr, p, w, h); #else @@ -855,7 +852,7 @@ static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) { -#if USE_OPENGLES +#ifdef USE_OPENGLES #else if ((gr->parent && !gr->parent->overlay_enabled) || (gr->parent && gr->parent->overlay_enabled @@ -949,7 +946,7 @@ display_text_draw(struct font_freetype_text *text, 32, stride, &white, &transparent); -#if USE_OPENGLES +#ifdef USE_OPENGLES struct point p; p.x=((x + g->x) >> 6)-1; p.y=((y + g->y) >> 6)-1; @@ -992,7 +989,7 @@ display_text_draw(struct font_freetype_text *text, &black, &white, &transparent); -#if USE_OPENGLES +#ifdef USE_OPENGLES struct point p; p.x=(x + g->x) >> 6; p.y=(y + g->y) >> 6; @@ -1018,7 +1015,7 @@ display_text_draw(struct font_freetype_text *text, &black, &white, &transparent); -#if USE_OPENGLES +#ifdef USE_OPENGLES struct point p; p.x=(x + g->x) >> 6; p.y=(y + g->y) >> 6; @@ -1080,7 +1077,7 @@ static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) { -#if USE_OPENGLES +#ifdef USE_OPENGLES draw_image_es(gr, p, img->w, img->h, img->data); #else if ((gr->parent && !gr->parent->overlay_enabled) @@ -1138,7 +1135,7 @@ background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) static void handle_mouse_queue() { -#if USE_OPENGLES +#ifdef USE_OPENGLES #else static locked = 0; if (!locked) { @@ -1190,7 +1187,7 @@ handle_mouse_queue() static int redraw_screen(struct graphics_priv *gr) { -#if USE_OPENGLES +#ifdef USE_OPENGLES #else time_t curr_time = time(0); graphics_priv_root->dirty = 0; @@ -1217,6 +1214,7 @@ redraw_screen(struct graphics_priv *gr) } +#ifndef USE_OPENGLES /*filters call to redraw in overlay enabled(map) mode*/ static void redraw_filter(struct graphics_priv *gr) @@ -1225,6 +1223,7 @@ redraw_filter(struct graphics_priv *gr) redraw_screen(gr); } } +#endif @@ -1232,7 +1231,7 @@ static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) { if (gr->parent) { //overlay -#if USE_OPENGLES +#ifdef USE_OPENGLES #else if (mode == draw_mode_begin) { glNewList(gr->DLid, GL_COMPILE); @@ -1244,14 +1243,14 @@ draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) #endif } else { //root graphics if (mode == draw_mode_begin) { -#if USE_OPENGLES +#ifdef USE_OPENGLES #else glNewList(gr->DLid, GL_COMPILE); #endif } if (mode == draw_mode_end) { -#if USE_OPENGLES +#ifdef USE_OPENGLES eglSwapBuffers(egldisplay, eglwindow); #else glEndList(); @@ -1281,7 +1280,7 @@ graphics_opengl_disable_suspend(struct window *w) { } -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 static GLuint load_shader(const char *shader_source, GLenum type) { @@ -1301,11 +1300,11 @@ get_data(struct graphics_priv *this, char *type) if (!strcmp(type, "gtk_widget")) { fprintf(stderr, "Currently GTK gui is not yet supported with opengl graphics driver\n"); - exit(-1); + return NULL; } if (strcmp(type, "window") == 0) { struct window *win; -#if USE_OPENGLES +#ifdef USE_OPENGLES GLuint vertexShader; GLuint fragmentShader; GLuint textures; @@ -1318,7 +1317,7 @@ get_data(struct graphics_priv *this, char *type) glClearColor ( 0.4 , 0.4 , 0.4 , 1); #endif glClear ( GL_COLOR_BUFFER_BIT ); -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 this->program=glCreateProgram(); vertexShader = load_shader(vertex_src, GL_VERTEX_SHADER); fragmentShader = load_shader(fragment_src, GL_FRAGMENT_SHADER); @@ -1351,12 +1350,12 @@ get_data(struct graphics_priv *this, char *type) glGenTextures(1, &textures); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textures); +#ifndef USE_OPENGLES2 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -#if !USE_OPENGLES2 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); #endif #endif @@ -1366,7 +1365,7 @@ get_data(struct graphics_priv *this, char *type) win->disable_suspend = graphics_opengl_disable_suspend; return win; } else { -#if USE_OPENGLES +#ifdef USE_OPENGLES return NULL; #else return &this->DLid; @@ -1529,7 +1528,7 @@ overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, this->next = gr->overlays; gr->overlays = this; -#if USE_OPENGLES +#ifdef USE_OPENGLES #else this->DLid = glGenLists(1); #endif @@ -1571,11 +1570,10 @@ motion_notify(int x, int y) return; } +#ifndef USE_OPENGLES static gboolean graphics_opengl_idle(void *data) { -#if USE_OPENGLES -#else static int opengl_init_ok = 0; if (!opengl_init_ok) { callback_list_call_attr_2(graphics_priv_root->cbl, @@ -1593,8 +1591,8 @@ graphics_opengl_idle(void *data) handle_mouse_queue(); } return TRUE; -#endif } +#endif static void ProcessNormalKeys(unsigned char key_in, int x, int y) @@ -1657,6 +1655,7 @@ static void resize_callback(int w, int h) { glViewport(0, 0, w, h); +#ifndef USE_OPENGLES2 glMatrixMode(GL_PROJECTION); glLoadIdentity(); #ifdef MIRRORED_VIEW @@ -1664,6 +1663,7 @@ resize_callback(int w, int h) #else glOrthof(glF(0), glF(w), glF(h), glF(0), glF(1), glF(-1)); #endif +#endif graphics_priv_root->width = w; graphics_priv_root->height = h; @@ -1720,7 +1720,7 @@ graphics_opengl_new(struct navit *nav, struct graphics_methods *meth, char *cmdline = ""; int argc = 0; -#if !USE_OPENGLES +#ifndef USE_OPENGLES glutInit(&argc, &cmdline); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); @@ -1737,7 +1737,7 @@ graphics_opengl_new(struct navit *nav, struct graphics_methods *meth, graphics_priv_root->width = this->width; graphics_priv_root->height = this->height; -#if !USE_OPENGLES +#ifndef USE_OPENGLES glutMotionFunc(motion_notify); glutPassiveMotionFunc(motion_notify); glutMouseFunc(click_notify); @@ -1747,12 +1747,12 @@ graphics_opengl_new(struct navit *nav, struct graphics_methods *meth, glutCloseFunc(glut_close); #endif this->DLid = glGenLists(1); -#endif g_timeout_add(G_PRIORITY_DEFAULT + 10, graphics_opengl_idle, NULL); /*this will only refresh screen in map(overlay enabled) mode */ g_timeout_add(G_PRIORITY_DEFAULT + 1000, redraw_filter, this); +#endif //create hash table for uncompressed image data hImageData = g_hash_table_new(g_str_hash, g_str_equal); diff --git a/navit/navit/graphics/opengl/window.c b/navit/navit/graphics/opengl/window.c index 479733e..888a8c4 100644 --- a/navit/navit/graphics/opengl/window.c +++ b/navit/navit/graphics/opengl/window.c @@ -1,6 +1,5 @@ -#define USE_OPENGLES2 1 - -#if USE_OPENGLES2 +#include "config.h" +#ifdef USE_OPENGLES2 #include #include #else @@ -16,7 +15,7 @@ EGLDisplay egldisplay; Display *dpy; Window window; -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 static EGLint attributeList[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, @@ -46,7 +45,7 @@ createEGLWindow(int width, int height, char *name) XVisualInfo *vi, tmp; int vid, n; -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 EGLint aEGLContextAttributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE @@ -62,7 +61,7 @@ createEGLWindow(int width, int height, char *name) dbg(0, "can't find requested config\n"); return 0; } -#if USE_OPENGLES2 +#ifdef USE_OPENGLES2 cx = eglCreateContext(egldisplay, config[0], EGL_NO_CONTEXT, aEGLContextAttributes); #else cx = eglCreateContext(egldisplay, config[0], EGL_NO_CONTEXT, NULL); -- 2.7.4