Chromium Code Reviews| Index: ui/gl/gl_surface_x11.cc |
| diff --git a/ui/gl/gl_surface_x11.cc b/ui/gl/gl_surface_x11.cc |
| index 4e36e2ee86e3a2a22cdf703b907390e54d66c46b..96383806772ee9d8b27f220a0db486554b3b452c 100644 |
| --- a/ui/gl/gl_surface_x11.cc |
| +++ b/ui/gl/gl_surface_x11.cc |
| @@ -5,12 +5,15 @@ |
| #include "ui/gl/gl_surface.h" |
| #include <stdint.h> |
| +#include <X11/Xlib.h> |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop/message_loop.h" |
| #include "base/trace_event/trace_event.h" |
| +#include "ui/events/platform/platform_event_dispatcher.h" |
| +#include "ui/events/platform/platform_event_source.h" |
| #include "ui/gfx/native_widget_types.h" |
| #include "ui/gfx/x/x11_types.h" |
| #include "ui/gl/gl_bindings.h" |
| @@ -23,6 +26,8 @@ |
| namespace gfx { |
| +namespace { |
| + |
| // This OSMesa GL surface can use XLib to swap the contents of the buffer to a |
| // view. |
| class NativeViewGLSurfaceOSMesa : public GLSurfaceOSMesa { |
| @@ -55,33 +60,6 @@ class NativeViewGLSurfaceOSMesa : public GLSurfaceOSMesa { |
| DISALLOW_COPY_AND_ASSIGN(NativeViewGLSurfaceOSMesa); |
| }; |
| -bool GLSurface::InitializeOneOffInternal() { |
| - switch (GetGLImplementation()) { |
| - case kGLImplementationDesktopGL: |
| - if (!GLSurfaceGLX::InitializeOneOff()) { |
| - LOG(ERROR) << "GLSurfaceGLX::InitializeOneOff failed."; |
| - return false; |
| - } |
| - break; |
| - case kGLImplementationOSMesaGL: |
| - if (!NativeViewGLSurfaceOSMesa::InitializeOneOff()) { |
| - LOG(ERROR) << "NativeViewGLSurfaceOSMesa::InitializeOneOff failed."; |
| - return false; |
| - } |
| - break; |
| - case kGLImplementationEGLGLES2: |
| - if (!GLSurfaceEGL::InitializeOneOff()) { |
| - LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed."; |
| - return false; |
| - } |
| - break; |
| - default: |
| - break; |
| - } |
| - |
| - return true; |
| -} |
| - |
| NativeViewGLSurfaceOSMesa::NativeViewGLSurfaceOSMesa( |
| gfx::AcceleratedWidget window) |
| : GLSurfaceOSMesa(SURFACE_OSMESA_BGRA, gfx::Size(1, 1)), |
| @@ -267,6 +245,93 @@ NativeViewGLSurfaceOSMesa::~NativeViewGLSurfaceOSMesa() { |
| Destroy(); |
| } |
| +// Native X11 specific implementation of GLX surface. Registers as a |
| +// PlatformEventDispatcher to handle XEvents. |
| +class GL_EXPORT NativeViewGLSurfaceGLXX11 : public NativeViewGLSurfaceGLX, |
|
kylechar
2016/03/23 15:40:09
NativeViewGLSurfaceGLXX11 is a bit.. terrible?
|
| + public ui::PlatformEventDispatcher { |
| + public: |
| + explicit NativeViewGLSurfaceGLXX11(gfx::AcceleratedWidget window); |
| + |
| + // PlatformEventDispatcher implementation: |
| + bool CanDispatchEvent(const ui::PlatformEvent& event) override; |
| + uint32_t DispatchEvent(const ui::PlatformEvent& event) override; |
| + |
| + protected: |
| + ~NativeViewGLSurfaceGLXX11() override; |
| + |
| + // NativeViewGLSurfaceGLX implementation: |
| + void RegisterEvents() override; |
| + void UnregisterEvents() override; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(NativeViewGLSurfaceGLXX11); |
| +}; |
| + |
| +NativeViewGLSurfaceGLXX11::NativeViewGLSurfaceGLXX11( |
| + gfx::AcceleratedWidget window) |
| + : NativeViewGLSurfaceGLX(window) {} |
| + |
| +bool NativeViewGLSurfaceGLXX11::CanDispatchEvent( |
| + const ui::PlatformEvent& event) { |
| + return CanHandleEvent(event); |
| +} |
| + |
| +uint32_t NativeViewGLSurfaceGLXX11::DispatchEvent( |
| + const ui::PlatformEvent& event) { |
| + ForwardExposeEvent(event); |
| + return ui::POST_DISPATCH_STOP_PROPAGATION; |
| +} |
| + |
| +NativeViewGLSurfaceGLXX11::~NativeViewGLSurfaceGLXX11() { |
| + Destroy(); |
| +} |
| + |
| +void NativeViewGLSurfaceGLXX11::RegisterEvents() { |
| + ui::PlatformEventSource* event_source = |
| + ui::PlatformEventSource::GetInstance(); |
| + // Can be nullptr in tests, when we don't care about Exposes. |
| + if (event_source) { |
| + XSelectInput(gfx::GetXDisplay(), window(), ExposureMask); |
| + event_source->AddPlatformEventDispatcher(this); |
| + } |
| +} |
| + |
| +void NativeViewGLSurfaceGLXX11::UnregisterEvents() { |
| + ui::PlatformEventSource* event_source = |
| + ui::PlatformEventSource::GetInstance(); |
| + if (event_source) |
| + event_source->RemovePlatformEventDispatcher(this); |
| +} |
| + |
| +} // namespace |
| + |
| +bool GLSurface::InitializeOneOffInternal() { |
| + switch (GetGLImplementation()) { |
| + case kGLImplementationDesktopGL: |
| + if (!GLSurfaceGLX::InitializeOneOff()) { |
| + LOG(ERROR) << "GLSurfaceGLX::InitializeOneOff failed."; |
| + return false; |
| + } |
| + break; |
| + case kGLImplementationOSMesaGL: |
| + if (!NativeViewGLSurfaceOSMesa::InitializeOneOff()) { |
| + LOG(ERROR) << "NativeViewGLSurfaceOSMesa::InitializeOneOff failed."; |
| + return false; |
| + } |
| + break; |
| + case kGLImplementationEGLGLES2: |
| + if (!GLSurfaceEGL::InitializeOneOff()) { |
| + LOG(ERROR) << "GLSurfaceEGL::InitializeOneOff failed."; |
| + return false; |
| + } |
| + break; |
| + default: |
| + break; |
| + } |
| + |
| + return true; |
| +} |
| + |
| scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface( |
| gfx::AcceleratedWidget window) { |
| TRACE_EVENT0("gpu", "GLSurface::CreateViewGLSurface"); |
| @@ -280,7 +345,7 @@ scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface( |
| return surface; |
| } |
| case kGLImplementationDesktopGL: { |
| - scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceGLX(window)); |
| + scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceGLXX11(window)); |
| if (!surface->Initialize()) |
| return NULL; |