Bug 1460255 - Implement GLContextProviderWayland, r=lsalzman
authorMartin Stransky <stransky@redhat.com>
Tue, 15 May 2018 16:15:35 +0200
changeset 420227 446eb68ac1c3da3c49d3e14453fb48de03a11ab1
parent 420226 f605d6efe3476538613b0fcca7d2582c2a3606cc
child 420228 229a64156f7001ebd008634bc62694a21c53de07
push id64557
push userstransky@redhat.com
push dateTue, 29 May 2018 12:24:24 +0000
treeherderautoland@229a64156f70 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerslsalzman
bugs1460255
milestone62.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1460255 - Implement GLContextProviderWayland, r=lsalzman GLContextProviderWayland provides both GLX and EGL GL backends on Wayland enabled builds according to an active Gtk+ backend (X11/Wayland). MozReview-Commit-ID: TTBDwWMBAP
gfx/gl/GLContextProviderWayland.cpp
gfx/gl/moz.build
new file mode 100644
--- /dev/null
+++ b/gfx/gl/GLContextProviderWayland.cpp
@@ -0,0 +1,99 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifdef MOZ_WIDGET_GTK
+#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
+#endif
+
+#include "GLContextProvider.h"
+
+namespace mozilla {
+namespace gl {
+
+using namespace mozilla::gfx;
+using namespace mozilla::widget;
+
+static class GLContextProviderGLX sGLContextProviderGLX;
+static class GLContextProviderEGL sGLContextProviderEGL;
+
+already_AddRefed<GLContext>
+GLContextProviderWayland::CreateWrappingExisting(void* aContext, void* aSurface)
+{
+    if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
+        return sGLContextProviderGLX.CreateWrappingExisting(aContext, aSurface);
+    } else {
+        return sGLContextProviderEGL.CreateWrappingExisting(aContext, aSurface);
+    }
+}
+
+already_AddRefed<GLContext>
+GLContextProviderWayland::CreateForCompositorWidget(CompositorWidget* aCompositorWidget, bool aForceAccelerated)
+{
+    if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
+        return sGLContextProviderGLX.CreateForCompositorWidget(aCompositorWidget, aForceAccelerated);
+    } else {
+        return sGLContextProviderEGL.CreateForCompositorWidget(aCompositorWidget, aForceAccelerated);
+    }
+}
+
+already_AddRefed<GLContext>
+GLContextProviderWayland::CreateForWindow(nsIWidget* aWidget,
+                                      bool aWebRender,
+                                      bool aForceAccelerated)
+{
+    if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
+        return sGLContextProviderGLX.CreateForWindow(aWidget, aWebRender, aForceAccelerated);
+    } else {
+        return sGLContextProviderEGL.CreateForWindow(aWidget, aWebRender, aForceAccelerated);
+    }
+}
+
+/*static*/ already_AddRefed<GLContext>
+GLContextProviderWayland::CreateHeadless(CreateContextFlags flags,
+                                     nsACString* const out_failureId)
+{
+    if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
+        return sGLContextProviderGLX.CreateHeadless(flags, out_failureId);
+    } else {
+        return sGLContextProviderEGL.CreateHeadless(flags, out_failureId);
+    }
+}
+
+/*static*/ already_AddRefed<GLContext>
+GLContextProviderWayland::CreateOffscreen(const IntSize& size,
+                                      const SurfaceCaps& minCaps,
+                                      CreateContextFlags flags,
+                                      nsACString* const out_failureId)
+{
+    if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
+        return sGLContextProviderGLX.CreateOffscreen(size, minCaps, flags, out_failureId);
+    } else {
+        return sGLContextProviderEGL.CreateOffscreen(size, minCaps, flags, out_failureId);
+    }
+}
+
+/*static*/ GLContext*
+GLContextProviderWayland::GetGlobalContext()
+{
+    if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
+        return sGLContextProviderGLX.GetGlobalContext();
+    } else {
+        return sGLContextProviderEGL.GetGlobalContext();
+    }
+}
+
+/*static*/ void
+GLContextProviderWayland::Shutdown()
+{
+    if (GDK_IS_X11_DISPLAY(gdk_display_get_default())) {
+        sGLContextProviderGLX.Shutdown();
+    } else {
+        sGLContextProviderEGL.Shutdown();
+    }
+}
+
+} /* namespace gl */
+} /* namespace mozilla */
--- a/gfx/gl/moz.build
+++ b/gfx/gl/moz.build
@@ -8,17 +8,17 @@ gl_provider = 'Null'
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
     gl_provider = 'WGL'
 elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
     gl_provider = 'CGL'
 elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'uikit':
     gl_provider = 'EAGL'
 elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
-    if CONFIG['MOZ_EGL_XRENDER_COMPOSITE'] or CONFIG['MOZ_WAYLAND']:
+    if CONFIG['MOZ_EGL_XRENDER_COMPOSITE']:
         gl_provider = 'EGL'
     else:
         gl_provider = 'GLX'
 elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
     gl_provider = 'EGL'
 
 if CONFIG['MOZ_GL_PROVIDER']:
     gl_provider = CONFIG['MOZ_GL_PROVIDER']
@@ -114,16 +114,21 @@ elif gl_provider == 'GLX':
     SOURCES += [
         'GLContextProviderGLX.cpp',
         'SharedSurfaceGLX.cpp'
     ]
     EXPORTS += [
         'SharedSurfaceGLX.h'
     ]
 
+if CONFIG['MOZ_WAYLAND']:
+    SOURCES += [
+        'GLContextProviderWayland.cpp',
+    ]
+
 UNIFIED_SOURCES += [
     'AndroidSurfaceTexture.cpp',
     'DecomposeIntoNoRepeatTriangles.cpp',
     'EGLUtils.cpp',
     'GfxTexturesReporter.cpp',
     'GLBlitHelper.cpp',
     'GLContext.cpp',
     'GLContextFeatures.cpp',