OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" |
6 | 6 |
7 #import <objc/runtime.h> | 7 #import <objc/runtime.h> |
8 #include <QuartzCore/QuartzCore.h> | 8 #include <QuartzCore/QuartzCore.h> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 1292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1303 NSWindow* window = [cocoa_view_ window]; | 1303 NSWindow* window = [cocoa_view_ window]; |
1304 if (window_number() <= 0) { | 1304 if (window_number() <= 0) { |
1305 // There is no window to present so capturing during present won't work. | 1305 // There is no window to present so capturing during present won't work. |
1306 // We check if frame subscriber wants this frame and capture manually. | 1306 // We check if frame subscriber wants this frame and capture manually. |
1307 if (compositing_iosurface_ && frame_subscriber_) { | 1307 if (compositing_iosurface_ && frame_subscriber_) { |
1308 const base::TimeTicks present_time = base::TimeTicks::Now(); | 1308 const base::TimeTicks present_time = base::TimeTicks::Now(); |
1309 scoped_refptr<media::VideoFrame> frame; | 1309 scoped_refptr<media::VideoFrame> frame; |
1310 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 1310 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
1311 if (frame_subscriber_->ShouldCaptureFrame(present_time, | 1311 if (frame_subscriber_->ShouldCaptureFrame(present_time, |
1312 &frame, &callback)) { | 1312 &frame, &callback)) { |
1313 CGLSetCurrentContext(compositing_iosurface_context_->cgl_context()); | 1313 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
| 1314 compositing_iosurface_context_->cgl_context()); |
1314 compositing_iosurface_->SetIOSurfaceWithContextCurrent( | 1315 compositing_iosurface_->SetIOSurfaceWithContextCurrent( |
1315 compositing_iosurface_context_, surface_handle, size, | 1316 compositing_iosurface_context_, surface_handle, size, |
1316 surface_scale_factor); | 1317 surface_scale_factor); |
1317 compositing_iosurface_->CopyToVideoFrame( | 1318 compositing_iosurface_->CopyToVideoFrame( |
1318 gfx::Rect(size), frame, | 1319 gfx::Rect(size), frame, |
1319 base::Bind(callback, present_time)); | 1320 base::Bind(callback, present_time)); |
1320 return; | 1321 return; |
1321 } | 1322 } |
1322 } | 1323 } |
1323 | 1324 |
(...skipping 21 matching lines...) Expand all Loading... |
1345 // Ensure compositing_iosurface_ and compositing_iosurface_context_ be | 1346 // Ensure compositing_iosurface_ and compositing_iosurface_context_ be |
1346 // allocated. | 1347 // allocated. |
1347 if (!CreateCompositedIOSurface()) { | 1348 if (!CreateCompositedIOSurface()) { |
1348 LOG(ERROR) << "Failed to create CompositingIOSurface"; | 1349 LOG(ERROR) << "Failed to create CompositingIOSurface"; |
1349 GotAcceleratedCompositingError(); | 1350 GotAcceleratedCompositingError(); |
1350 return; | 1351 return; |
1351 } | 1352 } |
1352 | 1353 |
1353 // Make the context current and update the IOSurface with the handle | 1354 // Make the context current and update the IOSurface with the handle |
1354 // passed in by the swap command. | 1355 // passed in by the swap command. |
1355 CGLSetCurrentContext(compositing_iosurface_context_->cgl_context()); | 1356 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
| 1357 compositing_iosurface_context_->cgl_context()); |
1356 if (!compositing_iosurface_->SetIOSurfaceWithContextCurrent( | 1358 if (!compositing_iosurface_->SetIOSurfaceWithContextCurrent( |
1357 compositing_iosurface_context_, surface_handle, size, | 1359 compositing_iosurface_context_, surface_handle, size, |
1358 surface_scale_factor)) { | 1360 surface_scale_factor)) { |
1359 LOG(ERROR) << "Failed SetIOSurface on CompositingIOSurfaceMac"; | 1361 LOG(ERROR) << "Failed SetIOSurface on CompositingIOSurfaceMac"; |
1360 GotAcceleratedCompositingError(); | 1362 GotAcceleratedCompositingError(); |
1361 return; | 1363 return; |
1362 } | 1364 } |
1363 | 1365 |
1364 // Grab video frames now that the IOSurface has been set up. Note that this | 1366 // Grab video frames now that the IOSurface has been set up. Note that this |
1365 // will be done in an offscreen context, so it is necessary to re-set the | 1367 // will be done in an offscreen context, so it is necessary to re-set the |
1366 // current context afterward. | 1368 // current context afterward. |
1367 if (frame_subscriber_) { | 1369 if (frame_subscriber_) { |
1368 const base::TimeTicks present_time = base::TimeTicks::Now(); | 1370 const base::TimeTicks present_time = base::TimeTicks::Now(); |
1369 scoped_refptr<media::VideoFrame> frame; | 1371 scoped_refptr<media::VideoFrame> frame; |
1370 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 1372 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
1371 if (frame_subscriber_->ShouldCaptureFrame(present_time, | 1373 if (frame_subscriber_->ShouldCaptureFrame(present_time, |
1372 &frame, &callback)) { | 1374 &frame, &callback)) { |
1373 // Flush the context that updated the IOSurface, to ensure that the | 1375 // Flush the context that updated the IOSurface, to ensure that the |
1374 // context that does the copy picks up the correct version. | 1376 // context that does the copy picks up the correct version. |
1375 glFlush(); | 1377 glFlush(); |
1376 compositing_iosurface_->CopyToVideoFrame( | 1378 compositing_iosurface_->CopyToVideoFrame( |
1377 gfx::Rect(size), frame, | 1379 gfx::Rect(size), frame, |
1378 base::Bind(callback, present_time)); | 1380 base::Bind(callback, present_time)); |
1379 CGLSetCurrentContext(compositing_iosurface_context_->cgl_context()); | 1381 DCHECK_EQ(CGLGetCurrentContext(), |
| 1382 compositing_iosurface_context_->cgl_context()); |
1380 } | 1383 } |
1381 } | 1384 } |
1382 | 1385 |
1383 // Create the layer for the composited content only after the IOSurface has | 1386 // Create the layer for the composited content only after the IOSurface has |
1384 // been initialized. | 1387 // been initialized. |
1385 if (!CreateCompositedIOSurfaceLayer()) { | 1388 if (!CreateCompositedIOSurfaceLayer()) { |
1386 LOG(ERROR) << "Failed to create CompositingIOSurface layer"; | 1389 LOG(ERROR) << "Failed to create CompositingIOSurface layer"; |
1387 GotAcceleratedCompositingError(); | 1390 GotAcceleratedCompositingError(); |
1388 return; | 1391 return; |
1389 } | 1392 } |
(...skipping 1514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2904 "h", damagedRect.height()); | 2907 "h", damagedRect.height()); |
2905 // NSRectFill is extremely slow (15ms for a window on a fast MacPro), so | 2908 // NSRectFill is extremely slow (15ms for a window on a fast MacPro), so |
2906 // this is only done when it's a real invalidation from window damage (not | 2909 // this is only done when it's a real invalidation from window damage (not |
2907 // when a BuffersSwapped was received). Note that even a 1x1 NSRectFill | 2910 // when a BuffersSwapped was received). Note that even a 1x1 NSRectFill |
2908 // can take many milliseconds sometimes (!) so this is skipped completely | 2911 // can take many milliseconds sometimes (!) so this is skipped completely |
2909 // for drawRects that are triggered by BuffersSwapped messages. | 2912 // for drawRects that are triggered by BuffersSwapped messages. |
2910 [[NSColor clearColor] set]; | 2913 [[NSColor clearColor] set]; |
2911 NSRectFill(dirtyRect); | 2914 NSRectFill(dirtyRect); |
2912 } | 2915 } |
2913 | 2916 |
2914 CGLSetCurrentContext( | 2917 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
2915 renderWidgetHostView_->compositing_iosurface_context_->cgl_context()); | 2918 renderWidgetHostView_->compositing_iosurface_context_->cgl_context()); |
2916 if (renderWidgetHostView_->DrawIOSurfaceWithoutCoreAnimation()) | 2919 if (renderWidgetHostView_->DrawIOSurfaceWithoutCoreAnimation()) |
2917 return; | 2920 return; |
2918 | 2921 |
2919 // On error, fall back to software and fall through to the non-accelerated | 2922 // On error, fall back to software and fall through to the non-accelerated |
2920 // drawing path. | 2923 // drawing path. |
2921 renderWidgetHostView_->GotAcceleratedCompositingError(); | 2924 renderWidgetHostView_->GotAcceleratedCompositingError(); |
2922 } | 2925 } |
2923 | 2926 |
2924 CGContextRef context = static_cast<CGContextRef>( | 2927 CGContextRef context = static_cast<CGContextRef>( |
(...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4090 return YES; | 4093 return YES; |
4091 } | 4094 } |
4092 | 4095 |
4093 - (BOOL)isOpaque { | 4096 - (BOOL)isOpaque { |
4094 if (renderWidgetHostView_->use_core_animation_) | 4097 if (renderWidgetHostView_->use_core_animation_) |
4095 return YES; | 4098 return YES; |
4096 return [super isOpaque]; | 4099 return [super isOpaque]; |
4097 } | 4100 } |
4098 | 4101 |
4099 @end | 4102 @end |
OLD | NEW |