diff --git a/src/video/x11/SDL_x11modes.c b/src/video/x11/SDL_x11modes.c index 23dcaf90ff..6da56b08ba 100644 --- a/src/video/x11/SDL_x11modes.c +++ b/src/video/x11/SDL_x11modes.c @@ -635,14 +635,32 @@ static bool X11_FillXRandRDisplayInfo(SDL_VideoDevice *_this, Display *dpy, int display->internal = displaydata; if (info) { - if (info->max_luminance > 0.0) { - /* ITU-R BT.2408-7 (Sept 2023) has the reference PQ white level at 203 nits, - * while older Dolby documentation claims a reference level of 100 nits. - * - * Use 203 nits for now. - */ - display->HDR.HDR_headroom = (float)info->max_luminance / 203.0f; - display->HDR.SDR_white_level = 1.0f; + /* ITU-R BT.2408-7 (Sept 2023) has the reference PQ white level at 203 nits, + * while older Dolby documentation claims a reference level of 100 nits. + * + * Use 203 nits for now. + */ + float SDR_white_level = 203.0f; + + bool steam_deck = SDL_GetHintBoolean("SteamDeck", false); + if (steam_deck) { + // The SDR white level is dynamic, but typically is 400 nits + // We'll need some other way to get this for external displays + SDR_white_level = 400.0f; + } else { + // Support for HDR on X11 seems spotty, let's disable this for now + SDR_white_level = 0.0f; + } + + // Allow a hint override for the SDR white level + const char *hint = SDL_GetHint("SDL_X11_SDR_WHITE_LEVEL"); + if (hint && *hint) { + SDR_white_level = (float)SDL_atof(hint); + } + + if (info->max_luminance > 0.0 && SDR_white_level > 0.0f) { + display->HDR.HDR_headroom = (float)info->max_luminance / SDR_white_level; + display->HDR.SDR_white_level = SDR_white_level / 80.0f; } SDL_free(info);