[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