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

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

Issue 2036563002: Delete OnscreenDisplayClient and TopLevelDisplayClient. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: onscreendisplayclient: webview-scoped-allow-gl-for-hardwarerenderer-constructor 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
« no previous file with comments | « cc/surfaces/display.h ('k') | cc/surfaces/display_client.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/surfaces/display.h ('k') | cc/surfaces/display_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698