[Bf-blender-cvs] [81fa0b15b57] temp-pbvh-vbos: temp-pbvh-vbos: Make requested changes

Joseph Eagar noreply at git.blender.org
Tue Sep 27 21:28:38 CEST 2022


Commit: 81fa0b15b575a49f1f1c5d25ab8384921807afb9
Author: Joseph Eagar
Date:   Tue Sep 27 12:27:36 2022 -0700
Branches: temp-pbvh-vbos
https://developer.blender.org/rB81fa0b15b575a49f1f1c5d25ab8384921807afb9

temp-pbvh-vbos: Make requested changes

Also finished color attribute code, which was
missing support for corners and byte colors.

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

M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenlib/BLI_math_vec_types.hh
M	source/blender/draw/intern/draw_cache_impl_mesh.cc
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_pbvh.cc

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

diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index 9eddb4cd34f..23cefa14a73 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -513,7 +513,7 @@ 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)
+static void pbvh_draw_args_init(PBVH *pbvh, PBVH_GPU_Args *args, PBVHNode *node)
 {
   memset((void *)args, 0, sizeof(*args));
 
@@ -1349,7 +1349,7 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
 
   if (node->flag & PBVH_RebuildDrawBuffers) {
     PBVH_GPU_Args args;
-    pbvh_draw_args(pbvh, &args, node);
+    pbvh_draw_args_init(pbvh, &args, node);
 
     node->draw_batches = DRW_pbvh_node_create(&args);
   }
@@ -1360,7 +1360,7 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata,
     if (node->draw_batches) {
       PBVH_GPU_Args args;
 
-      pbvh_draw_args(pbvh, &args, node);
+      pbvh_draw_args_init(pbvh, &args, node);
       DRW_pbvh_node_update(node->draw_batches, &args);
     }
   }
@@ -1406,7 +1406,7 @@ static void pbvh_update_draw_buffers(PBVH *pbvh, PBVHNode **nodes, int totnode,
       else if ((node->flag & PBVH_UpdateDrawBuffers) && node->draw_batches) {
         PBVH_GPU_Args args;
 
-        pbvh_draw_args(pbvh, &args, node);
+        pbvh_draw_args_init(pbvh, &args, node);
         DRW_pbvh_update_pre(node->draw_batches, &args);
       }
     }
@@ -2834,7 +2834,7 @@ void BKE_pbvh_draw_cb(PBVH *pbvh,
   for (int i = 0; i < totnode; i++) {
     PBVHNode *node = nodes[i];
     if (!(node->flag & PBVH_FullyHidden)) {
-      pbvh_draw_args(pbvh, &args, node);
+      pbvh_draw_args_init(pbvh, &args, node);
 
       draw_fn(user_data, node->draw_batches, &args);
     }
diff --git a/source/blender/blenlib/BLI_math_vec_types.hh b/source/blender/blenlib/BLI_math_vec_types.hh
index c19317867a9..5916193894b 100644
--- a/source/blender/blenlib/BLI_math_vec_types.hh
+++ b/source/blender/blenlib/BLI_math_vec_types.hh
@@ -556,6 +556,11 @@ template<typename T, int Size> struct vec_base : public vec_struct_base<T, Size>
   }
 };
 
+using char3 = blender::vec_base<int8_t, 3>;
+
+using uchar3 = blender::vec_base<uint8_t, 3>;
+using uchar4 = blender::vec_base<uint8_t, 4>;
+
 using int2 = vec_base<int32_t, 2>;
 using int3 = vec_base<int32_t, 3>;
 using int4 = vec_base<int32_t, 4>;
@@ -564,7 +569,11 @@ using uint2 = vec_base<uint32_t, 2>;
 using uint3 = vec_base<uint32_t, 3>;
 using uint4 = vec_base<uint32_t, 4>;
 
+using short3 = blender::vec_base<int16_t, 3>;
+
 using ushort2 = vec_base<uint16_t, 2>;
