Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(260)

Side by Side Diff: webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm

Issue 2742603003: Reland of Add Metal video view in AppRTCMobile and metal availability macro. (Closed)
Patch Set: Don't render without a texture Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 232
233 id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer]; 233 id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
234 commandBuffer.label = commandBufferLabel; 234 commandBuffer.label = commandBufferLabel;
235 235
236 __block dispatch_semaphore_t block_semaphore = _inflight_semaphore; 236 __block dispatch_semaphore_t block_semaphore = _inflight_semaphore;
237 [commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull) { 237 [commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull) {
238 // GPU work completed. 238 // GPU work completed.
239 dispatch_semaphore_signal(block_semaphore); 239 dispatch_semaphore_signal(block_semaphore);
240 }]; 240 }];
241 241
242 MTLRenderPassDescriptor *_renderPassDescriptor = _view.currentRenderPassDescri ptor; 242 MTLRenderPassDescriptor *renderPassDescriptor = _view.currentRenderPassDescrip tor;
243 if (_renderPassDescriptor) { // Valid drawable. 243 if (renderPassDescriptor) { // Valid drawable.
244 id<MTLRenderCommandEncoder> renderEncoder = 244 id<MTLRenderCommandEncoder> renderEncoder =
245 [commandBuffer renderCommandEncoderWithDescriptor:_renderPassDescriptor] ; 245 [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
246 renderEncoder.label = renderEncoderLabel; 246 renderEncoder.label = renderEncoderLabel;
247 247
248 // Set context state. 248 // Set context state.
249 [renderEncoder pushDebugGroup:renderEncoderDebugGroup]; 249 [renderEncoder pushDebugGroup:renderEncoderDebugGroup];
250 [renderEncoder setRenderPipelineState:_pipelineState]; 250 [renderEncoder setRenderPipelineState:_pipelineState];
251 [renderEncoder setVertexBuffer:_vertexBuffer offset:_offset * sizeof(float) atIndex:0]; 251 [renderEncoder setVertexBuffer:_vertexBuffer offset:_offset * sizeof(float) atIndex:0];
252 [renderEncoder setFragmentTexture:_yTexture atIndex:0]; 252 [renderEncoder setFragmentTexture:_yTexture atIndex:0];
253 [renderEncoder setFragmentTexture:_CrCbTexture atIndex:1]; 253 [renderEncoder setFragmentTexture:_CrCbTexture atIndex:1];
254 254
255 [renderEncoder drawPrimitives:MTLPrimitiveTypeTriangleStrip 255 [renderEncoder drawPrimitives:MTLPrimitiveTypeTriangleStrip
256 vertexStart:0 256 vertexStart:0
257 vertexCount:4 257 vertexCount:4
258 instanceCount:1]; 258 instanceCount:1];
259 [renderEncoder popDebugGroup]; 259 [renderEncoder popDebugGroup];
260 [renderEncoder endEncoding]; 260 [renderEncoder endEncoding];
261 261
262 [commandBuffer presentDrawable:_view.currentDrawable]; 262 [commandBuffer presentDrawable:_view.currentDrawable];
263 } 263 }
264 264
265 // CPU work is completed, GPU work can be started. 265 // CPU work is completed, GPU work can be started.
266 [commandBuffer commit]; 266 [commandBuffer commit];
267 } 267 }
268 268
269 #pragma mark - RTCMTLRenderer 269 #pragma mark - RTCMTLRenderer
270 270
271 - (void)drawFrame:(RTCVideoFrame *)frame { 271 - (void)drawFrame:(RTCVideoFrame *)frame {
272 [self setupTexturesForFrame:frame];
273 @autoreleasepool { 272 @autoreleasepool {
274 [self render]; 273 if ([self setupTexturesForFrame:frame])
274 [self render];
275 } 275 }
276 } 276 }
277 277
278 - (void)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame { 278 - (BOOL)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame {
279 CVPixelBufferRef pixelBuffer = frame.nativeHandle; 279 CVPixelBufferRef pixelBuffer = frame.nativeHandle;
280 280
281 id<MTLTexture> lumaTexture = nil; 281 id<MTLTexture> lumaTexture = nil;
282 id<MTLTexture> chromaTexture = nil; 282 id<MTLTexture> chromaTexture = nil;
283 CVMetalTextureRef outTexture = nullptr; 283 CVMetalTextureRef outTexture = nullptr;
284 284
285 // Luma (y) texture. 285 // Luma (y) texture.
286 int lumaWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0); 286 int lumaWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0);
287 int lumaHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0); 287 int lumaHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0);
288 288
(...skipping 17 matching lines...) Expand all
306 lumaHeight / 2, indexPlane, &outTexture); 306 lumaHeight / 2, indexPlane, &outTexture);
307 if (result == kCVReturnSuccess) { 307 if (result == kCVReturnSuccess) {
308 chromaTexture = CVMetalTextureGetTexture(outTexture); 308 chromaTexture = CVMetalTextureGetTexture(outTexture);
309 } 309 }
310 CVBufferRelease(outTexture); 310 CVBufferRelease(outTexture);
311 311
312 if (lumaTexture != nil && chromaTexture != nil) { 312 if (lumaTexture != nil && chromaTexture != nil) {
313 _yTexture = lumaTexture; 313 _yTexture = lumaTexture;
314 _CrCbTexture = chromaTexture; 314 _CrCbTexture = chromaTexture;
315 _offset = offsetForRotation((webrtc::VideoRotation)frame.rotation); 315 _offset = offsetForRotation((webrtc::VideoRotation)frame.rotation);
316 return YES;
316 } 317 }
318 return NO;
317 } 319 }
318 320
319 @end 321 @end
OLDNEW
« no previous file with comments | « webrtc/examples/objc/AppRTCMobile/ios/ARDVideoCallView.m ('k') | webrtc/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698