[Bf-blender-cvs] [bcabd04e324] master: Mesh: Avoid retrieving edge and loop arrays repeatedly

Hans Goudey noreply at git.blender.org
Mon Nov 28 15:57:13 CET 2022


Commit: bcabd04e324277b1a709738aace440fb0d5b0c5a
Author: Hans Goudey
Date:   Sun Nov 27 18:46:46 2022 -0600
Branches: master
https://developer.blender.org/rBbcabd04e324277b1a709738aace440fb0d5b0c5a

Mesh: Avoid retrieving edge and loop arrays repeatedly

A utility function retrieved mesh arrays for every element after
05952aa94d33ee which can be easily avoided. This was used when
building the GPU indices for sculpt mode drawing. In my tests this
saves 0.1ms per PBVH node. There may be very slight improvements
in line art and shrinkwrap as well.

===================================================================

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/mesh.cc
M	source/blender/blenkernel/intern/shrinkwrap.cc
M	source/blender/draw/intern/draw_pbvh.cc
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc
M	source/blender/gpu/intern/gpu_shader_builder_stubs.cc

===================================================================

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 577107149ee..a3f74f0fb7c 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -132,7 +132,8 @@ int BKE_mesh_edge_other_vert(const struct MEdge *e, int v);
 /**
  * Sets each output array element to the edge index if it is a real edge, or -1.
  */
-void BKE_mesh_looptri_get_real_edges(const struct Mesh *mesh,
+void BKE_mesh_looptri_get_real_edges(const struct MEdge *edges,
+                                     const struct MLoop *loops,
                                      const struct MLoopTri *looptri,
                                      int r_edges[3]);
 
diff --git a/source/blender/blenkernel/intern/mesh.cc b/source/blender/blenkernel/intern/mesh.cc
index 02d375bd782..deaa9aec3f7 100644
--- a/source/blender/blenkernel/intern/mesh.cc
+++ b/source/blender/blenkernel/intern/mesh.cc
@@ -1490,13 +1490,13 @@ int BKE_mesh_edge_other_vert(const MEdge *e, int v)
   return -1;
 }
 
