macOS: Choose appropriate NSWindow depth based on surface format
Change-Id: I67e63412096ca11a8f056f5755525311756906ef Reviewed-by: Andy Nichols <andy.nichols@qt.io> Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
parent
f8d41309c8
commit
e1b0dfc1d4
@ -75,6 +75,37 @@ QCFType<CGColorSpaceRef> QCocoaBackingStore::colorSpace() const
|
||||
QNSWindowBackingStore::QNSWindowBackingStore(QWindow *window)
|
||||
: QCocoaBackingStore(window)
|
||||
{
|
||||
// Choose an appropriate window depth based on the requested surface format.
|
||||
// On deep color displays the default bit depth is 16-bit, so unless we need
|
||||
// that level of precision we opt out of it (and the expensive RGB32 -> RGB64
|
||||
// conversions that come with it if our backingstore depth does not match).
|
||||
|
||||
NSWindow *nsWindow = static_cast<QCocoaWindow *>(window->handle())->view().window;
|
||||
auto colorSpaceName = NSColorSpaceFromDepth(nsWindow.depthLimit);
|
||||
|
||||
static const int kDefaultBitDepth = 8;
|
||||
auto surfaceFormat = window->requestedFormat();
|
||||
auto bitsPerSample = qMax(kDefaultBitDepth, qMax(surfaceFormat.redBufferSize(),
|
||||
qMax(surfaceFormat.greenBufferSize(), surfaceFormat.blueBufferSize())));
|
||||
|
||||
// NSBestDepth does not seem to guarantee a window depth deep enough for the
|
||||
// given bits per sample, even if documented as such. For example, requesting
|
||||
// 10 bits per sample will not give us a 16-bit format, even if that's what's
|
||||
// available. Work around this by manually bumping the bit depth.
|
||||
bitsPerSample = !(bitsPerSample & (bitsPerSample - 1))
|
||||
? bitsPerSample : qNextPowerOfTwo(bitsPerSample);
|
||||
|
||||
auto bestDepth = NSBestDepth(colorSpaceName, bitsPerSample, 0, NO, nullptr);
|
||||
|
||||
// Disable dynamic depth limit, otherwise our depth limit will be overwritten
|
||||
// by AppKit if the window moves to a screen with a different depth. We call
|
||||
// this before setting the depth limit, as the call will reset the depth to 0.
|
||||
[nsWindow setDynamicDepthLimit:NO];
|
||||
|
||||
qCDebug(lcQpaBackingStore) << "Using" << NSBitsPerSampleFromDepth(bestDepth)
|
||||
<< "bit window depth for" << nsWindow;
|
||||
|
||||
nsWindow.depthLimit = bestDepth;
|
||||
}
|
||||
|
||||
QNSWindowBackingStore::~QNSWindowBackingStore()
|
||||
|
@ -1659,21 +1659,6 @@ QCocoaNSWindow *QCocoaWindow::createNSWindow(bool shouldBePanel)
|
||||
|
||||
applyContentBorderThickness(nsWindow);
|
||||
|
||||
// Prevent CoreGraphics RGB32 -> RGB64 backing store conversions on deep color
|
||||
// displays by forcing 8-bit components, unless a deep color format has been
|
||||
// requested. This conversion uses significant CPU time.
|
||||
QSurface::SurfaceType surfaceType = QPlatformWindow::window()->surfaceType();
|
||||
bool usesCoreGraphics = surfaceType == QSurface::RasterSurface || surfaceType == QSurface::RasterGLSurface;
|
||||
QSurfaceFormat surfaceFormat = QPlatformWindow::window()->format();
|
||||
bool usesDeepColor = surfaceFormat.redBufferSize() > 8 ||
|
||||
surfaceFormat.greenBufferSize() > 8 ||
|
||||
surfaceFormat.blueBufferSize() > 8;
|
||||
bool usesLayer = view().layer;
|
||||
if (usesCoreGraphics && !usesDeepColor && !usesLayer) {
|
||||
[nsWindow setDynamicDepthLimit:NO];
|
||||
[nsWindow setDepthLimit:NSWindowDepthTwentyfourBitRGB];
|
||||
}
|
||||
|
||||
if (format().colorSpace() == QSurfaceFormat::sRGBColorSpace)
|
||||
nsWindow.colorSpace = NSColorSpace.sRGBColorSpace;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user