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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs