Chromium Code Reviews| Index: cc/surfaces/display.cc |
| diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc |
| index 7ec46727385581123b61289e353b1d6d98821024..fd4630d1d50e03b9012b866c8fd08f95c950b14c 100644 |
| --- a/cc/surfaces/display.cc |
| +++ b/cc/surfaces/display.cc |
| @@ -15,6 +15,7 @@ |
| #include "cc/output/software_renderer.h" |
| #include "cc/resources/texture_mailbox_deleter.h" |
| #include "cc/surfaces/display_client.h" |
| +#include "cc/surfaces/display_scheduler.h" |
| #include "cc/surfaces/surface.h" |
| #include "cc/surfaces/surface_aggregator.h" |
| #include "cc/surfaces/surface_manager.h" |
| @@ -32,7 +33,9 @@ Display::Display(DisplayClient* client, |
| bitmap_manager_(bitmap_manager), |
| gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
| settings_(settings), |
| + current_surface_has_resources_(false), |
|
brianderson
2015/04/03 01:35:48
jbauman: Can you check my logic for how I update t
|
| device_scale_factor_(1.f), |
| + scheduler_(nullptr), |
| blocking_main_thread_task_runner_( |
| BlockingTaskRunner::Create(base::MessageLoopProxy::current())), |
| texture_mailbox_deleter_( |
| @@ -51,15 +54,32 @@ Display::~Display() { |
| } |
| } |
| -bool Display::Initialize(scoped_ptr<OutputSurface> output_surface) { |
| +bool Display::Initialize(scoped_ptr<OutputSurface> output_surface, |
| + DisplayScheduler* scheduler) { |
| output_surface_ = output_surface.Pass(); |
| + scheduler_ = scheduler; |
| return output_surface_->BindToClient(this); |
| } |
| void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { |
| + if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor) |
|
brianderson
2015/04/03 01:35:48
jbauman: Is this early return ok to avoid calling
jbauman
2015/04/03 22:27:51
In general this should be ok, as OnSurfaceDamaged
|
| + return; |
| + |
| current_surface_id_ = id; |
| + |
| + current_surface_has_resources_ = true; |
| + Surface* surface = manager_->GetSurfaceForId(id); |
| + if (surface) { |
| + const CompositorFrame* current_frame = surface->GetEligibleFrame(); |
| + if (!current_frame || !current_frame->delegated_frame_data || |
| + !current_frame->delegated_frame_data->resource_list.size()) { |
| + current_surface_has_resources_ = false; |
| + } |
| + } |
| + |
| device_scale_factor_ = device_scale_factor; |
| - client_->DisplayDamaged(); |
| + if (scheduler_) |
| + scheduler_->EntireDisplayDamaged(); |
| } |
| void Display::Resize(const gfx::Size& size) { |
| @@ -70,7 +90,8 @@ void Display::Resize(const gfx::Size& size) { |
| if (renderer_ && settings_.finish_rendering_on_resize) |
| renderer_->Finish(); |
| current_surface_size_ = size; |
| - client_->DisplayDamaged(); |
| + if (scheduler_) |
| + scheduler_->EntireDisplayDamaged(); |
| } |
| void Display::InitializeRenderer() { |
| @@ -106,6 +127,11 @@ void Display::InitializeRenderer() { |
| void Display::DidLoseOutputSurface() { |
| client_->OutputSurfaceLost(); |
| + scheduler_->OutputSurfaceLost(); |
| +} |
| + |
| +bool Display::CurrentSurfaceHasResources() { |
| + return current_surface_has_resources_; |
| } |
| bool Display::Draw() { |
| @@ -180,16 +206,17 @@ bool Display::Draw() { |
| } |
| void Display::DidSwapBuffers() { |
| - client_->DidSwapBuffers(); |
| + scheduler_->DidSwapBuffers(); |
| } |
| void Display::DidSwapBuffersComplete() { |
| - client_->DidSwapBuffersComplete(); |
| + scheduler_->DidSwapBuffersComplete(); |
| } |
| void Display::CommitVSyncParameters(base::TimeTicks timebase, |
| base::TimeDelta interval) { |
| client_->CommitVSyncParameters(timebase, interval); |
| + scheduler_->CommitVSyncParameters(timebase, interval); |
| } |
| void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
| @@ -200,16 +227,22 @@ void Display::OnSurfaceDamaged(SurfaceId surface_id, bool* changed) { |
| if (aggregator_ && |
| aggregator_->previous_contained_surfaces().count(surface_id)) { |
| Surface* surface = manager_->GetSurfaceForId(surface_id); |
| + bool has_resources = true; |
| if (surface) { |
| const CompositorFrame* current_frame = surface->GetEligibleFrame(); |
| if (!current_frame || !current_frame->delegated_frame_data || |
| - !current_frame->delegated_frame_data->resource_list.size()) |
| + !current_frame->delegated_frame_data->resource_list.size()) { |
| aggregator_->ReleaseResources(surface_id); |
| + has_resources = false; |
| + } |
| } |
| - client_->DisplayDamaged(); |
| + if (surface_id == current_surface_id_) |
| + current_surface_has_resources_ = has_resources; |
| + scheduler_->SurfaceDamaged(surface_id); |
| *changed = true; |
| } else if (surface_id == current_surface_id_) { |
| - client_->DisplayDamaged(); |
| + current_surface_has_resources_ = true; |
|
jbauman
2015/04/03 22:27:51
This may not necessarily be true - we probably nee
|
| + scheduler_->SurfaceDamaged(surface_id); |
| *changed = true; |
| } |
| } |