[Bf-blender-cvs] [a4ce7b67415] sculpt-dev: Sculpt-dev: fix pbvh draw getting gpu format out of sync.
Joseph Eagar
noreply at git.blender.org
Wed Nov 17 22:14:51 CET 2021
Commit: a4ce7b6741514af5d570d44d1feefef9b1ccc057
Author: Joseph Eagar
Date: Wed Nov 17 13:14:10 2021 -0800
Branches: sculpt-dev
https://developer.blender.org/rBa4ce7b6741514af5d570d44d1feefef9b1ccc057
Sculpt-dev: fix pbvh draw getting gpu format
out of sync.
GPU_pbvh_update_attribute_names now returns a bool
if the format has changed.
===================================================================
M source/blender/blenkernel/intern/paint.c
M source/blender/blenkernel/intern/pbvh.c
M source/blender/blenkernel/intern/pbvh_bmesh.c
M source/blender/draw/DRW_engine.h
M source/blender/draw/intern/draw_cache.c
M source/blender/gpu/GPU_buffers.h
M source/blender/gpu/intern/gpu_buffers.c
===================================================================
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index 011dd71efa3..93d83166f65 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -3295,9 +3295,27 @@ void BKE_sculptsession_update_attr_refs(Object *ob)
ss, ob, scl->domain, scl->proptype, scl->name, scl, true, &scl->params);
}
}
+
+ if (ss->bm) {
+ BKE_sculptsession_bmesh_attr_update_internal(ob);
+ }
}
- if (ss->bm) {
- BKE_sculptsession_bmesh_attr_update_internal(ob);
+ if (ss->pbvh) {
+ Mesh *me = BKE_object_get_original_mesh(ob);
+ AttributeDomain domain;
+ CustomDataLayer *layer = NULL;
+
+ BKE_pbvh_get_color_layer(ss->pbvh, me, &layer, &domain);
+
+ ss->vcol_domain = domain;
+ ss->vcol_type = layer->type;
+
+ if (ss->bm) {
+ ss->cd_vcol_offset = layer->offset;
+ }
+ else {
+ ss->vcol = layer->data;
+ }
}
}
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c
index ec123ee803b..f8ed686176a 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -1698,14 +1698,24 @@ static void pbvh_update_draw_buffers(
}
}
- GPU_pbvh_update_attribute_names(vdata,
- ldata,
- GPU_pbvh_need_full_render_get(),
- pbvh->flags & PBVH_FAST_DRAW,
- pbvh->vcol_type,
- pbvh->vcol_domain,
- vcol_layer,
- render_vcol_layer);
+ /* rebuild all draw buffers if attribute layout changed */
+ if (GPU_pbvh_update_attribute_names(vdata,
+ ldata,
+ GPU_pbvh_need_full_render_get(),
+ pbvh->flags & PBVH_FAST_DRAW,
+ pbvh->vcol_type,
+ pbvh->vcol_domain,
+ vcol_layer,
+ render_vcol_layer)) {
+ // attribute layout changed; force rebuild
+ for (int i = 0; i < pbvh->totnode; i++) {
+ PBVHNode *node = pbvh->nodes + i;
+
+ if (node->flag & PBVH_Leaf) {
+ node->flag |= PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers | PBVH_UpdateRedraw;
+ }
+ }
+ }
if ((update_flag & PBVH_RebuildDrawBuffers) || ELEM(pbvh->type, PBVH_GRIDS, PBVH_BMESH)) {
/* Free buffers uses OpenGL, so not in parallel. */
@@ -3318,10 +3328,13 @@ void BKE_pbvh_draw_cb(PBVH *pbvh,
// bad global from gpu_buffers.c
extern bool pbvh_show_orig_co;
-void BKE_pbvh_draw_debug_cb(
- PBVH *pbvh,
- void (*draw_fn)(void *user_data, const float bmin[3], const float bmax[3], PBVHNodeFlags flag, int depth),
- void *user_data)
+void BKE_pbvh_draw_debug_cb(PBVH *pbvh,
+ void (*draw_fn)(void *user_data,
+ const float bmin[3],
+ const float bmax[3],
+ PBVHNodeFlags flag,
+ int depth),
+ void *user_data)
{
for (int a = 0; a < pbvh->totnode; a++) {
PBVHNode *node = &pbvh->nodes[a];
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index fbb415c2267..0454afebe38 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -1544,7 +1544,13 @@ static void pbvh_bmesh_create_leaf_fast_task_cb(void *__restrict userdata,
bool has_visible = false;
- n->flag = PBVH_Leaf | PBVH_UpdateTris;
+ /* Build GPU buffers for new node */
+
+ n->flag = PBVH_Leaf | PBVH_UpdateTris | PBVH_UpdateBB | PBVH_UpdateOriginalBB |
+ PBVH_UpdateTriAreas | PBVH_UpdateColor | PBVH_UpdateVisibility |
+ PBVH_UpdateDrawBuffers | PBVH_RebuildDrawBuffers | PBVH_UpdateCurvatureDir | PBVH_UpdateTriAreas
+ | PBVH_UpdateMask | PBVH_UpdateRedraw;
+
n->bm_faces = BLI_table_gset_new_ex("bm_faces", node->totface);
/* Create vert hash sets */
@@ -1591,9 +1597,6 @@ static void pbvh_bmesh_create_leaf_fast_task_cb(void *__restrict userdata,
n->orig_vb = n->vb;
- /* Build GPU buffers for new node and update vertex normals */
- BKE_pbvh_node_mark_rebuild_draw(n);
-
BKE_pbvh_node_fully_hidden_set(n, !has_visible);
n->flag |= PBVH_UpdateNormals | PBVH_UpdateCurvatureDir;
}
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 837dbe9a0a8..d63a3897249 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -83,7 +83,8 @@ void DRW_draw_region_engine_info(int xoffset, int *yoffset, int line_height);
void DRW_make_cdlayer_attr_aliases(struct GPUVertFormat *format,
char *base_name,
struct CustomData *data,
- struct CustomDataLayer *cl);
+ struct CustomDataLayer *cl,
+ bool is_active_render);
void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
struct RenderEngineType *engine_type,
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index f680b0bde4e..a972d3be9de 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -243,7 +243,7 @@ static void UNUSED_FUNCTION(add_fancy_edge)(GPUVertBuf *vbo,
GPU_vertbuf_attr_set(vbo, pos_id, (*v_idx)++, co2);
}
-#if 0 /* UNUSED */
+#if 0 /* UNUSED */
static void add_lat_lon_vert(GPUVertBuf *vbo,
uint pos_id,
uint nor_id,
@@ -488,7 +488,8 @@ static void sphere_lat_lon_vert(GPUVertBuf *vbo, int *v_ofs, float lat, float lo
void DRW_make_cdlayer_attr_aliases(GPUVertFormat *format,
char *base_name,
CustomData *data,
- CustomDataLayer *cl)
+ CustomDataLayer *cl,
+ bool is_active_render)
{
char attr_name[32], attr_safe_name[GPU_MAX_SAFE_ATTR_NAME];
const char *layer_name = cl->name;
@@ -506,9 +507,10 @@ void DRW_make_cdlayer_attr_aliases(GPUVertFormat *format,
GPU_vertformat_alias_add(format, attr_name);
/* Active render layer name. */
- if (i == CustomData_get_render_layer(data, cl->type)) {
+ if (is_active_render) {
GPU_vertformat_alias_add(format, base_name);
}
+
/* Active display layer name. */
if (i == CustomData_get_active_layer(data, cl->type)) {
BLI_snprintf(attr_name, sizeof(attr_name), "a%s", base_name);
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 202765c2712..835b17690de 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -110,7 +110,7 @@ void GPU_pbvh_mesh_buffers_update(GPU_PBVH_Buffers *buffers,
const int face_sets_color_default,
const int update_flags);
-void GPU_pbvh_update_attribute_names(
+bool GPU_pbvh_update_attribute_names(
CustomData *vdata,
CustomData *ldata,
bool need_full_render,
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 8bd0efbac69..04953fcc9ea 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -151,7 +151,7 @@ typedef struct ColorRef {
#define MAX_GPU_MCOL 256
-static struct {
+typedef struct PBVHGPUFormat {
GPUVertFormat format;
uint pos, nor, msk, fset, uv;
uint col[MAX_GPU_MCOL];
@@ -167,7 +167,9 @@ static struct {
bool active_vcol_only;
bool need_full_render;
bool fast_mode;
-} g_vbo_id = {{0}};
+} PBVHGPUFormat;
+
+static PBVHGPUFormat g_vbo_id = {{0}};
#ifdef NEW_ATTR_SYSTEM
static CDLayerType cd_vert_layers[] = {
@@ -1387,7 +1389,30 @@ bool GPU_pbvh_need_full_render_get()
return g_vbo_id.need_full_render;
}
-void GPU_pbvh_update_attribute_names(CustomData *vdata,
+static bool gpu_pbvh_format_equals(PBVHGPUFormat *a, PBVHGPUFormat *b)
+{
+ bool bad = false;
+
+ bad |= a->active_vcol_only != b->active_vcol_only;
+ bad |= a->fast_mode != b->fast_mode;
+ bad |= a->need_full_render != b->need_full_render;
+
+#ifdef NEW_ATTR_SYSTEM
+ bad |= a->vertex_attrs_len != b->vertex_attrs_len;
+ bad |= a->loop_attrs_len != b->loop_attrs_len;
+#endif
+
+ bad |= a->totcol != b->totcol;
+ bad |= a->pos != b->pos;
+ bad |= a->uv != b->uv;
+ bad |= a->fset != b->fset;
+ bad |= a->msk != b->msk;
+ bad |= a->nor != b->nor;
+
+ return !bad;
+}
+
+bool GPU_pbvh_update_attribute_names(CustomData *vdata,
CustomData *ldata,
bool need_full_render,
bool fast_mode,
@@ -1397,6 +1422,7 @@ void GPU_pbvh_update_attribute_names(CustomData *vdata,
CustomDataLayer *render_vcol_layer)
{
const bool active_only = !need_full_render;
+ PBVHGPUFormat old_format = g_vbo_id;
debug_pass++;
@@ -1484,7 +1510,9 @@ void GPU_pbvh_update_attribute_names(CustomData *vdata,
&g_vbo_id.format, "c", GPU_COMP_U16, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
g_vbo_id.totcol++;
- DRW_make_cdlayer_attr_aliases(&g_vbo_id.format, "c", cdata, cl);
+ bool is_render = cl == render_vcol_layer;
+
+ DRW_make_cdlayer_attr_aliases(&g_vbo_id.format, "c", cdata, cl, is_render);
if (cl == active_vcol_layer) {
GPU_vertformat_alias_add(&g_vbo_id.format, "ac");
@@ -1526,12 +1554,22 @@ void GPU_pbvh_update_attribute_names(CustomData *vdata,
const int cd_uv_index = CustomData_get_layer_index(ldata, CD_MLOOPUV);
CustomDataLayer *cl = ldata->lay
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list