Home | History | Annotate | Download | only in gl
      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