Improve thread-safety of MTL Renderer.

Bug: b/77579859
Change-Id: I427d0f41593155dc5cbf98a09d7ec826497b803c
Reviewed-on: https://webrtc-review.googlesource.com/67040
Commit-Queue: Kári Helgason <kthelgason@webrtc.org>
Reviewed-by: Anders Carlsson <andersc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22795}
This commit is contained in:
Kári Tristan Helgason 2018-04-05 11:48:00 +02:00 committed by Commit Bot
parent 68435f558b
commit a8f13ccad4
2 changed files with 13 additions and 11 deletions

View File

@ -18,6 +18,7 @@
#import "WebRTC/RTCVideoFrameBuffer.h"
#import "RTCMTLRenderer+Private.h"
#include "rtc_base/checks.h"
#define MTL_STRINGIFY(s) @ #s
@ -85,6 +86,7 @@ static NSString *const shaderSource = MTL_STRINGIFY(
}
- (BOOL)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame {
RTC_DCHECK([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]]);
[super setupTexturesForFrame:frame];
CVPixelBufferRef pixelBuffer = ((RTCCVPixelBuffer *)frame.buffer).pixelBuffer;

View File

@ -105,32 +105,32 @@
- (void)drawInMTKView:(nonnull MTKView *)view {
NSAssert(view == self.metalView, @"Receiving draw callbacks from foreign instance.");
if (!self.videoFrame) {
RTCVideoFrame *videoFrame = self.videoFrame;
if (!videoFrame) {
return;
}
id<RTCMTLRenderer> renderer = nil;
if ([self.videoFrame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
if (!self.rendererNV12) {
if ([videoFrame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
static dispatch_once_t nv12_token;
dispatch_once(&nv12_token, ^{
self.rendererNV12 = [RTCMTLVideoView createNV12Renderer];
if (![self.rendererNV12 addRenderingDestination:self.metalView]) {
self.rendererNV12 = nil;
RTCLogError(@"Failed to create NV12 renderer");
}
}
renderer = self.rendererNV12;
});
[self.rendererNV12 drawFrame:videoFrame];
} else {
if (!self.rendererI420) {
static dispatch_once_t i420_token;
dispatch_once(&i420_token, ^{
self.rendererI420 = [RTCMTLVideoView createI420Renderer];
if (![self.rendererI420 addRenderingDestination:self.metalView]) {
self.rendererI420 = nil;
RTCLogError(@"Failed to create I420 renderer");
}
}
renderer = self.rendererI420;
});
[self.rendererI420 drawFrame:videoFrame];
}
[renderer drawFrame:self.videoFrame];
}
- (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size {