Chromium Code Reviews| 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" | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |