From b5ce9cce6223810c6df7b66cf1a51318309fdc90 Mon Sep 17 00:00:00 2001
From: sg215889
Date: Wed, 29 Jul 2009 06:27:46 -0700
Subject: Fixed GL* documentation. Moved common GL functions to GLBase. Moved
glAllocateMemoryNV to GL2GL3 only. Add GL2GL3 interface. Fix some GL2
signatures. BroadcomEGL disable custom setSize().
---
src/jogl/classes/javax/media/opengl/GLBase.java | 148 +++++++++++++++++++++++-
1 file changed, 142 insertions(+), 6 deletions(-)
(limited to 'src/jogl/classes/javax/media/opengl/GLBase.java')
diff --git a/src/jogl/classes/javax/media/opengl/GLBase.java b/src/jogl/classes/javax/media/opengl/GLBase.java
index efd2eedd1..7b59344cc 100644
--- a/src/jogl/classes/javax/media/opengl/GLBase.java
+++ b/src/jogl/classes/javax/media/opengl/GLBase.java
@@ -7,9 +7,53 @@ package javax.media.opengl;
import java.nio.*;
/**
- * The base interface from which all GL profiles derive, providing
- * checked conversion down to concrete profiles, and access to the
- * OpenGL context associated with the GL.
+ * The base interface from which all GL profiles derive, providing
+ * checked conversion down to concrete profiles, access to the
+ * OpenGL context associated with the GL and extension/function
+ * availability queries as described below.
+ *
+ * While the APIs for vendor extensions are unconditionally
+ * exposed, the underlying functions may not be present. The method
+ * {@link #isFunctionAvailable} should be used to query the
+ * availability of any non-core function before it is used for the
+ * first time; for example,
+ * gl.isFunctionAvailable("glProgramStringARB")
. On
+ * certain platforms (Windows in particular), the most "core"
+ * functionality is only OpenGL 1.1, so in theory any routines first
+ * exposed in OpenGL 1.2, 1.3, and 1.4, 1.5, or 2.0 as well as vendor
+ * extensions should all be queried. Calling an unavailable function
+ * will cause a {@link GLException} to be raised.
+ *
+ * {@link #isExtensionAvailable} may also be used to determine whether
+ * a specific extension is available before calling the routines or
+ * using the functionality it exposes: for example,
+ * gl.isExtensionAvailable("GL_ARB_vertex_program");
.
+ * However, in this case it is up to the end user to know which
+ * routines or functionality are associated with which OpenGL
+ * extensions. It may also be used to test for the availability of a
+ * particular version of OpenGL: for example,
+ * gl.isExtensionAvailable("GL_VERSION_1_5");
.
+ *
+ * Exceptions to the window system extension naming rules:
+ *
+ *
+ *
+ * - The memory allocators for the NVidia vertex_array_range (VAR)
+ * extension, in particular
wglAllocateMemoryNV
/
+ * glXAllocateMemoryNV
and associated routines. {@link
+ * #glAllocateMemoryNV} has been provided for window system-independent
+ * access to VAR. {@link #isFunctionAvailable} will translate an argument
+ * of "glAllocateMemoryNV" or "glFreeMemoryNV" into the appropriate
+ * window system-specific name.
+ *
+ * WGL_ARB_pbuffer, WGL_ARB_pixel_format, and other
+ * platform-specific pbuffer functionality; the availability of
+ * pbuffers can be queried on Windows, X11 and Mac OS X platforms by
+ * querying {@link #isExtensionAvailable} with an argument of
+ * "GL_ARB_pbuffer" or "GL_ARB_pixel_format".
+ *
+ *
+ *
*/
public interface GLBase {
@@ -63,6 +107,12 @@ public interface GLBase {
*/
public boolean isGL2ES2();
+ /**
+ * Indicates whether this GL object conforms to the GL2GL3 compatible profile.
+ * @return whether this GL object conforms to the GL2GL3 profile
+ */
+ public boolean isGL2GL3();
+
/** Indicates whether this GL object supports GLSL. */
public boolean hasGLSL();
@@ -116,14 +166,100 @@ public interface GLBase {
public GL2ES2 getGL2ES2() throws GLException;
/**
- * Returns the GLContext with which this GL object is associated.
- * @return the GLContext with which this GL object is associated
+ * Casts this object to the GL2GL3 interface.
+ * @return this object cast to the GL2GL3 interface
+ * @throws GLException if this GLObject is not a GL2GL3 implementation
*/
- public GLContext getContext();
+ public GL2GL3 getGL2GL3() throws GLException;
/**
* Returns the GLProfile with which this GL object is associated.
* @return the GLProfile with which this GL object is associated
*/
public GLProfile getGLProfile();
+
+ /**
+ * Returns the GLContext with which this GL object is associated.
+ * @return the GLContext with which this GL object is associated
+ */
+ public GLContext getContext();
+
+ /**
+ * Returns true if the specified OpenGL core- or extension-function can be
+ * used successfully through this GL instance given the current host (OpenGL
+ * client) and display (OpenGL server) configuration.
+ * By "successfully" we mean that the function is both callable
+ * on the machine running the program and available on the current
+ * display.
+ *
+ * In order to call a function successfully, the function must be both
+ * callable on the machine running the program and available on
+ * the display device that is rendering the output (note: on non-networked,
+ * single-display machines these two conditions are identical; on networked and/or
+ * multi-display machines this becomes more complicated). These conditions are
+ * met if the function is either part of the core OpenGL version supported by
+ * both the host and display, or it is an OpenGL extension function that both
+ * the host and display support.
+ *
+ * A GL function is callable if it is successfully linked at runtime,
+ * hence the GLContext must be made current at least once.
+ *
+ * @param glFunctionName the name of the OpenGL function (e.g., use
+ * "glBindRenderbufferEXT" or "glBindRenderbuffer" to check if {@link
+ * #glBindRenderbuffer(int,int)} is available).
+ */
+ public boolean isFunctionAvailable(String glFunctionName);
+
+ /**
+ * Returns true if the specified OpenGL extension can be
+ * used successfully through this GL instance given the current host (OpenGL
+ * client) and display (OpenGL server) configuration.
+ *
+ * @param glExtensionName the name of the OpenGL extension (e.g.,
+ * "GL_ARB_vertex_program").
+ */
+ public boolean isExtensionAvailable(String glExtensionName);
+
+ /** Provides a platform-independent way to specify the minimum swap
+ interval for buffer swaps. An argument of 0 disables
+ sync-to-vertical-refresh completely, while an argument of 1
+ causes the application to wait until the next vertical refresh
+ until swapping buffers. The default, which is platform-specific,
+ is usually either 0 or 1. This function is not guaranteed to
+ have an effect, and in particular only affects heavyweight
+ onscreen components. */
+ public void setSwapInterval(int interval);
+
+ /**
+ * Returns an object through which platform-specific OpenGL extensions
+ * (EGL, GLX, WGL, etc.) may be accessed. The data type of the returned
+ * object and its associated capabilities are undefined. Most
+ * applications will never need to call this method. It is highly
+ * recommended that any applications which do call this method perform
+ * all accesses on the returned object reflectively to guard
+ * themselves against changes to the implementation.
+ */
+ public Object getPlatformGLExtensions();
+
+ /**
+ * Returns an object providing access to the specified OpenGL
+ * extension. This is intended to provide a mechanism for vendors who
+ * wish to provide access to new OpenGL extensions without changing
+ * the public API of the core package. For example, a user may request
+ * access to extension "GL_VENDOR_foo" and receive back an object
+ * which implements a vendor-specified interface which can call the
+ * OpenGL extension functions corresponding to that extension. It is
+ * up to the vendor to specify both the extension name and Java API
+ * for accessing it, including which class or interface contains the
+ * functions.
+ *
+ *
+ *
+ * Note: it is the intent to add new extensions as quickly as possible
+ * to the core GL API. Therefore it is unlikely that most vendors will
+ * use this extension mechanism, but it is being provided for
+ * completeness.
+ */
+ public Object getExtension(String extensionName);
}
+
--
cgit v1.2.3
From 9a4619d5ab1c0441dfb273d057e288b4bf4c6dbc Mon Sep 17 00:00:00 2001
From: sg215889
Date: Thu, 30 Jul 2009 22:09:24 -0700
Subject: Fix SwapInterval (return value, check ctx current, egl), add
getSwapInterval.
---
make/config/jogl/gl-impl-CustomJavaCode-gl2.java | 4 ++++
.../jogl/gl-impl-CustomJavaCode-gl2es12.java | 4 ++++
make/config/jogl/gl-impl-CustomJavaCode-gl3.java | 4 ++++
make/config/jogl/gl-impl-CustomJavaCode-gles1.java | 4 ++++
make/config/jogl/gl-impl-CustomJavaCode-gles2.java | 4 ++++
.../classes/com/sun/opengl/impl/GLContextImpl.java | 20 +++++++++++++----
.../com/sun/opengl/impl/egl/EGLContext.java | 6 ++++++
.../opengl/impl/macosx/cgl/MacOSXCGLContext.java | 3 ++-
.../impl/macosx/cgl/MacOSXPbufferCGLContext.java | 13 ++++++++++-
.../macosx/cgl/awt/MacOSXJava2DCGLContext.java | 4 ----
.../opengl/impl/windows/wgl/WindowsWGLContext.java | 25 ++++------------------
.../com/sun/opengl/impl/x11/glx/X11GLXContext.java | 8 +++----
src/jogl/classes/javax/media/opengl/GLBase.java | 17 ++++++++++++++-
13 files changed, 80 insertions(+), 36 deletions(-)
(limited to 'src/jogl/classes/javax/media/opengl/GLBase.java')
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gl2.java b/make/config/jogl/gl-impl-CustomJavaCode-gl2.java
index 5aec51fc7..061830cb4 100644
--- a/make/config/jogl/gl-impl-CustomJavaCode-gl2.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-gl2.java
@@ -126,6 +126,10 @@ public void setSwapInterval(int interval) {
_context.setSwapInterval(interval);
}
+public int getSwapInterval() {
+ return _context.getSwapInterval();
+}
+
public Object getPlatformGLExtensions() {
return _context.getPlatformGLExtensions();
}
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gl2es12.java b/make/config/jogl/gl-impl-CustomJavaCode-gl2es12.java
index cb4cab175..3dfcf5908 100644
--- a/make/config/jogl/gl-impl-CustomJavaCode-gl2es12.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-gl2es12.java
@@ -127,6 +127,10 @@ public void setSwapInterval(int interval) {
_context.setSwapInterval(interval);
}
+public int getSwapInterval() {
+ return _context.getSwapInterval();
+}
+
public Object getPlatformGLExtensions() {
return _context.getPlatformGLExtensions();
}
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gl3.java b/make/config/jogl/gl-impl-CustomJavaCode-gl3.java
index a15964bcc..9123f35c8 100644
--- a/make/config/jogl/gl-impl-CustomJavaCode-gl3.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-gl3.java
@@ -126,6 +126,10 @@ public void setSwapInterval(int interval) {
_context.setSwapInterval(interval);
}
+public int getSwapInterval() {
+ return _context.getSwapInterval();
+}
+
public Object getPlatformGLExtensions() {
return _context.getPlatformGLExtensions();
}
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gles1.java b/make/config/jogl/gl-impl-CustomJavaCode-gles1.java
index 5141376df..65236676a 100755
--- a/make/config/jogl/gl-impl-CustomJavaCode-gles1.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-gles1.java
@@ -101,6 +101,10 @@ public void setSwapInterval(int interval) {
_context.setSwapInterval(interval);
}
+public int getSwapInterval() {
+ return _context.getSwapInterval();
+}
+
public Object getPlatformGLExtensions() {
return _context.getPlatformGLExtensions();
}
diff --git a/make/config/jogl/gl-impl-CustomJavaCode-gles2.java b/make/config/jogl/gl-impl-CustomJavaCode-gles2.java
index b53715ae0..2f69905a9 100755
--- a/make/config/jogl/gl-impl-CustomJavaCode-gles2.java
+++ b/make/config/jogl/gl-impl-CustomJavaCode-gles2.java
@@ -105,6 +105,10 @@ public void setSwapInterval(int interval) {
_context.setSwapInterval(interval);
}
+public int getSwapInterval() {
+ return _context.getSwapInterval();
+}
+
public Object getPlatformGLExtensions() {
return _context.getPlatformGLExtensions();
}
diff --git a/src/jogl/classes/com/sun/opengl/impl/GLContextImpl.java b/src/jogl/classes/com/sun/opengl/impl/GLContextImpl.java
index c60cccec6..fa7e1ade7 100644
--- a/src/jogl/classes/com/sun/opengl/impl/GLContextImpl.java
+++ b/src/jogl/classes/com/sun/opengl/impl/GLContextImpl.java
@@ -284,11 +284,23 @@ public abstract class GLContextImpl extends GLContext {
public abstract ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3);
- /*
- * Sets the swap interval for onscreen OpenGL contexts. Has no
- * effect for offscreen contexts.
- */
public void setSwapInterval(final int interval) {
+ GLContext current = getCurrent();
+ if (current != this) {
+ throw new GLException("This context is not current. Current context: "+current+
+ ", this context "+this);
+ }
+ setSwapIntervalImpl(interval);
+ }
+
+ protected int currentSwapInterval = -1; // default: not set yet ..
+
+ public int getSwapInterval() {
+ return currentSwapInterval;
+ }
+
+ protected void setSwapIntervalImpl(final int interval) {
+ // nop per default ..
}
/** Maps the given "platform-independent" function name to a real function
diff --git a/src/jogl/classes/com/sun/opengl/impl/egl/EGLContext.java b/src/jogl/classes/com/sun/opengl/impl/egl/EGLContext.java
index 45fe0fcd3..1a75f03a9 100755
--- a/src/jogl/classes/com/sun/opengl/impl/egl/EGLContext.java
+++ b/src/jogl/classes/com/sun/opengl/impl/egl/EGLContext.java
@@ -261,6 +261,12 @@ public abstract class EGLContext extends GLContextImpl {
}
}
+ protected void setSwapIntervalImpl(int interval) {
+ if (EGL.eglSwapInterval(drawable.getDisplay(), interval)) {
+ currentSwapInterval = interval ;
+ }
+ }
+
public abstract void bindPbufferToTexture();
public abstract void releasePbufferFromTexture();
diff --git a/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/MacOSXCGLContext.java b/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/MacOSXCGLContext.java
index b424e9516..f60dd1645 100644
--- a/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/MacOSXCGLContext.java
+++ b/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/MacOSXCGLContext.java
@@ -337,11 +337,12 @@ public abstract class MacOSXCGLContext extends GLContextImpl
return "";
}
- public void setSwapInterval(int interval) {
+ protected void setSwapIntervalImpl(int interval) {
if (nsContext == 0) {
throw new GLException("OpenGL context not current");
}
CGL.setSwapInterval(nsContext, interval);
+ currentSwapInterval = interval ;
}
public ByteBuffer glAllocateMemoryNV(int arg0, float arg1, float arg2, float arg3) {
diff --git a/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/MacOSXPbufferCGLContext.java b/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/MacOSXPbufferCGLContext.java
index d702150d3..4ea3519bf 100644
--- a/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/MacOSXPbufferCGLContext.java
+++ b/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/MacOSXPbufferCGLContext.java
@@ -121,11 +121,12 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext {
}
}
- public void setSwapInterval(int interval) {
+ protected void setSwapIntervalImpl(int interval) {
if (nsContext == 0) {
throw new GLException("OpenGL context not current");
}
impl.setSwapInterval(nsContext, interval);
+ currentSwapInterval = impl.getSwapInterval() ;
}
public int getFloatingPointMode() {
@@ -210,6 +211,7 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext {
public boolean makeCurrent(long ctx);
public boolean release(long ctx);
public void setSwapInterval(long ctx, int interval);
+ public int getSwapInterval();
}
// NSOpenGLContext-based implementation
@@ -241,8 +243,14 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext {
return CGL.clearCurrentContext(ctx);
}
+ private int currentSwapInterval = 0 ;
+
public void setSwapInterval(long ctx, int interval) {
CGL.setSwapInterval(ctx, interval);
+ currentSwapInterval = interval ;
+ }
+ public int getSwapInterval() {
+ return currentSwapInterval;
}
}
@@ -344,5 +352,8 @@ public class MacOSXPbufferCGLContext extends MacOSXCGLContext {
public void setSwapInterval(long ctx, int interval) {
// For now not supported (not really relevant for off-screen contexts anyway)
}
+ public int getSwapInterval() {
+ return 0;
+ }
}
}
diff --git a/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/awt/MacOSXJava2DCGLContext.java b/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/awt/MacOSXJava2DCGLContext.java
index 4423f8da5..22b0ffe55 100644
--- a/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/awt/MacOSXJava2DCGLContext.java
+++ b/src/jogl/classes/com/sun/opengl/impl/macosx/cgl/awt/MacOSXJava2DCGLContext.java
@@ -144,10 +144,6 @@ public class MacOSXJava2DCGLContext extends MacOSXCGLContext implements Java2DGL
}
}
- public void setSwapInterval(int interval) {
- // Not supported in this context implementation
- }
-
public void setOpenGLMode(int mode) {
if (mode != MacOSXCGLDrawable.CGL_MODE)
throw new GLException("OpenGL mode switching not supported for Java2D GLContexts");
diff --git a/src/jogl/classes/com/sun/opengl/impl/windows/wgl/WindowsWGLContext.java b/src/jogl/classes/com/sun/opengl/impl/windows/wgl/WindowsWGLContext.java
index 1bc3acada..92a563445 100644
--- a/src/jogl/classes/com/sun/opengl/impl/windows/wgl/WindowsWGLContext.java
+++ b/src/jogl/classes/com/sun/opengl/impl/windows/wgl/WindowsWGLContext.java
@@ -332,29 +332,12 @@ public class WindowsWGLContext extends GLContextImpl {
}
}
- public boolean isFunctionAvailable(String glFunctionName)
- {
- boolean available = super.isFunctionAvailable(glFunctionName);
-
- // Sanity check for implementations that use proc addresses for run-time
- // linking: if the function IS available, then make sure there's a proc
- // address for it if it's an extension or not part of the OpenGL 1.1 core
- // (post GL 1.1 functions are run-time linked on windows).
- /* FIXME:
- assert(!available ||
- (getGLProcAddressTable().getAddressFor(mapToRealGLFunctionName(glFunctionName)) != 0 ||
- FunctionAvailabilityCache.isPartOfGLCore("1.1", mapToRealGLFunctionName(glFunctionName)))
- ); */
-
- return available;
- }
-
- public void setSwapInterval(int interval) {
- // FIXME: make the context current first? Currently assumes that
- // will not be necessary. Make the caller do this?
+ protected void setSwapIntervalImpl(int interval) {
WGLExt wglExt = getWGLExt();
if (wglExt.isExtensionAvailable("WGL_EXT_swap_control")) {
- wglExt.wglSwapIntervalEXT(interval);
+ if ( wglExt.wglSwapIntervalEXT(interval) ) {
+ currentSwapInterval = interval ;
+ }
}
}
diff --git a/src/jogl/classes/com/sun/opengl/impl/x11/glx/X11GLXContext.java b/src/jogl/classes/com/sun/opengl/impl/x11/glx/X11GLXContext.java
index 57abcf588..718d55aa0 100644
--- a/src/jogl/classes/com/sun/opengl/impl/x11/glx/X11GLXContext.java
+++ b/src/jogl/classes/com/sun/opengl/impl/x11/glx/X11GLXContext.java
@@ -396,11 +396,9 @@ public abstract class X11GLXContext extends GLContextImpl {
private int hasSwapIntervalSGI = 0;
- public void setSwapInterval(int interval) {
+ protected void setSwapIntervalImpl(int interval) {
getDrawableImpl().getFactoryImpl().lockToolkit();
try {
- // FIXME: make the context current first? Currently assumes that
- // will not be necessary. Make the caller do this?
GLXExt glXExt = getGLXExt();
if(0==hasSwapIntervalSGI) {
try {
@@ -409,7 +407,9 @@ public abstract class X11GLXContext extends GLContextImpl {
}
if (hasSwapIntervalSGI>0) {
try {
- glXExt.glXSwapIntervalSGI(interval);
+ if( 0 == glXExt.glXSwapIntervalSGI(interval) ) {
+ currentSwapInterval = interval;
+ }
} catch (Throwable t) { hasSwapIntervalSGI=-1; }
}
} finally {
diff --git a/src/jogl/classes/javax/media/opengl/GLBase.java b/src/jogl/classes/javax/media/opengl/GLBase.java
index 7b59344cc..92498077b 100644
--- a/src/jogl/classes/javax/media/opengl/GLBase.java
+++ b/src/jogl/classes/javax/media/opengl/GLBase.java
@@ -227,9 +227,24 @@ public interface GLBase {
until swapping buffers. The default, which is platform-specific,
is usually either 0 or 1. This function is not guaranteed to
have an effect, and in particular only affects heavyweight
- onscreen components. */
+ onscreen components.
+
+ @see #getSwapInterval
+ @throws GLException if this context is not the current
+ */
public void setSwapInterval(int interval);
+ /** Provides a platform-independent way to get the swap
+ interval set by {@link #setSwapInterval}.
+
+ If the interval is not set by {@link #setSwapInterval} yet,
+ -1 is returned, indicating that the platforms default
+ is being used.
+
+ @see #setSwapInterval
+ */
+ public int getSwapInterval();
+
/**
* Returns an object through which platform-specific OpenGL extensions
* (EGL, GLX, WGL, etc.) may be accessed. The data type of the returned
--
cgit v1.2.3