Implement GLX_EXT_swap_control for Linux

This commit is contained in:
kappa1 2012-03-04 03:40:32 +00:00
parent d099a86e50
commit 8f756955b7
8 changed files with 41 additions and 11 deletions

View File

@ -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);
}
/**

View File

@ -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.

View File

@ -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();

View File

@ -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);

View File

@ -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");

View File

@ -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");

View File

@ -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;

View File

@ -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);
}
}