| 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/thread_task_runner_handle.h" | 9 #include "base/thread_task_runner_handle.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "cc/surfaces/surface_manager.h" | 23 #include "cc/surfaces/surface_manager.h" |
| 24 #include "gpu/command_buffer/client/gles2_interface.h" | 24 #include "gpu/command_buffer/client/gles2_interface.h" |
| 25 #include "ui/gfx/buffer_types.h" | 25 #include "ui/gfx/buffer_types.h" |
| 26 | 26 |
| 27 namespace cc { | 27 namespace cc { |
| 28 | 28 |
| 29 Display::Display(DisplayClient* client, | 29 Display::Display(DisplayClient* client, |
| 30 SurfaceManager* manager, | 30 SurfaceManager* manager, |
| 31 SharedBitmapManager* bitmap_manager, | 31 SharedBitmapManager* bitmap_manager, |
| 32 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 32 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 33 const RendererSettings& settings) | 33 const RendererSettings& settings, |
| 34 uint32_t compositor_surface_namespace) |
| 34 : client_(client), | 35 : client_(client), |
| 35 manager_(manager), | 36 surface_manager_(manager), |
| 36 bitmap_manager_(bitmap_manager), | 37 bitmap_manager_(bitmap_manager), |
| 37 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 38 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
| 38 settings_(settings), | 39 settings_(settings), |
| 40 compositor_surface_namespace_(compositor_surface_namespace), |
| 39 device_scale_factor_(1.f), | 41 device_scale_factor_(1.f), |
| 40 swapped_since_resize_(false), | 42 swapped_since_resize_(false), |
| 41 scheduler_(nullptr), | 43 vsync_begin_frame_source_(nullptr), |
| 44 observed_begin_frame_source_(nullptr), |
| 42 texture_mailbox_deleter_(new TextureMailboxDeleter(nullptr)) { | 45 texture_mailbox_deleter_(new TextureMailboxDeleter(nullptr)) { |
| 43 manager_->AddObserver(this); | 46 surface_manager_->AddObserver(this); |
| 44 } | 47 } |
| 45 | 48 |
| 46 Display::~Display() { | 49 Display::~Display() { |
| 47 manager_->RemoveObserver(this); | 50 if (observed_begin_frame_source_) |
| 51 surface_manager_->UnregisterBeginFrameSource(observed_begin_frame_source_); |
| 52 surface_manager_->RemoveObserver(this); |
| 48 if (aggregator_) { | 53 if (aggregator_) { |
| 49 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { | 54 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
| 50 Surface* surface = manager_->GetSurfaceForId(id_entry.first); | 55 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); |
| 51 if (surface) | 56 if (surface) |
| 52 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); | 57 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); |
| 53 } | 58 } |
| 54 } | 59 } |
| 55 } | 60 } |
| 56 | 61 |
| 62 void Display::CreateScheduler(base::SingleThreadTaskRunner* task_runner) { |
| 63 DCHECK(!scheduler_); |
| 64 DCHECK(vsync_begin_frame_source_); |
| 65 |
| 66 observed_begin_frame_source_ = vsync_begin_frame_source_; |
| 67 if (settings_.disable_display_vsync) { |
| 68 unthrottled_begin_frame_source_.reset( |
| 69 new BackToBackBeginFrameSource(task_runner)); |
| 70 observed_begin_frame_source_ = unthrottled_begin_frame_source_.get(); |
| 71 } |
| 72 |
| 73 scheduler_.reset( |
| 74 new DisplayScheduler(this, observed_begin_frame_source_, task_runner, |
| 75 output_surface_->capabilities().max_frames_pending)); |
| 76 surface_manager_->RegisterBeginFrameSource(observed_begin_frame_source_, |
| 77 compositor_surface_namespace_); |
| 78 } |
| 79 |
| 57 bool Display::Initialize(scoped_ptr<OutputSurface> output_surface, | 80 bool Display::Initialize(scoped_ptr<OutputSurface> output_surface, |
| 58 DisplayScheduler* scheduler) { | 81 base::SingleThreadTaskRunner* task_runner) { |
| 59 // TODO(enne): register/unregister BeginFrameSource with SurfaceManager here. | |
| 60 output_surface_ = std::move(output_surface); | 82 output_surface_ = std::move(output_surface); |
| 61 scheduler_ = scheduler; | 83 if (!output_surface_->BindToClient(this)) |
| 62 return output_surface_->BindToClient(this); | 84 return false; |
| 85 CreateScheduler(task_runner); |
| 86 return true; |
| 63 } | 87 } |
| 64 | 88 |
| 65 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { | 89 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { |
| 90 DCHECK_EQ(id.id_namespace(), compositor_surface_namespace_); |
| 66 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) | 91 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) |
| 67 return; | 92 return; |
| 68 | 93 |
| 69 TRACE_EVENT0("cc", "Display::SetSurfaceId"); | 94 TRACE_EVENT0("cc", "Display::SetSurfaceId"); |
| 70 | |
| 71 current_surface_id_ = id; | 95 current_surface_id_ = id; |
| 72 device_scale_factor_ = device_scale_factor; | 96 device_scale_factor_ = device_scale_factor; |
| 73 | 97 |
| 74 UpdateRootSurfaceResourcesLocked(); | 98 UpdateRootSurfaceResourcesLocked(); |
| 75 if (scheduler_) | 99 if (scheduler_) |
| 76 scheduler_->SetNewRootSurface(id); | 100 scheduler_->SetNewRootSurface(id); |
| 77 } | 101 } |
| 78 | 102 |
| 79 void Display::Resize(const gfx::Size& size) { | 103 void Display::Resize(const gfx::Size& size) { |
| 80 if (size == current_surface_size_) | 104 if (size == current_surface_size_) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 if (!renderer) | 152 if (!renderer) |
| 129 return; | 153 return; |
| 130 renderer_ = std::move(renderer); | 154 renderer_ = std::move(renderer); |
| 131 } | 155 } |
| 132 | 156 |
| 133 resource_provider_ = std::move(resource_provider); | 157 resource_provider_ = std::move(resource_provider); |
| 134 // TODO(jbauman): Outputting an incomplete quad list doesn't work when using | 158 // TODO(jbauman): Outputting an incomplete quad list doesn't work when using |
| 135 // overlays. | 159 // overlays. |
| 136 bool output_partial_list = renderer_->Capabilities().using_partial_swap && | 160 bool output_partial_list = renderer_->Capabilities().using_partial_swap && |
| 137 !output_surface_->GetOverlayCandidateValidator(); | 161 !output_surface_->GetOverlayCandidateValidator(); |
| 138 aggregator_.reset(new SurfaceAggregator(manager_, resource_provider_.get(), | 162 aggregator_.reset(new SurfaceAggregator( |
| 139 output_partial_list)); | 163 surface_manager_, resource_provider_.get(), output_partial_list)); |
| 140 } | 164 } |
| 141 | 165 |
| 142 void Display::DidLoseOutputSurface() { | 166 void Display::DidLoseOutputSurface() { |
| 143 if (scheduler_) | 167 if (scheduler_) |
| 144 scheduler_->OutputSurfaceLost(); | 168 scheduler_->OutputSurfaceLost(); |
| 145 // WARNING: The client may delete the Display in this method call. Do not | 169 // WARNING: The client may delete the Display in this method call. Do not |
| 146 // make any additional references to members after this call. | 170 // make any additional references to members after this call. |
| 147 client_->OutputSurfaceLost(); | 171 client_->OutputSurfaceLost(); |
| 148 } | 172 } |
| 149 | 173 |
| 150 void Display::UpdateRootSurfaceResourcesLocked() { | 174 void Display::UpdateRootSurfaceResourcesLocked() { |
| 151 Surface* surface = manager_->GetSurfaceForId(current_surface_id_); | 175 Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id_); |
| 152 bool root_surface_resources_locked = !surface || !surface->GetEligibleFrame(); | 176 bool root_surface_resources_locked = !surface || !surface->GetEligibleFrame(); |
| 153 if (scheduler_) | 177 if (scheduler_) |
| 154 scheduler_->SetRootSurfaceResourcesLocked(root_surface_resources_locked); | 178 scheduler_->SetRootSurfaceResourcesLocked(root_surface_resources_locked); |
| 155 } | 179 } |
| 156 | 180 |
| 157 bool Display::DrawAndSwap() { | 181 bool Display::DrawAndSwap() { |
| 158 TRACE_EVENT0("cc", "Display::DrawAndSwap"); | 182 TRACE_EVENT0("cc", "Display::DrawAndSwap"); |
| 159 | 183 |
| 160 if (current_surface_id_.is_null()) { | 184 if (current_surface_id_.is_null()) { |
| 161 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD); | 185 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD); |
| 162 return false; | 186 return false; |
| 163 } | 187 } |
| 164 | 188 |
| 165 InitializeRenderer(); | 189 InitializeRenderer(); |
| 166 if (!output_surface_) { | 190 if (!output_surface_) { |
| 167 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD); | 191 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD); |
| 168 return false; | 192 return false; |
| 169 } | 193 } |
| 170 | 194 |
| 171 scoped_ptr<CompositorFrame> frame = | 195 scoped_ptr<CompositorFrame> frame = |
| 172 aggregator_->Aggregate(current_surface_id_); | 196 aggregator_->Aggregate(current_surface_id_); |
| 173 if (!frame) { | 197 if (!frame) { |
| 174 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.", | 198 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.", |
| 175 TRACE_EVENT_SCOPE_THREAD); | 199 TRACE_EVENT_SCOPE_THREAD); |
| 176 return false; | 200 return false; |
| 177 } | 201 } |
| 178 | 202 |
| 179 // Run callbacks early to allow pipelining. | 203 // Run callbacks early to allow pipelining. |
| 180 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { | 204 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
| 181 Surface* surface = manager_->GetSurfaceForId(id_entry.first); | 205 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); |
| 182 if (surface) | 206 if (surface) |
| 183 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAWN); | 207 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAWN); |
| 184 } | 208 } |
| 185 | 209 |
| 186 DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); | 210 DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); |
| 187 | 211 |
| 188 frame->metadata.latency_info.insert(frame->metadata.latency_info.end(), | 212 frame->metadata.latency_info.insert(frame->metadata.latency_info.end(), |
| 189 stored_latency_info_.begin(), | 213 stored_latency_info_.begin(), |
| 190 stored_latency_info_.end()); | 214 stored_latency_info_.end()); |
| 191 stored_latency_info_.clear(); | 215 stored_latency_info_.clear(); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 scheduler_->DidSwapBuffers(); | 293 scheduler_->DidSwapBuffers(); |
| 270 } | 294 } |
| 271 | 295 |
| 272 void Display::DidSwapBuffersComplete() { | 296 void Display::DidSwapBuffersComplete() { |
| 273 if (scheduler_) | 297 if (scheduler_) |
| 274 scheduler_->DidSwapBuffersComplete(); | 298 scheduler_->DidSwapBuffersComplete(); |
| 275 if (renderer_) | 299 if (renderer_) |
| 276 renderer_->SwapBuffersComplete(); | 300 renderer_->SwapBuffersComplete(); |
| 277 } | 301 } |
| 278 | 302 |
| 279 void Display::CommitVSyncParameters(base::TimeTicks timebase, | 303 void Display::SetBeginFrameSource(BeginFrameSource* source) { |
| 280 base::TimeDelta interval) { | 304 // It's expected that there's only a single source from the |
| 281 client_->CommitVSyncParameters(timebase, interval); | 305 // BrowserCompositorOutputSurface that corresponds to vsync. The BFS is |
| 306 // passed BrowserCompositorOutputSurface -> Display -> DisplayScheduler as an |
| 307 // input. DisplayScheduler makes a decision about which BFS to use and |
| 308 // calls back to Display as DisplaySchedulerClient to register for that |
| 309 // surface id. |
| 310 DCHECK(!vsync_begin_frame_source_); |
| 311 vsync_begin_frame_source_ = source; |
| 282 } | 312 } |
| 283 | 313 |
| 284 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { | 314 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
| 285 client_->SetMemoryPolicy(policy); | 315 client_->SetMemoryPolicy(policy); |
| 286 } | 316 } |
| 287 | 317 |
| 288 void Display::OnDraw(const gfx::Transform& transform, | 318 void Display::OnDraw(const gfx::Transform& transform, |
| 289 const gfx::Rect& viewport, | 319 const gfx::Rect& viewport, |
| 290 const gfx::Rect& clip, | 320 const gfx::Rect& clip, |
| 291 bool resourceless_software_draw) { | 321 bool resourceless_software_draw) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 313 } | 343 } |
| 314 | 344 |
| 315 void Display::SetFullRootLayerDamage() { | 345 void Display::SetFullRootLayerDamage() { |
| 316 if (aggregator_ && !current_surface_id_.is_null()) | 346 if (aggregator_ && !current_surface_id_.is_null()) |
| 317 aggregator_->SetFullDamageForSurface(current_surface_id_); | 347 aggregator_->SetFullDamageForSurface(current_surface_id_); |
| 318 } | 348 } |
| 319 | 349 |
| 320 void Display::OnSurfaceDamaged(SurfaceId surface_id, bool* changed) { | 350 void Display::OnSurfaceDamaged(SurfaceId surface_id, bool* changed) { |
| 321 if (aggregator_ && | 351 if (aggregator_ && |
| 322 aggregator_->previous_contained_surfaces().count(surface_id)) { | 352 aggregator_->previous_contained_surfaces().count(surface_id)) { |
| 323 Surface* surface = manager_->GetSurfaceForId(surface_id); | 353 Surface* surface = surface_manager_->GetSurfaceForId(surface_id); |
| 324 if (surface) { | 354 if (surface) { |
| 325 const CompositorFrame* current_frame = surface->GetEligibleFrame(); | 355 const CompositorFrame* current_frame = surface->GetEligibleFrame(); |
| 326 if (!current_frame || !current_frame->delegated_frame_data || | 356 if (!current_frame || !current_frame->delegated_frame_data || |
| 327 !current_frame->delegated_frame_data->resource_list.size()) { | 357 !current_frame->delegated_frame_data->resource_list.size()) { |
| 328 aggregator_->ReleaseResources(surface_id); | 358 aggregator_->ReleaseResources(surface_id); |
| 329 } | 359 } |
| 330 } | 360 } |
| 331 if (scheduler_) | 361 if (scheduler_) |
| 332 scheduler_->SurfaceDamaged(surface_id); | 362 scheduler_->SurfaceDamaged(surface_id); |
| 333 *changed = true; | 363 *changed = true; |
| 334 } else if (surface_id == current_surface_id_) { | 364 } else if (surface_id == current_surface_id_) { |
| 335 if (scheduler_) | 365 if (scheduler_) |
| 336 scheduler_->SurfaceDamaged(surface_id); | 366 scheduler_->SurfaceDamaged(surface_id); |
| 337 *changed = true; | 367 *changed = true; |
| 338 } | 368 } |
| 339 | 369 |
| 340 if (surface_id == current_surface_id_) | 370 if (surface_id == current_surface_id_) |
| 341 UpdateRootSurfaceResourcesLocked(); | 371 UpdateRootSurfaceResourcesLocked(); |
| 342 } | 372 } |
| 343 | 373 |
| 344 SurfaceId Display::CurrentSurfaceId() { | 374 SurfaceId Display::CurrentSurfaceId() { |
| 345 return current_surface_id_; | 375 return current_surface_id_; |
| 346 } | 376 } |
| 347 | 377 |
| 348 } // namespace cc | 378 } // namespace cc |
| OLD | NEW |