Bug 1886451: Add missing ifdef Nightly guards. r=dminor
[gecko.git] / gfx / gl / GLXLibrary.h
blobd2577c935cc9945d745e34f9a04f92c2bfe09871
1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef GFX_GLXLIBRARY_H
7 #define GFX_GLXLIBRARY_H
9 #include "GLContext.h"
10 #include "mozilla/Assertions.h"
11 #include "mozilla/DataMutex.h"
12 #include "mozilla/gfx/XlibDisplay.h"
13 #include "prlink.h"
14 typedef realGLboolean GLboolean;
16 // stuff from glx.h
17 #include "X11/Xlib.h"
18 #include "X11/Xutil.h" // for XVisualInfo
19 #include "X11UndefineNone.h"
20 typedef struct __GLXcontextRec* GLXContext;
21 typedef XID GLXPixmap;
22 typedef XID GLXDrawable;
23 /* GLX 1.3 and later */
24 typedef struct __GLXFBConfigRec* GLXFBConfig;
25 // end of stuff from glx.h
26 #include "prenv.h"
28 struct PRLibrary;
29 class gfxASurface;
31 namespace mozilla {
32 namespace gl {
34 class GLContextGLX;
36 class GLXLibrary final {
37 public:
38 bool EnsureInitialized(Display* aDisplay);
40 private:
41 class WrapperScope final {
42 const GLXLibrary& mGlx;
43 const char* const mFuncName;
44 Display* const mDisplay;
46 public:
47 WrapperScope(const GLXLibrary& glx, const char* const funcName,
48 Display* aDisplay);
49 ~WrapperScope();
52 public:
53 #ifdef DEBUG
54 # define DECL_WRAPPER_SCOPE(display) \
55 const WrapperScope wrapperScope(*this, __func__, display);
56 #else
57 # define DECL_WRAPPER_SCOPE(display)
58 #endif
60 void fDestroyContext(Display* display, GLXContext context) const {
61 DECL_WRAPPER_SCOPE(display)
62 return mSymbols.fDestroyContext(display, context);
65 Bool fMakeCurrent(Display* display, GLXDrawable drawable,
66 GLXContext context) const {
67 DECL_WRAPPER_SCOPE(display)
68 GLContext::ResetTLSCurrentContext();
69 return mSymbols.fMakeCurrent(display, drawable, context);
72 XVisualInfo* fGetConfig(Display* display, XVisualInfo* info, int attrib,
73 int* value) const {
74 DECL_WRAPPER_SCOPE(display)
75 return mSymbols.fGetConfig(display, info, attrib, value);
78 GLXContext fGetCurrentContext() const {
79 DECL_WRAPPER_SCOPE(nullptr)
80 return mSymbols.fGetCurrentContext();
83 GLXFBConfig* fChooseFBConfig(Display* display, int screen,
84 const int* attrib_list, int* nelements) const {
85 DECL_WRAPPER_SCOPE(display)
86 return mSymbols.fChooseFBConfig(display, screen, attrib_list, nelements);
89 XVisualInfo* fChooseVisual(Display* display, int screen,
90 int* attrib_list) const {
91 DECL_WRAPPER_SCOPE(display)
92 return mSymbols.fChooseVisual(display, screen, attrib_list);
95 GLXFBConfig* fGetFBConfigs(Display* display, int screen,
96 int* nelements) const {
97 DECL_WRAPPER_SCOPE(display)
98 return mSymbols.fGetFBConfigs(display, screen, nelements);
101 GLXContext fCreateNewContext(Display* display, GLXFBConfig config,
102 int render_type, GLXContext share_list,
103 Bool direct) const {
104 DECL_WRAPPER_SCOPE(display)
105 return mSymbols.fCreateNewContext(display, config, render_type, share_list,
106 direct);
109 int fGetFBConfigAttrib(Display* display, GLXFBConfig config, int attribute,
110 int* value) const {
111 DECL_WRAPPER_SCOPE(display)
112 return mSymbols.fGetFBConfigAttrib(display, config, attribute, value);
115 void fSwapBuffers(Display* display, GLXDrawable drawable) const {
116 DECL_WRAPPER_SCOPE(display)
117 return mSymbols.fSwapBuffers(display, drawable);
120 const char* fQueryExtensionsString(Display* display, int screen) const {
121 DECL_WRAPPER_SCOPE(display)
122 return mSymbols.fQueryExtensionsString(display, screen);
125 const char* fGetClientString(Display* display, int screen) const {
126 DECL_WRAPPER_SCOPE(display)
127 return mSymbols.fGetClientString(display, screen);
130 const char* fQueryServerString(Display* display, int screen, int name) const {
131 DECL_WRAPPER_SCOPE(display)
132 return mSymbols.fQueryServerString(display, screen, name);
135 GLXPixmap fCreatePixmap(Display* display, GLXFBConfig config, Pixmap pixmap,
136 const int* attrib_list) const {
137 DECL_WRAPPER_SCOPE(display)
138 return mSymbols.fCreatePixmap(display, config, pixmap, attrib_list);
141 GLXPixmap fCreateGLXPixmapWithConfig(Display* display, GLXFBConfig config,
142 Pixmap pixmap) const {
143 DECL_WRAPPER_SCOPE(display)
144 return mSymbols.fCreateGLXPixmapWithConfig(display, config, pixmap);
147 void fDestroyPixmap(Display* display, GLXPixmap pixmap) const {
148 DECL_WRAPPER_SCOPE(display)
149 return mSymbols.fDestroyPixmap(display, pixmap);
152 Bool fQueryVersion(Display* display, int* major, int* minor) const {
153 DECL_WRAPPER_SCOPE(display)
154 return mSymbols.fQueryVersion(display, major, minor);
157 void fBindTexImage(Display* display, GLXDrawable drawable, int buffer,
158 const int* attrib_list) const {
159 DECL_WRAPPER_SCOPE(display)
160 return mSymbols.fBindTexImageEXT(display, drawable, buffer, attrib_list);
163 void fReleaseTexImage(Display* display, GLXDrawable drawable,
164 int buffer) const {
165 DECL_WRAPPER_SCOPE(display)
166 return mSymbols.fReleaseTexImageEXT(display, drawable, buffer);
169 void fWaitGL() const {
170 DECL_WRAPPER_SCOPE(nullptr)
171 return mSymbols.fWaitGL();
174 void fWaitX() const {
175 DECL_WRAPPER_SCOPE(nullptr)
176 return mSymbols.fWaitX();
179 GLXContext fCreateContextAttribs(Display* display, GLXFBConfig config,
180 GLXContext share_list, Bool direct,
181 const int* attrib_list) const {
182 DECL_WRAPPER_SCOPE(display)
183 return mSymbols.fCreateContextAttribsARB(display, config, share_list,
184 direct, attrib_list);
187 int fGetVideoSync(unsigned int* count) const {
188 DECL_WRAPPER_SCOPE(nullptr)
189 return mSymbols.fGetVideoSyncSGI(count);
192 int fWaitVideoSync(int divisor, int remainder, unsigned int* count) const {
193 DECL_WRAPPER_SCOPE(nullptr)
194 return mSymbols.fWaitVideoSyncSGI(divisor, remainder, count);
197 void fSwapInterval(Display* dpy, GLXDrawable drawable, int interval) const {
198 DECL_WRAPPER_SCOPE(dpy)
199 return mSymbols.fSwapIntervalEXT(dpy, drawable, interval);
202 int fQueryDrawable(Display* dpy, GLXDrawable drawable, int attribute,
203 unsigned int* value) const {
204 DECL_WRAPPER_SCOPE(dpy)
205 return mSymbols.fQueryDrawable(dpy, drawable, attribute, value);
207 #undef DECL_WRAPPER_SCOPE
209 ////
211 bool HasRobustness() { return mHasRobustness; }
212 bool HasVideoMemoryPurge() { return mHasVideoMemoryPurge; }
213 bool HasCreateContextAttribs() { return mHasCreateContextAttribs; }
214 bool SupportsTextureFromPixmap(gfxASurface* aSurface);
215 bool SupportsVideoSync(Display* aDisplay);
216 bool SupportsSwapControl() const { return bool(mSymbols.fSwapIntervalEXT); }
217 bool SupportsBufferAge() const {
218 MOZ_ASSERT(mInitialized);
219 return mHasBufferAge;
221 bool IsATI() { return mIsATI; }
222 bool IsMesa() { return mClientIsMesa; }
224 auto GetGetProcAddress() const { return mSymbols.fGetProcAddress; }
226 std::shared_ptr<gfx::XlibDisplay> GetDisplay();
228 private:
229 struct {
230 void(GLAPIENTRY* fDestroyContext)(Display*, GLXContext);
231 Bool(GLAPIENTRY* fMakeCurrent)(Display*, GLXDrawable, GLXContext);
232 XVisualInfo*(GLAPIENTRY* fGetConfig)(Display*, XVisualInfo*, int, int*);
233 GLXContext(GLAPIENTRY* fGetCurrentContext)();
234 void*(GLAPIENTRY* fGetProcAddress)(const char*);
235 GLXFBConfig*(GLAPIENTRY* fChooseFBConfig)(Display*, int, const int*, int*);
236 XVisualInfo*(GLAPIENTRY* fChooseVisual)(Display*, int, const int*);
237 GLXFBConfig*(GLAPIENTRY* fGetFBConfigs)(Display*, int, int*);
238 GLXContext(GLAPIENTRY* fCreateNewContext)(Display*, GLXFBConfig, int,
239 GLXContext, Bool);
240 int(GLAPIENTRY* fGetFBConfigAttrib)(Display*, GLXFBConfig, int, int*);
241 void(GLAPIENTRY* fSwapBuffers)(Display*, GLXDrawable);
242 const char*(GLAPIENTRY* fQueryExtensionsString)(Display*, int);
243 const char*(GLAPIENTRY* fGetClientString)(Display*, int);
244 const char*(GLAPIENTRY* fQueryServerString)(Display*, int, int);
245 GLXPixmap(GLAPIENTRY* fCreatePixmap)(Display*, GLXFBConfig, Pixmap,
246 const int*);
247 GLXPixmap(GLAPIENTRY* fCreateGLXPixmapWithConfig)(Display*, GLXFBConfig,
248 Pixmap);
249 void(GLAPIENTRY* fDestroyPixmap)(Display*, GLXPixmap);
250 Bool(GLAPIENTRY* fQueryVersion)(Display*, int*, int*);
251 void(GLAPIENTRY* fWaitGL)();
252 void(GLAPIENTRY* fWaitX)();
253 void(GLAPIENTRY* fBindTexImageEXT)(Display*, GLXDrawable, int, const int*);
254 void(GLAPIENTRY* fReleaseTexImageEXT)(Display*, GLXDrawable, int);
255 GLXContext(GLAPIENTRY* fCreateContextAttribsARB)(Display*, GLXFBConfig,
256 GLXContext, Bool,
257 const int*);
258 int(GLAPIENTRY* fGetVideoSyncSGI)(unsigned int*);
259 int(GLAPIENTRY* fWaitVideoSyncSGI)(int, int, unsigned int*);
260 void(GLAPIENTRY* fSwapIntervalEXT)(Display*, GLXDrawable, int);
261 int(GLAPIENTRY* fQueryDrawable)(Display*, GLXDrawable, int, unsigned int*);
262 } mSymbols = {};
264 bool mInitialized = false;
265 bool mTriedInitializing = false;
266 bool mDebug = false;
267 bool mHasRobustness = false;
268 bool mHasVideoMemoryPurge = false;
269 bool mHasCreateContextAttribs = false;
270 bool mHasVideoSync = false;
271 bool mHasBufferAge = false;
272 bool mIsATI = false;
273 bool mIsNVIDIA = false;
274 bool mClientIsMesa = false;
275 PRLibrary* mOGLLibrary = nullptr;
276 StaticDataMutex<std::weak_ptr<gfx::XlibDisplay>> mOwnDisplay{
277 "GLXLibrary::mOwnDisplay"};
280 // a global GLXLibrary instance
281 extern GLXLibrary sGLXLibrary;
283 } /* namespace gl */
284 } /* namespace mozilla */
285 #endif /* GFX_GLXLIBRARY_H */