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

Reply via email to