15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file.
4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_OUTPUT_SURFACE_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_OUTPUT_SURFACE_H_
7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "base/id_map.h"
9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/threading/non_thread_safe.h"
10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "cc/output/output_surface.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/common/content_export.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/compositor/compositor_vsync_manager.h"
13558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace cc {
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SoftwareOutputDevice;
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace content {
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ContextProviderCommandBuffer;
20558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass ReflectorImpl;
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class WebGraphicsContext3DCommandBufferImpl;
22558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class CONTENT_EXPORT BrowserCompositorOutputSurface
24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    : public cc::OutputSurface,
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      public ui::CompositorVSyncManager::Observer,
26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      public base::NonThreadSafe {
27558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public:
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual ~BrowserCompositorOutputSurface();
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // cc::OutputSurface implementation.
31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  virtual bool BindToClient(cc::OutputSurfaceClient* client) OVERRIDE;
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void OnSwapBuffersComplete() OVERRIDE;
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ui::CompositorOutputSurface::Observer implementation.
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnUpdateVSyncParameters(base::TimeTicks timebase,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       base::TimeDelta interval) OVERRIDE;
37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnUpdateVSyncParametersFromGpu(base::TimeTicks tiembase,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      base::TimeDelta interval);
40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  void SetReflector(ReflectorImpl* reflector);
42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_MACOSX)
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSurfaceDisplayed();
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected:
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Constructor used by the accelerated implementation.
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserCompositorOutputSurface(
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const scoped_refptr<ContextProviderCommandBuffer>& context,
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      int surface_id,
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      IDMap<BrowserCompositorOutputSurface>* output_surface_map,
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager);
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Constructor used by the software implementation.
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  BrowserCompositorOutputSurface(
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<cc::SoftwareOutputDevice> software_device,
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      int surface_id,
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      IDMap<BrowserCompositorOutputSurface>* output_surface_map,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager);
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
62558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  int surface_id_;
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  IDMap<BrowserCompositorOutputSurface>* output_surface_map_;
64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<ui::CompositorVSyncManager> vsync_manager_;
66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  scoped_refptr<ReflectorImpl> reflector_;
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Initialize();
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserCompositorOutputSurface);
72558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch};
73558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace content
75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // CONTENT_BROWSER_COMPOSITOR_BROWSER_COMPOSITOR_OUTPUT_SURFACE_H_
77