Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2019-05-08 00:21:16 +0300
committerClément Foucault <foucault.clem@gmail.com>2019-05-08 18:52:48 +0300
commit0030e4da7073d62561cca508330ab150b37ee6eb (patch)
treec1d25b9a92ed3aeb4f9c3bee03e32de7e721a7f4 /source
parent05b0f52aa78344a4a74b816fd1d025aa344ec28c (diff)
DRW: Make batch validation run first during iteration
This reduces the cost of querying the batches to the batch cache.
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/intern/draw_cache.c22
-rw-r--r--source/blender/draw/intern/draw_cache_impl.h4
-rw-r--r--source/blender/draw/intern/draw_cache_impl_curve.c6
-rw-r--r--source/blender/draw/intern/draw_cache_impl_lattice.c6
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c6
-rw-r--r--source/blender/draw/intern/draw_cache_impl_metaball.c6
-rw-r--r--source/blender/draw/intern/draw_manager.c5
-rw-r--r--source/blender/draw/intern/draw_manager.h1
8 files changed, 52 insertions, 4 deletions
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index be95b0a5325..de203906f83 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -3953,6 +3953,28 @@ GPUBatch *DRW_cache_cursor_get(bool crosshair_lines)
/** \name Batch Cache Impl. common
* \{ */
+void drw_batch_cache_validate(Object *ob)
+{
+ switch (ob->type) {
+ case OB_MESH:
+ DRW_mesh_batch_cache_validate((Mesh *)ob->data);
+ break;
+ case OB_CURVE:
+ case OB_FONT:
+ case OB_SURF:
+ DRW_curve_batch_cache_validate((Curve *)ob->data);
+ break;
+ case OB_MBALL:
+ DRW_mball_batch_cache_validate((MetaBall *)ob->data);
+ break;
+ case OB_LATTICE:
+ DRW_lattice_batch_cache_validate((Lattice *)ob->data);
+ break;
+ default:
+ break;
+ }
+}
+
void drw_batch_cache_generate_requested(Object *ob)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index dcc842ce652..4dc58972ce6 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -44,15 +44,19 @@ struct bGPdata;
/* Expose via BKE callbacks */
void DRW_mball_batch_cache_dirty_tag(struct MetaBall *mb, int mode);
+void DRW_mball_batch_cache_validate(struct MetaBall *mb);
void DRW_mball_batch_cache_free(struct MetaBall *mb);
void DRW_curve_batch_cache_dirty_tag(struct Curve *cu, int mode);
+void DRW_curve_batch_cache_validate(struct Curve *cu);
void DRW_curve_batch_cache_free(struct Curve *cu);
void DRW_mesh_batch_cache_dirty_tag(struct Mesh *me, int mode);
+void DRW_mesh_batch_cache_validate(struct Mesh *me);
void DRW_mesh_batch_cache_free(struct Mesh *me);
void DRW_lattice_batch_cache_dirty_tag(struct Lattice *lt, int mode);
+void DRW_lattice_batch_cache_validate(struct Lattice *lt);
void DRW_lattice_batch_cache_free(struct Lattice *lt);
void DRW_particle_batch_cache_dirty_tag(struct ParticleSystem *psys, int mode);
diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c
index a417d64cf41..663fbf647a6 100644
--- a/source/blender/draw/intern/draw_cache_impl_curve.c
+++ b/source/blender/draw/intern/draw_cache_impl_curve.c
@@ -474,12 +474,16 @@ static void curve_batch_cache_init(Curve *cu)
cache->is_dirty = false;
}
-static CurveBatchCache *curve_batch_cache_get(Curve *cu)
+void DRW_curve_batch_cache_validate(Curve *cu)
{
if (!curve_batch_cache_valid(cu)) {
curve_batch_cache_clear(cu);
curve_batch_cache_init(cu);
}
+}
+
+static CurveBatchCache *curve_batch_cache_get(Curve *cu)
+{
return cu->batch_cache;
}
diff --git a/source/blender/draw/intern/draw_cache_impl_lattice.c b/source/blender/draw/intern/draw_cache_impl_lattice.c
index b5223bc047c..8b3864684b5 100644
--- a/source/blender/draw/intern/draw_cache_impl_lattice.c
+++ b/source/blender/draw/intern/draw_cache_impl_lattice.c
@@ -340,12 +340,16 @@ static void lattice_batch_cache_init(Lattice *lt)
cache->is_dirty = false;
}
-static LatticeBatchCache *lattice_batch_cache_get(Lattice *lt)
+void DRW_lattice_batch_cache_validate(Lattice *lt)
{
if (!lattice_batch_cache_valid(lt)) {
lattice_batch_cache_clear(lt);
lattice_batch_cache_init(lt);
}
+}
+
+static LatticeBatchCache *lattice_batch_cache_get(Lattice *lt)
+{
return lt->batch_cache;
}
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 1f96a21dd94..f2b79b0d0e1 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -2095,12 +2095,16 @@ static void mesh_batch_cache_init(Mesh *me)
drw_mesh_weight_state_clear(&cache->weight_state);
}
-static MeshBatchCache *mesh_batch_cache_get(Mesh *me)
+void DRW_mesh_batch_cache_validate(Mesh *me)
{
if (!mesh_batch_cache_valid(me)) {
mesh_batch_cache_clear(me);
mesh_batch_cache_init(me);
}
+}
+
+static MeshBatchCache *mesh_batch_cache_get(Mesh *me)
+{
return me->runtime.batch_cache;
}
diff --git a/source/blender/draw/intern/draw_cache_impl_metaball.c b/source/blender/draw/intern/draw_cache_impl_metaball.c
index 432c5092274..60f15338412 100644
--- a/source/blender/draw/intern/draw_cache_impl_metaball.c
+++ b/source/blender/draw/intern/draw_cache_impl_metaball.c
@@ -98,12 +98,16 @@ static void metaball_batch_cache_init(MetaBall *mb)
cache->is_manifold = false;
}
-static MetaBallBatchCache *metaball_batch_cache_get(MetaBall *mb)
+void DRW_mball_batch_cache_validate(MetaBall *mb)
{
if (!metaball_batch_cache_valid(mb)) {
metaball_batch_cache_clear(mb);
metaball_batch_cache_init(mb);
}
+}
+
+static MetaBallBatchCache *metaball_batch_cache_get(MetaBall *mb)
+{
return mb->batch_cache;
}
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 95f34fec131..773a5ec2c9c 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1157,6 +1157,8 @@ static void drw_engines_cache_populate(Object *ob)
* ourselves here. */
drw_drawdata_unlink_dupli((ID *)ob);
+ drw_batch_cache_validate(ob);
+
int i = 0;
for (LinkData *link = DST.enabled_engines.first; link; link = link->next, i++) {
DrawEngineType *engine = link->data;
@@ -2096,6 +2098,9 @@ void DRW_render_object_iter(
DST.dupli_parent = data_.dupli_parent;
DST.dupli_source = data_.dupli_object_current;
DST.ob_state = NULL;
+
+ drw_batch_cache_validate(ob);
+
callback(vedata, ob, engine, depsgraph);
drw_batch_cache_generate_requested(DST.dupli_source ? DST.dupli_source->ob : ob);
diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h
index e592101b10c..f0051455c4a 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -442,6 +442,7 @@ void drw_state_set(DRWState state);
void drw_debug_draw(void);
void drw_debug_init(void);
+void drw_batch_cache_validate(Object *ob);
void drw_batch_cache_generate_requested(struct Object *ob);
extern struct GPUVertFormat *g_pos_format;