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
10 #include "mozilla/Assertions.h"
11 #include "mozilla/DataMutex.h"
12 #include "mozilla/gfx/XlibDisplay.h"
14 typedef realGLboolean GLboolean
;
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
36 class GLXLibrary final
{
38 bool EnsureInitialized(Display
* aDisplay
);
41 class WrapperScope final
{
42 const GLXLibrary
& mGlx
;
43 const char* const mFuncName
;
44 Display
* const mDisplay
;
47 WrapperScope(const GLXLibrary
& glx
, const char* const funcName
,
54 # define DECL_WRAPPER_SCOPE(display) \
55 const WrapperScope wrapperScope(*this, __func__, display);
57 # define DECL_WRAPPER_SCOPE(display)
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
,
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
,
104 DECL_WRAPPER_SCOPE(display
)
105 return mSymbols
.fCreateNewContext(display
, config
, render_type
, share_list
,
109 int fGetFBConfigAttrib(Display
* display
, GLXFBConfig config
, int attribute
,
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
,
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
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();
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,
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
,
247 GLXPixmap(GLAPIENTRY
* fCreateGLXPixmapWithConfig
)(Display
*, GLXFBConfig
,
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
,
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*);
264 bool mInitialized
= false;
265 bool mTriedInitializing
= false;
267 bool mHasRobustness
= false;
268 bool mHasVideoMemoryPurge
= false;
269 bool mHasCreateContextAttribs
= false;
270 bool mHasVideoSync
= false;
271 bool mHasBufferAge
= 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
;
284 } /* namespace mozilla */
285 #endif /* GFX_GLXLIBRARY_H */