summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkalyan.kondapally <kalyan.kondapally@intel.com>2015-11-06 14:51:35 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-06 22:52:27 +0000
commit050e8dff0fd427ab33d8adb9e9b1d12cd2682067 (patch)
treeaa41eaf78b4937d5a98bbbfda5afec16fb696462
parent85a785c39f884c6c1134dbff211681eef2863079 (diff)
downloadchromium_src-050e8dff0fd427ab33d8adb9e9b1d12cd2682067.zip
chromium_src-050e8dff0fd427ab33d8adb9e9b1d12cd2682067.tar.gz
chromium_src-050e8dff0fd427ab33d8adb9e9b1d12cd2682067.tar.bz2
Avoid Copying damage rect when using Overlays
When using Overlays, the damage rect can be completely covered by the layer being composited by Overlay. We still copy damage rect on to the current surface(Primary frame buffer) in BufferQueue. This should be un-necessary. BUG=370522,548452 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Committed: https://crrev.com/2904998edff0cfcaab43eeb3b1db013d6169bd17 Cr-Commit-Position: refs/heads/master@{#356352} Committed: https://crrev.com/5ee13b006abdf74d0f6b3fbdde2d936c00ad97e7 Cr-Commit-Position: refs/heads/master@{#356570} Review URL: https://codereview.chromium.org/1330563004 Cr-Commit-Position: refs/heads/master@{#358434}
-rw-r--r--cc/output/direct_renderer.cc3
-rw-r--r--cc/output/gl_renderer_unittest.cc9
-rw-r--r--cc/output/overlay_processor.cc7
-rw-r--r--cc/output/overlay_processor.h10
-rw-r--r--cc/output/overlay_strategy_all_or_nothing.cc3
-rw-r--r--cc/output/overlay_strategy_all_or_nothing.h3
-rw-r--r--cc/output/overlay_strategy_sandwich.cc3
-rw-r--r--cc/output/overlay_strategy_sandwich.h3
-rw-r--r--cc/output/overlay_strategy_single_on_top.cc13
-rw-r--r--cc/output/overlay_strategy_single_on_top.h6
-rw-r--r--cc/output/overlay_strategy_underlay.cc3
-rw-r--r--cc/output/overlay_strategy_underlay.h3
-rw-r--r--cc/output/overlay_unittest.cc222
13 files changed, 220 insertions, 68 deletions
diff --git a/cc/output/direct_renderer.cc b/cc/output/direct_renderer.cc
index 03425cf..0a66eea 100644
--- a/cc/output/direct_renderer.cc
+++ b/cc/output/direct_renderer.cc
@@ -240,7 +240,8 @@ void DirectRenderer::DrawFrame(RenderPassList* render_passes_in_draw_order,
// otherwise the framebuffer will be missing the overlay contents.
if (root_render_pass->copy_requests.empty()) {
overlay_processor_->ProcessForOverlays(
- resource_provider_, render_passes_in_draw_order, &frame.overlay_list);
+ resource_provider_, render_passes_in_draw_order, &frame.overlay_list,
+ &frame.root_damage_rect);
}
for (size_t i = 0; i < render_passes_in_draw_order->size(); ++i) {
diff --git a/cc/output/gl_renderer_unittest.cc b/cc/output/gl_renderer_unittest.cc
index 6af531c..92fcd3c 100644
--- a/cc/output/gl_renderer_unittest.cc
+++ b/cc/output/gl_renderer_unittest.cc
@@ -2014,10 +2014,11 @@ class TestOverlayProcessor : public OverlayProcessor {
public:
Strategy() {}
~Strategy() override {}
- MOCK_METHOD3(Attempt,
+ MOCK_METHOD4(Attempt,
bool(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidates));
+ OverlayCandidateList* candidates,
+ gfx::Rect* damage_rect));
};
explicit TestOverlayProcessor(OutputSurface* surface)
@@ -2095,7 +2096,7 @@ TEST_F(GLRendererTest, DontOverlayWithCopyRequests) {
// added a fake strategy, so checking for Attempt calls checks if there was
// any attempt to overlay, which there shouldn't be. We can't use the quad
// list because the render pass is cleaned up by DrawFrame.
- EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(0);
+ EXPECT_CALL(*processor->strategy_, Attempt(_, _, _, _)).Times(0);
renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect,
viewport_rect, false);
Mock::VerifyAndClearExpectations(processor->strategy_);
@@ -2112,7 +2113,7 @@ TEST_F(GLRendererTest, DontOverlayWithCopyRequests) {
gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity,
flipped, nearest_neighbor);
- EXPECT_CALL(*processor->strategy_, Attempt(_, _, _)).Times(1);
+ EXPECT_CALL(*processor->strategy_, Attempt(_, _, _, _)).Times(1);
renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect,
viewport_rect, false);
}
diff --git a/cc/output/overlay_processor.cc b/cc/output/overlay_processor.cc
index 69368a1..a97623a 100644
--- a/cc/output/overlay_processor.cc
+++ b/cc/output/overlay_processor.cc
@@ -27,10 +27,13 @@ OverlayProcessor::~OverlayProcessor() {}
void OverlayProcessor::ProcessForOverlays(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidates) {
+ OverlayCandidateList* candidates,
+ gfx::Rect* damage_rect) {
for (auto strategy : strategies_) {
- if (strategy->Attempt(resource_provider, render_passes, candidates))
+ if (strategy->Attempt(resource_provider, render_passes, candidates,
+ damage_rect)) {
return;
+ }
}
}
diff --git a/cc/output/overlay_processor.h b/cc/output/overlay_processor.h
index 48ffe6b..26bfe16 100644
--- a/cc/output/overlay_processor.h
+++ b/cc/output/overlay_processor.h
@@ -23,10 +23,13 @@ class CC_EXPORT OverlayProcessor {
// Returns false if the strategy cannot be made to work with the
// current set of render passes. Returns true if the strategy was successful
// and adds any additional passes necessary to represent overlays to
- // |render_passes|.
+ // |render_passes|. Strategy can also optimize |damage_rect| as it seems
+ // fit to reduce GL composition, in case |damage_rect| is obscured by
+ // overlays.
virtual bool Attempt(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidates) = 0;
+ OverlayCandidateList* candidates,
+ gfx::Rect* damage_rect) = 0;
};
typedef ScopedPtrVector<Strategy> StrategyList;
@@ -37,7 +40,8 @@ class CC_EXPORT OverlayProcessor {
void ProcessForOverlays(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidates);
+ OverlayCandidateList* candidates,
+ gfx::Rect* damage_rect);
protected:
StrategyList strategies_;
diff --git a/cc/output/overlay_strategy_all_or_nothing.cc b/cc/output/overlay_strategy_all_or_nothing.cc
index 40c58cd..8181e29 100644
--- a/cc/output/overlay_strategy_all_or_nothing.cc
+++ b/cc/output/overlay_strategy_all_or_nothing.cc
@@ -19,7 +19,8 @@ OverlayStrategyAllOrNothing::~OverlayStrategyAllOrNothing() {}
bool OverlayStrategyAllOrNothing::Attempt(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidates) {
+ OverlayCandidateList* candidates,
+ gfx::Rect* damage_rect) {
QuadList& quad_list = render_passes->back()->quad_list;
OverlayCandidateList new_candidates;
int next_z_order = -1;
diff --git a/cc/output/overlay_strategy_all_or_nothing.h b/cc/output/overlay_strategy_all_or_nothing.h
index 94d88f0..23d2aa3 100644
--- a/cc/output/overlay_strategy_all_or_nothing.h
+++ b/cc/output/overlay_strategy_all_or_nothing.h
@@ -22,7 +22,8 @@ class CC_EXPORT OverlayStrategyAllOrNothing
bool Attempt(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidate_list) override;
+ OverlayCandidateList* candidate_list,
+ gfx::Rect* damage_rect) override;
private:
OverlayCandidateValidator* capability_checker_; // Weak.
diff --git a/cc/output/overlay_strategy_sandwich.cc b/cc/output/overlay_strategy_sandwich.cc
index 79279ad..cacb696 100644
--- a/cc/output/overlay_strategy_sandwich.cc
+++ b/cc/output/overlay_strategy_sandwich.cc
@@ -42,7 +42,8 @@ OverlayStrategySandwich::~OverlayStrategySandwich() {}
bool OverlayStrategySandwich::Attempt(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidate_list) {
+ OverlayCandidateList* candidate_list,
+ gfx::Rect* damage_rect) {
QuadList& quad_list = render_passes->back()->quad_list;
for (auto it = quad_list.begin(); it != quad_list.end();) {
OverlayCandidate candidate;
diff --git a/cc/output/overlay_strategy_sandwich.h b/cc/output/overlay_strategy_sandwich.h
index 076ea9d..0bdd2d2 100644
--- a/cc/output/overlay_strategy_sandwich.h
+++ b/cc/output/overlay_strategy_sandwich.h
@@ -23,7 +23,8 @@ class CC_EXPORT OverlayStrategySandwich : public OverlayProcessor::Strategy {
bool Attempt(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidate_list) override;
+ OverlayCandidateList* candidate_list,
+ gfx::Rect* damage_rect) override;
private:
QuadList::Iterator TryOverlay(RenderPass* render_pass,
diff --git a/cc/output/overlay_strategy_single_on_top.cc b/cc/output/overlay_strategy_single_on_top.cc
index ca254b2..7a35d1d 100644
--- a/cc/output/overlay_strategy_single_on_top.cc
+++ b/cc/output/overlay_strategy_single_on_top.cc
@@ -7,6 +7,7 @@
#include "cc/base/math_util.h"
#include "cc/output/overlay_candidate_validator.h"
#include "cc/quads/draw_quad.h"
+#include "ui/gfx/geometry/rect_conversions.h"
namespace cc {
@@ -20,12 +21,13 @@ OverlayStrategySingleOnTop::~OverlayStrategySingleOnTop() {}
bool OverlayStrategySingleOnTop::Attempt(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidate_list) {
+ OverlayCandidateList* candidate_list,
+ gfx::Rect* damage_rect) {
QuadList* quad_list = &render_passes->back()->quad_list;
for (auto it = quad_list->begin(); it != quad_list->end(); ++it) {
OverlayCandidate candidate;
if (OverlayCandidate::FromDrawQuad(resource_provider, *it, &candidate) &&
- TryOverlay(quad_list, candidate_list, candidate, it)) {
+ TryOverlay(quad_list, candidate_list, candidate, it, damage_rect)) {
return true;
}
}
@@ -37,7 +39,8 @@ bool OverlayStrategySingleOnTop::TryOverlay(
QuadList* quad_list,
OverlayCandidateList* candidate_list,
const OverlayCandidate& candidate,
- QuadList::Iterator candidate_iterator) {
+ QuadList::Iterator candidate_iterator,
+ gfx::Rect* damage_rect) {
// Check that no prior quads overlap it.
for (auto overlap_iter = quad_list->cbegin();
overlap_iter != candidate_iterator; ++overlap_iter) {
@@ -57,10 +60,12 @@ bool OverlayStrategySingleOnTop::TryOverlay(
// Check for support.
capability_checker_->CheckOverlaySupport(&new_candidate_list);
+ const OverlayCandidate& overlay_candidate = new_candidate_list.back();
// If the candidate can be handled by an overlay, create a pass for it.
- if (new_candidate_list.back().overlay_handled) {
+ if (overlay_candidate.overlay_handled) {
quad_list->EraseAndInvalidateAllPointers(candidate_iterator);
candidate_list->swap(new_candidate_list);
+ damage_rect->Subtract(ToEnclosedRect(overlay_candidate.display_rect));
return true;
}
diff --git a/cc/output/overlay_strategy_single_on_top.h b/cc/output/overlay_strategy_single_on_top.h
index bdf2cc2..29d98de 100644
--- a/cc/output/overlay_strategy_single_on_top.h
+++ b/cc/output/overlay_strategy_single_on_top.h
@@ -19,13 +19,15 @@ class CC_EXPORT OverlayStrategySingleOnTop : public OverlayProcessor::Strategy {
bool Attempt(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidate_list) override;
+ OverlayCandidateList* candidate_list,
+ gfx::Rect* damage_rect) override;
private:
bool TryOverlay(QuadList* quad_list,
OverlayCandidateList* candidate_list,
const OverlayCandidate& candidate,
- QuadList::Iterator candidate_iterator);
+ QuadList::Iterator candidate_iterator,
+ gfx::Rect* damage_rect);
OverlayCandidateValidator* capability_checker_; // Weak.
diff --git a/cc/output/overlay_strategy_underlay.cc b/cc/output/overlay_strategy_underlay.cc
index 9a8a362..5f3f907 100644
--- a/cc/output/overlay_strategy_underlay.cc
+++ b/cc/output/overlay_strategy_underlay.cc
@@ -20,7 +20,8 @@ OverlayStrategyUnderlay::~OverlayStrategyUnderlay() {}
bool OverlayStrategyUnderlay::Attempt(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidate_list) {
+ OverlayCandidateList* candidate_list,
+ gfx::Rect* damage_rect) {
QuadList& quad_list = render_passes->back()->quad_list;
for (auto it = quad_list.begin(); it != quad_list.end(); ++it) {
OverlayCandidate candidate;
diff --git a/cc/output/overlay_strategy_underlay.h b/cc/output/overlay_strategy_underlay.h
index f276c1c..ac20051 100644
--- a/cc/output/overlay_strategy_underlay.h
+++ b/cc/output/overlay_strategy_underlay.h
@@ -24,7 +24,8 @@ class CC_EXPORT OverlayStrategyUnderlay : public OverlayProcessor::Strategy {
bool Attempt(ResourceProvider* resource_provider,
RenderPassList* render_passes,
- OverlayCandidateList* candidate_list) override;
+ OverlayCandidateList* candidate_list,
+ gfx::Rect* damage_rect) override;
private:
OverlayCandidateValidator* capability_checker_; // Weak.
diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc
index 824b7fe..8c9efc7 100644
--- a/cc/output/overlay_unittest.cc
+++ b/cc/output/overlay_unittest.cc
@@ -364,6 +364,7 @@ class OverlayTest : public testing::Test {
scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
scoped_ptr<ResourceProvider> resource_provider_;
scoped_ptr<OverlayProcessor> overlay_processor_;
+ gfx::Rect damage_rect_;
};
typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest;
@@ -417,7 +418,7 @@ TEST_F(SandwichTest, SuccessfulSingleOverlay) {
// Check for potential candidates.
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
ASSERT_EQ(1U, candidate_list.size());
@@ -459,7 +460,7 @@ TEST_F(SandwichTest, CroppedSingleOverlay) {
// Check for potential candidates.
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
// Ensure that the display and uv rects have cropping applied to them.
ASSERT_EQ(1U, pass_list.size());
@@ -488,7 +489,7 @@ TEST_F(SandwichTest, SuccessfulTwoOverlays) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
// Both candidates should become overlays.
EXPECT_EQ(1u, pass_list.size());
@@ -522,7 +523,7 @@ TEST_F(SandwichTest, OverlappingOverlays) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
// Only one of the candidates should become an overlay.
EXPECT_EQ(1u, pass_list.size());
@@ -557,8 +558,7 @@ TEST_F(SandwichTest, SuccessfulSandwichOverlay) {
// Check for potential candidates.
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
-
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
ASSERT_EQ(2U, candidate_list.size());
@@ -613,7 +613,7 @@ TEST_F(SandwichTest, MultiQuadOverlay) {
OverlayCandidateList candidate_list;
EXPECT_EQ(4U, main_pass->quad_list.size());
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
ASSERT_EQ(3U, candidate_list.size());
@@ -645,6 +645,39 @@ TEST_F(SandwichTest, MultiQuadOverlay) {
DCHECK(covered_region == overlay_region);
}
+TEST_F(SandwichTest, DamageRect) {
+ scoped_ptr<RenderPass> pass = CreateRenderPass();
+ CreateFullscreenCandidateQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(),
+ pass.get());
+
+ damage_rect_ = kOverlayRect;
+
+ // Add something behind it.
+ CreateFullscreenOpaqueQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get());
+ CreateFullscreenOpaqueQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get());
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ // Check for potential candidates.
+ OverlayCandidateList candidate_list;
+
+ // Primary plane.
+ OverlayCandidate output_surface_plane;
+ output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
+ output_surface_plane.quad_rect_in_target_space = kOverlayRect;
+ output_surface_plane.use_output_surface_for_resource = true;
+ output_surface_plane.overlay_handled = true;
+ candidate_list.push_back(output_surface_plane);
+
+ overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
+ &candidate_list, &damage_rect_);
+ DCHECK(!damage_rect_.IsEmpty());
+}
+
TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) {
scoped_ptr<RenderPass> pass = CreateRenderPass();
TextureDrawQuad* original_quad =
@@ -665,7 +698,7 @@ TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) {
// Check for potential candidates.
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
ASSERT_EQ(1U, candidate_list.size());
@@ -684,6 +717,38 @@ TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) {
EXPECT_EQ(original_resource_id, candidate_list.back().resource_id);
}
+TEST_F(SingleOverlayOnTopTest, DamageRect) {
+ scoped_ptr<RenderPass> pass = CreateRenderPass();
+ CreateFullscreenCandidateQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(),
+ pass.get());
+ damage_rect_ = kOverlayRect;
+
+ // Add something behind it.
+ CreateFullscreenOpaqueQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get());
+ CreateFullscreenOpaqueQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get());
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ // Check for potential candidates.
+ OverlayCandidateList candidate_list;
+
+ // Primary plane.
+ OverlayCandidate output_surface_plane;
+ output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
+ output_surface_plane.quad_rect_in_target_space = kOverlayRect;
+ output_surface_plane.use_output_surface_for_resource = true;
+ output_surface_plane.overlay_handled = true;
+ candidate_list.push_back(output_surface_plane);
+
+ overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
+ &candidate_list, &damage_rect_);
+ DCHECK(damage_rect_.IsEmpty());
+}
+
TEST_F(SingleOverlayOnTopTest, NoCandidates) {
scoped_ptr<RenderPass> pass = CreateRenderPass();
CreateFullscreenOpaqueQuad(resource_provider_.get(),
@@ -699,7 +764,7 @@ TEST_F(SingleOverlayOnTopTest, NoCandidates) {
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(0U, candidate_list.size());
// There should be nothing new here.
CompareRenderPassLists(pass_list, original_pass_list);
@@ -724,7 +789,7 @@ TEST_F(SingleOverlayOnTopTest, OccludedCandidates) {
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(0U, candidate_list.size());
// There should be nothing new here.
CompareRenderPassLists(pass_list, original_pass_list);
@@ -754,7 +819,7 @@ TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) {
// Check for potential candidates.
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(1U, candidate_list.size());
// This should be the same.
@@ -773,7 +838,7 @@ TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
@@ -790,7 +855,7 @@ TEST_F(SingleOverlayOnTopTest, RejectBlending) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
@@ -807,7 +872,7 @@ TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
@@ -823,7 +888,7 @@ TEST_F(SingleOverlayOnTopTest, RejectBlendMode) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
@@ -839,7 +904,7 @@ TEST_F(SingleOverlayOnTopTest, RejectOpacity) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
@@ -856,7 +921,7 @@ TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
@@ -873,7 +938,7 @@ TEST_F(SingleOverlayOnTopTest, AllowClipped) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(1U, candidate_list.size());
}
@@ -892,7 +957,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVerticalFlip) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL,
@@ -913,7 +978,7 @@ TEST_F(SingleOverlayOnTopTest, AllowHorizontalFlip) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL,
@@ -933,7 +998,7 @@ TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(1U, candidate_list.size());
}
@@ -951,7 +1016,7 @@ TEST_F(SingleOverlayOnTopTest, Allow90DegreeRotation) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_90, candidate_list.back().transform);
@@ -970,7 +1035,7 @@ TEST_F(SingleOverlayOnTopTest, Allow180DegreeRotation) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_180, candidate_list.back().transform);
@@ -989,7 +1054,7 @@ TEST_F(SingleOverlayOnTopTest, Allow270DegreeRotation) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_270, candidate_list.back().transform);
@@ -1013,7 +1078,7 @@ TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1037,7 +1102,7 @@ TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) {
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1059,7 +1124,7 @@ TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) {
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1083,7 +1148,7 @@ TEST_F(SingleOverlayOnTopTest, RejectOpaqueColorOnTop) {
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
@@ -1105,7 +1170,7 @@ TEST_F(SingleOverlayOnTopTest, RejectTransparentColorOnTopWithoutBlending) {
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
@@ -1120,7 +1185,7 @@ TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(0U, candidate_list.size());
}
@@ -1135,7 +1200,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoXMirrorTransform) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1150,7 +1215,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoBothMirrorTransform) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1165,7 +1230,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoNormalTransform) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1180,7 +1245,7 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
ASSERT_EQ(1U, pass_list.size());
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1198,7 +1263,7 @@ TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) {
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(1U, pass_list.size());
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(-1, candidate_list[0].plane_z_order);
@@ -1221,7 +1286,7 @@ TEST_F(UnderlayTest, AllowOnTop) {
OverlayCandidateList candidate_list;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidate_list);
+ &candidate_list, &damage_rect_);
EXPECT_EQ(1U, pass_list.size());
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(-1, candidate_list[0].plane_z_order);
@@ -1229,6 +1294,39 @@ TEST_F(UnderlayTest, AllowOnTop) {
EXPECT_EQ(pass_list[0]->quad_list.front()->material, DrawQuad::SOLID_COLOR);
}
+TEST_F(UnderlayTest, DamageRect) {
+ scoped_ptr<RenderPass> pass = CreateRenderPass();
+ CreateFullscreenCandidateQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(),
+ pass.get());
+
+ damage_rect_ = kOverlayRect;
+
+ // Add something behind it.
+ CreateFullscreenOpaqueQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get());
+ CreateFullscreenOpaqueQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get());
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ // Check for potential candidates.
+ OverlayCandidateList candidate_list;
+
+ // Primary plane.
+ OverlayCandidate output_surface_plane;
+ output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
+ output_surface_plane.quad_rect_in_target_space = kOverlayRect;
+ output_surface_plane.use_output_surface_for_resource = true;
+ output_surface_plane.overlay_handled = true;
+ candidate_list.push_back(output_surface_plane);
+
+ overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
+ &candidate_list, &damage_rect_);
+ DCHECK(!damage_rect_.IsEmpty());
+}
+
TEST_F(AllOrNothingOverlayTest, SuccessfulOverlappingOverlays) {
scoped_ptr<RenderPass> pass = CreateRenderPass();
@@ -1244,7 +1342,7 @@ TEST_F(AllOrNothingOverlayTest, SuccessfulOverlappingOverlays) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidates;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidates);
+ &candidates, &damage_rect_);
// Both quads should become overlays.
EXPECT_EQ(2u, candidates.size());
@@ -1275,13 +1373,46 @@ TEST_F(AllOrNothingOverlayTest, RejectQuadWithTransform) {
pass_list.push_back(pass.Pass());
OverlayCandidateList candidates;
overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
- &candidates);
+ &candidates, &damage_rect_);
// No quads should become overlays.
EXPECT_EQ(0u, candidates.size());
EXPECT_EQ(2u, pass_list.back()->quad_list.size());
}
+TEST_F(AllOrNothingOverlayTest, DamageRect) {
+ scoped_ptr<RenderPass> pass = CreateRenderPass();
+ CreateFullscreenCandidateQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(),
+ pass.get());
+
+ damage_rect_ = kOverlayRect;
+
+ // Add something behind it.
+ CreateFullscreenOpaqueQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get());
+ CreateFullscreenOpaqueQuad(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get());
+
+ RenderPassList pass_list;
+ pass_list.push_back(pass.Pass());
+
+ // Check for potential candidates.
+ OverlayCandidateList candidate_list;
+
+ // Primary plane.
+ OverlayCandidate output_surface_plane;
+ output_surface_plane.display_rect = gfx::RectF(kOverlayRect);
+ output_surface_plane.quad_rect_in_target_space = kOverlayRect;
+ output_surface_plane.use_output_surface_for_resource = true;
+ output_surface_plane.overlay_handled = true;
+ candidate_list.push_back(output_surface_plane);
+
+ overlay_processor_->ProcessForOverlays(resource_provider_.get(), &pass_list,
+ &candidate_list, &damage_rect_);
+ DCHECK(!damage_rect_.IsEmpty());
+}
+
class OverlayInfoRendererGL : public GLRenderer {
public:
OverlayInfoRendererGL(RendererClient* client,
@@ -1312,7 +1443,7 @@ class OverlayInfoRendererGL : public GLRenderer {
}
ASSERT_EQ(2U, frame->overlay_list.size());
- EXPECT_NE(0U, frame->overlay_list.back().resource_id);
+ EXPECT_GE(frame->overlay_list.back().resource_id, 0U);
}
void set_expect_overlays(bool expect_overlays) {
@@ -1383,10 +1514,9 @@ TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) {
scoped_ptr<RenderPass> pass = CreateRenderPass();
- CreateFullscreenCandidateQuad(resource_provider_.get(),
- pass->shared_quad_state_list.back(),
- pass.get());
-
+ CreateCandidateQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kOverlayBottomRightRect);
CreateFullscreenOpaqueQuad(resource_provider_.get(),
pass->shared_quad_state_list.back(), pass.get());
CreateFullscreenOpaqueQuad(resource_provider_.get(),
@@ -1402,9 +1532,9 @@ TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) {
Schedule(0, gfx::OVERLAY_TRANSFORM_NONE, _,
gfx::Rect(kDisplaySize), gfx::RectF(0, 0, 1, 1)))
.Times(1);
- EXPECT_CALL(scheduler_,
- Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, kOverlayRect,
- BoundingRect(kUVTopLeft, kUVBottomRight)))
+ EXPECT_CALL(scheduler_, Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _,
+ kOverlayBottomRightRect,
+ BoundingRect(kUVTopLeft, kUVBottomRight)))
.Times(1);
renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false);