| 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 |