• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef UI_GFX_OZONE_SURFACE_LNUX_FACTORY_OZONE_H_
6 #define UI_GFX_OZONE_SURFACE_LNUX_FACTORY_OZONE_H_
7 
8 #include "base/callback.h"
9 #include "base/native_library.h"
10 #include "ui/gfx/gfx_export.h"
11 #include "ui/gfx/native_widget_types.h"
12 #include "ui/gfx/rect.h"
13 
14 class SkCanvas;
15 
16 namespace gfx {
17 class Screen;
18 class VSyncProvider;
19 
20 // The Ozone interface allows external implementations to hook into Chromium to
21 // provide a system specific implementation. The Ozone interface supports two
22 // drawing modes: 1) accelerated drawing through EGL and 2) software drawing
23 // through Skia.
24 //
25 // The following functionality is specific to the drawing mode and may not have
26 // any meaningful implementation in the other mode. An implementation must
27 // provide functionality for at least one mode.
28 //
29 // 1) Accelerated Drawing (EGL path):
30 //
31 // The following functions are specific to EGL:
32 //  - GetNativeDisplay
33 //  - LoadEGLGLES2Bindings
34 //  - GetEGLSurfaceProperties (optional if the properties match the default
35 //  Chromium ones).
36 //
37 // 2) Software Drawing (Skia):
38 //
39 // The following function is specific to the software path:
40 //  - GetCanvasForWidget
41 //
42 // The accelerated path can optionally provide support for the software drawing
43 // path.
44 //
45 // The remaining functions are not covered since they are needed in both drawing
46 // modes (See comments bellow for descriptions).
47 class GFX_EXPORT SurfaceFactoryOzone {
48  public:
49   // Describes the state of the hardware after initialization.
50   enum HardwareState {
51     UNINITIALIZED,
52     INITIALIZED,
53     FAILED,
54   };
55 
56   typedef void*(*GLGetProcAddressProc)(const char* name);
57   typedef base::Callback<void(base::NativeLibrary)> AddGLLibraryCallback;
58   typedef base::Callback<void(GLGetProcAddressProc)>
59       SetGLGetProcAddressProcCallback;
60 
61   SurfaceFactoryOzone();
62   virtual ~SurfaceFactoryOzone();
63 
64   // Returns the instance
65   static SurfaceFactoryOzone* GetInstance();
66 
67   // Returns a display spec as in |CreateDisplayFromSpec| for the default
68   // native surface.
69   virtual const char* DefaultDisplaySpec();
70 
71   // Sets the implementation delegate. Ownership is retained by the caller.
72   static void SetInstance(SurfaceFactoryOzone* impl);
73 
74   // TODO(rjkroege): decide how to separate screen/display stuff from SFOz
75   // This method implements gfx::Screen, particularly useful in Desktop Aura.
76   virtual gfx::Screen* CreateDesktopScreen();
77 
78   // Configures the display hardware. Must be called from within the GPU
79   // process before the sandbox has been activated.
80   virtual HardwareState InitializeHardware() = 0;
81 
82   // Cleans up display hardware state. Call this from within the GPU process.
83   // This method must be safe to run inside of the sandbox.
84   virtual void ShutdownHardware() = 0;
85 
86   // Returns native platform display handle. This is used to obtain the EGL
87   // display connection for the native display.
88   virtual intptr_t GetNativeDisplay();
89 
90   // Obtains an AcceleratedWidget backed by a native Linux framebuffer.
91   // The  returned AcceleratedWidget is an opaque token that must realized
92   // before it can be used to create a GL surface.
93   virtual gfx::AcceleratedWidget GetAcceleratedWidget() = 0;
94 
95   // Realizes an AcceleratedWidget so that the returned AcceleratedWidget
96   // can be used to to create a GLSurface. This method may only be called in
97   // a process that has a valid GL context.
98   virtual gfx::AcceleratedWidget RealizeAcceleratedWidget(
99       gfx::AcceleratedWidget w) = 0;
100 
101   // Sets up GL bindings for the native surface. Takes two callback parameters
102   // that allow Ozone to register the GL bindings.
103   virtual bool LoadEGLGLES2Bindings(
104       AddGLLibraryCallback add_gl_library,
105       SetGLGetProcAddressProcCallback set_gl_get_proc_address) = 0;
106 
107   // If possible attempts to resize the given AcceleratedWidget instance and if
108   // a resize action was performed returns true, otherwise false (native
109   // hardware may only support a single fixed size).
110   virtual bool AttemptToResizeAcceleratedWidget(
111       gfx::AcceleratedWidget w,
112       const gfx::Rect& bounds) = 0;
113 
114   // Called after the appropriate GL swap buffers command. Used if extra work
115   // is needed to perform the actual buffer swap.
116   virtual bool SchedulePageFlip(gfx::AcceleratedWidget w);
117 
118   // Returns a SkCanvas for the backing buffers. Drawing to the canvas will draw
119   // to the native surface. The canvas is intended for use when no EGL
120   // acceleration is possible. Its implementation is optional when an EGL
121   // backend is provided for rendering.
122   virtual SkCanvas* GetCanvasForWidget(gfx::AcceleratedWidget w);
123 
124   // Returns a gfx::VsyncProvider for the provided AcceleratedWidget. Note
125   // that this may be called after we have entered the sandbox so if there are
126   // operations (e.g. opening a file descriptor providing vsync events) that
127   // must be done outside of the sandbox, they must have been completed
128   // in InitializeHardware. Returns NULL on error.
129   virtual gfx::VSyncProvider* GetVSyncProvider(gfx::AcceleratedWidget w) = 0;
130 
131   // Returns an array of EGL properties, which can be used in any EGL function
132   // used to select a display configuration. Note that all properties should be
133   // immediately followed by the corresponding desired value and array should be
134   // terminated with EGL_NONE. Ownership of the array is not transferred to
135   // caller. desired_list contains list of desired EGL properties and values.
136   virtual const int32* GetEGLSurfaceProperties(const int32* desired_list);
137 
138   // Create a default SufaceFactoryOzone implementation useful for tests.
139   static SurfaceFactoryOzone* CreateTestHelper();
140 
141  private:
142   static SurfaceFactoryOzone* impl_; // not owned
143 };
144 
145 }  // namespace gfx
146 
147 #endif  // UI_GFX_OZONE_SURFACE_LNUX_FACTORY_OZONE_H_
148