Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/compositor/browser_compositor_ca_layer_tree_mac.h" | 5 #include "content/browser/compositor/browser_compositor_ca_layer_tree_mac.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "cc/output/software_frame_data.h" | |
| 9 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| 10 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
| 11 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 12 #include "content/browser/compositor/gpu_process_transport_factory.h" | |
| 13 #include "content/browser/compositor/io_surface_layer_mac.h" | 13 #include "content/browser/compositor/io_surface_layer_mac.h" |
| 14 #include "content/browser/compositor/software_layer_mac.h" | 14 #include "content/browser/compositor/software_layer_mac.h" |
| 15 #include "content/browser/renderer_host/dip_util.h" | 15 #include "content/browser/renderer_host/dip_util.h" |
| 16 #include "content/browser/renderer_host/render_widget_resize_helper.h" | |
| 17 #include "content/common/gpu/surface_handle_types_mac.h" | 16 #include "content/common/gpu/surface_handle_types_mac.h" |
| 18 #include "content/public/browser/context_factory.h" | 17 #include "content/public/browser/context_factory.h" |
| 19 #include "ui/base/cocoa/animation_utils.h" | 18 #include "ui/base/cocoa/animation_utils.h" |
| 20 #include "ui/gl/scoped_cgl.h" | 19 #include "ui/gl/scoped_cgl.h" |
| 21 | 20 |
| 22 namespace content { | 21 namespace content { |
| 23 namespace { | 22 namespace { |
| 24 | 23 |
| 25 typedef std::map<gfx::AcceleratedWidget,BrowserCompositorCALayerTreeMac*> | 24 typedef std::map<gfx::AcceleratedWidget,AcceleratedWidgetMac*> |
| 26 WidgetToInternalsMap; | 25 WidgetToHelperMap; |
| 27 base::LazyInstance<WidgetToInternalsMap> g_widget_to_internals_map; | 26 base::LazyInstance<WidgetToHelperMap> g_widget_to_helper_map; |
| 27 | |
| 28 AcceleratedWidgetMac* GetHelperFromAcceleratedWidget( | |
| 29 gfx::AcceleratedWidget widget) { | |
| 30 WidgetToHelperMap::const_iterator found = | |
| 31 g_widget_to_helper_map.Pointer()->find(widget); | |
| 32 // This can end up being accessed after the underlying widget has been | |
| 33 // destroyed, but while the ui::Compositor is still being destroyed. | |
| 34 // Return NULL in these cases. | |
| 35 if (found == g_widget_to_helper_map.Pointer()->end()) | |
| 36 return NULL; | |
| 37 return found->second; | |
| 38 } | |
| 28 | 39 |
| 29 } | 40 } |
| 30 | 41 |
| 31 //////////////////////////////////////////////////////////////////////////////// | 42 //////////////////////////////////////////////////////////////////////////////// |
| 32 // BrowserCompositorCALayerTreeMac | 43 // AcceleratedWidgetMac |
| 33 | 44 |
| 34 BrowserCompositorCALayerTreeMac::BrowserCompositorCALayerTreeMac() | 45 AcceleratedWidgetMac::AcceleratedWidgetMac() |
| 35 : view_(NULL), | 46 : client_(NULL), |
| 36 accelerated_output_surface_id_(0) { | 47 has_unacknowledged_accelerated_frame_(false) { |
| 37 // Disable the fade-in animation as the layers are added. | 48 // Disable the fade-in animation as the layers are added. |
| 38 ScopedCAActionDisabler disabler; | 49 ScopedCAActionDisabler disabler; |
| 39 | 50 |
| 40 // Add a flipped transparent layer as a child, so that we don't need to | 51 // Add a flipped transparent layer as a child, so that we don't need to |
| 41 // fiddle with the position of sub-layers -- they will always be at the | 52 // fiddle with the position of sub-layers -- they will always be at the |
| 42 // origin. | 53 // origin. |
| 43 flipped_layer_.reset([[CALayer alloc] init]); | 54 flipped_layer_.reset([[CALayer alloc] init]); |
| 44 [flipped_layer_ setGeometryFlipped:YES]; | 55 [flipped_layer_ setGeometryFlipped:YES]; |
| 45 [flipped_layer_ setAnchorPoint:CGPointMake(0, 0)]; | 56 [flipped_layer_ setAnchorPoint:CGPointMake(0, 0)]; |
| 46 [flipped_layer_ | 57 [flipped_layer_ |
| 47 setAutoresizingMask:kCALayerWidthSizable|kCALayerHeightSizable]; | 58 setAutoresizingMask:kCALayerWidthSizable|kCALayerHeightSizable]; |
| 48 | 59 |
| 49 // Use a sequence number as the accelerated widget handle that we can use | 60 // Use a sequence number as the accelerated widget handle that we can use |
| 50 // to look up the internals structure. | 61 // to look up the internals structure. |
| 51 static uintptr_t last_sequence_number = 0; | 62 static uintptr_t last_sequence_number = 0; |
| 52 last_sequence_number += 1; | 63 last_sequence_number += 1; |
| 53 native_widget_ = reinterpret_cast<gfx::AcceleratedWidget>( | 64 native_widget_ = reinterpret_cast<gfx::AcceleratedWidget>( |
| 54 last_sequence_number); | 65 last_sequence_number); |
| 55 g_widget_to_internals_map.Pointer()->insert( | 66 g_widget_to_helper_map.Pointer()->insert( |
| 56 std::make_pair(native_widget_, this)); | 67 std::make_pair(native_widget_, this)); |
| 57 | |
| 58 // Create a compositor to draw the contents of this view. | |
| 59 compositor_.reset(new ui::Compositor( | |
| 60 native_widget_, | |
| 61 content::GetContextFactory(), | |
| 62 RenderWidgetResizeHelper::Get()->task_runner())); | |
| 63 compositor_->SetVisible(false); | |
| 64 } | 68 } |
| 65 | 69 |
| 66 BrowserCompositorCALayerTreeMac::~BrowserCompositorCALayerTreeMac() { | 70 AcceleratedWidgetMac::~AcceleratedWidgetMac() { |
| 67 DCHECK(!view_); | 71 DCHECK(!client_); |
| 68 g_widget_to_internals_map.Pointer()->erase(native_widget_); | 72 g_widget_to_helper_map.Pointer()->erase(native_widget_); |
| 69 } | 73 } |
| 70 | 74 |
| 71 void BrowserCompositorCALayerTreeMac::SetView( | 75 void AcceleratedWidgetMac::SetClient( |
| 72 BrowserCompositorViewMac* view) { | 76 AcceleratedWidgetMacClient* client) { |
|
tapted
2014/11/20 05:38:53
nit: pull up
ccameron
2014/11/20 21:33:50
Done.
| |
| 73 // Disable the fade-in animation as the view is added. | 77 // Disable the fade-in animation as the client is added. |
| 74 ScopedCAActionDisabler disabler; | 78 ScopedCAActionDisabler disabler; |
| 75 | 79 |
| 76 DCHECK(view && !view_); | 80 DCHECK(client && !client_); |
| 77 view_ = view; | 81 client_ = client; |
| 78 compositor_->SetRootLayer(view_->ui_root_layer()); | |
| 79 | 82 |
| 80 CALayer* background_layer = [view_->native_view() layer]; | 83 CALayer* background_layer = |
| 84 [client_->AcceleratedWidgetClientGetNSView() layer]; | |
| 81 DCHECK(background_layer); | 85 DCHECK(background_layer); |
| 82 [flipped_layer_ setBounds:[background_layer bounds]]; | 86 [flipped_layer_ setBounds:[background_layer bounds]]; |
| 83 [background_layer addSublayer:flipped_layer_]; | 87 [background_layer addSublayer:flipped_layer_]; |
| 84 compositor_->SetVisible(true); | |
| 85 } | 88 } |
| 86 | 89 |
| 87 void BrowserCompositorCALayerTreeMac::ResetView() { | 90 void AcceleratedWidgetMac::ResetClient() { |
| 88 if (!view_) | 91 if (!client_) |
| 89 return; | 92 return; |
| 90 | 93 |
| 91 // Disable the fade-out animation as the view is removed. | 94 // Disable the fade-out animation as the client is removed. |
| 92 ScopedCAActionDisabler disabler; | 95 ScopedCAActionDisabler disabler; |
| 93 | 96 |
| 94 [flipped_layer_ removeFromSuperlayer]; | 97 [flipped_layer_ removeFromSuperlayer]; |
| 95 DestroyIOSurfaceLayer(io_surface_layer_); | 98 DestroyIOSurfaceLayer(io_surface_layer_); |
| 96 DestroyCAContextLayer(ca_context_layer_); | 99 DestroyCAContextLayer(ca_context_layer_); |
| 97 DestroySoftwareLayer(); | 100 DestroySoftwareLayer(); |
| 98 | 101 |
| 99 accelerated_output_surface_id_ = 0; | |
| 100 last_swap_size_dip_ = gfx::Size(); | 102 last_swap_size_dip_ = gfx::Size(); |
| 101 | 103 client_ = NULL; |
| 102 compositor_->SetVisible(false); | |
| 103 compositor_->SetScaleAndSize(1.0, gfx::Size(0, 0)); | |
| 104 compositor_->SetRootLayer(NULL); | |
| 105 view_ = NULL; | |
| 106 } | 104 } |
| 107 | 105 |
| 108 bool BrowserCompositorCALayerTreeMac::HasFrameOfSize( | 106 bool AcceleratedWidgetMac::HasFrameOfSize( |
| 109 const gfx::Size& dip_size) const { | 107 const gfx::Size& dip_size) const { |
| 110 return last_swap_size_dip_ == dip_size; | 108 return last_swap_size_dip_ == dip_size; |
| 111 } | 109 } |
| 112 | 110 |
| 113 int BrowserCompositorCALayerTreeMac::GetRendererID() const { | 111 int AcceleratedWidgetMac::GetRendererID() const { |
| 114 if (io_surface_layer_) | 112 if (io_surface_layer_) |
| 115 return [io_surface_layer_ rendererID]; | 113 return [io_surface_layer_ rendererID]; |
| 116 return 0; | 114 return 0; |
| 117 } | 115 } |
| 118 | 116 |
| 119 bool BrowserCompositorCALayerTreeMac::IsRendererThrottlingDisabled() const { | 117 bool AcceleratedWidgetMac::IsRendererThrottlingDisabled() const { |
| 120 if (view_) | 118 if (client_) |
| 121 return view_->client()->BrowserCompositorViewShouldAckImmediately(); | 119 return client_->AcceleratedWidgetShouldIgnoreBackpressure(); |
| 122 return false; | 120 return false; |
| 123 } | 121 } |
| 124 | 122 |
| 125 void BrowserCompositorCALayerTreeMac::BeginPumpingFrames() { | 123 void AcceleratedWidgetMac::BeginPumpingFrames() { |
| 126 [io_surface_layer_ beginPumpingFrames]; | 124 [io_surface_layer_ beginPumpingFrames]; |
| 127 } | 125 } |
| 128 | 126 |
| 129 void BrowserCompositorCALayerTreeMac::EndPumpingFrames() { | 127 void AcceleratedWidgetMac::EndPumpingFrames() { |
| 130 [io_surface_layer_ endPumpingFrames]; | 128 [io_surface_layer_ endPumpingFrames]; |
| 131 } | 129 } |
| 132 | 130 |
| 133 void BrowserCompositorCALayerTreeMac::GotAcceleratedFrame( | 131 void AcceleratedWidgetMac::GotAcceleratedFrame( |
| 134 uint64 surface_handle, int output_surface_id, | 132 uint64 surface_handle, |
| 135 const std::vector<ui::LatencyInfo>& latency_info, | 133 const std::vector<ui::LatencyInfo>& latency_info, |
| 136 gfx::Size pixel_size, float scale_factor) { | 134 gfx::Size pixel_size, float scale_factor, |
| 135 const base::Closure& drawn_callback) { | |
| 137 // Record the surface and latency info to use when acknowledging this frame. | 136 // Record the surface and latency info to use when acknowledging this frame. |
| 138 DCHECK(!accelerated_output_surface_id_); | 137 DCHECK(!has_unacknowledged_accelerated_frame_); |
| 139 accelerated_output_surface_id_ = output_surface_id; | 138 has_unacknowledged_accelerated_frame_ = true; |
| 139 accelerated_frame_drawn_callback_ = drawn_callback; | |
| 140 accelerated_latency_info_.insert(accelerated_latency_info_.end(), | 140 accelerated_latency_info_.insert(accelerated_latency_info_.end(), |
| 141 latency_info.begin(), latency_info.end()); | 141 latency_info.begin(), latency_info.end()); |
| 142 | 142 |
| 143 // If there is no view and therefore no superview to draw into, early-out. | 143 // If there is no client and therefore no superview to draw into, early-out. |
| 144 if (!view_) { | 144 if (!client_) { |
| 145 IOSurfaceLayerDidDrawFrame(); | 145 AcknowledgeAcceleratedFrame(); |
| 146 return; | 146 return; |
| 147 } | 147 } |
| 148 | 148 |
| 149 // Disable the fade-in or fade-out effect if we create or remove layers. | 149 // Disable the fade-in or fade-out effect if we create or remove layers. |
| 150 ScopedCAActionDisabler disabler; | 150 ScopedCAActionDisabler disabler; |
| 151 | 151 |
| 152 last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); | 152 last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); |
| 153 switch (GetSurfaceHandleType(surface_handle)) { | 153 switch (GetSurfaceHandleType(surface_handle)) { |
| 154 case kSurfaceHandleTypeIOSurface: { | 154 case kSurfaceHandleTypeIOSurface: { |
| 155 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(surface_handle); | 155 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle(surface_handle); |
| 156 GotAcceleratedIOSurfaceFrame(io_surface_id, pixel_size, scale_factor); | 156 GotAcceleratedIOSurfaceFrame(io_surface_id, pixel_size, scale_factor); |
| 157 break; | 157 break; |
| 158 } | 158 } |
| 159 case kSurfaceHandleTypeCAContext: { | 159 case kSurfaceHandleTypeCAContext: { |
| 160 CAContextID ca_context_id = CAContextIDFromSurfaceHandle(surface_handle); | 160 CAContextID ca_context_id = CAContextIDFromSurfaceHandle(surface_handle); |
| 161 GotAcceleratedCAContextFrame(ca_context_id, pixel_size, scale_factor); | 161 GotAcceleratedCAContextFrame(ca_context_id, pixel_size, scale_factor); |
| 162 break; | 162 break; |
| 163 } | 163 } |
| 164 default: | 164 default: |
| 165 LOG(ERROR) << "Unrecognized accelerated frame type."; | 165 LOG(ERROR) << "Unrecognized accelerated frame type."; |
| 166 return; | 166 return; |
| 167 } | 167 } |
| 168 } | 168 } |
| 169 | 169 |
| 170 void BrowserCompositorCALayerTreeMac::GotAcceleratedCAContextFrame( | 170 void AcceleratedWidgetMac::GotAcceleratedCAContextFrame( |
| 171 CAContextID ca_context_id, | 171 CAContextID ca_context_id, |
| 172 gfx::Size pixel_size, | 172 gfx::Size pixel_size, |
| 173 float scale_factor) { | 173 float scale_factor) { |
| 174 // In the layer is replaced, keep the old one around until after the new one | 174 // In the layer is replaced, keep the old one around until after the new one |
| 175 // is installed to avoid flashes. | 175 // is installed to avoid flashes. |
| 176 base::scoped_nsobject<CALayerHost> old_ca_context_layer = | 176 base::scoped_nsobject<CALayerHost> old_ca_context_layer = |
| 177 ca_context_layer_; | 177 ca_context_layer_; |
| 178 | 178 |
| 179 // Create the layer to host the layer exported by the GPU process with this | 179 // Create the layer to host the layer exported by the GPU process with this |
| 180 // particular CAContext ID. | 180 // particular CAContext ID. |
| 181 if ([ca_context_layer_ contextId] != ca_context_id) { | 181 if ([ca_context_layer_ contextId] != ca_context_id) { |
| 182 ca_context_layer_.reset([[CALayerHost alloc] init]); | 182 ca_context_layer_.reset([[CALayerHost alloc] init]); |
| 183 [ca_context_layer_ setContextId:ca_context_id]; | 183 [ca_context_layer_ setContextId:ca_context_id]; |
| 184 [ca_context_layer_ | 184 [ca_context_layer_ |
| 185 setAutoresizingMask:kCALayerMaxXMargin|kCALayerMaxYMargin]; | 185 setAutoresizingMask:kCALayerMaxXMargin|kCALayerMaxYMargin]; |
| 186 [flipped_layer_ addSublayer:ca_context_layer_]; | 186 [flipped_layer_ addSublayer:ca_context_layer_]; |
| 187 } | 187 } |
| 188 | 188 |
| 189 // Acknowledge the frame to unblock the compositor immediately (the GPU | 189 // Acknowledge the frame to unblock the compositor immediately (the GPU |
| 190 // process will do any required throttling). | 190 // process will do any required throttling). |
| 191 IOSurfaceLayerDidDrawFrame(); | 191 AcknowledgeAcceleratedFrame(); |
| 192 | 192 |
| 193 // If this replacing a same-type layer, remove it now that the new layer is | 193 // If this replacing a same-type layer, remove it now that the new layer is |
| 194 // in the hierarchy. | 194 // in the hierarchy. |
| 195 if (old_ca_context_layer != ca_context_layer_) | 195 if (old_ca_context_layer != ca_context_layer_) |
| 196 DestroyCAContextLayer(old_ca_context_layer); | 196 DestroyCAContextLayer(old_ca_context_layer); |
| 197 | 197 |
| 198 // Remove any different-type layers that this is replacing. | 198 // Remove any different-type layers that this is replacing. |
| 199 DestroyIOSurfaceLayer(io_surface_layer_); | 199 DestroyIOSurfaceLayer(io_surface_layer_); |
| 200 DestroySoftwareLayer(); | 200 DestroySoftwareLayer(); |
| 201 } | 201 } |
| 202 | 202 |
| 203 void BrowserCompositorCALayerTreeMac::GotAcceleratedIOSurfaceFrame( | 203 void AcceleratedWidgetMac::GotAcceleratedIOSurfaceFrame( |
| 204 IOSurfaceID io_surface_id, | 204 IOSurfaceID io_surface_id, |
| 205 gfx::Size pixel_size, | 205 gfx::Size pixel_size, |
| 206 float scale_factor) { | 206 float scale_factor) { |
| 207 // In the layer is replaced, keep the old one around until after the new one | 207 // In the layer is replaced, keep the old one around until after the new one |
| 208 // is installed to avoid flashes. | 208 // is installed to avoid flashes. |
| 209 base::scoped_nsobject<IOSurfaceLayer> old_io_surface_layer = | 209 base::scoped_nsobject<IOSurfaceLayer> old_io_surface_layer = |
| 210 io_surface_layer_; | 210 io_surface_layer_; |
| 211 | 211 |
| 212 // Create or re-create an IOSurface layer if needed. If there already exists | 212 // Create or re-create an IOSurface layer if needed. If there already exists |
| 213 // a layer but it has the wrong scale factor or it was poisoned, re-create the | 213 // a layer but it has the wrong scale factor or it was poisoned, re-create the |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 263 // If this replacing a same-type layer, remove it now that the new layer is | 263 // If this replacing a same-type layer, remove it now that the new layer is |
| 264 // in the hierarchy. | 264 // in the hierarchy. |
| 265 if (old_io_surface_layer != io_surface_layer_) | 265 if (old_io_surface_layer != io_surface_layer_) |
| 266 DestroyIOSurfaceLayer(old_io_surface_layer); | 266 DestroyIOSurfaceLayer(old_io_surface_layer); |
| 267 | 267 |
| 268 // Remove any different-type layers that this is replacing. | 268 // Remove any different-type layers that this is replacing. |
| 269 DestroyCAContextLayer(ca_context_layer_); | 269 DestroyCAContextLayer(ca_context_layer_); |
| 270 DestroySoftwareLayer(); | 270 DestroySoftwareLayer(); |
| 271 } | 271 } |
| 272 | 272 |
| 273 void BrowserCompositorCALayerTreeMac::GotSoftwareFrame( | 273 void AcceleratedWidgetMac::GotSoftwareFrame( |
| 274 cc::SoftwareFrameData* frame_data, | 274 cc::SoftwareFrameData* frame_data, |
| 275 float scale_factor, | 275 float scale_factor, |
| 276 SkCanvas* canvas) { | 276 SkCanvas* canvas) { |
| 277 if (!frame_data || !canvas || !view_) | 277 if (!frame_data || !canvas || !client_) |
| 278 return; | 278 return; |
| 279 | 279 |
| 280 // Disable the fade-in or fade-out effect if we create or remove layers. | 280 // Disable the fade-in or fade-out effect if we create or remove layers. |
| 281 ScopedCAActionDisabler disabler; | 281 ScopedCAActionDisabler disabler; |
| 282 | 282 |
| 283 // If there is not a layer for software frames, create one. | 283 // If there is not a layer for software frames, create one. |
| 284 if (!software_layer_) { | 284 if (!software_layer_) { |
| 285 software_layer_.reset([[SoftwareLayer alloc] init]); | 285 software_layer_.reset([[SoftwareLayer alloc] init]); |
| 286 [flipped_layer_ addSublayer:software_layer_]; | 286 [flipped_layer_ addSublayer:software_layer_]; |
| 287 } | 287 } |
| 288 | 288 |
| 289 // Set the software layer to draw the provided canvas. | 289 // Set the software layer to draw the provided canvas. |
| 290 SkImageInfo info; | 290 SkImageInfo info; |
| 291 size_t row_bytes; | 291 size_t row_bytes; |
| 292 const void* pixels = canvas->peekPixels(&info, &row_bytes); | 292 const void* pixels = canvas->peekPixels(&info, &row_bytes); |
| 293 gfx::Size pixel_size(info.fWidth, info.fHeight); | 293 gfx::Size pixel_size(info.fWidth, info.fHeight); |
| 294 [software_layer_ setContentsToData:pixels | 294 [software_layer_ setContentsToData:pixels |
| 295 withRowBytes:row_bytes | 295 withRowBytes:row_bytes |
| 296 withPixelSize:pixel_size | 296 withPixelSize:pixel_size |
| 297 withScaleFactor:scale_factor]; | 297 withScaleFactor:scale_factor]; |
| 298 last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); | 298 last_swap_size_dip_ = ConvertSizeToDIP(scale_factor, pixel_size); |
| 299 | 299 |
| 300 // Remove any different-type layers that this is replacing. | 300 // Remove any different-type layers that this is replacing. |
| 301 DestroyCAContextLayer(ca_context_layer_); | 301 DestroyCAContextLayer(ca_context_layer_); |
| 302 DestroyIOSurfaceLayer(io_surface_layer_); | 302 DestroyIOSurfaceLayer(io_surface_layer_); |
| 303 } | 303 } |
| 304 | 304 |
| 305 void BrowserCompositorCALayerTreeMac::DestroyCAContextLayer( | 305 void AcceleratedWidgetMac::DestroyCAContextLayer( |
| 306 base::scoped_nsobject<CALayerHost> ca_context_layer) { | 306 base::scoped_nsobject<CALayerHost> ca_context_layer) { |
| 307 if (!ca_context_layer) | 307 if (!ca_context_layer) |
| 308 return; | 308 return; |
| 309 [ca_context_layer removeFromSuperlayer]; | 309 [ca_context_layer removeFromSuperlayer]; |
| 310 if (ca_context_layer == ca_context_layer_) | 310 if (ca_context_layer == ca_context_layer_) |
| 311 ca_context_layer_.reset(); | 311 ca_context_layer_.reset(); |
| 312 } | 312 } |
| 313 | 313 |
| 314 void BrowserCompositorCALayerTreeMac::DestroyIOSurfaceLayer( | 314 void AcceleratedWidgetMac::DestroyIOSurfaceLayer( |
| 315 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer) { | 315 base::scoped_nsobject<IOSurfaceLayer> io_surface_layer) { |
| 316 if (!io_surface_layer) | 316 if (!io_surface_layer) |
| 317 return; | 317 return; |
| 318 [io_surface_layer resetClient]; | 318 [io_surface_layer resetClient]; |
| 319 [io_surface_layer removeFromSuperlayer]; | 319 [io_surface_layer removeFromSuperlayer]; |
| 320 if (io_surface_layer == io_surface_layer_) | 320 if (io_surface_layer == io_surface_layer_) |
| 321 io_surface_layer_.reset(); | 321 io_surface_layer_.reset(); |
| 322 } | 322 } |
| 323 | 323 |
| 324 void BrowserCompositorCALayerTreeMac::DestroySoftwareLayer() { | 324 void AcceleratedWidgetMac::DestroySoftwareLayer() { |
| 325 if (!software_layer_) | 325 if (!software_layer_) |
| 326 return; | 326 return; |
| 327 [software_layer_ removeFromSuperlayer]; | 327 [software_layer_ removeFromSuperlayer]; |
| 328 software_layer_.reset(); | 328 software_layer_.reset(); |
| 329 } | 329 } |
| 330 | 330 |
| 331 bool BrowserCompositorCALayerTreeMac::IOSurfaceLayerShouldAckImmediately() | 331 bool AcceleratedWidgetMac::IOSurfaceLayerShouldAckImmediately() |
| 332 const { | 332 const { |
| 333 // If there is no view then the accelerated layer is not in the hierarchy | 333 // If there is no client then the accelerated layer is not in the view |
| 334 // and will never draw. | 334 // hierarchy and will never draw. |
| 335 if (!view_) | 335 if (!client_) |
| 336 return true; | 336 return true; |
| 337 return view_->client()->BrowserCompositorViewShouldAckImmediately(); | 337 return client_->AcceleratedWidgetShouldIgnoreBackpressure(); |
| 338 } | 338 } |
| 339 | 339 |
| 340 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerDidDrawFrame() { | 340 void AcceleratedWidgetMac::IOSurfaceLayerDidDrawFrame() { |
| 341 if (accelerated_output_surface_id_) { | 341 AcknowledgeAcceleratedFrame(); |
| 342 content::ImageTransportFactory::GetInstance()->OnSurfaceDisplayed( | |
| 343 accelerated_output_surface_id_); | |
| 344 accelerated_output_surface_id_ = 0; | |
| 345 } | |
| 346 | |
| 347 if (view_) { | |
| 348 view_->client()->BrowserCompositorViewFrameSwapped( | |
| 349 accelerated_latency_info_); | |
| 350 } | |
| 351 | |
| 352 accelerated_latency_info_.clear(); | |
| 353 } | 342 } |
| 354 | 343 |
| 355 void BrowserCompositorCALayerTreeMac::IOSurfaceLayerHitError() { | 344 void AcceleratedWidgetMac::AcknowledgeAcceleratedFrame() { |
| 345 if (!has_unacknowledged_accelerated_frame_) | |
| 346 return; | |
| 347 accelerated_frame_drawn_callback_.Run(); | |
| 348 if (client_) | |
| 349 client_->AcceleratedWidgetSwapCompleted(accelerated_latency_info_); | |
| 350 accelerated_latency_info_.clear(); | |
| 351 has_unacknowledged_accelerated_frame_ = false; | |
| 352 } | |
| 353 | |
| 354 void AcceleratedWidgetMac::IOSurfaceLayerHitError() { | |
| 356 // Perform all acks that would have been done if the frame had succeeded, to | 355 // Perform all acks that would have been done if the frame had succeeded, to |
| 357 // un-block the compositor and renderer. | 356 // un-block the compositor and renderer. |
| 358 IOSurfaceLayerDidDrawFrame(); | 357 AcknowledgeAcceleratedFrame(); |
| 359 | 358 |
| 360 // Poison the context being used and request a mulligan. | 359 // Poison the context being used and request a mulligan. |
| 361 [io_surface_layer_ poisonContextAndSharegroup]; | 360 [io_surface_layer_ poisonContextAndSharegroup]; |
| 362 compositor_->ScheduleFullRedraw(); | 361 |
| 362 if (client_) | |
| 363 client_->AcceleratedWidgetHitError(); | |
| 363 } | 364 } |
| 364 | 365 |
| 365 // static | 366 void AcceleratedWidgetMacGotAcceleratedFrame( |
| 366 BrowserCompositorCALayerTreeMac* BrowserCompositorCALayerTreeMac:: | 367 gfx::AcceleratedWidget widget, uint64 surface_handle, |
| 367 FromAcceleratedWidget(gfx::AcceleratedWidget widget) { | |
| 368 WidgetToInternalsMap::const_iterator found = | |
| 369 g_widget_to_internals_map.Pointer()->find(widget); | |
| 370 // This can end up being accessed after the underlying widget has been | |
| 371 // destroyed, but while the ui::Compositor is still being destroyed. | |
| 372 // Return NULL in these cases. | |
| 373 if (found == g_widget_to_internals_map.Pointer()->end()) | |
| 374 return NULL; | |
| 375 return found->second; | |
| 376 } | |
| 377 | |
| 378 void BrowserCompositorCALayerTreeMacGotAcceleratedFrame( | |
| 379 gfx::AcceleratedWidget widget, | |
| 380 uint64 surface_handle, int surface_id, | |
| 381 const std::vector<ui::LatencyInfo>& latency_info, | 368 const std::vector<ui::LatencyInfo>& latency_info, |
| 382 gfx::Size pixel_size, float scale_factor, | 369 gfx::Size pixel_size, float scale_factor, |
| 370 const base::Closure& drawn_callback, | |
| 383 bool* disable_throttling, int* renderer_id) { | 371 bool* disable_throttling, int* renderer_id) { |
| 384 BrowserCompositorCALayerTreeMac* ca_layer_tree = | 372 AcceleratedWidgetMac* accelerated_widget_mac = |
| 385 BrowserCompositorCALayerTreeMac::FromAcceleratedWidget(widget); | 373 GetHelperFromAcceleratedWidget(widget); |
| 386 if (ca_layer_tree) { | 374 if (accelerated_widget_mac) { |
| 387 ca_layer_tree->GotAcceleratedFrame( | 375 accelerated_widget_mac->GotAcceleratedFrame( |
| 388 surface_handle, surface_id, latency_info, pixel_size, scale_factor); | 376 surface_handle, latency_info, pixel_size, scale_factor, drawn_callback); |
| 389 *disable_throttling = ca_layer_tree->IsRendererThrottlingDisabled(); | 377 *disable_throttling = |
| 390 *renderer_id = ca_layer_tree->GetRendererID(); | 378 accelerated_widget_mac->IsRendererThrottlingDisabled(); |
| 379 *renderer_id = accelerated_widget_mac->GetRendererID(); | |
| 391 } else { | 380 } else { |
| 392 *disable_throttling = false; | 381 *disable_throttling = false; |
| 393 *renderer_id = 0; | 382 *renderer_id = 0; |
| 394 } | 383 } |
| 395 } | 384 } |
| 396 | 385 |
| 397 void BrowserCompositorCALayerTreeMacGotSoftwareFrame( | 386 void AcceleratedWidgetMacGotSoftwareFrame( |
| 398 gfx::AcceleratedWidget widget, | 387 gfx::AcceleratedWidget widget, |
| 399 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas) { | 388 cc::SoftwareFrameData* frame_data, float scale_factor, SkCanvas* canvas) { |
| 400 BrowserCompositorCALayerTreeMac* ca_layer_tree = | 389 AcceleratedWidgetMac* accelerated_widget_mac = |
| 401 BrowserCompositorCALayerTreeMac::FromAcceleratedWidget(widget); | 390 GetHelperFromAcceleratedWidget(widget); |
| 402 if (ca_layer_tree) | 391 if (accelerated_widget_mac) |
| 403 ca_layer_tree->GotSoftwareFrame(frame_data, scale_factor, canvas); | 392 accelerated_widget_mac->GotSoftwareFrame(frame_data, scale_factor, canvas); |
| 404 } | 393 } |
| 405 | 394 |
| 406 } // namespace content | 395 } // namespace content |
| OLD | NEW |