Added a Pbuffer argument to the Pbuffer constructor to enable sharing between pbuffers when the display is not created. Moved Pbuffer native methods into DisplayImplementation.

This commit is contained in:
Elias Naur 2005-01-11 13:53:12 +00:00
parent 28aff73635
commit 925139bc7d
11 changed files with 189 additions and 119 deletions

View File

@ -233,8 +233,36 @@ public interface DisplayImplementation {
void destroyCursor(Object cursor_handle);
/* Pbuffer caps */
/* Pbuffer */
int getPbufferCaps();
/**
* Method to test for buffer integrity
*/
public boolean isBufferLost(ByteBuffer handle);
/**
* Method to make a pbuffer current.
*/
public void makePbufferCurrent(ByteBuffer handle) throws LWJGLException;
/**
* Method to create a Pbuffer
*/
public ByteBuffer createPbuffer(int width, int height, PixelFormat pixel_format,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs, ByteBuffer shared_pbuffer_handle) throws LWJGLException;
/**
* Destroy pbuffer
*/
public void destroyPbuffer(ByteBuffer handle);
public void setPbufferAttrib(ByteBuffer handle, int attrib, int value);
public void bindTexImageToPbuffer(ByteBuffer handle, int buffer);
public void releaseTexImageFromPbuffer(ByteBuffer handle, int buffer);
boolean openURL(String url);
}

View File

@ -48,6 +48,7 @@ import org.lwjgl.LWJGLException;
final class LinuxDisplay implements DisplayImplementation {
private static final int CURSOR_HANDLE_SIZE = 8;
private static final int PBUFFER_HANDLE_SIZE = 24;
public native void createWindow(DisplayMode mode, boolean fullscreen, int x, int y) throws LWJGLException;
public native void destroyWindow();
@ -113,6 +114,37 @@ final class LinuxDisplay implements DisplayImplementation {
public native void destroyCursor(Object cursorHandle);
public native int getPbufferCaps();
public boolean isBufferLost(ByteBuffer handle) {
return false;
}
public native void makePbufferCurrent(ByteBuffer handle) throws LWJGLException;
public ByteBuffer createPbuffer(int width, int height, PixelFormat pixel_format,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs, ByteBuffer shared_pbuffer_handle) throws LWJGLException {
ByteBuffer handle = BufferUtils.createByteBuffer(PBUFFER_HANDLE_SIZE);
nCreatePbuffer(handle, width, height, pixel_format, pixelFormatCaps, pBufferAttribs, shared_pbuffer_handle);
return handle;
}
private native void nCreatePbuffer(ByteBuffer handle, int width, int height, PixelFormat pixel_format,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs, ByteBuffer shared_pbuffer_handle) throws LWJGLException;
public native void destroyPbuffer(ByteBuffer handle);
public void setPbufferAttrib(ByteBuffer handle, int attrib, int value) {
throw new UnsupportedOperationException();
}
public void bindTexImageToPbuffer(ByteBuffer handle, int buffer) {
throw new UnsupportedOperationException();
}
public void releaseTexImageFromPbuffer(ByteBuffer handle, int buffer) {
throw new UnsupportedOperationException();
}
public boolean openURL(String url) {
// Linux may as well resort to pure Java hackery, as there's no Linux native way of doing it

View File

@ -55,9 +55,11 @@ import java.util.ArrayList;
import java.util.List;
import org.lwjgl.LWJGLException;
import org.lwjgl.BufferUtils;
import org.lwjgl.input.Keyboard;
final class MacOSXDisplay implements DisplayImplementation {
private static final int PBUFFER_HANDLE_SIZE = 24;
private static final int GAMMA_LENGTH = 256;
private MacOSXFrame frame;
@ -426,4 +428,36 @@ final class MacOSXDisplay implements DisplayImplementation {
return null;
}
}
public boolean isBufferLost(ByteBuffer handle) {
return false;
}
public native void makePbufferCurrent(ByteBuffer handle) throws LWJGLException;
public ByteBuffer createPbuffer(int width, int height, PixelFormat pixel_format,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs, ByteBuffer shared_pbuffer_handle) throws LWJGLException {
ByteBuffer handle = BufferUtils.createByteBuffer(PBUFFER_HANDLE_SIZE);
nCreatePbuffer(handle, width, height, pixel_format, pixelFormatCaps, pBufferAttribs, shared_pbuffer_handle);
return handle;
}
private native void nCreatePbuffer(ByteBuffer handle, int width, int height, PixelFormat pixel_format,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs, ByteBuffer shared_pbuffer_handle) throws LWJGLException;
public native void destroyPbuffer(ByteBuffer handle);
public void setPbufferAttrib(ByteBuffer handle, int attrib, int value) {
throw new UnsupportedOperationException();
}
public void bindTexImageToPbuffer(ByteBuffer handle, int buffer) {
throw new UnsupportedOperationException();
}
public void releaseTexImageFromPbuffer(ByteBuffer handle, int buffer) {
throw new UnsupportedOperationException();
}
}

View File

@ -136,11 +136,6 @@ public final class Pbuffer {
*/
public static final int DEPTH_BUFFER = RenderTexture.WGL_DEPTH_COMPONENT_NV;
/**
* The maximum number of bytes in the native handle
*/
private static final int HANDLE_SIZE = 24;
/**
* Handle to the native GL rendering context
*/
@ -163,38 +158,38 @@ public final class Pbuffer {
/**
* Create an instance of a Pbuffer with a unique OpenGL context. The buffer is single-buffered.
* <p/>
* NOTE: The Pbuffer will have its own context that shares display lists and textures with the Display context (if it is created),
* but it will have its own OpenGL state. Therefore, state changes to a pbuffer will not be seen in the window context and vice versa.
* <p/>
* This kind of Pbuffer is primarily intended for non interactive use, since the makeCurrent context switch will be more expensive
* than a Pbuffer using the Display context.
* NOTE: The Pbuffer will have its own context that shares display lists and textures with <code>shared_context</code>,
* or, if <code>shared_context</code> is <code>null</code>, the Display context if it is created. The Pbuffer
* will have its own OpenGL state. Therefore, state changes to a pbuffer will not be seen in the window context and vice versa.
* <p/>
* The renderTexture parameter defines the necessary state for enabling render-to-texture. When this parameter is null,
* render-to-texture is not available. Before using render-to-texture, the Pbuffer capabilities must be queried to ensure that
* it is supported.
* <p/>
*
* @param width Pbuffer width
* @param height Pbuffer height
* @param pixel_format Minimum Pbuffer context properties
* @param renderTexture
* @param shared_context If non-null the Pbuffer will share display lists and textures with it. Otherwise, the Pbuffer will share
* with the Display context (if created).
*/
public Pbuffer(int width, int height, PixelFormat pixel_format, RenderTexture renderTexture) throws LWJGLException {
public Pbuffer(int width, int height, PixelFormat pixel_format, RenderTexture renderTexture, Pbuffer shared_context) throws LWJGLException {
this.width = width;
this.height = height;
this.handle = createPbuffer(width, height, pixel_format, renderTexture);
this.handle = createPbuffer(width, height, pixel_format, renderTexture, shared_context != null ? shared_context.handle : null);
}
private static ByteBuffer createPbuffer(int width, int height, PixelFormat pixel_format, RenderTexture renderTexture) throws LWJGLException {
private static ByteBuffer createPbuffer(int width, int height, PixelFormat pixel_format, RenderTexture renderTexture, ByteBuffer shared_context_handle) throws LWJGLException {
GLContext.loadOpenGLLibrary();
try {
ByteBuffer handle = BufferUtils.createByteBuffer(HANDLE_SIZE);
if ( renderTexture == null )
nCreate(handle, width, height, pixel_format, null, null);
return Display.getImplementation().createPbuffer(width, height, pixel_format, null, null, shared_context_handle);
else
nCreate(handle, width, height, pixel_format,
return Display.getImplementation().createPbuffer(width, height, pixel_format,
renderTexture.pixelFormatCaps,
renderTexture.pBufferAttribs);
return handle;
renderTexture.pBufferAttribs,
shared_context_handle);
} catch (LWJGLException e) {
GLContext.unloadOpenGLLibrary();
throw e;
@ -209,28 +204,18 @@ public final class Pbuffer {
* @return true if the buffer is lost and destroyed, false if the buffer is valid.
*/
public boolean isBufferLost() {
return nIsBufferLost(handle);
return Display.getImplementation().isBufferLost(handle);
}
/**
* Native method to test for buffer integrity
*/
private static native boolean nIsBufferLost(ByteBuffer handle);
/**
* Method to make the Pbuffer context current. All subsequent OpenGL calls will go to this buffer.
* @throws LWJGLException if the context could not be made current
*/
public void makeCurrent() throws LWJGLException {
nMakeCurrent(handle);
Display.getImplementation().makePbufferCurrent(handle);
GLContext.useContext(this);
}
/**
* Native method to make a pbuffer current.
*/
private static native void nMakeCurrent(ByteBuffer handle) throws LWJGLException;
/**
* Gets the Pbuffer capabilities.
*
@ -240,13 +225,6 @@ public final class Pbuffer {
return Display.getImplementation().getPbufferCaps();
}
/**
* Native method to create a Pbuffer
*/
private static native void nCreate(ByteBuffer handle, int width, int height, PixelFormat pixel_format,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs) throws LWJGLException;
/**
* Destroys the Pbuffer. After this call, there will be no valid GL rendering context - regardless of whether this Pbuffer was
* the current rendering context or not.
@ -255,7 +233,7 @@ public final class Pbuffer {
try {
makeCurrent();
int error = GL11.glGetError();
nDestroy(handle);
Display.getImplementation().destroyPbuffer(handle);
GLContext.useContext(null);
GLContext.unloadOpenGLLibrary();
if (error != GL11.GL_NO_ERROR)
@ -265,11 +243,6 @@ public final class Pbuffer {
}
}
/**
* Natively destroy any GL-related stuff
*/
private static native void nDestroy(ByteBuffer handle);
// -----------------------------------------------------------------------------------------
// ------------------------------- Render-to-Texture Methods -------------------------------
// -----------------------------------------------------------------------------------------
@ -287,11 +260,9 @@ public final class Pbuffer {
* @param value
*/
public void setAttrib(int attrib, int value) {
nSetAttrib(handle, attrib, value);
Display.getImplementation().setPbufferAttrib(handle, attrib, value);
}
private static native void nSetAttrib(ByteBuffer handle, int attrib, int value);
/**
* Binds the currently bound texture to the buffer specified. The buffer can be one of the following:
* <p/>
@ -300,22 +271,18 @@ public final class Pbuffer {
* @param buffer
*/
public void bindTexImage(int buffer) {
nBindTexImage(handle, buffer);
Display.getImplementation().bindTexImageToPbuffer(handle, buffer);
}
private static native void nBindTexImage(ByteBuffer handle, int buffer);
/**
* Releases the currently bound texture from the buffer specified.
*
* @param buffer
*/
public void releaseTexImage(int buffer) {
nReleaseTexImage(handle, buffer);
Display.getImplementation().releaseTexImageFromPbuffer(handle, buffer);
}
private static native void nReleaseTexImage(ByteBuffer handle, int buffer);
/**
* @return Returns the height.
*/

View File

@ -47,6 +47,7 @@ import org.lwjgl.LWJGLException;
final class Win32Display implements DisplayImplementation {
private static final int CURSOR_HANDLE_SIZE = 8;
private static final int PBUFFER_HANDLE_SIZE = 24;
public native void createWindow(DisplayMode mode, boolean fullscreen, int x, int y) throws LWJGLException;
public native void destroyWindow();
@ -104,6 +105,27 @@ final class Win32Display implements DisplayImplementation {
public native void destroyCursor(Object cursorHandle);
public native int getPbufferCaps();
public native boolean isBufferLost(ByteBuffer handle);
public native void makePbufferCurrent(ByteBuffer handle) throws LWJGLException;
public ByteBuffer createPbuffer(int width, int height, PixelFormat pixel_format,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs, ByteBuffer shared_pbuffer_handle) throws LWJGLException {
ByteBuffer handle = BufferUtils.createByteBuffer(PBUFFER_HANDLE_SIZE);
nCreatePbuffer(handle, width, height, pixel_format, pixelFormatCaps, pBufferAttribs, shared_pbuffer_handle);
return handle;
}
private native void nCreatePbuffer(ByteBuffer handle, int width, int height, PixelFormat pixel_format,
IntBuffer pixelFormatCaps,
IntBuffer pBufferAttribs, ByteBuffer shared_pbuffer_handle) throws LWJGLException;
public native void destroyPbuffer(ByteBuffer handle);
public native void setPbufferAttrib(ByteBuffer handle, int attrib, int value);
public native void bindTexImageToPbuffer(ByteBuffer handle, int buffer);
public native void releaseTexImageFromPbuffer(ByteBuffer handle, int buffer);
public boolean openURL(String url) {
nOpenURL(url);
return true;

View File

@ -96,7 +96,7 @@ public class PbufferTest {
private void initialize() {
try {
//find displaymode
pbuffer = new Pbuffer(512, 512, new PixelFormat(), null);
pbuffer = new Pbuffer(512, 512, new PixelFormat(), null, null);
mode = findDisplayMode(800, 600, 16);
Display.setDisplayMode(mode);
// start of in windowed mode
@ -176,7 +176,7 @@ public class PbufferTest {
System.out.println("Buffer contents lost - will recreate the buffer");
pbuffer.destroy();
try {
pbuffer = new Pbuffer(512, 512, new PixelFormat(), null);
pbuffer = new Pbuffer(512, 512, new PixelFormat(), null, null);
initPbuffer();
} catch (LWJGLException e) {
e.printStackTrace();

View File

@ -47,7 +47,7 @@ final class UniqueRenderer extends TextureRenderer {
Pbuffer pbuffer = null;
try {
pbuffer = new Pbuffer(width, height, new PixelFormat(16, 0, 0, 0, 0), null);
pbuffer = new Pbuffer(width, height, new PixelFormat(16, 0, 0, 0, 0), null, null);
// Initialise state of the pbuffer context.
pbuffer.makeCurrent();

View File

@ -46,7 +46,7 @@ final class UniqueRendererRTT extends TextureRenderer {
try {
final RenderTexture rt = new RenderTexture(true, false, false, false, RenderTexture.RENDER_TEXTURE_2D, 0);
pbuffer = new Pbuffer(width, height, new PixelFormat(16, 0, 0, 0, 0), rt);
pbuffer = new Pbuffer(width, height, new PixelFormat(16, 0, 0, 0, 0), rt, null);
// Initialise state of the pbuffer context.
pbuffer.makeCurrent();

View File

@ -51,13 +51,6 @@ typedef struct _PbufferInfo {
GLXContext context;
} PbufferInfo;
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Pbuffer_nIsBufferLost
(JNIEnv *env, jclass clazz, jobject handle_buffer)
{
// The buffer is never lost, because of the GLX_PRESERVED_CONTENTS flag
return JNI_FALSE;
}
JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_LinuxDisplay_getPbufferCaps
(JNIEnv *env, jobject this)
{
@ -96,7 +89,7 @@ static bool checkPbufferCaps(JNIEnv *env, GLXFBConfig config, int width, int hei
return true;
}
static bool createPbufferUsingUniqueContext(JNIEnv *env, PbufferInfo *pbuffer_info, jobject pixel_format, int width, int height, const int *buffer_attribs) {
static bool createPbufferUsingUniqueContext(JNIEnv *env, PbufferInfo *pbuffer_info, jobject pixel_format, int width, int height, const int *buffer_attribs, GLXContext shared_context) {
GLXFBConfig *configs = chooseVisualGLX13(env, pixel_format, false, GLX_PBUFFER_BIT, false);
if (configs == NULL) {
throwException(env, "No matching pixel format");
@ -106,7 +99,7 @@ static bool createPbufferUsingUniqueContext(JNIEnv *env, PbufferInfo *pbuffer_in
XFree(configs);
return false;
}
GLXContext context = glXCreateNewContext(getDisplay(), configs[0], GLX_RGBA_TYPE, getCurrentGLXContext(), True);
GLXContext context = glXCreateNewContext(getDisplay(), configs[0], GLX_RGBA_TYPE, shared_context, True);
if (context == NULL) {
XFree(configs);
throwException(env, "Could not create a GLX context");
@ -126,7 +119,7 @@ static bool createPbufferUsingUniqueContext(JNIEnv *env, PbufferInfo *pbuffer_in
return true;
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nCreate(JNIEnv *env, jclass clazz, jobject handle_buffer, jint width, jint height, jobject pixel_format, jobject pixelFormatCaps, jobject pBufferAttribs)
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nCreatePbuffer(JNIEnv *env, jobject this, jobject handle_buffer, jint width, jint height, jobject pixel_format, jobject pixelFormatCaps, jobject pBufferAttribs, jobject shared_context_handle_buffer)
{
Display *disp = incDisplay(env);
if (disp == NULL) {
@ -150,9 +143,14 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nCreate(JNIEnv *env, jclass
throwException(env, "Handle buffer not large enough");
return;
}
GLXContext shared_context = getCurrentGLXContext();
if (shared_context_handle_buffer != NULL) {
PbufferInfo *shared_buffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, shared_context_handle_buffer);
shared_context = shared_buffer_info->context;
}
PbufferInfo *buffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, handle_buffer);
bool result;
result = createPbufferUsingUniqueContext(env, buffer_info, pixel_format, width, height, buffer_attribs);
result = createPbufferUsingUniqueContext(env, buffer_info, pixel_format, width, height, buffer_attribs, shared_context);
if (!result || !checkXError(env)) {
decDisplay();
destroyPbuffer(buffer_info);
@ -160,8 +158,8 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nCreate(JNIEnv *env, jclass
}
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nMakeCurrent
(JNIEnv *env, jclass clazz, jobject handle_buffer)
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_makePbufferCurrent
(JNIEnv *env, jobject this, jobject handle_buffer)
{
PbufferInfo *buffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, handle_buffer);
GLXPbuffer buffer = buffer_info->buffer;
@ -171,27 +169,9 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nMakeCurrent
}
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nDestroy
(JNIEnv *env, jclass clazz, jobject handle_buffer)
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_destroyPbuffer
(JNIEnv *env, jobject this, jobject handle_buffer)
{
PbufferInfo *buffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, handle_buffer);
destroyPbuffer(buffer_info);
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nSetAttrib
(JNIEnv *env, jclass clazz, jobject handle_buffer, jint attrib, jint value)
{
throwException(env, "The render-to-texture extension is not supported.");
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nBindTexImage
(JNIEnv *env, jclass clazz, jobject handle_buffer, jint buffer)
{
throwException(env, "The render-to-texture extension is not supported.");
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nReleaseTexImage
(JNIEnv *env, jclass clazz, jobject handle_buffer, jint buffer)
{
throwException(env, "The render-to-texture extension is not supported.");
}

View File

@ -41,6 +41,7 @@
#import <jni.h>
#import <OpenGL/gl.h>
#import "org_lwjgl_opengl_MacOSXDisplay.h"
#import "org_lwjgl_opengl_Pbuffer.h"
#import "display.h"
@ -65,11 +66,7 @@ static PbufferInfo *getPbufferInfoFromBuffer(JNIEnv *env, jobject pbuffer_handle
return NULL;
}
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Pbuffer_nIsBufferLost(JNIEnv *env, jclass clazz, jobject pbuffer_handle) {
return JNI_FALSE;
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nMakeCurrent(JNIEnv *env, jclass clazz, jobject pbuffer_handle) {
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_makePbufferCurrent(JNIEnv *env, jobject this, jobject pbuffer_handle) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
PbufferInfo *pbuffer_handle_ptr = getPbufferInfoFromBuffer(env, pbuffer_handle);
if (pbuffer_handle_ptr == NULL)
@ -78,7 +75,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nMakeCurrent(JNIEnv *env, j
[pool release];
}
static void createPbuffer(JNIEnv *env, jobject pbuffer_handle, jint width, jint height, jobject pixel_format) {
static void createPbuffer(JNIEnv *env, jobject pbuffer_handle, jint width, jint height, jobject pixel_format, NSOpenGLContext shared_context) {
if (!checkCapacity(env, pbuffer_handle))
return;
NSOpenGLPixelBuffer *pbuffer = [[NSOpenGLPixelBuffer alloc] initWithTextureTarget:GL_TEXTURE_2D textureInternalFormat:GL_RGBA textureMaxMipMapLevel:0 pixelsWide:width pixelsHigh:height];
@ -86,8 +83,7 @@ static void createPbuffer(JNIEnv *env, jobject pbuffer_handle, jint width, jint
throwException(env, "Could not allocate Pbuffer");
return;
}
NSOpenGLContext *display_context = getDisplayContext();
NSOpenGLContext *context = createContext(env, pixel_format, false, false, NSOpenGLPFAPixelBuffer, display_context);
NSOpenGLContext *context = createContext(env, pixel_format, false, false, NSOpenGLPFAPixelBuffer, shared_context);
if (context == nil)
return;
int screen;
@ -101,13 +97,18 @@ static void createPbuffer(JNIEnv *env, jobject pbuffer_handle, jint width, jint
pbuffer_handle_ptr->context = context;
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nCreate(JNIEnv *env, jclass clazz, jobject pbuffer_handle, jint width, jint height, jobject pixel_format, jobject pixelFormatCaps, jobject pBufferAttribs) {
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nCreatePbuffer(JNIEnv *env, jobject this, jobject pbuffer_handle, jint width, jint height, jobject pixel_format, jobject pixelFormatCaps, jobject pBufferAttribs, jobject shared_context_handle_buffer) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
createPbuffer(env, pbuffer_handle, width, height, pixel_format);
NSOpenGLContext shared_context = getDisplayContext();
if (shared_context_handle_buffer != NULL) {
PbufferInfo *pbuffer_handle_ptr = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, shared_context_handle_buffer);
shared_context = pbuffer_handle_ptr->context;
}
createPbuffer(env, pbuffer_handle, width, height, pixel_format, shared_context);
[pool release];
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nDestroy(JNIEnv *env, jclass clazz, jobject pbuffer_handle) {
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_destroyPbuffer(JNIEnv *env, jobject this, jobject pbuffer_handle) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
PbufferInfo *pbuffer_handle_ptr = getPbufferInfoFromBuffer(env, pbuffer_handle);
if (pbuffer_handle_ptr == NULL)

View File

@ -125,13 +125,13 @@ static HPBUFFERARB createPbuffer(JNIEnv *env, int width, int height, jobject pix
return Pbuffer;
}
static HGLRC createPbufferContext(JNIEnv *env, HDC Pbuffer_dc) {
static HGLRC createPbufferContext(JNIEnv *env, HDC Pbuffer_dc, HGLRC shared_context) {
HGLRC Pbuffer_context = wglCreateContext(Pbuffer_dc);
if (Pbuffer_context == NULL) {
throwException(env, "Failed to create Pbuffer rendering context");
return NULL;
}
if (getCurrentContext() != NULL && !wglShareLists(getCurrentContext(), Pbuffer_context)) {
if (getCurrentContext() != NULL && !wglShareLists(shared_context, Pbuffer_context)) {
wglDeleteContext(Pbuffer_context);
throwException(env, "Could not share buffer context.");
return NULL;
@ -139,15 +139,16 @@ static HGLRC createPbufferContext(JNIEnv *env, HDC Pbuffer_dc) {
return Pbuffer_context;
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nCreate
(JNIEnv *env, jclass clazz, jobject buffer_handle,
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32Display_nCreatePbuffer
(JNIEnv *env, jobject self, jobject buffer_handle,
jint width, jint height, jobject pixel_format,
jobject pixelFormatCaps, jobject pBufferAttribs)
jobject pixelFormatCaps, jobject pBufferAttribs, jobject shared_context_handle_buffer)
{
HPBUFFERARB Pbuffer;
const int *pBufferAttribs_ptr;
HDC Pbuffer_dc;
HGLRC Pbuffer_context;
HGLRC shared_context;
PbufferInfo *Pbuffer_info;
if ((*env)->GetDirectBufferCapacity(env, buffer_handle) < sizeof(PbufferInfo)) {
throwException(env, "Buffer handle not large enough");
@ -171,7 +172,12 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nCreate
throwException(env, "Could not get Pbuffer dc.");
return;
}
Pbuffer_context = createPbufferContext(env, Pbuffer_dc);
shared_context = getCurrentContext();
if (shared_context_handle_buffer != NULL) {
Pbuffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, buffer_handle);
shared_context = Pbuffer_info->Pbuffer_context;
}
Pbuffer_context = createPbufferContext(env, Pbuffer_dc, shared_context);
if (Pbuffer_context == NULL) {
wglReleasePbufferDCARB(Pbuffer, Pbuffer_dc);
wglDestroyPbufferARB(Pbuffer);
@ -183,8 +189,8 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nCreate
Pbuffer_info->Pbuffer_dc = Pbuffer_dc;
}
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Pbuffer_nIsBufferLost
(JNIEnv *env, jclass clazz, jobject buffer_handle)
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Win32Display_isBufferLost
(JNIEnv *env, jobject self, jobject buffer_handle)
{
PbufferInfo *Pbuffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, buffer_handle);
BOOL buffer_lost;
@ -192,8 +198,8 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Pbuffer_nIsBufferLost
return buffer_lost ? JNI_TRUE : JNI_FALSE;
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nMakeCurrent
(JNIEnv *env, jclass clazz, jobject buffer_handle)
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_makePbufferCurrent
(JNIEnv *env, jobject self, jobject buffer_handle)
{
PbufferInfo *Pbuffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, buffer_handle);
// PbufferInfo *Pbuffer_info = (PbufferInfo *)handle;
@ -201,8 +207,8 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nMakeCurrent
throwException(env, "Could not make pbuffer context current");
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nDestroy
(JNIEnv *env, jclass clazz, jobject buffer_handle)
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_destroyPbuffer
(JNIEnv *env, jobject self, jobject buffer_handle)
{
PbufferInfo *Pbuffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, buffer_handle);
wglDeleteContext(Pbuffer_info->Pbuffer_context);
@ -210,8 +216,8 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nDestroy
wglDestroyPbufferARB(Pbuffer_info->Pbuffer);
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nSetAttrib
(JNIEnv *env, jclass clazz, jobject buffer_handle, jint attrib, jint value)
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_setPbufferAttrib
(JNIEnv *env, jobject self, jobject buffer_handle, jint attrib, jint value)
{
PbufferInfo *Pbuffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, buffer_handle);
@ -224,15 +230,15 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nSetAttrib
wglSetPbufferAttribARB(Pbuffer_info->Pbuffer, attribs);
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nBindTexImage
(JNIEnv *env, jclass clazz, jobject buffer_handle, jint buffer)
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32Display_bindTexImageToPbuffer
(JNIEnv *env, jobject self, jobject buffer_handle, jint buffer)
{
PbufferInfo *Pbuffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, buffer_handle);
wglBindTexImageARB(Pbuffer_info->Pbuffer, buffer);
}
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Pbuffer_nReleaseTexImage
(JNIEnv *env, jclass clazz, jobject buffer_handle, jint buffer)
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32Display_releaseTexImageFromPbuffer
(JNIEnv *env, jobject self, jobject buffer_handle, jint buffer)
{
PbufferInfo *Pbuffer_info = (PbufferInfo *)(*env)->GetDirectBufferAddress(env, buffer_handle);
wglReleaseTexImageARB(Pbuffer_info->Pbuffer, buffer);