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:
@@ -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. */
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user