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

Side by Side Diff: cc/output/direct_renderer.cc

Issue 2776923003: cc: Partial draw without partial swap support. (Closed)
Patch Set: avoid BufferQueue::RecreateBuffer changes Created 3 years, 8 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 | « cc/output/direct_renderer.h ('k') | cc/output/gl_renderer.h » ('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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/output/direct_renderer.h" 5 #include "cc/output/direct_renderer.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <unordered_map> 9 #include <unordered_map>
10 #include <utility> 10 #include <utility>
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 frames_since_using_dc_layers_ = 0; 330 frames_since_using_dc_layers_ = 0;
331 } else if (++frames_since_using_dc_layers_ >= 331 } else if (++frames_since_using_dc_layers_ >=
332 kNumberOfFramesBeforeDisablingDCLayers) { 332 kNumberOfFramesBeforeDisablingDCLayers) {
333 using_dc_layers_ = false; 333 using_dc_layers_ = false;
334 } 334 }
335 if (was_using_dc_layers != using_dc_layers_) { 335 if (was_using_dc_layers != using_dc_layers_) {
336 current_frame()->root_damage_rect = 336 current_frame()->root_damage_rect =
337 current_frame()->root_render_pass->output_rect; 337 current_frame()->root_render_pass->output_rect;
338 } 338 }
339 339
340 allow_partial_draw_ =
341 use_partial_swap_ ||
342 output_surface_->CanPartialDraw(current_frame()->root_damage_rect);
343
340 // We can skip all drawing if the damage rect is now empty. 344 // We can skip all drawing if the damage rect is now empty.
341 bool skip_drawing_root_render_pass = 345 bool skip_drawing_root_render_pass =
342 current_frame()->root_damage_rect.IsEmpty() && allow_empty_swap_; 346 current_frame()->root_damage_rect.IsEmpty() && allow_empty_swap_;
343 347
344 // If we have to draw but don't support partial swap, the whole output should
345 // be considered damaged.
346 if (!skip_drawing_root_render_pass && !use_partial_swap_)
347 current_frame()->root_damage_rect = root_render_pass->output_rect;
348
349 if (skip_drawing_root_render_pass) { 348 if (skip_drawing_root_render_pass) {
350 // If any of the overlays is the output surface, then ensure that the 349 // If any of the overlays is the output surface, then ensure that the
351 // backbuffer be allocated (allocation of the backbuffer is a side-effect 350 // backbuffer be allocated (allocation of the backbuffer is a side-effect
352 // of BindFramebufferToOutputSurface). 351 // of BindFramebufferToOutputSurface).
353 for (auto& overlay : current_frame()->overlay_list) { 352 for (auto& overlay : current_frame()->overlay_list) {
354 if (overlay.use_output_surface_for_resource) { 353 if (overlay.use_output_surface_for_resource) {
355 BindFramebufferToOutputSurface(); 354 BindFramebufferToOutputSurface();
356 break; 355 break;
357 } 356 }
358 } 357 }
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 524
526 const gfx::Rect surface_rect_in_draw_space = OutputSurfaceRectInDrawSpace(); 525 const gfx::Rect surface_rect_in_draw_space = OutputSurfaceRectInDrawSpace();
527 gfx::Rect render_pass_scissor_in_draw_space = surface_rect_in_draw_space; 526 gfx::Rect render_pass_scissor_in_draw_space = surface_rect_in_draw_space;
528 527
529 if (current_frame()->current_render_pass == 528 if (current_frame()->current_render_pass ==
530 current_frame()->root_render_pass) { 529 current_frame()->root_render_pass) {
531 render_pass_scissor_in_draw_space.Intersect( 530 render_pass_scissor_in_draw_space.Intersect(
532 DeviceViewportRectInDrawSpace()); 531 DeviceViewportRectInDrawSpace());
533 } 532 }
534 533
535 if (use_partial_swap_) { 534 if (allow_partial_draw_) {
536 render_pass_scissor_in_draw_space.Intersect( 535 render_pass_scissor_in_draw_space.Intersect(
537 current_frame()->ComputeScissorRectForRenderPass()); 536 current_frame()->ComputeScissorRectForRenderPass());
538 } 537 }
539 538
540 bool is_root_render_pass = 539 bool is_root_render_pass =
541 current_frame()->current_render_pass == current_frame()->root_render_pass; 540 current_frame()->current_render_pass == current_frame()->root_render_pass;
542 541
543 bool render_pass_is_clipped = 542 bool render_pass_is_clipped =
544 !render_pass_scissor_in_draw_space.Contains(surface_rect_in_draw_space); 543 !render_pass_scissor_in_draw_space.Contains(surface_rect_in_draw_space);
545 544
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) { 662 gfx::Size DirectRenderer::RenderPassTextureSize(const RenderPass* render_pass) {
664 return render_pass->output_rect.size(); 663 return render_pass->output_rect.size();
665 } 664 }
666 665
667 void DirectRenderer::SetCurrentFrameForTesting(const DrawingFrame& frame) { 666 void DirectRenderer::SetCurrentFrameForTesting(const DrawingFrame& frame) {
668 current_frame_valid_ = true; 667 current_frame_valid_ = true;
669 current_frame_ = frame; 668 current_frame_ = frame;
670 } 669 }
671 670
672 } // namespace cc 671 } // namespace cc
OLDNEW
« no previous file with comments | « cc/output/direct_renderer.h ('k') | cc/output/gl_renderer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698