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

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

Issue 2098953003: Make cc::CompositorFrames movable [Part 2 of 2] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed exo unittests Created 4 years, 5 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 | « android_webview/browser/hardware_renderer.cc ('k') | cc/surfaces/display_unittest.cc » ('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/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/threading/thread_task_runner_handle.h" 10 #include "base/threading/thread_task_runner_handle.h"
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 void Display::DidLoseOutputSurface() { 200 void Display::DidLoseOutputSurface() {
201 if (scheduler_) 201 if (scheduler_)
202 scheduler_->OutputSurfaceLost(); 202 scheduler_->OutputSurfaceLost();
203 // WARNING: The client may delete the Display in this method call. Do not 203 // WARNING: The client may delete the Display in this method call. Do not
204 // make any additional references to members after this call. 204 // make any additional references to members after this call.
205 client_->DisplayOutputSurfaceLost(); 205 client_->DisplayOutputSurfaceLost();
206 } 206 }
207 207
208 void Display::UpdateRootSurfaceResourcesLocked() { 208 void Display::UpdateRootSurfaceResourcesLocked() {
209 Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id_); 209 Surface* surface = surface_manager_->GetSurfaceForId(current_surface_id_);
210 bool root_surface_resources_locked = !surface || !surface->GetEligibleFrame(); 210 bool root_surface_resources_locked =
211 !surface || !surface->GetEligibleFrame().delegated_frame_data;
211 if (scheduler_) 212 if (scheduler_)
212 scheduler_->SetRootSurfaceResourcesLocked(root_surface_resources_locked); 213 scheduler_->SetRootSurfaceResourcesLocked(root_surface_resources_locked);
213 } 214 }
214 215
215 bool Display::DrawAndSwap() { 216 bool Display::DrawAndSwap() {
216 TRACE_EVENT0("cc", "Display::DrawAndSwap"); 217 TRACE_EVENT0("cc", "Display::DrawAndSwap");
217 218
218 if (current_surface_id_.is_null()) { 219 if (current_surface_id_.is_null()) {
219 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD); 220 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD);
220 return false; 221 return false;
221 } 222 }
222 223
223 InitializeRenderer(); 224 InitializeRenderer();
224 if (!output_surface_) { 225 if (!output_surface_) {
225 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD); 226 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD);
226 return false; 227 return false;
227 } 228 }
228 229
229 std::unique_ptr<CompositorFrame> frame = 230 CompositorFrame frame = aggregator_->Aggregate(current_surface_id_);
230 aggregator_->Aggregate(current_surface_id_); 231 if (!frame.delegated_frame_data) {
231 if (!frame) {
232 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.", 232 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.",
233 TRACE_EVENT_SCOPE_THREAD); 233 TRACE_EVENT_SCOPE_THREAD);
234 return false; 234 return false;
235 } 235 }
236 236
237 // Run callbacks early to allow pipelining. 237 // Run callbacks early to allow pipelining.
238 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { 238 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) {
239 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); 239 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first);
240 if (surface) 240 if (surface)
241 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAWN); 241 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAWN);
242 } 242 }
243 243
244 DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); 244 DelegatedFrameData* frame_data = frame.delegated_frame_data.get();
245 245
246 frame->metadata.latency_info.insert(frame->metadata.latency_info.end(), 246 frame.metadata.latency_info.insert(frame.metadata.latency_info.end(),
247 stored_latency_info_.begin(), 247 stored_latency_info_.begin(),
248 stored_latency_info_.end()); 248 stored_latency_info_.end());
249 stored_latency_info_.clear(); 249 stored_latency_info_.clear();
250 bool have_copy_requests = false; 250 bool have_copy_requests = false;
251 for (const auto& pass : frame_data->render_pass_list) { 251 for (const auto& pass : frame_data->render_pass_list) {
252 have_copy_requests |= !pass->copy_requests.empty(); 252 have_copy_requests |= !pass->copy_requests.empty();
253 } 253 }
254 254
255 gfx::Size surface_size; 255 gfx::Size surface_size;
256 bool have_damage = false; 256 bool have_damage = false;
257 if (!frame_data->render_pass_list.empty()) { 257 if (!frame_data->render_pass_list.empty()) {
258 RenderPass& last_render_pass = *frame_data->render_pass_list.back(); 258 RenderPass& last_render_pass = *frame_data->render_pass_list.back();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 renderer_->DrawFrame(&frame_data->render_pass_list, device_scale_factor_, 293 renderer_->DrawFrame(&frame_data->render_pass_list, device_scale_factor_,
294 device_viewport_rect, device_clip_rect, 294 device_viewport_rect, device_clip_rect,
295 disable_picture_quad_image_filtering); 295 disable_picture_quad_image_filtering);
296 } else { 296 } else {
297 TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD); 297 TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD);
298 } 298 }
299 299
300 bool should_swap = should_draw && size_matches; 300 bool should_swap = should_draw && size_matches;
301 if (should_swap) { 301 if (should_swap) {
302 swapped_since_resize_ = true; 302 swapped_since_resize_ = true;
303 for (auto& latency : frame->metadata.latency_info) { 303 for (auto& latency : frame.metadata.latency_info) {
304 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", 304 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow",
305 TRACE_ID_DONT_MANGLE(latency.trace_id()), 305 TRACE_ID_DONT_MANGLE(latency.trace_id()),
306 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, 306 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
307 "step", "Display::DrawAndSwap"); 307 "step", "Display::DrawAndSwap");
308 } 308 }
309 benchmark_instrumentation::IssueDisplayRenderingStatsEvent(); 309 benchmark_instrumentation::IssueDisplayRenderingStatsEvent();
310 renderer_->SwapBuffers(std::move(frame->metadata)); 310 renderer_->SwapBuffers(std::move(frame.metadata));
311 } else { 311 } else {
312 if (have_damage && !size_matches) 312 if (have_damage && !size_matches)
313 aggregator_->SetFullDamageForSurface(current_surface_id_); 313 aggregator_->SetFullDamageForSurface(current_surface_id_);
314 TRACE_EVENT_INSTANT0("cc", "Swap skipped.", TRACE_EVENT_SCOPE_THREAD); 314 TRACE_EVENT_INSTANT0("cc", "Swap skipped.", TRACE_EVENT_SCOPE_THREAD);
315 stored_latency_info_.insert(stored_latency_info_.end(), 315 stored_latency_info_.insert(stored_latency_info_.end(),
316 frame->metadata.latency_info.begin(), 316 frame.metadata.latency_info.begin(),
317 frame->metadata.latency_info.end()); 317 frame.metadata.latency_info.end());
318 DidSwapBuffers(); 318 DidSwapBuffers();
319 DidSwapBuffersComplete(); 319 DidSwapBuffersComplete();
320 } 320 }
321 321
322 return true; 322 return true;
323 } 323 }
324 324
325 void Display::DidSwapBuffers() { 325 void Display::DidSwapBuffers() {
326 if (scheduler_) 326 if (scheduler_)
327 scheduler_->DidSwapBuffers(); 327 scheduler_->DidSwapBuffers();
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 void Display::SetFullRootLayerDamage() { 386 void Display::SetFullRootLayerDamage() {
387 if (aggregator_ && !current_surface_id_.is_null()) 387 if (aggregator_ && !current_surface_id_.is_null())
388 aggregator_->SetFullDamageForSurface(current_surface_id_); 388 aggregator_->SetFullDamageForSurface(current_surface_id_);
389 } 389 }
390 390
391 void Display::OnSurfaceDamaged(SurfaceId surface_id, bool* changed) { 391 void Display::OnSurfaceDamaged(SurfaceId surface_id, bool* changed) {
392 if (aggregator_ && 392 if (aggregator_ &&
393 aggregator_->previous_contained_surfaces().count(surface_id)) { 393 aggregator_->previous_contained_surfaces().count(surface_id)) {
394 Surface* surface = surface_manager_->GetSurfaceForId(surface_id); 394 Surface* surface = surface_manager_->GetSurfaceForId(surface_id);
395 if (surface) { 395 if (surface) {
396 const CompositorFrame* current_frame = surface->GetEligibleFrame(); 396 const CompositorFrame& current_frame = surface->GetEligibleFrame();
397 if (!current_frame || !current_frame->delegated_frame_data || 397 if (!current_frame.delegated_frame_data ||
398 !current_frame->delegated_frame_data->resource_list.size()) { 398 !current_frame.delegated_frame_data->resource_list.size()) {
399 aggregator_->ReleaseResources(surface_id); 399 aggregator_->ReleaseResources(surface_id);
400 } 400 }
401 } 401 }
402 if (scheduler_) 402 if (scheduler_)
403 scheduler_->SurfaceDamaged(surface_id); 403 scheduler_->SurfaceDamaged(surface_id);
404 *changed = true; 404 *changed = true;
405 } else if (surface_id == current_surface_id_) { 405 } else if (surface_id == current_surface_id_) {
406 if (scheduler_) 406 if (scheduler_)
407 scheduler_->SurfaceDamaged(surface_id); 407 scheduler_->SurfaceDamaged(surface_id);
408 *changed = true; 408 *changed = true;
409 } 409 }
410 410
411 if (surface_id == current_surface_id_) 411 if (surface_id == current_surface_id_)
412 UpdateRootSurfaceResourcesLocked(); 412 UpdateRootSurfaceResourcesLocked();
413 } 413 }
414 414
415 SurfaceId Display::CurrentSurfaceId() { 415 SurfaceId Display::CurrentSurfaceId() {
416 return current_surface_id_; 416 return current_surface_id_;
417 } 417 }
418 418
419 } // namespace cc 419 } // namespace cc
OLDNEW
« no previous file with comments | « android_webview/browser/hardware_renderer.cc ('k') | cc/surfaces/display_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698