Index: cc/output/overlay_unittest.cc |
diff --git a/cc/output/overlay_unittest.cc b/cc/output/overlay_unittest.cc |
index ab22cb485508442ad778d6188befc7fb53f5d2ef..8360a37039b60834020a6d416cc5948b62407f0f 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,179 @@ 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 { |
+ if (!expect_overlays_) { |
+ EXPECT_TRUE(frame->render_passes_in_draw_order == NULL); |
+ EXPECT_EQ(RenderPass::NO_OVERLAY, frame->root_render_pass->overlay_state); |
+ return; |
+ } |
+ |
+ ASSERT_TRUE(frame->render_passes_in_draw_order != NULL); |
+ ASSERT_EQ(2U, frame->render_passes_in_draw_order->size()); |
+ |
+ const RenderPass* overlay_pass = |
+ frame->render_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 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); |
+ } |
+ |
+ 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_; |
+}; |
+ |
+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); |
+ renderer_->DrawFrame( |
+ &pass_list, NULL, 1.f, viewport_rect, viewport_rect, false); |
+ |
+ Mock::VerifyAndClearExpectations(renderer_.get()); |
+} |
+ |
+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); |
+ renderer_->DrawFrame( |
+ &pass_list, NULL, 1.f, viewport_rect, viewport_rect, false); |
+ |
+ Mock::VerifyAndClearExpectations(renderer_.get()); |
+} |
+ |
+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); |
+ renderer_->DrawFrame( |
+ &pass_list, NULL, 1.f, viewport_rect, viewport_rect, false); |
+ |
+ Mock::VerifyAndClearExpectations(renderer_.get()); |
+} |
+ |
} // namespace |
} // namespace cc |