From f05b9dba26607c319fa2246ec915490f10ca86e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 22 May 2019 13:27:43 +0200 Subject: DRW: Only change VAO if geometry changes --- source/blender/draw/intern/draw_manager.h | 1 + source/blender/draw/intern/draw_manager_exec.c | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) (limited to 'source/blender/draw') diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 69de4485b5c..6cf70f555eb 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -293,6 +293,7 @@ typedef struct DRWManager { /* Rendering state */ GPUShader *shader; + GPUBatch *batch; /* Managed by `DRW_state_set`, `DRW_state_reset` */ DRWState state; diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index 05356740041..7c53d8f4fff 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -587,18 +587,22 @@ static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCall *call) } } -static void draw_geometry_execute(DRWShadingGroup *shgroup, - GPUBatch *geom, - uint vert_first, - uint vert_count, - uint inst_first, - uint inst_count) +BLI_INLINE void draw_geometry_execute(DRWShadingGroup *shgroup, + GPUBatch *geom, + uint vert_first, + uint vert_count, + uint inst_first, + uint inst_count) { /* bind vertex array */ - GPU_batch_program_set_no_use( - geom, GPU_shader_get_program(shgroup->shader), GPU_shader_get_interface(shgroup->shader)); + if (DST.batch != geom) { + DST.batch = geom; - GPU_batch_bind(geom); + GPU_batch_program_set_no_use( + geom, GPU_shader_get_program(shgroup->shader), GPU_shader_get_interface(shgroup->shader)); + + GPU_batch_bind(geom); + } /* XXX hacking gawain. we don't want to call glUseProgram! (huge performance loss) */ geom->program_in_use = true; @@ -898,6 +902,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state) } GPU_shader_bind(shgroup->shader); DST.shader = shgroup->shader; + DST.batch = NULL; } if (shgroup->tfeedback_target != NULL) { -- cgit v1.2.3