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 "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/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 40 } // namespace | 40 } // namespace |
| 41 | 41 |
| 42 namespace cc { | 42 namespace cc { |
| 43 | 43 |
| 44 Display::Display(SurfaceManager* manager, | 44 Display::Display(SurfaceManager* manager, |
| 45 SharedBitmapManager* bitmap_manager, | 45 SharedBitmapManager* bitmap_manager, |
| 46 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 46 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 47 const RendererSettings& settings, | 47 const RendererSettings& settings, |
| 48 uint32_t compositor_surface_namespace, | 48 uint32_t compositor_surface_namespace, |
| 49 base::SingleThreadTaskRunner* task_runner, | 49 base::SingleThreadTaskRunner* task_runner, |
| 50 BeginFrameSource* begin_frame_source, | |
| 50 std::unique_ptr<OutputSurface> output_surface) | 51 std::unique_ptr<OutputSurface> output_surface) |
| 51 : surface_manager_(manager), | 52 : surface_manager_(manager), |
| 52 bitmap_manager_(bitmap_manager), | 53 bitmap_manager_(bitmap_manager), |
| 53 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 54 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
| 54 settings_(settings), | 55 settings_(settings), |
| 55 compositor_surface_namespace_(compositor_surface_namespace), | 56 compositor_surface_namespace_(compositor_surface_namespace), |
| 56 task_runner_(task_runner), | |
| 57 output_surface_(std::move(output_surface)), | 57 output_surface_(std::move(output_surface)), |
| 58 texture_mailbox_deleter_(task_runner) { | 58 texture_mailbox_deleter_(task_runner) { |
| 59 surface_manager_->AddObserver(this); | 59 surface_manager_->AddObserver(this); |
| 60 | |
| 61 if (begin_frame_source) { | |
|
enne (OOO)
2016/06/02 18:15:20
I'm not sure I understand this logic. Should this
danakj
2016/06/02 18:27:21
Oh, this replaces the InitializeSynchronous(), see
enne (OOO)
2016/06/02 18:58:09
Ohhhh ok ok, then can you remove the DCHECKs about
danakj
2016/06/03 01:28:35
Soo... why remove 2 DCHECKs when we can change who
| |
| 62 if (!task_runner) { | |
| 63 // WebView doesn't have a task runner or a real begin frame source, | |
| 64 // so just create something fake here. | |
| 65 DCHECK(!begin_frame_source); | |
| 66 internal_begin_frame_source_.reset(new EmptyBeginFrameSource()); | |
| 67 vsync_begin_frame_source_ = internal_begin_frame_source_.get(); | |
| 68 observed_begin_frame_source_ = vsync_begin_frame_source_; | |
| 69 } else { | |
| 70 DCHECK(begin_frame_source); | |
| 71 vsync_begin_frame_source_ = begin_frame_source; | |
| 72 observed_begin_frame_source_ = vsync_begin_frame_source_; | |
| 73 if (settings_.disable_display_vsync) { | |
| 74 internal_begin_frame_source_.reset( | |
| 75 new BackToBackBeginFrameSource(task_runner)); | |
| 76 observed_begin_frame_source_ = internal_begin_frame_source_.get(); | |
| 77 } | |
| 78 } | |
| 79 | |
| 80 scheduler_.reset(new DisplayScheduler( | |
| 81 this, observed_begin_frame_source_, task_runner, | |
| 82 output_surface_->capabilities().max_frames_pending)); | |
| 83 surface_manager_->RegisterBeginFrameSource(observed_begin_frame_source_, | |
| 84 compositor_surface_namespace_); | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 Display::Display(SurfaceManager* manager, | |
| 89 SharedBitmapManager* bitmap_manager, | |
| 90 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | |
| 91 const RendererSettings& settings, | |
| 92 uint32_t compositor_surface_namespace, | |
| 93 base::SingleThreadTaskRunner* task_runner, | |
| 94 BeginFrameSource* begin_frame_source, | |
| 95 std::unique_ptr<OutputSurface> output_surface, | |
| 96 std::unique_ptr<DisplayScheduler> display_scheduler_for_tests) | |
| 97 : Display(manager, | |
| 98 bitmap_manager, | |
| 99 gpu_memory_buffer_manager, | |
| 100 settings, | |
| 101 compositor_surface_namespace, | |
| 102 task_runner, | |
| 103 begin_frame_source, | |
| 104 std::move(output_surface)) { | |
| 105 DCHECK_EQ(!!begin_frame_source, !!display_scheduler_for_tests); | |
| 106 scheduler_ = std::move(display_scheduler_for_tests); | |
| 60 } | 107 } |
| 61 | 108 |
| 62 Display::~Display() { | 109 Display::~Display() { |
| 63 if (observed_begin_frame_source_) | 110 if (observed_begin_frame_source_) |
| 64 surface_manager_->UnregisterBeginFrameSource(observed_begin_frame_source_); | 111 surface_manager_->UnregisterBeginFrameSource(observed_begin_frame_source_); |
| 65 surface_manager_->RemoveObserver(this); | 112 surface_manager_->RemoveObserver(this); |
| 66 if (aggregator_) { | 113 if (aggregator_) { |
| 67 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { | 114 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
| 68 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); | 115 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); |
| 69 if (surface) | 116 if (surface) |
| 70 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); | 117 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); |
| 71 } | 118 } |
| 72 } | 119 } |
| 73 } | 120 } |
| 74 | 121 |
| 75 void Display::CreateScheduler() { | |
| 76 DCHECK(!scheduler_); | |
| 77 if (!task_runner_) { | |
| 78 // WebView doesn't have a task runner or a real begin frame source, | |
| 79 // so just create something fake here. | |
| 80 internal_begin_frame_source_.reset(new EmptyBeginFrameSource()); | |
| 81 vsync_begin_frame_source_ = internal_begin_frame_source_.get(); | |
| 82 observed_begin_frame_source_ = vsync_begin_frame_source_; | |
| 83 } else { | |
| 84 DCHECK(vsync_begin_frame_source_); | |
| 85 | |
| 86 observed_begin_frame_source_ = vsync_begin_frame_source_; | |
| 87 if (settings_.disable_display_vsync) { | |
| 88 internal_begin_frame_source_.reset( | |
| 89 new BackToBackBeginFrameSource(task_runner_)); | |
| 90 observed_begin_frame_source_ = internal_begin_frame_source_.get(); | |
| 91 } | |
| 92 } | |
| 93 | |
| 94 scheduler_.reset( | |
| 95 new DisplayScheduler(this, observed_begin_frame_source_, task_runner_, | |
| 96 output_surface_->capabilities().max_frames_pending)); | |
| 97 surface_manager_->RegisterBeginFrameSource(observed_begin_frame_source_, | |
| 98 compositor_surface_namespace_); | |
| 99 } | |
| 100 | |
| 101 bool Display::Initialize(DisplayClient* client) { | 122 bool Display::Initialize(DisplayClient* client) { |
| 102 client_ = client; | 123 client_ = client; |
| 103 if (!output_surface_->BindToClient(this)) | 124 if (!output_surface_->BindToClient(this)) |
| 104 return false; | 125 return false; |
| 105 CreateScheduler(); | |
| 106 return true; | 126 return true; |
| 107 } | 127 } |
| 108 | 128 |
| 109 bool Display::InitializeSynchronous(DisplayClient* client) { | |
| 110 client_ = client; | |
| 111 if (!output_surface_->BindToClient(this)) | |
| 112 return false; | |
| 113 // No scheduler created here. | |
| 114 return true; | |
| 115 } | |
| 116 | |
| 117 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { | 129 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { |
| 118 DCHECK_EQ(id.id_namespace(), compositor_surface_namespace_); | 130 DCHECK_EQ(id.id_namespace(), compositor_surface_namespace_); |
| 119 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) | 131 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) |
| 120 return; | 132 return; |
| 121 | 133 |
| 122 TRACE_EVENT0("cc", "Display::SetSurfaceId"); | 134 TRACE_EVENT0("cc", "Display::SetSurfaceId"); |
| 123 current_surface_id_ = id; | 135 current_surface_id_ = id; |
| 124 device_scale_factor_ = device_scale_factor; | 136 device_scale_factor_ = device_scale_factor; |
| 125 | 137 |
| 126 UpdateRootSurfaceResourcesLocked(); | 138 UpdateRootSurfaceResourcesLocked(); |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 scheduler_->DidSwapBuffers(); | 359 scheduler_->DidSwapBuffers(); |
| 348 } | 360 } |
| 349 | 361 |
| 350 void Display::DidSwapBuffersComplete() { | 362 void Display::DidSwapBuffersComplete() { |
| 351 if (scheduler_) | 363 if (scheduler_) |
| 352 scheduler_->DidSwapBuffersComplete(); | 364 scheduler_->DidSwapBuffersComplete(); |
| 353 if (renderer_) | 365 if (renderer_) |
| 354 renderer_->SwapBuffersComplete(); | 366 renderer_->SwapBuffersComplete(); |
| 355 } | 367 } |
| 356 | 368 |
| 369 void Display::CommitVSyncParameters(base::TimeTicks timebase, | |
| 370 base::TimeDelta interval) { | |
| 371 // Display uses a BeginFrameSource instead. | |
| 372 NOTREACHED(); | |
| 373 } | |
| 374 | |
| 357 void Display::SetBeginFrameSource(BeginFrameSource* source) { | 375 void Display::SetBeginFrameSource(BeginFrameSource* source) { |
| 358 // It's expected that there's only a single source from the | 376 // The BeginFrameSource is set from the constructor, it doesn't come |
| 359 // BrowserCompositorOutputSurface that corresponds to vsync. The BFS is | 377 // from the OutputSurface for the Display. |
| 360 // passed BrowserCompositorOutputSurface -> Display -> DisplayScheduler as an | 378 NOTREACHED(); |
| 361 // input. DisplayScheduler makes a decision about which BFS to use and | |
| 362 // calls back to Display as DisplaySchedulerClient to register for that | |
| 363 // surface id. | |
| 364 DCHECK(!vsync_begin_frame_source_); | |
| 365 vsync_begin_frame_source_ = source; | |
| 366 } | 379 } |
| 367 | 380 |
| 368 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { | 381 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
| 369 client_->DisplaySetMemoryPolicy(policy); | 382 client_->DisplaySetMemoryPolicy(policy); |
| 370 } | 383 } |
| 371 | 384 |
| 372 void Display::OnDraw(const gfx::Transform& transform, | 385 void Display::OnDraw(const gfx::Transform& transform, |
| 373 const gfx::Rect& viewport, | 386 const gfx::Rect& viewport, |
| 374 const gfx::Rect& clip, | 387 const gfx::Rect& clip, |
| 375 bool resourceless_software_draw) { | 388 bool resourceless_software_draw) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 423 | 436 |
| 424 if (surface_id == current_surface_id_) | 437 if (surface_id == current_surface_id_) |
| 425 UpdateRootSurfaceResourcesLocked(); | 438 UpdateRootSurfaceResourcesLocked(); |
| 426 } | 439 } |
| 427 | 440 |
| 428 SurfaceId Display::CurrentSurfaceId() { | 441 SurfaceId Display::CurrentSurfaceId() { |
| 429 return current_surface_id_; | 442 return current_surface_id_; |
| 430 } | 443 } |
| 431 | 444 |
| 432 } // namespace cc | 445 } // namespace cc |
| OLD | NEW |