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)
|
QNSWindowBackingStore::QNSWindowBackingStore(QWindow *window)
|
||||||
: QCocoaBackingStore(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()
|
QNSWindowBackingStore::~QNSWindowBackingStore()
|
||||||
|
@ -1659,21 +1659,6 @@ QCocoaNSWindow *QCocoaWindow::createNSWindow(bool shouldBePanel)
|
|||||||
|
|
||||||
applyContentBorderThickness(nsWindow);
|
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)
|
if (format().colorSpace() == QSurfaceFormat::sRGBColorSpace)
|
||||||
nsWindow.colorSpace = NSColorSpace.sRGBColorSpace;
|
nsWindow.colorSpace = NSColorSpace.sRGBColorSpace;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user