[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