Bladeren bron

optimize index traversal

David Rose 17 jaren geleden
bovenliggende
commit
e45a354a05
2 gewijzigde bestanden met toevoegingen van 112 en 12 verwijderingen
  1. 111 12
      panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx
  2. 1 0
      panda/src/tinydisplay/tinyGraphicsStateGuardian.h

+ 111 - 12
panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx

@@ -35,6 +35,7 @@ extern "C" {
 TypeHandle TinyGraphicsStateGuardian::_type_handle;
 
 PStatCollector TinyGraphicsStateGuardian::_vertices_immediate_pcollector("Vertices:Immediate mode");
+PStatCollector TinyGraphicsStateGuardian::_draw_transform_pcollector("Draw:Transform");
 
 
 static const ZB_fillTriangleFunc fill_tri_funcs
@@ -910,6 +911,8 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader,
   }
   nassertr(_data_reader != (GeomVertexDataPipelineReader *)NULL, false);
 
+  PStatTimer timer(_draw_transform_pcollector);
+
   // Set up the proper transform.
   if (_data_reader->is_vertex_transformed()) {
     // If the vertex data claims to be already transformed into clip
@@ -1228,11 +1231,45 @@ draw_triangles(const GeomPrimitivePipelineReader *reader, bool force) {
   _vertices_immediate_pcollector.add_level(num_vertices);
 
   if (reader->is_indexed()) {
-    for (int i = 0; i < num_vertices; i += 3) {
-      GLVertex *v0 = &_vertices[reader->get_vertex(i) - _min_vertex];
-      GLVertex *v1 = &_vertices[reader->get_vertex(i + 1) - _min_vertex];
-      GLVertex *v2 = &_vertices[reader->get_vertex(i + 2) - _min_vertex];
-      gl_draw_triangle(_c, v0, v1, v2);
+    switch (reader->get_index_type()) {
+    case Geom::NT_uint8:
+      {
+        PN_uint8 *index = (PN_uint8 *)reader->get_read_pointer(true);
+        for (int i = 0; i < num_vertices; i += 3) {
+          GLVertex *v0 = &_vertices[index[i] - _min_vertex];
+          GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
+          GLVertex *v2 = &_vertices[index[i + 2] - _min_vertex];
+          gl_draw_triangle(_c, v0, v1, v2);
+        }
+      }
+      break;
+
+    case Geom::NT_uint16:
+      {
+        PN_uint16 *index = (PN_uint16 *)reader->get_read_pointer(true);
+        for (int i = 0; i < num_vertices; i += 3) {
+          GLVertex *v0 = &_vertices[index[i] - _min_vertex];
+          GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
+          GLVertex *v2 = &_vertices[index[i + 2] - _min_vertex];
+          gl_draw_triangle(_c, v0, v1, v2);
+        }
+      }
+      break;
+
+    case Geom::NT_uint32:
+      {
+        PN_uint32 *index = (PN_uint32 *)reader->get_read_pointer(true);
+        for (int i = 0; i < num_vertices; i += 3) {
+          GLVertex *v0 = &_vertices[index[i] - _min_vertex];
+          GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
+          GLVertex *v2 = &_vertices[index[i + 2] - _min_vertex];
+          gl_draw_triangle(_c, v0, v1, v2);
+        }
+      }
+      break;
+
+    default:
+      break;
     }
 
   } else {
@@ -1266,10 +1303,42 @@ draw_lines(const GeomPrimitivePipelineReader *reader, bool force) {
   _vertices_immediate_pcollector.add_level(num_vertices);
 
   if (reader->is_indexed()) {
-    for (int i = 0; i < num_vertices; i += 2) {
-      GLVertex *v0 = &_vertices[reader->get_vertex(i) - _min_vertex];
-      GLVertex *v1 = &_vertices[reader->get_vertex(i + 1) - _min_vertex];
-      gl_draw_line(_c, v0, v1);
+    switch (reader->get_index_type()) {
+    case Geom::NT_uint8:
+      {
+        PN_uint8 *index = (PN_uint8 *)reader->get_read_pointer(true);
+        for (int i = 0; i < num_vertices; i += 2) {
+          GLVertex *v0 = &_vertices[index[i] - _min_vertex];
+          GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
+          gl_draw_line(_c, v0, v1);
+        }
+      }
+      break;
+
+    case Geom::NT_uint16:
+      {
+        PN_uint16 *index = (PN_uint16 *)reader->get_read_pointer(true);
+        for (int i = 0; i < num_vertices; i += 2) {
+          GLVertex *v0 = &_vertices[index[i] - _min_vertex];
+          GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
+          gl_draw_line(_c, v0, v1);
+        }
+      }
+      break;
+
+    case Geom::NT_uint32:
+      {
+        PN_uint32 *index = (PN_uint32 *)reader->get_read_pointer(true);
+        for (int i = 0; i < num_vertices; i += 2) {
+          GLVertex *v0 = &_vertices[index[i] - _min_vertex];
+          GLVertex *v1 = &_vertices[index[i + 1] - _min_vertex];
+          gl_draw_line(_c, v0, v1);
+        }
+      }
+      break;
+
+    default:
+      break;
     }
 
   } else {
@@ -1302,9 +1371,39 @@ draw_points(const GeomPrimitivePipelineReader *reader, bool force) {
   _vertices_immediate_pcollector.add_level(num_vertices);
 
   if (reader->is_indexed()) {
-    for (int i = 0; i < num_vertices; ++i) {
-      GLVertex *v0 = &_vertices[reader->get_vertex(i) - _min_vertex];
-      gl_draw_point(_c, v0);
+    switch (reader->get_index_type()) {
+    case Geom::NT_uint8:
+      {
+        PN_uint8 *index = (PN_uint8 *)reader->get_read_pointer(true);
+        for (int i = 0; i < num_vertices; ++i) {
+          GLVertex *v0 = &_vertices[index[i] - _min_vertex];
+          gl_draw_point(_c, v0);
+        }
+      }
+      break;
+
+    case Geom::NT_uint16:
+      {
+        PN_uint16 *index = (PN_uint16 *)reader->get_read_pointer(true);
+        for (int i = 0; i < num_vertices; ++i) {
+          GLVertex *v0 = &_vertices[index[i] - _min_vertex];
+          gl_draw_point(_c, v0);
+        }
+      }
+      break;
+
+    case Geom::NT_uint32:
+      {
+        PN_uint32 *index = (PN_uint32 *)reader->get_read_pointer(true);
+        for (int i = 0; i < num_vertices; ++i) {
+          GLVertex *v0 = &_vertices[index[i] - _min_vertex];
+          gl_draw_point(_c, v0);
+        }
+      }
+      break;
+
+    default:
+      break;
     }
 
   } else {

+ 1 - 0
panda/src/tinydisplay/tinyGraphicsStateGuardian.h

@@ -133,6 +133,7 @@ private:
   int _vertices_size;
 
   static PStatCollector _vertices_immediate_pcollector;
+  static PStatCollector _draw_transform_pcollector;
 
 public:
   static TypeHandle get_class_type() {