Enlightenment CVS committal Author : cedric Project : e17 Module : libs/evas
Dir : e17/libs/evas/src/modules/engines/gl_common Modified Files: evas_gl_common.h evas_gl_polygon.c Log Message: Use display list for OpenGL polygons implementation. This improve speed on my computer in expedite test bench from 400 to 650. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/gl_common/evas_gl_common.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -3 -r1.17 -r1.18 --- evas_gl_common.h 12 Apr 2008 00:32:26 -0000 1.17 +++ evas_gl_common.h 10 Jun 2008 12:18:54 -0000 1.18 @@ -133,6 +133,8 @@ struct _Evas_GL_Polygon { Evas_List *points; + GLuint dl; + Evas_Bool changed : 1; }; struct _Evas_GL_Polygon_Point =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/gl_common/evas_gl_polygon.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_gl_polygon.c 30 Sep 2006 10:18:34 -0000 1.2 +++ evas_gl_polygon.c 10 Jun 2008 12:18:54 -0000 1.3 @@ -14,6 +14,7 @@ pt->x = x; pt->y = y; poly->points = evas_list_append(poly->points, pt); + poly->changed = 1; return poly; } @@ -29,6 +30,7 @@ poly->points = evas_list_remove(poly->points, pt); free(pt); } + if (poly->dl > 0) glDeleteLists(poly->dl, 1); free(poly); return NULL; } @@ -106,48 +108,62 @@ evas_gl_common_context_read_buf_set(gc, GL_BACK); evas_gl_common_context_write_buf_set(gc, GL_BACK); -#ifdef GLU_TESS - if (!tess) - { - tess = gluNewTess(); - - gluTessCallback(tess, GLU_TESS_BEGIN, _evas_gl_tess_begin_cb); - gluTessCallback(tess, GLU_TESS_END, _evas_gl_tess_end_cb); - gluTessCallback(tess, GLU_TESS_ERROR, _evas_gl_tess_error_cb); - gluTessCallback(tess, GLU_TESS_VERTEX, _evas_gl_tess_vertex_cb); - gluTessCallback(tess, GLU_TESS_COMBINE, _evas_gl_tess_combine_cb); - } - num = 0; - num = evas_list_count(poly->points); - i = 0; - glp = malloc(num * 6 * sizeof(GLdouble)); - gluTessNormal(tess, 0, 0, 1); - gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD); - gluTessBeginPolygon(tess, NULL); - gluTessBeginContour(tess); - for (l = poly->points; l; l = l->next) + if (poly->changed || poly->dl <= 0) { - Evas_GL_Polygon_Point *p; + if (poly->dl > 0) glDeleteLists(poly->dl, 1); + poly->dl = glGenLists(1); - p = l->data; - glp[i++] = p->x; - glp[i++] = p->y; - glp[i++] = 0; - gluTessVertex(tess, &(glp[i - 3]), &(glp[i - 3])); - i += 3; - } - gluTessEndContour(tess); - gluTessEndPolygon(tess); - free(glp); + glNewList(poly->dl, GL_COMPILE_AND_EXECUTE); +#ifdef GLU_TESS + if (!tess) + { + tess = gluNewTess(); + + gluTessCallback(tess, GLU_TESS_BEGIN, _evas_gl_tess_begin_cb); + gluTessCallback(tess, GLU_TESS_END, _evas_gl_tess_end_cb); + gluTessCallback(tess, GLU_TESS_ERROR, _evas_gl_tess_error_cb); + gluTessCallback(tess, GLU_TESS_VERTEX, _evas_gl_tess_vertex_cb); + gluTessCallback(tess, GLU_TESS_COMBINE, _evas_gl_tess_combine_cb); + } + num = 0; + num = evas_list_count(poly->points); + i = 0; + glp = malloc(num * 6 * sizeof(GLdouble)); + gluTessNormal(tess, 0, 0, 1); + gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD); + gluTessBeginPolygon(tess, NULL); + gluTessBeginContour(tess); + for (l = poly->points; l; l = l->next) + { + Evas_GL_Polygon_Point *p; + + p = l->data; + glp[i++] = p->x; + glp[i++] = p->y; + glp[i++] = 0; + gluTessVertex(tess, &(glp[i - 3]), &(glp[i - 3])); + i += 3; + } + gluTessEndContour(tess); + gluTessEndPolygon(tess); + free(glp); #else - glBegin(GL_POLYGON); - for (l = poly->points; l; l = l->next) - { - Evas_GL_Polygon_Point *p; + glBegin(GL_POLYGON); + for (l = poly->points; l; l = l->next) + { + Evas_GL_Polygon_Point *p; + + p = l->data; + glVertex2i(p->x, p->y); + } + glEnd(); +#endif + glEndList(); + + poly->changed = 0; - p = l->data; - glVertex2i(p->x, p->y); + return ; } - glEnd(); -#endif + + glCallList(poly->dl); } ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs