From 8f756955b76a59548f1ba78bc61d33db47c2d0dc Mon Sep 17 00:00:00 2001 From: kappa1 Date: Sun, 4 Mar 2012 03:40:32 +0000 Subject: [PATCH] Implement GLX_EXT_swap_control for Linux --- src/java/org/lwjgl/opengl/ContextGL.java | 4 ++-- .../lwjgl/opengl/ContextImplementation.java | 2 +- .../opengl/LinuxContextImplementation.java | 19 +++++++++++++++---- .../opengl/MacOSXContextImplementation.java | 2 +- .../opengl/WindowsContextImplementation.java | 2 +- src/native/linux/opengl/extgl_glx.c | 10 ++++++++++ src/native/linux/opengl/extgl_glx.h | 4 ++++ ..._lwjgl_opengl_LinuxContextImplementation.c | 9 +++++++-- 8 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/java/org/lwjgl/opengl/ContextGL.java b/src/java/org/lwjgl/opengl/ContextGL.java index 3ab1df2d..d7e273e8 100644 --- a/src/java/org/lwjgl/opengl/ContextGL.java +++ b/src/java/org/lwjgl/opengl/ContextGL.java @@ -64,7 +64,7 @@ final class ContextGL implements Context { /** Handle to the native GL rendering context */ private final ByteBuffer handle; - private final PeerInfo peer_info; + private static PeerInfo peer_info; private final ContextAttribs contextAttribs; private final boolean forwardCompatible; @@ -229,7 +229,7 @@ final class ContextGL implements Context { * A video frame period is the time required to display a full frame of video data. */ public static void setSwapInterval(int value) { - implementation.setSwapInterval(value); + implementation.setSwapInterval(peer_info, value); } /** diff --git a/src/java/org/lwjgl/opengl/ContextImplementation.java b/src/java/org/lwjgl/opengl/ContextImplementation.java index 62a828d9..3846cb49 100644 --- a/src/java/org/lwjgl/opengl/ContextImplementation.java +++ b/src/java/org/lwjgl/opengl/ContextImplementation.java @@ -81,7 +81,7 @@ interface ContextImplementation { */ boolean isCurrent(ByteBuffer handle) throws LWJGLException; - void setSwapInterval(int value); + void setSwapInterval(PeerInfo peer_info, int value); /** * Destroys the Context. diff --git a/src/java/org/lwjgl/opengl/LinuxContextImplementation.java b/src/java/org/lwjgl/opengl/LinuxContextImplementation.java index 6cd3e0d3..50913916 100644 --- a/src/java/org/lwjgl/opengl/LinuxContextImplementation.java +++ b/src/java/org/lwjgl/opengl/LinuxContextImplementation.java @@ -141,18 +141,29 @@ final class LinuxContextImplementation implements ContextImplementation { private static native boolean nIsCurrent(ByteBuffer context_handle) throws LWJGLException; - public void setSwapInterval(int value) { + public void setSwapInterval(PeerInfo peer_info, int value) { ContextGL current_context = ContextGL.getCurrentContext(); if ( current_context == null ) throw new IllegalStateException("No context is current"); synchronized ( current_context ) { LinuxDisplay.lockAWT(); - nSetSwapInterval(current_context.getHandle(), value); - LinuxDisplay.unlockAWT(); + try { + ByteBuffer peer_handle = peer_info.lockAndGetHandle(); + try { + nSetSwapInterval(peer_handle, current_context.getHandle(), value); + } finally { + peer_info.unlock(); + } + } catch (LWJGLException e) { + // API CHANGE - this methods should throw LWJGLException + e.printStackTrace(); + } finally { + LinuxDisplay.unlockAWT(); + } } } - private static native void nSetSwapInterval(ByteBuffer context_handle, int value); + private static native void nSetSwapInterval(ByteBuffer peer_handle, ByteBuffer context_handle, int value); public void destroy(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException { LinuxDisplay.lockAWT(); diff --git a/src/java/org/lwjgl/opengl/MacOSXContextImplementation.java b/src/java/org/lwjgl/opengl/MacOSXContextImplementation.java index c47d8c87..57e8982d 100644 --- a/src/java/org/lwjgl/opengl/MacOSXContextImplementation.java +++ b/src/java/org/lwjgl/opengl/MacOSXContextImplementation.java @@ -118,7 +118,7 @@ final class MacOSXContextImplementation implements ContextImplementation { private static native boolean nIsCurrent(ByteBuffer context_handle) throws LWJGLException; - public void setSwapInterval(int value) { + public void setSwapInterval(PeerInfo peer_info, int value) { ContextGL current_context = ContextGL.getCurrentContext(); synchronized ( current_context ) { nSetSwapInterval(current_context.getHandle(), value); diff --git a/src/java/org/lwjgl/opengl/WindowsContextImplementation.java b/src/java/org/lwjgl/opengl/WindowsContextImplementation.java index b81bc5e1..ecd2d007 100644 --- a/src/java/org/lwjgl/opengl/WindowsContextImplementation.java +++ b/src/java/org/lwjgl/opengl/WindowsContextImplementation.java @@ -106,7 +106,7 @@ final class WindowsContextImplementation implements ContextImplementation { private static native boolean nIsCurrent(ByteBuffer context_handle) throws LWJGLException; - public void setSwapInterval(int value) { + public void setSwapInterval(PeerInfo peer_info, int value) { boolean success = nSetSwapInterval(value); if ( !success ) LWJGLUtil.log("Failed to set swap interval"); diff --git a/src/native/linux/opengl/extgl_glx.c b/src/native/linux/opengl/extgl_glx.c index c33c3427..48a0057c 100644 --- a/src/native/linux/opengl/extgl_glx.c +++ b/src/native/linux/opengl/extgl_glx.c @@ -74,6 +74,9 @@ glXQueryExtensionsStringPROC lwjgl_glXQueryExtensionsString = NULL; /* GLX_SGI_swap_control */ glXSwapIntervalSGIPROC lwjgl_glXSwapIntervalSGI = NULL; +/* GLX_EXT_swap_control */ +glXSwapIntervalEXTPROC lwjgl_glXSwapIntervalEXT = NULL; + /* GLX_ARB_create_context */ glXCreateContextAttribsARBPROC lwjgl_glXCreateContextAttribsARB = NULL; @@ -155,6 +158,12 @@ static void extgl_InitGLXSGISwapControl() { symbols_flags.GLX_SGI_swap_control = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); } +static void extgl_InitGLXEXTSwapControl() { + ExtFunction functions[] = { + {"glXSwapIntervalEXT", (void*)&lwjgl_glXSwapIntervalEXT}}; + symbols_flags.GLX_EXT_swap_control = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + static void extgl_InitGLXARBCreateContext() { ExtFunction functions[] = { {"glXCreateContextAttribsARB", (void*)&lwjgl_glXCreateContextAttribsARB}}; @@ -189,6 +198,7 @@ static void extgl_InitGLXSupportedExtensions(Display *disp, int screen, GLXExten /* extension_flags.GLX_EXT_visual_info = GLXQueryExtension(serverExts, clientExts, "GLX_EXT_visual_info"); extension_flags.GLX_EXT_visual_rating = GLXQueryExtension(serverExts, clientExts, "GLX_EXT_visual_rating");*/ extension_flags->GLX_SGI_swap_control = symbols_flags.GLX_SGI_swap_control && GLXQueryExtension(serverExts, clientExts, "GLX_SGI_swap_control"); + extension_flags->GLX_EXT_swap_control = symbols_flags.GLX_EXT_swap_control && GLXQueryExtension(serverExts, clientExts, "GLX_EXT_swap_control"); extension_flags->GLX_ARB_multisample = GLXQueryExtension(serverExts, clientExts, "GLX_ARB_multisample"); extension_flags->GLX_ARB_fbconfig_float = GLXQueryExtension(serverExts, clientExts, "GLX_ARB_fbconfig_float"); extension_flags->GLX_EXT_fbconfig_packed_float = GLXQueryExtension(serverExts, clientExts, "GLX_EXT_fbconfig_packed_float"); diff --git a/src/native/linux/opengl/extgl_glx.h b/src/native/linux/opengl/extgl_glx.h index ed72520a..6da27686 100644 --- a/src/native/linux/opengl/extgl_glx.h +++ b/src/native/linux/opengl/extgl_glx.h @@ -343,6 +343,9 @@ typedef const char * (APIENTRY * glXQueryExtensionsStringPROC) (Display *dpy, in /* GLX_SGI_swap_control */ typedef void (APIENTRY * glXSwapIntervalSGIPROC)(int interval); +/* GLX_EXT_swap_control */ +typedef void (APIENTRY * glXSwapIntervalEXTPROC)(Display *dpy, GLXDrawable drawable, int interval); + /* GLX_ARB_create_context */ typedef GLXContext (APIENTRY * glXCreateContextAttribsARBPROC) (Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); @@ -365,6 +368,7 @@ typedef struct { /* bool GLX_EXT_visual_info; bool GLX_EXT_visual_rating;*/ bool GLX_SGI_swap_control; + bool GLX_EXT_swap_control; bool GLX_ARB_multisample; bool GLX_ARB_fbconfig_float; bool GLX_EXT_fbconfig_packed_float; diff --git a/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.c b/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.c index 971c5140..d2580d24 100644 --- a/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.c +++ b/src/native/linux/opengl/org_lwjgl_opengl_LinuxContextImplementation.c @@ -117,10 +117,15 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_getDisp } JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxContextImplementation_nSetSwapInterval - (JNIEnv *env, jclass clazz, jobject context_handle, jint value) + (JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject context_handle, jint value) { + X11PeerInfo *peer_info = (*env)->GetDirectBufferAddress(env, peer_info_handle); X11Context *context_info = (*env)->GetDirectBufferAddress(env, context_handle); - if (context_info->extension_flags.GLX_SGI_swap_control) { + + if (context_info->extension_flags.GLX_EXT_swap_control) { + lwjgl_glXSwapIntervalEXT(peer_info->display, peer_info->drawable, value); + } + else if (context_info->extension_flags.GLX_SGI_swap_control) { lwjgl_glXSwapIntervalSGI(value); } }