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 "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/trace_event/trace_event.h" | 8 #include "base/trace_event/trace_event.h" |
9 #include "cc/debug/benchmark_instrumentation.h" | 9 #include "cc/debug/benchmark_instrumentation.h" |
10 #include "cc/output/compositor_frame.h" | 10 #include "cc/output/compositor_frame.h" |
11 #include "cc/output/compositor_frame_ack.h" | 11 #include "cc/output/compositor_frame_ack.h" |
12 #include "cc/output/direct_renderer.h" | 12 #include "cc/output/direct_renderer.h" |
13 #include "cc/output/gl_renderer.h" | 13 #include "cc/output/gl_renderer.h" |
14 #include "cc/output/renderer_settings.h" | 14 #include "cc/output/renderer_settings.h" |
15 #include "cc/output/software_renderer.h" | 15 #include "cc/output/software_renderer.h" |
16 #include "cc/resources/texture_mailbox_deleter.h" | 16 #include "cc/resources/texture_mailbox_deleter.h" |
17 #include "cc/surfaces/display_client.h" | 17 #include "cc/surfaces/display_client.h" |
18 #include "cc/surfaces/display_scheduler.h" | |
18 #include "cc/surfaces/surface.h" | 19 #include "cc/surfaces/surface.h" |
19 #include "cc/surfaces/surface_aggregator.h" | 20 #include "cc/surfaces/surface_aggregator.h" |
20 #include "cc/surfaces/surface_manager.h" | 21 #include "cc/surfaces/surface_manager.h" |
21 #include "cc/trees/blocking_task_runner.h" | 22 #include "cc/trees/blocking_task_runner.h" |
22 | 23 |
23 namespace cc { | 24 namespace cc { |
24 | 25 |
25 Display::Display(DisplayClient* client, | 26 Display::Display(DisplayClient* client, |
26 SurfaceManager* manager, | 27 SurfaceManager* manager, |
27 SharedBitmapManager* bitmap_manager, | 28 SharedBitmapManager* bitmap_manager, |
28 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 29 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
29 const RendererSettings& settings) | 30 const RendererSettings& settings) |
30 : client_(client), | 31 : client_(client), |
31 manager_(manager), | 32 manager_(manager), |
32 bitmap_manager_(bitmap_manager), | 33 bitmap_manager_(bitmap_manager), |
33 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), | 34 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
34 settings_(settings), | 35 settings_(settings), |
36 current_surface_has_resources_(false), | |
brianderson
2015/04/03 01:35:48
jbauman: Can you check my logic for how I update t
| |
35 device_scale_factor_(1.f), | 37 device_scale_factor_(1.f), |
38 scheduler_(nullptr), | |
36 blocking_main_thread_task_runner_( | 39 blocking_main_thread_task_runner_( |
37 BlockingTaskRunner::Create(base::MessageLoopProxy::current())), | 40 BlockingTaskRunner::Create(base::MessageLoopProxy::current())), |
38 texture_mailbox_deleter_( | 41 texture_mailbox_deleter_( |
39 new TextureMailboxDeleter(base::MessageLoopProxy::current())) { | 42 new TextureMailboxDeleter(base::MessageLoopProxy::current())) { |
40 manager_->AddObserver(this); | 43 manager_->AddObserver(this); |
41 } | 44 } |
42 | 45 |
43 Display::~Display() { | 46 Display::~Display() { |
44 manager_->RemoveObserver(this); | 47 manager_->RemoveObserver(this); |
45 if (aggregator_) { | 48 if (aggregator_) { |
46 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { | 49 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
47 Surface* surface = manager_->GetSurfaceForId(id_entry.first); | 50 Surface* surface = manager_->GetSurfaceForId(id_entry.first); |
48 if (surface) | 51 if (surface) |
49 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); | 52 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAW_SKIPPED); |
50 } | 53 } |
51 } | 54 } |
52 } | 55 } |
53 | 56 |
54 bool Display::Initialize(scoped_ptr<OutputSurface> output_surface) { | 57 bool Display::Initialize(scoped_ptr<OutputSurface> output_surface, |
58 DisplayScheduler* scheduler) { | |
55 output_surface_ = output_surface.Pass(); | 59 output_surface_ = output_surface.Pass(); |
60 scheduler_ = scheduler; | |
56 return output_surface_->BindToClient(this); | 61 return output_surface_->BindToClient(this); |
57 } | 62 } |
58 | 63 |
59 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { | 64 void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) { |
65 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
| |
66 return; | |
67 | |
60 current_surface_id_ = id; | 68 current_surface_id_ = id; |
69 | |
70 current_surface_has_resources_ = true; | |
71 Surface* surface = manager_->GetSurfaceForId(id); | |
72 if (surface) { | |
73 const CompositorFrame* current_frame = surface->GetEligibleFrame(); | |
74 if (!current_frame || !current_frame->delegated_frame_data || | |
75 !current_frame->delegated_frame_data->resource_list.size()) { | |
76 current_surface_has_resources_ = false; | |
77 } | |
78 } | |
79 | |
61 device_scale_factor_ = device_scale_factor; | 80 device_scale_factor_ = device_scale_factor; |
62 client_->DisplayDamaged(); | 81 if (scheduler_) |
82 scheduler_->EntireDisplayDamaged(); | |
63 } | 83 } |
64 | 84 |
65 void Display::Resize(const gfx::Size& size) { | 85 void Display::Resize(const gfx::Size& size) { |
66 if (size == current_surface_size_) | 86 if (size == current_surface_size_) |
67 return; | 87 return; |
68 // Need to ensure all pending swaps have executed before the window is | 88 // Need to ensure all pending swaps have executed before the window is |
69 // resized, or D3D11 will scale the swap output. | 89 // resized, or D3D11 will scale the swap output. |
70 if (renderer_ && settings_.finish_rendering_on_resize) | 90 if (renderer_ && settings_.finish_rendering_on_resize) |
71 renderer_->Finish(); | 91 renderer_->Finish(); |
72 current_surface_size_ = size; | 92 current_surface_size_ = size; |
73 client_->DisplayDamaged(); | 93 if (scheduler_) |
94 scheduler_->EntireDisplayDamaged(); | |
74 } | 95 } |
75 | 96 |
76 void Display::InitializeRenderer() { | 97 void Display::InitializeRenderer() { |
77 if (resource_provider_) | 98 if (resource_provider_) |
78 return; | 99 return; |
79 | 100 |
80 scoped_ptr<ResourceProvider> resource_provider = ResourceProvider::Create( | 101 scoped_ptr<ResourceProvider> resource_provider = ResourceProvider::Create( |
81 output_surface_.get(), bitmap_manager_, gpu_memory_buffer_manager_, | 102 output_surface_.get(), bitmap_manager_, gpu_memory_buffer_manager_, |
82 blocking_main_thread_task_runner_.get(), settings_.highp_threshold_min, | 103 blocking_main_thread_task_runner_.get(), settings_.highp_threshold_min, |
83 settings_.use_rgba_4444_textures, | 104 settings_.use_rgba_4444_textures, |
(...skipping 15 matching lines...) Expand all Loading... | |
99 return; | 120 return; |
100 renderer_ = renderer.Pass(); | 121 renderer_ = renderer.Pass(); |
101 } | 122 } |
102 | 123 |
103 resource_provider_ = resource_provider.Pass(); | 124 resource_provider_ = resource_provider.Pass(); |
104 aggregator_.reset(new SurfaceAggregator(manager_, resource_provider_.get())); | 125 aggregator_.reset(new SurfaceAggregator(manager_, resource_provider_.get())); |
105 } | 126 } |
106 | 127 |
107 void Display::DidLoseOutputSurface() { | 128 void Display::DidLoseOutputSurface() { |
108 client_->OutputSurfaceLost(); | 129 client_->OutputSurfaceLost(); |
130 scheduler_->OutputSurfaceLost(); | |
131 } | |
132 | |
133 bool Display::CurrentSurfaceHasResources() { | |
134 return current_surface_has_resources_; | |
109 } | 135 } |
110 | 136 |
111 bool Display::Draw() { | 137 bool Display::Draw() { |
112 if (current_surface_id_.is_null()) | 138 if (current_surface_id_.is_null()) |
113 return false; | 139 return false; |
114 | 140 |
115 InitializeRenderer(); | 141 InitializeRenderer(); |
116 if (!output_surface_) | 142 if (!output_surface_) |
117 return false; | 143 return false; |
118 | 144 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
173 frame->metadata.latency_info.begin(), | 199 frame->metadata.latency_info.begin(), |
174 frame->metadata.latency_info.end()); | 200 frame->metadata.latency_info.end()); |
175 DidSwapBuffers(); | 201 DidSwapBuffers(); |
176 DidSwapBuffersComplete(); | 202 DidSwapBuffersComplete(); |
177 } | 203 } |
178 | 204 |
179 return true; | 205 return true; |
180 } | 206 } |
181 | 207 |
182 void Display::DidSwapBuffers() { | 208 void Display::DidSwapBuffers() { |
183 client_->DidSwapBuffers(); | 209 scheduler_->DidSwapBuffers(); |
184 } | 210 } |
185 | 211 |
186 void Display::DidSwapBuffersComplete() { | 212 void Display::DidSwapBuffersComplete() { |
187 client_->DidSwapBuffersComplete(); | 213 scheduler_->DidSwapBuffersComplete(); |
188 } | 214 } |
189 | 215 |
190 void Display::CommitVSyncParameters(base::TimeTicks timebase, | 216 void Display::CommitVSyncParameters(base::TimeTicks timebase, |
191 base::TimeDelta interval) { | 217 base::TimeDelta interval) { |
192 client_->CommitVSyncParameters(timebase, interval); | 218 client_->CommitVSyncParameters(timebase, interval); |
219 scheduler_->CommitVSyncParameters(timebase, interval); | |
193 } | 220 } |
194 | 221 |
195 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { | 222 void Display::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
196 client_->SetMemoryPolicy(policy); | 223 client_->SetMemoryPolicy(policy); |
197 } | 224 } |
198 | 225 |
199 void Display::OnSurfaceDamaged(SurfaceId surface_id, bool* changed) { | 226 void Display::OnSurfaceDamaged(SurfaceId surface_id, bool* changed) { |
200 if (aggregator_ && | 227 if (aggregator_ && |
201 aggregator_->previous_contained_surfaces().count(surface_id)) { | 228 aggregator_->previous_contained_surfaces().count(surface_id)) { |
202 Surface* surface = manager_->GetSurfaceForId(surface_id); | 229 Surface* surface = manager_->GetSurfaceForId(surface_id); |
230 bool has_resources = true; | |
203 if (surface) { | 231 if (surface) { |
204 const CompositorFrame* current_frame = surface->GetEligibleFrame(); | 232 const CompositorFrame* current_frame = surface->GetEligibleFrame(); |
205 if (!current_frame || !current_frame->delegated_frame_data || | 233 if (!current_frame || !current_frame->delegated_frame_data || |
206 !current_frame->delegated_frame_data->resource_list.size()) | 234 !current_frame->delegated_frame_data->resource_list.size()) { |
207 aggregator_->ReleaseResources(surface_id); | 235 aggregator_->ReleaseResources(surface_id); |
236 has_resources = false; | |
237 } | |
208 } | 238 } |
209 client_->DisplayDamaged(); | 239 if (surface_id == current_surface_id_) |
240 current_surface_has_resources_ = has_resources; | |
241 scheduler_->SurfaceDamaged(surface_id); | |
210 *changed = true; | 242 *changed = true; |
211 } else if (surface_id == current_surface_id_) { | 243 } else if (surface_id == current_surface_id_) { |
212 client_->DisplayDamaged(); | 244 current_surface_has_resources_ = true; |
jbauman
2015/04/03 22:27:51
This may not necessarily be true - we probably nee
| |
245 scheduler_->SurfaceDamaged(surface_id); | |
213 *changed = true; | 246 *changed = true; |
214 } | 247 } |
215 } | 248 } |
216 | 249 |
217 SurfaceId Display::CurrentSurfaceId() { | 250 SurfaceId Display::CurrentSurfaceId() { |
218 return current_surface_id_; | 251 return current_surface_id_; |
219 } | 252 } |
220 | 253 |
221 int Display::GetMaxFramesPending() { | 254 int Display::GetMaxFramesPending() { |
222 int max_frames_pending = | 255 int max_frames_pending = |
223 output_surface_ ? output_surface_->capabilities().max_frames_pending : 0; | 256 output_surface_ ? output_surface_->capabilities().max_frames_pending : 0; |
224 if (max_frames_pending <= 0) | 257 if (max_frames_pending <= 0) |
225 max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING; | 258 max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING; |
226 return max_frames_pending; | 259 return max_frames_pending; |
227 } | 260 } |
228 | 261 |
229 } // namespace cc | 262 } // namespace cc |
OLD | NEW |