DRW: Make shaded batch validation more correct
This is in order to support garbage collection of unused Custom data layer uploaded to the GPU. Actual Garbage Collection is not added by this commit.
This commit is contained in:
parent
0ebf43b4d0
commit
973e64cf9c
|
@ -4198,16 +4198,16 @@ GPUBatch **DRW_mesh_batch_cache_get_surface_shaded(Mesh *me,
|
|||
|
||||
BLI_assert(gpumat_array_len == cache->mat_len);
|
||||
|
||||
bool cd_overlap = mesh_cd_layers_type_overlap(cache->cd_used, cd_needed);
|
||||
if (!cd_overlap) {
|
||||
mesh_cd_layers_type_merge(&cache->cd_needed, cd_needed);
|
||||
mesh_cd_layers_type_merge(&cache->cd_needed, cd_needed);
|
||||
|
||||
if (!mesh_cd_layers_type_overlap(cache->cd_used, cd_needed)) {
|
||||
mesh_cd_extract_auto_layers_names_and_srgb(me,
|
||||
cache->cd_needed,
|
||||
&cache->auto_layer_names,
|
||||
&cache->auto_layer_is_srgb,
|
||||
&cache->auto_layer_len);
|
||||
}
|
||||
|
||||
if (auto_layer_names) {
|
||||
*auto_layer_names = cache->auto_layer_names;
|
||||
*auto_layer_is_srgb = cache->auto_layer_is_srgb;
|
||||
|
@ -4733,6 +4733,18 @@ void DRW_mesh_batch_cache_create_requested(
|
|||
drw_mesh_weight_state_clear(&wstate);
|
||||
}
|
||||
|
||||
/* Optimization : Only create orco layer if mesh is deformed. */
|
||||
if (cache->cd_needed.orco != 0) {
|
||||
CustomData *cd_vdata = (me->edit_mesh) ? &me->edit_mesh->bm->vdata : &me->vdata;
|
||||
if (CustomData_get_layer(cd_vdata, CD_ORCO) != NULL && ob->modifiers.first != NULL) {
|
||||
/* Orco layer is needed. */
|
||||
}
|
||||
else if (cache->cd_needed.tan_orco == 0) {
|
||||
/* Skip orco calculation if not needed by tangent generation. */
|
||||
cache->cd_needed.orco = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Verify that all surface batches have needed attribute layers. */
|
||||
/* TODO(fclem): We could be a bit smarter here and only do it per material. */
|
||||
bool cd_overlap = mesh_cd_layers_type_overlap(cache->cd_used, cache->cd_needed);
|
||||
|
@ -4929,15 +4941,7 @@ void DRW_mesh_batch_cache_create_requested(
|
|||
DRW_vbo_request(cache->surf_per_mat[i], &cache->ordered.loop_vcol);
|
||||
}
|
||||
if (cache->cd_used.orco != 0) {
|
||||
/* OPTI : Only do that if there is modifiers that modify orcos. */
|
||||
CustomData *cd_vdata = (me->edit_mesh) ? &me->edit_mesh->bm->vdata : &me->vdata;
|
||||
if (CustomData_get_layer(cd_vdata, CD_ORCO) != NULL && ob->modifiers.first != NULL) {
|
||||
DRW_vbo_request(cache->surf_per_mat[i], &cache->ordered.loop_orco);
|
||||
}
|
||||
else if (cache->cd_used.tan_orco == 0) {
|
||||
/* Skip orco calculation if not needed by tangent generation. */
|
||||
cache->cd_used.orco = 0;
|
||||
}
|
||||
DRW_vbo_request(cache->surf_per_mat[i], &cache->ordered.loop_orco);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -914,17 +914,6 @@ static void rna_3DViewShading_type_update(Main *bmain, Scene *scene, PointerRNA
|
|||
return;
|
||||
}
|
||||
|
||||
for (Material *ma = bmain->materials.first; ma; ma = ma->id.next) {
|
||||
/* XXX Dependency graph does not support CD mask tracking,
|
||||
* so we trigger materials shading for until it's properly supported.
|
||||
* This is to ensure material batches are all recreated when switching
|
||||
* shading type. In the future DEG should replace this and just tag
|
||||
* the meshes itself.
|
||||
* This hack just tag BKE_MESH_BATCH_DIRTY_SHADING for every mesh that
|
||||
* have a material. (see T55059) */
|
||||
DEG_id_tag_update(&ma->id, ID_RECALC_SHADING);
|
||||
}
|
||||
|
||||
View3DShading *shading = ptr->data;
|
||||
if (shading->type == OB_MATERIAL ||
|
||||
(shading->type == OB_RENDER &&
|
||||
|
|
Loading…
Reference in New Issue