fix: missing frametime graph due to previous incorrect merge
This commit is contained in:
1 parent
f0b4e2e2ad
commit
05d3567489
1 file changed
+32
-9
@@ -253,7 +253,7 @@ static const NSUInteger MaxFramesInFlight = 3;
|
|||||||
newColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceITUR_2100_PQ);
|
newColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceITUR_2100_PQ);
|
||||||
newPixelFormat = MTLPixelFormatBGR10A2Unorm;
|
newPixelFormat = MTLPixelFormatBGR10A2Unorm;
|
||||||
} else {
|
} else {
|
||||||
// SDR 2020
|
// SDR 2020, I'm not sure it's possible to stream this though
|
||||||
newColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceITUR_2020);
|
newColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceITUR_2020);
|
||||||
newPixelFormat = MTLPixelFormatBGR10A2Unorm;
|
newPixelFormat = MTLPixelFormatBGR10A2Unorm;
|
||||||
}
|
}
|
||||||
@@ -395,18 +395,27 @@ static const NSUInteger MaxFramesInFlight = 3;
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle changes to the video size or drawable size
|
||||||
if (![self updateVideoRegionSizeForFrame:frame toLayer:layer]) {
|
if (![self updateVideoRegionSizeForFrame:frame toLayer:layer]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FQLog(LOG_I, @"[%d / %.3f ms] Metal frame rendering", frame.frameNumber, frame.pts);
|
||||||
|
|
||||||
|
#if !TARGET_OS_TV
|
||||||
|
// Experimental EDR handling based on frame metadata
|
||||||
|
//[self applyEDRFromFrame:frame toLayer:layer];
|
||||||
|
#endif
|
||||||
|
|
||||||
size_t planes = CVPixelBufferGetPlaneCount(frame.pixelBuffer);
|
size_t planes = CVPixelBufferGetPlaneCount(frame.pixelBuffer);
|
||||||
assert(planes <= MAX_VIDEO_PLANES);
|
assert(planes <= MAX_VIDEO_PLANES);
|
||||||
|
|
||||||
if (layerDidChange && frame.frameNumber > 1) {
|
if (layerDidChange && frame.frameNumber > 1) {
|
||||||
Log(LOG_I, @"Metal frame changed layer's colorspace and/or pixel format, invalidating pipeline cache");
|
Log(LOG_I, @"Metal frame changed layer's colorspace and/or pixel format");
|
||||||
_videoPipelineState[planes] = nil;
|
_videoPipelineState[planes] = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is created once and cached based on the planes value
|
||||||
if (!_videoPipelineState[planes]) {
|
if (!_videoPipelineState[planes]) {
|
||||||
MTLRenderPipelineDescriptor *pipelineDesc = [MTLRenderPipelineDescriptor new];
|
MTLRenderPipelineDescriptor *pipelineDesc = [MTLRenderPipelineDescriptor new];
|
||||||
id<MTLLibrary> defaultLibrary = [_device newDefaultLibrary];
|
id<MTLLibrary> defaultLibrary = [_device newDefaultLibrary];
|
||||||
@@ -479,7 +488,7 @@ static const NSUInteger MaxFramesInFlight = 3;
|
|||||||
|
|
||||||
id<CAMetalDrawable> drawable = [layer nextDrawable];
|
id<CAMetalDrawable> drawable = [layer nextDrawable];
|
||||||
if (!drawable) {
|
if (!drawable) {
|
||||||
Log(LOG_E, @"Failed to get nextDrawable from layer");
|
Log(LOG_E, @"Failed to get nextDrawable");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_renderPassDescriptor.colorAttachments[0].texture = drawable.texture;
|
_renderPassDescriptor.colorAttachments[0].texture = drawable.texture;
|
||||||
@@ -488,24 +497,37 @@ static const NSUInteger MaxFramesInFlight = 3;
|
|||||||
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:_renderPassDescriptor];
|
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:_renderPassDescriptor];
|
||||||
|
|
||||||
[renderEncoder setRenderPipelineState:_videoPipelineState[planes]];
|
[renderEncoder setRenderPipelineState:_videoPipelineState[planes]];
|
||||||
[renderEncoder setVertexBuffer:_VideoVertexBuffer offset:0 atIndex:0];
|
|
||||||
[renderEncoder setFragmentBuffer:_CscParamsBuffer offset:0 atIndex:0];
|
|
||||||
for (size_t i = 0; i < planes; i++) {
|
for (size_t i = 0; i < planes; i++) {
|
||||||
[renderEncoder setFragmentTexture:CVMetalTextureGetTexture(_cvMetalTextures[i]) atIndex:i];
|
[renderEncoder setFragmentTexture:CVMetalTextureGetTexture(_cvMetalTextures[i]) atIndex:i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[renderEncoder setFragmentBuffer:_CscParamsBuffer offset:0 atIndex:0];
|
||||||
|
[renderEncoder setVertexBuffer:_VideoVertexBuffer offset:0 atIndex:0];
|
||||||
[renderEncoder drawPrimitives:MTLPrimitiveTypeTriangleStrip vertexStart:0 vertexCount:4];
|
[renderEncoder drawPrimitives:MTLPrimitiveTypeTriangleStrip vertexStart:0 vertexCount:4];
|
||||||
[renderEncoder endEncoding];
|
[renderEncoder endEncoding];
|
||||||
|
|
||||||
|
#if TARGET_OS_SIMULATOR
|
||||||
|
[commandBuffer presentDrawable:drawable];
|
||||||
|
#else
|
||||||
|
// present for a minimum duration for best frame pacing
|
||||||
[commandBuffer presentDrawable:drawable afterMinimumDuration:1.0f / _framerate];
|
[commandBuffer presentDrawable:drawable afterMinimumDuration:1.0f / _framerate];
|
||||||
|
#endif
|
||||||
|
|
||||||
[commandBuffer commit];
|
[commandBuffer commit];
|
||||||
|
|
||||||
[commandBuffer waitUntilCompleted];
|
__weak typeof(self) self_ = self;
|
||||||
|
[drawable addPresentedHandler:^(id<MTLDrawable> d) {
|
||||||
|
if (self_) {
|
||||||
|
[self_ plotFrametime:d.presentedTime];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
|
||||||
const CFTimeInterval GPUTime = commandBuffer.GPUEndTime - commandBuffer.GPUStartTime;
|
const CFTimeInterval GPUTime = commandBuffer.GPUEndTime - commandBuffer.GPUStartTime;
|
||||||
const double alpha = 0.25f;
|
const double alpha = 0.25f;
|
||||||
_averageGPUTime = (GPUTime * alpha) + (_averageGPUTime * (1.0 - alpha));
|
_averageGPUTime = (GPUTime * alpha) + (_averageGPUTime * (1.0 - alpha));
|
||||||
|
|
||||||
|
// Free textures after completion of rendering
|
||||||
for (size_t i = 0; i < planes; i++) {
|
for (size_t i = 0; i < planes; i++) {
|
||||||
if (_cvMetalTextures[i]) {
|
if (_cvMetalTextures[i]) {
|
||||||
CVBufferRelease(_cvMetalTextures[i]);
|
CVBufferRelease(_cvMetalTextures[i]);
|
||||||
@@ -513,12 +535,10 @@ static const NSUInteger MaxFramesInFlight = 3;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
CVMetalTextureCacheFlush(_textureCache, 0);
|
CVMetalTextureCacheFlush(_textureCache, 0);
|
||||||
|
[commandBuffer waitUntilCompleted];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)waitToRenderTo:(nonnull CAMetalLayer *)layer {
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)plotFrametime:(CFTimeInterval)presentedTime {
|
- (void)plotFrametime:(CFTimeInterval)presentedTime {
|
||||||
if (_lastPresented > 0) {
|
if (_lastPresented > 0) {
|
||||||
CFTimeInterval frametime = presentedTime - _lastPresented;
|
CFTimeInterval frametime = presentedTime - _lastPresented;
|
||||||
@@ -527,6 +547,9 @@ static const NSUInteger MaxFramesInFlight = 3;
|
|||||||
_lastPresented = presentedTime;
|
_lastPresented = presentedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)waitToRenderTo:(nonnull CAMetalLayer *)layer {
|
||||||
|
}
|
||||||
|
|
||||||
/// Responds to the drawable's size or orientation changes.
|
/// Responds to the drawable's size or orientation changes.
|
||||||
- (void)drawableResize:(CGSize)drawableSize {
|
- (void)drawableResize:(CGSize)drawableSize {
|
||||||
[self resize:drawableSize];
|
[self resize:drawableSize];
|
||||||
|
|||||||
Reference in new issue
Block a user