Win32: Handle context-dependent wgl extensions
This commit is contained in:
parent
f9400843aa
commit
a5469e6ff3
|
@ -94,9 +94,14 @@ final class Win32ContextImplementation implements ContextImplementation {
|
|||
private static native boolean nIsCurrent(ByteBuffer context_handle) throws LWJGLException;
|
||||
|
||||
public void setVSync(boolean enabled) {
|
||||
nSetVSync(enabled);
|
||||
Context current_context = Context.getCurrentContext();
|
||||
if (current_context == null)
|
||||
throw new IllegalStateException("No context is current");
|
||||
synchronized (current_context) {
|
||||
nSetVSync(current_context.getHandle(), enabled);
|
||||
}
|
||||
}
|
||||
private static native void nSetVSync(boolean enabled);
|
||||
private static native void nSetVSync(ByteBuffer context_handle, boolean enabled);
|
||||
|
||||
public void destroy(PeerInfo peer_info, ByteBuffer handle) throws LWJGLException {
|
||||
nDestroy(handle);
|
||||
|
|
|
@ -124,7 +124,17 @@ final class Win32Display implements DisplayImplementation {
|
|||
}
|
||||
|
||||
public native void destroyCursor(Object cursorHandle);
|
||||
public native int getPbufferCapabilities();
|
||||
public int getPbufferCapabilities() {
|
||||
try {
|
||||
// Return the capabilities of a minimum pixel format
|
||||
return nGetPbufferCapabilities(new PixelFormat(0, 0, 0, 0, 0, 0, 0, 0, false));
|
||||
} catch (LWJGLException e) {
|
||||
Sys.log("Exception occurred while determining pbuffer capabilities: " + e);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
private native int nGetPbufferCapabilities(PixelFormat format) throws LWJGLException;
|
||||
|
||||
public boolean isBufferLost(PeerInfo handle) {
|
||||
return ((Win32PbufferPeerInfo)handle).isBufferLost();
|
||||
}
|
||||
|
|
|
@ -161,7 +161,7 @@ HWND createWindow(LPCTSTR window_class_name, int x, int y, int width, int height
|
|||
return new_hwnd;
|
||||
}
|
||||
|
||||
static int findPixelFormatARBFromBPP(JNIEnv *env, HDC hdc, jobject pixel_format, jobject pixelFormatCaps, int bpp, bool window, bool pbuffer, bool double_buffer) {
|
||||
static int findPixelFormatARBFromBPP(JNIEnv *env, HDC hdc, WGLExtensions *extensions, jobject pixel_format, jobject pixelFormatCaps, int bpp, bool window, bool pbuffer, bool double_buffer) {
|
||||
jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format);
|
||||
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"));
|
||||
|
@ -195,7 +195,8 @@ static int findPixelFormatARBFromBPP(JNIEnv *env, HDC hdc, jobject pixel_format,
|
|||
putAttrib(&attrib_list, WGL_ALPHA_BITS_ARB); putAttrib(&attrib_list, alpha);
|
||||
putAttrib(&attrib_list, WGL_DEPTH_BITS_ARB); putAttrib(&attrib_list, depth);
|
||||
putAttrib(&attrib_list, WGL_STENCIL_BITS_ARB); putAttrib(&attrib_list, stencil);
|
||||
if (samples > 0 && extension_flags.WGL_ARB_multisample) {
|
||||
// Assume caller checked extension availability
|
||||
if (samples > 0) {
|
||||
putAttrib(&attrib_list, WGL_SAMPLE_BUFFERS_ARB); putAttrib(&attrib_list, 1);
|
||||
putAttrib(&attrib_list, WGL_SAMPLES_ARB); putAttrib(&attrib_list, samples);
|
||||
}
|
||||
|
@ -203,11 +204,8 @@ static int findPixelFormatARBFromBPP(JNIEnv *env, HDC hdc, jobject pixel_format,
|
|||
putAttrib(&attrib_list, WGL_ACCUM_ALPHA_BITS_ARB); putAttrib(&attrib_list, accum_alpha);
|
||||
putAttrib(&attrib_list, WGL_STEREO_ARB); putAttrib(&attrib_list, stereo ? TRUE : FALSE);
|
||||
putAttrib(&attrib_list, WGL_AUX_BUFFERS_ARB); putAttrib(&attrib_list, num_aux_buffers);
|
||||
// Assume caller checked extension availability
|
||||
if ( pixelFormatCaps != NULL ) {
|
||||
if ( !extension_flags.WGL_ARB_render_texture ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
pixelFormatCaps_ptr = (GLuint *)(*env)->GetDirectBufferAddress(env, pixelFormatCaps);
|
||||
pixelFormatCapsSize = (*env)->GetDirectBufferCapacity(env, pixelFormatCaps);
|
||||
|
||||
|
@ -215,7 +213,7 @@ static int findPixelFormatARBFromBPP(JNIEnv *env, HDC hdc, jobject pixel_format,
|
|||
putAttrib(&attrib_list, pixelFormatCaps_ptr[i]);
|
||||
}
|
||||
putAttrib(&attrib_list, 0); putAttrib(&attrib_list, 0);
|
||||
result = wglChoosePixelFormatARB(hdc, attrib_list.attribs, NULL, 1, &iPixelFormat, &num_formats_returned);
|
||||
result = extensions->wglChoosePixelFormatARB(hdc, attrib_list.attribs, NULL, 1, &iPixelFormat, &num_formats_returned);
|
||||
|
||||
if (result == FALSE || num_formats_returned < 1) {
|
||||
return -1;
|
||||
|
@ -223,20 +221,20 @@ static int findPixelFormatARBFromBPP(JNIEnv *env, HDC hdc, jobject pixel_format,
|
|||
return iPixelFormat;
|
||||
}
|
||||
|
||||
static int findPixelFormatARB(JNIEnv *env, HDC hdc, jobject pixel_format, jobject pixelFormatCaps, bool use_hdc_bpp, bool window, bool pbuffer, bool double_buffer) {
|
||||
static int findPixelFormatARB(JNIEnv *env, HDC hdc, WGLExtensions *extensions, jobject pixel_format, jobject pixelFormatCaps, bool use_hdc_bpp, bool window, bool pbuffer, bool double_buffer) {
|
||||
int bpp;
|
||||
int iPixelFormat;
|
||||
jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format);
|
||||
if (use_hdc_bpp) {
|
||||
bpp = GetDeviceCaps(hdc, BITSPIXEL);
|
||||
iPixelFormat = findPixelFormatARBFromBPP(env, hdc, pixel_format, pixelFormatCaps, bpp, window, pbuffer, double_buffer);
|
||||
iPixelFormat = findPixelFormatARBFromBPP(env, hdc, extensions, pixel_format, pixelFormatCaps, bpp, window, pbuffer, double_buffer);
|
||||
if (iPixelFormat == -1)
|
||||
bpp = 16;
|
||||
else
|
||||
return iPixelFormat;
|
||||
} else
|
||||
bpp = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "bpp", "I"));
|
||||
return findPixelFormatARBFromBPP(env, hdc, pixel_format, pixelFormatCaps, bpp, window, pbuffer, double_buffer);
|
||||
return findPixelFormatARBFromBPP(env, hdc, extensions, pixel_format, pixelFormatCaps, bpp, window, pbuffer, double_buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -345,6 +343,7 @@ int findPixelFormatOnDC(JNIEnv *env, HDC hdc, jobject pixel_format, jobject pixe
|
|||
HGLRC dummy_hglrc;
|
||||
HDC saved_current_hdc;
|
||||
HGLRC saved_current_hglrc;
|
||||
WGLExtensions extensions;
|
||||
int pixel_format_id;
|
||||
jclass cls_pixel_format = (*env)->GetObjectClass(env, pixel_format);
|
||||
int samples = (int)(*env)->GetIntField(env, pixel_format, (*env)->GetFieldID(env, cls_pixel_format, "samples", "I"));
|
||||
|
@ -364,17 +363,32 @@ int findPixelFormatOnDC(JNIEnv *env, HDC hdc, jobject pixel_format, jobject pixe
|
|||
saved_current_hdc = wglGetCurrentDC();
|
||||
saved_current_hglrc = wglGetCurrentContext();
|
||||
if (!wglMakeCurrent(hdc, dummy_hglrc)) {
|
||||
wglMakeCurrent(saved_current_hdc, saved_current_hglrc);
|
||||
wglDeleteContext(dummy_hglrc);
|
||||
throwException(env, "Could not bind context to dummy window");
|
||||
return -1;
|
||||
}
|
||||
extgl_InitWGL();
|
||||
extgl_InitWGL(&extensions);
|
||||
|
||||
if (!extension_flags.WGL_ARB_pixel_format) {
|
||||
if (!extensions.WGL_ARB_pixel_format) {
|
||||
wglMakeCurrent(saved_current_hdc, saved_current_hglrc);
|
||||
wglDeleteContext(dummy_hglrc);
|
||||
throwException(env, "No support for WGL_ARB_pixel_format");
|
||||
return -1;
|
||||
}
|
||||
pixel_format_id = findPixelFormatARB(env, hdc, pixel_format, pixelFormatCaps, use_hdc_bpp, window, pbuffer, double_buffer);
|
||||
if (samples > 0 && !extensions.WGL_ARB_multisample) {
|
||||
wglMakeCurrent(saved_current_hdc, saved_current_hglrc);
|
||||
wglDeleteContext(dummy_hglrc);
|
||||
throwException(env, "No support for WGL_ARB_multisample");
|
||||
return -1;
|
||||
}
|
||||
if (pixelFormatCaps != NULL && !extensions.WGL_ARB_render_texture) {
|
||||
wglMakeCurrent(saved_current_hdc, saved_current_hglrc);
|
||||
wglDeleteContext(dummy_hglrc);
|
||||
throwException(env, "No support for WGL_ARB_multisample");
|
||||
return -1;
|
||||
}
|
||||
pixel_format_id = findPixelFormatARB(env, hdc, &extensions, pixel_format, pixelFormatCaps, use_hdc_bpp, window, pbuffer, double_buffer);
|
||||
wglMakeCurrent(saved_current_hdc, saved_current_hglrc);
|
||||
wglDeleteContext(dummy_hglrc);
|
||||
}
|
||||
|
|
|
@ -50,7 +50,12 @@
|
|||
typedef struct {
|
||||
union {
|
||||
HWND format_hwnd;
|
||||
HPBUFFERARB pbuffer;
|
||||
struct {
|
||||
HPBUFFERARB pbuffer;
|
||||
// Contains the function pointers that
|
||||
// created the pbuffer
|
||||
WGLExtensions extensions;
|
||||
} pbuffer;
|
||||
};
|
||||
HDC format_hdc;
|
||||
HDC drawable_hdc;
|
||||
|
|
|
@ -38,50 +38,9 @@ THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include "extgl_wgl.h"
|
||||
#include "extgl.h"
|
||||
|
||||
WGLExtensions extension_flags;
|
||||
|
||||
/* WGL_EXT_etxension_string */
|
||||
|
||||
wglGetExtensionsStringEXTPROC wglGetExtensionsStringEXT = NULL;
|
||||
|
||||
/* WGL_ARB_extension_string */
|
||||
|
||||
wglGetExtensionsStringARBPROC wglGetExtensionsStringARB = NULL;
|
||||
|
||||
/* WGL_ARB_pbuffer */
|
||||
|
||||
wglCreatePbufferARBPROC wglCreatePbufferARB = NULL;
|
||||
wglGetPbufferDCARBPROC wglGetPbufferDCARB = NULL;
|
||||
wglReleasePbufferDCARBPROC wglReleasePbufferDCARB = NULL;
|
||||
wglDestroyPbufferARBPROC wglDestroyPbufferARB = NULL;
|
||||
wglQueryPbufferARBPROC wglQueryPbufferARB = NULL;
|
||||
|
||||
/* WGL_ARB_pixel_format */
|
||||
|
||||
wglGetPixelFormatAttribivARBPROC wglGetPixelFormatAttribivARB = NULL;
|
||||
wglGetPixelFormatAttribfvARBPROC wglGetPixelFormatAttribfvARB = NULL;
|
||||
wglChoosePixelFormatARBPROC wglChoosePixelFormatARB = NULL;
|
||||
|
||||
/* WGL_ARB_render_texture */
|
||||
|
||||
wglBindTexImageARBPROC wglBindTexImageARB = NULL;
|
||||
wglReleaseTexImageARBPROC wglReleaseTexImageARB = NULL;
|
||||
wglSetPbufferAttribARBPROC wglSetPbufferAttribARB = NULL;
|
||||
|
||||
/* WGL_EXT_swap_control */
|
||||
|
||||
wglSwapIntervalEXTPROC wglSwapIntervalEXT = NULL;
|
||||
wglGetSwapIntervalEXTPROC wglGetSwapIntervalEXT = NULL;
|
||||
|
||||
/* WGL_ARB_make_current_read */
|
||||
|
||||
wglMakeContextCurrentARBPROC wglMakeContextCurrentARB = NULL;
|
||||
wglGetCurrentReadDCARBPROC wglGetCurrentReadDCARB = NULL;
|
||||
|
||||
static HMODULE lib_gl_handle = NULL;
|
||||
|
||||
void *extgl_GetProcAddress(const char *name)
|
||||
{
|
||||
void *extgl_GetProcAddress(const char *name) {
|
||||
void *t = wglGetProcAddress(name);
|
||||
if (t == NULL)
|
||||
{
|
||||
|
@ -94,8 +53,7 @@ void *extgl_GetProcAddress(const char *name)
|
|||
return t;
|
||||
}
|
||||
|
||||
bool extgl_Open(JNIEnv *env)
|
||||
{
|
||||
bool extgl_Open(JNIEnv *env) {
|
||||
if (lib_gl_handle != NULL)
|
||||
return true;
|
||||
// load the dynamic libraries for OpenGL
|
||||
|
@ -107,104 +65,105 @@ bool extgl_Open(JNIEnv *env)
|
|||
return true;
|
||||
}
|
||||
|
||||
void extgl_Close(void)
|
||||
{
|
||||
void extgl_Close(void) {
|
||||
FreeLibrary(lib_gl_handle);
|
||||
lib_gl_handle = NULL;
|
||||
}
|
||||
|
||||
/** returns true if the extension is available */
|
||||
static bool WGLQueryExtension(const char *name)
|
||||
{
|
||||
const GLubyte *extensions;
|
||||
static bool WGLQueryExtension(WGLExtensions *extensions, const char *name) {
|
||||
const GLubyte *extension_string;
|
||||
|
||||
if (wglGetExtensionsStringARB == NULL)
|
||||
if (wglGetExtensionsStringEXT == NULL)
|
||||
if (extensions->wglGetExtensionsStringARB == NULL)
|
||||
if (extensions->wglGetExtensionsStringEXT == NULL)
|
||||
return false;
|
||||
else
|
||||
extensions = (GLubyte*)wglGetExtensionsStringEXT();
|
||||
extension_string = (GLubyte*)extensions->wglGetExtensionsStringEXT();
|
||||
else
|
||||
extensions = (GLubyte*)wglGetExtensionsStringARB(wglGetCurrentDC());
|
||||
return extgl_QueryExtension(extensions, name);
|
||||
extension_string = (GLubyte*)extensions->wglGetExtensionsStringARB(wglGetCurrentDC());
|
||||
return extgl_QueryExtension(extension_string, name);
|
||||
}
|
||||
|
||||
static void extgl_InitWGLARBPbuffer()
|
||||
{
|
||||
static void extgl_InitWGLARBPbuffer(WGLExtensions *extensions) {
|
||||
ExtFunction functions[] = {
|
||||
{"wglCreatePbufferARB", (void **)&wglCreatePbufferARB},
|
||||
{"wglGetPbufferDCARB", (void **)&wglGetPbufferDCARB},
|
||||
{"wglReleasePbufferDCARB", (void **)&wglReleasePbufferDCARB},
|
||||
{"wglDestroyPbufferARB", (void **)&wglDestroyPbufferARB},
|
||||
{"wglQueryPbufferARB", (void **)&wglQueryPbufferARB}};
|
||||
if (extension_flags.WGL_ARB_pbuffer)
|
||||
extension_flags.WGL_ARB_pbuffer = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
{"wglCreatePbufferARB", (void **)&extensions->wglCreatePbufferARB},
|
||||
{"wglGetPbufferDCARB", (void **)&extensions->wglGetPbufferDCARB},
|
||||
{"wglReleasePbufferDCARB", (void **)&extensions->wglReleasePbufferDCARB},
|
||||
{"wglDestroyPbufferARB", (void **)&extensions->wglDestroyPbufferARB},
|
||||
{"wglQueryPbufferARB", (void **)&extensions->wglQueryPbufferARB}};
|
||||
if (extensions->WGL_ARB_pbuffer)
|
||||
extensions->WGL_ARB_pbuffer = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
}
|
||||
|
||||
static void extgl_InitWGLARBPixelFormat()
|
||||
{
|
||||
static void extgl_InitWGLARBPixelFormat(WGLExtensions *extensions) {
|
||||
ExtFunction functions[] = {
|
||||
{"wglGetPixelFormatAttribivARB", (void **)&wglGetPixelFormatAttribivARB},
|
||||
{"wglGetPixelFormatAttribfvARB", (void **)&wglGetPixelFormatAttribfvARB},
|
||||
{"wglChoosePixelFormatARB", (void **)&wglChoosePixelFormatARB}};
|
||||
if (extension_flags.WGL_ARB_pixel_format)
|
||||
extension_flags.WGL_ARB_pixel_format = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
{"wglGetPixelFormatAttribivARB", (void **)&extensions->wglGetPixelFormatAttribivARB},
|
||||
{"wglGetPixelFormatAttribfvARB", (void **)&extensions->wglGetPixelFormatAttribfvARB},
|
||||
{"wglChoosePixelFormatARB", (void **)&extensions->wglChoosePixelFormatARB}};
|
||||
if (extensions->WGL_ARB_pixel_format)
|
||||
extensions->WGL_ARB_pixel_format = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
}
|
||||
|
||||
static void extgl_InitWGLARBRenderTexture()
|
||||
{
|
||||
static void extgl_InitWGLARBRenderTexture(WGLExtensions *extensions) {
|
||||
ExtFunction functions[] = {
|
||||
{"wglBindTexImageARB", (void **)&wglBindTexImageARB},
|
||||
{"wglReleaseTexImageARB", (void **)&wglReleaseTexImageARB},
|
||||
{"wglSetPbufferAttribARB", (void **)&wglSetPbufferAttribARB}};
|
||||
if (extension_flags.WGL_ARB_render_texture)
|
||||
extension_flags.WGL_ARB_render_texture = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
{"wglBindTexImageARB", (void **)&extensions->wglBindTexImageARB},
|
||||
{"wglReleaseTexImageARB", (void **)&extensions->wglReleaseTexImageARB},
|
||||
{"wglSetPbufferAttribARB", (void **)&extensions->wglSetPbufferAttribARB}};
|
||||
if (extensions->WGL_ARB_render_texture)
|
||||
extensions->WGL_ARB_render_texture = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
}
|
||||
|
||||
static void extgl_InitWGLEXTSwapControl()
|
||||
{
|
||||
static void extgl_InitWGLEXTSwapControl(WGLExtensions *extensions) {
|
||||
ExtFunction functions[] = {
|
||||
{"wglSwapIntervalEXT", (void **)&wglSwapIntervalEXT},
|
||||
{"wglGetSwapIntervalEXT", (void **)&wglGetSwapIntervalEXT}};
|
||||
if (extension_flags.WGL_EXT_swap_control)
|
||||
extension_flags.WGL_EXT_swap_control = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
{"wglSwapIntervalEXT", (void **)&extensions->wglSwapIntervalEXT},
|
||||
{"wglGetSwapIntervalEXT", (void **)&extensions->wglGetSwapIntervalEXT}};
|
||||
if (extensions->WGL_EXT_swap_control)
|
||||
extensions->WGL_EXT_swap_control = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
}
|
||||
|
||||
static void extgl_InitWGLARBMakeCurrentRead()
|
||||
{
|
||||
static void extgl_InitWGLARBMakeCurrentRead(WGLExtensions *extensions) {
|
||||
ExtFunction functions[] = {
|
||||
{"wglMakeContextCurrentARB", (void **)&wglMakeContextCurrentARB},
|
||||
{"wglGetCurrentReadDCARB", (void **)&wglGetCurrentReadDCARB}};
|
||||
if (extension_flags.WGL_ARB_make_current_read)
|
||||
extension_flags.WGL_ARB_make_current_read = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
{"wglMakeContextCurrentARB", (void **)&extensions->wglMakeContextCurrentARB},
|
||||
{"wglGetCurrentReadDCARB", (void **)&extensions->wglGetCurrentReadDCARB}};
|
||||
if (extensions->WGL_ARB_make_current_read)
|
||||
extensions->WGL_ARB_make_current_read = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
}
|
||||
|
||||
static void extgl_InitSupportedWGLExtensions()
|
||||
{
|
||||
extension_flags.WGL_ARB_buffer_region = WGLQueryExtension("WGL_ARB_buffer_region");
|
||||
extension_flags.WGL_ARB_make_current_read = WGLQueryExtension("WGL_ARB_make_current_read");
|
||||
extension_flags.WGL_ARB_multisample = WGLQueryExtension("WGL_ARB_multisample");
|
||||
extension_flags.WGL_ARB_pbuffer = WGLQueryExtension("WGL_ARB_pbuffer");
|
||||
extension_flags.WGL_ARB_pixel_format = WGLQueryExtension("WGL_ARB_pixel_format");
|
||||
extension_flags.WGL_ARB_render_texture = WGLQueryExtension("WGL_ARB_render_texture");
|
||||
extension_flags.WGL_EXT_swap_control = WGLQueryExtension("WGL_EXT_swap_control");
|
||||
extension_flags.WGL_NV_render_depth_texture = WGLQueryExtension("WGL_NV_render_depth_texture");
|
||||
extension_flags.WGL_NV_render_texture_rectangle = WGLQueryExtension("WGL_NV_render_texture_rectangle");
|
||||
static void extgl_InitSupportedWGLExtensions(WGLExtensions *extensions) {
|
||||
extensions->WGL_ARB_buffer_region = WGLQueryExtension(extensions, "WGL_ARB_buffer_region");
|
||||
extensions->WGL_ARB_make_current_read = WGLQueryExtension(extensions, "WGL_ARB_make_current_read");
|
||||
extensions->WGL_ARB_multisample = WGLQueryExtension(extensions, "WGL_ARB_multisample");
|
||||
extensions->WGL_ARB_pbuffer = WGLQueryExtension(extensions, "WGL_ARB_pbuffer");
|
||||
extensions->WGL_ARB_pixel_format = WGLQueryExtension(extensions, "WGL_ARB_pixel_format");
|
||||
extensions->WGL_ARB_render_texture = WGLQueryExtension(extensions, "WGL_ARB_render_texture");
|
||||
extensions->WGL_EXT_swap_control = WGLQueryExtension(extensions, "WGL_EXT_swap_control");
|
||||
extensions->WGL_NV_render_depth_texture = WGLQueryExtension(extensions, "WGL_NV_render_depth_texture");
|
||||
extensions->WGL_NV_render_texture_rectangle = WGLQueryExtension(extensions, "WGL_NV_render_texture_rectangle");
|
||||
}
|
||||
|
||||
void extgl_InitWGL()
|
||||
{
|
||||
static void extgl_InitWGLEXTExtensionsString(WGLExtensions *extensions) {
|
||||
ExtFunction functions[] = {
|
||||
{"wglGetExtensionsStringARB", (void **)&wglGetExtensionsStringARB},
|
||||
{"wglGetExtensionsStringEXT", (void **)&wglGetExtensionsStringEXT}};
|
||||
extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
extension_flags.WGL_ARB_extensions_string = wglGetExtensionsStringARB != NULL;
|
||||
extension_flags.WGL_EXT_extensions_string = wglGetExtensionsStringEXT != NULL;
|
||||
|
||||
extgl_InitSupportedWGLExtensions();
|
||||
|
||||
extgl_InitWGLARBMakeCurrentRead();
|
||||
extgl_InitWGLEXTSwapControl();
|
||||
extgl_InitWGLARBRenderTexture();
|
||||
extgl_InitWGLARBPixelFormat();
|
||||
extgl_InitWGLARBPbuffer();
|
||||
{"wglGetExtensionsStringEXT", (void **)&extensions->wglGetExtensionsStringEXT}
|
||||
};
|
||||
extensions->WGL_EXT_extensions_string = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
}
|
||||
|
||||
static void extgl_InitWGLARBExtensionsString(WGLExtensions *extensions) {
|
||||
ExtFunction functions[] = {
|
||||
{"wglGetExtensionsStringARB", (void **)&extensions->wglGetExtensionsStringARB}
|
||||
};
|
||||
extensions->WGL_ARB_extensions_string = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions);
|
||||
}
|
||||
|
||||
void extgl_InitWGL(WGLExtensions *extensions) {
|
||||
extgl_InitWGLARBExtensionsString(extensions);
|
||||
extgl_InitWGLEXTExtensionsString(extensions);
|
||||
|
||||
extgl_InitSupportedWGLExtensions(extensions);
|
||||
|
||||
extgl_InitWGLARBMakeCurrentRead(extensions);
|
||||
extgl_InitWGLEXTSwapControl(extensions);
|
||||
extgl_InitWGLARBRenderTexture(extensions);
|
||||
extgl_InitWGLARBPixelFormat(extensions);
|
||||
extgl_InitWGLARBPbuffer(extensions);
|
||||
}
|
||||
|
|
|
@ -40,40 +40,18 @@ THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#include "extgl.h"
|
||||
#include "common_tools.h"
|
||||
|
||||
typedef struct {
|
||||
bool WGL_ARB_buffer_region;
|
||||
bool WGL_ARB_extensions_string;
|
||||
bool WGL_ARB_make_current_read;
|
||||
bool WGL_ARB_multisample;
|
||||
bool WGL_ARB_pbuffer;
|
||||
bool WGL_ARB_pixel_format;
|
||||
bool WGL_ARB_render_texture;
|
||||
bool WGL_EXT_extensions_string;
|
||||
bool WGL_EXT_swap_control;
|
||||
bool WGL_NV_render_depth_texture;
|
||||
bool WGL_NV_render_texture_rectangle;
|
||||
} WGLExtensions;
|
||||
|
||||
extern WGLExtensions extension_flags;
|
||||
|
||||
extern void extgl_InitWGL();
|
||||
|
||||
/*-------------------------------------------------------------------*/
|
||||
/*------------WGL_EXT_EXTENSION_STRING-------------------------------*/
|
||||
/*-------------------------------------------------------------------*/
|
||||
|
||||
typedef const char* (APIENTRY * wglGetExtensionsStringEXTPROC) ();
|
||||
|
||||
extern wglGetExtensionsStringEXTPROC wglGetExtensionsStringEXT;
|
||||
|
||||
/*-------------------------------------------------------------------*/
|
||||
/*------------WGL_ARB_EXTENSION_STRING-------------------------------*/
|
||||
/*-------------------------------------------------------------------*/
|
||||
|
||||
typedef const char* (APIENTRY * wglGetExtensionsStringARBPROC) (HDC hdc);
|
||||
|
||||
extern wglGetExtensionsStringARBPROC wglGetExtensionsStringARB;
|
||||
|
||||
/*-------------------------------------------------------------------*/
|
||||
/*------------WGL_ARB_PBUFFER----------------------------------------*/
|
||||
/*-------------------------------------------------------------------*/
|
||||
|
@ -96,12 +74,6 @@ typedef int (APIENTRY * wglReleasePbufferDCARBPROC) (HPBUFFERARB hPbuffer, HDC h
|
|||
typedef BOOL (APIENTRY * wglDestroyPbufferARBPROC) (HPBUFFERARB hPbuffer);
|
||||
typedef BOOL (APIENTRY * wglQueryPbufferARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
|
||||
|
||||
extern wglCreatePbufferARBPROC wglCreatePbufferARB;
|
||||
extern wglGetPbufferDCARBPROC wglGetPbufferDCARB;
|
||||
extern wglReleasePbufferDCARBPROC wglReleasePbufferDCARB;
|
||||
extern wglDestroyPbufferARBPROC wglDestroyPbufferARB;
|
||||
extern wglQueryPbufferARBPROC wglQueryPbufferARB;
|
||||
|
||||
/*-------------------------------------------------------------------*/
|
||||
/*------------WGL_ARB_PIXEL_FORMAT-----------------------------------*/
|
||||
/*-------------------------------------------------------------------*/
|
||||
|
@ -160,18 +132,10 @@ typedef BOOL (APIENTRY * wglGetPixelFormatAttribivARBPROC) (HDC hdc, int iPixelF
|
|||
typedef BOOL (APIENTRY * wglGetPixelFormatAttribfvARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
|
||||
typedef BOOL (APIENTRY * wglChoosePixelFormatARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
|
||||
|
||||
extern wglGetPixelFormatAttribivARBPROC wglGetPixelFormatAttribivARB;
|
||||
extern wglGetPixelFormatAttribfvARBPROC wglGetPixelFormatAttribfvARB;
|
||||
extern wglChoosePixelFormatARBPROC wglChoosePixelFormatARB;
|
||||
|
||||
typedef BOOL (APIENTRY * wglBindTexImageARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
|
||||
typedef BOOL (APIENTRY * wglReleaseTexImageARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);
|
||||
typedef BOOL (APIENTRY * wglSetPbufferAttribARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList);
|
||||
|
||||
extern wglBindTexImageARBPROC wglBindTexImageARB;
|
||||
extern wglReleaseTexImageARBPROC wglReleaseTexImageARB;
|
||||
extern wglSetPbufferAttribARBPROC wglSetPbufferAttribARB;
|
||||
|
||||
/*-------------------------------------------------------------------*/
|
||||
/*------------WGL_EXT_SWAP_CONTROL-----------------------------------*/
|
||||
/*-------------------------------------------------------------------*/
|
||||
|
@ -179,9 +143,6 @@ extern wglSetPbufferAttribARBPROC wglSetPbufferAttribARB;
|
|||
typedef BOOL (APIENTRY * wglSwapIntervalEXTPROC) (int interval);
|
||||
typedef int (APIENTRY * wglGetSwapIntervalEXTPROC) (void);
|
||||
|
||||
extern wglSwapIntervalEXTPROC wglSwapIntervalEXT;
|
||||
extern wglGetSwapIntervalEXTPROC wglGetSwapIntervalEXT;
|
||||
|
||||
/*-------------------------------------------------------------------*/
|
||||
/*------------WGL_ARB_MAKE_CURRENT_READ------------------------------*/
|
||||
/*-------------------------------------------------------------------*/
|
||||
|
@ -192,9 +153,6 @@ extern wglGetSwapIntervalEXTPROC wglGetSwapIntervalEXT;
|
|||
typedef BOOL (APIENTRY * wglMakeContextCurrentARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
|
||||
typedef HDC (APIENTRY * wglGetCurrentReadDCARBPROC) (void);
|
||||
|
||||
extern wglMakeContextCurrentARBPROC wglMakeContextCurrentARB;
|
||||
extern wglGetCurrentReadDCARBPROC wglGetCurrentReadDCARB;
|
||||
|
||||
/*-------------------------------------------------------------------*/
|
||||
/*------------WGL_ARB_MULTISAMPLE------------------------------------*/
|
||||
/*-------------------------------------------------------------------*/
|
||||
|
@ -202,5 +160,44 @@ extern wglGetCurrentReadDCARBPROC wglGetCurrentReadDCARB;
|
|||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
|
||||
typedef struct {
|
||||
bool WGL_ARB_buffer_region;
|
||||
bool WGL_ARB_extensions_string;
|
||||
bool WGL_ARB_make_current_read;
|
||||
bool WGL_ARB_multisample;
|
||||
bool WGL_ARB_pbuffer;
|
||||
bool WGL_ARB_pixel_format;
|
||||
bool WGL_ARB_render_texture;
|
||||
bool WGL_EXT_extensions_string;
|
||||
bool WGL_EXT_swap_control;
|
||||
bool WGL_NV_render_depth_texture;
|
||||
bool WGL_NV_render_texture_rectangle;
|
||||
wglGetExtensionsStringEXTPROC wglGetExtensionsStringEXT;
|
||||
|
||||
wglGetExtensionsStringARBPROC wglGetExtensionsStringARB;
|
||||
|
||||
wglCreatePbufferARBPROC wglCreatePbufferARB;
|
||||
wglGetPbufferDCARBPROC wglGetPbufferDCARB;
|
||||
wglReleasePbufferDCARBPROC wglReleasePbufferDCARB;
|
||||
wglDestroyPbufferARBPROC wglDestroyPbufferARB;
|
||||
wglQueryPbufferARBPROC wglQueryPbufferARB;
|
||||
|
||||
wglGetPixelFormatAttribivARBPROC wglGetPixelFormatAttribivARB;
|
||||
wglGetPixelFormatAttribfvARBPROC wglGetPixelFormatAttribfvARB;
|
||||
wglChoosePixelFormatARBPROC wglChoosePixelFormatARB;
|
||||
|
||||
wglBindTexImageARBPROC wglBindTexImageARB;
|
||||
wglReleaseTexImageARBPROC wglReleaseTexImageARB;
|
||||
wglSetPbufferAttribARBPROC wglSetPbufferAttribARB;
|
||||
|
||||
wglSwapIntervalEXTPROC wglSwapIntervalEXT;
|
||||
wglGetSwapIntervalEXTPROC wglGetSwapIntervalEXT;
|
||||
|
||||
wglMakeContextCurrentARBPROC wglMakeContextCurrentARB;
|
||||
wglGetCurrentReadDCARBPROC wglGetCurrentReadDCARB;
|
||||
} WGLExtensions;
|
||||
|
||||
extern void extgl_InitWGL(WGLExtensions *extensions);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -49,31 +49,68 @@
|
|||
|
||||
#include "common_tools.h"
|
||||
|
||||
typedef struct _PbufferInfo {
|
||||
HGLRC Pbuffer_context;
|
||||
HPBUFFERARB Pbuffer;
|
||||
HDC Pbuffer_dc;
|
||||
} PbufferInfo;
|
||||
|
||||
static bool isPbuffersSupported() {
|
||||
return extension_flags.WGL_ARB_pixel_format && extension_flags.WGL_ARB_pbuffer;
|
||||
static bool isPbufferSupported(WGLExtensions *extensions) {
|
||||
return extensions->WGL_ARB_pixel_format && extensions->WGL_ARB_pbuffer;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_Win32Display_getPbufferCapabilities
|
||||
(JNIEnv *env, jobject self)
|
||||
JNIEXPORT jint JNICALL Java_org_lwjgl_opengl_Win32Display_nGetPbufferCapabilities
|
||||
(JNIEnv *env, jobject self, jobject pixel_format)
|
||||
{
|
||||
int caps = 0;
|
||||
if (isPbuffersSupported())
|
||||
int origin_x = 0; int origin_y = 0;
|
||||
HWND dummy_hwnd;
|
||||
HDC dummy_hdc;
|
||||
HGLRC dummy_context;
|
||||
HDC saved_hdc;
|
||||
HGLRC saved_context;
|
||||
int pixel_format_id;
|
||||
WGLExtensions extensions;
|
||||
|
||||
pixel_format_id = findPixelFormat(env, origin_x, origin_y, pixel_format, NULL, false, false, true, false);
|
||||
if (pixel_format_id == -1)
|
||||
return 0;
|
||||
dummy_hwnd = createDummyWindow(origin_x, origin_y);
|
||||
if (dummy_hwnd == NULL) {
|
||||
throwException(env, "Could not create dummy window");
|
||||
return 0;
|
||||
}
|
||||
dummy_hdc = GetDC(dummy_hwnd);
|
||||
if (!applyPixelFormat(dummy_hdc, pixel_format_id)) {
|
||||
closeWindow(&dummy_hwnd, &dummy_hdc);
|
||||
throwException(env, "Could not apply pixel format");
|
||||
return 0;
|
||||
}
|
||||
dummy_context = wglCreateContext(dummy_hdc);
|
||||
if (dummy_context == NULL) {
|
||||
closeWindow(&dummy_hwnd, &dummy_hdc);
|
||||
throwException(env, "Could not create dummy context");
|
||||
return 0;
|
||||
}
|
||||
saved_hdc = wglGetCurrentDC();
|
||||
saved_context = wglGetCurrentContext();
|
||||
if (!wglMakeCurrent(dummy_hdc, dummy_context)) {
|
||||
wglMakeCurrent(saved_hdc, saved_context);
|
||||
closeWindow(&dummy_hwnd, &dummy_hdc);
|
||||
wglDeleteContext(dummy_context);
|
||||
throwException(env, "Could not create dummy context");
|
||||
return 0;
|
||||
}
|
||||
extgl_InitWGL(&extensions);
|
||||
if (isPbufferSupported(&extensions))
|
||||
caps |= org_lwjgl_opengl_Pbuffer_PBUFFER_SUPPORTED;
|
||||
|
||||
if (extension_flags.WGL_ARB_render_texture)
|
||||
if (extensions.WGL_ARB_render_texture)
|
||||
caps |= org_lwjgl_opengl_Pbuffer_RENDER_TEXTURE_SUPPORTED;
|
||||
|
||||
if (extension_flags.WGL_NV_render_texture_rectangle)
|
||||
if (extensions.WGL_NV_render_texture_rectangle)
|
||||
caps |= org_lwjgl_opengl_Pbuffer_RENDER_TEXTURE_RECTANGLE_SUPPORTED;
|
||||
|
||||
if (extension_flags.WGL_NV_render_depth_texture)
|
||||
if (extensions.WGL_NV_render_depth_texture)
|
||||
caps |= org_lwjgl_opengl_Pbuffer_RENDER_DEPTH_TEXTURE_SUPPORTED;
|
||||
if (!wglMakeCurrent(saved_hdc, saved_context))
|
||||
printfDebug("ERROR: Could not restore current context\n");
|
||||
closeWindow(&dummy_hwnd, &dummy_hdc);
|
||||
wglDeleteContext(dummy_context);
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
@ -86,8 +123,12 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32PbufferPeerInfo_nCreate
|
|||
int origin_x = 0; int origin_y = 0;
|
||||
HWND dummy_hwnd;
|
||||
HDC dummy_hdc;
|
||||
HGLRC dummy_context;
|
||||
HPBUFFERARB Pbuffer;
|
||||
HDC Pbuffer_dc;
|
||||
HDC saved_hdc;
|
||||
HGLRC saved_context;
|
||||
WGLExtensions extensions;
|
||||
const int *pBufferAttribs_ptr;
|
||||
Win32PeerInfo *peer_info = (Win32PeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||
int pixel_format_id;
|
||||
|
@ -98,7 +139,8 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32PbufferPeerInfo_nCreate
|
|||
pBufferAttribs_ptr = NULL;
|
||||
}
|
||||
pixel_format_id = findPixelFormat(env, origin_x, origin_y, pixel_format, pixelFormatCaps, false, false, true, false);
|
||||
|
||||
if (pixel_format_id == -1)
|
||||
return;
|
||||
dummy_hwnd = createDummyWindow(origin_x, origin_y);
|
||||
if (dummy_hwnd == NULL) {
|
||||
throwException(env, "Could not create dummy window");
|
||||
|
@ -110,36 +152,59 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32PbufferPeerInfo_nCreate
|
|||
throwException(env, "Could not apply pixel format");
|
||||
return;
|
||||
}
|
||||
Pbuffer = wglCreatePbufferARB(dummy_hdc, pixel_format_id, width, height, pBufferAttribs_ptr);
|
||||
dummy_context = wglCreateContext(dummy_hdc);
|
||||
if (dummy_context == NULL) {
|
||||
closeWindow(&dummy_hwnd, &dummy_hdc);
|
||||
throwException(env, "Could not create dummy context");
|
||||
return;
|
||||
}
|
||||
saved_hdc = wglGetCurrentDC();
|
||||
saved_context = wglGetCurrentContext();
|
||||
if (!wglMakeCurrent(dummy_hdc, dummy_context)) {
|
||||
wglMakeCurrent(saved_hdc, saved_context);
|
||||
wglDeleteContext(dummy_context);
|
||||
closeWindow(&dummy_hwnd, &dummy_hdc);
|
||||
throwException(env, "Could not make context current");
|
||||
return;
|
||||
}
|
||||
extgl_InitWGL(&extensions);
|
||||
wglMakeCurrent(saved_hdc, saved_context);
|
||||
wglDeleteContext(dummy_context);
|
||||
closeWindow(&dummy_hwnd, &dummy_hdc);
|
||||
if (!isPbufferSupported(&extensions)) {
|
||||
throwException(env, "Pbuffers are not supported");
|
||||
return;
|
||||
}
|
||||
Pbuffer = extensions.wglCreatePbufferARB(dummy_hdc, pixel_format_id, width, height, pBufferAttribs_ptr);
|
||||
closeWindow(&dummy_hwnd, &dummy_hdc);
|
||||
if (Pbuffer == NULL) {
|
||||
throwException(env, "Could not create Pbuffer");
|
||||
return;
|
||||
}
|
||||
Pbuffer_dc = wglGetPbufferDCARB(Pbuffer);
|
||||
Pbuffer_dc = extensions.wglGetPbufferDCARB(Pbuffer);
|
||||
if (Pbuffer_dc == NULL) {
|
||||
wglDestroyPbufferARB(Pbuffer);
|
||||
extensions.wglDestroyPbufferARB(Pbuffer);
|
||||
throwException(env, "Could not get Pbuffer DC");
|
||||
return;
|
||||
}
|
||||
peer_info->format_hdc = Pbuffer_dc;
|
||||
peer_info->pbuffer = Pbuffer;
|
||||
peer_info->pbuffer.extensions = extensions;
|
||||
peer_info->pbuffer.pbuffer = Pbuffer;
|
||||
peer_info->drawable_hdc = Pbuffer_dc;
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32PbufferPeerInfo_nDestroy
|
||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
||||
Win32PeerInfo *peer_info = (Win32PeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||
wglReleasePbufferDCARB(peer_info->pbuffer, peer_info->drawable_hdc);
|
||||
wglDestroyPbufferARB(peer_info->pbuffer);
|
||||
peer_info->pbuffer.extensions.wglReleasePbufferDCARB(peer_info->pbuffer.pbuffer, peer_info->drawable_hdc);
|
||||
peer_info->pbuffer.extensions.wglDestroyPbufferARB(peer_info->pbuffer.pbuffer);
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Win32PbufferPeerInfo_nIsBufferLost
|
||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle) {
|
||||
Win32PeerInfo *peer_info = (Win32PeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||
BOOL buffer_lost;
|
||||
wglQueryPbufferARB(peer_info->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;
|
||||
}
|
||||
|
||||
|
@ -152,17 +217,17 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32PbufferPeerInfo_nSetPbufferAtt
|
|||
attribs[1] = value;
|
||||
attribs[2] = 0;
|
||||
|
||||
wglSetPbufferAttribARB(peer_info->pbuffer, attribs);
|
||||
peer_info->pbuffer.extensions.wglSetPbufferAttribARB(peer_info->pbuffer.pbuffer, attribs);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32PbufferPeerInfo_nBindTexImageToPbuffer
|
||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jint buffer) {
|
||||
Win32PeerInfo *peer_info = (Win32PeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||
wglBindTexImageARB(peer_info->pbuffer, buffer);
|
||||
peer_info->pbuffer.extensions.wglBindTexImageARB(peer_info->pbuffer.pbuffer, buffer);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32PbufferPeerInfo_nReleaseTexImageFromPbuffer
|
||||
(JNIEnv *env, jclass clazz, jobject peer_info_handle, jint buffer) {
|
||||
Win32PeerInfo *peer_info = (Win32PeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle);
|
||||
wglReleaseTexImageARB(peer_info->pbuffer, buffer);
|
||||
peer_info->pbuffer.extensions.wglReleaseTexImageARB(peer_info->pbuffer.pbuffer, buffer);
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
#include "common_tools.h"
|
||||
|
||||
typedef struct {
|
||||
WGLExtensions extensions;
|
||||
HGLRC context;
|
||||
} Win32Context;
|
||||
|
||||
|
@ -53,6 +54,9 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_Win32ContextImplementation_nCrea
|
|||
Win32Context *context_info;
|
||||
HGLRC context;
|
||||
HGLRC shared_context = NULL;
|
||||
HDC saved_hdc;
|
||||
HGLRC saved_context;
|
||||
WGLExtensions extensions;
|
||||
jobject context_handle = newJavaManagedByteBuffer(env, sizeof(Win32Context));
|
||||
|
||||
if (context_handle == NULL) {
|
||||
|
@ -74,9 +78,21 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_Win32ContextImplementation_nCrea
|
|||
return NULL;
|
||||
}
|
||||
}
|
||||
saved_hdc = wglGetCurrentDC();
|
||||
saved_context = wglGetCurrentContext();
|
||||
if (!wglMakeCurrent(peer_info->format_hdc, context)) {
|
||||
wglMakeCurrent(saved_hdc, saved_context);
|
||||
wglDeleteContext(context);
|
||||
throwException(env, "Could not make context current");
|
||||
return NULL;
|
||||
}
|
||||
extgl_InitWGL(&extensions);
|
||||
if (!wglMakeCurrent(saved_hdc, saved_context))
|
||||
printfDebug("Failed to restore current context\n");
|
||||
context_info = (Win32Context *)(*env)->GetDirectBufferAddress(env, context_handle);
|
||||
context_info->context = context;
|
||||
return context_handle;
|
||||
context_info->extensions = extensions;
|
||||
return context_handle;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32ContextImplementation_nSwapBuffers
|
||||
|
@ -105,12 +121,13 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Win32ContextImplementation_nIsC
|
|||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Win32ContextImplementation_nSetVSync
|
||||
(JNIEnv *env, jclass clazz, jboolean enable) {
|
||||
if (extension_flags.WGL_EXT_swap_control) {
|
||||
(JNIEnv *env, jclass clazz, jobject context_handle, jboolean enable) {
|
||||
Win32Context *context_info = (Win32Context *)(*env)->GetDirectBufferAddress(env, context_handle);
|
||||
if (context_info->extensions.WGL_EXT_swap_control) {
|
||||
if (enable == JNI_TRUE) {
|
||||
wglSwapIntervalEXT(1);
|
||||
context_info->extensions.wglSwapIntervalEXT(1);
|
||||
} else {
|
||||
wglSwapIntervalEXT(0);
|
||||
context_info->extensions.wglSwapIntervalEXT(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue