From 048ca79b326dc1d81057e43d9d4674b654a45af9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Mon, 29 Aug 2022 12:29:14 +0200 Subject: Fix crash when rendering empty mesh object --- source/blender/draw/intern/draw_command.cc | 6 ++++-- .../blender/draw/intern/shaders/draw_command_generate_comp.glsl | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/source/blender/draw/intern/draw_command.cc b/source/blender/draw/intern/draw_command.cc index 569f56967a0..b531f3f9e29 100644 --- a/source/blender/draw/intern/draw_command.cc +++ b/source/blender/draw/intern/draw_command.cc @@ -494,7 +494,9 @@ void DrawCommandBuf::bind(RecordingState &state, * instance to set the correct resource_id. Workaround is a storage_buf + gl_InstanceID. */ BLI_assert(batch_inst_len == 1); - cmd.vertex_len = max_ii(cmd.vertex_len, batch_vert_len); + if (cmd.vertex_len == (uint)-1) { + cmd.vertex_len = batch_vert_len; + } if (cmd.handle.raw > 0) { /* Save correct offset to start of resource_id buffer region for this draw. */ @@ -546,7 +548,7 @@ void DrawMultiBuf::bind(RecordingState &state, /* Tag group as using index draw (changes indirect draw call structure). */ if (group.gpu_batch->elem != nullptr) { - group.vertex_len = -group.vertex_len; + group.base_index = -1; } /* Instancing attributes are not supported using the new pipeline since we use the base diff --git a/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl b/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl index 5adcb0b441d..e1aeb08410e 100644 --- a/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl +++ b/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl @@ -11,7 +11,7 @@ void write_draw_call(DrawGroup group, uint group_id) { DrawCommand cmd; - cmd.vertex_len = abs(group.vertex_len); + cmd.vertex_len = group.vertex_len; cmd.vertex_first = group.vertex_first; if (group.base_index != -1) { cmd.base_index = group.base_index; @@ -20,11 +20,13 @@ void write_draw_call(DrawGroup group, uint group_id) else { cmd._instance_first_array = group.start; } + /* NOTE: Set instance count to 0 if vertex count is 0 to avoid a crash in some drivers. */ + /* Back-facing command. */ - cmd.instance_len = group_buf[group_id].back_facing_counter; + cmd.instance_len = (cmd.vertex_len == 0) ? 0 : group_buf[group_id].back_facing_counter; command_buf[group_id * 2 + 0] = cmd; /* Front-facing command. */ - cmd.instance_len = group_buf[group_id].front_facing_counter; + cmd.instance_len = (cmd.vertex_len == 0) ? 0 : group_buf[group_id].front_facing_counter; command_buf[group_id * 2 + 1] = cmd; /* Reset the counters for a next command gen dispatch. Avoids resending the whole data just -- cgit v1.2.3