diff options
-rw-r--r-- | src/classes/share/javax/media/j3d/Canvas3D.java | 31 | ||||
-rw-r--r-- | src/classes/share/javax/media/j3d/Renderer.java | 2 | ||||
-rw-r--r-- | src/classes/win32/javax/media/j3d/NativeConfigTemplate3D.java | 75 | ||||
-rw-r--r-- | src/classes/win32/javax/media/j3d/NativeScreenInfo.java | 18 | ||||
-rw-r--r-- | src/native/d3d/NativeConfigTemplate3D.cpp | 3 | ||||
-rw-r--r-- | src/native/ogl/Canvas3D.c | 418 | ||||
-rw-r--r-- | src/native/ogl/NativeConfigTemplate3D.c | 1075 | ||||
-rw-r--r-- | src/native/ogl/NativeScreenInfo.c | 107 | ||||
-rw-r--r-- | src/native/ogl/gl_1_2.h | 78 | ||||
-rw-r--r-- | src/native/ogl/gldefs.h | 67 | ||||
-rw-r--r-- | src/native/ogl/wglext.h | 619 |
11 files changed, 1805 insertions, 688 deletions
diff --git a/src/classes/share/javax/media/j3d/Canvas3D.java b/src/classes/share/javax/media/j3d/Canvas3D.java index eb979e6..50ee073 100644 --- a/src/classes/share/javax/media/j3d/Canvas3D.java +++ b/src/classes/share/javax/media/j3d/Canvas3D.java @@ -559,13 +559,27 @@ public class Canvas3D extends Canvas { // the visual id. int vid = 0; - // Fix for issue 20. + + // fbConfig is a pointer to the fbConfig object that is associated with + // the GraphicsConfiguration object used to create this Canvas. + // + // For Unix : Fix for issue 20. // The fbConfig is only used when running X11. It contains a pointer // to the native GLXFBConfig structure list, since in some cases the visual id // alone isn't sufficient for the native OpenGL renderer (e.g., when using // Solaris OpenGL with Xinerama mode disabled). + // + // For Windows : Fix for issue 76. This is use as a holder of the + // PixelFormat structure ( see also gldef.h ) to allow value such + // as offScreen's pixelformat, and ARB function pointers to be stored. long fbConfig = 0; + // offScreenBufferInfo is a pointer to additional information about the + // offScreenBuffer in this Canvas. + // + // For Windows : Fix for issue 76. + long offScreenBufferInfo = 0; + // fbConfigTable is a static hashtable which allows getBestConfiguration() // in NativeConfigTemplate3D to map a GraphicsConfiguration to the pointer // to the actual GLXFBConfig that glXChooseFBConfig() returns. The Canvas3D @@ -812,7 +826,7 @@ public class Canvas3D extends Canvas { native static void destroyContext(long display, int window, long context); // This is the native for creating offscreen buffer - native int createOffScreenBuffer(long ctx, long display, int window, long fbConfig, int width, int height); + native int createOffScreenBuffer(long ctx, long display, int vid, long fbConfig, int width, int height); native void destroyOffScreenBuffer(long ctx, long display, long fbConfig, int window); @@ -1117,7 +1131,7 @@ public class Canvas3D extends Canvas { this.offScreen = offScreen; this.graphicsConfiguration = graphicsConfiguration; - // Needed for Win32 only. + // Needed for Win32 only. vid = nativeWSobj.getCanvasVid(graphicsConfiguration); // Fix for issue 20. @@ -1127,15 +1141,16 @@ public class Canvas3D extends Canvas { if ((fbConfigObject != null) && (fbConfigObject instanceof Long)) { fbConfig = ((Long)fbConfigObject).longValue(); - // System.out.println("Canvas3D creation FBConfig = " + fbConfig); - + /* System.out.println("Canvas3D creation FBConfig = " + fbConfig + + " offScreen is " + offScreen ); + */ + // This check is needed for Unix and Win-ogl only. fbConfig should + // remain as -1, default value, for D3D case. if (fbConfig == 0) { throw new IllegalArgumentException (J3dI18N.getString("Canvas3D23")); } } - - if (offScreen) { screen = new Screen3D(graphicsConfiguration, offScreen); @@ -3388,7 +3403,7 @@ public class Canvas3D extends Canvas { // inside the native code after setting the various // fields in this object createQueryContext(screen.display, window, vid, - fbConfig, offScreen, 10, 10); + fbConfig, offScreen, 1, 1); } /** diff --git a/src/classes/share/javax/media/j3d/Renderer.java b/src/classes/share/javax/media/j3d/Renderer.java index 12b4dce..cd47249 100644 --- a/src/classes/share/javax/media/j3d/Renderer.java +++ b/src/classes/share/javax/media/j3d/Renderer.java @@ -450,7 +450,7 @@ class Renderer extends J3dThread { canvas.window = canvas.createOffScreenBuffer(canvas.ctx, canvas.screen.display, - canvas.window, + canvas.vid, canvas.fbConfig, canvas.offScreenCanvasSize.width, canvas.offScreenCanvasSize.height); diff --git a/src/classes/win32/javax/media/j3d/NativeConfigTemplate3D.java b/src/classes/win32/javax/media/j3d/NativeConfigTemplate3D.java index 997aaee..2759ea5 100644 --- a/src/classes/win32/javax/media/j3d/NativeConfigTemplate3D.java +++ b/src/classes/win32/javax/media/j3d/NativeConfigTemplate3D.java @@ -19,6 +19,7 @@ import sun.awt.Win32GraphicsConfig; import java.awt.GraphicsConfigTemplate; class NativeConfigTemplate3D { + private final static boolean debug = false; NativeConfigTemplate3D() { VirtualUniverse.createMC(); @@ -40,7 +41,12 @@ class NativeConfigTemplate3D { * selects the proper visual */ native int - choosePixelFormat(long ctx, int screen, int[] attrList); + choosePixelFormat(long ctx, int screen, int[] attrList, long[] pFormatInfo); + + // Native method to free an PixelFormatInfo struct. This is static since it + // may need to be called to clean up the Canvas3D fbConfigTable after the + // NativeConfigTemplate3D has been disposed of. + static native void freePixelFormatInfo(long pFormatInfo); // Native methods to return whether a particular attribute is available native boolean isStereoAvailable(long ctx, long display, int screen, int pixelFormat); @@ -58,6 +64,17 @@ class NativeConfigTemplate3D { Win32GraphicsDevice gd = (Win32GraphicsDevice)((Win32GraphicsConfig)gc[0]).getDevice(); + /* Not ready to enforce ARB extension in J3D1.3.2, but will likely to + do so in J3D 1.4. + System.out.println("getBestConfiguration : Checking WGL ARB support\n"); + + if (!NativeScreenInfo.isWglARB()) { + Thread.dumpStack(); + System.out.println("getBestConfiguration : WGL ARB support fail\n"); + return null; + } + */ + // holds the list of attributes to be tramslated // for glxChooseVisual call int attrList[] = new int[NUM_ITEMS]; @@ -72,12 +89,40 @@ class NativeConfigTemplate3D { attrList[ANTIALIASING] = template.getSceneAntialiasing(); NativeScreenInfo nativeScreenInfo = new NativeScreenInfo(gd); int screen = nativeScreenInfo.getScreen(); - int pixelFormat = choosePixelFormat(0, screen, attrList); - if (pixelFormat == -1) { + + long[] pFormatInfo = new long[1]; + + /* Deliberately set this to -1. pFormatInfo is not use in + D3D, so this value will be unchange in the case of D3D. + In the case of OGL, the return value should be 0 or a + positive valid address. + */ + pFormatInfo[0] = -1; + + int pixelFormat = choosePixelFormat(0, screen, attrList, pFormatInfo); + if (debug) { + System.out.println(" choosePixelFormat() returns " + pixelFormat); + System.out.println(" pFormatInfo is " + pFormatInfo[0]); + System.out.println(); + } + + if (pixelFormat < 0) { // current mode don't support the minimum config return null; } - return new J3dGraphicsConfig(gd, pixelFormat); + + GraphicsConfiguration gc1 = new J3dGraphicsConfig(gd, pixelFormat); + // We need to cache the offScreen pixelformat that glXChoosePixelFormat() + // returns, since this is not cached with J3dGraphicsConfig and there + // are no public constructors to allow us to extend it. + synchronized (Canvas3D.fbConfigTable) { + if (Canvas3D.fbConfigTable.get(gc1) == null) + Canvas3D.fbConfigTable.put(gc1, new Long(pFormatInfo[0])); + else + freePixelFormatInfo(pFormatInfo[0]); + } + + return gc1; } /** @@ -90,6 +135,17 @@ class NativeConfigTemplate3D { Win32GraphicsDevice gd = (Win32GraphicsDevice)((Win32GraphicsConfig) gc).getDevice(); + /* Not ready to enforce ARB extension in J3D1.3.2, but will likely to + do so in J3D 1.4. + System.out.println("isGraphicsConfigSupported : Checking WGL ARB support\n"); + + if (!NativeScreenInfo.isWglARB()) { + Thread.dumpStack(); + System.out.println("isGraphicsConfigSupported : WGL ARB support fail\n"); + return false; + } + */ + // holds the list of attributes to be tramslated // for glxChooseVisual call int attrList[] = new int[NUM_ITEMS]; @@ -106,9 +162,16 @@ class NativeConfigTemplate3D { NativeScreenInfo nativeScreenInfo = new NativeScreenInfo(gd); int screen = nativeScreenInfo.getScreen(); - int pixelFormat = choosePixelFormat(0, screen, attrList); + long[] pFormatInfo = new long[1]; + + int pixelFormat = choosePixelFormat(0, screen, attrList, pFormatInfo); + if (debug) { + System.out.println(" choosePixelFormat() returns " + pixelFormat); + System.out.println(" pFormatInfo is " + pFormatInfo[0]); + System.out.println(); + } - if (pixelFormat == -1) { + if (pixelFormat < 0) { // current mode don't support the minimum config return false; } else return true; diff --git a/src/classes/win32/javax/media/j3d/NativeScreenInfo.java b/src/classes/win32/javax/media/j3d/NativeScreenInfo.java index 43ee7e5..ef539ec 100644 --- a/src/classes/win32/javax/media/j3d/NativeScreenInfo.java +++ b/src/classes/win32/javax/media/j3d/NativeScreenInfo.java @@ -19,6 +19,24 @@ class NativeScreenInfo { private int display = 0; private int screen = 0; + + private static boolean wglARBChecked = false; + private static boolean isWglARB; + + private native static boolean queryWglARB(); + + // This method will return true if wglGetExtensionsStringARB is supported, + // else return false + synchronized static boolean isWglARB() { + + if (!wglARBChecked) { + // Query for wglGetExtensionsStringARB support. + isWglARB = queryWglARB(); + wglARBChecked = true; + } + return isWglARB; + } + NativeScreenInfo(GraphicsDevice graphicsDevice) { // Get the screen number screen = ((sun.awt.Win32GraphicsDevice)graphicsDevice).getScreen(); diff --git a/src/native/d3d/NativeConfigTemplate3D.cpp b/src/native/d3d/NativeConfigTemplate3D.cpp index e29f018..5238ad6 100644 --- a/src/native/d3d/NativeConfigTemplate3D.cpp +++ b/src/native/d3d/NativeConfigTemplate3D.cpp @@ -87,7 +87,8 @@ jint JNICALL Java_javax_media_j3d_NativeConfigTemplate3D_choosePixelFormat( jobject obj, jlong ctx, jint screen, - jintArray attrList) + jintArray attrList, + jlongArray offScreenPFArray) { int depth, red, green, blue; int retValue = -1; diff --git a/src/native/ogl/Canvas3D.c b/src/native/ogl/Canvas3D.c index ab8f1db..4ce2b9f 100644 --- a/src/native/ogl/Canvas3D.c +++ b/src/native/ogl/Canvas3D.c @@ -63,7 +63,10 @@ int getTextureColorTableSize( #ifdef WIN32 - extern HDC getMonitorDC(int screen); +extern void printErrorMessage(char *message); +extern PIXELFORMATDESCRIPTOR getDummyPFD(); +extern HDC getMonitorDC(int screen); +HWND createDummyWindow(const char* szAppName); #endif /* @@ -422,7 +425,6 @@ BOOL getPropertiesFromCurrentContext( GraphicsContextPropertiesInfo *ctxInfo, jlong hdc, int pixelFormat, - long display, int stencilSize) { JNIEnv table = *env; @@ -672,7 +674,7 @@ BOOL getPropertiesFromCurrentContext( } #endif -#ifdef WIN32 +#ifdef WIN32 /* This is fine, but might need cleanup. -- Chien */ wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) wglGetProcAddress("wglGetPixelFormatAttribivARB"); @@ -1052,7 +1054,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_destroyContext( #if defined(SOLARIS) || defined(__linux__) /* - glXMakeCurrent((Display *)display, (GLXDrawable)window, NULL); + glXMakeCurrent((Display *)display, None, NULL); */ glXDestroyContext((Display *)display, (GLXContext)context); #endif /* SOLARIS */ @@ -1178,69 +1180,56 @@ jlong JNICALL Java_javax_media_j3d_Canvas3D_createNewContext( jboolean rescale = JNI_FALSE; JNIEnv table = *env; DWORD err; - LPTSTR errString; - - - static PIXELFORMATDESCRIPTOR pfd = { - sizeof(PIXELFORMATDESCRIPTOR), - 1, /* Version number */ - PFD_DRAW_TO_WINDOW | - PFD_SUPPORT_OPENGL| - PFD_DOUBLEBUFFER, - PFD_TYPE_RGBA, - 24, /* 24 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 */ - 32, /* 16 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 */ - }; - + LPTSTR errString; jboolean result; + + /* Fix for issue 76 */ - /* hWnd = (HWND) window; */ - /* or could use: hDC = GetDC(hWnd); */ + /* + fprintf(stderr, "Canvas3D_createNewContext: \n"); + fprintf(stderr, "vid %d window 0x%x\n", vid, window); + */ if(sharedCtxInfo == 0) sharedCtx = 0; else { sharedCtxStructure = (GraphicsContextPropertiesInfo *)sharedCtxInfo; sharedCtx = sharedCtxStructure->context; } - hdc = (HDC) window; - - if (offScreen) { - pfd.dwFlags = PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | - PFD_SUPPORT_GDI; - vid = -1; - sharedCtx = 0; - } - /* vid of -1 means no vid was specified - do the old way */ - if (vid == -1) { - /* choose the "pixel format", terminology is equivalent */ - /* to UNIX "visual" */ - PixelFormatID = ChoosePixelFormat(hdc, &pfd); + /* Need to handle onScreen and offScreen differently */ + /* vid is for onScreen and fbConfigListPtr is for offScreen */ + /* + * vid must be a PixelFormat returned + * by wglChoosePixelFormat() or wglChoosePixelFormatARB. + */ - if(PixelFormatID == 0) { - fprintf(stderr,"\nERROR: pixel format ID = 0"); + if(!offScreen) { + /* fprintf(stderr, "Canvas3D_createNewContext: onScreen PixelFormat is %d\n", vid); */ + + if (vid <= 0) { + printErrorMessage("Canvas3D_createNewContext: onScreen PixelFormat is invalid"); return 0; } + else { + PixelFormatID = vid; + } } - else { - PixelFormatID = vid; + else { /* offScreen case */ + PixelFormatInfo *PixelFormatInfoPtr = (PixelFormatInfo *)fbConfigListPtr; + + if ((PixelFormatInfoPtr == NULL) || (PixelFormatInfoPtr->offScreenPFormat <= 0)) { + printErrorMessage("Canvas3D_createNewContext: offScreen PixelFormat is invalid"); + return 0; + } + else { + PixelFormatID = PixelFormatInfoPtr->offScreenPFormat; + } } - - SetPixelFormat(hdc, PixelFormatID, &pfd); + + SetPixelFormat(hdc, PixelFormatID, NULL); hrc = wglCreateContext( hdc ); @@ -1280,7 +1269,7 @@ jlong JNICALL Java_javax_media_j3d_Canvas3D_createNewContext( ctxInfo->context = gctx; if (!getPropertiesFromCurrentContext(env, obj, ctxInfo, (jlong) hdc, PixelFormatID, - display, stencilSize)) { + stencilSize)) { return 0; } @@ -2620,7 +2609,7 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer( jobject obj, jlong ctxInfo, jlong display, - jint window, + jint vid, jlong fbConfigListPtr, jint width, jint height) @@ -2656,8 +2645,6 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer( /* fprintf(stderr, "GLX_DRAWABLE_TYPE returns %d\n", val); */ if ((val & GLX_PBUFFER_BIT) != 0) { - - /* fprintf(stderr, "Using pbuffer %d\n", val); */ /* Initialize the attribute list to be used for choosing FBConfig */ @@ -2737,62 +2724,165 @@ jint JNICALL Java_javax_media_j3d_Canvas3D_createOffScreenBuffer( #endif /* SOLARIS */ -#ifdef WIN32 - int PixelFormatID=0; - int dpy = (int)display; - HDC hdc; /* HW Device Context */ - jboolean rescale = JNI_FALSE; +#ifdef WIN32 + /* Fix for issue 76 */ + int dpy = (int)display; + static char szAppName[] = "CreateOffScreen"; + HWND hwnd; + HGLRC hrc; + HDC hdc; + int pixelFormat; + PixelFormatInfo *pFormatInfoPtr = (PixelFormatInfo *)fbConfigListPtr; + int piAttrs[2]; + + HPBUFFERARB hpbuf = NULL; /* Handle to the Pbuffer */ + HDC hpbufdc = NULL; /* Handle to the Pbuffer's device context */ + + HDC bitmapHdc; + HBITMAP hbitmap; + + BITMAPINFOHEADER bih; + void *ppvBits; + int err; + LPTSTR errString; + OffScreenBufferInfo *offScreenBufferInfo = NULL; + + PIXELFORMATDESCRIPTOR dummy_pfd = getDummyPFD(); + jclass cv_class; + jfieldID offScreenBuffer_field; JNIEnv table = *env; + + /* + fprintf(stderr, "****** CreateOffScreenBuffer ******\n"); + fprintf(stderr, "display 0x%x, pFormat %d, width %d, height %d\n", + (int) display, pFormatInfoPtr->offScreenPFormat, width, height); + */ + cv_class = (jclass) (*(table->GetObjectClass))(env, obj); + offScreenBuffer_field = + (jfieldID) (*(table->GetFieldID))(env, cv_class, "offScreenBufferInfo", "J"); - HBITMAP hbitmap, oldhbitmap; - - BITMAPINFOHEADER bih; - void *ppvBits; - int err; - LPTSTR errString; - HDC hdcMonitor; - - /* create a DIB */ - memset(&bih, 0, sizeof(BITMAPINFOHEADER)); - - bih.biSize = sizeof(BITMAPINFOHEADER); - bih.biWidth = width; - bih.biHeight = height; - bih.biPlanes = 1; - bih.biBitCount = 24; - bih.biCompression = BI_RGB; - - /* create a new device context */ - - if (dpy == 0) { - hdc = CreateCompatibleDC(0); - } else { - /* - * Should be getMonitorDC(screen) - * but display and screen are the same under windows - * They are return from NativeScreenInfo - */ - hdcMonitor = getMonitorDC((int) display); - hdc = CreateCompatibleDC(hdcMonitor); - DeleteDC(hdcMonitor); - - } - hbitmap = CreateDIBSection(hdc, (BITMAPINFO *)&bih, - DIB_PAL_COLORS, &ppvBits, NULL, 0); + /* + * 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 0; + } + hdc = GetDC(hwnd); + + pixelFormat = ChoosePixelFormat(hdc, &dummy_pfd); + + if (pixelFormat<1) { + printErrorMessage("In Canvas3D : Failed in ChoosePixelFormat"); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return 0; + } + + SetPixelFormat(hdc, pixelFormat, NULL); + + hrc = wglCreateContext(hdc); + if (!hrc) { + printErrorMessage("In Canvas3D : Failed in wglCreateContext"); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return 0; + } + + if (!wglMakeCurrent(hdc, hrc)) { + printErrorMessage("In Canvas3D : Failed in wglMakeCurrent"); + ReleaseDC(hwnd, hdc); + wglDeleteContext(hrc); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return 0; + } + + if (pFormatInfoPtr->supportPbuffer) { + + /* fprintf(stderr, "***** Use PBuffer for offscreen ******\n"); */ + + piAttrs[0] = 0; + piAttrs[1] = 0; + + hpbuf = pFormatInfoPtr->wglCreatePbufferARB( hdc, pFormatInfoPtr->offScreenPFormat, + width, height, piAttrs); + + if(hpbuf == NULL) { + printErrorMessage("In Canvas3D : wglCreatePbufferARB FAIL."); + return 0; + } + + hpbufdc = pFormatInfoPtr->wglGetPbufferDCARB(hpbuf); + + if(hpbufdc == NULL) { + printErrorMessage("In Canvas3D : Can't get pbuffer's device context."); + return 0; + } + + /* Destroy all dummy objects */ + ReleaseDC(hwnd, hdc); + wglDeleteContext(hrc); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + + offScreenBufferInfo = + (OffScreenBufferInfo *) malloc(sizeof(OffScreenBufferInfo)); + offScreenBufferInfo->isPbuffer = GL_TRUE; + offScreenBufferInfo->hpbuf = hpbuf; - if (!hbitmap) { + (*(table->SetLongField))(env, obj, offScreenBuffer_field, (jlong)offScreenBufferInfo); + + return (jint) hpbufdc; + } + + /* create a DIB */ + memset(&bih, 0, sizeof(BITMAPINFOHEADER)); + + bih.biSize = sizeof(BITMAPINFOHEADER); + bih.biWidth = width; + bih.biHeight = height; + bih.biPlanes = 1; + bih.biBitCount = 24; + bih.biCompression = BI_RGB; + + bitmapHdc = CreateCompatibleDC(hdc); + + hbitmap = CreateDIBSection(bitmapHdc, (BITMAPINFO *)&bih, + DIB_PAL_COLORS, &ppvBits, NULL, 0); + + + if (!hbitmap) { err = GetLastError(); - FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM, - NULL, err, 0, (LPTSTR)&errString, 0, NULL); + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM, + NULL, err, 0, (LPTSTR)&errString, 0, NULL); fprintf(stderr, "CreateDIBSection failed: %s\n", errString); - } - - oldhbitmap = SelectObject(hdc, hbitmap); + } + + SelectObject(bitmapHdc, hbitmap); + + /* Choosing and setting of pixel format is done in createContext */ + + /* Destroy all dummy objects and fall BitMap */ + ReleaseDC(hwnd, hdc); + wglDeleteContext(hrc); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); - /* Choosing and setting of pixel format is done in createContext */ + offScreenBufferInfo = + (OffScreenBufferInfo *) malloc(sizeof(OffScreenBufferInfo)); + offScreenBufferInfo->isPbuffer = GL_FALSE; + offScreenBufferInfo->hpbuf = 0; + + (*(table->SetLongField))(env, obj, offScreenBuffer_field, (jlong)offScreenBufferInfo); - return ((jint)hdc); + return ((jint)bitmapHdc); + #endif /* WIN32 */ } @@ -2805,6 +2895,10 @@ void JNICALL Java_javax_media_j3d_Canvas3D_destroyOffScreenBuffer( jlong fbConfigListPtr, jint window) { + jclass cv_class; + jfieldID offScreenBuffer_field; + JNIEnv table = *env; + #if defined(SOLARIS) || defined(__linux__) /* Fix for Issue 20 */ GLXFBConfig *fbConfigList = (GLXFBConfig *)fbConfigListPtr; @@ -2824,12 +2918,44 @@ void JNICALL Java_javax_media_j3d_Canvas3D_destroyOffScreenBuffer( #endif /* SOLARIS */ #ifdef WIN32 - HBITMAP oldhbitmap; - HDC hdc = (HDC) window; + /* Fix for issue 76 */ + PixelFormatInfo *pFormatInfoPtr = (PixelFormatInfo *)fbConfigListPtr; + OffScreenBufferInfo *offScreenBufferInfo = NULL; + HDC hpbufdc = (HDC) window; + + cv_class = (jclass) (*(table->GetObjectClass))(env, obj); + offScreenBuffer_field = + (jfieldID) (*(table->GetFieldID))(env, cv_class, "offScreenBufferInfo", "J"); + + offScreenBufferInfo = + (OffScreenBufferInfo *) (*(table->GetLongField))(env, obj, offScreenBuffer_field); + + /* fprintf(stderr,"Canvas3D_destroyOffScreenBuffer : offScreenBufferInfo 0x%x\n", + offScreenBufferInfo); + */ + if(offScreenBufferInfo == NULL) { + return; + } + + if(offScreenBufferInfo->isPbuffer) { + /* fprintf(stderr,"Canvas3D_destroyOffScreenBuffer : Pbuffer\n"); */ + + pFormatInfoPtr->wglReleasePbufferDCARB(offScreenBufferInfo->hpbuf, hpbufdc); + pFormatInfoPtr->wglDestroyPbufferARB(offScreenBufferInfo->hpbuf); + } + else { + HBITMAP oldhbitmap; + HDC hdc = (HDC) window; + + /* fprintf(stderr,"Canvas3D_destroyOffScreenBuffer : BitMap\n"); */ + oldhbitmap = SelectObject(hdc, NULL); + DeleteObject(oldhbitmap); + DeleteDC(hdc); + } + + free(offScreenBufferInfo); + (*(table->SetLongField))(env, obj, offScreenBuffer_field, (jlong)0); - oldhbitmap = SelectObject(hdc, NULL); - DeleteObject(oldhbitmap); - DeleteDC(hdc); #endif /* WIN32 */ } @@ -3130,7 +3256,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext( } - /* create window if window == 0 and offscreen == true */ + /* onscreen rendering and window is 0 now */ if(window == 0 && !offScreen) { vinfo = glXGetVisualFromFBConfig((Display*)display, fbConfigList[0]); @@ -3186,74 +3312,48 @@ void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext( HWND hWnd; static char szAppName[] = "OpenGL"; jlong vinfo = 0; - - static PIXELFORMATDESCRIPTOR pfd = { - sizeof(PIXELFORMATDESCRIPTOR), - 1, /* Version number */ - PFD_DRAW_TO_WINDOW | - PFD_SUPPORT_OPENGL| - PFD_DOUBLEBUFFER, - PFD_TYPE_RGBA, - 24, /* 24 bit color depth */ - 0, 0, 0, /* RGB bits and pixel sizes */ - 0, 0, 0, /* Donnot care about them */ - 0, 0, /* no alpha buffer info */ - 0, 0, 0, 0, 0, /* no accumulation buffer */ - 32, /* 16 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 */ - }; - jboolean result; + /* Fix for issue 76 */ + + /* + fprintf(stderr, "Canvas3D_createQueryContext:\n"); + fprintf(stderr, "window is 0x%x, offScreen %d\n", window, offScreen); + */ + /* onscreen rendering and window is 0 now */ if(window == 0 && !offScreen){ + /* fprintf(stderr, "CreateQueryContext : window == 0 && !offScreen\n"); */ hWnd = createDummyWindow((const char *)szAppName); if (!hWnd) return; hdc = GetDC(hWnd); } else if(window == 0 && offScreen){ + /* fprintf(stderr, "CreateQueryContext : window == 0 && offScreen\n"); */ hdc = (HDC)Java_javax_media_j3d_Canvas3D_createOffScreenBuffer( env, obj, 0, display, - window, vid, width, height); - pfd.dwFlags = PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | - PFD_SUPPORT_GDI; - vid = -1; - } - else if(window != 0 && offScreen){ - pfd.dwFlags = PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL | - PFD_SUPPORT_GDI; - vid = -1; - hdc = (HDC) window; + vid, fbConfigListPtr, + width, height); } - else if(window !=0 && !offScreen){ + else if(window != 0){ + /* fprintf(stderr, "CreateQueryContext : window != 0 0x%x\n", window); */ hdc = (HDC) window; } newWin = (int)hdc; - /* vid of -1 means no vid was specified - do the old way */ - if (vid == -1) { - /* - * choose the "pixel format", terminology is equivalent - * to UNIX "visual" - */ - PixelFormatID = ChoosePixelFormat(hdc, &pfd); - - if(PixelFormatID == 0) { - fprintf(stderr,"\nERROR: pixel format ID = 0"); - return; - } + /* + * vid must be a PixelFormat returned + * by wglChoosePixelFormat() or wglChoosePixelFormatARB. + */ + if (vid <= 0) { + printErrorMessage("Canvas3D_createQueryContext: PixelFormat is invalid"); + return; } - else + else { PixelFormatID = vid; - - SetPixelFormat(hdc, PixelFormatID, &pfd); + } + SetPixelFormat(hdc, PixelFormatID, NULL); hrc = wglCreateContext( hdc ); @@ -3285,7 +3385,7 @@ void JNICALL Java_javax_media_j3d_Canvas3D_createQueryContext( ctxInfo->context = gctx; /* get current context properties */ - if (getPropertiesFromCurrentContext(env, obj, ctxInfo, (jlong) hdc, PixelFormatID, display, + if (getPropertiesFromCurrentContext(env, obj, ctxInfo, (jlong) hdc, PixelFormatID, stencilSize)) { /* put the properties to the Java side */ setupCanvasProperties(env, obj, ctxInfo); diff --git a/src/native/ogl/NativeConfigTemplate3D.c b/src/native/ogl/NativeConfigTemplate3D.c index 4dbbfaa..11c3b6e 100644 --- a/src/native/ogl/NativeConfigTemplate3D.c +++ b/src/native/ogl/NativeConfigTemplate3D.c @@ -132,7 +132,7 @@ GLXFBConfig *find_AA_S_FBConfigs(jlong display, glxAttrs[index++] = GLX_SAMPLE_BUFFERS_ARB; glxAttrs[index++] = 1; glxAttrs[index++] = GLX_SAMPLES_ARB; - glxAttrs[index++] = 1; + glxAttrs[index++] = 2; glxAttrs[index] = None; fbConfigList = find_S_FBConfigs(display, screen, @@ -272,7 +272,7 @@ jint JNICALL Java_javax_media_j3d_NativeConfigTemplate3D_chooseOglVisual( Display *dpy = (Display *) display; fbConfigListPtr = (*env)->GetLongArrayElements(env, fbConfigArray, NULL); - mx_ptr = (jint *)(*env)->GetPrimitiveArrayCritical(env, attrList, NULL); + mx_ptr = (*env)->GetIntArrayElements(env, attrList, NULL); /* * convert Java 3D values to GLX @@ -307,8 +307,7 @@ jint JNICALL Java_javax_media_j3d_NativeConfigTemplate3D_chooseOglVisual( sVal = mx_ptr[STEREO]; antialiasVal = mx_ptr[ANTIALIASING]; - - (*env)->ReleasePrimitiveArrayCritical(env, attrList, mx_ptr, 0); + (*env)->ReleaseIntArrayElements(env, attrList, mx_ptr, JNI_ABORT); fbConfigList = find_DB_AA_S_FBConfigs(display, screen, glxAttrs, sVal, dbVal, antialiasVal, index); @@ -522,6 +521,34 @@ jboolean JNICALL Java_javax_media_j3d_J3dGraphicsConfig_isValidVisualID( 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) { @@ -570,10 +597,9 @@ void printPixelDescriptor(PIXELFORMATDESCRIPTOR *pfd) printf("\n"); } - */ -BOOL isSupportedWGL(const char * extensions, const char *extension_string) { +BOOL isSupportedWGL(const char *extensions, const char *extension_string) { /* get the list of supported extensions */ const char *p = extensions; @@ -597,33 +623,39 @@ HDC getMonitorDC(int screen) return CreateDC("DISPLAY", NULL, NULL, NULL); } -int findPixelFormatSwitchDoubleBufferAndStereo (PIXELFORMATDESCRIPTOR* pfd, HDC hdc, int *mx_ptr) +int find_DB_S_STDPixelFormat(PIXELFORMATDESCRIPTOR* pfd, HDC hdc, + int *mx_ptr, GLboolean offScreen) { int pf; + PIXELFORMATDESCRIPTOR newpfd; pf = ChoosePixelFormat(hdc, pfd); - - /* Check if pixel format support min. requirement */ - DescribePixelFormat(hdc, pf, sizeof(*pfd), pfd); - - if ((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]) || - ((mx_ptr[DOUBLEBUFFER] == REQUIRED) && ((pfd->dwFlags & PFD_DOUBLEBUFFER) == 0)) || - ((mx_ptr[STEREO] == REQUIRED) && ((pfd->dwFlags & PFD_STEREO) == 0))) - { - return -1; - } - if ((mx_ptr[ANTIALIASING] == REQUIRED) && - ((pfd->cAccumRedBits <= 0) || - (pfd->cAccumGreenBits <= 0) || - (pfd->cAccumBlueBits <= 0))) - { - return -1; - } + 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]) || + ((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; } @@ -637,393 +669,480 @@ void printErrorMessage(char *message) FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, (LPTSTR)&errString, 0, NULL); - fprintf(stderr, "%s - %s\n", message, errString); + fprintf(stderr, "Java 3D ERROR : %s - %s\n", message, errString); LocalFree(errString); } -/* Prefer multiSample in following order - 4, 5, 6, 3, 7, 8, 2, 9, 10, 11, ... -*/ -int getMultiSampleScore(int s) -{ - static int multiSampleScore[9] = {9999, 9999, 6, 3, 0, 1, 2, 4, 5}; - - if (s < 9) { - return multiSampleScore[s]; - } - return s-2; -} - - -/* Max no of format wglChoosePixelFormatEXT can return */ -#define NFORMAT 100 +/* Fix for issue 76 */ +#define MAX_WGL_ATTRS_LENGTH 30 -int getExtPixelFormat(int *nativeConfigAttrs) -{ - static const BOOL debug = FALSE; - static char szAppName[] = "Choose Pixel Format"; - - static PIXELFORMATDESCRIPTOR 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 */ - }; - HWND hwnd; - HGLRC hrc; - HDC hdc; - int attr[22]; - int piValues[12]; - int i, idx; - int pNumFormats[NFORMAT], nAvailableFormat; - const char* supportedExtensions; - int score; - int highestScore, highestScorePF; - int highestScoreAlpha, lowestScoreMultiSample; - - /* declare function pointers for WGL functions */ - PFNWGLGETEXTENSIONSSTRINGEXTPROC wglGetExtensionsStringEXT = NULL; - PFNWGLCHOOSEPIXELFORMATEXTPROC wglChoosePixelFormatEXT = NULL; - PFNWGLGETPIXELFORMATATTRIBIVEXTPROC wglGetPixelFormatAttribivEXT = NULL; +int find_Stencil_PixelFormat(HDC hdc, PixelFormatInfo * pFormatInfo, + int* wglAttrs, int sIndex) { + + int pFormat, availableFormats, index; + + J3D_ASSERT((sIndex+4) < MAX_WGL_ATTRS_LENGTH); + + index = sIndex; + wglAttrs[index++] = WGL_STENCIL_BITS_ARB; + wglAttrs[index++] = 1; /* - * 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. + * Terminate by 2 zeros to avoid driver bugs + * that assume attributes always come in pairs. */ - hwnd = createDummyWindow((const char *)szAppName); + wglAttrs[index] = 0; + wglAttrs[index+1] = 0; - if (!hwnd) { - return -1; + 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; } - hdc = GetDC(hwnd); + + /* fprintf(stderr, "wglChoosePixelFormatARB (TRY 1): FAIL\n"); */ + + 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; - pNumFormats[0] = ChoosePixelFormat(hdc, &pfd); - if (!pNumFormats[0]) { - printErrorMessage("Failed in ChoosePixelFormat"); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -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; +} - SetPixelFormat(hdc, pNumFormats[0], &pfd); +int find_S_PixelFormat(HDC hdc, PixelFormatInfo * pFormatInfo, + int* wglAttrs, int sVal, int sIndex) { - hrc = wglCreateContext(hdc); - if (!hrc) { - printErrorMessage("Failed in wglCreateContext"); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; + int pFormat, index; + + J3D_ASSERT((sIndex+4) < MAX_WGL_ATTRS_LENGTH); + + if (sVal == REQUIRED || sVal== 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_Stencil_PixelFormat(hdc, pFormatInfo, + wglAttrs, index); + /* fprintf(stderr,"STEREO REQUIRED or PREFERRED ***pFormat %d\n", pFormat); */ + + if(pFormat >= 0) { + return pFormat; + } } - if (!wglMakeCurrent(hdc, hrc)) { - printErrorMessage("Failed in wglMakeCurrent"); - ReleaseDC(hwnd, hdc); - wglDeleteContext(hrc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; + if (sVal == UNNECESSARY || sVal== 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_Stencil_PixelFormat(hdc, pFormatInfo, + wglAttrs, index); + + /* fprintf(stderr,"STEREO UNNECC. or PREFERRED ***pFormat %d\n", pFormat); */ + + if(pFormat >= 0) { + return pFormat; + } } - wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) - wglGetProcAddress("wglGetExtensionsStringARB"); + if (sVal == 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_Stencil_PixelFormat(hdc, pFormatInfo, + wglAttrs, index); - if (wglGetExtensionsStringEXT == NULL) { - wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) - wglGetProcAddress("wglGetExtensionsStringEXT"); - if (wglGetExtensionsStringEXT == NULL) { - if (debug) { - printf("wglGetExtensionsStringEXT/ARB not support !\n"); - } - ReleaseDC(hwnd, hdc); - wglDeleteContext(hrc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; - } - if (debug) { - printf("Support wglGetExtensionsStringEXT\n"); - } - } else { - if (debug) { - printf("Support wglGetExtensionsStringARB\n"); + /* fprintf(stderr,"STEREO UNNECC. ***pFormat %d\n", pFormat); */ + + if(pFormat >= 0) { + return pFormat; } } - /* get the list of supported extensions */ - supportedExtensions = (const char *)wglGetExtensionsStringEXT(hdc); + return -1; +} - if (debug) { - fprintf(stderr, "WGL Supported extensions: %s.\n", supportedExtensions); - } + +int find_AA_S_PixelFormat( HDC hdc, PixelFormatInfo * pFormatInfo, + int* wglAttrs, int sVal, + int antialiasVal, int antialiasIndex) { + + int index; + int pFormat; + GLboolean supportMS = GL_FALSE; - if (!isSupportedWGL(supportedExtensions, "WGL_ARB_multisample") && - !isSupportedWGL(supportedExtensions, "WGL_EXT_multisample") && - !isSupportedWGL(supportedExtensions, "WGL_SGIS_multisample")) { + J3D_ASSERT((antialiasIndex+8) < MAX_WGL_ATTRS_LENGTH); - /* Under Wildcat III it doesn't use wglGetExtensionString */ - supportedExtensions = (char *) glGetString(GL_EXTENSIONS); + if(antialiasVal == REQUIRED || antialiasVal== PREFERRED) { - if (debug) { - fprintf(stderr, "GL Supported extensions: %s.\n", supportedExtensions); + if(isSupportedWGL(pFormatInfo->supportedExtensions, "WGL_ARB_multisample")) { + supportMS = GL_TRUE; } - - if (!isSupportedWGL(supportedExtensions, "GL_ARB_multisample") && - !isSupportedWGL(supportedExtensions, "GL_EXT_multisample") && - !isSupportedWGL(supportedExtensions, "GL_SGIS_multisample")) { - ReleaseDC(hwnd, hdc); - wglDeleteContext(hrc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; + 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; + } } - } - - wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC) - wglGetProcAddress("wglChoosePixelFormatARB"); - - if (wglChoosePixelFormatEXT == NULL) { - wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC) - wglGetProcAddress("wglChoosePixelFormatEXT"); - if (wglChoosePixelFormatEXT == NULL) { - if (debug) { - printf("wglChoosePixelFormatARB/EXT not support !\n"); + + if(supportMS) { + + index = antialiasIndex; + wglAttrs[index++] = WGL_SAMPLE_BUFFERS_ARB; + wglAttrs[index++] = 1; + wglAttrs[index++] = WGL_SAMPLES_ARB; + wglAttrs[index++] = 2; + /* + * 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, sVal, index); + + if(pFormat >= 0) { + return pFormat; } - ReleaseDC(hwnd, hdc); - wglDeleteContext(hrc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; - } - if (debug) { - printf("Support wglChoosePixelFormatEXT\n"); } - } else { - if (debug) { - printf("Support wglChoosePixelFormatARB\n"); - } } - idx = 0; - attr[idx++] = WGL_SUPPORT_OPENGL_EXT; - attr[idx++] = TRUE; - attr[idx++] = WGL_DRAW_TO_WINDOW_EXT; - attr[idx++] = TRUE; - attr[idx++] = WGL_RED_BITS_EXT; - attr[idx++] = nativeConfigAttrs[RED_SIZE]; - attr[idx++] = WGL_GREEN_BITS_EXT; - attr[idx++] = nativeConfigAttrs[GREEN_SIZE]; - attr[idx++] = WGL_BLUE_BITS_EXT; - attr[idx++] = nativeConfigAttrs[BLUE_SIZE]; - attr[idx++] = WGL_DEPTH_BITS_EXT; - attr[idx++] = nativeConfigAttrs[DEPTH_SIZE]; - - if (nativeConfigAttrs[DOUBLEBUFFER] == REQUIRED) { - attr[idx++] = WGL_DOUBLE_BUFFER_EXT; - attr[idx++] = TRUE; - } - if (nativeConfigAttrs[STEREO] == REQUIRED) { - attr[idx++] = WGL_STEREO_EXT; - attr[idx++] = TRUE; - } + if ( antialiasVal == REQUIRED ) { - if (nativeConfigAttrs[ANTIALIASING] == REQUIRED) { - attr[idx++] = WGL_SAMPLE_BUFFERS_ARB; - attr[idx++] = TRUE; - attr[idx++] = WGL_SAMPLES_ARB; - attr[idx++] = 2; + 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_PixelFormat(hdc, pFormatInfo, + wglAttrs, sVal, index); + + if(pFormat >= 0) { + return pFormat; + } } - + /* * Terminate by 2 zeros to avoid driver bugs * that assume attributes always come in pairs. */ - attr[idx++] = 0; - attr[idx++] = 0; + index = antialiasIndex; + wglAttrs[index] = 0; + wglAttrs[index+1] = 0; + + if (antialiasVal == UNNECESSARY || antialiasVal == PREFERRED) { + + pFormat = find_S_PixelFormat(hdc, pFormatInfo, + wglAttrs, sVal, index); + + if(pFormat >= 0) { + return pFormat; + } - if (!wglChoosePixelFormatEXT(hdc, (const int *)attr, NULL, NFORMAT, - pNumFormats, &nAvailableFormat)) { - printErrorMessage("Failed in wglChoosePixelFormatEXT"); - ReleaseDC(hwnd, hdc); - wglDeleteContext(hrc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; - } - - if (debug) { - printf("No. of available pixel format is: %d\n", nAvailableFormat); } - if (nAvailableFormat <= 0) { - ReleaseDC(hwnd, hdc); - wglDeleteContext(hrc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; - } + return -1; - wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) - wglGetProcAddress("wglGetPixelFormatAttribivARB"); +} - if (wglGetPixelFormatAttribivEXT == NULL) { - wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) - wglGetProcAddress("wglGetPixelFormatAttribivEXT"); - if (wglGetPixelFormatAttribivEXT == NULL) { - if (debug) { - printf("wglGetPixelFormatAttribivEXT/ARB not support !\n"); - } - ReleaseDC(hwnd, hdc); - wglDeleteContext(hrc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; - } - if (debug) { - printf("Support wglGetPixelFormatAttribivEXT\n"); +int find_DB_AA_S_PixelFormat( HDC hdc, PixelFormatInfo * pFormatInfo, + int* wglAttrs, int sVal, int dbVal, + int antialiasVal, 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_PixelFormat(hdc, pFormatInfo, + wglAttrs, sVal, + antialiasVal, index); + + if(pFormat >= 0) { + return pFormat; + } + } + + if (dbVal == UNNECESSARY || 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_PixelFormat(hdc, pFormatInfo, + wglAttrs, sVal, + antialiasVal, index); + + if(pFormat >= 0) { + return pFormat; } - } else { - if (debug) { - printf("Support wglGetPixelFormatAttribivARB\n"); - } } - idx = 0; - attr[idx++] = WGL_ACCELERATION_EXT; - attr[idx++] = WGL_RED_BITS_EXT; - attr[idx++] = WGL_GREEN_BITS_EXT; - attr[idx++] = WGL_BLUE_BITS_EXT; - attr[idx++] = WGL_ALPHA_BITS_EXT; - attr[idx++] = WGL_DEPTH_BITS_EXT; - attr[idx++] = WGL_STENCIL_BITS_EXT; - attr[idx++] = WGL_SAMPLE_BUFFERS_ARB; - attr[idx++] = WGL_SAMPLES_ARB; - attr[idx++] = WGL_DOUBLE_BUFFER_EXT; - attr[idx++] = WGL_STEREO_EXT; - attr[idx] = 0; - - /* Select the best pixel format based on score */ - highestScore = 0; - highestScorePF = -1; - highestScoreAlpha = 0; - lowestScoreMultiSample = 9999; - - for (i=0; i < nAvailableFormat; i++) { - if (!wglGetPixelFormatAttribivEXT(hdc, pNumFormats[i], 0, idx, attr, piValues)) { - printErrorMessage("Failed in wglGetPixelFormatAttribivEXT"); - ReleaseDC(hwnd, hdc); - wglDeleteContext(hrc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return -1; + 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_PixelFormat(hdc, pFormatInfo, + wglAttrs, sVal, + antialiasVal, index); + + if(pFormat >= 0) { + return pFormat; } - if (debug) { - printf("Format %d\n", pNumFormats[i]); - - if (piValues[0] == WGL_FULL_ACCELERATION_EXT) { - printf("WGL_FULL_ACCELERATION_EXT"); - } else if (piValues[0] == WGL_GENERIC_ACCELERATION_EXT) { - printf("WGL_GENERIC_ACCELERATION_EXT"); - } else { - printf("WGL_NO_ACCELERATION_EXT"); - } + } - printf(" R %d, G %d, B %d, A %d, Depth %d, Stencil %d", - piValues[1], piValues[2], piValues[3], piValues[4], - piValues[5], piValues[6]); + return -1; +} - if (piValues[7] == TRUE) { - printf(" MultiSample %d", piValues[8]); - } +int chooseSTDPixelFormat( + JNIEnv *env, + jint screen, + jintArray attrList, + HDC hdc, + GLboolean offScreen) +{ + int *mx_ptr; + int dbVal; /* value for double buffering */ + int sVal; /* value for stereo */ + int pFormat = -1; /* PixelFormat */ + PIXELFORMATDESCRIPTOR pfd; - if (piValues[9] == TRUE) { - printf(" DoubleBuffer"); - } - - if (piValues[10] == TRUE) { - printf(" Stereo"); - } - printf("\n"); - } + /* 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; /*TODO: when would this change? */ + pfd.iPixelType = PFD_TYPE_RGBA; - /* Red, Green, Blue are fixed under windows so they are not checked */ - score = 0; + /* + * Convert Java 3D values to PixelFormat + */ + mx_ptr = (*env)->GetIntArrayElements(env, attrList, NULL); - if (piValues[0] == WGL_FULL_ACCELERATION_EXT) { - score += 20000; - } else if (piValues[0] == WGL_GENERIC_ACCELERATION_EXT) { - score += 10000; - } - if ((nativeConfigAttrs[DOUBLEBUFFER] == PREFERRED) && - (piValues[9] == TRUE)) { - score += 5000; - } - if (piValues[4] > 0) { /* Alpha */ - score += 2500; - } - if ((nativeConfigAttrs[STEREO] == PREFERRED) && - (piValues[10] == TRUE)) { - score += 1250; - } - if ((nativeConfigAttrs[ANTIALIASING] == PREFERRED) && - (piValues[7] == TRUE)) { - score += 624; + 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; + + sVal = 0; + if (mx_ptr[STEREO] == REQUIRED || mx_ptr[STEREO] == PREFERRED) { + sVal = PFD_STEREO; + } else { + sVal = PFD_STEREO_DONTCARE; } + + pfd.dwFlags = dbVal | sVal | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW; + + pfd.cStencilBits = 1; - /* Stencil bit * 10 + Depth bit */ - score += piValues[6]*10 + piValues[5]; - - if (score > highestScore) { - highestScore = score; - highestScorePF = i; - highestScoreAlpha = piValues[4]; - lowestScoreMultiSample = getMultiSampleScore(piValues[8]); - } else if (score == highestScore) { - if (piValues[4] > highestScoreAlpha) { - highestScore = score; - highestScorePF = i; - highestScoreAlpha = piValues[4]; - lowestScoreMultiSample = getMultiSampleScore(piValues[8]); - } else if (piValues[4] == highestScoreAlpha) { - if (getMultiSampleScore(piValues[8]) < lowestScoreMultiSample) { - highestScore = score; - highestScorePF = i; - highestScoreAlpha = piValues[4]; - lowestScoreMultiSample = getMultiSampleScore(piValues[8]); - } - } + 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. */ + + pfd.cRedBits = 0; + pfd.cGreenBits = 0; + pfd.cBlueBits = 0; + pfd.cDepthBits = 32; + + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + pfd.iLayerType = PFD_MAIN_PLANE; + pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_BITMAP | PFD_SUPPORT_GDI; - if (debug) { - printf("Select Pixel Format %d\n", pNumFormats[highestScorePF]); } + + pFormat = find_DB_S_STDPixelFormat(&pfd, hdc, mx_ptr, offScreen); - ReleaseDC(hwnd, hdc); - wglDeleteContext(hrc); - DestroyWindow(hwnd); - UnregisterClass(szAppName, (HINSTANCE)NULL); - return pNumFormats[highestScorePF]; + if (pFormat == -1) { + /* try disable stencil buffer */ + pfd.cStencilBits = 0; + pFormat = find_DB_S_STDPixelFormat(&pfd, hdc, mx_ptr, offScreen); + } + + (*env)->ReleaseIntArrayElements(env, attrList, mx_ptr, JNI_ABORT); + return pFormat; } +PixelFormatInfo * newPixelFormatInfo(HDC hdc) +{ + PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = NULL; + + PixelFormatInfo *pFormatInfo = (PixelFormatInfo *) malloc(sizeof(PixelFormatInfo)); + + /* Initialize pFormatInfo */ + pFormatInfo->onScreenPFormat = -1; + pFormatInfo->offScreenPFormat = -1; + + 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(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_NativeConfigTemplate3D_choosePixelFormat( @@ -1031,92 +1150,214 @@ jint JNICALL Java_javax_media_j3d_NativeConfigTemplate3D_choosePixelFormat( jobject obj, jlong ctxInfo, jint screen, - jintArray attrList) + jintArray attrList, + jlongArray offScreenPFArray) { - int *mx_ptr; - int dbVal; /* value for double buffering */ - int sVal; /* value for stereo */ - HDC hdc; - int pf; /* PixelFormat */ - PIXELFORMATDESCRIPTOR pfd; - - mx_ptr = (int *)(*env)->GetIntArrayElements(env, attrList, NULL); - - if (mx_ptr[ANTIALIASING] != UNNECESSARY) { - pf = getExtPixelFormat(mx_ptr); - if (pf > 0) { - return pf; - } + static const BOOL debug = TRUE; + static char szAppName[] = "Choose Pixel Format"; - /* fallback to use standard ChoosePixelFormat and accumulation buffer */ - } + int *mx_ptr; + int dbVal; /* value for double buffering */ + int sVal; /* value for stereo */ + int antialiasVal; /* value for antialias */ - hdc = getMonitorDC(screen); + 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(); - ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; /*TODO: when would this change? */ - pfd.iPixelType = PFD_TYPE_RGBA; - /* - * Convert Java 3D values to PixelFormat + * 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); - 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 (!hwnd) { + return -1; + } + hdc = GetDC(hwnd); - if (mx_ptr[DOUBLEBUFFER] == REQUIRED || mx_ptr[DOUBLEBUFFER] == PREFERRED) - dbVal = PFD_DOUBLEBUFFER; - else - dbVal = PFD_DOUBLEBUFFER_DONTCARE; + pixelFormat = ChoosePixelFormat(hdc, &dummy_pfd); - sVal = 0; - if (mx_ptr[STEREO] == REQUIRED || mx_ptr[STEREO] == PREFERRED) { - sVal = PFD_STEREO; - } else { - sVal = 0; + if (pixelFormat<1) { + printErrorMessage("In NativeConfigTemplate : Failed in ChoosePixelFormat"); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return -1; } + + SetPixelFormat(hdc, pixelFormat, NULL); - pfd.dwFlags = dbVal | sVal | PFD_SUPPORT_OPENGL; - pfd.cStencilBits = 2; + hrc = wglCreateContext(hdc); + if (!hrc) { + printErrorMessage("In NativeConfigTemplate : Failed in wglCreateContext"); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return -1; + } - if (mx_ptr[ANTIALIASING] == REQUIRED || mx_ptr[ANTIALIASING] == PREFERRED) { - pfd.cAccumRedBits = 8; - pfd.cAccumGreenBits = 8; - pfd.cAccumBlueBits = 8; + if (!wglMakeCurrent(hdc, hrc)) { + printErrorMessage("In NativeConfigTemplate : Failed in wglMakeCurrent"); + ReleaseDC(hwnd, hdc); + wglDeleteContext(hrc); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return -1; } - pf = findPixelFormatSwitchDoubleBufferAndStereo(&pfd, hdc, mx_ptr); + pFormatInfo = newPixelFormatInfo(hdc); + + offScreenPFListPtr = (*env)->GetLongArrayElements(env, offScreenPFArray, NULL); - if (pf == -1) { - /* try disable stencil buffer */ - pfd.cStencilBits = 0; - pf = findPixelFormatSwitchDoubleBufferAndStereo(&pfd, hdc, mx_ptr); - - if (pf == -1) { - /* try disable accumulate buffer */ - if (mx_ptr[ANTIALIASING] == PREFERRED) { - pfd.cStencilBits = 2; - pfd.cAccumRedBits = 0; - pfd.cAccumGreenBits = 0; - pfd.cAccumBlueBits = 0; - pf = findPixelFormatSwitchDoubleBufferAndStereo(&pfd, hdc, mx_ptr); - - if (pf == -1) { - /* try disable stencil buffer */ - pfd.cStencilBits = 0; - pf = findPixelFormatSwitchDoubleBufferAndStereo(&pfd, hdc, mx_ptr); - } + if(pFormatInfo->supportARB) { + + 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_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]; + wglAttrs[index++] = WGL_DEPTH_BITS_ARB; + wglAttrs[index++] = mx_ptr[DEPTH_SIZE]; + + lastIndex = index; + + dbVal = mx_ptr[DOUBLEBUFFER]; + sVal = mx_ptr[STEREO]; + antialiasVal = mx_ptr[ANTIALIASING]; + + (*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_PixelFormat( hdc, pFormatInfo, + wglAttrs, sVal, dbVal, + antialiasVal, index); + + if(pFormatInfo->onScreenPFormat >= 0) { + + /* Since the return pixel format support pbuffer, + copy OnScreenPFormat to offScreenPFormat */ + pFormatInfo->offScreenPFormat = pFormatInfo->onScreenPFormat; + offScreenPFListPtr[0] = (jlong) pFormatInfo; + (*env)->ReleaseLongArrayElements(env, offScreenPFArray, offScreenPFListPtr, 0); + + /* Destroy all dummy objects */ + ReleaseDC(hwnd, hdc); + wglDeleteContext(hrc); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + + return (jint) pFormatInfo->onScreenPFormat; } + } + + /* Create a onScreen without Pbuffer */ + 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_PixelFormat( hdc, pFormatInfo, + wglAttrs, sVal, dbVal, + antialiasVal, index); + + } + + + if(pFormatInfo->onScreenPFormat < 0) { /* Fallback to use standard ChoosePixelFormat. */ + /* fprintf(stderr, "Fallback to use standard ChoosePixelFormat.\n"); */ + + pFormatInfo->onScreenPFormat = (jint) chooseSTDPixelFormat( env, screen, + attrList, hdc, GL_FALSE); + } - DeleteDC(hdc); + if(pFormatInfo->onScreenPFormat < 0) { + printErrorMessage("In NativeConfigTemplate : Can't choose a onScreen pixel format"); + + offScreenPFListPtr[0] = (jlong) pFormatInfo; + (*env)->ReleaseLongArrayElements(env, offScreenPFArray, offScreenPFListPtr, 0); - (*env)->ReleaseIntArrayElements(env, attrList, mx_ptr, JNI_ABORT); - return pf; + /* We are done with dummy context, so destroy all dummy objects */ + ReleaseDC(hwnd, hdc); + wglDeleteContext(hrc); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + + return -1; + } + + /* Create offScreen with standard ChoosePixelFormat */ + pFormatInfo->offScreenPFormat = chooseSTDPixelFormat( env, screen, attrList, hdc, GL_TRUE); + + /* fprintf(stderr, "********* offScreenPFormat = %d\n", pFormatInfo->offScreenPFormat ); */ + + offScreenPFListPtr[0] = (jlong) pFormatInfo; + (*env)->ReleaseLongArrayElements(env, offScreenPFArray, offScreenPFListPtr, 0); + + /* We are done with dummy context, so destroy all dummy objects */ + ReleaseDC(hwnd, hdc); + wglDeleteContext(hrc); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + + return (jint) pFormatInfo->onScreenPFormat; +} + + +JNIEXPORT +void JNICALL Java_javax_media_j3d_NativeConfigTemplate3D_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); } diff --git a/src/native/ogl/NativeScreenInfo.c b/src/native/ogl/NativeScreenInfo.c index 23ad8b8..0c588c6 100644 --- a/src/native/ogl/NativeScreenInfo.c +++ b/src/native/ogl/NativeScreenInfo.c @@ -18,6 +18,7 @@ #include <jni.h> #include <math.h> +#include <stdio.h> #include "gldefs.h" @@ -125,4 +126,108 @@ Java_javax_media_j3d_NativeScreenInfo_queryGLX13( return JNI_TRUE; } -#endif +#endif /* Solaris and Linux */ + + +#ifdef WIN32 + +extern HWND createDummyWindow(const char* szAppName); +extern void printErrorMessage(char *message); +extern PIXELFORMATDESCRIPTOR getDummyPFD(); +extern BOOL isSupportedWGL(const char *extensions, const char *extension_string); + +/* + * Class: javax_media_j3d_NativeScreenInfo + * Method: queryWglARB + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL +Java_javax_media_j3d_NativeScreenInfo_queryWglARB( + JNIEnv *env, + jclass cls) +{ + + static const BOOL debug = TRUE; + static char szAppName[] = "Choose Pixel Format"; + + PIXELFORMATDESCRIPTOR dummy_pfd = getDummyPFD(); + HWND hwnd; + HGLRC hrc; + HDC hdc; + int pixelFormat; + const char* supportedExtensions; + + /* declare function pointers for WGL functions */ + PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = NULL; + + /* + * 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 JNI_FALSE; + } + hdc = GetDC(hwnd); + + pixelFormat = ChoosePixelFormat(hdc, &dummy_pfd); + + if (pixelFormat<1) { + printErrorMessage("Failed in ChoosePixelFormat"); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return JNI_FALSE; + } + + SetPixelFormat(hdc, pixelFormat, NULL); + + hrc = wglCreateContext(hdc); + if (!hrc) { + printErrorMessage("Failed in wglCreateContext"); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return JNI_FALSE; + } + + if (!wglMakeCurrent(hdc, hrc)) { + printErrorMessage("Failed in wglMakeCurrent"); + ReleaseDC(hwnd, hdc); + wglDeleteContext(hrc); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return JNI_FALSE; + } + + wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) + wglGetProcAddress("wglGetExtensionsStringARB"); + if (wglGetExtensionsStringARB == NULL) { + /* printErrorMessage("wglGetExtensionsStringARB not support !\n"); */ + return JNI_FALSE; + } + else { + + /* get the list of supported extensions */ + supportedExtensions = (const char *)wglGetExtensionsStringARB(hdc); + + if (debug) { + fprintf(stderr, "WGL Supported extensions: %s.\n", supportedExtensions); + } + + if(!isSupportedWGL(supportedExtensions, "WGL_ARB_pixel_format")) { + fprintf(stderr, "WGL_ARB_pixel_format not supported.\n"); + return JNI_FALSE; + } + } + + ReleaseDC(hwnd, hdc); + wglDeleteContext(hrc); + DestroyWindow(hwnd); + UnregisterClass(szAppName, (HINSTANCE)NULL); + return JNI_TRUE; + + +} +#endif /* WIN32 */ diff --git a/src/native/ogl/gl_1_2.h b/src/native/ogl/gl_1_2.h index b540d3e..dd33949 100644 --- a/src/native/ogl/gl_1_2.h +++ b/src/native/ogl/gl_1_2.h @@ -93,16 +93,12 @@ extern "C" { #ifndef GL_ARB_texture_border_clamp #define GL_CLAMP_TO_BORDER_ARB 0x812D #endif - -#ifndef GL_ARB_multisample + #if defined(SOLARIS) || defined(__linux__) +#ifndef GL_ARB_multisample #define GLX_SAMPLE_BUFFERS_ARB 100000 #define GLX_SAMPLES_ARB 100001 -#endif -#ifdef WIN32 -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 -#endif + #define MULTISAMPLE_ARB 0x809D #define SAMPLE_ALPHA_TO_COVERATE_ARB 0x809E #define SAMPLE_ALPHA_TO_ONE_ARB 0x809F @@ -113,76 +109,12 @@ extern "C" { #define SAMPLE_COVERAGE_VALUE_ARB 0x80AA #define SAMPLE_COVERAGE_INVERT_ARB 0x80AB #endif /* GL_ARB_multisample */ +#endif /* SOLARIS */ #ifndef MULTISAMPLE_ARB #define MULTISAMPLE_ARB 0x809D #endif - -#ifdef WIN32 - -/* define those EXT_pixel_format enums from 3DLabs register developer web site */ -#ifndef WGL_SUPPORT_OPENGL_EXT -#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 -#define WGL_DRAW_TO_WINDOW_EXT 0x2001 -#define WGL_DRAW_TO_BITMAP_EXT 0x2002 -#define WGL_ACCELERATION_EXT 0x2003 -#define WGL_NEED_PALETTE_EXT 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 -#define WGL_SWAP_METHOD_EXT 0x2007 -#define WGL_NUMBER_OVERLAYS_EXT 0x2008 -#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 -#define WGL_TRANSPARENT_EXT 0x200A -#define WGL_TRANSPARENT_VALUE_EXT 0x200B -#define WGL_SHARE_DEPTH_EXT 0x200C -#define WGL_SHARE_STENCIL_EXT 0x200D -#define WGL_SHARE_ACCUM_EXT 0x200E -#define WGL_SUPPORT_GDI_EXT 0x200F -#define WGL_SUPPORT_OPENGL_EXT 0x2010 -#define WGL_DOUBLE_BUFFER_EXT 0x2011 -#define WGL_STEREO_EXT 0x2012 -#define WGL_PIXEL_TYPE_EXT 0x2013 -#define WGL_COLOR_BITS_EXT 0x2014 -#define WGL_RED_BITS_EXT 0x2015 -#define WGL_RED_SHIFT_EXT 0x2016 -#define WGL_GREEN_BITS_EXT 0x2017 -#define WGL_GREEN_SHIFT_EXT 0x2018 -#define WGL_BLUE_BITS_EXT 0x2019 -#define WGL_BLUE_SHIFT_EXT 0x201A -#define WGL_ALPHA_BITS_EXT 0x201B -#define WGL_ALPHA_SHIFT_EXT 0x201C -#define WGL_ACCUM_BITS_EXT 0x201D -#define WGL_ACCUM_RED_BITS_EXT 0x201E -#define WGL_ACCUM_GREEN_BITS_EXT 0x201F -#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 -#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 -#define WGL_DEPTH_BITS_EXT 0x2022 -#define WGL_STENCIL_BITS_EXT 0x2023 -#define WGL_AUX_BUFFERS_EXT 0x2024 -#define WGL_NO_ACCELERATION_EXT 0x2025 -#define WGL_GENERIC_ACCELERATION_EXT 0x2026 -#define WGL_FULL_ACCELERATION_EXT 0x2027 -#define WGL_SWAP_EXCHANGE_EXT 0x2028 -#define WGL_SWAP_COPY_EXT 0x2029 -#define WGL_SWAP_UNDEFINED_EXT 0x202A -#define WGL_TYPE_RGBA_EXT 0x202B -#define WGL_TYPE_COLORINDEX_EXT 0x202C -#endif /* WGL_SUPPORT_OPENGL_EXT */ - -/* define those ARB_pixel_format enums */ -#ifndef WGL_SUPPORT_OPENGL_ARB -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_DEPTH_BITS_ARB 0x2022 -#endif /* WGL_SUPPORT_OPENGL_ARB */ - -#endif /* WIN32 */ + #ifdef __cplusplus } diff --git a/src/native/ogl/gldefs.h b/src/native/ogl/gldefs.h index 6658201..a79762a 100644 --- a/src/native/ogl/gldefs.h +++ b/src/native/ogl/gldefs.h @@ -72,6 +72,7 @@ #ifndef D3D #include <GL/gl.h> +#include "wglext.h" #include "gl_1_2.h" #include "glext.h" #endif @@ -389,27 +390,6 @@ extern int glXgetVideoResizeSUN( Display *, GLXDrawable, float *); #define APIENTRY #endif -#ifdef WIN32 - -/* declare function prototype for WGL related functions*/ -typedef const char * (APIENTRY * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (HDC hdc); -typedef BOOL (APIENTRY * PFNWGLCHOOSEPIXELFORMATEXTPROC)(HDC hdc, - const int *piAttribIList, - const FLOAT *pfAttriFList, - UINT nMaxFormats, - int *piFormats, - UINT *nNumFormats); -typedef BOOL (APIENTRY * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)(HDC hdc, - int iPixelFormat, - int iLayerPlane, - UINT nAttributes, - const int *piAttributes, - int *piValues); - - - -#endif /* WIN32 */ - /* define function prototypes */ typedef void (APIENTRY * MYPFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); @@ -641,5 +621,48 @@ typedef struct { MYPFNGLTEXFILTERFUNCSGI glTexFilterFuncSGIS; } GraphicsContextPropertiesInfo; -#endif /* J3D_BUILDVERTICES */ + +#ifdef WIN32 + +/* define the structure to hold the info. of a pixel format */ +typedef struct PixelFormatInfoRec PixelFormatInfo; + +struct PixelFormatInfoRec { + int onScreenPFormat; /* PixelFormat for onScreen */ + int offScreenPFormat; /* PixelFormat for offScreen */ + GLboolean supportARB; /* TRUE if ARB is supported */ + GLboolean supportPbuffer; /* TRUE if Pbuffer is supported */ + char* supportedExtensions; /* list of supported ARB extensions */ + /* handle to ARB functions */ + PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB; + PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB; + PFNWGLCREATEPBUFFERARBPROC wglCreatePbufferARB; + PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDCARB; + PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB; + PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbufferARB; + PFNWGLQUERYPBUFFERARBPROC wglQueryPbufferARB; + + /* TODO include multi-samples buffer */ + +}; + +#endif /* WIN32 */ + +/* define the structure to hold the info. of a offScreen buffer */ +typedef struct OffScreenBufferInfoRec OffScreenBufferInfo; + +struct OffScreenBufferInfoRec { + GLboolean isPbuffer; /* GL_TRUE if Pbuffer is used. */ + +#if defined(SOLARIS) || defined(__linux__) +#endif + +#ifdef WIN32 + HPBUFFERARB hpbuf; /* Handle to the Pbuffer */ +#endif /* WIN32 */ + +}; + + +#endif /* D3D */ #endif /* _Java3D_gldefs_h_ */ diff --git a/src/native/ogl/wglext.h b/src/native/ogl/wglext.h new file mode 100644 index 0000000..d1ab334 --- /dev/null +++ b/src/native/ogl/wglext.h @@ -0,0 +1,619 @@ +#ifndef __wglext_h_ +#define __wglext_h_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** License Applicability. Except to the extent portions of this file are +** made subject to an alternative license as permitted in the SGI Free +** Software License B, Version 1.1 (the "License"), the contents of this +** file are subject only to the provisions of the License. You may not use +** this file except in compliance with the License. You may obtain a copy +** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 +** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: +** +** http://oss.sgi.com/projects/FreeB +** +** Note that, as provided in the License, the Software is distributed on an +** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS +** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND +** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A +** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. +** +** Original Code. The Original Code is: OpenGL Sample Implementation, +** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, +** Inc. The Original Code is Copyright (c) 1991-2004 Silicon Graphics, Inc. +** Copyright in any portions created by third parties is as indicated +** elsewhere herein. All Rights Reserved. +** +** Additional Notice Provisions: This software was created using the +** OpenGL(R) version 1.2.1 Sample Implementation published by SGI, but has +** not been independently verified as being compliant with the OpenGL(R) +** version 1.2.1 Specification. +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define WIN32_LEAN_AND_MEAN 1 +#include <windows.h> +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +/*************************************************************/ + +/* Header file version number */ +/* wglext.h last updated 2004/07/26 */ +/* Current version at http://oss.sgi.com/projects/ogl-sample/registry/ */ +#define WGL_WGLEXT_VERSION 5 + +#ifndef WGL_ARB_buffer_region +#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 +#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 +#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 +#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 +#endif + +#ifndef WGL_ARB_multisample +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 +#endif + +#ifndef WGL_ARB_extensions_string +#endif + +#ifndef WGL_ARB_pixel_format +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B +#define WGL_SHARE_DEPTH_ARB 0x200C +#define WGL_SHARE_STENCIL_ARB 0x200D +#define WGL_SHARE_ACCUM_ARB 0x200E +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201A +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ALPHA_SHIFT_ARB 0x201C +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202A +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C +#endif + +#ifndef WGL_ARB_make_current_read +#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 +#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 +#endif + +#ifndef WGL_ARB_pbuffer +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 +#endif + +#ifndef WGL_ARB_render_texture +#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 +#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 +#define WGL_TEXTURE_FORMAT_ARB 0x2072 +#define WGL_TEXTURE_TARGET_ARB 0x2073 +#define WGL_MIPMAP_TEXTURE_ARB 0x2074 +#define WGL_TEXTURE_RGB_ARB 0x2075 +#define WGL_TEXTURE_RGBA_ARB 0x2076 +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 +#define WGL_TEXTURE_1D_ARB 0x2079 +#define WGL_TEXTURE_2D_ARB 0x207A +#define WGL_MIPMAP_LEVEL_ARB 0x207B +#define WGL_CUBE_MAP_FACE_ARB 0x207C +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 +#define WGL_FRONT_LEFT_ARB 0x2083 +#define WGL_FRONT_RIGHT_ARB 0x2084 +#define WGL_BACK_LEFT_ARB 0x2085 +#define WGL_BACK_RIGHT_ARB 0x2086 +#define WGL_AUX0_ARB 0x2087 +#define WGL_AUX1_ARB 0x2088 +#define WGL_AUX2_ARB 0x2089 +#define WGL_AUX3_ARB 0x208A +#define WGL_AUX4_ARB 0x208B +#define WGL_AUX5_ARB 0x208C +#define WGL_AUX6_ARB 0x208D +#define WGL_AUX7_ARB 0x208E +#define WGL_AUX8_ARB 0x208F +#define WGL_AUX9_ARB 0x2090 +#endif + +#ifndef WGL_EXT_make_current_read +#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 +#endif + +#ifndef WGL_EXT_pixel_format +#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 +#define WGL_DRAW_TO_WINDOW_EXT 0x2001 +#define WGL_DRAW_TO_BITMAP_EXT 0x2002 +#define WGL_ACCELERATION_EXT 0x2003 +#define WGL_NEED_PALETTE_EXT 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 +#define WGL_SWAP_METHOD_EXT 0x2007 +#define WGL_NUMBER_OVERLAYS_EXT 0x2008 +#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 +#define WGL_TRANSPARENT_EXT 0x200A +#define WGL_TRANSPARENT_VALUE_EXT 0x200B +#define WGL_SHARE_DEPTH_EXT 0x200C +#define WGL_SHARE_STENCIL_EXT 0x200D +#define WGL_SHARE_ACCUM_EXT 0x200E +#define WGL_SUPPORT_GDI_EXT 0x200F +#define WGL_SUPPORT_OPENGL_EXT 0x2010 +#define WGL_DOUBLE_BUFFER_EXT 0x2011 +#define WGL_STEREO_EXT 0x2012 +#define WGL_PIXEL_TYPE_EXT 0x2013 +#define WGL_COLOR_BITS_EXT 0x2014 +#define WGL_RED_BITS_EXT 0x2015 +#define WGL_RED_SHIFT_EXT 0x2016 +#define WGL_GREEN_BITS_EXT 0x2017 +#define WGL_GREEN_SHIFT_EXT 0x2018 +#define WGL_BLUE_BITS_EXT 0x2019 +#define WGL_BLUE_SHIFT_EXT 0x201A +#define WGL_ALPHA_BITS_EXT 0x201B +#define WGL_ALPHA_SHIFT_EXT 0x201C +#define WGL_ACCUM_BITS_EXT 0x201D +#define WGL_ACCUM_RED_BITS_EXT 0x201E +#define WGL_ACCUM_GREEN_BITS_EXT 0x201F +#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 +#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 +#define WGL_DEPTH_BITS_EXT 0x2022 +#define WGL_STENCIL_BITS_EXT 0x2023 +#define WGL_AUX_BUFFERS_EXT 0x2024 +#define WGL_NO_ACCELERATION_EXT 0x2025 +#define WGL_GENERIC_ACCELERATION_EXT 0x2026 +#define WGL_FULL_ACCELERATION_EXT 0x2027 +#define WGL_SWAP_EXCHANGE_EXT 0x2028 +#define WGL_SWAP_COPY_EXT 0x2029 +#define WGL_SWAP_UNDEFINED_EXT 0x202A +#define WGL_TYPE_RGBA_EXT 0x202B +#define WGL_TYPE_COLORINDEX_EXT 0x202C +#endif + +#ifndef WGL_EXT_pbuffer +#define WGL_DRAW_TO_PBUFFER_EXT 0x202D +#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E +#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 +#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 +#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 +#define WGL_PBUFFER_LARGEST_EXT 0x2033 +#define WGL_PBUFFER_WIDTH_EXT 0x2034 +#define WGL_PBUFFER_HEIGHT_EXT 0x2035 +#endif + +#ifndef WGL_EXT_depth_float +#define WGL_DEPTH_FLOAT_EXT 0x2040 +#endif + +#ifndef WGL_3DFX_multisample +#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 +#define WGL_SAMPLES_3DFX 0x2061 +#endif + +#ifndef WGL_EXT_multisample +#define WGL_SAMPLE_BUFFERS_EXT 0x2041 +#define WGL_SAMPLES_EXT 0x2042 +#endif + +#ifndef WGL_I3D_digital_video_control +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 +#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 +#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 +#endif + +#ifndef WGL_I3D_gamma +#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E +#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F +#endif + +#ifndef WGL_I3D_genlock +#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 +#define WGL_GENLOCK_SOURCE_EXTENAL_SYNC_I3D 0x2045 +#define WGL_GENLOCK_SOURCE_EXTENAL_FIELD_I3D 0x2046 +#define WGL_GENLOCK_SOURCE_EXTENAL_TTL_I3D 0x2047 +#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 +#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 +#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A +#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B +#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C +#endif + +#ifndef WGL_I3D_image_buffer +#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 +#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 +#endif + +#ifndef WGL_I3D_swap_frame_lock +#endif + +#ifndef WGL_NV_render_depth_texture +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 +#endif + +#ifndef WGL_NV_render_texture_rectangle +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 +#endif + +#ifndef WGL_ATI_pixel_format_float +#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 +#endif + +#ifndef WGL_NV_float_buffer +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 +#endif + + +/*************************************************************/ + +#ifndef WGL_ARB_pbuffer +DECLARE_HANDLE(HPBUFFERARB); +#endif +#ifndef WGL_EXT_pbuffer +DECLARE_HANDLE(HPBUFFEREXT); +#endif + +#ifndef WGL_ARB_buffer_region +#define WGL_ARB_buffer_region 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern HANDLE WINAPI wglCreateBufferRegionARB (HDC, int, UINT); +extern VOID WINAPI wglDeleteBufferRegionARB (HANDLE); +extern BOOL WINAPI wglSaveBufferRegionARB (HANDLE, int, int, int, int); +extern BOOL WINAPI wglRestoreBufferRegionARB (HANDLE, int, int, int, int, int, int); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); +typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); +typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); +typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); +#endif + +#ifndef WGL_ARB_multisample +#define WGL_ARB_multisample 1 +#endif + +#ifndef WGL_ARB_extensions_string +#define WGL_ARB_extensions_string 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern const char * WINAPI wglGetExtensionsStringARB (HDC); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); +#endif + +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetPixelFormatAttribivARB (HDC, int, int, UINT, const int *, int *); +extern BOOL WINAPI wglGetPixelFormatAttribfvARB (HDC, int, int, UINT, const int *, FLOAT *); +extern BOOL WINAPI wglChoosePixelFormatARB (HDC, const int *, const FLOAT *, UINT, int *, UINT *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +#endif + +#ifndef WGL_ARB_make_current_read +#define WGL_ARB_make_current_read 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglMakeContextCurrentARB (HDC, HDC, HGLRC); +extern HDC WINAPI wglGetCurrentReadDCARB (void); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (void); +#endif + +#ifndef WGL_ARB_pbuffer +#define WGL_ARB_pbuffer 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern HPBUFFERARB WINAPI wglCreatePbufferARB (HDC, int, int, int, const int *); +extern HDC WINAPI wglGetPbufferDCARB (HPBUFFERARB); +extern int WINAPI wglReleasePbufferDCARB (HPBUFFERARB, HDC); +extern BOOL WINAPI wglDestroyPbufferARB (HPBUFFERARB); +extern BOOL WINAPI wglQueryPbufferARB (HPBUFFERARB, int, int *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); +#endif + +#ifndef WGL_ARB_render_texture +#define WGL_ARB_render_texture 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglBindTexImageARB (HPBUFFERARB, int); +extern BOOL WINAPI wglReleaseTexImageARB (HPBUFFERARB, int); +extern BOOL WINAPI wglSetPbufferAttribARB (HPBUFFERARB, const int *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int *piAttribList); +#endif + +#ifndef WGL_EXT_display_color_table +#define WGL_EXT_display_color_table 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern GLboolean WINAPI wglCreateDisplayColorTableEXT (GLushort); +extern GLboolean WINAPI wglLoadDisplayColorTableEXT (const GLushort *, GLuint); +extern GLboolean WINAPI wglBindDisplayColorTableEXT (GLushort); +extern VOID WINAPI wglDestroyDisplayColorTableEXT (GLushort); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (const GLushort *table, GLuint length); +typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef VOID (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); +#endif + +#ifndef WGL_EXT_extensions_string +#define WGL_EXT_extensions_string 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern const char * WINAPI wglGetExtensionsStringEXT (void); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); +#endif + +#ifndef WGL_EXT_make_current_read +#define WGL_EXT_make_current_read 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglMakeContextCurrentEXT (HDC, HDC, HGLRC); +extern HDC WINAPI wglGetCurrentReadDCEXT (void); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (void); +#endif + +#ifndef WGL_EXT_pbuffer +#define WGL_EXT_pbuffer 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern HPBUFFEREXT WINAPI wglCreatePbufferEXT (HDC, int, int, int, const int *); +extern HDC WINAPI wglGetPbufferDCEXT (HPBUFFEREXT); +extern int WINAPI wglReleasePbufferDCEXT (HPBUFFEREXT, HDC); +extern BOOL WINAPI wglDestroyPbufferEXT (HPBUFFEREXT); +extern BOOL WINAPI wglQueryPbufferEXT (HPBUFFEREXT, int, int *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int *piValue); +#endif + +#ifndef WGL_EXT_pixel_format +#define WGL_EXT_pixel_format 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetPixelFormatAttribivEXT (HDC, int, int, UINT, int *, int *); +extern BOOL WINAPI wglGetPixelFormatAttribfvEXT (HDC, int, int, UINT, int *, FLOAT *); +extern BOOL WINAPI wglChoosePixelFormatEXT (HDC, const int *, const FLOAT *, UINT, int *, UINT *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +#endif + +#ifndef WGL_EXT_swap_control +#define WGL_EXT_swap_control 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglSwapIntervalEXT (int); +extern int WINAPI wglGetSwapIntervalEXT (void); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); +typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); +#endif + +#ifndef WGL_EXT_depth_float +#define WGL_EXT_depth_float 1 +#endif + +#ifndef WGL_NV_vertex_array_range +#define WGL_NV_vertex_array_range 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern void* WINAPI wglAllocateMemoryNV (GLsizei, GLfloat, GLfloat, GLfloat); +extern void WINAPI wglFreeMemoryNV (void *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef void* (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority); +typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); +#endif + +#ifndef WGL_3DFX_multisample +#define WGL_3DFX_multisample 1 +#endif + +#ifndef WGL_EXT_multisample +#define WGL_EXT_multisample 1 +#endif + +#ifndef WGL_OML_sync_control +#define WGL_OML_sync_control 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetSyncValuesOML (HDC, INT64 *, INT64 *, INT64 *); +extern BOOL WINAPI wglGetMscRateOML (HDC, INT32 *, INT32 *); +extern INT64 WINAPI wglSwapBuffersMscOML (HDC, INT64, INT64, INT64); +extern INT64 WINAPI wglSwapLayerBuffersMscOML (HDC, int, INT64, INT64, INT64); +extern BOOL WINAPI wglWaitForMscOML (HDC, INT64, INT64, INT64, INT64 *, INT64 *, INT64 *); +extern BOOL WINAPI wglWaitForSbcOML (HDC, INT64, INT64 *, INT64 *, INT64 *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32 *numerator, INT32 *denominator); +typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, int fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc); +#endif + +#ifndef WGL_I3D_digital_video_control +#define WGL_I3D_digital_video_control 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetDigitalVideoParametersI3D (HDC, int, int *); +extern BOOL WINAPI wglSetDigitalVideoParametersI3D (HDC, int, const int *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); +typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); +#endif + +#ifndef WGL_I3D_gamma +#define WGL_I3D_gamma 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetGammaTableParametersI3D (HDC, int, int *); +extern BOOL WINAPI wglSetGammaTableParametersI3D (HDC, int, const int *); +extern BOOL WINAPI wglGetGammaTableI3D (HDC, int, USHORT *, USHORT *, USHORT *); +extern BOOL WINAPI wglSetGammaTableI3D (HDC, int, const USHORT *, const USHORT *, const USHORT *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int *piValue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int *piValue); +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue); +#endif + +#ifndef WGL_I3D_genlock +#define WGL_I3D_genlock 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglEnableGenlockI3D (HDC); +extern BOOL WINAPI wglDisableGenlockI3D (HDC); +extern BOOL WINAPI wglIsEnabledGenlockI3D (HDC, BOOL *); +extern BOOL WINAPI wglGenlockSourceI3D (HDC, UINT); +extern BOOL WINAPI wglGetGenlockSourceI3D (HDC, UINT *); +extern BOOL WINAPI wglGenlockSourceEdgeI3D (HDC, UINT); +extern BOOL WINAPI wglGetGenlockSourceEdgeI3D (HDC, UINT *); +extern BOOL WINAPI wglGenlockSampleRateI3D (HDC, UINT); +extern BOOL WINAPI wglGetGenlockSampleRateI3D (HDC, UINT *); +extern BOOL WINAPI wglGenlockSourceDelayI3D (HDC, UINT); +extern BOOL WINAPI wglGetGenlockSourceDelayI3D (HDC, UINT *); +extern BOOL WINAPI wglQueryGenlockMaxSourceDelayI3D (HDC, UINT *, UINT *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL *pFlag); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT *uSource); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT *uEdge); +typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT *uRate); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT *uDelay); +typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay); +#endif + +#ifndef WGL_I3D_image_buffer +#define WGL_I3D_image_buffer 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern LPVOID WINAPI wglCreateImageBufferI3D (HDC, DWORD, UINT); +extern BOOL WINAPI wglDestroyImageBufferI3D (HDC, LPVOID); +extern BOOL WINAPI wglAssociateImageBufferEventsI3D (HDC, const HANDLE *, const LPVOID *, const DWORD *, UINT); +extern BOOL WINAPI wglReleaseImageBufferEventsI3D (HDC, const LPVOID *, UINT); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); +typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); +typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count); +typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hDC, const LPVOID *pAddress, UINT count); +#endif + +#ifndef WGL_I3D_swap_frame_lock +#define WGL_I3D_swap_frame_lock 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglEnableFrameLockI3D (void); +extern BOOL WINAPI wglDisableFrameLockI3D (void); +extern BOOL WINAPI wglIsEnabledFrameLockI3D (BOOL *); +extern BOOL WINAPI wglQueryFrameLockMasterI3D (BOOL *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL *pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL *pFlag); +#endif + +#ifndef WGL_I3D_swap_frame_usage +#define WGL_I3D_swap_frame_usage 1 +#ifdef WGL_WGLEXT_PROTOTYPES +extern BOOL WINAPI wglGetFrameUsageI3D (float *); +extern BOOL WINAPI wglBeginFrameTrackingI3D (void); +extern BOOL WINAPI wglEndFrameTrackingI3D (void); +extern BOOL WINAPI wglQueryFrameTrackingI3D (DWORD *, DWORD *, float *); +#endif /* WGL_WGLEXT_PROTOTYPES */ +typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float *pUsage); +typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); +#endif + +#ifndef WGL_ATI_pixel_format_float +#define WGL_ATI_pixel_format_float 1 +#endif + + +#ifdef __cplusplus +} +#endif + +#endif |