Cocoa Port: Try to fix some more synchronization issues in Metal display views.

- Also remove the usage of _rwlockFrame and change it to a simple
pthread_mutex_t, since CocoaDSDisplay objects no longer have a need for
a full pthread_rwlock_t.
This commit is contained in:
rogerman 2017-11-15 21:25:21 -08:00
parent a481abebf9
commit bc7b03c3d5
5 changed files with 29 additions and 46 deletions

View File

@ -103,7 +103,6 @@ typedef std::map<CGDirectDisplayID, int64_t> DisplayLinkFlushTimeLimitMap;
@property (assign) NSSize gpuDimensions; @property (assign) NSSize gpuDimensions;
@property (assign) NSUInteger gpuScale; @property (assign) NSUInteger gpuScale;
@property (assign) NSUInteger gpuColorFormat; @property (assign) NSUInteger gpuColorFormat;
@property (readonly) pthread_rwlock_t *gpuFrameRWLock;
@property (assign) BOOL layerMainGPU; @property (assign) BOOL layerMainGPU;
@property (assign) BOOL layerMainBG0; @property (assign) BOOL layerMainBG0;

View File

@ -52,7 +52,7 @@ class GPUEventHandlerOSX : public GPUEventHandlerDefault
private: private:
GPUClientFetchObject *_fetchObject; GPUClientFetchObject *_fetchObject;
pthread_rwlock_t _rwlockFrame; pthread_mutex_t _mutexFrame;
pthread_mutex_t _mutex3DRender; pthread_mutex_t _mutex3DRender;
pthread_mutex_t _mutexApplyGPUSettings; pthread_mutex_t _mutexApplyGPUSettings;
pthread_mutex_t _mutexApplyRender3DSettings; pthread_mutex_t _mutexApplyRender3DSettings;
@ -65,8 +65,7 @@ public:
GPUClientFetchObject* GetFetchObject() const; GPUClientFetchObject* GetFetchObject() const;
void SetFetchObject(GPUClientFetchObject *fetchObject); void SetFetchObject(GPUClientFetchObject *fetchObject);
void FramebufferLockWrite(); void FramebufferLock();
void FramebufferLockRead();
void FramebufferUnlock(); void FramebufferUnlock();
void Render3DLock(); void Render3DLock();
void Render3DUnlock(); void Render3DUnlock();
@ -75,7 +74,6 @@ public:
void ApplyRender3DSettingsLock(); void ApplyRender3DSettingsLock();
void ApplyRender3DSettingsUnlock(); void ApplyRender3DSettingsUnlock();
pthread_rwlock_t* GetFrameRWLock();
bool GetRender3DNeedsFinish(); bool GetRender3DNeedsFinish();
virtual void DidFrameBegin(bool isFrameSkipRequested, const u8 targetBufferIndex, const size_t line); virtual void DidFrameBegin(bool isFrameSkipRequested, const u8 targetBufferIndex, const size_t line);
@ -94,7 +92,6 @@ public:
@dynamic gpuDimensions; @dynamic gpuDimensions;
@dynamic gpuScale; @dynamic gpuScale;
@dynamic gpuColorFormat; @dynamic gpuColorFormat;
@dynamic gpuFrameRWLock;
@dynamic layerMainGPU; @dynamic layerMainGPU;
@dynamic layerMainBG0; @dynamic layerMainBG0;
@ -256,7 +253,7 @@ public:
- (void) setGpuDimensions:(NSSize)theDimensions - (void) setGpuDimensions:(NSSize)theDimensions
{ {
gpuEvent->Render3DLock(); gpuEvent->Render3DLock();
gpuEvent->FramebufferLockWrite(); gpuEvent->FramebufferLock();
#ifdef ENABLE_SHARED_FETCH_OBJECT #ifdef ENABLE_SHARED_FETCH_OBJECT
pthread_rwlock_wrlock([[self sharedData] rwlockFramebufferAtIndex:0]); pthread_rwlock_wrlock([[self sharedData] rwlockFramebufferAtIndex:0]);
@ -278,7 +275,7 @@ public:
- (NSSize) gpuDimensions - (NSSize) gpuDimensions
{ {
gpuEvent->Render3DLock(); gpuEvent->Render3DLock();
gpuEvent->FramebufferLockRead(); gpuEvent->FramebufferLock();
const NSSize dimensions = NSMakeSize(GPU->GetCustomFramebufferWidth(), GPU->GetCustomFramebufferHeight()); const NSSize dimensions = NSMakeSize(GPU->GetCustomFramebufferWidth(), GPU->GetCustomFramebufferHeight());
gpuEvent->FramebufferUnlock(); gpuEvent->FramebufferUnlock();
gpuEvent->Render3DUnlock(); gpuEvent->Render3DUnlock();
@ -313,7 +310,7 @@ public:
// Change the color format. // Change the color format.
gpuEvent->Render3DLock(); gpuEvent->Render3DLock();
gpuEvent->FramebufferLockWrite(); gpuEvent->FramebufferLock();
#ifdef ENABLE_SHARED_FETCH_OBJECT #ifdef ENABLE_SHARED_FETCH_OBJECT
pthread_rwlock_wrlock([[self sharedData] rwlockFramebufferAtIndex:0]); pthread_rwlock_wrlock([[self sharedData] rwlockFramebufferAtIndex:0]);
@ -335,7 +332,7 @@ public:
- (NSUInteger) gpuColorFormat - (NSUInteger) gpuColorFormat
{ {
gpuEvent->Render3DLock(); gpuEvent->Render3DLock();
gpuEvent->FramebufferLockRead(); gpuEvent->FramebufferLock();
const NSUInteger colorFormat = (NSUInteger)GPU->GetDisplayInfo().colorFormat; const NSUInteger colorFormat = (NSUInteger)GPU->GetDisplayInfo().colorFormat;
gpuEvent->FramebufferUnlock(); gpuEvent->FramebufferUnlock();
gpuEvent->Render3DUnlock(); gpuEvent->Render3DUnlock();
@ -343,11 +340,6 @@ public:
return colorFormat; return colorFormat;
} }
- (pthread_rwlock_t *) gpuFrameRWLock
{
return gpuEvent->GetFrameRWLock();
}
#ifdef ENABLE_SHARED_FETCH_OBJECT #ifdef ENABLE_SHARED_FETCH_OBJECT
- (void) setOutputList:(NSMutableArray *)theOutputList mutexPtr:(pthread_mutex_t *)theMutex - (void) setOutputList:(NSMutableArray *)theOutputList mutexPtr:(pthread_mutex_t *)theMutex
{ {
@ -868,7 +860,7 @@ public:
- (void) clearWithColor:(const uint16_t)colorBGRA5551 - (void) clearWithColor:(const uint16_t)colorBGRA5551
{ {
gpuEvent->FramebufferLockWrite(); gpuEvent->FramebufferLock();
#ifdef ENABLE_SHARED_FETCH_OBJECT #ifdef ENABLE_SHARED_FETCH_OBJECT
const u8 bufferIndex = GPU->GetDisplayInfo().bufferIndex; const u8 bufferIndex = GPU->GetDisplayInfo().bufferIndex;
@ -1239,7 +1231,7 @@ GPUEventHandlerOSX::GPUEventHandlerOSX()
{ {
_fetchObject = nil; _fetchObject = nil;
_render3DNeedsFinish = false; _render3DNeedsFinish = false;
pthread_rwlock_init(&_rwlockFrame, NULL); pthread_mutex_init(&_mutexFrame, NULL);
pthread_mutex_init(&_mutex3DRender, NULL); pthread_mutex_init(&_mutex3DRender, NULL);
pthread_mutex_init(&_mutexApplyGPUSettings, NULL); pthread_mutex_init(&_mutexApplyGPUSettings, NULL);
pthread_mutex_init(&_mutexApplyRender3DSettings, NULL); pthread_mutex_init(&_mutexApplyRender3DSettings, NULL);
@ -1252,7 +1244,7 @@ GPUEventHandlerOSX::~GPUEventHandlerOSX()
pthread_mutex_unlock(&this->_mutex3DRender); pthread_mutex_unlock(&this->_mutex3DRender);
} }
pthread_rwlock_destroy(&this->_rwlockFrame); pthread_mutex_destroy(&this->_mutexFrame);
pthread_mutex_destroy(&this->_mutex3DRender); pthread_mutex_destroy(&this->_mutex3DRender);
pthread_mutex_destroy(&this->_mutexApplyGPUSettings); pthread_mutex_destroy(&this->_mutexApplyGPUSettings);
pthread_mutex_destroy(&this->_mutexApplyRender3DSettings); pthread_mutex_destroy(&this->_mutexApplyRender3DSettings);
@ -1270,7 +1262,7 @@ void GPUEventHandlerOSX::SetFetchObject(GPUClientFetchObject *fetchObject)
void GPUEventHandlerOSX::DidFrameBegin(bool isFrameSkipRequested, const u8 targetBufferIndex, const size_t line) void GPUEventHandlerOSX::DidFrameBegin(bool isFrameSkipRequested, const u8 targetBufferIndex, const size_t line)
{ {
this->FramebufferLockWrite(); this->FramebufferLock();
#ifdef ENABLE_SHARED_FETCH_OBJECT #ifdef ENABLE_SHARED_FETCH_OBJECT
if (!isFrameSkipRequested) if (!isFrameSkipRequested)
@ -1334,19 +1326,14 @@ void GPUEventHandlerOSX::DidApplyRender3DSettingsEnd()
this->ApplyRender3DSettingsUnlock(); this->ApplyRender3DSettingsUnlock();
} }
void GPUEventHandlerOSX::FramebufferLockWrite() void GPUEventHandlerOSX::FramebufferLock()
{ {
pthread_rwlock_wrlock(&this->_rwlockFrame); pthread_mutex_lock(&this->_mutexFrame);
}
void GPUEventHandlerOSX::FramebufferLockRead()
{
pthread_rwlock_rdlock(&this->_rwlockFrame);
} }
void GPUEventHandlerOSX::FramebufferUnlock() void GPUEventHandlerOSX::FramebufferUnlock()
{ {
pthread_rwlock_unlock(&this->_rwlockFrame); pthread_mutex_unlock(&this->_mutexFrame);
} }
void GPUEventHandlerOSX::Render3DLock() void GPUEventHandlerOSX::Render3DLock()
@ -1384,11 +1371,6 @@ bool GPUEventHandlerOSX::GetRender3DNeedsFinish()
return this->_render3DNeedsFinish; return this->_render3DNeedsFinish;
} }
pthread_rwlock_t* GPUEventHandlerOSX::GetFrameRWLock()
{
return &this->_rwlockFrame;
}
#pragma mark - #pragma mark -
CGLContextObj OSXOpenGLRendererContext = NULL; CGLContextObj OSXOpenGLRendererContext = NULL;

View File

@ -901,7 +901,7 @@ volatile bool execute = true;
if ([theOutput isKindOfClass:[CocoaDSDisplay class]]) if ([theOutput isKindOfClass:[CocoaDSDisplay class]])
{ {
[theOutput setRwlockProducer:[[self cdsGPU] gpuFrameRWLock]]; [theOutput setRwlockProducer:NULL];
} }
else else
{ {

View File

@ -57,6 +57,8 @@
mutexConsume = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t)); mutexConsume = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(mutexConsume, NULL); pthread_mutex_init(mutexConsume, NULL);
rwlockProducer = NULL;
return self; return self;
} }

View File

@ -1299,16 +1299,16 @@
id<MTLCommandBuffer> cb = [self newCommandBuffer]; id<MTLCommandBuffer> cb = [self newCommandBuffer];
id<MTLComputeCommandEncoder> cce = [cb computeCommandEncoder]; id<MTLComputeCommandEncoder> cce = [cb computeCommandEncoder];
// Run the video source filters and the pixel scalers
if (useDeposterize)
{
[cce setComputePipelineState:[sharedData deposterizePipeline]];
if (needsFetchBuffersLock) if (needsFetchBuffersLock)
{ {
pthread_rwlock_rdlock([sharedData rwlockFramebufferAtIndex:bufferIndex]); pthread_rwlock_rdlock([sharedData rwlockFramebufferAtIndex:bufferIndex]);
} }
// Run the video source filters and the pixel scalers
if (useDeposterize)
{
[cce setComputePipelineState:[sharedData deposterizePipeline]];
if (shouldProcessDisplay[NDSDisplayID_Main]) if (shouldProcessDisplay[NDSDisplayID_Main])
{ {
[cce setTexture:texMain atIndex:0]; [cce setTexture:texMain atIndex:0];
@ -1348,16 +1348,19 @@
if (needsFetchBuffersLock) if (needsFetchBuffersLock)
{ {
needsFetchBuffersLock = !isDisplayProcessedMain || !isDisplayProcessedTouch;
[cce endEncoding]; [cce endEncoding];
[cb addCompletedHandler:^(id<MTLCommandBuffer> block) { [cb addCompletedHandler:^(id<MTLCommandBuffer> block) {
if (!needsFetchBuffersLock)
{
pthread_rwlock_unlock([sharedData rwlockFramebufferAtIndex:bufferIndex]); pthread_rwlock_unlock([sharedData rwlockFramebufferAtIndex:bufferIndex]);
}
}]; }];
[cb commit]; [cb commit];
cb = [self newCommandBuffer]; cb = [self newCommandBuffer];
cce = [cb computeCommandEncoder]; cce = [cb computeCommandEncoder];
needsFetchBuffersLock = !isDisplayProcessedMain || !isDisplayProcessedTouch;
} }
} }
@ -1366,11 +1369,6 @@
{ {
[cce setComputePipelineState:[self pixelScalePipeline]]; [cce setComputePipelineState:[self pixelScalePipeline]];
if (needsFetchBuffersLock)
{
pthread_rwlock_rdlock([sharedData rwlockFramebufferAtIndex:bufferIndex]);
}
if (shouldProcessDisplay[NDSDisplayID_Main]) if (shouldProcessDisplay[NDSDisplayID_Main])
{ {
[cce setTexture:texMain atIndex:0]; [cce setTexture:texMain atIndex:0];
@ -1400,6 +1398,8 @@
if (needsFetchBuffersLock) if (needsFetchBuffersLock)
{ {
needsFetchBuffersLock = false;
[cce endEncoding]; [cce endEncoding];
[cb addCompletedHandler:^(id<MTLCommandBuffer> block) { [cb addCompletedHandler:^(id<MTLCommandBuffer> block) {
pthread_rwlock_unlock([sharedData rwlockFramebufferAtIndex:bufferIndex]); pthread_rwlock_unlock([sharedData rwlockFramebufferAtIndex:bufferIndex]);