Implemented linux swap control through GLX_SGI_swap_control
This commit is contained in:
parent
cfb462a29a
commit
b5194bbb04
|
@ -87,6 +87,9 @@ glXWaitXPROC glXWaitX = NULL;
|
||||||
glXGetClientStringPROC glXGetClientString = NULL;
|
glXGetClientStringPROC glXGetClientString = NULL;
|
||||||
glXQueryServerStringPROC glXQueryServerString = NULL;
|
glXQueryServerStringPROC glXQueryServerString = NULL;
|
||||||
glXQueryExtensionsStringPROC glXQueryExtensionsString = NULL;
|
glXQueryExtensionsStringPROC glXQueryExtensionsString = NULL;
|
||||||
|
|
||||||
|
/* GLX_SGI_swap_control */
|
||||||
|
glXSwapIntervalSGIPROC glXSwapIntervalSGI = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _AGL
|
#ifdef _AGL
|
||||||
|
@ -2538,6 +2541,15 @@ static void extgl_InitGLXSupportedExtensions(JNIEnv *env, jobject ext_set, Displ
|
||||||
{
|
{
|
||||||
extgl_Extensions.GLX_EXT_visual_info = GLXQueryExtension(env, ext_set, disp, screen, "GLX_EXT_visual_info");
|
extgl_Extensions.GLX_EXT_visual_info = GLXQueryExtension(env, ext_set, disp, screen, "GLX_EXT_visual_info");
|
||||||
extgl_Extensions.GLX_EXT_visual_rating = GLXQueryExtension(env, ext_set, disp, screen, "GLX_EXT_visual_rating");
|
extgl_Extensions.GLX_EXT_visual_rating = GLXQueryExtension(env, ext_set, disp, screen, "GLX_EXT_visual_rating");
|
||||||
|
extgl_Extensions.GLX_SGI_swap_control = GLXQueryExtension(env, ext_set, disp, screen, "GLX_SGI_swap_control");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void extgl_InitGLXSGISwapControl(JNIEnv *env, jobject ext_set)
|
||||||
|
{
|
||||||
|
if (extgl_Extensions.GLX_SGI_swap_control != 1)
|
||||||
|
return;
|
||||||
|
glXSwapIntervalSGI = (glXSwapIntervalSGIPROC)extgl_GetProcAddress("glXSwapIntervalSGI");
|
||||||
|
EXTGL_SANITY_CHECK(env, ext_set, GLX_SGI_swap_control)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool extgl_InitGLX(JNIEnv *env, jobject ext_set, Display *disp, int screen)
|
bool extgl_InitGLX(JNIEnv *env, jobject ext_set, Display *disp, int screen)
|
||||||
|
@ -2556,6 +2568,7 @@ bool extgl_InitGLX(JNIEnv *env, jobject ext_set, Display *disp, int screen)
|
||||||
if (major > 1 || (major == 1 && minor >= 3))
|
if (major > 1 || (major == 1 && minor >= 3))
|
||||||
extgl_Extensions.GLX13 = true;
|
extgl_Extensions.GLX13 = true;
|
||||||
extgl_InitGLX13(env, ext_set);
|
extgl_InitGLX13(env, ext_set);
|
||||||
|
extgl_InitGLXSGISwapControl(env, ext_set);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -539,6 +539,11 @@ extern glXGetClientStringPROC glXGetClientString;
|
||||||
extern glXQueryServerStringPROC glXQueryServerString;
|
extern glXQueryServerStringPROC glXQueryServerString;
|
||||||
extern glXQueryExtensionsStringPROC glXQueryExtensionsString;
|
extern glXQueryExtensionsStringPROC glXQueryExtensionsString;
|
||||||
|
|
||||||
|
/* GLX_SGI_swap_control */
|
||||||
|
typedef void (APIENTRY * glXSwapIntervalSGIPROC)(int interval);
|
||||||
|
|
||||||
|
extern glXSwapIntervalSGIPROC glXSwapIntervalSGI;
|
||||||
|
|
||||||
#endif /* X11 */
|
#endif /* X11 */
|
||||||
|
|
||||||
#ifdef _AGL
|
#ifdef _AGL
|
||||||
|
@ -5535,6 +5540,7 @@ struct ExtensionTypes
|
||||||
bool GLX13;
|
bool GLX13;
|
||||||
bool GLX_EXT_visual_info;
|
bool GLX_EXT_visual_info;
|
||||||
bool GLX_EXT_visual_rating;
|
bool GLX_EXT_visual_rating;
|
||||||
|
bool GLX_SGI_swap_control;
|
||||||
#endif /* X11 */
|
#endif /* X11 */
|
||||||
|
|
||||||
bool OpenGL12;
|
bool OpenGL12;
|
||||||
|
|
|
@ -68,6 +68,7 @@ static int current_width;
|
||||||
static bool input_released;
|
static bool input_released;
|
||||||
|
|
||||||
static bool dirty;
|
static bool dirty;
|
||||||
|
static bool vsync_enabled;
|
||||||
static bool minimized;
|
static bool minimized;
|
||||||
static bool focused;
|
static bool focused;
|
||||||
static bool closerequested;
|
static bool closerequested;
|
||||||
|
@ -182,7 +183,7 @@ static void createWindow(JNIEnv* env, Display *disp, int screen, XVisualInfo *vi
|
||||||
focused = true;
|
focused = true;
|
||||||
minimized = false;
|
minimized = false;
|
||||||
closerequested = false;
|
closerequested = false;
|
||||||
|
vsync_enabled = false;
|
||||||
Window root_win;
|
Window root_win;
|
||||||
Window win;
|
Window win;
|
||||||
XSetWindowAttributes attribs;
|
XSetWindowAttributes attribs;
|
||||||
|
@ -556,25 +557,21 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsFocused
|
||||||
return focused;
|
return focused;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_lwjgl_opengl_Window
|
|
||||||
* Method: nIsVSyncEnabled
|
|
||||||
* Signature: ()Z
|
|
||||||
*/
|
|
||||||
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsVSyncEnabled
|
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsVSyncEnabled
|
||||||
(JNIEnv * env, jclass clazz)
|
(JNIEnv * env, jclass clazz)
|
||||||
{
|
{
|
||||||
// Always return false
|
return vsync_enabled;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Class: org_lwjgl_opengl_Window
|
|
||||||
* Method: nSetVSyncEnabled
|
|
||||||
* Signature: (Z)V
|
|
||||||
*/
|
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nSetVSyncEnabled
|
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nSetVSyncEnabled
|
||||||
(JNIEnv * env, jclass clazz, jboolean sync)
|
(JNIEnv * env, jclass clazz, jboolean sync)
|
||||||
{
|
{
|
||||||
// Do nothing on Linux
|
if (extgl_Extensions.GLX_SGI_swap_control) {
|
||||||
|
bool vsync = sync == JNI_TRUE ? true : false;
|
||||||
|
if (vsync != vsync_enabled) {
|
||||||
|
int interval = vsync ? 1 : 0;
|
||||||
|
glXSwapIntervalSGI(interval);
|
||||||
|
vsync_enabled = vsync;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue