From a0871c21cb859cea6f24802b6828352a211ab102 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Mon, 2 Apr 2018 03:16:50 +0000 Subject: [PATCH] - fallback to non-sRGB visuals if the context creation failed (GLX-only) - added new glutGet query: GLUT_WINDOW_SRGB (untested on windows) git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1842 7f0cb862-5218-0410-a997-914c9d46530a --- include/GL/freeglut_ext.h | 2 ++ src/mswin/fg_state_mswin.c | 26 ++++++++++++++++++++++++++ src/x11/fg_state_x11_glx.c | 1 + src/x11/fg_window_x11.c | 14 ++++++++++++++ 4 files changed, 43 insertions(+) diff --git a/include/GL/freeglut_ext.h b/include/GL/freeglut_ext.h index 9b0ac50..932a16b 100644 --- a/include/GL/freeglut_ext.h +++ b/include/GL/freeglut_ext.h @@ -92,6 +92,8 @@ #define GLUT_ALLOW_NEGATIVE_WINDOW_POSITION 0x0207 /* GLUT doesn't allow negative window positions by default */ +#define GLUT_WINDOW_SRGB 0x007D + /* * New tokens for glutInitDisplayMode. * Only one GLUT_AUXn bit may be used at a time. diff --git a/src/mswin/fg_state_mswin.c b/src/mswin/fg_state_mswin.c index b8f3e00..98468f5 100644 --- a/src/mswin/fg_state_mswin.c +++ b/src/mswin/fg_state_mswin.c @@ -46,7 +46,14 @@ extern void fghComputeWindowRectFromClientArea_UseStyle( RECT *clientRect, const * #include * So we copy the necessary parts out of it to support the multisampling query */ +#ifndef WGL_SAMPLES_ARB #define WGL_SAMPLES_ARB 0x2042 +#endif +#ifndef WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 +#endif + +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); #if defined(_WIN32_WCE) # include @@ -284,6 +291,25 @@ int fgPlatformGlutGet ( GLenum eWhat ) #endif /* defined(_WIN32_WCE) */ return 0; + case GLUT_WINDOW_SRGB: + if( fgStructure.CurrentWindow != NULL ) { + static int attr = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB; + static PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB; + HDC hdc = fgStructure.CurrentWindow->Window.pContext.Device; + int ipixfmt = GetPixelFormat(hdc); + int val; + + if(!wglGetPixelFormatAttribivARB) { + if(!(wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)wglGetProcAddress("wglGetPixelFormatAttribivARB"))) { + return 0; + } + } + if(wglGetPixelFormatAttribivARB(hdc, ipixfmt, 0, 1, &attr, &val)) { + return val; + } + } + return 0; + default: fgWarning( "glutGet(): missing enum handle %d", eWhat ); break; diff --git a/src/x11/fg_state_x11_glx.c b/src/x11/fg_state_x11_glx.c index 1b8dd18..2a50e77 100644 --- a/src/x11/fg_state_x11_glx.c +++ b/src/x11/fg_state_x11_glx.c @@ -83,6 +83,7 @@ int fghPlatformGlutGetGLX ( GLenum eWhat ) GLX_QUERY( GLUT_WINDOW_ACCUM_BLUE_SIZE, GLX_ACCUM_BLUE_SIZE ); GLX_QUERY( GLUT_WINDOW_ACCUM_ALPHA_SIZE, GLX_ACCUM_ALPHA_SIZE ); GLX_QUERY( GLUT_WINDOW_STEREO, GLX_STEREO ); + GLX_QUERY( GLUT_WINDOW_SRGB, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB); # undef GLX_QUERY diff --git a/src/x11/fg_window_x11.c b/src/x11/fg_window_x11.c index 90f1966..2736a59 100644 --- a/src/x11/fg_window_x11.c +++ b/src/x11/fg_window_x11.c @@ -182,6 +182,8 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title, fgState.DisplayMode |= GLUT_DOUBLE ; fghChooseConfig(&WINDOW_CONFIG); fgState.DisplayMode &= ~GLUT_DOUBLE; + + if( WINDOW_CONFIG ) goto done_retry; } #endif @@ -190,8 +192,20 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title, fgState.DisplayMode &= ~GLUT_MULTISAMPLE ; fghChooseConfig(&WINDOW_CONFIG); fgState.DisplayMode |= GLUT_MULTISAMPLE; + + if( WINDOW_CONFIG ) goto done_retry; + } + + if( fgState.DisplayMode & GLUT_SRGB ) + { + fgState.DisplayMode &= ~GLUT_SRGB ; + fghChooseConfig(&WINDOW_CONFIG); + fgState.DisplayMode |= GLUT_SRGB; + + if( WINDOW_CONFIG ) goto done_retry; } } +done_retry: FREEGLUT_INTERNAL_ERROR_EXIT( WINDOW_CONFIG != NULL, "FBConfig with necessary capabilities not found", "fgOpenWindow" ); -- 1.7.10.4