Commit b24f3803 authored by Sasha McIntosh's avatar Sasha McIntosh Committed by Commit Bot

mac,viz: Do not promote invisible quad to CALayer

Skip promotion of quads to CALayer when the quad's visible rect is
empty. As of crrev.com/c/2095494 we no longer remove fully occluded
quads, but set the visible rect size to empty instead to improve
performance.

Fix CALayerOverlayRPDQTest.TooManyRenderPassDrawQuads to properly
create the first DrawQuad.

Test: CALayerOverlayTest.SkipNonVisible
Bug: 1067513,1022544
Change-Id: Iec9b02ab2e5095cdd718845eea0dd4ca737bea43
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2134774
Commit-Queue: Sasha McIntosh <sashamcintosh@chromium.org>
Reviewed-by: default avatarDaniele Castagna <dcastagna@chromium.org>
Cr-Commit-Position: refs/heads/master@{#757455}
parent 9720cbe9
...@@ -196,7 +196,8 @@ class CALayerOverlayProcessorInternal { ...@@ -196,7 +196,8 @@ class CALayerOverlayProcessorInternal {
return CA_LAYER_FAILED_QUAD_BLEND_MODE; return CA_LAYER_FAILED_QUAD_BLEND_MODE;
// Early-out for invisible quads. // Early-out for invisible quads.
if (quad->shared_quad_state->opacity == 0.f) { if (quad->shared_quad_state->opacity == 0.f ||
quad->visible_rect.IsEmpty()) {
*skip = true; *skip = true;
return CA_LAYER_SUCCESS; return CA_LAYER_SUCCESS;
} }
...@@ -307,8 +308,15 @@ bool CALayerOverlayProcessor::ProcessForCALayerOverlays( ...@@ -307,8 +308,15 @@ bool CALayerOverlayProcessor::ProcessForCALayerOverlays(
CALayerOverlayList* ca_layer_overlays) const { CALayerOverlayList* ca_layer_overlays) const {
CALayerResult result = CA_LAYER_SUCCESS; CALayerResult result = CA_LAYER_SUCCESS;
if (quad_list.size() < kTooManyQuads) size_t num_visible_quads = quad_list.size();
ca_layer_overlays->reserve(quad_list.size()); for (const auto* quad : quad_list) {
if (quad->shared_quad_state->opacity == 0.f ||
quad->visible_rect.IsEmpty()) {
num_visible_quads--;
}
}
if (num_visible_quads < kTooManyQuads)
ca_layer_overlays->reserve(num_visible_quads);
else else
result = CA_LAYER_FAILED_TOO_MANY_QUADS; result = CA_LAYER_FAILED_TOO_MANY_QUADS;
......
...@@ -382,6 +382,28 @@ TEST_F(CALayerOverlayTest, SkipTransparent) { ...@@ -382,6 +382,28 @@ TEST_F(CALayerOverlayTest, SkipTransparent) {
EXPECT_EQ(0U, output_surface_->bind_framebuffer_count()); EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
} }
TEST_F(CALayerOverlayTest, SkipNonVisible) {
std::unique_ptr<RenderPass> pass = CreateRenderPass();
CreateFullscreenCandidateQuad(
resource_provider_.get(), child_resource_provider_.get(),
child_provider_.get(), pass->shared_quad_state_list.back(), pass.get());
pass->quad_list.back()->visible_rect.set_size(gfx::Size());
gfx::Rect damage_rect;
CALayerOverlayList ca_layer_list;
OverlayProcessorInterface::FilterOperationsMap render_pass_filters;
OverlayProcessorInterface::FilterOperationsMap render_pass_backdrop_filters;
RenderPassList pass_list;
pass_list.push_back(std::move(pass));
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), &pass_list, GetIdentityColorMatrix(),
render_pass_filters, render_pass_backdrop_filters, nullptr,
&ca_layer_list, &damage_rect_, &content_bounds_);
EXPECT_EQ(gfx::Rect(), damage_rect);
EXPECT_EQ(0U, ca_layer_list.size());
EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
}
class CALayerOverlayRPDQTest : public CALayerOverlayTest { class CALayerOverlayRPDQTest : public CALayerOverlayTest {
protected: protected:
void SetUp() override { void SetUp() override {
...@@ -501,8 +523,10 @@ TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadUnsupportedFilter) { ...@@ -501,8 +523,10 @@ TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadUnsupportedFilter) {
TEST_F(CALayerOverlayRPDQTest, TooManyRenderPassDrawQuads) { TEST_F(CALayerOverlayRPDQTest, TooManyRenderPassDrawQuads) {
filters_.Append(cc::FilterOperation::CreateBlurFilter(0.8f)); filters_.Append(cc::FilterOperation::CreateBlurFilter(0.8f));
int count = 35; int count = 35;
quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
for (int i = 0; i < count; ++i) { kOverlayRect, render_pass_id_, 2, gfx::RectF(), gfx::Size(),
gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false, 1.0f);
for (int i = 1; i < count; ++i) {
auto* quad = pass_->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); auto* quad = pass_->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
quad->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect, quad->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
kOverlayRect, render_pass_id_, 2, gfx::RectF(), gfx::Size(), kOverlayRect, render_pass_id_, 2, gfx::RectF(), gfx::Size(),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment