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:
parent
28aff73635
commit
925139bc7d
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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.");
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue