7#include <QtCore/qreadwritelock.h>
8#include <QtCore/qrect.h>
10using namespace std::chrono_literals;
18@implementation QMetalLayer
20 std::unique_ptr<QReadWriteLock> m_displayLock;
25 if ((self = [super init])) {
26 m_displayLock.reset(
new QReadWriteLock(QReadWriteLock::Recursive));
27 self.mainThreadPresentation = nil;
33- (QReadWriteLock &)displayLock
35 return *m_displayLock.get();
38- (
void)setNeedsDisplay
40 [self setNeedsDisplayInRect:CGRectInfinite];
43- (
void)setNeedsDisplayInRect:(CGRect)rect
45 if (!self.needsDisplay) {
49 qCDebug(lcMetalLayer) <<
"Locking" << self <<
"for writing"
50 <<
"due to needing display in rect" << QRectF::fromCGRect(rect);
55 if (!self.displayLock.tryLockForWrite(5s)) {
56 qCWarning(lcMetalLayer) <<
"Timed out waiting for display lock";
61 [super setNeedsDisplayInRect:rect];
64- (id<CAMetalDrawable>)nextDrawable
70 QMacAutoReleasePool pool;
71 self.mainThreadPresentation = nil;
74 return [super nextDrawable];
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")