Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2022-08-29 13:29:14 +0300
committerClément Foucault <foucault.clem@gmail.com>2022-08-29 13:29:14 +0300
commit048ca79b326dc1d81057e43d9d4674b654a45af9 (patch)
tree5e091242f07eba61e73dd2d72a077a753a540815
parentdebcb3027e4d56ba8d56a26459eda507db722466 (diff)
Fix crash when rendering empty mesh object
-rw-r--r--source/blender/draw/intern/draw_command.cc6
-rw-r--r--source/blender/draw/intern/shaders/draw_command_generate_comp.glsl8
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