Windows: Got rid of dummy window in WindowsDisplayPeerInfo
This commit is contained in:
parent
def08f06f8
commit
87523ce63a
|
@ -42,30 +42,19 @@ import org.lwjgl.LWJGLException;
|
||||||
* $Id$
|
* $Id$
|
||||||
*/
|
*/
|
||||||
final class WindowsDisplayPeerInfo extends WindowsPeerInfo {
|
final class WindowsDisplayPeerInfo extends WindowsPeerInfo {
|
||||||
public WindowsDisplayPeerInfo(PixelFormat pixel_format) throws LWJGLException {
|
private final PixelFormat pixel_format;
|
||||||
GLContext.loadOpenGLLibrary();
|
|
||||||
try {
|
|
||||||
createDummyDC(getHandle());
|
|
||||||
try {
|
|
||||||
choosePixelFormat(0, 0, pixel_format, null, true, true, false, true);
|
|
||||||
} catch (LWJGLException e) {
|
|
||||||
nDestroy(getHandle());
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
} catch (LWJGLException e) {
|
|
||||||
GLContext.unloadOpenGLLibrary();
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private static native void createDummyDC(ByteBuffer peer_info_handle) throws LWJGLException;
|
|
||||||
|
|
||||||
void initDC() {
|
public WindowsDisplayPeerInfo(PixelFormat pixel_format) throws LWJGLException {
|
||||||
|
this.pixel_format = pixel_format;
|
||||||
|
GLContext.loadOpenGLLibrary();
|
||||||
|
}
|
||||||
|
|
||||||
|
void initDC() throws LWJGLException {
|
||||||
nInitDC(getHandle());
|
nInitDC(getHandle());
|
||||||
|
choosePixelFormat(0, 0, pixel_format, null, true, true, false, true);
|
||||||
}
|
}
|
||||||
private static native void nInitDC(ByteBuffer peer_info_handle);
|
private static native void nInitDC(ByteBuffer peer_info_handle);
|
||||||
|
|
||||||
private static native void nDestroy(ByteBuffer peer_info_handle);
|
|
||||||
|
|
||||||
protected void doLockAndInitHandle() throws LWJGLException {
|
protected void doLockAndInitHandle() throws LWJGLException {
|
||||||
// NO-OP
|
// NO-OP
|
||||||
}
|
}
|
||||||
|
@ -76,7 +65,6 @@ final class WindowsDisplayPeerInfo extends WindowsPeerInfo {
|
||||||
|
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
super.destroy();
|
super.destroy();
|
||||||
nDestroy(getHandle());
|
|
||||||
GLContext.unloadOpenGLLibrary();
|
GLContext.unloadOpenGLLibrary();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,16 +47,12 @@
|
||||||
#include "extgl_wgl.h"
|
#include "extgl_wgl.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
union {
|
struct {
|
||||||
HWND format_hwnd;
|
HPBUFFERARB pbuffer;
|
||||||
struct {
|
// Contains the function pointers that
|
||||||
HPBUFFERARB pbuffer;
|
// created the pbuffer
|
||||||
// Contains the function pointers that
|
WGLExtensions extensions;
|
||||||
// created the pbuffer
|
} pbuffer;
|
||||||
WGLExtensions extensions;
|
|
||||||
} pbuffer;
|
|
||||||
} u;
|
|
||||||
HDC format_hdc;
|
|
||||||
HDC drawable_hdc;
|
HDC drawable_hdc;
|
||||||
} WindowsPeerInfo;
|
} WindowsPeerInfo;
|
||||||
|
|
||||||
|
|
|
@ -165,24 +165,23 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nCreate
|
||||||
throwException(env, "Could not get Pbuffer DC");
|
throwException(env, "Could not get Pbuffer DC");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
peer_info->format_hdc = Pbuffer_dc;
|
peer_info->pbuffer.extensions = extensions;
|
||||||
peer_info->u.pbuffer.extensions = extensions;
|
peer_info->pbuffer.pbuffer = Pbuffer;
|
||||||
peer_info->u.pbuffer.pbuffer = Pbuffer;
|
|
||||||
peer_info->drawable_hdc = Pbuffer_dc;
|
peer_info->drawable_hdc = Pbuffer_dc;
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nDestroy
|
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nDestroy
|
||||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
||||||
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||||
peer_info->u.pbuffer.extensions.wglReleasePbufferDCARB(peer_info->u.pbuffer.pbuffer, peer_info->drawable_hdc);
|
peer_info->pbuffer.extensions.wglReleasePbufferDCARB(peer_info->pbuffer.pbuffer, peer_info->drawable_hdc);
|
||||||
peer_info->u.pbuffer.extensions.wglDestroyPbufferARB(peer_info->u.pbuffer.pbuffer);
|
peer_info->pbuffer.extensions.wglDestroyPbufferARB(peer_info->pbuffer.pbuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nIsBufferLost
|
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nIsBufferLost
|
||||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
||||||
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||||
BOOL buffer_lost;
|
BOOL buffer_lost;
|
||||||
peer_info->u.pbuffer.extensions.wglQueryPbufferARB(peer_info->u.pbuffer.pbuffer, WGL_PBUFFER_LOST_ARB, &buffer_lost);
|
peer_info->pbuffer.extensions.wglQueryPbufferARB(peer_info->pbuffer.pbuffer, WGL_PBUFFER_LOST_ARB, &buffer_lost);
|
||||||
return buffer_lost ? JNI_TRUE : JNI_FALSE;
|
return buffer_lost ? JNI_TRUE : JNI_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,17 +194,17 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nSetPbufferA
|
||||||
attribs[1] = value;
|
attribs[1] = value;
|
||||||
attribs[2] = 0;
|
attribs[2] = 0;
|
||||||
|
|
||||||
peer_info->u.pbuffer.extensions.wglSetPbufferAttribARB(peer_info->u.pbuffer.pbuffer, attribs);
|
peer_info->pbuffer.extensions.wglSetPbufferAttribARB(peer_info->pbuffer.pbuffer, attribs);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nBindTexImageToPbuffer
|
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nBindTexImageToPbuffer
|
||||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jint buffer) {
|
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jint buffer) {
|
||||||
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||||
peer_info->u.pbuffer.extensions.wglBindTexImageARB(peer_info->u.pbuffer.pbuffer, buffer);
|
peer_info->pbuffer.extensions.wglBindTexImageARB(peer_info->pbuffer.pbuffer, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nReleaseTexImageFromPbuffer
|
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPbufferPeerInfo_nReleaseTexImageFromPbuffer
|
||||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jint buffer) {
|
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jint buffer) {
|
||||||
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||||
peer_info->u.pbuffer.extensions.wglReleaseTexImageARB(peer_info->u.pbuffer.pbuffer, buffer);
|
peer_info->pbuffer.extensions.wglReleaseTexImageARB(peer_info->pbuffer.pbuffer, buffer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,5 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsAWTGLCanvasPeerInfo_nInitHan
|
||||||
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||||
AWTSurfaceLock *surface = (AWTSurfaceLock *)(*env)->GetDirectBufferAddress(env, lock_buffer_handle);
|
AWTSurfaceLock *surface = (AWTSurfaceLock *)(*env)->GetDirectBufferAddress(env, lock_buffer_handle);
|
||||||
JAWT_Win32DrawingSurfaceInfo *win32_dsi = (JAWT_Win32DrawingSurfaceInfo *)surface->dsi->platformInfo;
|
JAWT_Win32DrawingSurfaceInfo *win32_dsi = (JAWT_Win32DrawingSurfaceInfo *)surface->dsi->platformInfo;
|
||||||
peer_info->u.format_hwnd = win32_dsi->hwnd;
|
|
||||||
peer_info->format_hdc = win32_dsi->hdc;
|
|
||||||
peer_info->drawable_hdc = win32_dsi->hdc;
|
peer_info->drawable_hdc = win32_dsi->hdc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nCr
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||||
context = wglCreateContext(peer_info->format_hdc);
|
context = wglCreateContext(peer_info->drawable_hdc);
|
||||||
if (context == NULL) {
|
if (context == NULL) {
|
||||||
throwException(env, "Could not create context");
|
throwException(env, "Could not create context");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -79,7 +79,7 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_WindowsContextImplementation_nCr
|
||||||
}
|
}
|
||||||
saved_hdc = wglGetCurrentDC();
|
saved_hdc = wglGetCurrentDC();
|
||||||
saved_context = wglGetCurrentContext();
|
saved_context = wglGetCurrentContext();
|
||||||
if (!wglMakeCurrent(peer_info->format_hdc, context)) {
|
if (!wglMakeCurrent(peer_info->drawable_hdc, context)) {
|
||||||
wglMakeCurrent(saved_hdc, saved_context);
|
wglMakeCurrent(saved_hdc, saved_context);
|
||||||
wglDeleteContext(context);
|
wglDeleteContext(context);
|
||||||
throwException(env, "Could not make context current");
|
throwException(env, "Could not make context current");
|
||||||
|
|
|
@ -43,36 +43,8 @@
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "common_tools.h"
|
#include "common_tools.h"
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplayPeerInfo_createDummyDC
|
|
||||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
|
||||||
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
|
||||||
HWND dummy_hwnd = createDummyWindow(0, 0);
|
|
||||||
HDC dummy_hdc;
|
|
||||||
if (dummy_hwnd == NULL) {
|
|
||||||
throwException(env, "Failed to create a dummy window.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
dummy_hdc = GetDC(dummy_hwnd);
|
|
||||||
peer_info->u.format_hwnd = dummy_hwnd;
|
|
||||||
peer_info->format_hdc = dummy_hdc;
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplayPeerInfo_nDestroy
|
|
||||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
|
||||||
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
|
||||||
closeWindow(&peer_info->u.format_hwnd, &peer_info->format_hdc);
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplayPeerInfo_nInitDC
|
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplayPeerInfo_nInitDC
|
||||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
||||||
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
WindowsPeerInfo *peer_info = (WindowsPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||||
int pixel_format;
|
|
||||||
peer_info->drawable_hdc = getCurrentHDC();
|
peer_info->drawable_hdc = getCurrentHDC();
|
||||||
pixel_format = GetPixelFormat(peer_info->format_hdc);
|
|
||||||
if (pixel_format == 0) {
|
|
||||||
throwException(env, "Could not get pixel format from dummy hdc");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// If applyPixelFormat fails, just let it throw
|
|
||||||
applyPixelFormat(env, peer_info->drawable_hdc, pixel_format);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,5 +56,5 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsPeerInfo_nChoosePixelFormat
|
||||||
if (pixel_format_id == -1)
|
if (pixel_format_id == -1)
|
||||||
return;
|
return;
|
||||||
// Let it throw
|
// Let it throw
|
||||||
applyPixelFormat(env, peer_info->format_hdc, pixel_format_id);
|
applyPixelFormat(env, peer_info->drawable_hdc, pixel_format_id);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue