15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved. 25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be 35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file. 45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "cc/output/delegating_renderer.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "cc/output/gl_renderer.h" 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "cc/output/output_surface.h" 85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "cc/test/fake_output_surface_client.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "cc/test/fake_renderer_client.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "cc/test/test_context_provider.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "cc/test/test_web_graphics_context_3d.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "testing/gmock/include/gmock/gmock.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "testing/gtest/include/gtest/gtest.h" 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace cc { 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace { 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MockContextProvider : public TestContextProvider { 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu explicit MockContextProvider(scoped_ptr<TestWebGraphicsContext3D> context) 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : TestContextProvider(context.Pass()) {} 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MOCK_METHOD0(DeleteCachedResources, void()); 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu protected: 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ~MockContextProvider() {} 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutemplate <class T> 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<Renderer> CreateRenderer(RendererClient* client, 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const LayerTreeSettings* settings, 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OutputSurface* output_surface, 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ResourceProvider* resource_provider); 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutemplate <> 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<Renderer> CreateRenderer<DelegatingRenderer>( 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RendererClient* client, 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const LayerTreeSettings* settings, 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OutputSurface* output_surface, 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ResourceProvider* resource_provider) { 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return DelegatingRenderer::Create( 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu client, settings, output_surface, resource_provider) 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu .PassAs<Renderer>(); 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutemplate <> 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<Renderer> CreateRenderer<GLRenderer>( 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RendererClient* client, 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const LayerTreeSettings* settings, 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu OutputSurface* output_surface, 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ResourceProvider* resource_provider) { 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return GLRenderer::Create( 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu client, settings, output_surface, resource_provider, NULL, 0) 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu .PassAs<Renderer>(); 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutemplate <typename T> 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass RendererTest : public ::testing::Test { 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu protected: 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void SetUp() { 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu context_provider_ = 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu new MockContextProvider(TestWebGraphicsContext3D::Create()); 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu output_surface_.reset(new OutputSurface(context_provider_)); 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu output_surface_->BindToClient(&output_surface_client_); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_provider_ = ResourceProvider::Create( 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_.get(), NULL, NULL, 0, false, 1, false); 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu renderer_ = CreateRenderer<T>(&renderer_client_, 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu &tree_settings_, 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu output_surface_.get(), 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu resource_provider_.get()); 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FakeRendererClient renderer_client_; 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu LayerTreeSettings tree_settings_; 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu FakeOutputSurfaceClient output_surface_client_; 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_refptr<MockContextProvider> context_provider_; 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<OutputSurface> output_surface_; 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<ResourceProvider> resource_provider_; 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<Renderer> renderer_; 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutypedef ::testing::Types<DelegatingRenderer, GLRenderer> RendererTypes; 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTYPED_TEST_CASE(RendererTest, RendererTypes); 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTYPED_TEST(RendererTest, ContextPurgedWhenRendererBecomesInvisible) { 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*(this->context_provider_.get()), DeleteCachedResources()) 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Times(1); 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(this->renderer_->visible()); 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu this->renderer_->SetVisible(false); 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(this->renderer_->visible()); 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace cc 95