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

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

Issue 376683004: Pass resourceless software mode in BeginFrameArgs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix accidental header modification Created 6 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 | 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 #include <limits> 8 #include <limits>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 memory_history_(MemoryHistory::Create()), 237 memory_history_(MemoryHistory::Create()),
238 debug_rect_history_(DebugRectHistory::Create()), 238 debug_rect_history_(DebugRectHistory::Create()),
239 texture_mailbox_deleter_(new TextureMailboxDeleter( 239 texture_mailbox_deleter_(new TextureMailboxDeleter(
240 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 240 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
241 : proxy_->MainThreadTaskRunner())), 241 : proxy_->MainThreadTaskRunner())),
242 max_memory_needed_bytes_(0), 242 max_memory_needed_bytes_(0),
243 zero_budget_(false), 243 zero_budget_(false),
244 device_scale_factor_(1.f), 244 device_scale_factor_(1.f),
245 overhang_ui_resource_id_(0), 245 overhang_ui_resource_id_(0),
246 overdraw_bottom_height_(0.f), 246 overdraw_bottom_height_(0.f),
247 device_viewport_valid_for_tile_management_(true), 247 resourceless_software_draw_(false),
248 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), 248 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()),
249 animation_registrar_(AnimationRegistrar::Create()), 249 animation_registrar_(AnimationRegistrar::Create()),
250 rendering_stats_instrumentation_(rendering_stats_instrumentation), 250 rendering_stats_instrumentation_(rendering_stats_instrumentation),
251 micro_benchmark_controller_(this), 251 micro_benchmark_controller_(this),
252 need_to_update_visible_tiles_before_draw_(false), 252 need_to_update_visible_tiles_before_draw_(false),
253 #if DCHECK_IS_ON 253 #if DCHECK_IS_ON
254 did_lose_called_(false), 254 did_lose_called_(false),
255 #endif 255 #endif
256 shared_bitmap_manager_(manager), 256 shared_bitmap_manager_(manager),
257 id_(id), 257 id_(id),
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 } 542 }
543 return value.PassAs<base::Value>(); 543 return value.PassAs<base::Value>();
544 } 544 }
545 545
546 void LayerTreeHostImpl::FrameData::AppendRenderPass( 546 void LayerTreeHostImpl::FrameData::AppendRenderPass(
547 scoped_ptr<RenderPass> render_pass) { 547 scoped_ptr<RenderPass> render_pass) {
548 render_passes_by_id[render_pass->id] = render_pass.get(); 548 render_passes_by_id[render_pass->id] = render_pass.get();
549 render_passes.push_back(render_pass.Pass()); 549 render_passes.push_back(render_pass.Pass());
550 } 550 }
551 551
552 static DrawMode GetDrawMode(OutputSurface* output_surface) { 552 DrawMode LayerTreeHostImpl::GetDrawMode() const {
553 if (output_surface->ForcedDrawToSoftwareDevice()) { 553 if (resourceless_software_draw_) {
554 return DRAW_MODE_RESOURCELESS_SOFTWARE; 554 return DRAW_MODE_RESOURCELESS_SOFTWARE;
555 } else if (output_surface->context_provider()) { 555 } else if (output_surface_->context_provider()) {
556 return DRAW_MODE_HARDWARE; 556 return DRAW_MODE_HARDWARE;
557 } else { 557 } else {
558 DCHECK_EQ(!output_surface->software_device(), 558 DCHECK_EQ(!output_surface_->software_device(),
559 output_surface->capabilities().delegated_rendering && 559 output_surface_->capabilities().delegated_rendering &&
560 !output_surface->capabilities().deferred_gl_initialization) 560 !output_surface_->capabilities().deferred_gl_initialization)
561 << output_surface->capabilities().delegated_rendering << " " 561 << output_surface_->capabilities().delegated_rendering << " "
562 << output_surface->capabilities().deferred_gl_initialization; 562 << output_surface_->capabilities().deferred_gl_initialization;
563 return DRAW_MODE_SOFTWARE; 563 return DRAW_MODE_SOFTWARE;
564 } 564 }
565 } 565 }
566 566
567 static void AppendQuadsForLayer( 567 static void AppendQuadsForLayer(
568 RenderPass* target_render_pass, 568 RenderPass* target_render_pass,
569 LayerImpl* layer, 569 LayerImpl* layer,
570 const OcclusionTracker<LayerImpl>& occlusion_tracker, 570 const OcclusionTracker<LayerImpl>& occlusion_tracker,
571 AppendQuadsData* append_quads_data) { 571 AppendQuadsData* append_quads_data) {
572 layer->AppendQuads(target_render_pass, occlusion_tracker, append_quads_data); 572 layer->AppendQuads(target_render_pass, occlusion_tracker, append_quads_data);
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 // still draw the frame. However when the layer being checkerboarded is moving 771 // still draw the frame. However when the layer being checkerboarded is moving
772 // due to an impl-animation, we drop the frame to avoid flashing due to the 772 // due to an impl-animation, we drop the frame to avoid flashing due to the
773 // texture suddenly appearing in the future. 773 // texture suddenly appearing in the future.
774 DrawResult draw_result = DRAW_SUCCESS; 774 DrawResult draw_result = DRAW_SUCCESS;
775 // When we have a copy request for a layer, we need to draw no matter 775 // When we have a copy request for a layer, we need to draw no matter
776 // what, as the layer may disappear after this frame. 776 // what, as the layer may disappear after this frame.
777 bool have_copy_request = false; 777 bool have_copy_request = false;
778 778
779 int layers_drawn = 0; 779 int layers_drawn = 0;
780 780
781 const DrawMode draw_mode = GetDrawMode(output_surface_.get()); 781 const DrawMode draw_mode = GetDrawMode();
782 782
783 LayerIteratorType end = 783 LayerIteratorType end =
784 LayerIteratorType::End(frame->render_surface_layer_list); 784 LayerIteratorType::End(frame->render_surface_layer_list);
785 for (LayerIteratorType it = 785 for (LayerIteratorType it =
786 LayerIteratorType::Begin(frame->render_surface_layer_list); 786 LayerIteratorType::Begin(frame->render_surface_layer_list);
787 it != end; 787 it != end;
788 ++it) { 788 ++it) {
789 RenderPass::Id target_render_pass_id = 789 RenderPass::Id target_render_pass_id =
790 it.target_render_surface_layer()->render_surface()->RenderPassId(); 790 it.target_render_surface_layer()->render_surface()->RenderPassId();
791 RenderPass* target_render_pass = 791 RenderPass* target_render_pass =
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back(); 908 LayerImpl* layer = active_tree_->LayersWithCopyOutputRequest().back();
909 layer->TakeCopyRequestsAndTransformToTarget(&requests_to_abort); 909 layer->TakeCopyRequestsAndTransformToTarget(&requests_to_abort);
910 } 910 }
911 for (size_t i = 0; i < requests_to_abort.size(); ++i) 911 for (size_t i = 0; i < requests_to_abort.size(); ++i)
912 requests_to_abort[i]->SendEmptyResult(); 912 requests_to_abort[i]->SendEmptyResult();
913 913
914 // If we're making a frame to draw, it better have at least one render pass. 914 // If we're making a frame to draw, it better have at least one render pass.
915 DCHECK(!frame->render_passes.empty()); 915 DCHECK(!frame->render_passes.empty());
916 916
917 // Should only have one render pass in resourceless software mode. 917 // Should only have one render pass in resourceless software mode.
918 if (output_surface_->ForcedDrawToSoftwareDevice()) 918 DCHECK(draw_mode != DRAW_MODE_RESOURCELESS_SOFTWARE ||
919 DCHECK_EQ(1u, frame->render_passes.size()); 919 frame->render_passes.size() == 1u)
920 << frame->render_passes.size();
920 921
921 return draw_result; 922 return draw_result;
922 } 923 }
923 924
924 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { 925 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() {
925 if (input_handler_client_) 926 if (input_handler_client_)
926 input_handler_client_->MainThreadHasStoppedFlinging(); 927 input_handler_client_->MainThreadHasStoppedFlinging();
927 } 928 }
928 929
929 void LayerTreeHostImpl::UpdateBackgroundAnimateTicking( 930 void LayerTreeHostImpl::UpdateBackgroundAnimateTicking(
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
1298 } 1299 }
1299 1300
1300 if (needs_commit) 1301 if (needs_commit)
1301 client_->SetNeedsCommitOnImplThread(); 1302 client_->SetNeedsCommitOnImplThread();
1302 } 1303 }
1303 1304
1304 void LayerTreeHostImpl::SetExternalDrawConstraints( 1305 void LayerTreeHostImpl::SetExternalDrawConstraints(
1305 const gfx::Transform& transform, 1306 const gfx::Transform& transform,
1306 const gfx::Rect& viewport, 1307 const gfx::Rect& viewport,
1307 const gfx::Rect& clip, 1308 const gfx::Rect& clip,
1308 bool valid_for_tile_management) { 1309 bool resourceless_software_draw) {
1309 if (external_transform_ != transform || external_viewport_ != viewport) { 1310 if (external_transform_ != transform || external_viewport_ != viewport ||
1311 resourceless_software_draw_ != resourceless_software_draw) {
1310 active_tree_->set_needs_update_draw_properties(); 1312 active_tree_->set_needs_update_draw_properties();
1311 } 1313 }
1312 1314
1313 external_transform_ = transform; 1315 external_transform_ = transform;
1314 external_viewport_ = viewport; 1316 external_viewport_ = viewport;
1315 external_clip_ = clip; 1317 external_clip_ = clip;
1316 device_viewport_valid_for_tile_management_ = valid_for_tile_management; 1318 resourceless_software_draw_ = resourceless_software_draw;
1317 } 1319 }
1318 1320
1319 void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { 1321 void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) {
1320 if (damage_rect.IsEmpty()) 1322 if (damage_rect.IsEmpty())
1321 return; 1323 return;
1322 NotifySwapPromiseMonitorsOfSetNeedsRedraw(); 1324 NotifySwapPromiseMonitorsOfSetNeedsRedraw();
1323 client_->SetNeedsRedrawRectOnImplThread(damage_rect); 1325 client_->SetNeedsRedrawRectOnImplThread(damage_rect);
1324 } 1326 }
1325 1327
1326 void LayerTreeHostImpl::BeginFrame(const BeginFrameArgs& args) { 1328 void LayerTreeHostImpl::BeginFrame(const BeginFrameArgs& args) {
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1449 TRACE_EVENT0("cc", "DrawLayers.FrameViewerTracing"); 1451 TRACE_EVENT0("cc", "DrawLayers.FrameViewerTracing");
1450 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 1452 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
1451 TRACE_DISABLED_BY_DEFAULT("cc.debug") "," 1453 TRACE_DISABLED_BY_DEFAULT("cc.debug") ","
1452 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads") "," 1454 TRACE_DISABLED_BY_DEFAULT("cc.debug.quads") ","
1453 TRACE_DISABLED_BY_DEFAULT("devtools.timeline.layers"), 1455 TRACE_DISABLED_BY_DEFAULT("devtools.timeline.layers"),
1454 "cc::LayerTreeHostImpl", 1456 "cc::LayerTreeHostImpl",
1455 id_, 1457 id_,
1456 TracedValue::FromValue(AsValueWithFrame(frame).release())); 1458 TracedValue::FromValue(AsValueWithFrame(frame).release()));
1457 } 1459 }
1458 1460
1461 const DrawMode draw_mode = GetDrawMode();
1462
1459 // Because the contents of the HUD depend on everything else in the frame, the 1463 // Because the contents of the HUD depend on everything else in the frame, the
1460 // contents of its texture are updated as the last thing before the frame is 1464 // contents of its texture are updated as the last thing before the frame is
1461 // drawn. 1465 // drawn.
1462 if (active_tree_->hud_layer()) { 1466 if (active_tree_->hud_layer()) {
1463 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); 1467 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture");
1464 active_tree_->hud_layer()->UpdateHudTexture( 1468 active_tree_->hud_layer()->UpdateHudTexture(draw_mode,
1465 GetDrawMode(output_surface_.get()), resource_provider_.get()); 1469 resource_provider_.get());
1466 } 1470 }
1467 1471
1468 if (output_surface_->ForcedDrawToSoftwareDevice()) { 1472 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) {
1469 bool disable_picture_quad_image_filtering = 1473 bool disable_picture_quad_image_filtering =
1470 IsCurrentlyScrolling() || needs_animate_layers(); 1474 IsCurrentlyScrolling() || needs_animate_layers();
1471 1475
1472 scoped_ptr<SoftwareRenderer> temp_software_renderer = 1476 scoped_ptr<SoftwareRenderer> temp_software_renderer =
1473 SoftwareRenderer::Create(this, &settings_, output_surface_.get(), NULL); 1477 SoftwareRenderer::Create(this, &settings_, output_surface_.get(), NULL);
1474 temp_software_renderer->DrawFrame(&frame->render_passes, 1478 temp_software_renderer->DrawFrame(&frame->render_passes,
1475 device_scale_factor_, 1479 device_scale_factor_,
1476 DeviceViewport(), 1480 DeviceViewport(),
1477 DeviceClip(), 1481 DeviceClip(),
1478 disable_picture_quad_image_filtering); 1482 disable_picture_quad_image_filtering);
(...skipping 1673 matching lines...) Expand 10 before | Expand all | Expand 10 after
3152 } 3156 }
3153 3157
3154 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3158 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3155 std::vector<PictureLayerImpl*>::iterator it = 3159 std::vector<PictureLayerImpl*>::iterator it =
3156 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3160 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3157 DCHECK(it != picture_layers_.end()); 3161 DCHECK(it != picture_layers_.end());
3158 picture_layers_.erase(it); 3162 picture_layers_.erase(it);
3159 } 3163 }
3160 3164
3161 } // namespace cc 3165 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698