@@ -208,6 +208,7 @@ public abstract class LwjglWindow extends LwjglContext implements Runnable {
208208 protected boolean wasActive = false ;
209209 protected boolean autoFlush = true ;
210210 protected boolean allowSwapBuffers = false ;
211+ private boolean auxFramebufferSrgbFallback ;
211212
212213 // state maintained by updateSizes()
213214 private int oldFramebufferWidth ;
@@ -266,6 +267,7 @@ public void restart() {
266267 protected void createContext (final AppSettings settings ) {
267268 disableNvidiaThreadedOptimizations ();
268269 useAngle = AppSettings .ANGLE_GLES3 .equals (settings .getRenderer ());
270+ auxFramebufferSrgbFallback = false ;
269271 configureVideoDriverHints (settings );
270272 configureAngleHints (settings );
271273
@@ -275,7 +277,7 @@ protected void createContext(final AppSettings settings) {
275277
276278 SDL_SetHint (SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE , "0" );
277279 SDL_GL_ResetAttributes ();
278- configureGLAttributes (settings );
280+ boolean srgbFramebufferRequested = configureGLAttributes (settings );
279281
280282 display = settings .isFullscreen () ? getDisplay (settings .getDisplay ()) : SDL_GetPrimaryDisplay ();
281283 SDL_DisplayMode videoMode = SDL_GetCurrentDisplayMode ((int ) display );
@@ -315,7 +317,7 @@ protected void createContext(final AppSettings settings) {
315317 windowFlags |= SDL_WINDOW_FULLSCREEN ;
316318 }
317319
318- window = SDL_CreateWindow (settings . getTitle () , requestWidth , requestHeight , windowFlags );
320+ window = createWindow (settings , requestWidth , requestHeight , windowFlags , srgbFramebufferRequested );
319321 if (window == NULL ) {
320322 throw new RuntimeException ("Failed to create SDL window: " + SDL_GetError ());
321323 }
@@ -403,7 +405,36 @@ private void resetAngleHints() {
403405 Configuration .EGL_LIBRARY_NAME .set (null );
404406 }
405407
406- private void configureGLAttributes (AppSettings settings ) {
408+ private long createWindow (AppSettings settings , int width , int height , long flags ,
409+ boolean srgbFramebufferRequested ) {
410+ long createdWindow = SDL_CreateWindow (settings .getTitle (), width , height , flags );
411+ if (createdWindow != NULL || !srgbFramebufferRequested ) {
412+ return createdWindow ;
413+ }
414+
415+ String initialError = SDL_GetError ();
416+ if (canUseAuxFramebufferSrgb ()) {
417+ auxFramebufferSrgbFallback = true ;
418+ }
419+
420+ LOGGER .log (Level .WARNING ,
421+ auxFramebufferSrgbFallback
422+ ? "Unable to create an sRGB-capable SDL window, retrying with the auxiliary sRGB framebuffer: {0}"
423+ : "Unable to create an sRGB-capable SDL window, retrying with a linear default framebuffer: {0}" ,
424+ initialError );
425+ SDL_GL_SetAttribute (SDL_GL_FRAMEBUFFER_SRGB_CAPABLE , 0 );
426+
427+ createdWindow = SDL_CreateWindow (settings .getTitle (), width , height , flags );
428+ if (createdWindow == NULL ) {
429+ String retryError = SDL_GetError ();
430+ throw new RuntimeException ("Failed to create SDL window: " + initialError
431+ + "; retry without sRGB default framebuffer also failed: " + retryError );
432+ }
433+
434+ return createdWindow ;
435+ }
436+
437+ private boolean configureGLAttributes (AppSettings settings ) {
407438 final String renderer = settings .getRenderer ();
408439 final boolean glesContext = AppSettings .ANGLE_GLES3 .equals (renderer );
409440 RENDER_CONFIGS .getOrDefault (renderer , RENDER_CONFIGS .get (AppSettings .LWJGL_OPENGL32 )).run ();
@@ -432,7 +463,8 @@ private void configureGLAttributes(AppSettings settings) {
432463 SDL_GL_SetAttribute (SDL_GL_MULTISAMPLEBUFFERS , settings .getSamples () > 0 ? 1 : 0 );
433464 SDL_GL_SetAttribute (SDL_GL_MULTISAMPLESAMPLES , Math .max (settings .getSamples (), 0 ));
434465
435- if (settings .isGammaCorrection () && !useAuxFramebufferSrgb ()) {
466+ boolean srgbFramebufferRequested = settings .isGammaCorrection () && !useAuxFramebufferSrgb ();
467+ if (srgbFramebufferRequested ) {
436468 if (!SDL_GL_SetAttribute (SDL_GL_FRAMEBUFFER_SRGB_CAPABLE , 1 )) {
437469 throw new IllegalStateException ("SDL_GL_SetAttribute(SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, 1) failed: "
438470 + SDL_GetError ());
@@ -448,6 +480,8 @@ private void configureGLAttributes(AppSettings settings) {
448480 SDL_GL_SetAttribute (SDL_GL_GREEN_SIZE , 6 );
449481 SDL_GL_SetAttribute (SDL_GL_BLUE_SIZE , 5 );
450482 }
483+
484+ return srgbFramebufferRequested ;
451485 }
452486
453487 protected void updateSizes () {
@@ -655,7 +689,20 @@ protected boolean initInThread() {
655689
656690 @ Override
657691 protected boolean useAuxFramebufferSrgb () {
658- return useAngle && settings .isGammaCorrection () && (type == Type .Display || type == Type .Canvas )
692+ return (useAngle || auxFramebufferSrgbFallback ) && canUseAuxFramebufferSrgb ();
693+ }
694+
695+ @ Override
696+ protected boolean enableAuxFramebufferSrgbFallback () {
697+ if (!canUseAuxFramebufferSrgb ()) {
698+ return false ;
699+ }
700+ auxFramebufferSrgbFallback = true ;
701+ return true ;
702+ }
703+
704+ private boolean canUseAuxFramebufferSrgb () {
705+ return settings .isGammaCorrection () && (type == Type .Display || type == Type .Canvas )
659706 && listener instanceof Application ;
660707 }
661708
@@ -806,12 +853,13 @@ private boolean renderFrameWithAuxFramebuffer() {
806853
807854 GLRenderer glRenderer = (GLRenderer ) renderer ;
808855 RenderManager renderManager = getApplicationListener ().getRenderManager ();
856+ FrameBuffer previousMainFramebuffer = renderer .getCurrentFrameBuffer ();
809857
810858 glRenderer .setMainFrameBufferOverride (auxFramebuffer );
811859 try {
812860 listener .update ();
813861 } finally {
814- glRenderer .setMainFrameBufferOverride (null );
862+ glRenderer .setMainFrameBufferOverride (previousMainFramebuffer );
815863 }
816864
817865 glRenderer .setFrameBuffer (null );
0 commit comments