New vsync code

This commit is contained in:
Caspian Rychlik-Prince 2003-10-20 14:17:47 +00:00
parent b6390ef976
commit 2714842095
10 changed files with 117 additions and 72 deletions

View File

@ -1407,24 +1407,6 @@ public abstract class GL extends CoreGL14 implements GLConstants {
// public static native int wglGetPbufferDCARB(int hPbuffer); // public static native int wglGetPbufferDCARB(int hPbuffer);
/* public static native boolean wglGetPixelFormatAttribfvARB(
int hdc,
int iPixelFormat,
int iLayerPlane,
int nAttributes,
int piAttributes,
int pfValues);
public static native boolean wglGetPixelFormatAttribivARB(
int hdc,
int iPixelFormat,
int iLayerPlane,
int nAttributes,
int piAttributes,
int piValues);
*/
public static native int wglGetSwapIntervalEXT();
/* public static native boolean wglMakeContextCurrentARB( /* public static native boolean wglMakeContextCurrentARB(
int hDrawDC, int hDrawDC,
int hReadDC, int hReadDC,
@ -1441,29 +1423,7 @@ public abstract class GL extends CoreGL14 implements GLConstants {
int hPbuffer, int hPbuffer,
int iBuffer); int iBuffer);
/* public static native boolean wglRestoreBufferRegionARB( public static native void glWindowPos2fARB(float x, float y);
Buffer hRegion,
int x,
int y,
int width,
int height,
int xSrc,
int ySrc);
public static native boolean wglSaveBufferRegionARB(
Buffer hRegion,
int x,
int y,
int width,
int height);
*/
/* public static native boolean wglSetPbufferAttribARB(
int hPbuffer,
int piAttribList);
*/
public static native boolean wglSwapIntervalEXT(int interval);
public static native void glWindowPos2fARB(float x, float y);
public static native void glWindowPos2iARB(int x, int y); public static native void glWindowPos2iARB(int x, int y);

View File

@ -25,7 +25,6 @@ import org.lwjgl.Display;
import org.lwjgl.Sys; import org.lwjgl.Sys;
import java.util.HashSet; import java.util.HashSet;
import java.lang.reflect.Method;
public final class Window { public final class Window {
@ -54,8 +53,9 @@ public final class Window {
* I have posted a bug report to apple regarding the behaviour. * I have posted a bug report to apple regarding the behaviour.
* *
*/ */
if (Display.getPlatform() == Display.PLATFORM_AGL) if (Display.getPlatform() == Display.PLATFORM_AGL) {
MacOSX.initMacOSX(); MacOSX.initMacOSX();
}
} }
/** Whether the window is currently created, ie. has a native peer */ /** Whether the window is currently created, ie. has a native peer */
@ -93,6 +93,9 @@ public final class Window {
/** Fullscreen */ /** Fullscreen */
private static boolean fullscreen; private static boolean fullscreen;
/** Vsync */
private static boolean vsync;
/** Tracks VBO state for the window context */ /** Tracks VBO state for the window context */
private static VBOTracker vbo_tracker; private static VBOTracker vbo_tracker;
@ -364,4 +367,35 @@ public final class Window {
* to handle window close requests, moves, paints, etc. * to handle window close requests, moves, paints, etc.
*/ */
public static native void update(); public static native void update();
/**
* Determines to the best of the platform's ability whether monitor vysnc is enabled on
* this window. The failsafe assumption is that when vsync cannot be determined, this
* method returns false, and you should rely on using a hires timer to throttle your
* framerate rather than relying on monitor sync (even if monitor sync is actually working).
* Therefore you can guarantee that if we return true from this method that we're pretty
* certain vsync is enabled.
* @return boolean
*/
public static boolean isVSyncEnabled() {
assert isCreated() : "Cannot determine sync of uncreated window";
return nIsVSyncEnabled();
}
private static native boolean nIsVSyncEnabled();
/**
* Enable or disable vertical monitor synchronization. This call is a best-attempt at changing
* the vertical refresh synchronization of the monitor, and is not guaranteed to be successful.
* To check whether the call <em>might</em> have been successful, call isVSyncEnabled().
* @param sync true to synchronize; false to ignore synchronization
*/
public static void setVSyncEnabled(boolean sync) {
assert isCreated() : "Cannot set sync of uncreated window";
nSetVSyncEnabled(sync);
}
private static native boolean nSetVSyncEnabled(boolean sync);
} }

View File

@ -338,9 +338,7 @@ public class HWCursorTest {
GL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); GL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
//sync frame (only works on windows) //sync frame (only works on windows)
if (GLCaps.WGL_EXT_swap_control) { Window.setVSyncEnabled(true);
GL.wglSwapIntervalEXT(1);
}
} }
/** /**

View File

@ -315,9 +315,7 @@ public class FullScreenWindowedTest {
GL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); GL.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
//sync frame (only works on windows) //sync frame (only works on windows)
if (GLCaps.WGL_EXT_swap_control) { Window.setVSyncEnabled(true);
GL.wglSwapIntervalEXT(1);
}
} }
/** /**

View File

@ -386,9 +386,8 @@ public class PbufferTest {
*/ */
private void glInit() { private void glInit() {
//sync frame (only works on windows) //sync frame (only works on windows)
if (GLCaps.WGL_EXT_swap_control) { Window.setVSyncEnabled(true);
GL.wglSwapIntervalEXT(1);
}
GL.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE); GL.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
GL.glEnable(GL.GL_TEXTURE_2D); GL.glEnable(GL.GL_TEXTURE_2D);
// Create shared texture // Create shared texture

View File

@ -3373,7 +3373,6 @@ JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_GL_wglGetExtensionsStringEXT(JNI
/* /*
* Class: org_lwjgl_opengl_GL * Class: org_lwjgl_opengl_GL
* Method: wglGetSwapIntervalEXT * Method: wglGetSwapIntervalEXT
*/
JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL_wglGetSwapIntervalEXT(JNIEnv * env, jclass clazz) JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL_wglGetSwapIntervalEXT(JNIEnv * env, jclass clazz)
{ {
#ifdef _WIN32 #ifdef _WIN32
@ -3385,6 +3384,7 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL_wglGetSwapIntervalEXT(JNIEnv * e
return JNI_FALSE; return JNI_FALSE;
#endif #endif
} }
*/
/* /*
* Class: org_lwjgl_opengl_GL * Class: org_lwjgl_opengl_GL
@ -3504,7 +3504,6 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL_wglReleaseTexImageARB(JNIEnv
/* /*
* Class: org_lwjgl_opengl_GL * Class: org_lwjgl_opengl_GL
* Method: wglSwapIntervalEXT * Method: wglSwapIntervalEXT
*/
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL_wglSwapIntervalEXT(JNIEnv * env, jclass clazz, jint p0) JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL_wglSwapIntervalEXT(JNIEnv * env, jclass clazz, jint p0)
{ {
#ifdef _WIN32 #ifdef _WIN32
@ -3516,6 +3515,7 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL_wglSwapIntervalEXT(JNIEnv *
return JNI_FALSE; return JNI_FALSE;
#endif #endif
} }
*/
/* /*
* Class: org_lwjgl_opengl_GL * Class: org_lwjgl_opengl_GL

View File

@ -2215,14 +2215,6 @@ JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_GL_wglGetExtensionsStringARB
JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_GL_wglGetExtensionsStringEXT JNIEXPORT jstring JNICALL Java_org_lwjgl_opengl_GL_wglGetExtensionsStringEXT
(JNIEnv *, jclass); (JNIEnv *, jclass);
/*
* Class: org_lwjgl_opengl_GL
* Method: wglGetSwapIntervalEXT
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL_wglGetSwapIntervalEXT
(JNIEnv *, jclass);
/* /*
* Class: org_lwjgl_opengl_GL * Class: org_lwjgl_opengl_GL
* Method: wglReleaseTexImageARB * Method: wglReleaseTexImageARB
@ -2231,14 +2223,6 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_GL_wglGetSwapIntervalEXT
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL_wglReleaseTexImageARB JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL_wglReleaseTexImageARB
(JNIEnv *, jclass, jint, jint); (JNIEnv *, jclass, jint, jint);
/*
* Class: org_lwjgl_opengl_GL
* Method: wglSwapIntervalEXT
* Signature: (I)Z
*/
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_GL_wglSwapIntervalEXT
(JNIEnv *, jclass, jint);
/* /*
* Class: org_lwjgl_opengl_GL * Class: org_lwjgl_opengl_GL
* Method: glWindowPos2fARB * Method: glWindowPos2fARB

View File

@ -19,8 +19,9 @@ extern "C" {
/* Inaccessible static: depth */ /* Inaccessible static: depth */
/* Inaccessible static: stencil */ /* Inaccessible static: stencil */
/* Inaccessible static: fullscreen */ /* Inaccessible static: fullscreen */
/* Inaccessible static: vsync */
/* Inaccessible static: vbo_tracker */ /* Inaccessible static: vbo_tracker */
/* Inaccessible static: class_00024org_00024lwjgl_00024opengl_00024Window */ /* Inaccessible static: class_000240 */
/* /*
* Class: org_lwjgl_opengl_Window * Class: org_lwjgl_opengl_Window
* Method: nSetTitle * Method: nSetTitle
@ -88,7 +89,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_swapBuffers
/* /*
* Class: org_lwjgl_opengl_Window * Class: org_lwjgl_opengl_Window
* Method: nCreate * Method: nCreate
* Signature: (Ljava/lang/String;IIIIZIIIILjava/util/Vector;)V * Signature: (Ljava/lang/String;IIIIZIIIILjava/util/HashSet;)V
*/ */
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate
(JNIEnv *, jclass, jstring, jint, jint, jint, jint, jboolean, jint, jint, jint, jint, jobject); (JNIEnv *, jclass, jstring, jint, jint, jint, jint, jboolean, jint, jint, jint, jint, jobject);
@ -109,6 +110,22 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nDestroy
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_update JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_update
(JNIEnv *, jclass); (JNIEnv *, jclass);
/*
* Class: org_lwjgl_opengl_Window
* Method: nIsVSyncEnabled
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsVSyncEnabled
(JNIEnv *, jclass);
/*
* Class: org_lwjgl_opengl_Window
* Method: nSetVSyncEnabled
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nSetVSyncEnabled
(JNIEnv *, jclass, jboolean);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -559,3 +559,26 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsFocused
(JNIEnv *env, jclass clazz) { (JNIEnv *env, jclass clazz) {
return focused; return focused;
} }
/*
* Class: org_lwjgl_opengl_Window
* Method: nIsVSyncEnabled
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsVSyncEnabled
(JNIEnv * env, jclass clazz)
{
// Always return false
return false;
}
/*
* Class: org_lwjgl_opengl_Window
* Method: nSetVSyncEnabled
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nSetVSyncEnabled
(JNIEnv * env, jclass clazz, jboolean sync)
{
// Do nothing on Linux
}

View File

@ -58,6 +58,7 @@ static bool closerequested;
static bool minimized; static bool minimized;
static bool focused; static bool focused;
static bool dirty; static bool dirty;
static jboolean vsync;
//CAS: commented these out as no longer used //CAS: commented these out as no longer used
//extern void tempRestoreDisplayMode(); //extern void tempRestoreDisplayMode();
@ -444,6 +445,8 @@ static bool createWindow(const char * title, int x, int y, int width, int height
} }
vsync = JNI_FALSE;
return true; return true;
} }
@ -629,3 +632,32 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsFocused
(JNIEnv *env, jclass clazz) { (JNIEnv *env, jclass clazz) {
return focused; return focused;
} }
/*
* Class: org_lwjgl_opengl_Window
* Method: nIsVSyncEnabled
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsVSyncEnabled
(JNIEnv * env, jclass clazz)
{
return vsync;
}
/*
* Class: org_lwjgl_opengl_Window
* Method: nSetVSyncEnabled
* Signature: (Z)Z
*/
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nSetVSyncEnabled
(JNIEnv * env, jclass clazz, jboolean sync)
{
if (extgl_Extensions.WGL_EXT_swap_control) {
if (sync == JNI_TRUE) {
wglSwapIntervalEXT(1);
} else {
wglSwapIntervalEXT(0);
}
vsync = sync;
}
}