123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/base/scoped_ptr_vector.h"
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "cc/output/gl_renderer.h"
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/output/output_surface.h"
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/output/output_surface_client.h"
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/output/overlay_candidate_validator.h"
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/output/overlay_processor.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/output/overlay_strategy_single_on_top.h"
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/quads/checkerboard_draw_quad.h"
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/quads/render_pass.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/quads/texture_draw_quad.h"
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/resources/resource_provider.h"
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/resources/texture_mailbox.h"
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/fake_output_surface_client.h"
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_context_provider.h"
20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "cc/test/test_shared_bitmap_manager.h"
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing testing::_;
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing testing::Mock;
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace cc {
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace {
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const gfx::Rect kOverlayRect(0, 0, 128, 128);
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const gfx::Rect kOverlayTopLeftRect(0, 0, 64, 64);
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const gfx::Rect kOverlayBottomRightRect(64, 64, 64, 64);
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const gfx::PointF kUVTopLeft(0.1f, 0.2f);
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)const gfx::PointF kUVBottomRight(1.0f, 1.0f);
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MailboxReleased(unsigned sync_point,
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     bool lost_resource,
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     BlockingTaskRunner* main_thread_task_runner) {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class SingleOverlayValidator : public OverlayCandidateValidator {
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void CheckOverlaySupport(OverlayCandidateList* surfaces) OVERRIDE;
4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void SingleOverlayValidator::CheckOverlaySupport(
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    OverlayCandidateList* surfaces) {
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ(2U, surfaces->size());
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  OverlayCandidate& candidate = surfaces->back();
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (candidate.display_rect.width() == 64)
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(kOverlayBottomRightRect, candidate.display_rect);
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  else
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(kOverlayRect, candidate.display_rect);
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(BoundingRect(kUVTopLeft, kUVBottomRight).ToString(),
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            candidate.uv_rect.ToString());
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  candidate.overlay_handled = true;
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class SingleOverlayProcessor : public OverlayProcessor {
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  SingleOverlayProcessor(OutputSurface* surface,
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                         ResourceProvider* resource_provider);
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Virtual to allow testing different strategies.
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void Initialize() OVERRIDE;
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)SingleOverlayProcessor::SingleOverlayProcessor(
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    OutputSurface* surface,
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ResourceProvider* resource_provider)
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    : OverlayProcessor(surface, resource_provider) {
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(surface, surface_);
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(resource_provider, resource_provider_);
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void SingleOverlayProcessor::Initialize() {
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  OverlayCandidateValidator* candidates =
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      surface_->overlay_candidate_validator();
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_TRUE(candidates != NULL);
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  strategies_.push_back(scoped_ptr<Strategy>(
8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new OverlayStrategySingleOnTop(candidates, resource_provider_)));
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class DefaultOverlayProcessor : public OverlayProcessor {
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  DefaultOverlayProcessor(OutputSurface* surface,
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                          ResourceProvider* resource_provider);
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  size_t GetStrategyCount();
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)DefaultOverlayProcessor::DefaultOverlayProcessor(
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    OutputSurface* surface,
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ResourceProvider* resource_provider)
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    : OverlayProcessor(surface, resource_provider) {}
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)size_t DefaultOverlayProcessor::GetStrategyCount() {
9723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return strategies_.size();
9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class OverlayOutputSurface : public OutputSurface {
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  explicit OverlayOutputSurface(scoped_refptr<ContextProvider> context_provider)
10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      : OutputSurface(context_provider) {}
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  void InitWithSingleOverlayValidator() {
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    overlay_candidate_validator_.reset(new SingleOverlayValidator);
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)scoped_ptr<RenderPass> CreateRenderPass() {
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 0);
11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  gfx::Rect output_rect(0, 0, 256, 256);
11323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool has_transparent_background = true;
11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = RenderPass::Create();
11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass->SetAll(id,
11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)               output_rect,
11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)               output_rect,
11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)               gfx::Transform(),
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               has_transparent_background);
12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
12323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  shared_state->opacity = 1.f;
12423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return pass.Pass();
12523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
12623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
127effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochResourceProvider::ResourceId CreateResource(
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ResourceProvider* resource_provider) {
12923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  unsigned sync_point = 0;
13023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  TextureMailbox mailbox =
13123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point);
13223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  mailbox.set_allow_overlay(true);
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<SingleReleaseCallbackImpl> release_callback =
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased));
13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return resource_provider->CreateResourceFromTextureMailbox(
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      mailbox, release_callback.Pass());
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TextureDrawQuad* CreateCandidateQuadAt(ResourceProvider* resource_provider,
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                       const SharedQuadState* shared_quad_state,
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                       RenderPass* render_pass,
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                       const gfx::Rect& rect) {
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResourceProvider::ResourceId resource_id = CreateResource(resource_provider);
14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool premultiplied_alpha = false;
14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool flipped = false;
14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TextureDrawQuad* overlay_quad =
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>();
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  overlay_quad->SetNew(shared_quad_state,
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       rect,
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       rect,
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                       rect,
15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       resource_id,
15623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       premultiplied_alpha,
15723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       kUVTopLeft,
15823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       kUVBottomRight,
15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       SK_ColorTRANSPARENT,
16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       vertex_opacity,
16123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       flipped);
16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return overlay_quad;
16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
16523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TextureDrawQuad* CreateFullscreenCandidateQuad(
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ResourceProvider* resource_provider,
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const SharedQuadState* shared_quad_state,
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    RenderPass* render_pass) {
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return CreateCandidateQuadAt(
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      resource_provider, shared_quad_state, render_pass, kOverlayRect);
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void CreateCheckeredQuadAt(ResourceProvider* resource_provider,
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           const SharedQuadState* shared_quad_state,
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           RenderPass* render_pass,
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                           const gfx::Rect& rect) {
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckerboardDrawQuad* checkerboard_quad =
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      render_pass->CreateAndAppendDrawQuad<CheckerboardDrawQuad>();
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  checkerboard_quad->SetNew(shared_quad_state, rect, rect, SkColor());
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void CreateFullscreenCheckeredQuad(ResourceProvider* resource_provider,
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                   const SharedQuadState* shared_quad_state,
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                   RenderPass* render_pass) {
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateCheckeredQuadAt(
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      resource_provider, shared_quad_state, render_pass, kOverlayRect);
18823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
18923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)static void CompareRenderPassLists(const RenderPassList& expected_list,
19123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                   const RenderPassList& actual_list) {
19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(expected_list.size(), actual_list.size());
19323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (size_t i = 0; i < actual_list.size(); ++i) {
19423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    RenderPass* expected = expected_list[i];
19523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    RenderPass* actual = actual_list[i];
19623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(expected->id, actual->id);
19823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_RECT_EQ(expected->output_rect, actual->output_rect);
19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(expected->transform_to_root_target,
20023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)              actual->transform_to_root_target);
20123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_RECT_EQ(expected->damage_rect, actual->damage_rect);
20223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(expected->has_transparent_background,
20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)              actual->has_transparent_background);
20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
20523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(expected->shared_quad_state_list.size(),
20623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)              actual->shared_quad_state_list.size());
20723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_EQ(expected->quad_list.size(), actual->quad_list.size());
20823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (QuadList::Iterator exp_iter = expected->quad_list.begin(),
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            act_iter = actual->quad_list.begin();
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         exp_iter != expected->quad_list.end();
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++exp_iter, ++act_iter) {
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(exp_iter->rect.ToString(), act_iter->rect.ToString());
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(exp_iter->shared_quad_state->content_bounds.ToString(),
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                act_iter->shared_quad_state->content_bounds.ToString());
21623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    }
21723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
21823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
21923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST(OverlayTest, NoOverlaysByDefault) {
22123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
22223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  OverlayOutputSurface output_surface(provider);
22323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_EQ(NULL, output_surface.overlay_candidate_validator());
22423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  output_surface.InitWithSingleOverlayValidator();
22623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(output_surface.overlay_candidate_validator() != NULL);
22723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
22823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST(OverlayTest, OverlaysProcessorHasStrategy) {
23023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
23123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  OverlayOutputSurface output_surface(provider);
23223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeOutputSurfaceClient client;
23323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(output_surface.BindToClient(&client));
23423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  output_surface.InitWithSingleOverlayValidator();
23523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_TRUE(output_surface.overlay_candidate_validator() != NULL);
23623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
237e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
238e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      new TestSharedBitmapManager());
239e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<ResourceProvider> resource_provider(ResourceProvider::Create(
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &output_surface, shared_bitmap_manager.get(), NULL, 0, false, 1, false));
24123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
24223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<DefaultOverlayProcessor> overlay_processor(
24323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new DefaultOverlayProcessor(&output_surface, resource_provider.get()));
24423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  overlay_processor->Initialize();
24523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  EXPECT_GE(1U, overlay_processor->GetStrategyCount());
24623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
24723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
24823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class SingleOverlayOnTopTest : public testing::Test {
24923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) protected:
25023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void SetUp() {
25123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    provider_ = TestContextProvider::Create();
25223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    output_surface_.reset(new OverlayOutputSurface(provider_));
25323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(output_surface_->BindToClient(&client_));
25423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    output_surface_->InitWithSingleOverlayValidator();
25523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    EXPECT_TRUE(output_surface_->overlay_candidate_validator() != NULL);
25623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
257e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    shared_bitmap_manager_.reset(new TestSharedBitmapManager());
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    resource_provider_ = ResourceProvider::Create(output_surface_.get(),
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  shared_bitmap_manager_.get(),
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  NULL,
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  0,
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false,
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  1,
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false);
26523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
26623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    overlay_processor_.reset(new SingleOverlayProcessor(
26723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        output_surface_.get(), resource_provider_.get()));
26823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    overlay_processor_->Initialize();
26923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  }
27023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
27123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_refptr<TestContextProvider> provider_;
27223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<OverlayOutputSurface> output_surface_;
27323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FakeOutputSurfaceClient client_;
274e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
27523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<ResourceProvider> resource_provider_;
27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SingleOverlayProcessor> overlay_processor_;
27723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
27823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
27923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, SuccessfullOverlay) {
28023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TextureDrawQuad* original_quad =
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      CreateFullscreenCandidateQuad(resource_provider_.get(),
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    pass->shared_quad_state_list.back(),
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    pass.get());
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  unsigned original_resource_id = original_quad->resource_id;
28623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
28723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Add something behind it.
2886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
2896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
2916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
2926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
2936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
29423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
29523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
29623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
29723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
29823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Check for potential candidates.
299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
30123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(1U, pass_list.size());
303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(2U, candidate_list.size());
30423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
30523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPass* main_pass = pass_list.back();
306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Check that the quad is gone.
307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(2U, main_pass->quad_list.size());
308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const QuadList& quad_list = main_pass->quad_list;
309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (QuadList::ConstBackToFrontIterator it = quad_list.BackToFrontBegin();
310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       it != quad_list.BackToFrontEnd();
311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch       ++it) {
3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_NE(DrawQuad::TEXTURE_CONTENT, it->material);
313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Check that the right resource id got extracted.
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(original_resource_id, candidate_list.back().resource_id);
31723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
31823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
31923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, NoCandidates) {
32023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
3236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
3246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
3256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
3266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
32723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
32823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
32923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
33023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
33123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList original_pass_list;
33223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPass::CopyAll(pass_list, &original_pass_list);
33323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0U, candidate_list.size());
33723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // There should be nothing new here.
33823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CompareRenderPassLists(pass_list, original_pass_list);
33923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
34023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
34123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, OccludedCandidates) {
34223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
34923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCandidateQuad(resource_provider_.get(),
3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
3526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
35323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
35423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
35523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
35623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
35723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList original_pass_list;
35823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPass::CopyAll(pass_list, &original_pass_list);
35923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0U, candidate_list.size());
36323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // There should be nothing new here.
36423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CompareRenderPassLists(pass_list, original_pass_list);
36523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
36623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
36723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Test with multiple render passes.
36823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, MultipleRenderPasses) {
36923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
37023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(CreateRenderPass());
37123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
37223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCandidateQuad(resource_provider_.get(),
3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
37623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
37723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Add something behind it.
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
3806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
3816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
38423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
38523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
38623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderPassList original_pass_list;
388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderPass::CopyAll(pass_list, &original_pass_list);
389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
39023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Check for potential candidates.
391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(2U, candidate_list.size());
39423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // This should be the same.
396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_EQ(2U, pass_list.size());
39723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
39823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
39923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, RejectPremultipliedAlpha) {
40023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TextureDrawQuad* quad =
4026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      CreateFullscreenCandidateQuad(resource_provider_.get(),
4036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    pass->shared_quad_state_list.back(),
4046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    pass.get());
40523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  quad->premultiplied_alpha = true;
40623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
40723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
40823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(1U, pass_list.size());
412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0U, candidate_list.size());
41323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
41423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
41523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, RejectBlending) {
41623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TextureDrawQuad* quad =
4186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      CreateFullscreenCandidateQuad(resource_provider_.get(),
4196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    pass->shared_quad_state_list.back(),
4206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    pass.get());
42123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  quad->needs_blending = true;
42223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
42323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
42423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
42723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ(1U, pass_list.size());
428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0U, candidate_list.size());
42923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
43023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
43123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, RejectBackgroundColor) {
43223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TextureDrawQuad* quad =
4346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      CreateFullscreenCandidateQuad(resource_provider_.get(),
4356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    pass->shared_quad_state_list.back(),
4366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                    pass.get());
43723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  quad->background_color = SK_ColorBLACK;
43823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
43923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
44023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
44323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ(1U, pass_list.size());
444effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0U, candidate_list.size());
44523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
44623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
44723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, RejectBlendMode) {
44823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
4496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCandidateQuad(resource_provider_.get(),
4506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
4516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
45223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass->shared_quad_state_list.back()->blend_mode = SkXfermode::kScreen_Mode;
45323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
45423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
45523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
456effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
45823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ(1U, pass_list.size());
459effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0U, candidate_list.size());
46023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
46123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
46223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, RejectOpacity) {
46323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
4646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCandidateQuad(resource_provider_.get(),
4656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
4666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
46723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass->shared_quad_state_list.back()->opacity = 0.5f;
46823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
46923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
47023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
471effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
472effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
47323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ(1U, pass_list.size());
474effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0U, candidate_list.size());
47523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
47623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
47723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)TEST_F(SingleOverlayOnTopTest, RejectTransform) {
47823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
4796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCandidateQuad(resource_provider_.get(),
4806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
4816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
48223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass->shared_quad_state_list.back()->content_to_target_transform.Scale(2.f,
48323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                                                         2.f);
48423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
48523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  RenderPassList pass_list;
48623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pass_list.push_back(pass.Pass());
487effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidateList candidate_list;
488effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
48923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ASSERT_EQ(1U, pass_list.size());
490effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_EQ(0U, candidate_list.size());
491effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
492effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
4936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(SingleOverlayOnTopTest, AllowNotTopIfNotOccluded) {
4946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  scoped_ptr<RenderPass> pass = CreateRenderPass();
4956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateCheckeredQuadAt(resource_provider_.get(),
4966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        pass->shared_quad_state_list.back(),
4976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        pass.get(),
4986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        kOverlayTopLeftRect);
4996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateCandidateQuadAt(resource_provider_.get(),
5006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        pass->shared_quad_state_list.back(),
5016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        pass.get(),
5026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        kOverlayBottomRightRect);
5036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RenderPassList pass_list;
5056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  pass_list.push_back(pass.Pass());
5066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RenderPassList original_pass_list;
5086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RenderPass::CopyAll(pass_list, &original_pass_list);
5096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  OverlayCandidateList candidate_list;
5116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  overlay_processor_->ProcessForOverlays(&pass_list, &candidate_list);
5126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(1U, pass_list.size());
5136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(2U, candidate_list.size());
5146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
5156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
516effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass OverlayInfoRendererGL : public GLRenderer {
517effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
518effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayInfoRendererGL(RendererClient* client,
519effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        const LayerTreeSettings* settings,
520effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        OutputSurface* output_surface,
521effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        ResourceProvider* resource_provider)
522effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      : GLRenderer(client,
523effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   settings,
524effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   output_surface,
525effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   resource_provider,
526effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   NULL,
527effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   0),
528effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        expect_overlays_(false) {}
529effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
530effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD2(DoDrawQuad, void(DrawingFrame* frame, const DrawQuad* quad));
531effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
532effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void FinishDrawingFrame(DrawingFrame* frame) OVERRIDE {
533effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    GLRenderer::FinishDrawingFrame(frame);
534effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
535effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (!expect_overlays_) {
536effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      EXPECT_EQ(0U, frame->overlay_list.size());
537effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return;
538effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    ASSERT_EQ(2U, frame->overlay_list.size());
541effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_NE(0U, frame->overlay_list.back().resource_id);
542effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
543effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
544effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_expect_overlays(bool expect_overlays) {
545effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    expect_overlays_ = expect_overlays;
546effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
547effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
548effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
549effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool expect_overlays_;
550effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
551effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
552effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass FakeRendererClient : public RendererClient {
553effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
554effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // RendererClient methods.
555effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void SetFullRootLayerDamage() OVERRIDE {}
556effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
557effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
558effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass MockOverlayScheduler {
559effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
560effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD5(Schedule,
561effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               void(int plane_z_order,
562c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    gfx::OverlayTransform plane_transform,
563effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    unsigned overlay_texture_id,
564effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    const gfx::Rect& display_bounds,
565effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    const gfx::RectF& uv_rect));
566effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
567effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
568effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass GLRendererWithOverlaysTest : public testing::Test {
569effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protected:
570effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  GLRendererWithOverlaysTest() {
571effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    provider_ = TestContextProvider::Create();
572effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    output_surface_.reset(new OverlayOutputSurface(provider_));
573effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    CHECK(output_surface_->BindToClient(&output_surface_client_));
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    resource_provider_ = ResourceProvider::Create(
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        output_surface_.get(), NULL, NULL, 0, false, 1, false);
576effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
577effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    provider_->support()->SetScheduleOverlayPlaneCallback(base::Bind(
578effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        &MockOverlayScheduler::Schedule, base::Unretained(&scheduler_)));
579effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
580effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
581effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void Init(bool use_validator) {
582effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (use_validator)
583effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      output_surface_->InitWithSingleOverlayValidator();
584effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
585effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    renderer_ =
586effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        make_scoped_ptr(new OverlayInfoRendererGL(&renderer_client_,
587effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                  &settings_,
588effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                  output_surface_.get(),
589effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                  resource_provider_.get()));
590effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
591effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
592effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void SwapBuffers() { renderer_->SwapBuffers(CompositorFrameMetadata()); }
593effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
594effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  LayerTreeSettings settings_;
595effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FakeOutputSurfaceClient output_surface_client_;
596effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<OverlayOutputSurface> output_surface_;
597effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FakeRendererClient renderer_client_;
598effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<ResourceProvider> resource_provider_;
599effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<OverlayInfoRendererGL> renderer_;
600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<TestContextProvider> provider_;
601effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MockOverlayScheduler scheduler_;
602effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
603effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
604effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(GLRendererWithOverlaysTest, OverlayQuadNotDrawn) {
605effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool use_validator = true;
606effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Init(use_validator);
607effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->set_expect_overlays(true);
608effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Rect viewport_rect(16, 16);
609effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
610effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<RenderPass> pass = CreateRenderPass();
611effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCandidateQuad(resource_provider_.get(),
6136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
6146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
615effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
6176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
6186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
6196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
6206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
6216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
622effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
623effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderPassList pass_list;
624effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  pass_list.push_back(pass.Pass());
625effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
626effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Candidate pass was taken out and extra skipped pass added,
627effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // so only draw 2 quads.
628effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(2);
629effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_,
630effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              Schedule(1,
631c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                       gfx::OVERLAY_TRANSFORM_NONE,
632effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       _,
633effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       kOverlayRect,
634effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       BoundingRect(kUVTopLeft, kUVBottomRight))).Times(1);
6355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false);
636effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
637effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
638effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
639effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(renderer_.get());
640effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
641effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
642effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
643effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(GLRendererWithOverlaysTest, OccludedQuadDrawn) {
644effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool use_validator = true;
645effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Init(use_validator);
646effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->set_expect_overlays(false);
647effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Rect viewport_rect(16, 16);
648effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
649effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<RenderPass> pass = CreateRenderPass();
650effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
6526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
6536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
6546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
6556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
6566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
657effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCandidateQuad(resource_provider_.get(),
6596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
6606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
661effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
662effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderPassList pass_list;
663effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  pass_list.push_back(pass.Pass());
664effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
665effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // 3 quads in the pass, all should draw.
666effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3);
667effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
6685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false);
669effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
670effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
671effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
672effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(renderer_.get());
673effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
674effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
675effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
676effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(GLRendererWithOverlaysTest, NoValidatorNoOverlay) {
677effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool use_validator = false;
678effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Init(use_validator);
679effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->set_expect_overlays(false);
680effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  gfx::Rect viewport_rect(16, 16);
681effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
682effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<RenderPass> pass = CreateRenderPass();
683effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCandidateQuad(resource_provider_.get(),
6856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
6866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
687effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
6886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
6896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
6906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
6916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CreateFullscreenCheckeredQuad(resource_provider_.get(),
6926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass->shared_quad_state_list.back(),
6936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                pass.get());
694effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
695effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RenderPassList pass_list;
696effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  pass_list.push_back(pass.Pass());
697effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
698effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Should see no overlays.
699effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*renderer_, DoDrawQuad(_, _)).Times(3);
700effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
7015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  renderer_->DrawFrame(&pass_list, 1.f, viewport_rect, viewport_rect, false);
702effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
703effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
704effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
705effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(renderer_.get());
706effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
707effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
708effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
709effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(GLRendererWithOverlaysTest, ResourcesExportedAndReturned) {
710effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool use_validator = true;
711effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Init(use_validator);
712effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->set_expect_overlays(true);
713effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
714effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResourceProvider::ResourceId resource1 =
715effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      CreateResource(resource_provider_.get());
716effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResourceProvider::ResourceId resource2 =
717effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      CreateResource(resource_provider_.get());
718effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
719effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DirectRenderer::DrawingFrame frame1;
720effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  frame1.overlay_list.resize(2);
721effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidate& overlay1 = frame1.overlay_list.back();
722effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay1.resource_id = resource1;
723effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay1.plane_z_order = 1;
724effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
725effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DirectRenderer::DrawingFrame frame2;
726effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  frame2.overlay_list.resize(2);
727effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  OverlayCandidate& overlay2 = frame2.overlay_list.back();
728effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay2.resource_id = resource2;
729effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  overlay2.plane_z_order = 1;
730effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
731effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
732effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->FinishDrawingFrame(&frame1);
733effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
734effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(resource_provider_->InUseByConsumer(resource2));
735effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
736effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
737effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
738effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
739effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->FinishDrawingFrame(&frame2);
740effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
741effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource2));
742effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
743effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
744effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
745effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
746effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
747effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->FinishDrawingFrame(&frame1);
748effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
749effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource2));
750effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
751effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(resource_provider_->InUseByConsumer(resource2));
752effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
753effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
754effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // No overlays, release the resource.
755effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
756effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DirectRenderer::DrawingFrame frame3;
757effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->set_expect_overlays(false);
758effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->FinishDrawingFrame(&frame3);
759effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
760effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(resource_provider_->InUseByConsumer(resource2));
761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
763effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
764effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
765effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Use the same buffer twice.
766effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->set_expect_overlays(true);
767effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
768effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->FinishDrawingFrame(&frame1);
769effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
770effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
771effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
772effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
773effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(1);
774effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->FinishDrawingFrame(&frame1);
775effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
776effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
777effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
778effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
779effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
780effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(scheduler_, Schedule(_, _, _, _, _)).Times(0);
781effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->set_expect_overlays(false);
782effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  renderer_->FinishDrawingFrame(&frame3);
783effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(resource_provider_->InUseByConsumer(resource1));
784effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  SwapBuffers();
785effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_FALSE(resource_provider_->InUseByConsumer(resource1));
786effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Mock::VerifyAndClearExpectations(&scheduler_);
78723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
78823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
78923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace
79023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace cc
791