| Index: cc/output/overlay_unittest.cc
|
| diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc
|
| index ab22cb485508442ad778d6188befc7fb53f5d2ef..f499e2022ab1014e5647475fc38b9811ce6f0b26 100644
|
| --- a/cc/output/overlay_unittest.cc
|
| +++ b/cc/output/overlay_unittest.cc
|
| @@ -3,6 +3,7 @@
|
| // found in the LICENSE file.
|
|
|
| #include "cc/base/scoped_ptr_vector.h"
|
| +#include "cc/output/gl_renderer.h"
|
| #include "cc/output/output_surface.h"
|
| #include "cc/output/output_surface_client.h"
|
| #include "cc/output/overlay_candidate_validator.h"
|
| @@ -16,8 +17,12 @@
|
| #include "cc/test/fake_output_surface_client.h"
|
| #include "cc/test/geometry_test_utils.h"
|
| #include "cc/test/test_context_provider.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| +using testing::_;
|
| +using testing::Mock;
|
| +
|
| namespace cc {
|
| namespace {
|
|
|
| @@ -252,7 +257,7 @@ TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) {
|
| pass_list.push_back(pass.Pass());
|
|
|
| // Check for potential candidates.
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_TRUE(overlay_processor_->ProcessForOverlays(&pass_list));
|
|
|
| // This should have one more pass with an overlay.
|
| ASSERT_EQ(2U, pass_list.size());
|
| @@ -283,7 +288,7 @@ TEST_F(SingleOverlayOnTopTest, NoCandidates) {
|
| RenderPassList original_pass_list;
|
| RenderPass::CopyAll(pass_list, &original_pass_list);
|
|
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_FALSE(overlay_processor_->ProcessForOverlays(&pass_list));
|
| // There should be nothing new here.
|
| CompareRenderPassLists(pass_list, original_pass_list);
|
| }
|
| @@ -306,7 +311,7 @@ TEST_F(SingleOverlayOnTopTest, OccludedCandidates) {
|
| RenderPassList original_pass_list;
|
| RenderPass::CopyAll(pass_list, &original_pass_list);
|
|
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_FALSE(overlay_processor_->ProcessForOverlays(&pass_list));
|
| // There should be nothing new here.
|
| CompareRenderPassLists(pass_list, original_pass_list);
|
| }
|
| @@ -331,7 +336,7 @@ TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) {
|
| pass_list.push_back(pass.Pass());
|
|
|
| // Check for potential candidates.
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_TRUE(overlay_processor_->ProcessForOverlays(&pass_list));
|
|
|
| // This should have one more pass with an overlay.
|
| ASSERT_EQ(3U, pass_list.size());
|
| @@ -346,7 +351,7 @@ TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) {
|
| pass->quad_list.push_back(quad.PassAs<DrawQuad>());
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_FALSE(overlay_processor_->ProcessForOverlays(&pass_list));
|
| ASSERT_EQ(1U, pass_list.size());
|
| EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state);
|
| }
|
| @@ -360,7 +365,7 @@ TEST_F(SingleOverlayOnTopTest, RejectBlending) {
|
| pass->quad_list.push_back(quad.PassAs<DrawQuad>());
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_FALSE(overlay_processor_->ProcessForOverlays(&pass_list));
|
| ASSERT_EQ(1U, pass_list.size());
|
| EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state);
|
| }
|
| @@ -374,7 +379,7 @@ TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) {
|
| pass->quad_list.push_back(quad.PassAs<DrawQuad>());
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_FALSE(overlay_processor_->ProcessForOverlays(&pass_list));
|
| ASSERT_EQ(1U, pass_list.size());
|
| EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state);
|
| }
|
| @@ -388,7 +393,7 @@ TEST_F(SingleOverlayOnTopTest, RejectBlendMode) {
|
| pass->quad_list.push_back(quad.PassAs<DrawQuad>());
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_FALSE(overlay_processor_->ProcessForOverlays(&pass_list));
|
| ASSERT_EQ(1U, pass_list.size());
|
| EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state);
|
| }
|
| @@ -402,7 +407,7 @@ TEST_F(SingleOverlayOnTopTest, RejectOpacity) {
|
| pass->quad_list.push_back(quad.PassAs<DrawQuad>());
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_FALSE(overlay_processor_->ProcessForOverlays(&pass_list));
|
| ASSERT_EQ(1U, pass_list.size());
|
| EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state);
|
| }
|
| @@ -417,10 +422,206 @@ TEST_F(SingleOverlayOnTopTest, RejectTransform) {
|
| pass->quad_list.push_back(quad.PassAs<DrawQuad>());
|
| RenderPassList pass_list;
|
| pass_list.push_back(pass.Pass());
|
| - overlay_processor_->ProcessForOverlays(&pass_list);
|
| + EXPECT_FALSE(overlay_processor_->ProcessForOverlays(&pass_list));
|
| ASSERT_EQ(1U, pass_list.size());
|
| EXPECT_EQ(RenderPass::NO_OVERLAY, pass_list.back()->overlay_state);
|
| }
|
|
|
| +class OverlayInfoRendererGL : public GLRenderer {
|
| + public:
|
| + OverlayInfoRendererGL(RendererClient* client,
|
| + const LayerTreeSettings* settings,
|
| + OutputSurface* output_surface,
|
| + ResourceProvider* resource_provider)
|
| + : GLRenderer(client,
|
| + settings,
|
| + output_surface,
|
| + resource_provider,
|
| + NULL,
|
| + 0),
|
| + expect_overlays_(false) {}
|
| +
|
| + MOCK_METHOD2(DoDrawQuad, void(DrawingFrame* frame, const DrawQuad* quad));
|
| +
|
| + virtual void FinishDrawingFrame(DrawingFrame* frame) OVERRIDE {
|
| + GLRenderer::FinishDrawingFrame(frame);
|
| +
|
| + if (!expect_overlays_) {
|
| + EXPECT_TRUE(frame->overlay_passes_in_draw_order == NULL);
|
| + EXPECT_EQ(RenderPass::NO_OVERLAY, frame->root_render_pass->overlay_state);
|
| + return;
|
| + }
|
| +
|
| + ASSERT_TRUE(frame->overlay_passes_in_draw_order != NULL);
|
| + ASSERT_EQ(2U, frame->overlay_passes_in_draw_order->size());
|
| +
|
| + const RenderPass* overlay_pass =
|
| + frame->overlay_passes_in_draw_order->front();
|
| + EXPECT_EQ(RenderPass::SIMPLE_OVERLAY, overlay_pass->overlay_state);
|
| + EXPECT_EQ(RenderPass::NO_OVERLAY, frame->root_render_pass->overlay_state);
|
| +
|
| + // Check that the quad is what we expect it to be.
|
| + EXPECT_EQ(1U, overlay_pass->quad_list.size());
|
| + const DrawQuad* overlay_quad = overlay_pass->quad_list.front();
|
| + EXPECT_EQ(DrawQuad::TEXTURE_CONTENT, overlay_quad->material);
|
| + }
|
| +
|
| + void set_expect_overlays(bool expect_overlays) {
|
| + expect_overlays_ = expect_overlays;
|
| + }
|
| +
|
| + private:
|
| + bool expect_overlays_;
|
| +};
|
| +
|
| +class FakeRendererClient : public RendererClient {
|
| + public:
|
| + // RendererClient methods.
|
| + virtual void SetFullRootLayerDamage() OVERRIDE {}
|
| +};
|
| +
|
| +class MockOverlayScheduler {
|
| + public:
|
| + MOCK_METHOD5(Schedule,
|
| + void(int plane_z_order,
|
| + unsigned plane_transform,
|
| + unsigned overlay_texture_id,
|
| + const gfx::Rect& display_bounds,
|
| + gfx::RectF crop_rect));
|
| +};
|
| +
|
| +class GLRendererWithOverlaysTest : public testing::Test {
|
| + protected:
|
| + GLRendererWithOverlaysTest() {
|
| + provider_ = TestContextProvider::Create();
|
| + output_surface_.reset(new OverlayOutputSurface(provider_));
|
| + CHECK(output_surface_->BindToClient(&output_surface_client_));
|
| + resource_provider_ =
|
| + ResourceProvider::Create(output_surface_.get(), NULL, 0, false, 1);
|
| +
|
| + provider_->support()->SetScheduleOverlayPlaneCallback(base::Bind(
|
| + &MockOverlayScheduler::Schedule, base::Unretained(&scheduler_)));
|
| + }
|
| +
|
| + void Init(bool use_validator) {
|
| + if (use_validator)
|
| + output_surface_->InitWithSingleOverlayValidator();
|
| +
|
| + renderer_ =
|
| + make_scoped_ptr(new OverlayInfoRendererGL(&renderer_client_,
|
| + &settings_,
|
| + output_surface_.get(),
|
| + resource_provider_.get()));
|
| + }
|
| +
|
| + LayerTreeSettings settings_;
|
| + FakeOutputSurfaceClient output_surface_client_;
|
| + scoped_ptr<OverlayOutputSurface> output_surface_;
|
| + FakeRendererClient renderer_client_;
|
| + scoped_ptr<ResourceProvider> resource_provider_;
|
| + scoped_ptr<OverlayInfoRendererGL> renderer_;
|
| + scoped_refptr<TestContextProvider> provider_;
|
| + MockOverlayScheduler scheduler_;
|
| +};
|
| +
|
| +TEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) {
|
| + bool use_validator = true;
|
| + Init(use_validator);
|
| + renderer_->set_expect_overlays(true);
|
| + gfx::Rect viewport_rect(16, 16);
|
| +
|
| + scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| +
|
| + pass->quad_list.push_back(
|
| + CreateCandidateQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back())
|
| + .PassAs<DrawQuad>());
|
| +
|
| + pass->quad_list.push_back(CreateCheckeredQuad(
|
| + resource_provider_.get(), pass->shared_quad_state_list.back()));
|
| + pass->quad_list.push_back(CreateCheckeredQuad(
|
| + resource_provider_.get(), pass->shared_quad_state_list.back()));
|
| +
|
| + RenderPassList pass_list;
|
| + pass_list.push_back(pass.Pass());
|
| +
|
| + // Candidate pass was taken out and extra skipped pass added,
|
| + // so only draw 2 quads.
|
| + EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(2);
|
| + EXPECT_CALL(scheduler_,
|
| + Schedule(1,
|
| + OverlayCandidate::NONE,
|
| + _,
|
| + kOverlayRect,
|
| + BoundingRect(kUVTopLeft, kUVBottomRight))).Times(1);
|
| + renderer_->DrawFrame(
|
| + &pass_list, NULL, 1.f, viewport_rect, viewport_rect, false);
|
| +
|
| + Mock::VerifyAndClearExpectations(renderer_.get());
|
| + Mock::VerifyAndClearExpectations(&scheduler_);
|
| +}
|
| +
|
| +TEST_F(GLRendererWithOverlaysTest, OccludedQuadDrawn) {
|
| + bool use_validator = true;
|
| + Init(use_validator);
|
| + renderer_->set_expect_overlays(false);
|
| + gfx::Rect viewport_rect(16, 16);
|
| +
|
| + scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| +
|
| + pass->quad_list.push_back(CreateCheckeredQuad(
|
| + resource_provider_.get(), pass->shared_quad_state_list.back()));
|
| + pass->quad_list.push_back(CreateCheckeredQuad(
|
| + resource_provider_.get(), pass->shared_quad_state_list.back()));
|
| +
|
| + pass->quad_list.push_back(
|
| + CreateCandidateQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back())
|
| + .PassAs<DrawQuad>());
|
| +
|
| + RenderPassList pass_list;
|
| + pass_list.push_back(pass.Pass());
|
| +
|
| + // 3 quads in the pass, all should draw.
|
| + EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3);
|
| + EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
|
| + renderer_->DrawFrame(
|
| + &pass_list, NULL, 1.f, viewport_rect, viewport_rect, false);
|
| +
|
| + Mock::VerifyAndClearExpectations(renderer_.get());
|
| + Mock::VerifyAndClearExpectations(&scheduler_);
|
| +}
|
| +
|
| +TEST_F(GLRendererWithOverlaysTest, NoValidatorNoOverlay) {
|
| + bool use_validator = false;
|
| + Init(use_validator);
|
| + renderer_->set_expect_overlays(false);
|
| + gfx::Rect viewport_rect(16, 16);
|
| +
|
| + scoped_ptr<RenderPass> pass = CreateRenderPass();
|
| +
|
| + pass->quad_list.push_back(
|
| + CreateCandidateQuad(resource_provider_.get(),
|
| + pass->shared_quad_state_list.back())
|
| + .PassAs<DrawQuad>());
|
| +
|
| + pass->quad_list.push_back(CreateCheckeredQuad(
|
| + resource_provider_.get(), pass->shared_quad_state_list.back()));
|
| + pass->quad_list.push_back(CreateCheckeredQuad(
|
| + resource_provider_.get(), pass->shared_quad_state_list.back()));
|
| +
|
| + RenderPassList pass_list;
|
| + pass_list.push_back(pass.Pass());
|
| +
|
| + // Should see no overlays.
|
| + EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3);
|
| + EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
|
| + renderer_->DrawFrame(
|
| + &pass_list, NULL, 1.f, viewport_rect, viewport_rect, false);
|
| +
|
| + Mock::VerifyAndClearExpectations(renderer_.get());
|
| + Mock::VerifyAndClearExpectations(&scheduler_);
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|