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