diff --git a/src/common/macosx.h b/src/common/macosx.h index f473ba331..00769aece 100644 --- a/src/common/macosx.h +++ b/src/common/macosx.h @@ -27,6 +27,8 @@ #include +typedef struct SDL_Window SDL_Window; + namespace love { namespace macosx @@ -55,6 +57,12 @@ std::string getExecutablePath(); **/ void requestAttention(bool continuous); +/** + * Explicitly sets the window's color space to be sRGB - which stops the OS + * from interpreting the backbuffer output as P3 on P3-capable displays. + **/ +void setWindowSRGBColorSpace(SDL_Window *window); + } // macosx } // love diff --git a/src/common/macosx.mm b/src/common/macosx.mm index dc491f898..1fa3e343c 100644 --- a/src/common/macosx.mm +++ b/src/common/macosx.mm @@ -26,9 +26,11 @@ #import #ifdef LOVE_MACOSX_SDL_DIRECT_INCLUDE -# include +#include +#include #else -# include +#include +#include #endif namespace love @@ -93,6 +95,21 @@ void requestAttention(bool continuous) } } +void setWindowSRGBColorSpace(SDL_Window *window) +{ + @autoreleasepool + { + // This works on earlier macOS versions, but performance may be worse + // (at least, it was back when I tested in December 2016). + if (@available(macOS 11.0, *)) + { + SDL_SysWMinfo info = {}; + if (SDL_GetWindowWMInfo(window, &info)) + info.info.cocoa.window.colorSpace = [NSColorSpace sRGBColorSpace]; + } + } +} + } // osx } // love diff --git a/src/modules/window/sdl/Window.cpp b/src/modules/window/sdl/Window.cpp index a6cf71db6..767a3fc56 100644 --- a/src/modules/window/sdl/Window.cpp +++ b/src/modules/window/sdl/Window.cpp @@ -311,6 +311,10 @@ bool Window::createWindowAndContext(int x, int y, int w, int h, Uint32 windowfla return false; } +#ifdef LOVE_MACOS + love::macos::setWindowSRGBColorSpace(window); +#endif + context = SDL_GL_CreateContext(window); if (!context)