[Bf-blender-cvs] [edb33400769] temp-pbvh-vbos: temp-pbvh-vbos: Rough prototype

Joseph Eagar noreply at git.blender.org
Sun Aug 21 00:44:43 CEST 2022


Commit: edb334007693f315c43eca38157cfcbe76135de5
Author: Joseph Eagar
Date:   Sun Aug 7 04:31:37 2022 -0700
Branches: temp-pbvh-vbos
https://developer.blender.org/rBedb334007693f315c43eca38157cfcbe76135de5

temp-pbvh-vbos: Rough prototype

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

M	source/blender/blenkernel/BKE_customdata.h
M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/customdata.cc
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_intern.h
M	source/blender/draw/engines/basic/basic_engine.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/overlay/overlay_facing.c
M	source/blender/draw/engines/overlay/overlay_fade.c
M	source/blender/draw/engines/overlay/overlay_mode_transfer.c
M	source/blender/draw/engines/overlay/overlay_sculpt.c
M	source/blender/draw/engines/overlay/overlay_wireframe.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_attributes.h
M	source/blender/draw/intern/draw_cache_extract.hh
M	source/blender/draw/intern/draw_cache_impl.h
M	source/blender/draw/intern/draw_cache_impl_mesh.cc
M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/intern/gpu_buffers.cc

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

diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 6e27fd2d80f..6998b0d3538 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -429,6 +429,7 @@ int CustomData_get_stencil_layer(const struct CustomData *data, int type);
  * if no such active layer is defined.
  */
 const char *CustomData_get_active_layer_name(const struct CustomData *data, int type);
+const char *CustomData_get_render_layer_name(const struct CustomData *data, int type);
 
 /**
  * Copies the data from source to the data element at index in the first layer of type
diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 128834ba4ba..74b1643cfc3 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -37,7 +37,9 @@ struct MVert;
 struct Mesh;
 struct MeshElemMap;
 struct PBVH;
+struct PBVHBatches;
 struct PBVHNode;
+struct PBVH_GPU_Args;
 struct SubdivCCG;
 struct TaskParallelSettings;
 struct Image;
@@ -353,7 +355,10 @@ void BKE_pbvh_draw_cb(PBVH *pbvh,
                       bool update_only_visible,
                       PBVHFrustumPlanes *update_frustum,
                       PBVHFrustumPlanes *draw_frustum,
-                      void (*draw_fn)(void *user_data, struct GPU_PBVH_Buffers *buffers),
+                      void (*draw_fn)(void *user_data,
+                                      struct GPU_PBVH_Buffers *buffers,
+                                      struct PBVHBatches *batches,
+                                      struct PBVH_GPU_Args *args),
                       void *user_data,
                       bool full_render,
                       PBVHAttrReq *attrs,
@@ -721,3 +726,14 @@ bool BKE_pbvh_draw_cache_invalid(const PBVH *pbvh);
 #ifdef __cplusplus
 }
 #endif
+
+/* Disable optimization for a function (for debugging use only!)*/
+#ifdef __clang__
+#  define ATTR_NO_OPT __attribute__((optnone))
+#elif defined(_MSC_VER)
+#  define ATTR_NO_OPT __pragma(optimize("", off))
+#elif defined(__GNUC__)
+#  define ATTR_NO_OPT __attribute__((optimize("O0")))
+#else
+#  define ATTR_NO_OPT
+#endif
diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc
index acb978642aa..57d2dacb463 100644
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@ -2577,6 +2577,13 @@ const char *CustomData_get_active_layer_name(const CustomData *data, const int t
   return layer_index < 0 ? nullptr : data->layers[layer_index].name;
 }
 