-void BKE_mesh_looptri_get_real_edges(const Mesh *mesh, const MLoopTri *looptri, int r_edges[3])
+void BKE_mesh_looptri_get_real_edges(const MEdge *edges,
+                                     const MLoop *loops,
+                                     const MLoopTri *tri,
+                                     int r_edges[3])
 {
-  const Span<MEdge> edges = mesh->edges();
-  const Span<MLoop> loops = mesh->loops();
-
   for (int i = 2, i_next = 0; i_next < 3; i = i_next++) {
-    const MLoop *l1 = &loops[looptri->tri[i]], *l2 = &loops[looptri->tri[i_next]];
+    const MLoop *l1 = &loops[tri->tri[i]], *l2 = &loops[tri->tri[i_next]];
     const MEdge *e = &edges[l1->e];
 
     bool is_real = (l1->v == e->v1 && l2->v == e->v2) || (l1->v == e->v2 && l2->v == e->v1);
diff --git a/source/blender/blenkernel/intern/shrinkwrap.cc b/source/blender/blenkernel/intern/shrinkwrap.cc
index 69a9f6f0fc2..f28748dcbce 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.cc
+++ b/source/blender/blenkernel/intern/shrinkwrap.cc
@@ -239,7 +239,7 @@ static ShrinkwrapBoundaryData *shrinkwrap_build_boundary_data(Mesh *mesh)
 
   for (int i = 0; i < totlooptri; i++) {
     int edges[3];
-    BKE_mesh_looptri_get_real_edges(mesh, &mlooptri[i], edges);
+    BKE_mesh_looptri_get_real_edges(medge, mloop, &mlooptri[i], edges);
 
     for (int j = 0; j < 3; j++) {
       if (edges[j] >= 0 && edge_mode[edges[j]]) {
@@ -1049,7 +1049,7 @@ static void mesh_looptri_target_project(void *userdata,
     const BLI_bitmap *is_boundary = tree->boundary->edge_is_boundary;
     int edges[3];
 
-    BKE_mesh_looptri_get_real_edges(tree->mesh, lt, edges);
+    BKE_mesh_looptri_get_real_edges(data->edge, data->loop, lt, edges);
 
     for (int i = 0; i < 3; i++) {
       if (edges[i] >= 0 && BLI_BITMAP_TEST(is_boundary, edges[i])) {
diff --git a/source/blender/draw/intern/draw_pbvh.cc b/source/blender/draw/intern/draw_pbvh.cc
index 6c504e63511..39d493003c2 100644
--- a/source/blender/draw/intern/draw_pbvh.cc
+++ b/source/blender/draw/intern/draw_pbvh.cc
@@ -24,6 +24,7 @@
 #include "BLI_map.hh"
 #include "BLI_math_color.h"
 #include "BLI_math_vec_types.hh"
+#include "BLI_timeit.hh"
 #include "BLI_utildefines.h"
 #include "BLI_vector.hh"
 
@@ -959,6 +960,8 @@ struct PBVHBatches {
       material_index = mat_index[poly_index];
     }
 
+    const blender::Span<MEdge> edges = args->me->edges();
+
     /* Calculate number of edges*/
     int edge_count = 0;
     for (int i = 0; i < args->totprim; i++) {
@@ -969,7 +972,7 @@ struct PBVHBatches {
       }
 
       int r_edges[3];
-      BKE_mesh_looptri_get_real_edges(args->me, lt, r_edges);
+      BKE_mesh_looptri_get_real_edges(edges.data(), args->mloop, lt, r_edges);
 
       if (r_edges[0] != -1) {
         edge_count++;
@@ -994,7 +997,7 @@ struct PBVHBatches {
       }
 
       int r_edges[3];
-      BKE_mesh_looptri_get_real_edges(args->me, lt, r_edges);
+      BKE_mesh_looptri_get_real_edges(edges.data(), args->mloop, lt, r_edges);
 
       if (r_edges[0] != -1) {
         GPU_indexbuf_add_line_verts(&elb_lines, vertex_i, vertex_i + 1);
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc
index 1fa2f2fbb03..8367950eb72 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc
@@ -1474,6 +1474,8 @@ struct EdgeFeatData {
   Object *ob_eval; /* For evaluated materials. */
   const MLoopTri *mlooptri;
   const int *material_indices;
+  blender::Span<MEdge> edges;
+  blender::Span<MLoop> loops;
   LineartTriangle *tri_array;
   LineartVert *v_array;
   float crease_threshold;
@@ -1677,13 +1679,12 @@ static void lineart_identify_mlooptri_feature_edges(void *__restrict userdata,
     }
   }
 
-  const MEdge *edges = BKE_mesh_edges(me);
-
   int real_edges[3];
-  BKE_mesh_looptri_get_real_edges(me, &mlooptri[i / 3], real_edges);
+  BKE_mesh_looptri_get_real_edges(
+      e_feat_data->edges.data(), e_feat_data->loops.data(), &mlooptri[i / 3], real_edges);
 
   if (real_edges[i % 3] >= 0) {
-    const MEdge *medge = &edges[real_edges[i % 3]];
+    const MEdge *medge = &e_feat_data->edges[real_edges[i % 3]];
 
     if (ld->conf.use_crease && ld->conf.sharp_as_crease && (medge->flag & ME_SHARP)) {
       edge_flag_result |= LRT_EDGE_FLAG_CREASE;
@@ -2072,6 +2073,8 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info,
   edge_feat_data.ob_eval = ob_info->original_ob_eval;
   edge_feat_data.mlooptri = mlooptri;
   edge_feat_data.material_indices = material_indices;
+  edge_feat_data.edges = me->edges();
+  edge_feat_data.loops = me->loops();
   edge_feat_data.edge_nabr = lineart_build_edge_neighbor(me, total_edges);
   edge_feat_data.tri_array = la_tri_arr;
   edge_feat_data.v_array = la_v_arr;
diff --git a/source/blender/gpu/intern/gpu_shader_builder_stubs.cc b/source/blender/gpu/intern/gpu_shader_builder_stubs.cc
index 65bda7ba858..2148e2c5a7a 100644
--- a/source/blender/gpu/intern/gpu_shader_builder_stubs.cc
+++ b/source/blender/gpu/intern/gpu_shader_builder_stubs.cc
@@ -177,7 +177,8 @@ void BKE_mesh_calc_poly_normal(const struct MPoly * /*mpoly*/,
   BLI_assert_unreachable();
 }
 
-void BKE_mesh_looptri_get_real_edges(const struct Mesh * /*mesh*/,
+void BKE_mesh_looptri_get_real_edges(const struct MEdge * /*edges*/,
+                                     const struct MLoop * /*loops*/,
                                      const struct MLoopTri * /*looptri*/,
                                      int UNUSED(r_edges[3]))
 {



More information about the Bf-blender-cvs mailing list