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" |
11 #include "cc/debug/benchmark_instrumentation.h" | 11 #include "cc/debug/benchmark_instrumentation.h" |
12 #include "cc/output/compositor_frame.h" | 12 #include "cc/output/compositor_frame.h" |
13 #include "cc/output/compositor_frame_ack.h" | 13 #include "cc/output/compositor_frame_ack.h" |
14 #include "cc/output/direct_renderer.h" | 14 #include "cc/output/direct_renderer.h" |
15 #include "cc/output/gl_renderer.h" | 15 #include "cc/output/gl_renderer.h" |
16 #include "cc/output/renderer_settings.h" | 16 #include "cc/output/renderer_settings.h" |
17 #include "cc/output/software_renderer.h" | 17 #include "cc/output/software_renderer.h" |
18 #include "cc/output/texture_mailbox_deleter.h" | |
19 #include "cc/surfaces/display_client.h" | 18 #include "cc/surfaces/display_client.h" |
20 #include "cc/surfaces/display_scheduler.h" | 19 #include "cc/surfaces/display_scheduler.h" |
21 #include "cc/surfaces/surface.h" | 20 #include "cc/surfaces/surface.h" |
22 #include "cc/surfaces/surface_aggregator.h" | 21 #include "cc/surfaces/surface_aggregator.h" |
23 #include "cc/surfaces/surface_manager.h" | 22 #include "cc/surfaces/surface_manager.h" |
24 #include "gpu/command_buffer/client/gles2_interface.h" | 23 #include "gpu/command_buffer/client/gles2_interface.h" |
25 #include "ui/gfx/buffer_types.h" | 24 #include "ui/gfx/buffer_types.h" |
26 | 25 |
27 #if defined(ENABLE_VULKAN) | 26 #if defined(ENABLE_VULKAN) |
28 #include "cc/output/vulkan_renderer.h" | 27 #include "cc/output/vulkan_renderer.h" |
29 #endif | 28 #endif |
30 | 29 |
31 namespace { | 30 namespace { |
32 | 31 |
33 class EmptyBeginFrameSource : public cc::BeginFrameSource { | 32 class EmptyBeginFrameSource : public cc::BeginFrameSource { |
34 public: | 33 public: |
35 void DidFinishFrame(cc::BeginFrameObserver* obs, | 34 void DidFinishFrame(cc::BeginFrameObserver* obs, |
36 size_t remaining_frames) override{}; | 35 size_t remaining_frames) override{}; |
37 void AddObserver(cc::BeginFrameObserver* obs) override{}; | 36 void AddObserver(cc::BeginFrameObserver* obs) override{}; |
38 void RemoveObserver(cc::BeginFrameObserver* obs) override{}; | 37 void RemoveObserver(cc::BeginFrameObserver* obs) override{}; |
39 }; | 38 }; |
40 | 39 |
41 } // namespace | 40 } // namespace |
42 | 41 |
43 namespace cc { | 42 namespace cc { |
44 | 43 |
45 Display::Display(DisplayClient* client, | 44 Display::Display(SurfaceManager* manager, |
46 SurfaceManager* manager, | |
47 SharedBitmapManager* bitmap_manager, | 45 SharedBitmapManager* bitmap_manager, |
48 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 46 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
49 const RendererSettings& settings, | 47 const RendererSettings& settings, |
50 uint32_t compositor_surface_namespace) | 48 uint32_t compositor_surface_namespace, |
51 : client_(client), | 49 base::SingleThreadTaskRunner* task_runner, |
52 surface_manager_(manager), | 50 std::unique_ptr<OutputSurface> output_surface) |
| 51 : surface_manager_(manager), |
53 bitmap_manager_(bitmap_manager), | 52 bitmap_manager_(bitmap_manager), |
54 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 53 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
55 settings_(settings), | 54 settings_(settings), |
56 compositor_surface_namespace_(compositor_surface_namespace), | 55 compositor_surface_namespace_(compositor_surface_namespace), |
57 device_scale_factor_(1.f), | 56 task_runner_(task_runner), |
58 swapped_since_resize_(false), | 57 output_surface_(std::move(output_surface)), |
59 vsync_begin_frame_source_(nullptr), | 58 texture_mailbox_deleter_(task_runner) { |
60 observed_begin_frame_source_(nullptr) { | |
61 surface_manager_->AddObserver(this); | 59 surface_manager_->AddObserver(this); |
62 } | 60 } |
63 | 61 |
64 Display::~Display() { | 62 Display::~Display() { |
65 if (observed_begin_frame_source_) | 63 if (observed_begin_frame_source_) |
66 surface_manager_->UnregisterBeginFrameSource(observed_begin_frame_source_); | 64 surface_manager_->UnregisterBeginFrameSource(observed_begin_frame_source_); |
67 surface_manager_->RemoveObserver(this); | 65 surface_manager_->RemoveObserver(this); |
68 if (aggregator_) { | 66 if (aggregator_) { |
69 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { | 67 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
70 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); | 68 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); |
71 if (surface) | 69 if (surface) |
72 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); | 70 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); |
73 } | 71 } |
74 } | 72 } |
75 } | 73 } |
76 | 74 |
77 void Display::CreateScheduler(base::SingleThreadTaskRunner* task_runner) { | 75 void Display::CreateScheduler() { |
78 DCHECK(!scheduler_); | 76 DCHECK(!scheduler_); |
79 if (!task_runner) { | 77 if (!task_runner_) { |
80 // WebView doesn't have a task runner or a real begin frame source, | 78 // WebView doesn't have a task runner or a real begin frame source, |
81 // so just create something fake here. | 79 // so just create something fake here. |
82 internal_begin_frame_source_.reset(new EmptyBeginFrameSource()); | 80 internal_begin_frame_source_.reset(new EmptyBeginFrameSource()); |
83 vsync_begin_frame_source_ = internal_begin_frame_source_.get(); | 81 vsync_begin_frame_source_ = internal_begin_frame_source_.get(); |
84 observed_begin_frame_source_ = vsync_begin_frame_source_; | 82 observed_begin_frame_source_ = vsync_begin_frame_source_; |
85 } else { | 83 } else { |
86 DCHECK(vsync_begin_frame_source_); | 84 DCHECK(vsync_begin_frame_source_); |
87 | 85 |
88 observed_begin_frame_source_ = vsync_begin_frame_source_; | 86 observed_begin_frame_source_ = vsync_begin_frame_source_; |
89 if (settings_.disable_display_vsync) { | 87 if (settings_.disable_display_vsync) { |
90 internal_begin_frame_source_.reset( | 88 internal_begin_frame_source_.reset( |
91 new BackToBackBeginFrameSource(task_runner)); | 89 new BackToBackBeginFrameSource(task_runner_)); |
92 observed_begin_frame_source_ = internal_begin_frame_source_.get(); | 90 observed_begin_frame_source_ = internal_begin_frame_source_.get(); |
93 } | 91 } |
94 } | 92 } |
95 | 93 |
96 scheduler_.reset( | 94 scheduler_.reset( |
97 new DisplayScheduler(this, observed_begin_frame_source_, task_runner, | 95 new DisplayScheduler(this, observed_begin_frame_source_, task_runner_, |
98 output_surface_->capabilities().max_frames_pending)); | 96 output_surface_->capabilities().max_frames_pending)); |
99 surface_manager_->RegisterBeginFrameSource(observed_begin_frame_source_, | 97 surface_manager_->RegisterBeginFrameSource(observed_begin_frame_source_, |
100 compositor_surface_namespace_); | 98 compositor_surface_namespace_); |
101 } | 99 } |
102 | 100 |
103 bool Display::Initialize(std::unique_ptr<OutputSurface> output_surface, | 101 bool Display::Initialize(DisplayClient* client) { |
104 base::SingleThreadTaskRunner* task_runner) { | 102 client_ = client; |
105 DCHECK(!output_surface_); | |
106 output_surface_ = std::move(output_surface); | |
107 if (!output_surface_->BindToClient(this)) | 103 if (!output_surface_->BindToClient(this)) |
108 return false; | 104 return false; |
109 texture_mailbox_deleter_.reset(new TextureMailboxDeleter(task_runner)); | 105 CreateScheduler(); |
110 CreateScheduler(task_runner); | |
111 return true; | 106 return true; |
112 } | 107 } |
113 | 108 |
114 bool Display::InitializeSynchronous( | 109 bool Display::InitializeSynchronous(DisplayClient* client) { |
115 std::unique_ptr<OutputSurface> output_surface, | 110 client_ = client; |
116 base::SingleThreadTaskRunner* task_runner) { | |
117 DCHECK(!output_surface_); | |
118 output_surface_ = std::move(output_surface); | |
119 if (!output_surface_->BindToClient(this)) | 111 if (!output_surface_->BindToClient(this)) |
120 return false; | 112 return false; |
121 texture_mailbox_deleter_.reset(new TextureMailboxDeleter(task_runner)); | |
122 // No scheduler created here. | 113 // No scheduler created here. |
123 return true; | 114 return true; |
124 } | 115 } |
125 | 116 |
126 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { | 117 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { |
127 DCHECK_EQ(id.id_namespace(), compositor_surface_namespace_); | 118 DCHECK_EQ(id.id_namespace(), compositor_surface_namespace_); |
128 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) | 119 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) |
129 return; | 120 return; |
130 | 121 |
131 TRACE_EVENT0("cc", "Display::SetSurfaceId"); | 122 TRACE_EVENT0("cc", "Display::SetSurfaceId"); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 gpu_memory_buffer_manager_, nullptr, settings_.highp_threshold_min, | 175 gpu_memory_buffer_manager_, nullptr, settings_.highp_threshold_min, |
185 settings_.texture_id_allocation_chunk_size, | 176 settings_.texture_id_allocation_chunk_size, |
186 output_surface_->capabilities().delegated_sync_points_required, | 177 output_surface_->capabilities().delegated_sync_points_required, |
187 settings_.use_gpu_memory_buffer_resources, | 178 settings_.use_gpu_memory_buffer_resources, |
188 std::vector<unsigned>(static_cast<size_t>(gfx::BufferFormat::LAST) + 1, | 179 std::vector<unsigned>(static_cast<size_t>(gfx::BufferFormat::LAST) + 1, |
189 GL_TEXTURE_2D))); | 180 GL_TEXTURE_2D))); |
190 | 181 |
191 if (output_surface_->context_provider()) { | 182 if (output_surface_->context_provider()) { |
192 std::unique_ptr<GLRenderer> renderer = GLRenderer::Create( | 183 std::unique_ptr<GLRenderer> renderer = GLRenderer::Create( |
193 this, &settings_, output_surface_.get(), resource_provider.get(), | 184 this, &settings_, output_surface_.get(), resource_provider.get(), |
194 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); | 185 &texture_mailbox_deleter_, settings_.highp_threshold_min); |
195 if (!renderer) | 186 if (!renderer) |
196 return; | 187 return; |
197 renderer_ = std::move(renderer); | 188 renderer_ = std::move(renderer); |
198 } else if (output_surface_->vulkan_context_provider()) { | 189 } else if (output_surface_->vulkan_context_provider()) { |
199 #if defined(ENABLE_VULKAN) | 190 #if defined(ENABLE_VULKAN) |
200 std::unique_ptr<VulkanRenderer> renderer = VulkanRenderer::Create( | 191 std::unique_ptr<VulkanRenderer> renderer = VulkanRenderer::Create( |
201 this, &settings_, output_surface_.get(), resource_provider.get(), | 192 this, &settings_, output_surface_.get(), resource_provider.get(), |
202 texture_mailbox_deleter_.get(), settings_.highp_threshold_min); | 193 &texture_mailbox_deleter_, settings_.highp_threshold_min); |
203 if (!renderer) | 194 if (!renderer) |
204 return; | 195 return; |
205 renderer_ = std::move(renderer); | 196 renderer_ = std::move(renderer); |
206 #else | 197 #else |
207 NOTREACHED(); | 198 NOTREACHED(); |
208 #endif | 199 #endif |
209 } else { | 200 } else { |
210 std::unique_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create( | 201 std::unique_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create( |
211 this, &settings_, output_surface_.get(), resource_provider.get(), | 202 this, &settings_, output_surface_.get(), resource_provider.get(), |
212 true /* use_image_hijack_canvas */); | 203 true /* use_image_hijack_canvas */); |
(...skipping 12 matching lines...) Expand all Loading... |
225 aggregator_.reset(new SurfaceAggregator( | 216 aggregator_.reset(new SurfaceAggregator( |
226 surface_manager_, resource_provider_.get(), output_partial_list)); | 217 surface_manager_, resource_provider_.get(), output_partial_list)); |
227 aggregator_->set_output_is_secure(output_is_secure_); | 218 aggregator_->set_output_is_secure(output_is_secure_); |
228 } | 219 } |
229 | 220 |
230 void Display::DidLoseOutputSurface() { | 221 void Display::DidLoseOutputSurface() { |
231 if (scheduler_) | 222 if (scheduler_) |
232 scheduler_->OutputSurfaceLost(); | 223 scheduler_->OutputSurfaceLost(); |
233 // WARNING: The client may delete the Display in this method call. Do not | 224 // WARNING: The client may delete the Display in this method call. Do not |
234 // make any additional references to members after this call. | 225 // make any additional references to members after this call. |
235 client_->OutputSurfaceLost(); | 226 client_->DisplayOutputSurfaceLost(); |
236 } | 227 } |
237 | 228 |
238 void Display::UpdateRootSurfaceResourcesLocked() { | 229 void Display::UpdateRootSurfaceResourcesLocked() { |
239 Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id_); | 230 Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id_); |
240 bool root_surface_resources_locked = !surface || !surface->GetEligibleFrame(); | 231 bool root_surface_resources_locked = !surface || !surface->GetEligibleFrame(); |
241 if (scheduler_) | 232 if (scheduler_) |
242 scheduler_->SetRootSurfaceResourcesLocked(root_surface_resources_locked); | 233 scheduler_->SetRootSurfaceResourcesLocked(root_surface_resources_locked); |
243 } | 234 } |
244 | 235 |
245 bool Display::DrawAndSwap() { | 236 bool Display::DrawAndSwap() { |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 // BrowserCompositorOutputSurface that corresponds to vsync. The BFS is | 360 // BrowserCompositorOutputSurface that corresponds to vsync. The BFS is |
370 // passed BrowserCompositorOutputSurface -> Display -> DisplayScheduler as an | 361 // passed BrowserCompositorOutputSurface -> Display -> DisplayScheduler as an |
371 // input. DisplayScheduler makes a decision about which BFS to use and | 362 // input. DisplayScheduler makes a decision about which BFS to use and |
372 // calls back to Display as DisplaySchedulerClient to register for that | 363 // calls back to Display as DisplaySchedulerClient to register for that |
373 // surface id. | 364 // surface id. |
374 DCHECK(!vsync_begin_frame_source_); | 365 DCHECK(!vsync_begin_frame_source_); |
375 vsync_begin_frame_source_ = source; | 366 vsync_begin_frame_source_ = source; |
376 } | 367 } |
377 | 368 |
378 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { | 369 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
379 client_->SetMemoryPolicy(policy); | 370 client_->DisplaySetMemoryPolicy(policy); |
380 } | 371 } |
381 | 372 |
382 void Display::OnDraw(const gfx::Transform& transform, | 373 void Display::OnDraw(const gfx::Transform& transform, |
383 const gfx::Rect& viewport, | 374 const gfx::Rect& viewport, |
384 const gfx::Rect& clip, | 375 const gfx::Rect& clip, |
385 bool resourceless_software_draw) { | 376 bool resourceless_software_draw) { |
386 NOTREACHED(); | 377 NOTREACHED(); |
387 } | 378 } |
388 | 379 |
389 void Display::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { | 380 void Display::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 | 424 |
434 if (surface_id == current_surface_id_) | 425 if (surface_id == current_surface_id_) |
435 UpdateRootSurfaceResourcesLocked(); | 426 UpdateRootSurfaceResourcesLocked(); |
436 } | 427 } |
437 | 428 |
438 SurfaceId Display::CurrentSurfaceId() { | 429 SurfaceId Display::CurrentSurfaceId() { |
439 return current_surface_id_; | 430 return current_surface_id_; |
440 } | 431 } |
441 | 432 |
442 } // namespace cc | 433 } // namespace cc |
OLD | NEW |