6#include <QtCore/qreadwritelock.h>
7#include <QtCore/qrect.h>
9using namespace std::chrono_literals;
17@implementation QMetalLayer
19 std::unique_ptr<QReadWriteLock> m_displayLock;
24 if ((self = [super init])) {
25 m_displayLock.reset(
new QReadWriteLock(QReadWriteLock::Recursive));
26 self.mainThreadPresentation = nil;
32- (QReadWriteLock &)displayLock
34 return *m_displayLock.get();
37- (
void)setNeedsDisplay
39 [self setNeedsDisplayInRect:CGRectInfinite];
42- (
void)setNeedsDisplayInRect:(CGRect)rect
44 if (!self.needsDisplay) {
48 qCDebug(lcMetalLayer) <<
"Locking" << self <<
"for writing"
49 <<
"due to needing display in rect" << QRectF::fromCGRect(rect);
54 if (!self.displayLock.tryLockForWrite(5s)) {
55 qCWarning(lcMetalLayer) <<
"Timed out waiting for display lock";
60 [super setNeedsDisplayInRect:rect];
63- (id<CAMetalDrawable>)nextDrawable
69 QMacAutoReleasePool pool;
70 self.mainThreadPresentation = nil;
73 return [super nextDrawable];
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")