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