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