Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: cc/surfaces/display.cc

Issue 2029323004: Get rid of virtual Display::CreateScheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@onscreendisplayclient
Patch Set: displaytest: ownership-all-the-things Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
18 #include "cc/surfaces/display_client.h" 19 #include "cc/surfaces/display_client.h"
19 #include "cc/surfaces/display_scheduler.h" 20 #include "cc/surfaces/display_scheduler.h"
20 #include "cc/surfaces/surface.h" 21 #include "cc/surfaces/surface.h"
21 #include "cc/surfaces/surface_aggregator.h" 22 #include "cc/surfaces/surface_aggregator.h"
22 #include "cc/surfaces/surface_manager.h" 23 #include "cc/surfaces/surface_manager.h"
23 #include "gpu/command_buffer/client/gles2_interface.h" 24 #include "gpu/command_buffer/client/gles2_interface.h"
24 #include "ui/gfx/buffer_types.h" 25 #include "ui/gfx/buffer_types.h"
25 26
26 #if defined(ENABLE_VULKAN) 27 #if defined(ENABLE_VULKAN)
27 #include "cc/output/vulkan_renderer.h" 28 #include "cc/output/vulkan_renderer.h"
28 #endif 29 #endif
29 30
30 namespace {
31
32 class EmptyBeginFrameSource : public cc::BeginFrameSource {
33 public:
34 void DidFinishFrame(cc::BeginFrameObserver* obs,
35 size_t remaining_frames) override{};
36 void AddObserver(cc::BeginFrameObserver* obs) override{};
37 void RemoveObserver(cc::BeginFrameObserver* obs) override{};
38 };
39
40 } // namespace
41
42 namespace cc { 31 namespace cc {
43 32
44 Display::Display(SurfaceManager* manager, 33 Display::Display(SurfaceManager* manager,
45 SharedBitmapManager* bitmap_manager, 34 SharedBitmapManager* bitmap_manager,
46 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, 35 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
47 const RendererSettings& settings, 36 const RendererSettings& settings,
48 uint32_t compositor_surface_namespace, 37 uint32_t compositor_surface_namespace,
49 base::SingleThreadTaskRunner* task_runner, 38 std::unique_ptr<BeginFrameSource> begin_frame_source,
50 std::unique_ptr<OutputSurface> output_surface) 39 std::unique_ptr<OutputSurface> output_surface,
40 std::unique_ptr<DisplayScheduler> scheduler,
41 std::unique_ptr<TextureMailboxDeleter> texture_mailbox_deleter)
51 : surface_manager_(manager), 42 : surface_manager_(manager),
52 bitmap_manager_(bitmap_manager), 43 bitmap_manager_(bitmap_manager),
53 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), 44 gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
54 settings_(settings), 45 settings_(settings),
55 compositor_surface_namespace_(compositor_surface_namespace), 46 compositor_surface_namespace_(compositor_surface_namespace),
56 task_runner_(task_runner), 47 begin_frame_source_(std::move(begin_frame_source)),
57 output_surface_(std::move(output_surface)), 48 output_surface_(std::move(output_surface)),
58 texture_mailbox_deleter_(task_runner) { 49 scheduler_(std::move(scheduler)),
50 texture_mailbox_deleter_(std::move(texture_mailbox_deleter)) {
51 DCHECK(output_surface_);
52 DCHECK(texture_mailbox_deleter_);
53 // If there's a DisplayScheduler, it will have a BeginFrameSource and we
54 // should know about it here.
55 DCHECK(!scheduler_ || begin_frame_source_);
56
59 surface_manager_->AddObserver(this); 57 surface_manager_->AddObserver(this);
58
59 /*
60 if (!task_runner) {
61 DCHECK(!begin_frame_source);
62 // WebView doesn't have a task runner or a real begin frame source,
63 // so just create something fake here.
64 internal_begin_frame_source_.reset(new EmptyBeginFrameSource());
65 vsync_begin_frame_source_ = internal_begin_frame_source_.get();
66 observed_begin_frame_source_ = vsync_begin_frame_source_;
67 } else {
68 DCHECK(begin_frame_source);
69 vsync_begin_frame_source_ = begin_frame_source;
70 observed_begin_frame_source_ = vsync_begin_frame_source_;
71 if (settings_.disable_display_vsync) {
72 internal_begin_frame_source_.reset(
73 new BackToBackBeginFrameSource(task_runner));
jbauman 2016/06/03 02:34:27 Where is this code to create a BackToBackBeginFram
danakj 2016/06/03 17:26:31 Oh I forgot this, it needs to be added to GpuProce
74 observed_begin_frame_source_ = internal_begin_frame_source_.get();
75 }
76 }
77 */
78
79 if (scheduler_)
80 scheduler_->SetClient(this);
81 // scheduler_.reset(new DisplayScheduler(
82 // this, observed_begin_frame_source_, task_runner,
83 // output_surface_->capabilities().max_frames_pending));
84 if (begin_frame_source_) {
85 surface_manager_->RegisterBeginFrameSource(begin_frame_source_.get(),
86 compositor_surface_namespace_);
87 }
60 } 88 }
61 89
62 Display::~Display() { 90 Display::~Display() {
63 if (observed_begin_frame_source_) 91 if (begin_frame_source_)
64 surface_manager_->UnregisterBeginFrameSource(observed_begin_frame_source_); 92 surface_manager_->UnregisterBeginFrameSource(begin_frame_source_.get());
65 surface_manager_->RemoveObserver(this); 93 surface_manager_->RemoveObserver(this);
66 if (aggregator_) { 94 if (aggregator_) {
67 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { 95 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) {
68 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); 96 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first);
69 if (surface) 97 if (surface)
70 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); 98 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED);
71 } 99 }
72 } 100 }
73 } 101 }
74 102
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) { 103 bool Display::Initialize(DisplayClient* client) {
102 client_ = client; 104 client_ = client;
103 if (!output_surface_->BindToClient(this)) 105 if (!output_surface_->BindToClient(this))
104 return false; 106 return false;
105 CreateScheduler();
106 return true; 107 return true;
107 } 108 }
108 109
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) { 110 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) {
118 DCHECK_EQ(id.id_namespace(), compositor_surface_namespace_); 111 DCHECK_EQ(id.id_namespace(), compositor_surface_namespace_);
119 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) 112 if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor)
120 return; 113 return;
121 114
122 TRACE_EVENT0("cc", "Display::SetSurfaceId"); 115 TRACE_EVENT0("cc", "Display::SetSurfaceId");
123 current_surface_id_ = id; 116 current_surface_id_ = id;
124 device_scale_factor_ = device_scale_factor; 117 device_scale_factor_ = device_scale_factor;
125 118
126 UpdateRootSurfaceResourcesLocked(); 119 UpdateRootSurfaceResourcesLocked();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 gpu_memory_buffer_manager_, nullptr, settings_.highp_threshold_min, 168 gpu_memory_buffer_manager_, nullptr, settings_.highp_threshold_min,
176 settings_.texture_id_allocation_chunk_size, 169 settings_.texture_id_allocation_chunk_size,
177 output_surface_->capabilities().delegated_sync_points_required, 170 output_surface_->capabilities().delegated_sync_points_required,
178 settings_.use_gpu_memory_buffer_resources, 171 settings_.use_gpu_memory_buffer_resources,
179 std::vector<unsigned>(static_cast<size_t>(gfx::BufferFormat::LAST) + 1, 172 std::vector<unsigned>(static_cast<size_t>(gfx::BufferFormat::LAST) + 1,
180 GL_TEXTURE_2D))); 173 GL_TEXTURE_2D)));
181 174
182 if (output_surface_->context_provider()) { 175 if (output_surface_->context_provider()) {
183 std::unique_ptr<GLRenderer> renderer = GLRenderer::Create( 176 std::unique_ptr<GLRenderer> renderer = GLRenderer::Create(
184 this, &settings_, output_surface_.get(), resource_provider.get(), 177 this, &settings_, output_surface_.get(), resource_provider.get(),
185 &texture_mailbox_deleter_, settings_.highp_threshold_min); 178 texture_mailbox_deleter_.get(), settings_.highp_threshold_min);
186 if (!renderer) 179 if (!renderer)
187 return; 180 return;
188 renderer_ = std::move(renderer); 181 renderer_ = std::move(renderer);
189 } else if (output_surface_->vulkan_context_provider()) { 182 } else if (output_surface_->vulkan_context_provider()) {
190 #if defined(ENABLE_VULKAN) 183 #if defined(ENABLE_VULKAN)
191 std::unique_ptr<VulkanRenderer> renderer = VulkanRenderer::Create( 184 std::unique_ptr<VulkanRenderer> renderer = VulkanRenderer::Create(
192 this, &settings_, output_surface_.get(), resource_provider.get(), 185 this, &settings_, output_surface_.get(), resource_provider.get(),
193 &texture_mailbox_deleter_, settings_.highp_threshold_min); 186 texture_mailbox_deleter_.get(), settings_.highp_threshold_min);
194 if (!renderer) 187 if (!renderer)
195 return; 188 return;
196 renderer_ = std::move(renderer); 189 renderer_ = std::move(renderer);
197 #else 190 #else
198 NOTREACHED(); 191 NOTREACHED();
199 #endif 192 #endif
200 } else { 193 } else {
201 std::unique_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create( 194 std::unique_ptr<SoftwareRenderer> renderer = SoftwareRenderer::Create(
202 this, &settings_, output_surface_.get(), resource_provider.get()); 195 this, &settings_, output_surface_.get(), resource_provider.get());
203 if (!renderer) 196 if (!renderer)
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 scheduler_->DidSwapBuffers(); 340 scheduler_->DidSwapBuffers();
348 } 341 }
349 342
350 void Display::DidSwapBuffersComplete() { 343 void Display::DidSwapBuffersComplete() {
351 if (scheduler_) 344 if (scheduler_)
352 scheduler_->DidSwapBuffersComplete(); 345 scheduler_->DidSwapBuffersComplete();
353 if (renderer_) 346 if (renderer_)
354 renderer_->SwapBuffersComplete(); 347 renderer_->SwapBuffersComplete();
355 } 348 }
356 349
350 void Display::CommitVSyncParameters(base::TimeTicks timebase,
351 base::TimeDelta interval) {
352 // Display uses a BeginFrameSource instead.
353 NOTREACHED();
354 }
355
357 void Display::SetBeginFrameSource(BeginFrameSource* source) { 356 void Display::SetBeginFrameSource(BeginFrameSource* source) {
358 // It's expected that there's only a single source from the 357 // The BeginFrameSource is set from the constructor, it doesn't come
359 // BrowserCompositorOutputSurface that corresponds to vsync. The BFS is 358 // from the OutputSurface for the Display.
360 // passed BrowserCompositorOutputSurface -> Display -> DisplayScheduler as an 359 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 } 360 }
367 361
368 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { 362 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) {
369 client_->DisplaySetMemoryPolicy(policy); 363 client_->DisplaySetMemoryPolicy(policy);
370 } 364 }
371 365
372 void Display::OnDraw(const gfx::Transform& transform, 366 void Display::OnDraw(const gfx::Transform& transform,
373 const gfx::Rect& viewport, 367 const gfx::Rect& viewport,
374 const gfx::Rect& clip, 368 const gfx::Rect& clip,
375 bool resourceless_software_draw) { 369 bool resourceless_software_draw) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 417
424 if (surface_id == current_surface_id_) 418 if (surface_id == current_surface_id_)
425 UpdateRootSurfaceResourcesLocked(); 419 UpdateRootSurfaceResourcesLocked();
426 } 420 }
427 421
428 SurfaceId Display::CurrentSurfaceId() { 422 SurfaceId Display::CurrentSurfaceId() {
429 return current_surface_id_; 423 return current_surface_id_;
430 } 424 }
431 425
432 } // namespace cc 426 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698