Skip to content

Commit

Permalink
fix missing id fetches in rtree processing code
Browse files Browse the repository at this point in the history
  • Loading branch information
flar committed Aug 12, 2024
1 parent 2ac74c7 commit 69f638c
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 25 deletions.
5 changes: 3 additions & 2 deletions display_list/display_list.cc
Original file line number Diff line number Diff line change
Expand Up @@ -101,18 +101,19 @@ struct SaveInfo {
void DisplayList::RTreeResultsToIndexVector(
std::vector<DlIndex>& indices,
const std::vector<int>& rtree_results) const {
FML_DCHECK(rtree_);
auto cur_rect = rtree_results.begin();
auto end_rect = rtree_results.end();
if (cur_rect >= end_rect) {
return;
}
DlIndex next_render_index = *cur_rect++;
DlIndex next_render_index = rtree_->id(*cur_rect++);
DlIndex next_restore_index = std::numeric_limits<DlIndex>::max();
std::vector<SaveInfo> save_infos;
for (DlIndex index = 0u; index < offsets_.size(); index++) {
while (index > next_render_index) {
if (cur_rect < end_rect) {
next_render_index = *cur_rect++;
next_render_index = rtree_->id(*cur_rect++);
} else {
// Nothing left to render.
// Nothing left to do, but match our restores from the stack.
Expand Down
64 changes: 41 additions & 23 deletions display_list/display_list_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3236,31 +3236,43 @@ TEST_F(DisplayListTest, RTreeOfClippedSaveLayerFilterScene) {
}

TEST_F(DisplayListTest, RTreeRenderCulling) {
SkRect rect1 = SkRect::MakeLTRB(0, 0, 10, 10);
SkRect rect2 = SkRect::MakeLTRB(20, 0, 30, 10);
SkRect rect3 = SkRect::MakeLTRB(0, 20, 10, 30);
SkRect rect4 = SkRect::MakeLTRB(20, 20, 30, 30);
DlPaint paint1 = DlPaint().setColor(DlColor::kRed());
DlPaint paint2 = DlPaint().setColor(DlColor::kGreen());
DlPaint paint3 = DlPaint().setColor(DlColor::kBlue());
DlPaint paint4 = DlPaint().setColor(DlColor::kMagenta());

DisplayListBuilder main_builder(true);
DlOpReceiver& main_receiver = ToReceiver(main_builder);
main_receiver.drawRect({0, 0, 10, 10});
main_receiver.drawRect({20, 0, 30, 10});
main_receiver.drawRect({0, 20, 10, 30});
main_receiver.drawRect({20, 20, 30, 30});
main_builder.DrawRect(rect1, paint1);
main_builder.DrawRect(rect2, paint2);
main_builder.DrawRect(rect3, paint3);
main_builder.DrawRect(rect4, paint4);
auto main = main_builder.Build();

auto test = [main](SkIRect cull_rect, const sk_sp<DisplayList>& expected) {
auto test = [main](SkIRect cull_rect,
const sk_sp<DisplayList>& expected,
const std::string& label) {
SkRect cull_rectf = SkRect::Make(cull_rect);

{ // Test SkIRect culling
DisplayListBuilder culling_builder;
main->Dispatch(ToReceiver(culling_builder), cull_rect);

EXPECT_TRUE(DisplayListsEQ_Verbose(culling_builder.Build(), expected))
<< "using cull rect " << cull_rect;
<< "using cull rect " << cull_rect //
<< " where " << label;
}

{ // Test SkRect culling
DisplayListBuilder culling_builder;
main->Dispatch(ToReceiver(culling_builder), cull_rectf);

EXPECT_TRUE(DisplayListsEQ_Verbose(culling_builder.Build(), expected))
<< "using cull rect " << cull_rectf;
<< "using cull rect " << cull_rectf //
<< " where " << label;
}

{ // Test using vector of culled indices
Expand All @@ -3272,7 +3284,8 @@ TEST_F(DisplayListTest, RTreeRenderCulling) {
}

EXPECT_TRUE(DisplayListsEQ_Verbose(culling_builder.Build(), expected))
<< "using culled indices on cull rect " << cull_rectf;
<< "using culled indices on cull rect " << cull_rectf //
<< " where " << label;
}
};

Expand All @@ -3282,57 +3295,62 @@ TEST_F(DisplayListTest, RTreeRenderCulling) {
DisplayListBuilder expected_builder;
auto expected = expected_builder.Build();

test(cull_rect, expected);
test(cull_rect, expected, "no rects intersect");
}

{ // Rect 1
SkIRect cull_rect = {9, 9, 19, 19};

DisplayListBuilder expected_builder;
DlOpReceiver& expected_receiver = ToReceiver(expected_builder);
expected_receiver.drawRect({0, 0, 10, 10});
expected_builder.DrawRect(rect1, paint1);
auto expected = expected_builder.Build();

test(cull_rect, expected);
test(cull_rect, expected, "rect 1 intersects");
}

{ // Rect 2
SkIRect cull_rect = {11, 9, 21, 19};

DisplayListBuilder expected_builder;
DlOpReceiver& expected_receiver = ToReceiver(expected_builder);
expected_receiver.drawRect({20, 0, 30, 10});
// Unfortunately we don't cull attribute records (yet?) until the last op
ToReceiver(expected_builder).setColor(paint1.getColor());
expected_builder.DrawRect(rect2, paint2);
auto expected = expected_builder.Build();

test(cull_rect, expected);
test(cull_rect, expected, "rect 2 intersects");
}

{ // Rect 3
SkIRect cull_rect = {9, 11, 19, 21};

DisplayListBuilder expected_builder;
DlOpReceiver& expected_receiver = ToReceiver(expected_builder);
expected_receiver.drawRect({0, 20, 10, 30});
// Unfortunately we don't cull attribute records (yet?) until the last op
ToReceiver(expected_builder).setColor(paint1.getColor());
ToReceiver(expected_builder).setColor(paint2.getColor());
expected_builder.DrawRect(rect3, paint3);
auto expected = expected_builder.Build();

test(cull_rect, expected);
test(cull_rect, expected, "rect 3 intersects");
}

{ // Rect 4
SkIRect cull_rect = {11, 11, 21, 21};

DisplayListBuilder expected_builder;
DlOpReceiver& expected_receiver = ToReceiver(expected_builder);
expected_receiver.drawRect({20, 20, 30, 30});
// Unfortunately we don't cull attribute records (yet?) until the last op
ToReceiver(expected_builder).setColor(paint1.getColor());
ToReceiver(expected_builder).setColor(paint2.getColor());
ToReceiver(expected_builder).setColor(paint3.getColor());
expected_builder.DrawRect(rect4, paint4);
auto expected = expected_builder.Build();

test(cull_rect, expected);
test(cull_rect, expected, "rect 4 intersects");
}

{ // All 4 rects
SkIRect cull_rect = {9, 9, 21, 21};

test(cull_rect, main);
test(cull_rect, main, "all rects intersect");
}
}

Expand Down

0 comments on commit 69f638c

Please sign in to comment.