Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1865)

Unified Diff: cc/output/overlay_unittest.cc

Issue 2746393005: cc: Pick the biggest Quad when selecting an overlay. (Closed)
Patch Set: Early out if we can't find a candidate. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/output/overlay_strategy_single_on_top.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/overlay_unittest.cc
diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc
index 2e1dffa3a707a0c04499657387790fecf5dadfe4..a02bb2afeba41f7d76fa5df3974d8b1df3441e77 100644
--- a/cc/output/overlay_unittest.cc
+++ b/cc/output/overlay_unittest.cc
@@ -79,12 +79,13 @@ class FullscreenOverlayValidator : public OverlayCandidateValidator {
class SingleOverlayValidator : public OverlayCandidateValidator {
public:
- SingleOverlayValidator() : expected_rect_(kOverlayRect) {}
+ SingleOverlayValidator() : expected_rects_(1, gfx::RectF(kOverlayRect)) {}
void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this));
strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this));
}
+
bool AllowCALayerOverlays() override { return false; }
bool AllowDCLayerOverlays() override { return false; }
void CheckOverlaySupport(OverlayCandidateList* surfaces) override {
@@ -95,25 +96,34 @@ class SingleOverlayValidator : public OverlayCandidateValidator {
OverlayCandidate& candidate = surfaces->back();
EXPECT_TRUE(!candidate.use_output_surface_for_resource);
- EXPECT_NEAR(expected_rect_.x(), candidate.display_rect.x(), 0.01f);
- EXPECT_NEAR(expected_rect_.y(), candidate.display_rect.y(), 0.01f);
- EXPECT_NEAR(expected_rect_.width(), candidate.display_rect.width(), 0.01f);
- EXPECT_NEAR(expected_rect_.height(), candidate.display_rect.height(),
- 0.01f);
-
- EXPECT_FLOAT_RECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight),
- candidate.uv_rect);
- if (!candidate.clip_rect.IsEmpty()) {
- EXPECT_EQ(true, candidate.is_clipped);
- EXPECT_EQ(kOverlayClipRect, candidate.clip_rect);
+ for (const auto& r : expected_rects_) {
+ const float kAbsoluteError = 0.01f;
+ if (std::abs(r.x() - candidate.display_rect.x()) <= kAbsoluteError &&
+ std::abs(r.y() - candidate.display_rect.y()) <= kAbsoluteError &&
+ std::abs(r.width() - candidate.display_rect.width()) <=
+ kAbsoluteError &&
+ std::abs(r.height() - candidate.display_rect.height()) <=
+ kAbsoluteError) {
+ EXPECT_FLOAT_RECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight),
+ candidate.uv_rect);
+ if (!candidate.clip_rect.IsEmpty()) {
+ EXPECT_EQ(true, candidate.is_clipped);
+ EXPECT_EQ(kOverlayClipRect, candidate.clip_rect);
+ }
+ candidate.overlay_handled = true;
+ return;
+ }
}
- candidate.overlay_handled = true;
+ // We should find one rect in expected_rects_that matches candidate.
+ EXPECT_TRUE(false);
}
- void SetExpectedRect(const gfx::RectF& rect) { expected_rect_ = rect; }
+ void AddExpectedRect(const gfx::RectF& rect) {
+ expected_rects_.push_back(rect);
+ }
private:
- gfx::RectF expected_rect_;
+ std::vector<gfx::RectF> expected_rects_;
};
class CALayerValidator : public OverlayCandidateValidator {
@@ -671,6 +681,49 @@ TEST_F(SingleOverlayOnTopTest, SuccessfulOverlay) {
EXPECT_EQ(original_resource_id, candidate_list.back().resource_id);
}
+TEST_F(SingleOverlayOnTopTest, PrioritizeBiggerOne) {
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+ // Add a small quad.
+ const auto kSmallCandidateRect = gfx::Rect(0, 0, 16, 16);
+ CreateCandidateQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kSmallCandidateRect);
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
+ gfx::RectF(kSmallCandidateRect));
+
+ // Add a bigger quad below the previous one, but not occluded.
+ const auto kBigCandidateRect = gfx::Rect(20, 20, 32, 32);
+ TextureDrawQuad* quad_big = CreateCandidateQuadAt(
+ resource_provider_.get(), pass->shared_quad_state_list.back(), pass.get(),
+ kBigCandidateRect);
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
+ gfx::RectF(kBigCandidateRect));
+
+ unsigned resource_big = quad_big->resource_id();
+
+ // Add something behind it.
+ CreateFullscreenOpaqueQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get());
+
+ // Check for potential candidates.
+ OverlayCandidateList candidate_list;
+ RenderPassFilterList render_pass_filters;
+ RenderPassFilterList render_pass_background_filters;
+ overlay_processor_->ProcessForOverlays(
+ resource_provider_.get(), pass.get(), render_pass_filters,
+ render_pass_background_filters, &candidate_list, nullptr, nullptr,
+ &damage_rect_, &content_bounds_);
+ ASSERT_EQ(1U, candidate_list.size());
+
+ RenderPass* main_pass = pass.get();
+ // Check that one quad is gone.
+ EXPECT_EQ(2U, main_pass->quad_list.size());
+ // Check that we have only one overlay.
+ EXPECT_EQ(1U, candidate_list.size());
+ // Check that the right resource id (bigger quad) got extracted.
+ EXPECT_EQ(resource_big, candidate_list.front().resource_id);
+}
+
TEST_F(SingleOverlayOnTopTest, DamageRect) {
std::unique_ptr<RenderPass> pass = CreateRenderPass();
CreateFullscreenCandidateQuad(resource_provider_.get(),
@@ -1029,7 +1082,7 @@ TEST_F(UnderlayTest, Allow270DegreeRotation) {
}
TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(kOverlayBottomRightRect));
std::unique_ptr<RenderPass> pass = CreateRenderPass();
@@ -1052,7 +1105,7 @@ TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
}
TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) {
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(kOverlayBottomRightRect));
std::unique_ptr<RenderPass> pass = CreateRenderPass();
@@ -1076,7 +1129,7 @@ TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) {
}
TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) {
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(kOverlayBottomRightRect));
std::unique_ptr<RenderPass> pass = CreateRenderPass();
@@ -1218,7 +1271,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) {
}
TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) {
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(kOverlayBottomRightRect));
std::unique_ptr<RenderPass> pass = CreateRenderPass();
@@ -1318,7 +1371,7 @@ TEST_F(UnderlayTest, DamageSubtractedForConsecutiveIdenticalUnderlays) {
TEST_F(UnderlayTest, DamageNotSubtractedForNonIdenticalConsecutiveUnderlays) {
gfx::Rect overlay_rects[] = {kOverlayBottomRightRect, kOverlayRect};
for (int i = 0; i < 2; ++i) {
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(overlay_rects[i]));
std::unique_ptr<RenderPass> pass = CreateRenderPass();
@@ -1366,7 +1419,7 @@ TEST_F(UnderlayTest, DamageNotSubtractedWhenQuadsAboveOverlap) {
}
TEST_F(UnderlayTest, DamageSubtractedWhenQuadsAboveDontOverlap) {
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(kOverlayBottomRightRect));
for (int i = 0; i < 2; ++i) {
@@ -1429,7 +1482,7 @@ TEST_F(UnderlayCastTest, FullScreenOverlayContentBounds) {
}
TEST_F(UnderlayCastTest, BlackOutsideOverlayContentBounds) {
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(kOverlayBottomRightRect));
const gfx::Rect kLeftSide(0, 0, 128, 256);
@@ -1507,7 +1560,7 @@ TEST_F(UnderlayCastTest, RoundOverlayContentBounds) {
// Check rounding behaviour on overlay quads. Be conservative (content
// potentially visible on boundary).
const gfx::Rect overlay_rect(1, 1, 8, 8);
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(1.5f, 1.5f, 8, 8));
gfx::Transform transform;
@@ -1538,7 +1591,7 @@ TEST_F(UnderlayCastTest, RoundContentBounds) {
// rect).
gfx::Rect overlay_rect = kOverlayRect;
overlay_rect.Inset(0, 0, 1, 1);
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(0.5f, 0.5f, 255, 255));
gfx::Transform transform;
@@ -1912,7 +1965,7 @@ TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) {
bool use_validator = true;
Init(use_validator);
renderer_->set_expect_overlays(true);
- output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
gfx::RectF(kOverlayBottomRightRect));
gfx::Size viewport_size(16, 16);
« no previous file with comments | « cc/output/overlay_strategy_single_on_top.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698