+using ushort3 = blender::vec_base<uint16_t, 3>;
+using ushort4 = blender::vec_base<uint16_t, 4>;
 
 using float2 = vec_base<float, 2>;
 using float3 = vec_base<float, 3>;
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.cc b/source/blender/draw/intern/draw_cache_impl_mesh.cc
index ee1322846e2..0166c4977d4 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.cc
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.cc
@@ -62,6 +62,7 @@
 #include "draw_subdivision.h"
 
 #include "draw_cache_impl.h" /* own include */
+#include "draw_manager.h"
 
 #include "mesh_extractors/extract_mesh.hh"
 
@@ -977,12 +978,12 @@ GPUBatch *DRW_mesh_batch_cache_get_edit_mesh_analysis(Mesh *me)
   return DRW_batch_request(&cache->batch.edit_mesh_analysis);
 }
 
-extern "C" void DRW_mesh_get_attributes(Object *object,
-                                        Mesh *me,
-                                        struct GPUMaterial **gpumat_array,
-                                        int gpumat_array_len,
-                                        DRW_Attributes *r_attrs,
-                                        DRW_MeshCDMask *r_cd_needed)
+void DRW_mesh_get_attributes(Object *object,
+                             Mesh *me,
+                             struct GPUMaterial **gpumat_array,
+                             int gpumat_array_len,
+                             DRW_Attributes *r_attrs,
+                             DRW_MeshCDMask *r_cd_needed)
 {
   DRW_Attributes attrs_needed;
   drw_attributes_clear(&attrs_needed);
@@ -991,8 +992,6 @@ extern "C" void DRW_mesh_get_attributes(Object *object,
 
   BLI_assert(gpumat_array_len == cache->mat_len);
 
-  ThreadMutex *mesh_render_mutex = (ThreadMutex *)me->runtime.render_mutex;
-
   if (r_attrs) {
     *r_attrs = attrs_needed;
   }
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 2c8b43f3cb4..6f70b2a43ed 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -34,6 +34,7 @@
 #include "BLI_listbase.h"
 #include "BLI_memblock.h"
 #include "BLI_mempool.h"
+#include "BLI_math_bits.h"
 
 #ifdef DRW_DEBUG_CULLING
 #  include "BLI_math_bits.h"
@@ -1170,7 +1171,6 @@ static void sculpt_draw_cb(DRWSculptCallbackData *scd,
     return;
   }
 
-  // GPUBatch *geom2 = GPU_pbvh_buffers_batch_get(buffers, scd->fast_mode, scd->use_wire);
   int primcount;
   GPUBatch *geom;
 
@@ -1412,11 +1412,7 @@ void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **shgroups,
   int attrs_num = 2 + draw_attrs.num_requests;
 
   /* UV maps are not in attribute requests. */
-  for (uint i = 0; i < 32; i++) {
-    if (cd_needed.uv & (1 << i)) {
-      attrs_num++;
-    }
-  }
+  attrs_num += count_bits_i(cd_needed.uv);
 
   PBVHAttrReq *attrs = BLI_array_alloca(attrs, attrs_num);
 
@@ -1429,7 +1425,6 @@ void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **shgroups,
   for (int i = 0; i < draw_attrs.num_requests; i++) {
     DRW_AttributeRequest *req = draw_attrs.requests + i;
 
-    printf("%d: %d: %s\n", req->domain, req->cd_type, req->attribute_name);
     attrs[attrs_i].type = req->cd_type;
     attrs[attrs_i].domain = req->domain;
     BLI_strncpy(attrs[attrs_i].name, req->attribute_name, sizeof(attrs->name));
diff --git a/source/blender/draw/intern/draw_pbvh.cc b/source/blender/draw/intern/draw_pbvh.cc
index 9c90ef1676a..db854972ce8 100644
--- a/source/blender/draw/intern/draw_pbvh.cc
+++ b/source/blender/draw/intern/draw_pbvh.cc
@@ -4,9 +4,21 @@
 /** \file
  * \ingroup gpu
  *
- * Mesh drawing using OpenGL VBO (Vertex Buffer Objects)
+ * PBVH drawing.  Embedds GPU meshes inside of PBVH nodes,
+ * used by mesh sculpt mode.
  */
 
+/* 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
+
 #include <limits.h>
 #include <stddef.h>
 #include <stdlib.h>
@@ -52,20 +64,20 @@
 #include <algorithm>
 #include <string>
 
+using blender::char3;
 using blender::float2;
 using blender::float3;
 using blender::float4;
 using blender::IndexRange;
 using blender::Map;
+using blender::short3;
+using blender::uchar3;
+using blender::uchar4;
+using blender::ushort3;
+using blender::ushort4;
 using blender::Vector;
 
 using string = std::string;
-using ushort3 = blender::vec_base<uint16_t, 3>;
-using ushort4 = blender::vec_base<uint16_t, 4>;
-using short3 = blender::vec_base<int16_t, 3>;
-using uchar3 = blender::vec_base<uint8_t, 3>;
-using char3 = blender::vec_base<int8_t, 3>;
-using uchar4 = blender::vec_base<uint8_t, 4>;
 
 struct PBVHVbo {
   uint64_t type;
@@ -290,7 +302,8 @@ struct PBVHBatches {
   void fill_vbo_normal_faces(
       PBVHVbo &vbo,
       PBVH_GPU_Args *args,
-      std::function<void(std::function<void(int, int, int, const MLoopTri *)> callback)> foreach,
+      std::function<void(std::function<void(int, int, int, const MLoopTri *)> callback)>
+          foreach_faces,
       GPUVertBufRaw *access)
   {
     float fno[3];
@@ -298,7 +311,7 @@ struct PBVHBatches {
     int last_poly = -1;
     bool smooth = false;
 
-    foreach ([&](int buffer_i, int tri_i, int vertex_i, const MLoopTri *tri) {
+    foreach_faces([&](int buffer_i, int tri_i, int vertex_i, const MLoopTri *tri) {
       const MPoly *mp = args->mpoly + tri->poly;
 
       if (tri->poly != last_poly) {
@@ -318,22 +331,16 @@ struct PBVHBatches {
         normal_float_to_short_v3(no, args->vert_normals[vertex_i]);
       }
 
-#if 0
-        no[0] = no[1] = no[2] = 0;
-        no[last_poly % 3] = (1 << 15) - 1;
-#endif
-
       *static_cast<short3 *>(GPU_vertbuf_raw_step(access)) = no;
-    })
-      ;
+    });
   }
 
   void fill_vbo_grids_intern(
       PBVHVbo &vbo,
       PBVH_GPU_Args *args,
       std::function<
-          void(std::function<void(int x, int y, int grid_index, CCGElem *elems[4], int i)>
-                   func)> foreach)
+          void(std::function<void(int x, int y, int grid_index, CCGElem *elems[4], int i)> func)>
+          foreach_grids)
   {
     uint vert_per_grid = square_i(args->ccg_key.grid_size - 1) * 4;
     uint vert_count = args->totprim * vert_per_grid;
@@ -349,79 +356,78 @@ struct PBVHBatches {
     GPUVertBufRaw access;
     GPU_vertbuf_attr_get_raw_data(vbo.vert_buf, 0, &access);
 
-    if (vbo.type == CD_PBVH_CO_TYPE) {
-      foreach ([&](int x, int y, int grid_index, CCGElem *elems[4], int i) {
-        float *co = CCG_elem_co(&args->ccg_key, elems[i]);
+    switch (vbo.type) {
+      case CD_PBVH_CO_TYPE:
+        foreach_grids([&](int x, int y, int grid_index, CCGElem *elems[4], int i) {
+          float *co = CCG_elem_co(&args->ccg_key, elems[i]);
 
-        *static_cast<float3 *>(GPU_vertbuf_raw_step(&access)) = co;
-      })
-        ;
-    }
+          *static_cast<float3 *>(GPU_vertbuf_raw_step(&access)) = co;
+        });
+        break;
 
-    if (vbo.type == CD_PBVH_NO_TYPE) {
-      foreach ([&](int x, int y, int grid_index, CCGElem *elems[4], int i) {
-        float3 no(0.0f, 0.0f, 0.0f);
+      case CD_PBVH_NO_TYPE:
+        foreach_grids([&](int x, int y, int grid_index, CCGElem *elems[4], int i) {
+          float3 no(0.0f, 0.0f, 0.0f);
 
-        const bool smooth = args->grid_flag_mats[grid_index].flag & ME_SMOOTH;
+          co

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list