From 0030e4da7073d62561cca508330ab150b37ee6eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Tue, 7 May 2019 23:21:16 +0200 Subject: DRW: Make batch validation run first during iteration This reduces the cost of querying the batches to the batch cache. --- source/blender/draw/intern/draw_cache.c | 22 ++++++++++++++++++++++ source/blender/draw/intern/draw_cache_impl.h | 4 ++++ source/blender/draw/intern/draw_cache_impl_curve.c | 6 +++++- .../blender/draw/intern/draw_cache_impl_lattice.c | 6 +++++- source/blender/draw/intern/draw_cache_impl_mesh.c | 6 +++++- .../blender/draw/intern/draw_cache_impl_metaball.c | 6 +++++- source/blender/draw/intern/draw_manager.c | 5 +++++ source/blender/draw/intern/draw_manager.h | 1 + 8 files changed, 52 insertions(+), 4 deletions(-) (limited to 'source') 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; -- cgit v1.2.3