+const char *CustomData_get_render_layer_name(const CustomData *data, const int type)
+{
+  /* Get the layer index of the active layer of this type. */
+  const int layer_index = CustomData_get_render_layer_index(data, type);
+  return layer_index < 0 ? nullptr : data->layers[layer_index].name;
+}
+
 void CustomData_set_layer_active(CustomData *data, const int type, const int n)
 {
   for (int i = 0; i < data->totlayer; i++) {
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index dfd3c81789c..c366c2f495a 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -539,6 +539,63 @@ static void pbvh_build(PBVH *pbvh, BB *cb, BBC *prim_bbc, int totprim)
   build_sub(pbvh, 0, cb, prim_bbc, 0, totprim);
 }
 
+static void pbvh_draw_args(PBVH *pbvh, PBVH_GPU_Args *args, PBVHNode *node)
+{
+  memset((void *)args, 0, sizeof(*args));
+
+  args->mesh_verts_num = pbvh->totvert;
+  args->mesh_grids_num = pbvh->totgrid;
+  args->node = node;
+
+  BKE_pbvh_node_num_verts(pbvh, node, NULL, &args->node_verts_num);
+
+  args->face_sets_color_default = pbvh->face_sets_color_default;
+  args->face_sets_color_seed = pbvh->face_sets_color_seed;
+  args->mvert = pbvh->verts;
+  args->mloop = pbvh->mloop;
+  args->mpoly = pbvh->mpoly;
+  args->mlooptri = pbvh->looptri;
+
+  switch (pbvh->header.type) {
+    case PBVH_FACES:
+      args->mesh_faces_num = pbvh->mesh->totpoly;
+      args->vdata = pbvh->vdata;
+      args->ldata = pbvh->ldata;
+      args->pdata = pbvh->pdata;
+      args->totprim = node->totprim;
+      args->me = pbvh->mesh;
+      args->vert_normals = pbvh->vert_normals;
+
+      args->prim_indicies = node->prim_indices;
+      break;
+    case PBVH_GRIDS:
+      args->mesh_faces_num = pbvh->mesh->totpoly;
+      args->vdata = pbvh->vdata;
+      args->ldata = pbvh->ldata;
+      args->pdata = pbvh->pdata;
+      args->ccg_key = pbvh->gridkey;
+      args->me = pbvh->mesh;
+      args->mesh_grids_num = pbvh->totgrid;
+      args->grids = pbvh->grids;
+      args->gridfaces = pbvh->gridfaces;
+      args->grid_flag_mats = pbvh->grid_flag_mats;
+      args->vert_normals = pbvh->vert_normals;
+      break;
+    case PBVH_BMESH:
+      args->mesh_faces_num = pbvh->header.bm->totface;
+
+      args->bm = pbvh->header.bm;
+      args->vdata = &args->bm->vdata;
+      args->ldata = &args->bm->ldata;
+      args->pdata = &args->bm->pdata;
+      args->bm_faces = node->bm_faces;
+      args->bm_other_verts = node->bm_other_verts;
+      args->bm_unique_vert = node->bm_unique_verts;
+      args->totprim = BLI_gset_len(node->bm_faces);
+      break;
+  }
+}
+
 void BKE_pbvh_build_mesh(PBVH *pbvh,
                          Mesh *mesh,
                          const MPoly *mpoly,
@@ -666,6 +723,9 @@ void BKE_pbvh_free(PBVH *pbvh)
     PBVHNode *node = &pbvh->nodes[i];
 
     if (node->flag & PBVH_Leaf) {
+      if (node->draw_batches) {
+        GPU_pbvh_node_free(node->draw_batches);
+      }
       if (node->draw_buffers) {
         GPU_pbvh_buffers_free(node->draw_buffers);
       }
@@ -1306,6 +1366,11 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
   PBVHNode *node = data->nodes[n];
 
   if (node->flag & PBVH_RebuildDrawBuffers) {
+    PBVH_GPU_Args args;
+    pbvh_draw_args(pbvh, &args, node);
+
+    node->draw_batches = GPU_pbvh_node_create(&args);
+
     switch (pbvh->header.type) {
       case PBVH_GRIDS: {
         bool smooth = node->totprim > 0 ?
@@ -1333,6 +1398,14 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
 
   if (node->flag & PBVH_UpdateDrawBuffers) {
     const int update_flags = pbvh_get_buffers_update_flags(pbvh);
+
+    if (node->draw_batches) {
+      PBVH_GPU_Args args;
+
+      pbvh_draw_args(pbvh, &args, node);
+      GPU_pbvh_node_update(node->draw_batches, &args);
+    }
+
     switch (pbvh->header.type) {
       case PBVH_GRIDS:
         GPU_pbvh_grid_buffers_update(pbvh->vbo_id,
@@ -1378,6 +1451,11 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
 
 void pbvh_free_draw_buffers(PBVH *pbvh, PBVHNode *node)
 {
+  if (node->draw_batches) {
+    GPU_pbvh_node_free(node->draw_batches);
+    node->draw_batches = NULL;
+  }
+
   if (node->draw_buffers) {
     pbvh->draw_cache_invalid = true;
 
@@ -1494,6 +1572,10 @@ static void pbvh_update_draw_buffers(PBVH *pbvh, PBVHNode **nodes, int totnode,
     if (node->flag & PBVH_UpdateDrawBuffers) {
       /* Flush buffers uses OpenGL, so not in parallel. */
       GPU_pbvh_buffers_update_flush(node->draw_buffers);
+
+      if (node->draw_batches) {
+        GPU_pbvh_node_gpu_flush(node->draw_batches);
+      }
     }
 
     node->flag &= ~(PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers);
@@ -2847,15 +2929,18 @@ static bool pbvh_draw_search_cb(PBVHNode *node, void *data_v)
   return true;
 }
 
-void BKE_pbvh_draw_cb(PBVH *pbvh,
-                      bool update_only_visible,
-                      PBVHFrustumPlanes *update_frustum,
-                      PBVHFrustumPlanes *draw_frustum,
-                      void (*draw_fn)(void *user_data, GPU_PBVH_Buffers *buffers),
-                      void *user_data,
-                      bool UNUSED(full_render),
-                      PBVHAttrReq *attrs,
-                      int attrs_num)
+ATTR_NO_OPT void BKE_pbvh_draw_cb(PBVH *pbvh,
+                                  bool update_only_visible,
+                                  PBVHFrustumPlanes *update_frustum,
+                                  PBVHFrustumPlanes *draw_frustum,
+                                  void (*draw_fn)(void *user_data,
+                                                  GPU_PBVH_Buffers *buffers,
+                                                  PBVHBatches *batches,
+                                                  PBVH_GPU_Args *args),
+                                  void *user_data,
+                                  bool UNUSED(full_render),
+                                  PBVHAttrReq *attrs,
+                                  int attrs_num)
 {
   PBVHNode **nodes;
   int totnode;
@@ -2891,10 +2976,14 @@ void BKE_pbvh_draw_cb(PBVH *pbvh,
   PBVHDrawSearchData draw_data = {.frustum = draw_frustum, .accum_update_flag = 0};
   BKE_pbvh_search_gather(pbvh, pbvh_draw_search_cb, &draw_data, &nodes, &totnode);
 
+  PBVH_GPU_Args args;
+
   for (int i = 0; i < totnode; i++) {
     PBVHNode *node = nodes[i];
     if (!(node->flag & PBVH_FullyHidden)) {
-      draw_fn(user_data, node->draw_buffers);
+      pbvh_draw_args(pbvh, &args, node);
+
+      draw_fn(user_data, node->draw_buffers, node->draw_batches, &args);
     }
   }
 
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h
index 0edf224e5ff..632871ae66b 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -34,6 +34,7 @@ struct MeshElemMap;
 struct PBVHNode {
   /* Opaque handle for drawing code */
   struct GPU_PBVH_Buffers *draw_buffers;
+  struct PBVHBatches *draw_batches;
 
   /* Voxel bounds */
   BB vb;
diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c
index 975d9e299bf..86c565371c1 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -199,7 +199,7 @@ static void basic_cache_populate(void *vedata, Object *ob)
   }
 
   if (use_sculpt_pbvh) {
-    DRW_shgroup_call_sculpt(shgrp, ob, false, false);
+    DRW_shgroup_call_sculpt(shgrp, o

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list