diff --git a/source/blender/draw/intern/draw_command.cc b/source/blender/draw/intern/draw_command.cc index 58bca3b9792..8c89c28a628 100644 --- a/source/blender/draw/intern/draw_command.cc +++ b/source/blender/draw/intern/draw_command.cc @@ -597,7 +597,7 @@ void DrawMultiBuf::bind(RecordingState &state, for (DrawGroup &group : MutableSpan(group_buf_.data(), group_count_)) { /* Compute prefix sum of all instance of previous group. */ group.start = resource_id_count_; - resource_id_count_ += group.len; + resource_id_count_ += group.len * view_len; int batch_inst_len; /* Now that GPUBatches are guaranteed to be finished, extract their parameters. */ diff --git a/source/blender/draw/intern/draw_view.cc b/source/blender/draw/intern/draw_view.cc index 28e8bef912b..2e303aa9295 100644 --- a/source/blender/draw/intern/draw_view.cc +++ b/source/blender/draw/intern/draw_view.cc @@ -205,7 +205,7 @@ void View::frustum_culling_sphere_calc(const BoundBox &bbox, BoundSphere &bspher void View::bind() { - if (dirty_) { + if (dirty_ && !procedural_) { dirty_ = false; data_.push_update(); culling_.push_update(); diff --git a/source/blender/draw/intern/draw_view.hh b/source/blender/draw/intern/draw_view.hh index 5c5f20df1c3..cded44e5a56 100644 --- a/source/blender/draw/intern/draw_view.hh +++ b/source/blender/draw/intern/draw_view.hh @@ -51,10 +51,11 @@ class View { bool do_visibility_ = true; bool dirty_ = true; bool frozen_ = false; + bool procedural_ = false; public: - View(const char *name, int view_len = 1) - : visibility_buf_(name), debug_name_(name), view_len_(view_len) + View(const char *name, int view_len = 1, bool procedural = false) + : visibility_buf_(name), debug_name_(name), view_len_(view_len), procedural_(procedural) { BLI_assert(view_len < DRW_VIEW_MAX); } 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 b08c5a4d314..ddb4baf8f5b 100644 --- a/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl +++ b/source/blender/draw/intern/shaders/draw_command_generate_comp.glsl @@ -51,6 +51,8 @@ void main() if (visibility_word_per_draw > 0) { uint visibility_word = resource_index * visibility_word_per_draw; for (uint i = 0; i < visibility_word_per_draw; i++, visibility_word++) { + /* \note: This assumes proto.instance_len is 1. */ + /* TODO: Assert. */ visible_instance_len += bitCount(visibility_buf[visibility_word]); } } @@ -89,7 +91,7 @@ void main() } } - /* Fill resource_id buffer for each instance of this draw */ + /* Fill resource_id buffer for each instance of this draw. */ if (visibility_word_per_draw > 0) { uint visibility_word = resource_index * visibility_word_per_draw; for (uint i = 0; i < visibility_word_per_draw; i++, visibility_word++) {