| 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 15 matching lines...) Expand all Loading... |
| 26 | 26 |
| 27 #if defined(ENABLE_VULKAN) | 27 #if defined(ENABLE_VULKAN) |
| 28 #include "cc/output/vulkan_renderer.h" | 28 #include "cc/output/vulkan_renderer.h" |
| 29 #endif | 29 #endif |
| 30 | 30 |
| 31 namespace cc { | 31 namespace cc { |
| 32 | 32 |
| 33 Display::Display(SharedBitmapManager* bitmap_manager, | 33 Display::Display(SharedBitmapManager* bitmap_manager, |
| 34 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 34 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 35 const RendererSettings& settings, | 35 const RendererSettings& settings, |
| 36 const FrameSinkId& frame_sink_id, |
| 36 std::unique_ptr<BeginFrameSource> begin_frame_source, | 37 std::unique_ptr<BeginFrameSource> begin_frame_source, |
| 37 std::unique_ptr<OutputSurface> output_surface, | 38 std::unique_ptr<OutputSurface> output_surface, |
| 38 std::unique_ptr<DisplayScheduler> scheduler, | 39 std::unique_ptr<DisplayScheduler> scheduler, |
| 39 std::unique_ptr<TextureMailboxDeleter> texture_mailbox_deleter) | 40 std::unique_ptr<TextureMailboxDeleter> texture_mailbox_deleter) |
| 40 : bitmap_manager_(bitmap_manager), | 41 : bitmap_manager_(bitmap_manager), |
| 41 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 42 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
| 42 settings_(settings), | 43 settings_(settings), |
| 44 frame_sink_id_(frame_sink_id), |
| 43 begin_frame_source_(std::move(begin_frame_source)), | 45 begin_frame_source_(std::move(begin_frame_source)), |
| 44 output_surface_(std::move(output_surface)), | 46 output_surface_(std::move(output_surface)), |
| 45 scheduler_(std::move(scheduler)), | 47 scheduler_(std::move(scheduler)), |
| 46 texture_mailbox_deleter_(std::move(texture_mailbox_deleter)) { | 48 texture_mailbox_deleter_(std::move(texture_mailbox_deleter)) { |
| 47 DCHECK(output_surface_); | 49 DCHECK(output_surface_); |
| 48 DCHECK_EQ(!scheduler_, !begin_frame_source_); | 50 DCHECK_EQ(!scheduler_, !begin_frame_source_); |
| 51 DCHECK(frame_sink_id_.is_valid()); |
| 49 if (scheduler_) | 52 if (scheduler_) |
| 50 scheduler_->SetClient(this); | 53 scheduler_->SetClient(this); |
| 51 } | 54 } |
| 52 | 55 |
| 53 Display::~Display() { | 56 Display::~Display() { |
| 54 // Only do this if Initialize() happened. | 57 // Only do this if Initialize() happened. |
| 55 if (client_) { | 58 if (client_) { |
| 56 if (auto* context = output_surface_->context_provider()) | 59 if (auto* context = output_surface_->context_provider()) |
| 57 context->SetLostContextCallback(base::Closure()); | 60 context->SetLostContextCallback(base::Closure()); |
| 58 if (begin_frame_source_) | 61 if (begin_frame_source_) |
| 59 surface_manager_->UnregisterBeginFrameSource(begin_frame_source_.get()); | 62 surface_manager_->UnregisterBeginFrameSource(begin_frame_source_.get()); |
| 60 surface_manager_->RemoveObserver(this); | 63 surface_manager_->RemoveObserver(this); |
| 61 } | 64 } |
| 62 if (aggregator_) { | 65 if (aggregator_) { |
| 63 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { | 66 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
| 64 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); | 67 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); |
| 65 if (surface) | 68 if (surface) |
| 66 surface->RunDrawCallbacks(); | 69 surface->RunDrawCallbacks(); |
| 67 } | 70 } |
| 68 } | 71 } |
| 69 } | 72 } |
| 70 | 73 |
| 71 void Display::Initialize(DisplayClient* client, | 74 void Display::Initialize(DisplayClient* client, |
| 72 SurfaceManager* surface_manager, | 75 SurfaceManager* surface_manager) { |
| 73 const FrameSinkId& frame_sink_id) { | |
| 74 DCHECK(client); | 76 DCHECK(client); |
| 75 DCHECK(surface_manager); | 77 DCHECK(surface_manager); |
| 76 client_ = client; | 78 client_ = client; |
| 77 surface_manager_ = surface_manager; | 79 surface_manager_ = surface_manager; |
| 78 frame_sink_id_ = frame_sink_id; | |
| 79 | 80 |
| 80 surface_manager_->AddObserver(this); | 81 surface_manager_->AddObserver(this); |
| 81 | 82 |
| 82 // This must be done in Initialize() so that the caller can delay this until | 83 // This must be done in Initialize() so that the caller can delay this until |
| 83 // they are ready to receive a BeginFrameSource. | 84 // they are ready to receive a BeginFrameSource. |
| 84 if (begin_frame_source_) { | 85 if (begin_frame_source_) { |
| 85 surface_manager_->RegisterBeginFrameSource(begin_frame_source_.get(), | 86 surface_manager_->RegisterBeginFrameSource(begin_frame_source_.get(), |
| 86 frame_sink_id_); | 87 frame_sink_id_); |
| 87 } | 88 } |
| 88 | 89 |
| 89 output_surface_->BindToClient(this); | 90 output_surface_->BindToClient(this); |
| 90 InitializeRenderer(); | 91 InitializeRenderer(); |
| 91 | 92 |
| 92 if (auto* context = output_surface_->context_provider()) { | 93 if (auto* context = output_surface_->context_provider()) { |
| 93 // This depends on assumptions that Display::Initialize will happen | 94 // This depends on assumptions that Display::Initialize will happen |
| 94 // on the same callstack as the ContextProvider being created/initialized | 95 // on the same callstack as the ContextProvider being created/initialized |
| 95 // or else it could miss a callback before setting this. | 96 // or else it could miss a callback before setting this. |
| 96 context->SetLostContextCallback(base::Bind( | 97 context->SetLostContextCallback(base::Bind( |
| 97 &Display::DidLoseContextProvider, | 98 &Display::DidLoseContextProvider, |
| 98 // Unretained is safe since the callback is unset in this class' | 99 // Unretained is safe since the callback is unset in this class' |
| 99 // destructor and is never posted. | 100 // destructor and is never posted. |
| 100 base::Unretained(this))); | 101 base::Unretained(this))); |
| 101 } | 102 } |
| 102 } | 103 } |
| 103 | 104 |
| 104 void Display::SetSurfaceId(const SurfaceId& id, float device_scale_factor) { | 105 void Display::SetLocalFrameId(const LocalFrameId& id, |
| 105 DCHECK(id.frame_sink_id() == frame_sink_id_); | 106 float device_scale_factor) { |
| 106 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) | 107 if (current_surface_id_.local_frame_id() == id && |
| 108 device_scale_factor_ == device_scale_factor) { |
| 107 return; | 109 return; |
| 110 } |
| 108 | 111 |
| 109 TRACE_EVENT0("cc", "Display::SetSurfaceId"); | 112 TRACE_EVENT0("cc", "Display::SetSurfaceId"); |
| 110 current_surface_id_ = id; | 113 current_surface_id_ = SurfaceId(frame_sink_id_, id); |
| 111 device_scale_factor_ = device_scale_factor; | 114 device_scale_factor_ = device_scale_factor; |
| 112 | 115 |
| 113 UpdateRootSurfaceResourcesLocked(); | 116 UpdateRootSurfaceResourcesLocked(); |
| 114 if (scheduler_) | 117 if (scheduler_) |
| 115 scheduler_->SetNewRootSurface(id); | 118 scheduler_->SetNewRootSurface(current_surface_id_); |
| 116 } | 119 } |
| 117 | 120 |
| 118 void Display::SetVisible(bool visible) { | 121 void Display::SetVisible(bool visible) { |
| 119 TRACE_EVENT1("cc", "Display::SetVisible", "visible", visible); | 122 TRACE_EVENT1("cc", "Display::SetVisible", "visible", visible); |
| 120 if (renderer_) | 123 if (renderer_) |
| 121 renderer_->SetVisible(visible); | 124 renderer_->SetVisible(visible); |
| 122 if (scheduler_) | 125 if (scheduler_) |
| 123 scheduler_->SetVisible(visible); | 126 scheduler_->SetVisible(visible); |
| 124 visible_ = visible; | 127 visible_ = visible; |
| 125 | 128 |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 const SurfaceId& Display::CurrentSurfaceId() { | 397 const SurfaceId& Display::CurrentSurfaceId() { |
| 395 return current_surface_id_; | 398 return current_surface_id_; |
| 396 } | 399 } |
| 397 | 400 |
| 398 void Display::ForceImmediateDrawAndSwapIfPossible() { | 401 void Display::ForceImmediateDrawAndSwapIfPossible() { |
| 399 if (scheduler_) | 402 if (scheduler_) |
| 400 scheduler_->ForceImmediateSwapIfPossible(); | 403 scheduler_->ForceImmediateSwapIfPossible(); |
| 401 } | 404 } |
| 402 | 405 |
| 403 } // namespace cc | 406 } // namespace cc |
| OLD | NEW |