aboutsummaryrefslogtreecommitdiffstats
path: root/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2006-11-19 20:51:57 +0000
committerKenneth Russel <[email protected]>2006-11-19 20:51:57 +0000
commita303cd13ff62f94a0459978735620e37d72bbb77 (patch)
tree32b580af4e878d479890c12b8eae9c98e10a4874 /src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java
parentbf82eceb6f78d5ee6e4c0f9f02590d2a58e647d3 (diff)
Fixed Issue 213: Expose GLCaps from GLDrawable
Added getChosenGLCapabilities() to the GLDrawable interface. Implemented on Windows, Unix and Mac OS X platforms with various techniques. Attempts to provide correct answers in all cases, even when the GLCapabilitiesChooser mechanism is not supported. Required addition of new platform-specific Java code in most cases to either re-convert existing PIXELFORMATDESCRIPTORS / XVisualInfos, or to query the pixel format or visual chosen for drawables like pbuffers for which the chooser mechanism is not (yet) implemented. Tested on Windows, Solaris/x86, and Mac OS X with on-screen, off-screen and pbuffer drawables. (Full support for the Java2D/JOGL bridge is not yet in place; the answer returned from the GLJPanel in this case is currently the default GLCapabilities, and it is likely that "external" GLDrawables will return null.) git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/trunk@989 232f8b59-042b-4e1e-8c03-345bb8c30851
Diffstat (limited to 'src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java')
-rw-r--r--src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java b/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java
index e5b8b6424..1efc1c759 100644
--- a/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java
+++ b/src/classes/com/sun/opengl/impl/windows/WindowsGLDrawable.java
@@ -78,13 +78,20 @@ public abstract class WindowsGLDrawable extends GLDrawableImpl {
PIXELFORMATDESCRIPTOR pfd = null;
int pixelFormat = 0;
if (onscreen) {
- if (WGL.GetPixelFormat(hdc) != 0) {
+ if ((pixelFormat = WGL.GetPixelFormat(hdc)) != 0) {
// The Java2D/OpenGL pipeline probably already set a pixel
// format for this canvas.
if (DEBUG) {
System.err.println("NOTE: pixel format already chosen (by Java2D/OpenGL pipeline?) for window: " +
WGL.GetPixelFormat(hdc));
}
+ pfd = newPixelFormatDescriptor();
+ if (WGL.DescribePixelFormat(hdc, pixelFormat, pfd.size(), pfd) == 0) {
+ // FIXME: should this just be a warning? Not really critical...
+ throw new GLException("Unable to describe pixel format " + pixelFormat +
+ " of window set by Java2D/OpenGL pipeline");
+ }
+ setChosenGLCapabilities(pfd2GLCapabilities(pfd));
pixelFormatChosen = true;
return;
}
@@ -280,6 +287,7 @@ public abstract class WindowsGLDrawable extends GLDrawableImpl {
}
throw new GLException("Unable to set pixel format " + pixelFormat + " for device context " + toHexString(hdc) + ": error code " + lastError);
}
+ setChosenGLCapabilities(pfd2GLCapabilities(pfd));
pixelFormatChosen = true;
}
@@ -518,10 +526,13 @@ public abstract class WindowsGLDrawable extends GLDrawableImpl {
int attr = iattribs[i];
switch (attr) {
case WGLExt.WGL_DRAW_TO_WINDOW_ARB:
- if (iresults[i] != GL.GL_TRUE)
+ if (requireRenderToWindow && iresults[i] != GL.GL_TRUE)
return null;
break;
+ case WGLExt.WGL_DRAW_TO_PBUFFER_ARB:
+ break;
+
case WGLExt.WGL_ACCELERATION_ARB:
res.setHardwareAccelerated(iresults[i] == WGLExt.WGL_FULL_ACCELERATION_ARB);
break;
@@ -548,8 +559,17 @@ public abstract class WindowsGLDrawable extends GLDrawableImpl {
break;
case WGLExt.WGL_PIXEL_TYPE_ARB:
- if (iresults[i] != WGLExt.WGL_TYPE_RGBA_ARB)
- return null;
+ // Fail softly with unknown results here
+ if (iresults[i] == WGLExt.WGL_TYPE_RGBA_ARB ||
+ iresults[i] == WGLExt.WGL_TYPE_RGBA_FLOAT_ATI) {
+ res.setPbufferFloatingPointBuffers(true);
+ }
+ break;
+
+ case WGLExt.WGL_FLOAT_COMPONENTS_NV:
+ if (iresults[i] != 0) {
+ res.setPbufferFloatingPointBuffers(true);
+ }
break;
case WGLExt.WGL_RED_BITS_ARB: