From 23be799a67e15e0a35b385fb53c9b928b23c84c2 Mon Sep 17 00:00:00 2001 From: rogerman Date: Sat, 3 Feb 2018 21:21:54 -0800 Subject: [PATCH] Cocoa Port: Metal display views no longer lose visible frames when running multiple display views. --- .../cocoa/userinterface/MacMetalDisplayView.h | 1 + .../userinterface/MacMetalDisplayView.mm | 35 ++++++++++++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.h b/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.h index bf5a64fe0..865258710 100644 --- a/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.h +++ b/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.h @@ -259,6 +259,7 @@ typedef DisplayViewShaderProperties DisplayViewShaderProperties; { MacDisplayLayeredView *_cdv; MacMetalDisplayPresenterObject *presenterObject; + dispatch_semaphore_t _semDrawable; } @property (readonly, nonatomic) MacMetalDisplayPresenterObject *presenterObject; diff --git a/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.mm b/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.mm index c858aef59..51742cfb5 100644 --- a/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.mm +++ b/desmume/src/frontend/cocoa/userinterface/MacMetalDisplayView.mm @@ -2147,6 +2147,7 @@ } _cdv = NULL; + _semDrawable = dispatch_semaphore_create(3); presenterObject = thePresenterObject; if (thePresenterObject != nil) @@ -2160,6 +2161,13 @@ return self; } +- (void)dealloc +{ + dispatch_release(_semDrawable); + + [super dealloc]; +} + - (void) setupLayer { if ([self device] == nil) @@ -2174,33 +2182,44 @@ @autoreleasepool { // Now that everything is set up, go ahead and draw everything. - id layerDrawable = [self nextDrawable]; + dispatch_semaphore_wait(_semDrawable, DISPATCH_TIME_FOREVER); + id layerDrawable = [[self nextDrawable] retain]; if (layerDrawable != nil) { [[presenterObject colorAttachment0Desc] setTexture:[layerDrawable texture]]; - id cb = [presenterObject newCommandBuffer]; + id cbRender = [presenterObject newCommandBuffer]; + id cbPresent = [presenterObject newCommandBuffer]; const MetalTexturePair texProcess = [presenterObject texPairProcess]; const MetalRenderFrameInfo mrfi = [presenterObject renderFrameInfo]; - [presenterObject renderForCommandBuffer:cb + [presenterObject renderForCommandBuffer:cbRender outputPipelineState:[presenterObject outputDrawablePipeline] hudPipelineState:[[presenterObject sharedData] hudPipeline] texDisplays:texProcess mrfi:mrfi]; - [cb presentDrawable:layerDrawable]; - - [cb addScheduledHandler:^(id block) { + [cbRender addScheduledHandler:^(id block) { [presenterObject setRenderBufferState:ClientDisplayBufferState_Reading index:mrfi.renderIndex]; }]; - [cb addCompletedHandler:^(id block) { + [cbRender addCompletedHandler:^(id block) { [presenterObject renderFinishAtIndex:mrfi.renderIndex]; }]; - [cb commit]; + [cbPresent presentDrawable:layerDrawable]; + [cbPresent addCompletedHandler:^(id block) { + [layerDrawable release]; + dispatch_semaphore_signal(_semDrawable); + }]; + + [cbRender commit]; + [cbPresent commit]; + } + else + { + dispatch_semaphore_signal(_semDrawable); } } }