Implement GLX_EXT_swap_control for Linux
This commit is contained in:
parent
d099a86e50
commit
8f756955b7
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue