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
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
2327void 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