Commit 1db1789f authored by achaulk's avatar achaulk Committed by Commit bot

cc: Ignore certain quads that would otherwise block overlays

If a quad is fully transparent then it shouldn't block overlays. For
now we allow some SOLID_COLOR quads through

Review URL: https://codereview.chromium.org/880023005

Cr-Commit-Position: refs/heads/master@{#315106}
parent 2d1da95c
...@@ -119,6 +119,20 @@ bool OverlayStrategySingleOnTop::GetCandidateQuadInfo( ...@@ -119,6 +119,20 @@ bool OverlayStrategySingleOnTop::GetCandidateQuadInfo(
return true; return true;
} }
bool OverlayStrategySingleOnTop::IsInvisibleQuad(const DrawQuad* draw_quad) {
if (draw_quad->material == DrawQuad::SOLID_COLOR) {
const SolidColorDrawQuad* solid_quad =
SolidColorDrawQuad::MaterialCast(draw_quad);
SkColor color = solid_quad->color;
float opacity = solid_quad->opacity();
float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity;
// Ignore transparent solid color quads.
return solid_quad->ShouldDrawWithBlending() &&
alpha < std::numeric_limits<float>::epsilon();
}
return false;
}
bool OverlayStrategySingleOnTop::Attempt( bool OverlayStrategySingleOnTop::Attempt(
RenderPassList* render_passes_in_draw_order, RenderPassList* render_passes_in_draw_order,
OverlayCandidateList* candidate_list) { OverlayCandidateList* candidate_list) {
...@@ -143,7 +157,7 @@ bool OverlayStrategySingleOnTop::Attempt( ...@@ -143,7 +157,7 @@ bool OverlayStrategySingleOnTop::Attempt(
++overlap_iter) { ++overlap_iter) {
gfx::RectF overlap_rect = overlap_iter->rect; gfx::RectF overlap_rect = overlap_iter->rect;
overlap_iter->quadTransform().TransformRect(&overlap_rect); overlap_iter->quadTransform().TransformRect(&overlap_rect);
if (rect.Intersects(overlap_rect)) { if (rect.Intersects(overlap_rect) && !IsInvisibleQuad(*overlap_iter)) {
intersects = true; intersects = true;
break; break;
} }
......
...@@ -29,6 +29,10 @@ class CC_EXPORT OverlayStrategySingleOnTop : public OverlayProcessor::Strategy { ...@@ -29,6 +29,10 @@ class CC_EXPORT OverlayStrategySingleOnTop : public OverlayProcessor::Strategy {
bool GetCandidateQuadInfo(const DrawQuad& draw_quad, bool GetCandidateQuadInfo(const DrawQuad& draw_quad,
OverlayCandidate* quad_info); OverlayCandidate* quad_info);
// Returns true if |draw_quad| will not block quads underneath from becoming
// an overlay.
bool IsInvisibleQuad(const DrawQuad* draw_quad);
bool GetTextureQuadInfo(const TextureDrawQuad& quad, bool GetTextureQuadInfo(const TextureDrawQuad& quad,
OverlayCandidate* quad_info); OverlayCandidate* quad_info);
bool GetVideoQuadInfo(const StreamVideoDrawQuad& quad, bool GetVideoQuadInfo(const StreamVideoDrawQuad& quad,
......
...@@ -156,6 +156,17 @@ ResourceProvider::ResourceId CreateResource( ...@@ -156,6 +156,17 @@ ResourceProvider::ResourceId CreateResource(
mailbox, release_callback.Pass()); mailbox, release_callback.Pass());
} }
SolidColorDrawQuad* CreateSolidColorQuadAt(
const SharedQuadState* shared_quad_state,
SkColor color,
RenderPass* render_pass,
const gfx::Rect& rect) {
SolidColorDrawQuad* quad =
render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
quad->SetNew(shared_quad_state, rect, rect, color, false);
return quad;
}
TextureDrawQuad* CreateCandidateQuadAt(ResourceProvider* resource_provider, TextureDrawQuad* CreateCandidateQuadAt(ResourceProvider* resource_provider,
const SharedQuadState* shared_quad_state, const SharedQuadState* shared_quad_state,
RenderPass* render_pass, RenderPass* render_pass,
...@@ -592,6 +603,94 @@ TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) { ...@@ -592,6 +603,94 @@ TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
EXPECT_EQ(2U, candidate_list.size()); EXPECT_EQ(2U, candidate_list.size());
} }
TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) {
scoped_ptr<RenderPass> pass = CreateRenderPass();
SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
shared_state->opacity = 0.f;
CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(),
kOverlayBottomRightRect);
shared_state = pass->CreateAndAppendSharedQuadState();
shared_state->opacity = 1.f;
CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
kOverlayBottomRightRect);
RenderPassList pass_list;
pass_list.push_back(pass.Pass());
RenderPassList original_pass_list;
RenderPass::CopyAll(pass_list, &original_pass_list);
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(2U, candidate_list.size());
}
TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) {
scoped_ptr<RenderPass> pass = CreateRenderPass();
CreateSolidColorQuadAt(pass->shared_quad_state_list.back(),
SK_ColorTRANSPARENT, pass.get(),
kOverlayBottomRightRect);
CreateCandidateQuadAt(resource_provider_.get(),
pass->shared_quad_state_list.back(), pass.get(),
kOverlayBottomRightRect);
RenderPassList pass_list;
pass_list.push_back(pass.Pass());
RenderPassList original_pass_list;
RenderPass::CopyAll(pass_list, &original_pass_list);
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(2U, candidate_list.size());
}
TEST_F(SingleOverlayOnTopTest, RejectOpaqueColorOnTop) {
scoped_ptr<RenderPass> pass = CreateRenderPass();
SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
shared_state->opacity = 0.5f;
CreateSolidColorQuadAt(shared_state, SK_ColorBLACK, pass.get(),
kOverlayBottomRightRect);
shared_state = pass->CreateAndAppendSharedQuadState();
shared_state->opacity = 1.f;
CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
kOverlayBottomRightRect);
RenderPassList pass_list;
pass_list.push_back(pass.Pass());
RenderPassList original_pass_list;
RenderPass::CopyAll(pass_list, &original_pass_list);
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
TEST_F(SingleOverlayOnTopTest, RejectTransparentColorOnTopWithoutBlending) {
scoped_ptr<RenderPass> pass = CreateRenderPass();
SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
CreateSolidColorQuadAt(shared_state, SK_ColorTRANSPARENT, pass.get(),
kOverlayBottomRightRect)->opaque_rect =
kOverlayBottomRightRect;
CreateCandidateQuadAt(resource_provider_.get(), shared_state, pass.get(),
kOverlayBottomRightRect);
RenderPassList pass_list;
pass_list.push_back(pass.Pass());
RenderPassList original_pass_list;
RenderPass::CopyAll(pass_list, &original_pass_list);
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) { TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) {
scoped_ptr<RenderPass> pass = CreateRenderPass(); scoped_ptr<RenderPass> pass = CreateRenderPass();
CreateFullscreenCandidateVideoQuad(resource_provider_.get(), CreateFullscreenCandidateVideoQuad(resource_provider_.get(),
......
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