diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-02-18 20:19:12 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-02-18 20:20:00 +0300 |
commit | 77619f527403608a349b3037d18f71893d4484d1 (patch) | |
tree | e62f7c366a858a0a8e0202419734d5ae3355d1db /source/blender/gpu/intern/gpu_batch.c | |
parent | 56d6666689f7027126e8c115d01564810d1ae1bb (diff) |
GPU: Fix huge performance regression regarding instancing
Under some circumstances, MultiDrawIndirect was disabled to improve perf.
of average scene. But this conflicted with the normal instancing buffer
filling if only 1 or 2 instances were needed to fill the buffer. All
consecutive drawcalls could not be batched together and performance would
degrade rapidly.
This patch make my instance test scene go from 11fps back to 40fps where
it should have been.
Diffstat (limited to 'source/blender/gpu/intern/gpu_batch.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_batch.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/source/blender/gpu/intern/gpu_batch.c b/source/blender/gpu/intern/gpu_batch.c index 75989db9ecf..731407a64f9 100644 --- a/source/blender/gpu/intern/gpu_batch.c +++ b/source/blender/gpu/intern/gpu_batch.c @@ -919,8 +919,12 @@ void GPU_draw_list_submit(GPUDrawList *list) /* Only do multi-draw indirect if doing more than 2 drawcall. * This avoids the overhead of buffer mapping if scene is - * not very instance friendly. */ - if (USE_MULTI_DRAW_INDIRECT && cmd_len > 2) { + * not very instance friendly. + * BUT we also need to take into account the case where only + * a few instances are needed to finish filling a call buffer. */ + const bool do_mdi = (cmd_len > 2) || (list->cmd_offset + bytes_used == list->buffer_size); + + if (USE_MULTI_DRAW_INDIRECT && do_mdi) { GLenum prim = batch->gl_prim_type; glBindBuffer(GL_DRAW_INDIRECT_BUFFER, list->buffer_id); |