Added support for OpenGL 3.2 on MacOS X 10.7+.

This commit is contained in:
Ioannis Tsakpinis 2011-09-03 18:52:45 +00:00
parent 6612d252ac
commit 41af142324
27 changed files with 174 additions and 246 deletions

View File

@ -47,7 +47,7 @@ interface AWTCanvasImplementation {
/**
* Return an opaque handle to the canvas peer information required to create a context from it.
*/
PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format) throws LWJGLException;
PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException;
/**
* Find a proper GraphicsConfiguration from the given GraphicsDevice and PixelFormat.

View File

@ -107,7 +107,7 @@ public class AWTGLCanvas extends Canvas implements DrawableLWJGL, ComponentListe
}
}
public void setPixelFormat(final PixelFormatLWJGL pf) throws LWJGLException {
public void setPixelFormat(final PixelFormatLWJGL pf, final ContextAttribs attribs) throws LWJGLException {
throw new UnsupportedOperationException();
}
@ -311,7 +311,7 @@ public class AWTGLCanvas extends Canvas implements DrawableLWJGL, ComponentListe
return;
try {
if ( peer_info == null ) {
this.peer_info = implementation.createPeerInfo(this, pixel_format);
this.peer_info = implementation.createPeerInfo(this, pixel_format, attribs);
}
peer_info.lockAndGetHandle();
try {

View File

@ -51,6 +51,10 @@ import java.nio.IntBuffer;
* If the forwardCompatible
* attribute is used, LWJGL will not load the deprecated functionality (as defined in the OpenGL 3.0 specification). This
* means that developers can start working on cleaning up their applications without an OpenGL 3.0 complaint driver.
* <p/>
* This extension is not supported on MacOS X. However, in order to enable the GL 3.2 context on MacOS X 10.7 or newer, an
* instance of this class must be passed to LWJGL. The only valid configuration is <code>new ContextAttribs(3, 2).withProfileCore()</code>,
* anything else will be ignored.
*
* @author spasi <spasi@users.sourceforge.net>
*/
@ -243,14 +247,15 @@ public final class ContextAttribs {
return new LinuxContextAttribs();
case LWJGLUtil.PLATFORM_WINDOWS:
return new WindowsContextAttribs();
case LWJGLUtil.PLATFORM_MACOSX:
return new MacOSXContextAttribs();
default:
throw new IllegalStateException("Unsupported platform");
}
}
IntBuffer getAttribList() {
if ( LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_MACOSX )
return null;
ContextAttribsImplementation implementation = getImplementation();
int attribCount = 0;

View File

@ -93,10 +93,10 @@ public final class Display {
* unlike GL, where it is typically at the bottom of the display.
*/
private static int y = -1;
/** the width of the Display window */
private static int width = 0;
/** the height of the Display window */
private static int height = 0;
@ -115,9 +115,9 @@ public final class Display {
private static boolean window_created;
private static boolean parent_resized;
private static boolean window_resized;
private static boolean window_resizable;
/** Initial Background Color of Display */
@ -305,7 +305,7 @@ public final class Display {
DisplayMode mode = getEffectiveMode();
display_impl.createWindow(drawable, mode, tmp_parent, getWindowX(), getWindowY());
window_created = true;
width = Display.getDisplayMode().getWidth();
height = Display.getDisplayMode().getHeight();
@ -674,9 +674,9 @@ public final class Display {
throw new RuntimeException(e);
}
}
window_resized = !isFullscreen() && parent == null && display_impl.wasResized();
if ( window_resized ) {
width = display_impl.getWidth();
height = display_impl.getHeight();
@ -894,7 +894,7 @@ public final class Display {
Display.drawable = drawable;
try {
drawable.setPixelFormat(pixel_format);
drawable.setPixelFormat(pixel_format, attribs);
try {
createWindow();
try {
@ -1008,6 +1008,11 @@ public final class Display {
switchDisplayMode();
final DrawableGLES drawable = new DrawableGLES() {
public void setPixelFormat(final PixelFormatLWJGL pf, final ContextAttribs attribs) throws LWJGLException {
throw new UnsupportedOperationException();
}
public void destroy() {
synchronized ( GlobalLock.lock ) {
if ( !isCreated() )
@ -1269,11 +1274,11 @@ public final class Display {
}
}
}
/**
* Enable or disable the Display window to be resized.
*
* @param set true to make the Display window resizable;
* @param resizable set to true to make the Display window resizable;
* false to disable resizing on the Display window.
*/
public static void setResizable(boolean resizable) {
@ -1282,65 +1287,65 @@ public final class Display {
display_impl.setResizable(resizable);
}
}
/**
* @return true if the Display window is resizable.
*/
public static boolean isResizable() {
return window_resizable;
}
/**
* @return true if the Display window has been resized.
* This value will be updated after a call to Display.update().
*
*
* This will return false if running in fullscreen or with Display.setParent(Canvas parent)
*/
public static boolean wasResized() {
return window_resized;
}
/**
* @return this method will return the width of the Display window.
*
*
* If running in fullscreen mode it will return the width of the current set DisplayMode.
* If running Display.setParent(Canvas parent) is being used, the width of the parent
* will be returned.
*
*
* This value will be updated after a call to Display.update().
*/
public static int getWidth() {
if (Display.isFullscreen()) {
return Display.getDisplayMode().getWidth();
}
if (parent != null) {
return parent.getWidth();
}
return width;
}
/**
* @return this method will return the height of the Display window.
*
*
* If running in fullscreen mode it will return the height of the current set DisplayMode.
* If running Display.setParent(Canvas parent) is being used, the height of the parent
* will be returned.
*
*
* This value will be updated after a call to Display.update().
*/
public static int getHeight() {
if (Display.isFullscreen()) {
return Display.getDisplayMode().getHeight();
}
}
if (parent != null) {
return parent.getHeight();
}
return height;
}
}

View File

@ -108,7 +108,7 @@ interface DisplayImplementation extends InputImplementation {
* Create the native PeerInfo.
* @throws LWJGLException
*/
PeerInfo createPeerInfo(PixelFormat pixel_format) throws LWJGLException;
PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException;
// void destroyPeerInfo();
@ -136,7 +136,7 @@ interface DisplayImplementation extends InputImplementation {
/**
* Method to create a Pbuffer
*/
PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format,
PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs) throws LWJGLException;
@ -159,25 +159,25 @@ interface DisplayImplementation extends InputImplementation {
* @return number of icons used.
*/
int setIcon(ByteBuffer[] icons);
/**
* Enable or disable the Display window to be resized.
*
* @param set true to make the Display window resizable;
* @param resizable set to true to make the Display window resizable;
* false to disable resizing on the Display window.
*/
void setResizable(boolean resizable);
/**
* @return true if the Display window has been resized since this method was last called.
*/
boolean wasResized();
/**
* @return this method will return a the width of the Display window.
*/
int getWidth();
/**
* @return this method will return a the height of the Display window.
*/

View File

@ -53,8 +53,12 @@ abstract class DrawableGL implements DrawableLWJGL {
}
public void setPixelFormat(final PixelFormatLWJGL pf) throws LWJGLException {
throw new UnsupportedOperationException();
}
public void setPixelFormat(final PixelFormatLWJGL pf, final ContextAttribs attribs) throws LWJGLException {
this.pixel_format = (PixelFormat)pf;
this.peer_info = Display.getImplementation().createPeerInfo(pixel_format);
this.peer_info = Display.getImplementation().createPeerInfo(pixel_format, attribs);
}
public PixelFormatLWJGL getPixelFormat() {

View File

@ -42,6 +42,8 @@ interface DrawableLWJGL extends Drawable {
void setPixelFormat(PixelFormatLWJGL pf) throws LWJGLException;
void setPixelFormat(PixelFormatLWJGL pf, ContextAttribs attribs) throws LWJGLException;
PixelFormatLWJGL getPixelFormat();
/**

View File

@ -76,7 +76,7 @@ final class LinuxCanvasImplementation implements AWTCanvasImplementation {
}
}
public PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format) throws LWJGLException {
public PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException {
return new LinuxAWTGLCanvasPeerInfo(component);
}

View File

@ -33,8 +33,6 @@ package org.lwjgl.opengl;
/**
* An implementation of ContextAttribs using GLX_create_context.
* <p/><p/>
* ---- WIP - GLX_create_context has not been defined yet ----
*
* @author spasi <spasi@users.sourceforge.net>
*/
@ -42,14 +40,13 @@ final class LinuxContextAttribs implements ContextAttribsImplementation {
private static final int GLX_CONTEXT_MAJOR_VERSION_ARB = 0x2091;
private static final int GLX_CONTEXT_MINOR_VERSION_ARB = 0x2092;
private static final int GLX_CONTEXT_LAYER_PLANE_ARB = 0x2093;
private static final int GLX_CONTEXT_FLAGS_ARB = 0x2094;
private static final int GLX_CONTEXT_PROFILE_MASK_ARB = 0x9126;
private static final int GLX_CONTEXT_FLAGS_ARB = 0x2094;
private static final int GLX_CONTEXT_PROFILE_MASK_ARB = 0x9126;
private static final int GLX_CONTEXT_DEBUG_BIT_ARB = 0x0001;
private static final int GLX_CONTEXT_DEBUG_BIT_ARB = 0x0001;
private static final int GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = 0x0002;
private static final int GLX_CONTEXT_CORE_PROFILE_BIT_ARB = 0x00000001;
private static final int GLX_CONTEXT_CORE_PROFILE_BIT_ARB = 0x00000001;
private static final int GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x00000002;
LinuxContextAttribs() {
@ -64,7 +61,7 @@ final class LinuxContextAttribs implements ContextAttribsImplementation {
}
public int getLayerPlaneAttrib() {
return GLX_CONTEXT_LAYER_PLANE_ARB;
throw new UnsupportedOperationException();
}
public int getFlagsAttrib() {

View File

@ -516,7 +516,7 @@ final class LinuxDisplay implements DisplayImplementation {
private static long getHandle(Canvas parent) throws LWJGLException {
AWTCanvasImplementation awt_impl = AWTGLCanvas.createImplementation();
LinuxPeerInfo parent_peer_info = (LinuxPeerInfo)awt_impl.createPeerInfo(parent, null);
LinuxPeerInfo parent_peer_info = (LinuxPeerInfo)awt_impl.createPeerInfo(parent, null, null);
ByteBuffer parent_peer_info_handle = parent_peer_info.lockAndGetHandle();
try {
return parent_peer_info.getDrawable();
@ -757,7 +757,7 @@ final class LinuxDisplay implements DisplayImplementation {
return result;
}
public PeerInfo createPeerInfo(PixelFormat pixel_format) throws LWJGLException {
public PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException {
peer_info = new LinuxDisplayPeerInfo(pixel_format);
return peer_info;
}
@ -1243,7 +1243,7 @@ final class LinuxDisplay implements DisplayImplementation {
return false;
}
public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format,
public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs) throws LWJGLException {
return new LinuxPbufferPeerInfo(width, height, pixel_format);

View File

@ -44,8 +44,8 @@ import java.awt.Canvas;
final class MacOSXAWTGLCanvasPeerInfo extends MacOSXCanvasPeerInfo {
private final Canvas component;
MacOSXAWTGLCanvasPeerInfo(Canvas component, PixelFormat pixel_format, boolean support_pbuffer) throws LWJGLException {
super(pixel_format, support_pbuffer);
MacOSXAWTGLCanvasPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs, boolean support_pbuffer) throws LWJGLException {
super(pixel_format, attribs, support_pbuffer);
this.component = component;
}

View File

@ -44,11 +44,11 @@ import org.lwjgl.LWJGLException;
* $Id$
*/
final class MacOSXCanvasImplementation implements AWTCanvasImplementation {
public PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format) throws LWJGLException {
public PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException {
try {
return new MacOSXAWTGLCanvasPeerInfo(component, pixel_format, true);
return new MacOSXAWTGLCanvasPeerInfo(component, pixel_format, attribs, true);
} catch (LWJGLException e) {
return new MacOSXAWTGLCanvasPeerInfo(component, pixel_format, false);
return new MacOSXAWTGLCanvasPeerInfo(component, pixel_format, attribs, false);
}
}

View File

@ -45,8 +45,8 @@ import org.lwjgl.LWJGLException;
abstract class MacOSXCanvasPeerInfo extends MacOSXPeerInfo {
private final AWTSurfaceLock awt_surface = new AWTSurfaceLock();
protected MacOSXCanvasPeerInfo(PixelFormat pixel_format, boolean support_pbuffer) throws LWJGLException {
super(pixel_format, true, true, support_pbuffer, true);
protected MacOSXCanvasPeerInfo(PixelFormat pixel_format, ContextAttribs attribs, boolean support_pbuffer) throws LWJGLException {
super(pixel_format, attribs, true, true, support_pbuffer, true);
}
protected void initHandle(Canvas component) throws LWJGLException {

View File

@ -1,94 +0,0 @@
/*
* Copyright (c) 2002-2008 LWJGL Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.lwjgl.opengl;
/**
* An implementation of ContextAttribs for MacOS X.
* <p/><p/>
* ---- WIP - No XGL_create_context has been defined for MacOS X yet ----
*
* @author spasi <spasi@users.sourceforge.net>
*/
final class MacOSXContextAttribs implements ContextAttribsImplementation {
private static final int XGL_CONTEXT_MAJOR_VERSION_ARB = 0x2091;
private static final int XGL_CONTEXT_MINOR_VERSION_ARB = 0x2092;
private static final int XGL_CONTEXT_LAYER_PLANE_ARB = 0x2093;
private static final int XGL_CONTEXT_FLAGS_ARB = 0x2094;
private static final int XGL_CONTEXT_PROFILE_MASK_ARB = 0x9126;
private static final int XGL_CONTEXT_DEBUG_BIT_ARB = 0x0001;
private static final int XGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = 0x0002;
private static final int XGL_CONTEXT_CORE_PROFILE_BIT_ARB = 0x00000001;
private static final int XGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x00000002;
MacOSXContextAttribs() {
}
public int getMajorVersionAttrib() {
return XGL_CONTEXT_MAJOR_VERSION_ARB;
}
public int getMinorVersionAttrib() {
return XGL_CONTEXT_MINOR_VERSION_ARB;
}
public int getLayerPlaneAttrib() {
return XGL_CONTEXT_LAYER_PLANE_ARB;
}
public int getFlagsAttrib() {
return XGL_CONTEXT_FLAGS_ARB;
}
public int getDebugBit() {
return XGL_CONTEXT_DEBUG_BIT_ARB;
}
public int getForwardCompatibleBit() {
return XGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
}
public int getProfileMaskAttrib() {
return XGL_CONTEXT_PROFILE_MASK_ARB;
}
public int getProfileCoreBit() {
return XGL_CONTEXT_CORE_PROFILE_BIT_ARB;
}
public int getProfileCompatibilityBit() {
return XGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;
}
}

View File

@ -46,13 +46,13 @@ final class MacOSXContextImplementation implements ContextImplementation {
public ByteBuffer create(PeerInfo peer_info, IntBuffer attribs, ByteBuffer shared_context_handle) throws LWJGLException {
ByteBuffer peer_handle = peer_info.lockAndGetHandle();
try {
return nCreate(peer_handle, attribs, shared_context_handle);
return nCreate(peer_handle, shared_context_handle);
} finally {
peer_info.unlock();
}
}
private static native ByteBuffer nCreate(ByteBuffer peer_handle, IntBuffer attribs, ByteBuffer shared_context_handle) throws LWJGLException;
private static native ByteBuffer nCreate(ByteBuffer peer_handle, ByteBuffer shared_context_handle) throws LWJGLException;
public void swapBuffers() throws LWJGLException {
ContextGL current_context = ContextGL.getCurrentContext();

View File

@ -240,11 +240,11 @@ final class MacOSXDisplay implements DisplayImplementation {
return frame != null && frame.getCanvas().syncIsDirty();
}
public PeerInfo createPeerInfo(PixelFormat pixel_format) throws LWJGLException {
public PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException {
try {
return new MacOSXDisplayPeerInfo(pixel_format, true);
return new MacOSXDisplayPeerInfo(pixel_format, attribs, true);
} catch (LWJGLException e) {
return new MacOSXDisplayPeerInfo(pixel_format, false);
return new MacOSXDisplayPeerInfo(pixel_format, attribs, false);
}
}
@ -434,10 +434,10 @@ final class MacOSXDisplay implements DisplayImplementation {
return false;
}
public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format,
public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs) throws LWJGLException {
return new MacOSXPbufferPeerInfo(width, height, pixel_format);
return new MacOSXPbufferPeerInfo(width, height, pixel_format, attribs);
}
public void setPbufferAttrib(PeerInfo handle, int attrib, int value) {
@ -507,13 +507,13 @@ final class MacOSXDisplay implements DisplayImplementation {
public boolean isInsideWindow() {
return true;
}
public void setResizable(boolean resizable) {
frame.setResizable(resizable);
}
public boolean wasResized() {
return canvas_listener.wasResized();
}
}

View File

@ -44,8 +44,8 @@ import org.lwjgl.LWJGLException;
final class MacOSXDisplayPeerInfo extends MacOSXCanvasPeerInfo {
private boolean locked;
MacOSXDisplayPeerInfo(PixelFormat pixel_format, boolean support_pbuffer) throws LWJGLException {
super(pixel_format, support_pbuffer);
MacOSXDisplayPeerInfo(PixelFormat pixel_format, ContextAttribs attribs, boolean support_pbuffer) throws LWJGLException {
super(pixel_format, attribs, support_pbuffer);
}
protected void doLockAndInitHandle() throws LWJGLException {

View File

@ -42,8 +42,8 @@ import org.lwjgl.LWJGLException;
* $Id$
*/
final class MacOSXPbufferPeerInfo extends MacOSXPeerInfo {
MacOSXPbufferPeerInfo(int width, int height, PixelFormat pixel_format) throws LWJGLException {
super(pixel_format, false, false, true, false);
MacOSXPbufferPeerInfo(int width, int height, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException {
super(pixel_format, attribs, false, false, true, false);
nCreate(getHandle(), width, height);
}
private static native void nCreate(ByteBuffer handle, int width, int height) throws LWJGLException;

View File

@ -43,18 +43,23 @@ import org.lwjgl.LWJGLUtil;
* $Id$
*/
abstract class MacOSXPeerInfo extends PeerInfo {
MacOSXPeerInfo(PixelFormat pixel_format, boolean use_display_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException {
MacOSXPeerInfo(PixelFormat pixel_format, ContextAttribs attribs, boolean use_display_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException {
super(createHandle());
if (pixel_format.isFloatingPoint() && !LWJGLUtil.isMacOSXEqualsOrBetterThan(10, 4))
throw new LWJGLException("Floating point pixel format requested, but is not supported");
choosePixelFormat(pixel_format, use_display_bpp, support_window, support_pbuffer, double_buffered);
throw new LWJGLException("Floating point pixel format requested, but it requires MacOS X 10.4 or newer");
boolean gl32 = attribs.getMajorVersion() == 3 && attribs.getMinorVersion() == 2 && attribs.isProfileCore();
if ( gl32 && !LWJGLUtil.isMacOSXEqualsOrBetterThan(10, 7) )
throw new LWJGLException("OpenGL 3.2 requested, but it requires MacOS X 10.7 or newer");
choosePixelFormat(pixel_format, gl32, use_display_bpp, support_window, support_pbuffer, double_buffered);
}
private static native ByteBuffer createHandle();
private void choosePixelFormat(PixelFormat pixel_format, boolean use_display_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException {
nChoosePixelFormat(getHandle(), pixel_format, use_display_bpp, support_window, support_pbuffer, double_buffered);
private void choosePixelFormat(PixelFormat pixel_format, boolean gl32, boolean use_display_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException {
nChoosePixelFormat(getHandle(), pixel_format, gl32, use_display_bpp, support_window, support_pbuffer, double_buffered);
}
private static native void nChoosePixelFormat(ByteBuffer peer_info_handle, PixelFormat pixel_format, boolean use_display_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException;
private static native void nChoosePixelFormat(ByteBuffer peer_info_handle, PixelFormat pixel_format, boolean gl32, boolean use_display_bpp, boolean support_window, boolean support_pbuffer, boolean double_buffered) throws LWJGLException;
public void destroy() {
nDestroy(getHandle());

View File

@ -216,7 +216,7 @@ public final class Pbuffer extends DrawableGL {
throw new NullPointerException("Pixel format must be non-null");
this.width = width;
this.height = height;
this.peer_info = createPbuffer(width, height, pixel_format, renderTexture);
this.peer_info = createPbuffer(width, height, pixel_format, attribs, renderTexture);
Context shared_context = null;
if ( shared_drawable == null )
shared_drawable = Display.getDrawable(); // May be null
@ -225,15 +225,15 @@ public final class Pbuffer extends DrawableGL {
this.context = new ContextGL(peer_info, attribs, (ContextGL)shared_context);
}
private static PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, RenderTexture renderTexture) throws LWJGLException {
private static PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs, RenderTexture renderTexture) throws LWJGLException {
if ( renderTexture == null ) {
// Though null is a perfectly valid argument, Matrox Parhelia drivers expect
// a 0 terminated list, or else they crash. Supplying NULL or 0, should
// cause the drivers to use default settings
IntBuffer defaultAttribs = BufferUtils.createIntBuffer(1);
return Display.getImplementation().createPbuffer(width, height, pixel_format, null, defaultAttribs);
return Display.getImplementation().createPbuffer(width, height, pixel_format, attribs, null, defaultAttribs);
} else
return Display.getImplementation().createPbuffer(width, height, pixel_format,
return Display.getImplementation().createPbuffer(width, height, pixel_format, attribs,
renderTexture.pixelFormatCaps,
renderTexture.pBufferAttribs);
}

View File

@ -66,7 +66,7 @@ final class WindowsCanvasImplementation implements AWTCanvasImplementation {
});
}
public PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format) throws LWJGLException {
public PeerInfo createPeerInfo(Canvas component, PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException {
return new WindowsAWTGLCanvasPeerInfo(component, pixel_format);
}

View File

@ -40,14 +40,14 @@ final class WindowsContextAttribs implements ContextAttribsImplementation {
private static final int WGL_CONTEXT_MAJOR_VERSION_ARB = 0x2091;
private static final int WGL_CONTEXT_MINOR_VERSION_ARB = 0x2092;
private static final int WGL_CONTEXT_LAYER_PLANE_ARB = 0x2093;
private static final int WGL_CONTEXT_FLAGS_ARB = 0x2094;
private static final int WGL_CONTEXT_PROFILE_MASK_ARB = 0x9126;
private static final int WGL_CONTEXT_LAYER_PLANE_ARB = 0x2093;
private static final int WGL_CONTEXT_FLAGS_ARB = 0x2094;
private static final int WGL_CONTEXT_PROFILE_MASK_ARB = 0x9126;
private static final int WGL_CONTEXT_DEBUG_BIT_ARB = 0x0001;
private static final int WGL_CONTEXT_DEBUG_BIT_ARB = 0x0001;
private static final int WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = 0x0002;
private static final int WGL_CONTEXT_CORE_PROFILE_BIT_ARB = 0x00000001;
private static final int WGL_CONTEXT_CORE_PROFILE_BIT_ARB = 0x00000001;
private static final int WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x00000002;
WindowsContextAttribs() {

View File

@ -247,7 +247,7 @@ final class WindowsDisplay implements DisplayImplementation {
private static long getHwnd(Canvas parent) throws LWJGLException {
AWTCanvasImplementation awt_impl = AWTGLCanvas.createImplementation();
WindowsPeerInfo parent_peer_info = (WindowsPeerInfo)awt_impl.createPeerInfo(parent, null);
WindowsPeerInfo parent_peer_info = (WindowsPeerInfo)awt_impl.createPeerInfo(parent, null, null);
ByteBuffer parent_peer_info_handle = parent_peer_info.lockAndGetHandle();
try {
return parent_peer_info.getHwnd();
@ -463,7 +463,7 @@ final class WindowsDisplay implements DisplayImplementation {
return saved;
}
public PeerInfo createPeerInfo(PixelFormat pixel_format) throws LWJGLException {
public PeerInfo createPeerInfo(PixelFormat pixel_format, ContextAttribs attribs) throws LWJGLException {
peer_info = new WindowsDisplayPeerInfo(false);
return peer_info;
}
@ -657,7 +657,7 @@ final class WindowsDisplay implements DisplayImplementation {
return ((WindowsPbufferPeerInfo)handle).isBufferLost();
}
public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format,
public PeerInfo createPbuffer(int width, int height, PixelFormat pixel_format, ContextAttribs attribs,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs) throws LWJGLException {
return new WindowsPbufferPeerInfo(width, height, pixel_format, pixelFormatCaps, pBufferAttribs);

View File

@ -1,31 +1,31 @@
/*
/*
* Copyright (c) 2002-2008 LWJGL Project
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
@ -57,5 +57,5 @@ typedef struct {
};
} MacOSXPeerInfo;
NSOpenGLPixelFormat *choosePixelFormat(JNIEnv *env, jobject pixel_format, bool use_display_bpp, bool support_window, bool support_pbuffer, bool double_buffered);
NSOpenGLPixelFormat *choosePixelFormat(JNIEnv *env, jobject pixel_format, bool gl32, bool use_display_bpp, bool support_window, bool support_pbuffer, bool double_buffered);
#endif

View File

@ -1,31 +1,31 @@
/*
/*
* Copyright (c) 2002-2008 LWJGL Project
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
@ -51,12 +51,12 @@ void *extgl_GetProcAddress(const char *name) {
return address;
}
static CFBundleRef loadFramework(JNIEnv *env) {
static CFBundleRef loadFramework(JNIEnv *env) {
CFStringRef framework_path = CFSTR("/System/Library/Frameworks/OpenGL.framework");
if (framework_path == NULL) {
printfDebugJava(env, "Failed to allocate string");
return NULL;
}
}
CFURLRef url = CFURLCreateWithFileSystemPath(NULL, framework_path, kCFURLPOSIXPathStyle, TRUE);
if (url == NULL) {
printfDebugJava(env, "Failed to allocate URL");
@ -87,14 +87,14 @@ void extgl_Close(void)
}
}
NSOpenGLPixelFormat *choosePixelFormat(JNIEnv *env, jobject pixel_format, bool use_display_bpp, bool support_window, bool support_pbuffer, bool double_buffered) {
NSOpenGLPixelFormat *choosePixelFormat(JNIEnv *env, jobject pixel_format, bool gl32, bool use_display_bpp, bool support_window, bool support_pbuffer, bool double_buffered) {
int bpp;
jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format);
if (use_display_bpp)
bpp = CGDisplayBitsPerPixel(kCGDirectMainDisplay);
else
bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "bpp", "I"));
int alpha = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "alpha", "I"));
int depth = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "depth", "I"));
int stencil = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "stencil", "I"));
@ -125,6 +125,10 @@ NSOpenGLPixelFormat *choosePixelFormat(JNIEnv *env, jobject pixel_format, bool u
putAttrib(&attribs, NSOpenGLPFASampleBuffers); putAttrib(&attribs, samples > 0 ? 1 : 0);
putAttrib(&attribs, NSOpenGLPFASamples); putAttrib(&attribs, samples);
putAttrib(&attribs, NSOpenGLPFAAuxBuffers); putAttrib(&attribs, num_aux_buffers);
if (gl32) {
putAttrib(&attribs, 99); // NSOpenGLPFAOpenGLProfile
putAttrib(&attribs, 0x3200); // NSOpenGLProfileVersion3_2Core
}
if (support_window)
putAttrib(&attribs, NSOpenGLPFAWindow);
if (support_pbuffer)

View File

@ -1,31 +1,31 @@
/*
/*
* Copyright (c) 2002-2008 LWJGL Project
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
@ -49,7 +49,7 @@ typedef struct {
} MacOSXContext;
JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nCreate
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject attribs, jobject shared_context_handle) {
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject shared_context_handle) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
MacOSXPeerInfo *peer_info;
MacOSXContext *shared_context_info;
@ -75,7 +75,7 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nCre
context_info->context = context;
context_info->peer_info = peer_info;
[pool release];
return context_handle;
return context_handle;
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXContextImplementation_nSwapBuffers

View File

@ -1,31 +1,31 @@
/*
/*
* Copyright (c) 2002-2008 LWJGL Project
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* * Neither the name of 'LWJGL' nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
@ -52,10 +52,10 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXPeerInfo_createHandle
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXPeerInfo_nChoosePixelFormat
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject pixel_format, jboolean use_display_bpp, jboolean support_window, jboolean support_pbuffer, jboolean double_buffered) {
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jobject pixel_format, jboolean gl32, jboolean use_display_bpp, jboolean support_window, jboolean support_pbuffer, jboolean double_buffered) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
NSOpenGLPixelFormat *macosx_pixel_format = choosePixelFormat(env, pixel_format, use_display_bpp, support_window, support_pbuffer, double_buffered);
NSOpenGLPixelFormat *macosx_pixel_format = choosePixelFormat(env, pixel_format, gl32, use_display_bpp, support_window, support_pbuffer, double_buffered);
if (pixel_format == nil) {
throwException(env, "Could not find pixel format");
return;