Skip to content

Commit d9cf4ec

Browse files
committed
fallback to aux framebuffer if srgb framebuffer is not available
1 parent 327798c commit d9cf4ec

2 files changed

Lines changed: 70 additions & 9 deletions

File tree

jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglContext.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ protected void initContextFirstTime() {
207207
private void initContext(boolean first) {
208208

209209
final String renderer = settings.getRenderer();
210-
final boolean auxFramebufferSrgb = useAuxFramebufferSrgb();
210+
boolean auxFramebufferSrgb = useAuxFramebufferSrgb();
211211

212212
if (first) {
213213
GL gl;
@@ -292,8 +292,17 @@ private void initContext(boolean first) {
292292
isSrgbFb = isDefaultFramebufferSrgb();
293293

294294
if (!isSrgbFb && settings.isGammaCorrection()) {
295-
logger.warning(
296-
"sRGB framebuffer not supported by the backend platform, disabling gamma correction");
295+
if (enableAuxFramebufferSrgbFallback()) {
296+
auxFramebufferSrgb = useAuxFramebufferSrgb();
297+
if (auxFramebufferSrgb) {
298+
logger.warning(
299+
"sRGB framebuffer not supported by the backend platform, using auxiliary sRGB framebuffer");
300+
}
301+
}
302+
if (!auxFramebufferSrgb) {
303+
logger.warning(
304+
"sRGB framebuffer not supported by the backend platform, disabling gamma correction");
305+
}
297306
}
298307
}
299308

@@ -337,6 +346,10 @@ protected boolean useAuxFramebufferSrgb() {
337346
return false;
338347
}
339348

349+
protected boolean enableAuxFramebufferSrgbFallback() {
350+
return false;
351+
}
352+
340353
public void internalDestroy() {
341354
renderer = null;
342355
timer = null;

jme3-lwjgl3/src/main/java/com/jme3/system/lwjgl/LwjglWindow.java

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)