Skip to content

Commit 866aeb9

Browse files
committed
Make swapinterval.cpp independant of glew, this fixes issues caused by accessing glew vars before glew is initiliazed.
Closes #2826.
1 parent c10d9ef commit 866aeb9

File tree

1 file changed

+46
-23
lines changed

1 file changed

+46
-23
lines changed

lib/qtgame/swapinterval.cpp

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#if defined(WZ_WS_X11)
66

7-
#include <GL/glxew.h>
7+
#include <GL/glx.h> // GLXDrawable
88
// X11 polution
99
#ifdef Status
1010
#undef Status
@@ -16,39 +16,55 @@
1616
#undef Bool
1717
#endif
1818

19+
#ifndef GLX_SWAP_INTERVAL_EXT
20+
#define GLX_SWAP_INTERVAL_EXT 0x20F1
21+
#endif
22+
1923
#include <QtGui/QX11Info>
2024
#include <QtOpenGL/QGLWidget>
2125

2226

2327
void setSwapInterval(QGLWidget const &glWidget, int * interval)
2428
{
29+
typedef void (* PFNGLXQUERYDRAWABLEPROC) (Display *, GLXDrawable, int, unsigned int *);
30+
typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display*, GLXDrawable, int);
31+
typedef int (* PFNGLXGETSWAPINTERVALMESAPROC)(void);
32+
typedef int (* PFNGLXSWAPINTERVALMESAPROC)(unsigned);
33+
typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int);
34+
PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT;
35+
PFNGLXQUERYDRAWABLEPROC glXQueryDrawable;
36+
PFNGLXGETSWAPINTERVALMESAPROC glXGetSwapIntervalMESA;
37+
PFNGLXSWAPINTERVALMESAPROC glXSwapIntervalMESA;
38+
PFNGLXSWAPINTERVALSGIPROC glXSwapIntervalSGI;
2539
QGLContext const &context = *glWidget.context();
2640
QX11Info const &xinfo = glWidget.x11Info();
27-
if (GLXEW_EXT_swap_control)
41+
42+
glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC) context.getProcAddress("glXSwapIntervalEXT");
43+
glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC) context.getProcAddress("glXQueryDrawable");
44+
if (glXSwapIntervalEXT && glXQueryDrawable)
2845
{
2946
unsigned clampedInterval;
3047
if (*interval < 0)
3148
*interval = 0;
3249
glXSwapIntervalEXT(xinfo.display(), glWidget.winId(), *interval);
3350
glXQueryDrawable(xinfo.display(), glWidget.winId(), GLX_SWAP_INTERVAL_EXT, &clampedInterval);
3451
*interval = clampedInterval;
52+
return;
3553
}
36-
else if (xinfo.display() && strstr(glXQueryExtensionsString(xinfo.display(), xinfo.screen()), "GLX_MESA_swap_control"))
37-
{
38-
typedef int (* PFNGLXSWAPINTERVALMESAPROC)(unsigned);
39-
typedef int (* PFNGLXGETSWAPINTERVALMESAPROC)(void);
40-
PFNGLXSWAPINTERVALMESAPROC glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC) context.getProcAddress("glXSwapIntervalMESA");
41-
PFNGLXGETSWAPINTERVALMESAPROC glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC) context.getProcAddress("glXGetSwapIntervalMESA");
4254

43-
if (glXSwapIntervalMESA && glXGetSwapIntervalMESA)
44-
{
45-
if (*interval < 0)
46-
*interval = 0;
47-
glXSwapIntervalMESA(*interval);
48-
*interval = glXGetSwapIntervalMESA();
49-
}
55+
glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC) context.getProcAddress("glXSwapIntervalMESA");
56+
glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC) context.getProcAddress("glXGetSwapIntervalMESA");
57+
if (glXSwapIntervalMESA && glXGetSwapIntervalMESA)
58+
{
59+
if (*interval < 0)
60+
*interval = 0;
61+
glXSwapIntervalMESA(*interval);
62+
*interval = glXGetSwapIntervalMESA();
63+
return;
5064
}
51-
else if (GLXEW_SGI_swap_control)
65+
66+
glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) context.getProcAddress("glXSwapIntervalSGI");
67+
if (glXSwapIntervalSGI)
5268
{
5369
if (*interval < 1)
5470
*interval = 1;
@@ -58,20 +74,27 @@ void setSwapInterval(QGLWidget const &glWidget, int * interval)
5874
*interval = 1;
5975
glXSwapIntervalSGI(1);
6076
}
77+
return;
6178
}
62-
else
63-
{
64-
*interval = -1;
65-
}
79+
80+
*interval = -1;
6681
}
6782

6883
#elif defined(WZ_WS_WIN)
69-
#include <GL/wglew.h>
7084
#include <QtOpenGL/QGLWidget>
7185

72-
void setSwapInterval(QGLWidget const &, int * interval)
86+
void setSwapInterval(QGLWidget const &glWidget, int * interval)
7387
{
74-
if (WGLEW_EXT_swap_control)
88+
typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);
89+
typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int);
90+
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT;
91+
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
92+
QGLContext const &context = *glWidget.context();
93+
94+
wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) context.getProcAddress("wglGetSwapIntervalEXT");
95+
wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) context.getProcAddress("wglSwapIntervalEXT");
96+
97+
if (wglGetSwapIntervalEXT && wglSwapIntervalEXT)
7598
{
7699
if (*interval < 0)
77100
*interval = 0;

0 commit comments

Comments
 (0)