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.
This commit is contained in:
Clément Foucault
2020-02-18 18:19:12 +01:00
parent 56d6666689
commit 77619f5274

View File

@@ -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);