| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "ui/accelerated_widget_mac/ca_layer_tree_coordinator.h" | 5 #include "ui/accelerated_widget_mac/ca_layer_tree_coordinator.h" |
| 6 | 6 |
| 7 #include <AVFoundation/AVFoundation.h> | 7 #include <AVFoundation/AVFoundation.h> |
| 8 | 8 |
| 9 #include "base/mac/mac_util.h" | 9 #include "base/mac/mac_util.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| 11 #include "ui/base/cocoa/animation_utils.h" | 11 #include "ui/base/cocoa/animation_utils.h" |
| 12 | 12 |
| 13 namespace ui { | 13 namespace ui { |
| 14 | 14 |
| 15 namespace { |
| 16 const uint64_t kFramesBeforeFlushingLowPowerLayer = 15; |
| 17 } |
| 18 |
| 15 CALayerTreeCoordinator::CALayerTreeCoordinator( | 19 CALayerTreeCoordinator::CALayerTreeCoordinator( |
| 16 bool allow_remote_layers, | 20 bool allow_remote_layers, |
| 17 bool allow_av_sample_buffer_display_layer) | 21 bool allow_av_sample_buffer_display_layer) |
| 18 : allow_remote_layers_(allow_remote_layers), | 22 : allow_remote_layers_(allow_remote_layers), |
| 19 allow_av_sample_buffer_display_layer_( | 23 allow_av_sample_buffer_display_layer_( |
| 20 allow_av_sample_buffer_display_layer) { | 24 allow_av_sample_buffer_display_layer) { |
| 21 if (allow_remote_layers_) { | 25 if (allow_remote_layers_) { |
| 22 root_ca_layer_.reset([[CALayer alloc] init]); | 26 root_ca_layer_.reset([[CALayer alloc] init]); |
| 23 [root_ca_layer_ setGeometryFlipped:YES]; | 27 [root_ca_layer_ setGeometryFlipped:YES]; |
| 24 [root_ca_layer_ setOpaque:YES]; | 28 [root_ca_layer_ setOpaque:YES]; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 scale_factor_, pixel_damage_rect); | 93 scale_factor_, pixel_damage_rect); |
| 90 current_gl_renderer_layer_tree_.swap(pending_gl_renderer_layer_tree_); | 94 current_gl_renderer_layer_tree_.swap(pending_gl_renderer_layer_tree_); |
| 91 current_ca_renderer_layer_tree_.reset(); | 95 current_ca_renderer_layer_tree_.reset(); |
| 92 } else { | 96 } else { |
| 93 TRACE_EVENT0("gpu", "Blank frame: No overlays or CALayers"); | 97 TRACE_EVENT0("gpu", "Blank frame: No overlays or CALayers"); |
| 94 [root_ca_layer_ setSublayers:nil]; | 98 [root_ca_layer_ setSublayers:nil]; |
| 95 current_gl_renderer_layer_tree_.reset(); | 99 current_gl_renderer_layer_tree_.reset(); |
| 96 current_ca_renderer_layer_tree_.reset(); | 100 current_ca_renderer_layer_tree_.reset(); |
| 97 } | 101 } |
| 98 | 102 |
| 99 // TODO(ccameron): It may be necessary to leave the last image up for a few | 103 // It is necessary to leave the last image up for a few extra frames to allow |
| 100 // extra frames to allow a smooth switch between the normal and low-power | 104 // a smooth switch between the normal and low-power NSWindows. |
| 101 // NSWindows. | 105 if (*fullscreen_low_power_layer_valid) |
| 102 if (current_fullscreen_low_power_layer_valid_ && | 106 frames_since_low_power_layer_was_valid_ = 0; |
| 103 !*fullscreen_low_power_layer_valid) { | 107 else |
| 108 frames_since_low_power_layer_was_valid_ += 1; |
| 109 if (frames_since_low_power_layer_was_valid_ == |
| 110 kFramesBeforeFlushingLowPowerLayer) |
| 104 [fullscreen_low_power_layer_ flushAndRemoveImage]; | 111 [fullscreen_low_power_layer_ flushAndRemoveImage]; |
| 105 } | |
| 106 current_fullscreen_low_power_layer_valid_ = *fullscreen_low_power_layer_valid; | |
| 107 | 112 |
| 108 // Reset all state for the next frame. | 113 // Reset all state for the next frame. |
| 109 pending_ca_renderer_layer_tree_.reset(); | 114 pending_ca_renderer_layer_tree_.reset(); |
| 110 pending_gl_renderer_layer_tree_.reset(); | 115 pending_gl_renderer_layer_tree_.reset(); |
| 111 } | 116 } |
| 112 | 117 |
| 113 CALayer* CALayerTreeCoordinator::GetCALayerForDisplay() const { | 118 CALayer* CALayerTreeCoordinator::GetCALayerForDisplay() const { |
| 114 DCHECK(allow_remote_layers_); | 119 DCHECK(allow_remote_layers_); |
| 115 return root_ca_layer_.get(); | 120 return root_ca_layer_.get(); |
| 116 } | 121 } |
| 117 | 122 |
| 118 CALayer* CALayerTreeCoordinator::GetFullscreenLowPowerLayerForDisplay() const { | 123 CALayer* CALayerTreeCoordinator::GetFullscreenLowPowerLayerForDisplay() const { |
| 119 return fullscreen_low_power_layer_.get(); | 124 return fullscreen_low_power_layer_.get(); |
| 120 } | 125 } |
| 121 | 126 |
| 122 IOSurfaceRef CALayerTreeCoordinator::GetIOSurfaceForDisplay() { | 127 IOSurfaceRef CALayerTreeCoordinator::GetIOSurfaceForDisplay() { |
| 123 DCHECK(!allow_remote_layers_); | 128 DCHECK(!allow_remote_layers_); |
| 124 if (!current_gl_renderer_layer_tree_) | 129 if (!current_gl_renderer_layer_tree_) |
| 125 return nullptr; | 130 return nullptr; |
| 126 return current_gl_renderer_layer_tree_->RootLayerIOSurface(); | 131 return current_gl_renderer_layer_tree_->RootLayerIOSurface(); |
| 127 } | 132 } |
| 128 | 133 |
| 129 } // namespace ui | 134 } // namespace ui |
| OLD | NEW |