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;
MacMetalDisplayPresenterObject *presenterObject;
dispatch_semaphore_t _semDrawable;
}
@property (readonly, nonatomic) MacMetalDisplayPresenterObject *presenterObject;

View File

@ -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<CAMetalDrawable> layerDrawable = [self nextDrawable];
dispatch_semaphore_wait(_semDrawable, DISPATCH_TIME_FOREVER);
id<CAMetalDrawable> layerDrawable = [[self nextDrawable] retain];
if (layerDrawable != nil)
{
[[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 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<MTLCommandBuffer> block) {
[cbRender addScheduledHandler:^(id<MTLCommandBuffer> block) {
[presenterObject setRenderBufferState:ClientDisplayBufferState_Reading index:mrfi.renderIndex];
}];
[cb addCompletedHandler:^(id<MTLCommandBuffer> block) {
[cbRender addCompletedHandler:^(id<MTLCommandBuffer> block) {
[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);
}
}
}