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 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1356 | 1356 |
1357 // Ensure compositing_iosurface_ and compositing_iosurface_context_ be | 1357 // Ensure compositing_iosurface_ and compositing_iosurface_context_ be |
1358 // allocated. | 1358 // allocated. |
1359 if (!EnsureCompositedIOSurface()) { | 1359 if (!EnsureCompositedIOSurface()) { |
1360 LOG(ERROR) << "Failed EnsureCompositingIOSurface"; | 1360 LOG(ERROR) << "Failed EnsureCompositingIOSurface"; |
1361 return; | 1361 return; |
1362 } | 1362 } |
1363 | 1363 |
1364 // Make the context current and update the IOSurface with the handle | 1364 // Make the context current and update the IOSurface with the handle |
1365 // passed in by the swap command. | 1365 // passed in by the swap command. |
1366 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( | 1366 { |
1367 compositing_iosurface_context_->cgl_context()); | 1367 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
1368 if (!compositing_iosurface_->SetIOSurfaceWithContextCurrent( | 1368 compositing_iosurface_context_->cgl_context()); |
1369 compositing_iosurface_context_, surface_handle, size, | 1369 if (!compositing_iosurface_->SetIOSurfaceWithContextCurrent( |
1370 surface_scale_factor)) { | 1370 compositing_iosurface_context_, surface_handle, size, |
1371 LOG(ERROR) << "Failed SetIOSurface on CompositingIOSurfaceMac"; | 1371 surface_scale_factor)) { |
1372 return; | 1372 LOG(ERROR) << "Failed SetIOSurface on CompositingIOSurfaceMac"; |
| 1373 return; |
| 1374 } |
1373 } | 1375 } |
1374 | 1376 |
1375 // Grab video frames now that the IOSurface has been set up. Note that this | 1377 // Grab video frames now that the IOSurface has been set up. Note that this |
1376 // will be done in an offscreen context, so it is necessary to re-set the | 1378 // will be done in an offscreen context, so it is necessary to re-set the |
1377 // current context afterward. | 1379 // current context afterward. |
1378 bool frame_was_captured = false; | 1380 bool frame_was_captured = false; |
1379 if (frame_subscriber_) { | 1381 if (frame_subscriber_) { |
1380 const base::TimeTicks present_time = base::TimeTicks::Now(); | 1382 const base::TimeTicks present_time = base::TimeTicks::Now(); |
1381 scoped_refptr<media::VideoFrame> frame; | 1383 scoped_refptr<media::VideoFrame> frame; |
1382 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 1384 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
1383 if (frame_subscriber_->ShouldCaptureFrame(present_time, | 1385 if (frame_subscriber_->ShouldCaptureFrame(present_time, |
1384 &frame, &callback)) { | 1386 &frame, &callback)) { |
1385 // Flush the context that updated the IOSurface, to ensure that the | 1387 // Flush the context that updated the IOSurface, to ensure that the |
1386 // context that does the copy picks up the correct version. | 1388 // context that does the copy picks up the correct version. |
1387 glFlush(); | 1389 { |
| 1390 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
| 1391 compositing_iosurface_context_->cgl_context()); |
| 1392 glFlush(); |
| 1393 } |
1388 compositing_iosurface_->CopyToVideoFrame( | 1394 compositing_iosurface_->CopyToVideoFrame( |
1389 gfx::Rect(size), frame, | 1395 gfx::Rect(size), frame, |
1390 base::Bind(callback, present_time)); | 1396 base::Bind(callback, present_time)); |
1391 DCHECK_EQ(CGLGetCurrentContext(), | |
1392 compositing_iosurface_context_->cgl_context()); | |
1393 frame_was_captured = true; | 1397 frame_was_captured = true; |
1394 } | 1398 } |
1395 } | 1399 } |
1396 | 1400 |
1397 // At this point the surface, its context, and its layer have been set up, so | 1401 // At this point the surface, its context, and its layer have been set up, so |
1398 // don't generate an error (one may be generated when drawing). | 1402 // don't generate an error (one may be generated when drawing). |
1399 ignore_result(scoped_error.Release()); | 1403 ignore_result(scoped_error.Release()); |
1400 | 1404 |
1401 GotAcceleratedFrame(); | 1405 GotAcceleratedFrame(); |
1402 | 1406 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1440 } | 1444 } |
1441 | 1445 |
1442 // If we reach here, then the frame will be displayed by a future draw | 1446 // If we reach here, then the frame will be displayed by a future draw |
1443 // call, so don't make the callback. | 1447 // call, so don't make the callback. |
1444 ignore_result(scoped_ack.Release()); | 1448 ignore_result(scoped_ack.Release()); |
1445 if (use_core_animation_) { | 1449 if (use_core_animation_) { |
1446 DCHECK(compositing_iosurface_layer_); | 1450 DCHECK(compositing_iosurface_layer_); |
1447 compositing_iosurface_layer_async_timer_.Reset(); | 1451 compositing_iosurface_layer_async_timer_.Reset(); |
1448 [compositing_iosurface_layer_ gotNewFrame]; | 1452 [compositing_iosurface_layer_ gotNewFrame]; |
1449 } else { | 1453 } else { |
| 1454 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
| 1455 compositing_iosurface_context_->cgl_context()); |
1450 DrawIOSurfaceWithoutCoreAnimation(); | 1456 DrawIOSurfaceWithoutCoreAnimation(); |
1451 } | 1457 } |
1452 | 1458 |
1453 // The IOSurface's size may have changed, so re-layout the layers to take | 1459 // The IOSurface's size may have changed, so re-layout the layers to take |
1454 // this into account. This may force an immediate draw. | 1460 // this into account. This may force an immediate draw. |
1455 LayoutLayers(); | 1461 LayoutLayers(); |
1456 } | 1462 } |
1457 | 1463 |
1458 void RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() { | 1464 void RenderWidgetHostViewMac::DrawIOSurfaceWithoutCoreAnimation() { |
1459 CHECK(!use_core_animation_); | 1465 CHECK(!use_core_animation_); |
(...skipping 2827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4287 } | 4293 } |
4288 | 4294 |
4289 - (void)disableRendering { | 4295 - (void)disableRendering { |
4290 // Disable the fade-out animation as the layer is removed. | 4296 // Disable the fade-out animation as the layer is removed. |
4291 ScopedCAActionDisabler disabler; | 4297 ScopedCAActionDisabler disabler; |
4292 [self removeFromSuperlayer]; | 4298 [self removeFromSuperlayer]; |
4293 renderWidgetHostView_ = nil; | 4299 renderWidgetHostView_ = nil; |
4294 } | 4300 } |
4295 | 4301 |
4296 @end // implementation SoftwareLayer | 4302 @end // implementation SoftwareLayer |
OLD | NEW |