Cocoa Port: Metal display views no longer lose visible frames when running multiple display views.

This commit is contained in:
rogerman 2018-02-03 21:21:54 -08:00
parent 01c508f93a
commit 23be799a67
2 changed files with 28 additions and 8 deletions

View File

@ -259,6 +259,7 @@ typedef DisplayViewShaderProperties DisplayViewShaderProperties;
{ {
MacDisplayLayeredView *_cdv; MacDisplayLayeredView *_cdv;
MacMetalDisplayPresenterObject *presenterObject; MacMetalDisplayPresenterObject *presenterObject;
dispatch_semaphore_t _semDrawable;
} }
@property (readonly, nonatomic) MacMetalDisplayPresenterObject *presenterObject; @property (readonly, nonatomic) MacMetalDisplayPresenterObject *presenterObject;

View File

@ -2147,6 +2147,7 @@
} }
_cdv = NULL; _cdv = NULL;
_semDrawable = dispatch_semaphore_create(3);
presenterObject = thePresenterObject; presenterObject = thePresenterObject;
if (thePresenterObject != nil) if (thePresenterObject != nil)
@ -2160,6 +2161,13 @@
return self; return self;
} }
- (void)dealloc
{
dispatch_release(_semDrawable);
[super dealloc];
}
- (void) setupLayer - (void) setupLayer
{ {
if ([self device] == nil) if ([self device] == nil)
@ -2174,33 +2182,44 @@
@autoreleasepool @autoreleasepool
{ {
// Now that everything is set up, go ahead and draw everything. // Now that everything is set up, go ahead and draw everything.
id<CAMetalDrawable> layerDrawable = [self nextDrawable]; dispatch_semaphore_wait(_semDrawable, DISPATCH_TIME_FOREVER);
id<CAMetalDrawable> layerDrawable = [[self nextDrawable] retain];
if (layerDrawable != nil) if (layerDrawable != nil)
{ {
[[presenterObject colorAttachment0Desc] setTexture:[layerDrawable texture]]; [[presenterObject colorAttachment0Desc] setTexture:[layerDrawable texture]];
id<MTLCommandBuffer> cb = [presenterObject newCommandBuffer]; id<MTLCommandBuffer> cbRender = [presenterObject newCommandBuffer];
id<MTLCommandBuffer> cbPresent = [presenterObject newCommandBuffer];
const MetalTexturePair texProcess = [presenterObject texPairProcess]; const MetalTexturePair texProcess = [presenterObject texPairProcess];
const MetalRenderFrameInfo mrfi = [presenterObject renderFrameInfo]; const MetalRenderFrameInfo mrfi = [presenterObject renderFrameInfo];
[presenterObject renderForCommandBuffer:cb [presenterObject renderForCommandBuffer:cbRender
outputPipelineState:[presenterObject outputDrawablePipeline] outputPipelineState:[presenterObject outputDrawablePipeline]
hudPipelineState:[[presenterObject sharedData] hudPipeline] hudPipelineState:[[presenterObject sharedData] hudPipeline]
texDisplays:texProcess texDisplays:texProcess
mrfi:mrfi]; mrfi:mrfi];
[cb presentDrawable:layerDrawable]; [cbRender addScheduledHandler:^(id<MTLCommandBuffer> block) {
[cb addScheduledHandler:^(id<MTLCommandBuffer> block) {
[presenterObject setRenderBufferState:ClientDisplayBufferState_Reading index:mrfi.renderIndex]; [presenterObject setRenderBufferState:ClientDisplayBufferState_Reading index:mrfi.renderIndex];
}]; }];
[cb addCompletedHandler:^(id<MTLCommandBuffer> block) { [cbRender addCompletedHandler:^(id<MTLCommandBuffer> block) {
[presenterObject renderFinishAtIndex:mrfi.renderIndex]; [presenterObject renderFinishAtIndex:mrfi.renderIndex];
}]; }];
[cb commit]; [cbPresent presentDrawable:layerDrawable];
[cbPresent addCompletedHandler:^(id<MTLCommandBuffer> block) {
[layerDrawable release];
dispatch_semaphore_signal(_semDrawable);
}];
[cbRender commit];
[cbPresent commit];
}
else
{
dispatch_semaphore_signal(_semDrawable);
} }
} }
} }