12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_TEST_FAKE_OUTPUT_SURFACE_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_TEST_FAKE_OUTPUT_SURFACE_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/callback.h" 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/logging.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/begin_frame_args.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "cc/output/managed_memory_policy.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/software_output_device.h" 160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_context_provider.h" 170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeOutputSurface : public OutputSurface { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~FakeOutputSurface(); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static scoped_ptr<FakeOutputSurface> Create3d() { 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return make_scoped_ptr(new FakeOutputSurface( 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestContextProvider::Create(), false)); 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<FakeOutputSurface> Create3d( 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_refptr<ContextProvider> context_provider) { 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return make_scoped_ptr(new FakeOutputSurface(context_provider, false)); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static scoped_ptr<FakeOutputSurface> Create3d( 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context) { 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return make_scoped_ptr(new FakeOutputSurface( 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestContextProvider::Create(context.Pass()), false)); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<FakeOutputSurface> CreateSoftware( 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SoftwareOutputDevice> software_device) { 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return make_scoped_ptr(new FakeOutputSurface(software_device.Pass(), 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) false)); 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static scoped_ptr<FakeOutputSurface> CreateDelegating3d() { 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return make_scoped_ptr(new FakeOutputSurface( 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestContextProvider::Create(), true)); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<FakeOutputSurface> CreateDelegating3d( 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<TestContextProvider> context_provider) { 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return make_scoped_ptr(new FakeOutputSurface(context_provider, true)); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static scoped_ptr<FakeOutputSurface> CreateDelegating3d( 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context) { 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return make_scoped_ptr(new FakeOutputSurface( 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) TestContextProvider::Create(context.Pass()), true)); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<FakeOutputSurface> CreateDelegatingSoftware( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SoftwareOutputDevice> software_device) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FakeOutputSurface(software_device.Pass(), true)); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static scoped_ptr<FakeOutputSurface> CreateDeferredGL( 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<SoftwareOutputDevice> software_device, 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool delegated_rendering) { 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<FakeOutputSurface> result( 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new FakeOutputSurface(software_device.Pass(), delegated_rendering)); 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) result->capabilities_.deferred_gl_initialization = true; 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return result.Pass(); 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 78fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch static scoped_ptr<FakeOutputSurface> CreateAlwaysDrawAndSwap3d() { 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<FakeOutputSurface> surface(Create3d()); 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) surface->capabilities_.draw_and_swap_full_viewport_every_frame = true; 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return surface.Pass(); 82fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch } 83fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static scoped_ptr<FakeOutputSurface> CreateOffscreen( 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<TestWebGraphicsContext3D> context) { 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<FakeOutputSurface> surface(new FakeOutputSurface( 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestContextProvider::Create(context.Pass()), false)); 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) surface->capabilities_.uses_default_gl_framebuffer = false; 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return surface.Pass(); 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompositorFrame& last_sent_frame() { return last_sent_frame_; } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t num_sent_frames() { return num_sent_frames_; } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 955e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) virtual void SwapBuffers(CompositorFrame* frame) OVERRIDE; 965e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void SetNeedsBeginFrame(bool enable) OVERRIDE; 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool needs_begin_frame() const { return needs_begin_frame_; } 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual bool BindToClient(OutputSurfaceClient* client) OVERRIDE; 101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch using OutputSurface::ReleaseGL; 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) using OutputSurface::InitializeAndSetContext3d; 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void SetTreeActivationCallback(const base::Closure& callback); 106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 107ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const TransferableResourceArray& resources_held_by_parent() { 108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return resources_held_by_parent_; 109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void ReturnResource(unsigned id, CompositorFrameAck* ack); 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual bool HasExternalStencilTest() const OVERRIDE; 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void set_has_external_stencil_test(bool has_test) { 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) has_external_stencil_test_ = has_test; 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void SetMemoryPolicyToSetAtBind( 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ManagedMemoryPolicy> memory_policy_to_set_at_bind); 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected: 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeOutputSurface( 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<ContextProvider> context_provider, 1255e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) bool delegated_rendering); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeOutputSurface( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SoftwareOutputDevice> software_device, 1295e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) bool delegated_rendering); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FakeOutputSurface( 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<ContextProvider> context_provider, 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<SoftwareOutputDevice> software_device, 1345e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) bool delegated_rendering); 135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void OnBeginFrame(); 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch OutputSurfaceClient* client_; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompositorFrame last_sent_frame_; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t num_sent_frames_; 141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool needs_begin_frame_; 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool has_external_stencil_test_; 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TransferableResourceArray resources_held_by_parent_; 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ManagedMemoryPolicy> memory_policy_to_set_at_bind_; 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::WeakPtrFactory<FakeOutputSurface> fake_weak_ptr_factory_; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_TEST_FAKE_OUTPUT_SURFACE_H_ 152