354e31f1f276c5ce60b5fd2eaac061ec87c35169
[WebKit-https.git] / Source / WebCore / platform / graphics / GLContext.h
1 /*
2  * Copyright (C) 2012 Igalia S.L.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Lesser General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public
15  *  License along with this library; if not, write to the Free
16  *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  *  Boston, MA 02110-1301 USA
18  */
19
20 #ifndef GLContext_h
21 #define GLContext_h
22
23 #include "GraphicsContext3D.h"
24 #include "PlatformDisplay.h"
25 #include <wtf/Noncopyable.h>
26
27 #if USE(EGL) && !PLATFORM(GTK)
28 #if PLATFORM(WPE)
29 // FIXME: For now default to the GBM EGL platform, but this should really be
30 // somehow deducible from the build configuration.
31 #define __GBM__ 1
32 #include <EGL/eglplatform.h>
33 #else
34 #include "eglplatform.h"
35 #endif // PLATFORM(WPE)
36 typedef EGLNativeWindowType GLNativeWindowType;
37 #else // !USE(EGL) || PLATFORM(GTK)
38 typedef uint64_t GLNativeWindowType;
39 #endif
40
41 #if USE(CAIRO)
42 typedef struct _cairo_device cairo_device_t;
43 #endif
44
45 namespace WebCore {
46
47 class GLContext {
48     WTF_MAKE_NONCOPYABLE(GLContext); WTF_MAKE_FAST_ALLOCATED;
49 public:
50     static std::unique_ptr<GLContext> createContextForWindow(GLNativeWindowType windowHandle, PlatformDisplay* = nullptr);
51     static std::unique_ptr<GLContext> createOffscreenContext(PlatformDisplay* = nullptr);
52     static std::unique_ptr<GLContext> createSharingContext(PlatformDisplay&);
53     static GLContext* current();
54     static bool isExtensionSupported(const char* extensionList, const char* extension);
55
56     PlatformDisplay& display() const { return m_display; }
57     unsigned version();
58
59     virtual ~GLContext();
60     virtual bool makeContextCurrent();
61     virtual void swapBuffers() = 0;
62     virtual void waitNative() = 0;
63     virtual bool canRenderToDefaultFramebuffer() = 0;
64     virtual IntSize defaultFrameBufferSize() = 0;
65     virtual void swapInterval(int) = 0;
66
67     virtual bool isEGLContext() const = 0;
68
69 #if USE(CAIRO)
70     virtual cairo_device_t* cairoDevice() = 0;
71 #endif
72
73 #if ENABLE(GRAPHICS_CONTEXT_3D)
74     virtual PlatformGraphicsContext3D platformContext() = 0;
75 #endif
76
77 #if PLATFORM(X11)
78 private:
79     static void addActiveContext(GLContext*);
80     static void removeActiveContext(GLContext*);
81     static void cleanupActiveContextsAtExit();
82 #endif
83
84 protected:
85     GLContext(PlatformDisplay&);
86
87     PlatformDisplay& m_display;
88     unsigned m_version { 0 };
89 };
90
91 } // namespace WebCore
92
93 #endif // GLContext_h