| 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 "cc/surfaces/display.h" | 5 #include "cc/surfaces/display.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 texture_mailbox_deleter_(std::move(texture_mailbox_deleter)) { | 46 texture_mailbox_deleter_(std::move(texture_mailbox_deleter)) { |
| 47 DCHECK(output_surface_); | 47 DCHECK(output_surface_); |
| 48 DCHECK_EQ(!scheduler_, !begin_frame_source_); | 48 DCHECK_EQ(!scheduler_, !begin_frame_source_); |
| 49 if (scheduler_) | 49 if (scheduler_) |
| 50 scheduler_->SetClient(this); | 50 scheduler_->SetClient(this); |
| 51 } | 51 } |
| 52 | 52 |
| 53 Display::~Display() { | 53 Display::~Display() { |
| 54 // Only do this if Initialize() happened. | 54 // Only do this if Initialize() happened. |
| 55 if (client_) { | 55 if (client_) { |
| 56 if (auto* context = output_surface_->context_provider()) |
| 57 context->SetLostContextCallback(base::Closure()); |
| 56 if (begin_frame_source_) | 58 if (begin_frame_source_) |
| 57 surface_manager_->UnregisterBeginFrameSource(begin_frame_source_.get()); | 59 surface_manager_->UnregisterBeginFrameSource(begin_frame_source_.get()); |
| 58 surface_manager_->RemoveObserver(this); | 60 surface_manager_->RemoveObserver(this); |
| 59 } | 61 } |
| 60 if (aggregator_) { | 62 if (aggregator_) { |
| 61 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { | 63 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
| 62 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); | 64 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); |
| 63 if (surface) | 65 if (surface) |
| 64 surface->RunDrawCallbacks(); | 66 surface->RunDrawCallbacks(); |
| 65 } | 67 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 77 | 79 |
| 78 surface_manager_->AddObserver(this); | 80 surface_manager_->AddObserver(this); |
| 79 | 81 |
| 80 // This must be done in Initialize() so that the caller can delay this until | 82 // This must be done in Initialize() so that the caller can delay this until |
| 81 // they are ready to receive a BeginFrameSource. | 83 // they are ready to receive a BeginFrameSource. |
| 82 if (begin_frame_source_) { | 84 if (begin_frame_source_) { |
| 83 surface_manager_->RegisterBeginFrameSource(begin_frame_source_.get(), | 85 surface_manager_->RegisterBeginFrameSource(begin_frame_source_.get(), |
| 84 frame_sink_id_); | 86 frame_sink_id_); |
| 85 } | 87 } |
| 86 | 88 |
| 87 bool ok = output_surface_->BindToClient(this); | 89 output_surface_->BindToClient(this); |
| 88 // The context given to the Display's OutputSurface should already be | |
| 89 // initialized, so Bind can not fail. | |
| 90 DCHECK(ok); | |
| 91 InitializeRenderer(); | 90 InitializeRenderer(); |
| 91 |
| 92 if (auto* context = output_surface_->context_provider()) { |
| 93 // This depends on assumptions that Display::Initialize will happen |
| 94 // on the same callstack as the ContextProvider being created/initialized |
| 95 // or else it could miss a callback before setting this. |
| 96 context->SetLostContextCallback(base::Bind( |
| 97 &Display::DidLoseContextProvider, |
| 98 // Unretained is safe since the callback is unset in this class' |
| 99 // destructor and is never posted. |
| 100 base::Unretained(this))); |
| 101 } |
| 92 } | 102 } |
| 93 | 103 |
| 94 void Display::SetSurfaceId(const SurfaceId& id, float device_scale_factor) { | 104 void Display::SetSurfaceId(const SurfaceId& id, float device_scale_factor) { |
| 95 DCHECK(id.frame_sink_id() == frame_sink_id_); | 105 DCHECK(id.frame_sink_id() == frame_sink_id_); |
| 96 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) | 106 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) |
| 97 return; | 107 return; |
| 98 | 108 |
| 99 TRACE_EVENT0("cc", "Display::SetSurfaceId"); | 109 TRACE_EVENT0("cc", "Display::SetSurfaceId"); |
| 100 current_surface_id_ = id; | 110 current_surface_id_ = id; |
| 101 device_scale_factor_ = device_scale_factor; | 111 device_scale_factor_ = device_scale_factor; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 | 205 |
| 196 // TODO(jbauman): Outputting an incomplete quad list doesn't work when using | 206 // TODO(jbauman): Outputting an incomplete quad list doesn't work when using |
| 197 // overlays. | 207 // overlays. |
| 198 bool output_partial_list = renderer_->use_partial_swap() && | 208 bool output_partial_list = renderer_->use_partial_swap() && |
| 199 !output_surface_->GetOverlayCandidateValidator(); | 209 !output_surface_->GetOverlayCandidateValidator(); |
| 200 aggregator_.reset(new SurfaceAggregator( | 210 aggregator_.reset(new SurfaceAggregator( |
| 201 surface_manager_, resource_provider_.get(), output_partial_list)); | 211 surface_manager_, resource_provider_.get(), output_partial_list)); |
| 202 aggregator_->set_output_is_secure(output_is_secure_); | 212 aggregator_->set_output_is_secure(output_is_secure_); |
| 203 } | 213 } |
| 204 | 214 |
| 205 void Display::DidLoseOutputSurface() { | |
| 206 if (scheduler_) | |
| 207 scheduler_->OutputSurfaceLost(); | |
| 208 // WARNING: The client may delete the Display in this method call. Do not | |
| 209 // make any additional references to members after this call. | |
| 210 client_->DisplayOutputSurfaceLost(); | |
| 211 } | |
| 212 | |
| 213 void Display::UpdateRootSurfaceResourcesLocked() { | 215 void Display::UpdateRootSurfaceResourcesLocked() { |
| 214 Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id_); | 216 Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id_); |
| 215 bool root_surface_resources_locked = | 217 bool root_surface_resources_locked = |
| 216 !surface || !surface->GetEligibleFrame().delegated_frame_data; | 218 !surface || !surface->GetEligibleFrame().delegated_frame_data; |
| 217 if (scheduler_) | 219 if (scheduler_) |
| 218 scheduler_->SetRootSurfaceResourcesLocked(root_surface_resources_locked); | 220 scheduler_->SetRootSurfaceResourcesLocked(root_surface_resources_locked); |
| 219 } | 221 } |
| 220 | 222 |
| 223 void Display::DidLoseContextProvider() { |
| 224 if (scheduler_) |
| 225 scheduler_->OutputSurfaceLost(); |
| 226 // WARNING: The client may delete the Display in this method call. Do not |
| 227 // make any additional references to members after this call. |
| 228 client_->DisplayOutputSurfaceLost(); |
| 229 } |
| 230 |
| 221 bool Display::DrawAndSwap() { | 231 bool Display::DrawAndSwap() { |
| 222 TRACE_EVENT0("cc", "Display::DrawAndSwap"); | 232 TRACE_EVENT0("cc", "Display::DrawAndSwap"); |
| 223 | 233 |
| 224 if (current_surface_id_.is_null()) { | 234 if (current_surface_id_.is_null()) { |
| 225 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD); | 235 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD); |
| 226 return false; | 236 return false; |
| 227 } | 237 } |
| 228 | 238 |
| 229 if (!output_surface_) { | 239 if (!output_surface_) { |
| 230 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD); | 240 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 const SurfaceId& Display::CurrentSurfaceId() { | 398 const SurfaceId& Display::CurrentSurfaceId() { |
| 389 return current_surface_id_; | 399 return current_surface_id_; |
| 390 } | 400 } |
| 391 | 401 |
| 392 void Display::ForceImmediateDrawAndSwapIfPossible() { | 402 void Display::ForceImmediateDrawAndSwapIfPossible() { |
| 393 if (scheduler_) | 403 if (scheduler_) |
| 394 scheduler_->ForceImmediateSwapIfPossible(); | 404 scheduler_->ForceImmediateSwapIfPossible(); |
| 395 } | 405 } |
| 396 | 406 |
| 397 } // namespace cc | 407 } // namespace cc |
| OLD | NEW |