diff options
Diffstat (limited to 'src/native/ogl/NativeConfigTemplate3D.c')
-rw-r--r-- | src/native/ogl/NativeConfigTemplate3D.c | 1807 |
1 files changed, 0 insertions, 1807 deletions
diff --git a/src/native/ogl/NativeConfigTemplate3D.c b/src/native/ogl/NativeConfigTemplate3D.c deleted file mode 100644 index dc8a356..0000000 --- a/src/native/ogl/NativeConfigTemplate3D.c +++ /dev/null @@ -1,1807 +0,0 @@ -/* - * $RCSfile$ - * - * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - * $Revision$ - * $Date$ - * $State$ - */ - -/* - * Portions of this code were derived from work done by the Blackdown - * group (www.blackdown.org), who did the initial Linux implementation - * of the Java 3D API. - */ - -/* j3dsys.h needs to be included before any other include files to suppres VC warning */ -#include "j3dsys.h" - -#include <jni.h> -#include <math.h> -#include <stdlib.h> - -#include "gldefs.h" - -#if defined(UNIX) -#include <X11/X.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <dlfcn.h> -#endif - -#ifdef WIN32 -#include <windows.h> -#endif - -/* check if the extension is supported */ -extern int isExtensionSupported(const char *allExtensions, const char *extension); - -/* by MIK OF CLASSX */ -extern jboolean getJavaBoolEnv(JNIEnv *env, char* envStr); - -#if defined(UNIX) - -/* Fix for issue 20 */ -#define MAX_GLX_ATTRS_LENGTH 100 - - -GLXFBConfig *find_S_FBConfigs(jlong display, - jint screen, - int* glxAttrs, - int stencilVal, - int sIndex) { - - - GLXFBConfig *fbConfigList = NULL; - int numFBConfigs, index; - MYPFNGLXCHOOSEFBCONFIG pGLXChooseFbConfig = NULL; - GLboolean userReq = GL_TRUE; - - pGLXChooseFbConfig = - (MYPFNGLXCHOOSEFBCONFIG) dlsym(RTLD_DEFAULT, "glXChooseFBConfig"); - - J3D_ASSERT((sIndex+3) < MAX_GLX_ATTRS_LENGTH); - - /* if user not use stencil we will request one of internal use. */ - if (stencilVal < 1) { - userReq = GL_FALSE; - stencilVal = 1; - } - - index = sIndex; - glxAttrs[index++] = GLX_STENCIL_SIZE; - glxAttrs[index++] = stencilVal; - glxAttrs[index] = None; - - fbConfigList = pGLXChooseFbConfig((Display*)display, screen, - glxAttrs, &numFBConfigs); - - - if(fbConfigList != NULL) { - return fbConfigList; - } - - /* - fprintf(stderr, "Stencil : find_S_FBConfigs (TRY 1): FAIL -- stencilVal = %d\n", - stencilVal); - */ - - if (userReq == GL_TRUE) { - /* fprintf(stderr, " userReq : *** FAILED ***\n"); */ - return NULL; - } - - index = sIndex; - glxAttrs[index] = None; - - fbConfigList = pGLXChooseFbConfig((Display*)display, screen, - glxAttrs, &numFBConfigs); - - - if(fbConfigList != NULL) { - return fbConfigList; - } - - /* - fprintf(stderr, "Stencil : find_S_FBConfigs (TRY 2): FAIL -- stencilVal = %d\n", - stencilVal); - */ - - return NULL; - -} - -GLXFBConfig *find_S_S_FBConfigs(jlong display, - jint screen, - int* glxAttrs, - int stereoVal, - int stencilVal, - int sIndex) { - - GLXFBConfig *fbConfigList = NULL; - int numFBConfigs, index; - - J3D_ASSERT((sIndex+3) < MAX_GLX_ATTRS_LENGTH); - - if (stereoVal == REQUIRED || stereoVal== PREFERRED) { - - index = sIndex; - glxAttrs[index++] = GLX_STEREO; - glxAttrs[index++] = True; - glxAttrs[index] = None; - - fbConfigList = find_S_FBConfigs(display, screen, glxAttrs, stencilVal, index); - - if(fbConfigList != NULL) { - return fbConfigList; - } - } - - if (stereoVal == UNNECESSARY || stereoVal== PREFERRED) { - /* This is a workaround to BugId : 5106472 in Solaris OGL. - We can't set glxAttrs with GLX_STEREO follow by a boolean */ - - index = sIndex; - glxAttrs[index] = None; - - /* For debug only - { - int i=0; - fprintf(stderr, "find_S_S_FBConfigs stereoVal = %d\n", stereoVal); - - while(glxAttrs[i] != None) { - fprintf(stderr, "glxAttrs[%d] = %x", i, glxAttrs[i]); - i++; - fprintf(stderr, " glxAttrs[%d] = %x\n", i, glxAttrs[i]); - i++; - } - } - */ - - fbConfigList = find_S_FBConfigs(display, screen, glxAttrs, stencilVal, index); - - if(fbConfigList != NULL) { - return fbConfigList; - } - } - - if (stereoVal == UNNECESSARY) { - index = sIndex; - glxAttrs[index++] = GLX_STEREO; - glxAttrs[index++] = True; - glxAttrs[index] = None; - - /* - fbConfigList = pGLXChooseFbConfig((Display*)display, screen, - glxAttrs, &numFBConfigs); - */ - fbConfigList = find_S_FBConfigs(display, screen, glxAttrs, stencilVal, index); - - if(fbConfigList != NULL) { - return fbConfigList; - } - } - - return NULL; -} - -GLXFBConfig *find_AA_S_S_FBConfigs(jlong display, - jint screen, - int* glxAttrs, - int stereoVal, - int antialiasVal, - int stencilVal, - int antialiasIndex) { - - const char *glxExtensions = NULL; - GLXFBConfig *fbConfigList = NULL; - int index = antialiasIndex; - - - J3D_ASSERT((antialiasIndex+7) < MAX_GLX_ATTRS_LENGTH); - - if(antialiasVal == REQUIRED || antialiasVal== PREFERRED) { - glxExtensions = (const char *) glXGetClientString((Display*)display, GLX_EXTENSIONS); - - if(isExtensionSupported(glxExtensions, "GLX_ARB_multisample")){ - static const int SAMPLE_LENGTH = 5; - static const int samples[] = {8,6,4,3,2}; - int i, samplesIndex; - - index = antialiasIndex; - glxAttrs[index++] = GLX_SAMPLE_BUFFERS_ARB; - glxAttrs[index++] = 1; - glxAttrs[index++] = GLX_SAMPLES_ARB; - samplesIndex = index++; /* Will assign samples in the sample selection loop */ - glxAttrs[index] = None; - - for(i=0; i < SAMPLE_LENGTH; i++) { - /* fprintf(stderr, "find_AA_S_S_FBConfigs samples = %d\n", samples[i]); */ - glxAttrs[samplesIndex] = samples[i]; - fbConfigList = find_S_S_FBConfigs(display, screen, glxAttrs, stereoVal, - stencilVal, index); - - if(fbConfigList != NULL) { - return fbConfigList; - } - } - } - } - - if ( antialiasVal == REQUIRED ) { - index = antialiasIndex; - glxAttrs[index++] = GLX_ACCUM_RED_SIZE; - glxAttrs[index++] = 8; - glxAttrs[index++] = GLX_ACCUM_GREEN_SIZE; - glxAttrs[index++] = 8; - glxAttrs[index++] = GLX_ACCUM_BLUE_SIZE; - glxAttrs[index++] = 8; - glxAttrs[index] = None; - - fbConfigList = find_S_S_FBConfigs(display, screen, glxAttrs, - stereoVal, stencilVal, index); - - if(fbConfigList != NULL) { - return fbConfigList; - } - } - - glxAttrs[antialiasIndex] = None; - - if (antialiasVal == UNNECESSARY || antialiasVal == PREFERRED) { - fbConfigList = find_S_S_FBConfigs(display, screen, glxAttrs, - stereoVal, stencilVal, index); - - if(fbConfigList != NULL) { - return fbConfigList; - } - } - /* We will stop trying even if no fbConfigList is found and - antialiasVal = UNNECESSARY */ - - return NULL; - -} - -GLXFBConfig *find_DB_AA_S_S_FBConfigs(jlong display, - jint screen, - int* glxAttrs, - int stereoVal, int dbVal, - int antialiasVal, - int stencilVal, - int dbIndex) { - - GLXFBConfig *fbConfigList = NULL; - int index = dbIndex; - - J3D_ASSERT((dbIndex+3) < MAX_GLX_ATTRS_LENGTH); - - if (dbVal == REQUIRED || dbVal== PREFERRED) { - - index = dbIndex; - glxAttrs[index++] = GLX_DOUBLEBUFFER; - glxAttrs[index++] = True; - glxAttrs[index] = None; - - fbConfigList = find_AA_S_S_FBConfigs(display, screen, glxAttrs, - stereoVal, antialiasVal, - stencilVal, index); - - if(fbConfigList != NULL) { - return fbConfigList; - } - } - - if (dbVal == UNNECESSARY || dbVal== PREFERRED) { - index = dbIndex; - glxAttrs[index++] = GLX_DOUBLEBUFFER; - glxAttrs[index++] = False; - glxAttrs[index] = None; - - fbConfigList = find_AA_S_S_FBConfigs(display, screen, glxAttrs, - stereoVal, antialiasVal, - stencilVal, index); - - if(fbConfigList != NULL) { - return fbConfigList; - } - } - - if (dbVal == UNNECESSARY) { - index = dbIndex; - glxAttrs[index++] = GLX_DOUBLEBUFFER; - glxAttrs[index++] = True; - glxAttrs[index] = None; - - fbConfigList = find_AA_S_S_FBConfigs(display, screen, glxAttrs, - stereoVal, antialiasVal, - stencilVal, index); - - if(fbConfigList != NULL) { - return fbConfigList; - } - } - - return NULL; -} - -/* - * Uses the passed in array to choose the best OpenGL visual. - * When the "best" visual cannot be used, the "enums" (three - * state attributes) are looped through setting/resetting in all - * combinations in hopes of finding an valid visual. - */ -JNIEXPORT -jint JNICALL Java_javax_media_j3d_X11NativeConfigTemplate3D_chooseOglVisual( - JNIEnv *env, - jobject obj, - jlong display, - jint screen, - jintArray attrList, - jlongArray fbConfigArray) -{ - jint *mx_ptr; - int glxAttrs[MAX_GLX_ATTRS_LENGTH]; /* value, attr pair plus a None */ - int index; - GLXFBConfig *fbConfigList = NULL; - - /* use to cycle through when attr is not REQUIRED */ - int dbVal; /* value for double buffering */ - int stereoVal; /* value for stereo */ - int antialiasVal; /* value for antialias */ - int stencilVal; /* value for stencil size */ - - int drawableIndex; - - jlong *fbConfigListPtr = NULL; - int status, major, minor; - - Display *dpy = (Display *) display; - - fbConfigListPtr = (*env)->GetLongArrayElements(env, fbConfigArray, NULL); - mx_ptr = (*env)->GetIntArrayElements(env, attrList, NULL); - - /* - * convert Java 3D values to GLX - */ - index = 0; - - /* Specify pbuffer as default */ - /* Fix for Issue 20 */ - glxAttrs[index++] = GLX_DRAWABLE_TYPE; - drawableIndex = index; - glxAttrs[index++] = (GLX_PBUFFER_BIT | GLX_WINDOW_BIT); - - /* only interested in RGBA type */ - glxAttrs[index++] = GLX_RENDER_TYPE; - glxAttrs[index++] = GLX_RGBA_BIT; - - /* only interested in FBConfig with associated X Visual type */ - glxAttrs[index++] = GLX_X_RENDERABLE; - glxAttrs[index++] = True; - - glxAttrs[index++] = GLX_RED_SIZE; - glxAttrs[index++] = mx_ptr[RED_SIZE]; - glxAttrs[index++] = GLX_GREEN_SIZE; - glxAttrs[index++] = mx_ptr[GREEN_SIZE]; - glxAttrs[index++] = GLX_BLUE_SIZE; - glxAttrs[index++] = mx_ptr[BLUE_SIZE]; - - /* by MIK OF CLASSX */ - if (getJavaBoolEnv(env, "transparentOffScreen")) { - glxAttrs[index++] = GLX_ALPHA_SIZE; - glxAttrs[index++] = 1; - } - - glxAttrs[index++] = GLX_DEPTH_SIZE; - glxAttrs[index++] = mx_ptr[DEPTH_SIZE]; - glxAttrs[index] = None; - - dbVal = mx_ptr[DOUBLEBUFFER]; - stereoVal = mx_ptr[STEREO]; - antialiasVal = mx_ptr[ANTIALIASING]; - stencilVal = mx_ptr[STENCIL_SIZE]; - - (*env)->ReleaseIntArrayElements(env, attrList, mx_ptr, JNI_ABORT); - - /* Get Pbuffer-capable visual unless j3d.usePbuffer property is FALSE */ - if (getJavaBoolEnv(env,"usePbuffer")) { - fbConfigList = find_DB_AA_S_S_FBConfigs(display, screen, glxAttrs, stereoVal, - dbVal, antialiasVal, stencilVal, index); - } - - if(fbConfigList == NULL) { /* Try with Pixmap, if Pbuffer fail. */ - glxAttrs[drawableIndex] = (GLX_PIXMAP_BIT | GLX_WINDOW_BIT); - fbConfigList = find_DB_AA_S_S_FBConfigs(display, screen, glxAttrs, stereoVal, - dbVal, antialiasVal, stencilVal, index); - } - - if(fbConfigList == NULL) { /* Try with Window only, if Pixmap fail. */ - glxAttrs[drawableIndex] = GLX_WINDOW_BIT; - fbConfigList = find_DB_AA_S_S_FBConfigs(display, screen, glxAttrs, stereoVal, - dbVal, antialiasVal, stencilVal, index); - } - - fbConfigListPtr[0] = (jlong)fbConfigList; - (*env)->ReleaseLongArrayElements(env, fbConfigArray, fbConfigListPtr, 0); - - /* For debug only. - if(fbConfigList != NULL) { - int val; - - glXGetFBConfigAttrib(dpy, fbConfigList[0], - GLX_FBCONFIG_ID, &val); - - fprintf(stderr, "display 0x%x, fbConfigList 0x%x, fbConfig 0x%x, fbConfigId %d\n", - (int) display, (int) fbConfigList, (int) fbConfigList[0], val); - - } - else { - fprintf(stderr, "display 0x%x, fbConfigList 0x%x\n", - (int) display, (int) fbConfigList); - } - */ - - if(fbConfigList != NULL) { - int vis_id; - - if(glXGetFBConfigAttrib(dpy, fbConfigList[0], GLX_VISUAL_ID, &vis_id) != Success) { - fprintf(stderr, "Java 3D ERROR: unable to get VisualID\n"); - return 0; - } - - /* fprintf(stderr, "********* VisualID = %d\n", vis_id ); */ - - return (jint) vis_id; - - } else { - return 0; - } -} - - -JNIEXPORT -void JNICALL Java_javax_media_j3d_X11NativeConfigTemplate3D_freeFBConfig( - JNIEnv *env, - jclass class, /* this is a static native method */ - jlong fbConfigListPtr) -{ - GLXFBConfig *fbConfigList = (GLXFBConfig *) fbConfigListPtr; - XFree(fbConfigList); -} - - -JNIEXPORT -jboolean JNICALL Java_javax_media_j3d_X11NativeConfigTemplate3D_isStereoAvailable( - JNIEnv *env, - jobject obj, - jlong display, - jint screen, - jint vid) -{ - Display *dpy = (Display*) display; - XVisualInfo *vinfo, template; - int nitems; - int stereoFlag; - static GLboolean first_time = GL_TRUE; - static GLboolean force_no_stereo = GL_FALSE; - - if (first_time) { - if (getenv("J3D_NO_STEREO") != NULL) { - fprintf(stderr, "Java 3D: stereo mode disabled\n"); - force_no_stereo = GL_TRUE; - } - first_time = GL_FALSE; - } - - if (force_no_stereo) - return JNI_FALSE; - - template.visualid = vid; - vinfo = XGetVisualInfo(dpy, VisualIDMask, &template, &nitems); - if (nitems != 1) { - fprintf(stderr, "Warning Canvas3D_isStereoAvailable got unexpected number of matching visuals %d\n", nitems); - } - - glXGetConfig(dpy, vinfo, GLX_STEREO, &stereoFlag); - - return (stereoFlag ? JNI_TRUE : JNI_FALSE); -} - -JNIEXPORT jint JNICALL Java_javax_media_j3d_X11NativeConfigTemplate3D_getStencilSize( - JNIEnv *env, - jobject obj, - jlong display, - jint screen, - jint vid) -{ - Display *dpy = (Display*) display; - XVisualInfo *vinfo, template; - int nitems; - int stencilVal = 0; - - template.visualid = vid; - vinfo = XGetVisualInfo(dpy, VisualIDMask, &template, &nitems); - if (nitems != 1) { - fprintf(stderr, "Warning Canvas3D_getStencilSize got unexpected number of matching visuals %d\n", nitems); - } - - glXGetConfig(dpy, vinfo, GLX_STENCIL_SIZE, &stencilVal); - - return stencilVal; -} - -JNIEXPORT -jboolean JNICALL Java_javax_media_j3d_X11NativeConfigTemplate3D_isDoubleBufferAvailable( - JNIEnv *env, - jobject obj, - jlong display, - jint screen, - jint vid) -{ - Display *dpy = (Display*) display; - XVisualInfo *vinfo, template; - int nitems; - int doubleBufferFlag; - - template.visualid = vid; - vinfo = XGetVisualInfo(dpy, VisualIDMask, &template, &nitems); - if (nitems != 1) { - fprintf(stderr, "Warning Canvas3D_isDoubleBufferAvailable got unexpected number of matching visuals %d\n", nitems); - } - - glXGetConfig(dpy, vinfo, GLX_DOUBLEBUFFER, &doubleBufferFlag); - - return (doubleBufferFlag ? JNI_TRUE : JNI_FALSE); -} - -JNIEXPORT -jboolean JNICALL Java_javax_media_j3d_X11NativeConfigTemplate3D_isSceneAntialiasingAccumAvailable( - JNIEnv *env, - jobject obj, - jlong display, - jint screen, - jint vid) -{ - Display *dpy = (Display*) display; - XVisualInfo *vinfo, template; - int nitems; - int numAccumRedBits; - - template.visualid = vid; - vinfo = XGetVisualInfo(dpy, VisualIDMask, &template, &nitems); - if (nitems != 1) { - fprintf(stderr, "Warning Canvas3D_isSceneAntialiasingAvailable got unexpected number of matching visuals %d\n", nitems); - } - - glXGetConfig(dpy, vinfo, GLX_ACCUM_RED_SIZE, &numAccumRedBits); - - return (numAccumRedBits > 0 ? JNI_TRUE : JNI_FALSE); -} - -JNIEXPORT -jboolean JNICALL Java_javax_media_j3d_X11NativeConfigTemplate3D_isSceneAntialiasingMultisampleAvailable( - JNIEnv *env, - jobject obj, - jlong display, - jint screen, - jint vid) -{ - Display *dpy = (Display*) display; - XVisualInfo *vinfo, template; - int nitems; - - const char *glxExtensions; - int numSampleBuffers; - int numSamples; - - template.visualid = vid; - vinfo = XGetVisualInfo(dpy, VisualIDMask, &template, &nitems); - if (nitems != 1) { - fprintf(stderr, "Warning Canvas3D_isSceneAntialiasingAvailable got unexpected number of matching visuals %d\n", nitems); - } - /* try GLX_ARB_multisample */ - glxExtensions = (const char *)glXGetClientString((Display*)display, GLX_EXTENSIONS); - - if(isExtensionSupported(glxExtensions, "GLX_ARB_multisample")){ - glXGetConfig(dpy, vinfo, GLX_SAMPLE_BUFFERS_ARB, &numSampleBuffers); - glXGetConfig(dpy, vinfo, GLX_SAMPLES_ARB, &numSamples); - if(numSampleBuffers > 0 && numSamples > 1){ - return JNI_TRUE; - } - } - - return JNI_FALSE; -} -#endif /* UNIX_ */ - - -#ifdef WIN32 - -extern HWND createDummyWindow(const char* szAppName); - - -PIXELFORMATDESCRIPTOR getDummyPFD() { - - /* Dummy pixel format. -- Chien */ - static PIXELFORMATDESCRIPTOR dummy_pfd = { - sizeof(PIXELFORMATDESCRIPTOR), - 1, /* Version number */ - PFD_DRAW_TO_WINDOW | - PFD_SUPPORT_OPENGL, - PFD_TYPE_RGBA, - 16, /* 16 bit color depth */ - 0, 0, 0, /* RGB bits and pixel sizes */ - 0, 0, 0, /* Do not care about them */ - 0, 0, /* no alpha buffer info */ - 0, 0, 0, 0, 0, /* no accumulation buffer */ - 8, /* 8 bit depth buffer */ - 0, /* no stencil buffer */ - 0, /* no auxiliary buffers */ - PFD_MAIN_PLANE, /* layer type */ - 0, /* reserved, must be 0 */ - 0, /* no layer mask */ - 0, /* no visible mask */ - 0 /* no damage mask */ - }; - - return dummy_pfd; -} - -/* -void printPixelDescriptor(PIXELFORMATDESCRIPTOR *pfd) -{ - - printf("color : r=%d, g=%d, b=%d, a=%d, shift r=%d, g=%d, b=%d, a=%d\n", - pfd->cRedBits, pfd->cGreenBits, pfd->cBlueBits, pfd->cAlphaBits, - pfd->cRedShift, pfd->cGreenShift, pfd->cBlueShift, pfd->cAlphaShift); - printf("Accum r=%d, g=%d, b=%d, a=%d, depth %d, stencil %d, AuxBuffers %d\n", - pfd->cAccumRedBits, pfd->cAccumGreenBits, pfd->cAccumBlueBits, - pfd->cAccumAlphaBits, pfd->cDepthBits, pfd->cStencilBits, pfd->cAuxBuffers); - printf("iLayerType %x, bReserved %x, dwLayerMask %x, dwVisibleMask %x, dwDamageMask %x\n", - pfd->iLayerType, pfd->bReserved, pfd->dwLayerMask, pfd->dwVisibleMask, pfd->dwDamageMask); - if (pfd->dwFlags & PFD_SUPPORT_OPENGL) { - printf("SUPPORT_OPENGL "); - } - if (pfd->dwFlags & PFD_DRAW_TO_WINDOW) { - printf("DRAW_TO_WINDOW "); - } - if (pfd->dwFlags & PFD_DRAW_TO_BITMAP) { - printf("DRAW_TO_BITMAP "); - } - if (pfd->dwFlags & PFD_SUPPORT_GDI) { - printf("SUPPORT_GDI "); - } - if (pfd->dwFlags & PFD_SUPPORT_GDI) { - printf("NEED_PALETTE "); - } - if (pfd->dwFlags & PFD_SUPPORT_GDI) { - printf("NEED_SYSTEM_PALETTE "); - } - if (pfd->dwFlags & PFD_STEREO) { - printf("STEREO "); - } - if (pfd->dwFlags & PFD_SUPPORT_GDI) { - printf("SWAP_LAYER_BUFFERS "); - } - if (pfd->dwFlags & PFD_GENERIC_FORMAT) { - printf("PFD_GENERIC_FORMAT "); - } - if (pfd->dwFlags & PFD_GENERIC_ACCELERATED) { - printf("PFD_GENERIC_FORMAT "); - } - if (pfd->dwFlags & PFD_DOUBLEBUFFER) { - printf("PFD_DOUBLEBUFFER "); - } - printf("\n"); - -} -*/ - -BOOL isSupportedWGL(const char *extensions, const char *extension_string) { - /* get the list of supported extensions */ - const char *p = extensions; - - /* search for extension_string in the list */ - while(p = strstr(p, extension_string)){ - const char *q = p + strlen(extension_string); - - /* must be terminated by <space> or <nul> */ - if(*q == ' ' || *q == '\0') { - return TRUE; - } - - /* try to find another match */ - p = q; - } - return FALSE; -} - -HDC getMonitorDC(int screen) -{ - return CreateDC("DISPLAY", NULL, NULL, NULL); -} - -/* NOTE : Since OpenGL 1.2 or greater is required. This is method will not be - * called. Need to remove in Java 3D 1.5 - */ -int find_DB_S_STDPixelFormat(PIXELFORMATDESCRIPTOR* pfd, HDC hdc, - int *mx_ptr, GLboolean offScreen, int stencilVal) -{ - int pf; - PIXELFORMATDESCRIPTOR newpfd; - - pf = ChoosePixelFormat(hdc, pfd); - - if(!offScreen) { - /* onScreen : Check if pixel format support min. requirement */ - DescribePixelFormat(hdc, pf, sizeof(newpfd), &newpfd); - - if ((newpfd.cRedBits < (unsigned char) mx_ptr[RED_SIZE]) || - (newpfd.cGreenBits < (unsigned char) mx_ptr[GREEN_SIZE]) || - (newpfd.cBlueBits < (unsigned char) mx_ptr[BLUE_SIZE]) || - (newpfd.cDepthBits < (unsigned char) mx_ptr[DEPTH_SIZE]) || - (newpfd.cStencilBits < (unsigned char) mx_ptr[STENCIL_SIZE]) || - ((mx_ptr[DOUBLEBUFFER] == REQUIRED) && - ((newpfd.dwFlags & PFD_DOUBLEBUFFER) == 0)) || - ((mx_ptr[STEREO] == REQUIRED) && ((newpfd.dwFlags & PFD_STEREO) == 0))) - { - return -1; - } - - if ((mx_ptr[ANTIALIASING] == REQUIRED) && - ((newpfd.cAccumRedBits <= 0) || - (newpfd.cAccumGreenBits <= 0) || - (newpfd.cAccumBlueBits <= 0))) - { - return -1; - } - } - - return pf; -} - - -void printErrorMessage(char *message) -{ - DWORD err; - char * errString; - - err = GetLastError(); - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, err, 0, (LPTSTR)&errString, 0, NULL); - fprintf(stderr, "Java 3D ERROR : %s - %s\n", message, errString); - LocalFree(errString); -} - -/* Fix for issue 76 */ -#define MAX_WGL_ATTRS_LENGTH 100 - - -int find_S_PixelFormat(HDC hdc, PixelFormatInfo * pFormatInfo, - int* wglAttrs, int stencilVal, int sIndex) { - - int pFormat, availableFormats, index; - GLboolean userReq = GL_TRUE; - - J3D_ASSERT((sIndex+4) < MAX_WGL_ATTRS_LENGTH); - /* if user not use stencil we will request one of internal use. */ - if (stencilVal < 1) { - userReq = GL_FALSE; - stencilVal = 1; - } - - index = sIndex; - wglAttrs[index++] = WGL_STENCIL_BITS_ARB; - wglAttrs[index++] = stencilVal; - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormat = -1; - - if ((pFormatInfo->wglChoosePixelFormatARB(hdc, wglAttrs, NULL, 1, - &pFormat, &availableFormats)) && (availableFormats > 0)) { - - /* - fprintf(stderr, "Stencil : wglChoosePixelFormatARB : pFormat %d availableFormats %d\n", - pFormat, availableFormats); - */ - return pFormat; - } - - /* - fprintf(stderr, "Stencil : wglChoosePixelFormatARB (TRY 1): FAIL -- stencilVal = %d\n", - stencilVal); - */ - - if (userReq == GL_TRUE) { - /* fprintf(stderr, " userReq : *** FAILED ***\n"); */ - return -1; - } - - index = sIndex; - - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormat = -1; - - if ((pFormatInfo->wglChoosePixelFormatARB(hdc, wglAttrs, NULL, 1, - &pFormat, &availableFormats)) && (availableFormats > 0)) { - - /* fprintf(stderr, "wglChoosePixelFormatARB : pFormat %d availableFormats %d\n", - pFormat, availableFormats); */ - - return pFormat; - } - - /* fprintf(stderr, "wglChoosePixelFormatARB (TRY 2): FAIL\n"); */ - return -1; -} - -int find_S_S_PixelFormat(HDC hdc, PixelFormatInfo * pFormatInfo, int* wglAttrs, - int stereoVal, int stencilVal, int sIndex) { - - int pFormat, index; - - J3D_ASSERT((sIndex+4) < MAX_WGL_ATTRS_LENGTH); - - if (stereoVal == REQUIRED || stereoVal== PREFERRED) { - - index = sIndex; - wglAttrs[index++] = WGL_STEREO_ARB; - wglAttrs[index++] = TRUE; - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormat = find_S_PixelFormat(hdc, pFormatInfo, wglAttrs, - stencilVal, index); - /* fprintf(stderr,"STEREO REQUIRED or PREFERRED ***pFormat %d\n", pFormat); */ - - if(pFormat >= 0) { - return pFormat; - } - } - - if (stereoVal == UNNECESSARY || stereoVal== PREFERRED) { - - index = sIndex; - wglAttrs[index++] = WGL_STEREO_ARB; - wglAttrs[index++] = FALSE; - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormat = find_S_PixelFormat(hdc, pFormatInfo, wglAttrs, - stencilVal, index); - - /* fprintf(stderr,"STEREO UNNECC. or PREFERRED ***pFormat %d\n", pFormat); */ - - if(pFormat >= 0) { - return pFormat; - } - } - - if (stereoVal == UNNECESSARY) { - index = sIndex; - wglAttrs[index++] = WGL_STEREO_ARB; - wglAttrs[index++] = TRUE; - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormat = find_S_PixelFormat(hdc, pFormatInfo, wglAttrs, - stencilVal, index); - - /* fprintf(stderr,"STEREO UNNECC. ***pFormat %d\n", pFormat); */ - - if(pFormat >= 0) { - return pFormat; - } - } - - return -1; -} - - -int find_AA_S_S_PixelFormat( HDC hdc, PixelFormatInfo * pFormatInfo, - int* wglAttrs, int stereoVal, int antialiasVal, - int stencilVal, int antialiasIndex) { - - int index; - int pFormat; - GLboolean supportMS = GL_FALSE; - - J3D_ASSERT((antialiasIndex+8) < MAX_WGL_ATTRS_LENGTH); - - if(antialiasVal == REQUIRED || antialiasVal== PREFERRED) { - - if(isSupportedWGL(pFormatInfo->supportedExtensions, "WGL_ARB_multisample")) { - supportMS = GL_TRUE; - } - else { - /* Under Wildcat III it doesn't use wglGetExtensionString */ - char *supportedExtensions = (char *) glGetString(GL_EXTENSIONS); - - /* fprintf(stderr, "GL Supported extensions: %s.\n", supportedExtensions); */ - - if (isSupportedWGL(supportedExtensions, "GL_ARB_multisample")) { - supportMS = GL_TRUE; - } - } - - if(supportMS) { - static const int SAMPLE_LENGTH = 5; - static const int samples[] = {8,6,4,3,2}; - int i, samplesIndex; - - index = antialiasIndex; - wglAttrs[index++] = WGL_SAMPLE_BUFFERS_ARB; - wglAttrs[index++] = 1; - wglAttrs[index++] = WGL_SAMPLES_ARB; - samplesIndex = index++; /* Will assign samples in the sample selection loop */ - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - - for(i=0; i < SAMPLE_LENGTH; i++) { - /* fprintf(stderr, "find_AA_S_S_PixelFormat samples = %d\n", samples[i]); */ - - wglAttrs[samplesIndex] = samples[i]; - pFormat = find_S_S_PixelFormat(hdc, pFormatInfo, wglAttrs, - stereoVal, stencilVal, index); - if(pFormat >= 0) { - return pFormat; - } - } - } - } - - if ( antialiasVal == REQUIRED ) { - - index = antialiasIndex; - wglAttrs[index++] = WGL_ACCUM_RED_BITS_ARB; - wglAttrs[index++] = 8; - wglAttrs[index++] = WGL_ACCUM_GREEN_BITS_ARB; - wglAttrs[index++] = 8; - wglAttrs[index++] = WGL_ACCUM_BLUE_BITS_ARB; - wglAttrs[index++] = 8; - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormat = find_S_S_PixelFormat(hdc, pFormatInfo, wglAttrs, - stereoVal, stencilVal, index); - - if(pFormat >= 0) { - return pFormat; - } - } - - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - index = antialiasIndex; - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - if (antialiasVal == UNNECESSARY || antialiasVal == PREFERRED) { - - pFormat = find_S_S_PixelFormat(hdc, pFormatInfo, wglAttrs, - stereoVal, stencilVal, index); - - if(pFormat >= 0) { - return pFormat; - } - - } - - return -1; - -} - - -int find_DB_AA_S_S_PixelFormat( HDC hdc, PixelFormatInfo * pFormatInfo, - int* wglAttrs, int stereoVal, int dbVal, - int antialiasVal, int stencilVal, int dbIndex) { - - int index = dbIndex; - int pFormat; - - J3D_ASSERT((dbIndex+4) < MAX_WGL_ATTRS_LENGTH); - - if (dbVal == REQUIRED || dbVal== PREFERRED) { - - index = dbIndex; - wglAttrs[index++] = WGL_DOUBLE_BUFFER_ARB; - wglAttrs[index++] = TRUE; - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormat = find_AA_S_S_PixelFormat(hdc, pFormatInfo, - wglAttrs, stereoVal, - antialiasVal, stencilVal, index); - - if(pFormat >= 0) { - return pFormat; - } - } - - if (dbVal == UNNECESSARY || dbVal== PREFERRED) { - index = dbIndex; - wglAttrs[index++] = WGL_DOUBLE_BUFFER_ARB; - wglAttrs[index++] = FALSE; /* Partial fix to issue 100. */ - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormat = find_AA_S_S_PixelFormat(hdc, pFormatInfo, - wglAttrs, stereoVal, - antialiasVal, stencilVal, index); - - if(pFormat >= 0) { - return pFormat; - } - } - - if (dbVal == UNNECESSARY) { - index = dbIndex; - wglAttrs[index++] = WGL_DOUBLE_BUFFER_ARB; - wglAttrs[index++] = TRUE; - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormat = find_AA_S_S_PixelFormat(hdc, pFormatInfo, - wglAttrs, stereoVal, - antialiasVal, stencilVal, index); - - if(pFormat >= 0) { - return pFormat; - } - } - - return -1; -} - -/* Fix to issue 77 */ -/* Check PixelFormat capabilities and cache the info. into pFormatInfo structure */ -void checkPixelFormat(HDC hdc, - PixelFormatInfo *pFormatInfo, - GLboolean offScreen ) -{ - int wglAttrs[3]; - int piValues[2]; - int pf = -1; - GLboolean hasMultisample = GL_FALSE; - GLboolean hasStereo = GL_FALSE; - GLboolean hasDoubleBuffer = GL_FALSE; - GLboolean hasAccum - = GL_FALSE; - int stencilSize = 0; - PIXELFORMATDESCRIPTOR pfd; - - /* fprintf(stderr, "*** checkPixelFormat : offScreen = %d\n", offScreen); */ - - if(!offScreen) { - pf = pFormatInfo->onScreenPFormat; - } - else { - pf = pFormatInfo->offScreenPFormat; - } - - /* Assert that pf is valid */ - J3D_ASSERT(pf >= 0); - piValues[0] = GL_FALSE; - piValues[1] = -1; - - if( pFormatInfo->supportARB && - isSupportedWGL( pFormatInfo->supportedExtensions, "WGL_ARB_multisample")){ - wglAttrs[0] = WGL_SAMPLE_BUFFERS_ARB; - wglAttrs[1] = WGL_SAMPLES_ARB; - wglAttrs[2] = 0; - if (pFormatInfo->wglGetPixelFormatAttribivARB(hdc, pf, 0, 2, - wglAttrs, piValues)) { - if ((piValues[0]) && (piValues[1] > 1)) { - hasMultisample = GL_TRUE; - } - } - /* - fprintf(stderr, "*** checkPixelFormat : hasMultisample = %d numSamples %d\n", - hasMultisample, piValues[1]); - */ - } - - DescribePixelFormat(hdc, pf, sizeof(pfd), &pfd); - - if (pfd.dwFlags & PFD_STEREO) { - hasStereo = GL_TRUE; - } - if (pfd.dwFlags & PFD_DOUBLEBUFFER) { - hasDoubleBuffer = GL_TRUE; - } - if (pfd.cAccumRedBits > 0) { - hasAccum = GL_TRUE; - } - - stencilSize = pfd.cStencilBits; - - /* - fprintf(stderr, "hasStereo = %d, hasDoubleBuffer %d, hasAccum %d stencilSize %d\n", - hasStereo, hasDoubleBuffer, hasAccum, pfd.cStencilBits); - */ - - if(pFormatInfo->onScreenPFormat == pFormatInfo->offScreenPFormat) { - pFormatInfo->onScreenHasMultisample = hasMultisample; - pFormatInfo->onScreenHasStereo = hasStereo; - pFormatInfo->onScreenHasDoubleBuffer = hasDoubleBuffer; - pFormatInfo->onScreenHasAccum = hasAccum; - pFormatInfo->onScreenStencilSize = stencilSize; - - pFormatInfo->offScreenHasMultisample = hasMultisample; - pFormatInfo->offScreenHasStereo = hasStereo; - pFormatInfo->offScreenHasDoubleBuffer = hasDoubleBuffer; - pFormatInfo->offScreenHasAccum = hasAccum; - pFormatInfo->offScreenStencilSize = stencilSize; - } - else if(!offScreen) { - pFormatInfo->onScreenHasMultisample = hasMultisample; - pFormatInfo->onScreenHasStereo = hasStereo; - pFormatInfo->onScreenHasDoubleBuffer = hasDoubleBuffer; - pFormatInfo->onScreenHasAccum = hasAccum; - pFormatInfo->onScreenStencilSize = stencilSize; - } - else { - pFormatInfo->offScreenHasMultisample = hasMultisample; - pFormatInfo->offScreenHasStereo = hasStereo; - pFormatInfo->offScreenHasDoubleBuffer = hasDoubleBuffer; - pFormatInfo->offScreenHasAccum = hasAccum; - pFormatInfo->offScreenStencilSize = stencilSize; - } - -} - - -int chooseSTDPixelFormat( - JNIEnv *env, - jint screen, - jintArray attrList, - HDC hdc, - GLboolean offScreen) -{ - int *mx_ptr; - int dbVal; /* value for double buffering */ - int stereoVal; /* value for stereo */ - int pFormat = -1; /* PixelFormat */ - PIXELFORMATDESCRIPTOR pfd; - int stencilVal = 0; /* value for stencil size */ - GLboolean userReq = GL_TRUE; - - /* fprintf(stderr, "chooseSTDPixelFormat : screen 0x%x, offScreen %d hdc 0x%x\n", - screen, offScreen, hdc); */ - - ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; /* When would this change? */ - pfd.iPixelType = PFD_TYPE_RGBA; - - /* - * Convert Java 3D values to PixelFormat - */ - mx_ptr = (*env)->GetIntArrayElements(env, attrList, NULL); - - if(!offScreen) { - - pfd.cRedBits = (unsigned char) mx_ptr[RED_SIZE]; - pfd.cGreenBits = (unsigned char) mx_ptr[GREEN_SIZE]; - pfd.cBlueBits = (unsigned char) mx_ptr[BLUE_SIZE]; - pfd.cDepthBits = (unsigned char) mx_ptr[DEPTH_SIZE]; - - if (mx_ptr[DOUBLEBUFFER] == REQUIRED || mx_ptr[DOUBLEBUFFER] == PREFERRED) - dbVal = PFD_DOUBLEBUFFER; - else - dbVal = PFD_DOUBLEBUFFER_DONTCARE; - - stereoVal = 0; - if (mx_ptr[STEREO] == REQUIRED || mx_ptr[STEREO] == PREFERRED) { - stereoVal = PFD_STEREO; - } else { - stereoVal = PFD_STEREO_DONTCARE; - } - - pfd.dwFlags = dbVal | stereoVal | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW; - - /* if user not use stencil we will request one of internal use. */ - stencilVal = mx_ptr[STENCIL_SIZE]; - if (stencilVal < 1) { - userReq = GL_FALSE; - stencilVal = 1; - } - - pfd.cStencilBits = stencilVal; - - if (mx_ptr[ANTIALIASING] == REQUIRED) { - pfd.cAccumRedBits = 8; - pfd.cAccumGreenBits = 8; - pfd.cAccumBlueBits = 8; - } - - } - else { /* Offscreen setting. */ - /* We are here b/c there is no support for Pbuffer on the HW. - This is a fallback path, we will hardcore the value. */ - - /* NOTE : Stencil size isn't handle for Offscreen */ - - /* by MIK OF CLASSX */ - pfd.iPixelType = PFD_TYPE_RGBA; - if (getJavaBoolEnv(env, "transparentOffScreen")) { - pfd.cRedBits = 8; - pfd.cGreenBits = 8; - pfd.cBlueBits = 8; - pfd.cAlphaBits = 8; - pfd.cColorBits = 32; - } - else { - pfd.cRedBits = 8; - pfd.cGreenBits = 8; - pfd.cBlueBits = 8; - pfd.cAlphaBits = 0; - pfd.cColorBits = 24; - } - pfd.cDepthBits = 32; - pfd.iLayerType = PFD_MAIN_PLANE; - pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_BITMAP | PFD_SUPPORT_GDI; - - } - - pFormat = find_DB_S_STDPixelFormat(&pfd, hdc, mx_ptr, offScreen, stencilVal); - - if ((pFormat == -1) && (userReq == GL_FALSE)) { - /* try disable stencil buffer */ - pfd.cStencilBits = 0; - stencilVal = 0; - pFormat = find_DB_S_STDPixelFormat(&pfd, hdc, mx_ptr, offScreen, stencilVal); - } - - (*env)->ReleaseIntArrayElements(env, attrList, mx_ptr, JNI_ABORT); - return pFormat; -} - -PixelFormatInfo * newPixelFormatInfo(HDC hdc, jboolean usePbuffer) -{ - PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = NULL; - - PixelFormatInfo *pFormatInfo = (PixelFormatInfo *) malloc(sizeof(PixelFormatInfo)); - - /* Initialize pFormatInfo */ - pFormatInfo->onScreenPFormat = -1; - pFormatInfo->onScreenHasMultisample = GL_FALSE; - pFormatInfo->onScreenHasStereo = GL_FALSE; - pFormatInfo->onScreenHasDoubleBuffer = GL_FALSE; - pFormatInfo->onScreenHasAccum = GL_FALSE; - pFormatInfo->onScreenStencilSize = 0; - - pFormatInfo->offScreenPFormat = -1; - pFormatInfo->offScreenHasMultisample = GL_FALSE; - pFormatInfo->offScreenHasStereo = GL_FALSE; - pFormatInfo->offScreenHasDoubleBuffer = GL_FALSE; - pFormatInfo->offScreenHasAccum = GL_FALSE; - pFormatInfo->offScreenStencilSize = 0; - pFormatInfo->drawToPbuffer = GL_FALSE; - - pFormatInfo->supportARB = GL_FALSE; - pFormatInfo->supportPbuffer = GL_FALSE; - pFormatInfo->supportedExtensions = NULL; - pFormatInfo->wglChoosePixelFormatARB = NULL; - pFormatInfo->wglGetPixelFormatAttribivARB = NULL; - pFormatInfo->wglCreatePbufferARB = NULL; - pFormatInfo->wglGetPbufferDCARB = NULL; - pFormatInfo->wglReleasePbufferDCARB = NULL; - pFormatInfo->wglDestroyPbufferARB = NULL; - pFormatInfo->wglQueryPbufferARB = NULL; - - wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) - wglGetProcAddress("wglGetExtensionsStringARB"); - if (wglGetExtensionsStringARB == NULL) { - printErrorMessage("wglGetExtensionsStringARB not support !\n"); - /* Doesn't support extensions, return to use standard choosePixelFormat. */ - return pFormatInfo; - } - - /* get the list of supported extensions */ - pFormatInfo->supportedExtensions = (char *)wglGetExtensionsStringARB(hdc); - - /* fprintf(stderr, "WGL Supported extensions: %s.\n", - pFormatInfo->supportedExtensions); */ - - if (isSupportedWGL(pFormatInfo->supportedExtensions, "WGL_ARB_pixel_format")) { - pFormatInfo->wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC) - wglGetProcAddress("wglChoosePixelFormatARB"); - - pFormatInfo->wglGetPixelFormatAttribivARB = - (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) - wglGetProcAddress("wglGetPixelFormatAttribivARB"); - - if ((pFormatInfo->wglChoosePixelFormatARB != NULL) && - (pFormatInfo->wglGetPixelFormatAttribivARB != NULL)){ - - /* fprintf(stderr, "wglChoosePixelFormatARB is supported.\n"); */ - pFormatInfo->supportARB = GL_TRUE; - - if (usePbuffer && - isSupportedWGL(pFormatInfo->supportedExtensions, "WGL_ARB_pbuffer")) { - /* Get pbuffer entry points */ - pFormatInfo->wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC) - wglGetProcAddress("wglCreatePbufferARB"); - pFormatInfo->wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC) - wglGetProcAddress("wglGetPbufferDCARB"); - pFormatInfo->wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC) - wglGetProcAddress("wglReleasePbufferDCARB"); - pFormatInfo->wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC) - wglGetProcAddress("wglDestroyPbufferARB"); - pFormatInfo->wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC) - wglGetProcAddress("wglQueryPbufferARB"); - - if((pFormatInfo->wglCreatePbufferARB != NULL) && - (pFormatInfo->wglGetPbufferDCARB != NULL) && - (pFormatInfo->wglReleasePbufferDCARB != NULL) && - (pFormatInfo->wglDestroyPbufferARB != NULL) && - (pFormatInfo->wglQueryPbufferARB != NULL)) { - - pFormatInfo->supportPbuffer = GL_TRUE; - /* fprintf(stderr, "WGL support Pbuffer\n"); */ - - } - else { - printErrorMessage("Problem in getting WGL_ARB_pbuffer functions !\n"); - } - } - } - else { - printErrorMessage("Problem in getting WGL_ARB_pixel_format functions !\n"); - } - } - - return pFormatInfo; -} - - -JNIEXPORT -jint JNICALL Java_javax_media_j3d_Win32NativeConfigTemplate3D_choosePixelFormat( - JNIEnv *env, - jobject obj, - jlong ctxInfo, - jint screen, - jintArray attrList, - jlongArray offScreenPFArray) -{ - static const BOOL debug = TRUE; - static char szAppName[] = "Choose Pixel Format"; - - int *mx_ptr; - int dbVal; /* value for double buffering */ - int stereoVal; /* value for stereo */ - int antialiasVal; /* value for antialias */ - int stencilVal; /* value for stencil size */ - - HWND hwnd; - HGLRC hrc; - HDC hdc; - int pixelFormat; - int wglAttrs[MAX_WGL_ATTRS_LENGTH]; - int index, lastIndex; - PixelFormatInfo *pFormatInfo = NULL; - jlong * offScreenPFListPtr; - PIXELFORMATDESCRIPTOR dummy_pfd = getDummyPFD(); - - /* - * Select any pixel format and bound current context to - * it so that we can get the wglChoosePixelFormatARB entry point. - * Otherwise wglxxx entry point will always return null. - * That's why we need to create a dummy window also. - */ - hwnd = createDummyWindow((const char *)szAppName); - - if (!hwnd) { - return -1; - } - hdc = GetDC(hwnd); - - pixelFormat = ChoosePixelFormat(hdc, &dummy_pfd); - - if (pixelFormat<1) { - printErrorMessage("In NativeConfigTemplate : Failed in ChoosePixelFormat"); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; - } - - if (!SetPixelFormat(hdc, pixelFormat, NULL)) { - printErrorMessage("In NativeConfigTemplate : Failed in SetPixelFormat"); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; - } - - hrc = wglCreateContext(hdc); - if (!hrc) { - printErrorMessage("In NativeConfigTemplate : Failed in wglCreateContext"); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; - } - - if (!wglMakeCurrent(hdc, hrc)) { - printErrorMessage("In NativeConfigTemplate : Failed in wglMakeCurrent"); - wglDeleteContext(hrc); - ReleaseDC(hwnd, hdc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; - } - - pFormatInfo = newPixelFormatInfo(hdc, getJavaBoolEnv(env,"usePbuffer")); - - offScreenPFListPtr = (*env)->GetLongArrayElements(env, offScreenPFArray, NULL); - - if (pFormatInfo->supportARB) { - - /* fprintf(stderr, "Using non standard ChoosePixelFormat.\n"); */ - - mx_ptr = (*env)->GetIntArrayElements(env, attrList, NULL); - - /* - * convert Java 3D values to WGL - */ - index = 0; - - wglAttrs[index++] = WGL_SUPPORT_OPENGL_ARB; - wglAttrs[index++] = TRUE; - wglAttrs[index++] = WGL_ACCELERATION_ARB; - wglAttrs[index++] = WGL_FULL_ACCELERATION_ARB; - wglAttrs[index++] = WGL_DRAW_TO_WINDOW_ARB; - wglAttrs[index++] = TRUE; - wglAttrs[index++] = WGL_RED_BITS_ARB; - wglAttrs[index++] = mx_ptr[RED_SIZE]; - wglAttrs[index++] = WGL_GREEN_BITS_ARB; - wglAttrs[index++] = mx_ptr[GREEN_SIZE]; - wglAttrs[index++] = WGL_BLUE_BITS_ARB; - wglAttrs[index++] = mx_ptr[BLUE_SIZE]; - - /* by MIK OF CLASSX */ - if (getJavaBoolEnv(env, "transparentOffScreen")) { - wglAttrs[index++] = WGL_ALPHA_BITS_ARB; - wglAttrs[index++] = 1; - } - - wglAttrs[index++] = WGL_DEPTH_BITS_ARB; - wglAttrs[index++] = mx_ptr[DEPTH_SIZE]; - - lastIndex = index; - - dbVal = mx_ptr[DOUBLEBUFFER]; - stereoVal = mx_ptr[STEREO]; - antialiasVal = mx_ptr[ANTIALIASING]; - stencilVal = mx_ptr[STENCIL_SIZE]; - - (*env)->ReleaseIntArrayElements(env, attrList, mx_ptr, JNI_ABORT); - - if(pFormatInfo->supportPbuffer) { - - wglAttrs[index++] = WGL_DRAW_TO_PBUFFER_ARB; - wglAttrs[index++] = TRUE; - - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormatInfo->onScreenPFormat = find_DB_AA_S_S_PixelFormat( hdc, pFormatInfo, - wglAttrs, stereoVal, - dbVal, antialiasVal, - stencilVal, index); - - if(pFormatInfo->onScreenPFormat >= 0) { - /* Since the return pixel format support pbuffer, - we can use it for onScreen and offScreen. */ - pFormatInfo->drawToPbuffer = GL_TRUE; - pFormatInfo->offScreenPFormat = pFormatInfo->onScreenPFormat; - - /* Fix to issue 77 */ - checkPixelFormat(hdc, pFormatInfo, GL_FALSE ); - - offScreenPFListPtr[0] = (jlong) pFormatInfo; - (*env)->ReleaseLongArrayElements(env, offScreenPFArray, offScreenPFListPtr, 0); - - /* Destroy all dummy objects */ - wglDeleteContext(hrc); - ReleaseDC(hwnd, hdc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - - return (jint) pFormatInfo->onScreenPFormat; - } - } - - /* Create a onScreen without Pbuffer */ - pFormatInfo->drawToPbuffer = GL_FALSE; - index = lastIndex; - - /* - * Terminate by 2 zeros to avoid driver bugs - * that assume attributes always come in pairs. - */ - wglAttrs[index] = 0; - wglAttrs[index+1] = 0; - - pFormatInfo->onScreenPFormat = find_DB_AA_S_S_PixelFormat( hdc, pFormatInfo, - wglAttrs, stereoVal, - dbVal, antialiasVal, - stencilVal, index); - } - else { - fprintf(stderr, "Fallback to use standard ChoosePixelFormat.\n"); - - pFormatInfo->onScreenPFormat = (jint) chooseSTDPixelFormat( env, screen, - attrList, hdc, GL_FALSE); - } - - if(pFormatInfo->onScreenPFormat < 0) { - /* - printErrorMessage("In NativeConfigTemplate : Can't choose a onScreen pixel format"); - */ - - offScreenPFListPtr[0] = (jlong) pFormatInfo; - (*env)->ReleaseLongArrayElements(env, offScreenPFArray, offScreenPFListPtr, 0); - - /* We are done with dummy context, so destroy all dummy objects */ - wglDeleteContext(hrc); - ReleaseDC(hwnd, hdc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - - return -1; - } - - /* Fix to issue 77 */ - checkPixelFormat(hdc, pFormatInfo, GL_FALSE ); - - /* Create offScreen with standard ChoosePixelFormat */ - pFormatInfo->offScreenPFormat = chooseSTDPixelFormat( env, screen, attrList, hdc, GL_TRUE); - - /* fprintf(stderr, "********* offScreenPFormat = %d\n", pFormatInfo->offScreenPFormat ); */ - - /* Fix to issue 77 */ - if(pFormatInfo->offScreenPFormat >= 0) { - checkPixelFormat(hdc, pFormatInfo, GL_TRUE ); - } - - offScreenPFListPtr[0] = (jlong) pFormatInfo; - (*env)->ReleaseLongArrayElements(env, offScreenPFArray, offScreenPFListPtr, 0); - - /* We are done with dummy context, so destroy all dummy objects */ - wglDeleteContext(hrc); - ReleaseDC(hwnd, hdc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - - return (jint) pFormatInfo->onScreenPFormat; -} - - -JNIEXPORT -void JNICALL Java_javax_media_j3d_Win32NativeConfigTemplate3D_freePixelFormatInfo( - JNIEnv *env, - jclass class, /* this is a static native method */ - jlong pFormatInfo) -{ - PixelFormatInfo *pfInfo = (PixelFormatInfo *) pFormatInfo; - if(pfInfo->supportedExtensions != NULL) { - free(pfInfo->supportedExtensions); - pfInfo->supportedExtensions = NULL; - } - pfInfo->wglChoosePixelFormatARB = NULL; - pfInfo->wglGetPixelFormatAttribivARB = NULL; - pfInfo->wglCreatePbufferARB = NULL; - pfInfo->wglGetPbufferDCARB = NULL; - pfInfo->wglReleasePbufferDCARB = NULL; - pfInfo->wglDestroyPbufferARB = NULL; - pfInfo->wglQueryPbufferARB = NULL; - free(pfInfo); -} - - -JNIEXPORT -jboolean JNICALL Java_javax_media_j3d_Win32NativeConfigTemplate3D_isStereoAvailable( - JNIEnv *env, - jobject obj, - jlong pFormatInfo, - jboolean offScreen) -{ - - static GLboolean first_time = GL_TRUE; - static GLboolean force_no_stereo = GL_FALSE; - PixelFormatInfo *pfInfo = (PixelFormatInfo *) pFormatInfo; - - if (first_time) { - if (getenv("J3D_NO_STEREO") != NULL) { - fprintf(stderr, "Java 3D: stereo mode disabled\n"); - force_no_stereo = GL_TRUE; - } - first_time = GL_FALSE; - } - - if (force_no_stereo) - return JNI_FALSE; - - if(offScreen) { - /* fprintf(stderr, "offScreen isStereoAvailable %d\n", - pfInfo->offScreenHasStereo); */ - - return pfInfo->offScreenHasStereo; - } - else { - /* fprintf(stderr, "onScreen isStereoAvailable %d\n", - pfInfo->onScreenHasStereo); */ - - return pfInfo->onScreenHasStereo; - } - -} - -JNIEXPORT jint JNICALL Java_javax_media_j3d_Win32NativeConfigTemplate3D_getStencilSize( - JNIEnv *env, - jobject obj, - jlong pFormatInfo, - jboolean offScreen) -{ - - PixelFormatInfo *pfInfo = (PixelFormatInfo *) pFormatInfo; - if(offScreen) { - /* fprintf(stderr, "offScreen getStencilSize %d\n", - pfInfo->offScreenStencilSize); */ - - return pfInfo->offScreenStencilSize; - } - else { - /* fprintf(stderr, "onScreen getStencilSize %d\n", - pfInfo->onScreenStencilSize); */ - - return pfInfo->onScreenStencilSize; - } - -} - - -JNIEXPORT -jboolean JNICALL Java_javax_media_j3d_Win32NativeConfigTemplate3D_isDoubleBufferAvailable( - JNIEnv *env, - jobject obj, - jlong pFormatInfo, - jboolean offScreen) -{ - - PixelFormatInfo *pfInfo = (PixelFormatInfo *) pFormatInfo; - if(offScreen) { - /* fprintf(stderr, "offScreen isDoubleBufferAvailable %d\n", - pfInfo->offScreenHasDoubleBuffer); */ - - return pfInfo->offScreenHasDoubleBuffer; - } - else { - /* fprintf(stderr, "onScreen isDoubleBufferAvailable %d\n", - pfInfo->onScreenHasDoubleBuffer); */ - - return pfInfo->onScreenHasDoubleBuffer; - } - -} - -JNIEXPORT -jboolean JNICALL Java_javax_media_j3d_Win32NativeConfigTemplate3D_isSceneAntialiasingAccumAvailable( - JNIEnv *env, - jobject obj, - jlong pFormatInfo, - jboolean offScreen) -{ - PixelFormatInfo *pfInfo = (PixelFormatInfo *) pFormatInfo; - if(offScreen) { - /* fprintf(stderr, "offScreen isSceneAntialiasingAccumAvailable %d\n", - pfInfo->offScreenHasAccum); */ - - return pfInfo->offScreenHasAccum; - } - else { - /* fprintf(stderr, "onScreen isSceneAntialiasingAccumAvailable %d\n", - pfInfo->onScreenHasAccum); */ - - return pfInfo->onScreenHasAccum; - } -} - -JNIEXPORT -jboolean JNICALL Java_javax_media_j3d_Win32NativeConfigTemplate3D_isSceneAntialiasingMultisampleAvailable( - JNIEnv *env, - jobject obj, - jlong pFormatInfo, - jboolean offScreen, - jint screen) -{ - /* Fix to issue 77 */ - PixelFormatInfo *pfInfo = (PixelFormatInfo *) pFormatInfo; - if(offScreen) { - /* fprintf(stderr, "offScreen isSceneAntialiasingMultisampleAvailable %d\n", - pfInfo->offScreenHasMultisample); */ - - return pfInfo->offScreenHasMultisample; - } - else { - /* fprintf(stderr, "onScreen isSceneAntialiasingMultisampleAvailable %d\n", - pfInfo->onScreenHasMultisample); */ - - return pfInfo->onScreenHasMultisample; - } -} -#endif /* WIN32 */ |