[Bf-blender-cvs] [73ca2f702f5] tmp-batch-cache-cleanup: Mesh Batch Cache: Refactor part 1

Clément Foucault noreply at git.blender.org
Mon Jul 22 12:52:50 CEST 2019


Commit: 73ca2f702f5ba6cf6d75c9855b7815d3001f673a
Author: Clément Foucault
Date:   Sun Jul 14 00:59:52 2019 +0200
Branches: tmp-batch-cache-cleanup
https://developer.blender.org/rB73ca2f702f5ba6cf6d75c9855b7815d3001f673a

Mesh Batch Cache: Refactor part 1

- Start refactoring MeshRenderData and mesh_render_data_create_ex
- Add Iter functions
- Add dummy callbacks
- Add some Extract types (not enabled)

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

M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/gpu/GPU_element.h
M	source/blender/gpu/intern/gpu_element.c

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

diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index f244cf40e79..cf8c14dc1d8 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -90,6 +90,19 @@ typedef struct DRW_MeshCDMask {
   uint32_t tan_orco : 1;
 } DRW_MeshCDMask;
 
+typedef enum eMRIterType {
+  MR_ITER_LOOPTRI = 1 << 0,
+  MR_ITER_LOOP = 1 << 1,
+  MR_ITER_LEDGE = 1 << 2,
+  MR_ITER_LVERT = 1 << 3,
+} eMRIterType;
+
+typedef enum eMRExtractType {
+  MR_EXTRACT_BMESH,
+  MR_EXTRACT_MAPPED,
+  MR_EXTRACT_MESH,
+} eMRExtractType;
+
 /* DRW_MeshWeightState.flags */
 enum {
   DRW_MESH_WEIGHT_STATE_MULTIPAINT = (1 << 0),
@@ -193,11 +206,19 @@ typedef struct MeshRenderData {
   int edge_len;
   int tri_len;
   int loop_len;
+  int loop_loose_len;
+  int edge_loose_len;
+  int vert_loose_len;
   int poly_len;
   int mat_len;
-  int loose_vert_len;
-  int loose_edge_len;
+  int loose_vert_len; /* Obsolete */
+  int loose_edge_len; /* Obsolete */
+  int *tri_mat_len;
+
+  int *lverts;
+  int *ledges;
 
+  bool use_mapped;
   /* Support for mapped mesh data. */
   struct {
     /* Must be set if we want to get mapped data. */
@@ -225,10 +246,18 @@ typedef struct MeshRenderData {
     int *p_origindex;
   } mapped;
 
+  int *v_origindex;
+  int *e_origindex;
+  int *l_origindex;
+  int *p_origindex;
+
   BMEditMesh *edit_bmesh;
+  BMesh *bm;
   struct EditMeshData *edit_data;
   const ToolSettings *toolsettings;
 
+  eMRExtractType iter;
+
   Mesh *me;
 
   MVert *mvert;
@@ -1225,6 +1254,131 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
   return rdata;
 }
 
+static MeshRenderData *mesh_render_data_create_ex_new(Mesh *me,
+                                                      const int types,
+                                                      const DRW_MeshCDMask *UNUSED(cd_used),
+                                                      const ToolSettings *ts)
+{
+  MeshRenderData *mr = MEM_callocN(sizeof(*mr), __func__);
+  mr->toolsettings = ts;
+  mr->mat_len = mesh_render_mat_len_get(me);
+
+  mr->me = me;
+  mr->edit_bmesh = me->edit_mesh;
+  mr->use_mapped = me->edit_mesh && me->edit_mesh->mesh_eval_cage &&
+                   !me->edit_mesh->mesh_eval_cage->runtime.is_original;
+
+  mr->iter = mr->edit_bmesh ? (mr->use_mapped ? MR_EXTRACT_MAPPED : MR_EXTRACT_BMESH) :
+                              MR_EXTRACT_MESH;
+
+  if (mr->edit_bmesh) {
+    mr->bm = mr->edit_bmesh->bm;
+  }
+
+  if (mr->use_mapped) {
+    mr->me = mr->edit_bmesh->mesh_eval_cage;
+
+    mr->v_origindex = CustomData_get_layer(&mr->me->vdata, CD_ORIGINDEX);
+    mr->e_origindex = CustomData_get_layer(&mr->me->edata, CD_ORIGINDEX);
+    mr->p_origindex = CustomData_get_layer(&mr->me->pdata, CD_ORIGINDEX);
+
+    mr->use_mapped = (mr->v_origindex || mr->e_origindex || mr->p_origindex);
+    BLI_assert(mr->use_mapped);
+  }
+
+  if (!mr->edit_bmesh || mr->use_mapped) {
+    /* Mesh */
+    mr->vert_len = mr->me->totvert;
+    mr->edge_len = mr->me->totedge;
+    mr->loop_len = mr->me->totloop;
+    mr->poly_len = mr->me->totpoly;
+    mr->tri_len = poly_to_tri_count(mr->poly_len, mr->loop_len);
+
+    mr->mvert = CustomData_get_layer(&mr->me->vdata, CD_MVERT);
+    mr->medge = CustomData_get_layer(&mr->me->edata, CD_MEDGE);
+    mr->mloop = CustomData_get_layer(&mr->me->ldata, CD_MLOOP);
+    mr->mpoly = CustomData_get_layer(&mr->me->pdata, CD_MPOLY);
+
+    if (types & MR_ITER_LOOPTRI) {
+      mr->mlooptri = MEM_mallocN(sizeof(*mr->mlooptri) * mr->tri_len, "MR_DATATYPE_LOOPTRI");
+      BKE_mesh_recalc_looptri(
+          me->mloop, me->mpoly, me->mvert, me->totloop, me->totpoly, mr->mlooptri);
+    }
+    if (types & (MR_ITER_LEDGE | MR_ITER_LVERT)) {
+      mr->vert_loose_len = 0;
+      mr->edge_loose_len = 0;
+
+      /* TODO */
+      /* Note: Might not be possible for lverts. */
+
+      mr->loop_loose_len = mr->vert_loose_len + mr->edge_loose_len * 2;
+    }
+  }
+  else {
+    /* BMesh */
+    BMesh *bm = mr->bm;
+
+    mr->vert_len = bm->totvert;
+    mr->edge_len = bm->totedge;
+    mr->loop_len = bm->totloop;
+    mr->poly_len = bm->totface;
+    mr->tri_len = poly_to_tri_count(mr->poly_len, mr->loop_len);
+
+    mr->efa_act_uv = EDBM_uv_active_face_get(mr->edit_bmesh, false, false);
+    mr->efa_act = BM_mesh_active_face_get(bm, false, true);
+    mr->eed_act = BM_mesh_active_edge_get(bm);
+    mr->eve_act = BM_mesh_active_vert_get(bm);
+
+    mr->cd.offset.crease = CustomData_get_offset(&bm->edata, CD_CREASE);
+    mr->cd.offset.bweight = CustomData_get_offset(&bm->edata, CD_BWEIGHT);
+#ifdef WITH_FREESTYLE
+    mr->cd.offset.freestyle_edge = CustomData_get_offset(&bm->edata, CD_FREESTYLE_EDGE);
+    mr->cd.offset.freestyle_face = CustomData_get_offset(&bm->pdata, CD_FREESTYLE_FACE);
+#endif
+
+    int bm_ensure_types = BM_VERT | BM_EDGE | BM_LOOP | BM_FACE;
+
+    BM_mesh_elem_index_ensure(bm, bm_ensure_types);
+    BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP);
+
+    if (types & MR_ITER_LOOPTRI) {
+      /* Edit mode ensures this is valid, no need to calculate. */
+      BLI_assert((bm->totloop == 0) || (mr->edit_bmesh->looptris != NULL));
+    }
+    if (types & (MR_ITER_LEDGE | MR_ITER_LVERT)) {
+      int elem_id;
+      BMIter iter;
+      BMVert *eve;
+      BMEdge *ede;
+      mr->vert_loose_len = 0;
+      mr->edge_loose_len = 0;
+
+      mr->lverts = MEM_mallocN(mr->vert_len * sizeof(*mr->lverts), __func__);
+      BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, elem_id) {
+        if (eve->e == NULL) {
+          mr->lverts[mr->vert_loose_len++] = elem_id;
+        }
+      }
+      if (mr->vert_loose_len < mr->vert_len) {
+        mr->lverts = MEM_reallocN(mr->lverts, mr->vert_loose_len * sizeof(*mr->lverts));
+      }
+
+      mr->ledges = MEM_mallocN(mr->edge_len * sizeof(int), __func__);
+      BM_ITER_MESH_INDEX (ede, &iter, bm, BM_EDGES_OF_MESH, elem_id) {
+        if (ede->l == NULL) {
+          mr->ledges[mr->edge_loose_len++] = elem_id;
+        }
+      }
+      if (mr->edge_loose_len < mr->vert_len) {
+        mr->ledges = MEM_reallocN(mr->ledges, mr->edge_loose_len * sizeof(*mr->ledges));
+      }
+
+      mr->loop_loose_len = mr->vert_loose_len + mr->edge_loose_len * 2;
+    }
+  }
+  return mr;
+}
+
 /* Warning replace mesh pointer. */
 #define MBC_GET_FINAL_MESH(me) \
   /* Hack to show the final result. */ \
@@ -1270,6 +1424,9 @@ static void mesh_render_data_free(MeshRenderData *rdata)
   MEM_SAFE_FREE(rdata->mapped.loose_verts);
   MEM_SAFE_FREE(rdata->mapped.loose_edges);
 
+  MEM_SAFE_FREE(rdata->lverts);
+  MEM_SAFE_FREE(rdata->ledges);
+
   CustomData_free(&rdata->cd.output.ldata, rdata->loop_len);
 
   MEM_freeN(rdata);
@@ -2008,13 +2165,13 @@ typedef struct MeshBufferCache {
    * loops + loose_edges*2 + loose_verts */
   struct {
     GPUVertBuf *pos_nor;  /* extend */
+    GPUVertBuf *lnor;     /* extend */
     GPUVertBuf *edge_fac; /* extend */
     GPUVertBuf *weights;  /* extend */
     GPUVertBuf *uv_tan;
     GPUVertBuf *vcol;
     GPUVertBuf *orco;
     /* Only for edit mode. */
-    GPUVertBuf *vnor; /* extend */
     GPUVertBuf *data; /* extend */
     GPUVertBuf *data_edituv;
     GPUVertBuf *stretch_area;
@@ -2033,12 +2190,11 @@ typedef struct MeshBufferCache {
    * Only need to be updated when topology changes. */
   struct {
     /* Indices to vloops. */
-    GPUIndexBuf *tris; /* Ordered per material. */
-    GPUIndexBuf *lines;
+    GPUIndexBuf *tris;  /* Ordered per material. */
+    GPUIndexBuf *lines; /* Loose edges last. */
     GPUIndexBuf *points;
     GPUIndexBuf *facedots;
     /* 3D overlays. */
-    GPUIndexBuf *lines_loose;      /* only loose edges. */
     GPUIndexBuf *lines_paint_mask; /* no loose edges. */
     GPUIndexBuf *lines_adjacency;
     /* Uv overlays. (visibility can differ from 3D view) */
@@ -2369,14 +2525,14 @@ void DRW_mesh_batch_cache_free(Mesh *me)
 
 /* GPUBatch cache usage. */
 
-static void mesh_create_edit_vertex_loops(MeshRenderData *rdata,
-                                          GPUVertBuf *vbo_pos_nor,
-                                          GPUVertBuf *vbo_lnor,
-                                          GPUVertBuf *vbo_uv,
-                                          GPUVertBuf *vbo_data,
-                                          GPUVertBuf *vbo_verts,
-                                          GPUVertBuf *vbo_edges,
-                                          GPUVertBuf *vbo_faces)
+static void UNUSED_FUNCTION(mesh_create_edit_vertex_loops)(MeshRenderData *rdata,
+                                                           GPUVertBuf *vbo_pos_nor,
+                                                           GPUVertBuf *vbo_lnor,
+                                                           GPUVertBuf *vbo_uv,
+                                                           GPUVertBuf *vbo_data,
+                                                           GPUVertBuf *vbo_verts,
+                                                           GPUVertBuf *vbo_edges,
+                                                           GPUVertBuf *vbo_faces)
 {
 #if 0
   const int vert_len = mesh_render_data_verts_len_get_maybe_mapped(rdata);
@@ -2784,10 +2940,10 @@ static void mesh_create_edit_vertex_loops(MeshRenderData *rdata,
 }
 
 /* TODO: We could use gl_PrimitiveID as index instead of using another VBO. */
-static void mesh_create_edit_facedots_select_id(MeshRenderData *rdata,
-                                                GPUVertBuf *vbo,
-                                                Scene *scene,
-                                                Object *ob)
+static void UNUSED_FUNCTION(mesh_create_edit_facedots_select_id)(MeshRenderData *rdata,
+                                                                 GPUVertBuf *vbo,
+                                                                 Scene *scene,
+                                                                 Object *ob)
 {
   const int poly_len = mesh_render_data_polys_len_get_maybe_mapped(rdata);
 
@@ -2860,7 +3016,7 @@ static void mesh_create_edit_facedots_select_id(MeshRenderData *rdata,
   

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list