• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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_GL_GL_SURFACE_GLX_H_
6 #define UI_GL_GL_SURFACE_GLX_H_
7 
8 #include <string>
9 
10 #include "base/compiler_specific.h"
11 #include "ui/events/platform/platform_event_dispatcher.h"
12 #include "ui/gfx/native_widget_types.h"
13 #include "ui/gfx/size.h"
14 #include "ui/gfx/vsync_provider.h"
15 #include "ui/gfx/x/x11_types.h"
16 #include "ui/gl/gl_export.h"
17 #include "ui/gl/gl_surface.h"
18 
19 namespace gfx {
20 
21 // Base class for GLX surfaces.
22 class GL_EXPORT GLSurfaceGLX : public GLSurface {
23  public:
24   GLSurfaceGLX();
25 
26   static bool InitializeOneOff();
27 
28   // These aren't particularly tied to surfaces, but since we already
29   // have the static InitializeOneOff here, it's easiest to reuse its
30   // initialization guards.
31   static const char* GetGLXExtensions();
32   static bool HasGLXExtension(const char* name);
33   static bool IsCreateContextSupported();
34   static bool IsCreateContextRobustnessSupported();
35   static bool IsTextureFromPixmapSupported();
36   static bool IsOMLSyncControlSupported();
37 
38   virtual void* GetDisplay() OVERRIDE;
39 
40   // Get the FB config that the surface was created with or NULL if it is not
41   // a GLX drawable.
42   virtual void* GetConfig() = 0;
43 
44  protected:
45   virtual ~GLSurfaceGLX();
46 
47  private:
48   DISALLOW_COPY_AND_ASSIGN(GLSurfaceGLX);
49 };
50 
51 // A surface used to render to a view.
52 class GL_EXPORT NativeViewGLSurfaceGLX : public GLSurfaceGLX,
53                                          public ui::PlatformEventDispatcher {
54  public:
55   explicit NativeViewGLSurfaceGLX(gfx::AcceleratedWidget window);
56 
57   // Implement GLSurfaceGLX.
58   virtual bool Initialize() OVERRIDE;
59   virtual void Destroy() OVERRIDE;
60   virtual bool Resize(const gfx::Size& size) OVERRIDE;
61   virtual bool IsOffscreen() OVERRIDE;
62   virtual bool SwapBuffers() OVERRIDE;
63   virtual gfx::Size GetSize() OVERRIDE;
64   virtual void* GetHandle() OVERRIDE;
65   virtual bool SupportsPostSubBuffer() OVERRIDE;
66   virtual void* GetConfig() OVERRIDE;
67   virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE;
68   virtual VSyncProvider* GetVSyncProvider() OVERRIDE;
69 
70  protected:
71   virtual ~NativeViewGLSurfaceGLX();
72 
73  private:
74   // The handle for the drawable to make current or swap.
75   gfx::AcceleratedWidget GetDrawableHandle() const;
76 
77   // PlatformEventDispatcher implementation
78   virtual bool CanDispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
79   virtual uint32_t DispatchEvent(const ui::PlatformEvent& event) OVERRIDE;
80 
81   // Window passed in at creation. Always valid.
82   gfx::AcceleratedWidget parent_window_;
83 
84   // Child window, used to control resizes so that they're in-order with GL.
85   gfx::AcceleratedWidget window_;
86 
87   void* config_;
88   gfx::Size size_;
89 
90   scoped_ptr<VSyncProvider> vsync_provider_;
91 
92   DISALLOW_COPY_AND_ASSIGN(NativeViewGLSurfaceGLX);
93 };
94 
95 // A surface used to render to an offscreen pbuffer.
96 class GL_EXPORT PbufferGLSurfaceGLX : public GLSurfaceGLX {
97  public:
98   explicit PbufferGLSurfaceGLX(const gfx::Size& size);
99 
100   // Implement GLSurfaceGLX.
101   virtual bool Initialize() OVERRIDE;
102   virtual void Destroy() OVERRIDE;
103   virtual bool IsOffscreen() OVERRIDE;
104   virtual bool SwapBuffers() OVERRIDE;
105   virtual gfx::Size GetSize() OVERRIDE;
106   virtual void* GetHandle() OVERRIDE;
107   virtual void* GetConfig() OVERRIDE;
108 
109  protected:
110   virtual ~PbufferGLSurfaceGLX();
111 
112  private:
113   gfx::Size size_;
114   void* config_;
115   XID pbuffer_;
116 
117   DISALLOW_COPY_AND_ASSIGN(PbufferGLSurfaceGLX);
118 };
119 
120 }  // namespace gfx
121 
122 #endif  // UI_GL_GL_SURFACE_GLX_H_
123