DRW: Fix issues with multiview

Resource ids buf must be allocated for the worst case scenario.
Also fix issue with non procedural data overriding procedural view.
This commit is contained in:
Clément Foucault
2022-12-29 18:20:48 +01:00
parent 2652029f3b
commit 363e5e28ee
4 changed files with 8 additions and 5 deletions

View File

@@ -597,7 +597,7 @@ void DrawMultiBuf::bind(RecordingState &state,
for (DrawGroup &group : MutableSpan<DrawGroup>(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. */

View File

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

View File

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

View File

@@ -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++) {