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

Unified Diff: cc/output/overlay_unittest.cc

Issue 2693023002: Use SwapBuffersWithBounds on Chromecast (Closed)
Patch Set: danakj nits Created 3 years, 10 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_underlay_cast.cc ('k') | chromecast/browser/cast_browser_main_parts.cc » ('j') | 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 b1d525434a93bac6c95ed325434bd10a942c67e5..975641ea8764c9c0ae4f86bfdd33f6f9aad07c7a 100644
--- a/cc/output/overlay_unittest.cc
+++ b/cc/output/overlay_unittest.cc
@@ -20,6 +20,7 @@
#include "cc/output/overlay_strategy_fullscreen.h"
#include "cc/output/overlay_strategy_single_on_top.h"
#include "cc/output/overlay_strategy_underlay.h"
+#include "cc/output/overlay_strategy_underlay_cast.h"
#include "cc/quads/render_pass.h"
#include "cc/quads/render_pass_draw_quad.h"
#include "cc/quads/solid_color_draw_quad.h"
@@ -77,6 +78,8 @@ class FullscreenOverlayValidator : public OverlayCandidateValidator {
class SingleOverlayValidator : public OverlayCandidateValidator {
public:
+ SingleOverlayValidator() : expected_rect_(kOverlayRect) {}
+
void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
strategies->push_back(base::MakeUnique<OverlayStrategySingleOnTop>(this));
strategies->push_back(base::MakeUnique<OverlayStrategyUnderlay>(this));
@@ -90,15 +93,12 @@ class SingleOverlayValidator : public OverlayCandidateValidator {
OverlayCandidate& candidate = surfaces->back();
EXPECT_TRUE(!candidate.use_output_surface_for_resource);
- if (candidate.display_rect.width() == kOverlayBottomRightRect.width()) {
- EXPECT_EQ(gfx::RectF(kOverlayBottomRightRect), candidate.display_rect);
- } else {
- EXPECT_NEAR(kOverlayRect.x(), candidate.display_rect.x(), 0.01f);
- EXPECT_NEAR(kOverlayRect.y(), candidate.display_rect.y(), 0.01f);
- EXPECT_NEAR(kOverlayRect.width(), candidate.display_rect.width(), 0.01f);
- EXPECT_NEAR(kOverlayRect.height(), candidate.display_rect.height(),
- 0.01f);
- }
+ 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()) {
@@ -107,6 +107,11 @@ class SingleOverlayValidator : public OverlayCandidateValidator {
}
candidate.overlay_handled = true;
}
+
+ void SetExpectedRect(const gfx::RectF& rect) { expected_rect_ = rect; }
+
+ private:
+ gfx::RectF expected_rect_;
};
class CALayerValidator : public OverlayCandidateValidator {
@@ -130,6 +135,13 @@ class UnderlayOverlayValidator : public SingleOverlayValidator {
}
};
+class UnderlayCastOverlayValidator : public SingleOverlayValidator {
+ public:
+ void GetStrategies(OverlayProcessor::StrategyList* strategies) override {
+ strategies->push_back(base::MakeUnique<OverlayStrategyUnderlayCast>(this));
+ }
+};
+
class DefaultOverlayProcessor : public OverlayProcessor {
public:
explicit DefaultOverlayProcessor(OutputSurface* surface);
@@ -144,6 +156,7 @@ size_t DefaultOverlayProcessor::GetStrategyCount() {
return strategies_.size();
}
+template <typename OverlayCandidateValidatorType>
class OverlayOutputSurface : public OutputSurface {
public:
explicit OverlayOutputSurface(
@@ -171,7 +184,7 @@ class OverlayOutputSurface : public OutputSurface {
}
bool HasExternalStencilTest() const override { return false; }
void ApplyExternalStencil() override {}
- OverlayCandidateValidator* GetOverlayCandidateValidator() const override {
+ OverlayCandidateValidatorType* GetOverlayCandidateValidator() const override {
return overlay_candidate_validator_.get();
}
bool IsDisplayedAsOverlayPlane() const override {
@@ -184,14 +197,14 @@ class OverlayOutputSurface : public OutputSurface {
is_displayed_as_overlay_plane_ = value;
}
- void SetOverlayCandidateValidator(OverlayCandidateValidator* validator) {
+ void SetOverlayCandidateValidator(OverlayCandidateValidatorType* validator) {
overlay_candidate_validator_.reset(validator);
}
unsigned bind_framebuffer_count() const { return bind_framebuffer_count_; }
private:
- std::unique_ptr<OverlayCandidateValidator> overlay_candidate_validator_;
+ std::unique_ptr<OverlayCandidateValidatorType> overlay_candidate_validator_;
bool is_displayed_as_overlay_plane_;
unsigned bind_framebuffer_count_ = 0;
};
@@ -208,6 +221,20 @@ std::unique_ptr<RenderPass> CreateRenderPass() {
return pass;
}
+std::unique_ptr<RenderPass> CreateRenderPassWithTransform(
+ const gfx::Transform& transform) {
+ int render_pass_id = 1;
+ gfx::Rect output_rect(0, 0, 256, 256);
+
+ std::unique_ptr<RenderPass> pass = RenderPass::Create();
+ pass->SetNew(render_pass_id, output_rect, output_rect, gfx::Transform());
+
+ SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
+ shared_state->opacity = 1.f;
+ shared_state->quad_to_target_transform = transform;
+ return pass;
+}
+
ResourceId CreateResource(ResourceProvider* resource_provider,
const gfx::Size& size,
bool is_overlay_candidate) {
@@ -302,6 +329,17 @@ void CreateOpaqueQuadAt(ResourceProvider* resource_provider,
color_quad->SetNew(shared_quad_state, rect, rect, SK_ColorBLACK, false);
}
+void CreateOpaqueQuadAt(ResourceProvider* resource_provider,
+ const SharedQuadState* shared_quad_state,
+ RenderPass* render_pass,
+ const gfx::Rect& rect,
+ SkColor color) {
+ DCHECK_EQ(255u, SkColorGetA(color));
+ SolidColorDrawQuad* color_quad =
+ render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
+ color_quad->SetNew(shared_quad_state, rect, rect, color, false);
+}
+
void CreateFullscreenOpaqueQuad(ResourceProvider* resource_provider,
const SharedQuadState* shared_quad_state,
RenderPass* render_pass) {
@@ -341,11 +379,13 @@ static void CompareRenderPassLists(const RenderPassList& expected_list,
template <typename OverlayCandidateValidatorType>
class OverlayTest : public testing::Test {
+ using OutputSurfaceType = OverlayOutputSurface<OverlayCandidateValidatorType>;
+
protected:
void SetUp() override {
provider_ = TestContextProvider::Create();
provider_->BindToCurrentThread();
- output_surface_.reset(new OverlayOutputSurface(provider_));
+ output_surface_ = base::MakeUnique<OutputSurfaceType>(provider_);
output_surface_->BindToClient(&client_);
output_surface_->SetOverlayCandidateValidator(
new OverlayCandidateValidatorType);
@@ -359,22 +399,24 @@ class OverlayTest : public testing::Test {
}
scoped_refptr<TestContextProvider> provider_;
- std::unique_ptr<OverlayOutputSurface> output_surface_;
+ std::unique_ptr<OutputSurfaceType> output_surface_;
FakeOutputSurfaceClient client_;
std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_;
std::unique_ptr<ResourceProvider> resource_provider_;
std::unique_ptr<OverlayProcessor> overlay_processor_;
gfx::Rect damage_rect_;
+ std::vector<gfx::Rect> content_bounds_;
};
-typedef OverlayTest<FullscreenOverlayValidator> FullscreenOverlayTest;
-typedef OverlayTest<SingleOnTopOverlayValidator> SingleOverlayOnTopTest;
-typedef OverlayTest<UnderlayOverlayValidator> UnderlayTest;
-typedef OverlayTest<CALayerValidator> CALayerOverlayTest;
+using FullscreenOverlayTest = OverlayTest<FullscreenOverlayValidator>;
+using SingleOverlayOnTopTest = OverlayTest<SingleOnTopOverlayValidator>;
+using UnderlayTest = OverlayTest<UnderlayOverlayValidator>;
+using UnderlayCastTest = OverlayTest<UnderlayCastOverlayValidator>;
+using CALayerOverlayTest = OverlayTest<CALayerValidator>;
TEST(OverlayTest, NoOverlaysByDefault) {
scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
- OverlayOutputSurface output_surface(provider);
+ OverlayOutputSurface<OverlayCandidateValidator> output_surface(provider);
EXPECT_EQ(NULL, output_surface.GetOverlayCandidateValidator());
output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator);
@@ -384,7 +426,7 @@ TEST(OverlayTest, NoOverlaysByDefault) {
TEST(OverlayTest, OverlaysProcessorHasStrategy) {
scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
provider->BindToCurrentThread();
- OverlayOutputSurface output_surface(provider);
+ OverlayOutputSurface<OverlayCandidateValidator> output_surface(provider);
FakeOutputSurfaceClient client;
output_surface.BindToClient(&client);
output_surface.SetOverlayCandidateValidator(new SingleOverlayValidator);
@@ -417,7 +459,8 @@ TEST_F(FullscreenOverlayTest, SuccessfulOverlay) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
RenderPass* main_pass = pass.get();
@@ -442,7 +485,8 @@ TEST_F(FullscreenOverlayTest, ResourceSizeInPixelsFail) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(0U, candidate_list.size());
RenderPass* main_pass = pass.get();
@@ -468,7 +512,8 @@ TEST_F(FullscreenOverlayTest, OnTopFail) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(0U, candidate_list.size());
RenderPass* main_pass = pass.get();
@@ -490,7 +535,8 @@ TEST_F(FullscreenOverlayTest, NotCoveringFullscreenFail) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(0U, candidate_list.size());
RenderPass* main_pass = pass.get();
@@ -519,7 +565,8 @@ TEST_F(FullscreenOverlayTest, RemoveFullscreenQuadFromQuadList) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
// Check that the fullscreen quad is gone.
@@ -548,7 +595,8 @@ TEST_F(SingleOverlayOnTopTest, SuccessfulOverlay) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
RenderPass* main_pass = pass.get();
@@ -593,7 +641,8 @@ TEST_F(SingleOverlayOnTopTest, DamageRect) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
DCHECK(damage_rect_.IsEmpty());
}
@@ -615,7 +664,8 @@ TEST_F(SingleOverlayOnTopTest, NoCandidates) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass_list.back().get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
// There should be nothing new here.
CompareRenderPassLists(pass_list, original_pass_list);
@@ -643,7 +693,8 @@ TEST_F(SingleOverlayOnTopTest, OccludedCandidates) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass_list.back().get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
// There should be nothing new here.
CompareRenderPassLists(pass_list, original_pass_list);
@@ -668,7 +719,8 @@ TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
@@ -685,7 +737,8 @@ TEST_F(SingleOverlayOnTopTest, RejectBlending) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
}
@@ -702,7 +755,8 @@ TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
}
@@ -718,7 +772,8 @@ TEST_F(SingleOverlayOnTopTest, RejectBlendMode) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
}
@@ -734,7 +789,8 @@ TEST_F(SingleOverlayOnTopTest, RejectOpacity) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
}
@@ -751,7 +807,8 @@ TEST_F(SingleOverlayOnTopTest, RejectNonAxisAlignedTransform) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
}
@@ -768,7 +825,8 @@ TEST_F(SingleOverlayOnTopTest, AllowClipped) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
@@ -786,7 +844,8 @@ TEST_F(UnderlayTest, AllowVerticalFlip) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL,
candidate_list.back().transform);
@@ -807,7 +866,8 @@ TEST_F(UnderlayTest, AllowHorizontalFlip) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL,
candidate_list.back().transform);
@@ -826,7 +886,8 @@ TEST_F(SingleOverlayOnTopTest, AllowPositiveScaleTransform) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
@@ -844,7 +905,8 @@ TEST_F(SingleOverlayOnTopTest, RejectTransform) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(0U, candidate_list.size());
}
@@ -862,7 +924,8 @@ TEST_F(UnderlayTest, Allow90DegreeRotation) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_90, candidate_list.back().transform);
}
@@ -881,7 +944,8 @@ TEST_F(UnderlayTest, Allow180DegreeRotation) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_180, candidate_list.back().transform);
}
@@ -900,12 +964,16 @@ TEST_F(UnderlayTest, Allow270DegreeRotation) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(gfx::OVERLAY_TRANSFORM_ROTATE_270, candidate_list.back().transform);
}
TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
+ output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ gfx::RectF(kOverlayBottomRightRect));
+
std::unique_ptr<RenderPass> pass = CreateRenderPass();
CreateOpaqueQuadAt(resource_provider_.get(),
pass->shared_quad_state_list.back(), pass.get(),
@@ -920,11 +988,15 @@ TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) {
+ output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ gfx::RectF(kOverlayBottomRightRect));
+
std::unique_ptr<RenderPass> pass = CreateRenderPass();
SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
shared_state->opacity = 0.f;
@@ -940,11 +1012,15 @@ TEST_F(SingleOverlayOnTopTest, AllowTransparentOnTop) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) {
+ output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ gfx::RectF(kOverlayBottomRightRect));
+
std::unique_ptr<RenderPass> pass = CreateRenderPass();
CreateSolidColorQuadAt(pass->shared_quad_state_list.back(),
SK_ColorTRANSPARENT, pass.get(),
@@ -958,7 +1034,8 @@ TEST_F(SingleOverlayOnTopTest, AllowTransparentColorOnTop) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
@@ -978,7 +1055,8 @@ TEST_F(SingleOverlayOnTopTest, RejectOpaqueColorOnTop) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
}
@@ -996,7 +1074,8 @@ TEST_F(SingleOverlayOnTopTest, RejectTransparentColorOnTopWithoutBlending) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
}
@@ -1011,7 +1090,8 @@ TEST_F(SingleOverlayOnTopTest, RejectVideoSwapTransform) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(0U, candidate_list.size());
}
@@ -1026,7 +1106,8 @@ TEST_F(UnderlayTest, AllowVideoXMirrorTransform) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1041,7 +1122,8 @@ TEST_F(UnderlayTest, AllowVideoBothMirrorTransform) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1056,7 +1138,8 @@ TEST_F(UnderlayTest, AllowVideoNormalTransform) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
@@ -1071,11 +1154,15 @@ TEST_F(SingleOverlayOnTopTest, AllowVideoYMirrorTransform) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(1U, candidate_list.size());
}
TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) {
+ output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ gfx::RectF(kOverlayBottomRightRect));
+
std::unique_ptr<RenderPass> pass = CreateRenderPass();
CreateFullscreenOpaqueQuad(resource_provider_.get(),
pass->shared_quad_state_list.back(), pass.get());
@@ -1088,7 +1175,8 @@ TEST_F(UnderlayTest, OverlayLayerUnderMainLayer) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(-1, candidate_list[0].plane_z_order);
EXPECT_EQ(2U, pass->quad_list.size());
@@ -1110,7 +1198,8 @@ TEST_F(UnderlayTest, AllowOnTop) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
ASSERT_EQ(1U, candidate_list.size());
EXPECT_EQ(-1, candidate_list[0].plane_z_order);
// The overlay quad should have changed to a SOLID_COLOR quad.
@@ -1131,7 +1220,8 @@ TEST_F(UnderlayTest, InitialUnderlayDamageNotSubtracted) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr, &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(kOverlayRect, damage_rect_);
}
@@ -1156,8 +1246,8 @@ TEST_F(UnderlayTest, DamageSubtractedForConsecutiveIdenticalUnderlays) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr,
- &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
}
// The second time the same overlay rect is scheduled it will be subtracted
@@ -1170,6 +1260,9 @@ 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(
+ gfx::RectF(overlay_rects[i]));
+
std::unique_ptr<RenderPass> pass = CreateRenderPass();
CreateCandidateQuadAt(resource_provider_.get(),
@@ -1183,8 +1276,8 @@ TEST_F(UnderlayTest, DamageNotSubtractedForNonIdenticalConsecutiveUnderlays) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr,
- &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
EXPECT_EQ(overlay_rects[i], damage_rect_);
}
@@ -1207,14 +1300,17 @@ TEST_F(UnderlayTest, DamageNotSubtractedWhenQuadsAboveOverlap) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr,
- &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
}
EXPECT_EQ(kOverlayRect, damage_rect_);
}
TEST_F(UnderlayTest, DamageSubtractedWhenQuadsAboveDontOverlap) {
+ output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ gfx::RectF(kOverlayBottomRightRect));
+
for (int i = 0; i < 2; ++i) {
std::unique_ptr<RenderPass> pass = CreateRenderPass();
// Add a non-overlapping quad above the candidate.
@@ -1232,13 +1328,184 @@ TEST_F(UnderlayTest, DamageSubtractedWhenQuadsAboveDontOverlap) {
RenderPassFilterList render_pass_background_filters;
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
- render_pass_background_filters, &candidate_list, nullptr,
- &damage_rect_);
+ render_pass_background_filters, &candidate_list, nullptr, &damage_rect_,
+ &content_bounds_);
}
EXPECT_TRUE(damage_rect_.IsEmpty());
}
+TEST_F(UnderlayCastTest, NoOverlayContentBounds) {
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kOverlayTopLeftRect);
+
+ 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, &damage_rect_,
+ &content_bounds_);
+ EXPECT_EQ(0U, content_bounds_.size());
+}
+
+TEST_F(UnderlayCastTest, FullScreenOverlayContentBounds) {
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+ CreateCandidateQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kOverlayRect);
+
+ 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, &damage_rect_,
+ &content_bounds_);
+
+ EXPECT_EQ(1U, content_bounds_.size());
+ EXPECT_TRUE(content_bounds_[0].IsEmpty());
+}
+
+TEST_F(UnderlayCastTest, BlackOutsideOverlayContentBounds) {
+ output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ gfx::RectF(kOverlayBottomRightRect));
+
+ const gfx::Rect kLeftSide(0, 0, 128, 256);
+ const gfx::Rect kTopRight(128, 0, 128, 128);
+
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+ CreateCandidateQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kOverlayBottomRightRect);
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(), kLeftSide,
+ SK_ColorBLACK);
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(), kTopRight,
+ SK_ColorBLACK);
+
+ 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, &damage_rect_,
+ &content_bounds_);
+
+ EXPECT_EQ(1U, content_bounds_.size());
+ EXPECT_TRUE(content_bounds_[0].IsEmpty());
+}
+
+TEST_F(UnderlayCastTest, OverlayOccludedContentBounds) {
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kOverlayTopLeftRect);
+ CreateCandidateQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kOverlayRect);
+
+ 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, &damage_rect_,
+ &content_bounds_);
+
+ EXPECT_EQ(1U, content_bounds_.size());
+ EXPECT_EQ(kOverlayTopLeftRect, content_bounds_[0]);
+}
+
+TEST_F(UnderlayCastTest, OverlayOccludedUnionContentBounds) {
+ std::unique_ptr<RenderPass> pass = CreateRenderPass();
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kOverlayTopLeftRect);
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kOverlayBottomRightRect);
+ CreateCandidateQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ kOverlayRect);
+
+ 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, &damage_rect_,
+ &content_bounds_);
+
+ EXPECT_EQ(1U, content_bounds_.size());
+ EXPECT_EQ(kOverlayRect, content_bounds_[0]);
+}
+
+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(
+ gfx::RectF(1.5f, 1.5f, 8, 8));
+
+ gfx::Transform transform;
+ transform.Translate(0.5f, 0.5f);
+
+ std::unique_ptr<RenderPass> pass = CreateRenderPassWithTransform(transform);
+ CreateCandidateQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ overlay_rect);
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ gfx::Rect(0, 0, 10, 10), SK_ColorWHITE);
+
+ 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, &damage_rect_,
+ &content_bounds_);
+
+ EXPECT_EQ(1U, content_bounds_.size());
+ EXPECT_EQ(gfx::Rect(0, 0, 11, 11), content_bounds_[0]);
+}
+
+TEST_F(UnderlayCastTest, RoundContentBounds) {
+ // Check rounding behaviour on content quads (bounds should be enclosing
+ // rect).
+ gfx::Rect overlay_rect = kOverlayRect;
+ overlay_rect.Inset(0, 0, 1, 1);
+ output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ gfx::RectF(0.5f, 0.5f, 255, 255));
+
+ gfx::Transform transform;
+ transform.Translate(0.5f, 0.5f);
+
+ std::unique_ptr<RenderPass> pass = CreateRenderPassWithTransform(transform);
+ CreateCandidateQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ overlay_rect);
+ CreateOpaqueQuadAt(resource_provider_.get(),
+ pass->shared_quad_state_list.back(), pass.get(),
+ gfx::Rect(0, 0, 255, 255), SK_ColorWHITE);
+
+ 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, &damage_rect_,
+ &content_bounds_);
+
+ EXPECT_EQ(1U, content_bounds_.size());
+ EXPECT_EQ(kOverlayRect, content_bounds_[0]);
+}
+
OverlayCandidateList BackbufferOverlayList(const RenderPass* root_render_pass) {
OverlayCandidateList list;
OverlayCandidate output_surface_plane;
@@ -1267,7 +1534,7 @@ TEST_F(CALayerOverlayTest, AllowNonAxisAlignedTransform) {
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
render_pass_background_filters, &overlay_list, &ca_layer_list,
- &damage_rect);
+ &damage_rect_, &content_bounds_);
EXPECT_EQ(gfx::Rect(), damage_rect);
EXPECT_EQ(0U, overlay_list.size());
EXPECT_EQ(1U, ca_layer_list.size());
@@ -1290,7 +1557,7 @@ TEST_F(CALayerOverlayTest, ThreeDTransform) {
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
render_pass_background_filters, &overlay_list, &ca_layer_list,
- &damage_rect);
+ &damage_rect_, &content_bounds_);
EXPECT_EQ(0U, overlay_list.size());
EXPECT_EQ(1U, ca_layer_list.size());
gfx::Transform expected_transform;
@@ -1316,7 +1583,7 @@ TEST_F(CALayerOverlayTest, AllowContainingClip) {
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
render_pass_background_filters, &overlay_list, &ca_layer_list,
- &damage_rect);
+ &damage_rect_, &content_bounds_);
EXPECT_EQ(gfx::Rect(), damage_rect);
EXPECT_EQ(0U, overlay_list.size());
EXPECT_EQ(1U, ca_layer_list.size());
@@ -1339,7 +1606,7 @@ TEST_F(CALayerOverlayTest, NontrivialClip) {
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
render_pass_background_filters, &overlay_list, &ca_layer_list,
- &damage_rect);
+ &damage_rect_, &content_bounds_);
EXPECT_EQ(gfx::Rect(), damage_rect);
EXPECT_EQ(0U, overlay_list.size());
EXPECT_EQ(1U, ca_layer_list.size());
@@ -1364,7 +1631,7 @@ TEST_F(CALayerOverlayTest, SkipTransparent) {
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass.get(), render_pass_filters,
render_pass_background_filters, &overlay_list, &ca_layer_list,
- &damage_rect);
+ &damage_rect_, &content_bounds_);
EXPECT_EQ(gfx::Rect(), damage_rect);
EXPECT_EQ(0U, overlay_list.size());
EXPECT_EQ(0U, ca_layer_list.size());
@@ -1419,11 +1686,13 @@ class MockOverlayScheduler {
};
class GLRendererWithOverlaysTest : public testing::Test {
+ using OutputSurfaceType = OverlayOutputSurface<SingleOverlayValidator>;
+
protected:
GLRendererWithOverlaysTest() {
provider_ = TestContextProvider::Create();
provider_->BindToCurrentThread();
- output_surface_.reset(new OverlayOutputSurface(provider_));
+ output_surface_.reset(new OutputSurfaceType(provider_));
output_surface_->BindToClient(&output_surface_client_);
resource_provider_ = FakeResourceProvider::Create(provider_.get(), nullptr);
@@ -1466,7 +1735,7 @@ class GLRendererWithOverlaysTest : public testing::Test {
RendererSettings settings_;
FakeOutputSurfaceClient output_surface_client_;
- std::unique_ptr<OverlayOutputSurface> output_surface_;
+ std::unique_ptr<OutputSurfaceType> output_surface_;
std::unique_ptr<ResourceProvider> resource_provider_;
std::unique_ptr<OverlayInfoRendererGL> renderer_;
scoped_refptr<TestContextProvider> provider_;
@@ -1477,6 +1746,9 @@ TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) {
bool use_validator = true;
Init(use_validator);
renderer_->set_expect_overlays(true);
+ output_surface_->GetOverlayCandidateValidator()->SetExpectedRect(
+ gfx::RectF(kOverlayBottomRightRect));
+
gfx::Size viewport_size(16, 16);
std::unique_ptr<RenderPass> pass = CreateRenderPass();
@@ -1904,7 +2176,7 @@ class CALayerOverlayRPDQTest : public CALayerOverlayTest {
overlay_processor_->ProcessForOverlays(
resource_provider_.get(), pass_.get(), render_pass_filters_,
render_pass_background_filters_, &overlay_list_, &ca_layer_list_,
- &damage_rect);
+ &damage_rect_, &content_bounds_);
}
std::unique_ptr<RenderPass> pass_;
RenderPassDrawQuad* quad_;
« no previous file with comments | « cc/output/overlay_strategy_underlay_cast.cc ('k') | chromecast/browser/cast_browser_main_parts.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698