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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 16211002: Skip drawing unsupported layers in forced software mode (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase on r203584 Created 7 years, 6 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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/trees/layer_tree_host_impl.h" 5 #include "cc/trees/layer_tree_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/json/json_writer.h" 10 #include "base/json/json_writer.h"
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 render_surface_layer->filter().get()); 407 render_surface_layer->filter().get());
408 } 408 }
409 } 409 }
410 410
411 void LayerTreeHostImpl::FrameData::AppendRenderPass( 411 void LayerTreeHostImpl::FrameData::AppendRenderPass(
412 scoped_ptr<RenderPass> render_pass) { 412 scoped_ptr<RenderPass> render_pass) {
413 render_passes_by_id[render_pass->id] = render_pass.get(); 413 render_passes_by_id[render_pass->id] = render_pass.get();
414 render_passes.push_back(render_pass.Pass()); 414 render_passes.push_back(render_pass.Pass());
415 } 415 }
416 416
417 static DrawMode GetDrawMode(OutputSurface* output_surface) {
418 if (output_surface->ForcedDrawToSoftwareDevice()) {
419 return DRAW_MODE_RESOURCELESS_SOFTWARE;
420 } else if (output_surface->context3d()) {
421 return DRAW_MODE_HARDWARE;
422 } else {
423 DCHECK(output_surface->software_device());
424 return DRAW_MODE_SOFTWARE;
425 }
426 }
427
417 static void AppendQuadsForLayer(RenderPass* target_render_pass, 428 static void AppendQuadsForLayer(RenderPass* target_render_pass,
418 LayerImpl* layer, 429 LayerImpl* layer,
419 const OcclusionTrackerImpl& occlusion_tracker, 430 const OcclusionTrackerImpl& occlusion_tracker,
420 AppendQuadsData* append_quads_data) { 431 AppendQuadsData* append_quads_data) {
421 bool for_surface = false; 432 bool for_surface = false;
422 QuadCuller quad_culler(&target_render_pass->quad_list, 433 QuadCuller quad_culler(&target_render_pass->quad_list,
423 &target_render_pass->shared_quad_state_list, 434 &target_render_pass->shared_quad_state_list,
424 layer, 435 layer,
425 occlusion_tracker, 436 occlusion_tracker,
426 layer->ShowDebugBorders(), 437 layer->ShowDebugBorders(),
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 // still draw the frame. However when the layer being checkerboarded is moving 596 // still draw the frame. However when the layer being checkerboarded is moving
586 // due to an impl-animation, we drop the frame to avoid flashing due to the 597 // due to an impl-animation, we drop the frame to avoid flashing due to the
587 // texture suddenly appearing in the future. 598 // texture suddenly appearing in the future.
588 bool draw_frame = true; 599 bool draw_frame = true;
589 // When we have a copy request for a layer, we need to draw no matter 600 // When we have a copy request for a layer, we need to draw no matter
590 // what, as the layer may disappear after this frame. 601 // what, as the layer may disappear after this frame.
591 bool have_copy_request = false; 602 bool have_copy_request = false;
592 603
593 int layers_drawn = 0; 604 int layers_drawn = 0;
594 605
606 const DrawMode draw_mode = GetDrawMode(output_surface_.get());
607
595 LayerIteratorType end = 608 LayerIteratorType end =
596 LayerIteratorType::End(frame->render_surface_layer_list); 609 LayerIteratorType::End(frame->render_surface_layer_list);
597 for (LayerIteratorType it = 610 for (LayerIteratorType it =
598 LayerIteratorType::Begin(frame->render_surface_layer_list); 611 LayerIteratorType::Begin(frame->render_surface_layer_list);
599 it != end; 612 it != end;
600 ++it) { 613 ++it) {
601 RenderPass::Id target_render_pass_id = 614 RenderPass::Id target_render_pass_id =
602 it.target_render_surface_layer()->render_surface()->RenderPassId(); 615 it.target_render_surface_layer()->render_surface()->RenderPassId();
603 RenderPass* target_render_pass = 616 RenderPass* target_render_pass =
604 frame->render_passes_by_id[target_render_pass_id]; 617 frame->render_passes_by_id[target_render_pass_id];
605 618
606 bool prevent_occlusion = it.target_render_surface_layer()->HasCopyRequest(); 619 bool prevent_occlusion = it.target_render_surface_layer()->HasCopyRequest();
607 occlusion_tracker.EnterLayer(it, prevent_occlusion); 620 occlusion_tracker.EnterLayer(it, prevent_occlusion);
608 621
609 AppendQuadsData append_quads_data(target_render_pass->id); 622 AppendQuadsData append_quads_data(target_render_pass->id);
610 if (output_surface_->ForcedDrawToSoftwareDevice())
611 append_quads_data.allow_tile_draw_quads = false;
612 623
613 if (it.represents_target_render_surface()) { 624 if (it.represents_target_render_surface()) {
614 if (it->HasCopyRequest()) { 625 if (it->HasCopyRequest()) {
615 have_copy_request = true; 626 have_copy_request = true;
616 it->TakeCopyRequests(&target_render_pass->copy_requests); 627 it->TakeCopyRequests(&target_render_pass->copy_requests);
617 } 628 }
618 } else if (it.represents_contributing_render_surface()) { 629 } else if (it.represents_contributing_render_surface()) {
619 RenderPass::Id contributing_render_pass_id = 630 RenderPass::Id contributing_render_pass_id =
620 it->render_surface()->RenderPassId(); 631 it->render_surface()->RenderPassId();
621 RenderPass* contributing_render_pass = 632 RenderPass* contributing_render_pass =
(...skipping 10 matching lines...) Expand all
632 if (occlusion_tracker.Occluded( 643 if (occlusion_tracker.Occluded(
633 it->render_target(), 644 it->render_target(),
634 it->visible_content_rect(), 645 it->visible_content_rect(),
635 it->draw_transform(), 646 it->draw_transform(),
636 impl_draw_transform_is_unknown, 647 impl_draw_transform_is_unknown,
637 it->is_clipped(), 648 it->is_clipped(),
638 it->clip_rect(), 649 it->clip_rect(),
639 &has_occlusion_from_outside_target_surface)) { 650 &has_occlusion_from_outside_target_surface)) {
640 append_quads_data.had_occlusion_from_outside_target_surface |= 651 append_quads_data.had_occlusion_from_outside_target_surface |=
641 has_occlusion_from_outside_target_surface; 652 has_occlusion_from_outside_target_surface;
642 } else { 653 } else if (it->WillDraw(draw_mode, resource_provider_.get())) {
643 DCHECK_EQ(active_tree_, it->layer_tree_impl()); 654 DCHECK_EQ(active_tree_, it->layer_tree_impl());
644 it->WillDraw(resource_provider_.get()); 655
645 frame->will_draw_layers.push_back(*it); 656 frame->will_draw_layers.push_back(*it);
646 657
647 if (it->HasContributingDelegatedRenderPasses()) { 658 if (it->HasContributingDelegatedRenderPasses()) {
648 RenderPass::Id contributing_render_pass_id = 659 RenderPass::Id contributing_render_pass_id =
649 it->FirstContributingRenderPassId(); 660 it->FirstContributingRenderPassId();
650 while (frame->render_passes_by_id.find(contributing_render_pass_id) != 661 while (frame->render_passes_by_id.find(contributing_render_pass_id) !=
651 frame->render_passes_by_id.end()) { 662 frame->render_passes_by_id.end()) {
652 RenderPass* render_pass = 663 RenderPass* render_pass =
653 frame->render_passes_by_id[contributing_render_pass_id]; 664 frame->render_passes_by_id[contributing_render_pass_id];
654 665
(...skipping 1587 matching lines...) Expand 10 before | Expand all | Expand 10 after
2242 } 2253 }
2243 2254
2244 void LayerTreeHostImpl::SetDebugState(const LayerTreeDebugState& debug_state) { 2255 void LayerTreeHostImpl::SetDebugState(const LayerTreeDebugState& debug_state) {
2245 if (debug_state_.continuous_painting != debug_state.continuous_painting) 2256 if (debug_state_.continuous_painting != debug_state.continuous_painting)
2246 paint_time_counter_->ClearHistory(); 2257 paint_time_counter_->ClearHistory();
2247 2258
2248 debug_state_ = debug_state; 2259 debug_state_ = debug_state;
2249 } 2260 }
2250 2261
2251 } // namespace cc 2262 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698