| OLD | NEW |
| 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/layers/delegated_renderer_layer_impl.h" | 5 #include "cc/layers/delegated_renderer_layer_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
| 12 #include "cc/base/math_util.h" | 12 #include "cc/base/math_util.h" |
| 13 #include "cc/layers/append_quads_data.h" | 13 #include "cc/layers/append_quads_data.h" |
| 14 #include "cc/layers/render_pass_sink.h" | 14 #include "cc/layers/render_pass_sink.h" |
| 15 #include "cc/output/delegated_frame_data.h" | 15 #include "cc/output/delegated_frame_data.h" |
| 16 #include "cc/quads/render_pass_draw_quad.h" | 16 #include "cc/quads/render_pass_draw_quad.h" |
| 17 #include "cc/quads/solid_color_draw_quad.h" | 17 #include "cc/quads/solid_color_draw_quad.h" |
| 18 #include "cc/trees/layer_tree_impl.h" | 18 #include "cc/trees/layer_tree_impl.h" |
| 19 #include "cc/trees/occlusion_tracker.h" | 19 #include "cc/trees/occlusion.h" |
| 20 | 20 |
| 21 namespace cc { | 21 namespace cc { |
| 22 | 22 |
| 23 DelegatedRendererLayerImpl::DelegatedRendererLayerImpl(LayerTreeImpl* tree_impl, | 23 DelegatedRendererLayerImpl::DelegatedRendererLayerImpl(LayerTreeImpl* tree_impl, |
| 24 int id) | 24 int id) |
| 25 : LayerImpl(tree_impl, id), | 25 : LayerImpl(tree_impl, id), |
| 26 have_render_passes_to_push_(false), | 26 have_render_passes_to_push_(false), |
| 27 inverse_device_scale_factor_(1.0f), | 27 inverse_device_scale_factor_(1.0f), |
| 28 child_id_(0), | 28 child_id_(0), |
| 29 own_child_id_(false) { | 29 own_child_id_(false) { |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 | 247 |
| 248 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, | 248 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, |
| 249 ResourceProvider* resource_provider) { | 249 ResourceProvider* resource_provider) { |
| 250 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) | 250 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) |
| 251 return false; | 251 return false; |
| 252 return LayerImpl::WillDraw(draw_mode, resource_provider); | 252 return LayerImpl::WillDraw(draw_mode, resource_provider); |
| 253 } | 253 } |
| 254 | 254 |
| 255 void DelegatedRendererLayerImpl::AppendQuads( | 255 void DelegatedRendererLayerImpl::AppendQuads( |
| 256 RenderPass* render_pass, | 256 RenderPass* render_pass, |
| 257 const OcclusionTracker<LayerImpl>& occlusion_tracker, | 257 const Occlusion& occlusion_in_content_space, |
| 258 AppendQuadsData* append_quads_data) { | 258 AppendQuadsData* append_quads_data) { |
| 259 AppendRainbowDebugBorder(render_pass, append_quads_data); | 259 AppendRainbowDebugBorder(render_pass, append_quads_data); |
| 260 | 260 |
| 261 // This list will be empty after a lost context until a new frame arrives. | 261 // This list will be empty after a lost context until a new frame arrives. |
| 262 if (render_passes_in_draw_order_.empty()) | 262 if (render_passes_in_draw_order_.empty()) |
| 263 return; | 263 return; |
| 264 | 264 |
| 265 RenderPassId target_render_pass_id = append_quads_data->render_pass_id; | 265 RenderPassId target_render_pass_id = append_quads_data->render_pass_id; |
| 266 | 266 |
| 267 const RenderPass* root_delegated_render_pass = | 267 const RenderPass* root_delegated_render_pass = |
| 268 render_passes_in_draw_order_.back(); | 268 render_passes_in_draw_order_.back(); |
| 269 | 269 |
| 270 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin()); | 270 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin()); |
| 271 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); | 271 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); |
| 272 | 272 |
| 273 // If the index of the RenderPassId is 0, then it is a RenderPass generated | 273 // If the index of the RenderPassId is 0, then it is a RenderPass generated |
| 274 // for a layer in this compositor, not the delegating renderer. Then we want | 274 // for a layer in this compositor, not the delegating renderer. Then we want |
| 275 // to merge our root RenderPass with the target RenderPass. Otherwise, it is | 275 // to merge our root RenderPass with the target RenderPass. Otherwise, it is |
| 276 // some RenderPass which we added from the delegating renderer. | 276 // some RenderPass which we added from the delegating renderer. |
| 277 bool should_merge_root_render_pass_with_target = !target_render_pass_id.index; | 277 bool should_merge_root_render_pass_with_target = !target_render_pass_id.index; |
| 278 if (should_merge_root_render_pass_with_target) { | 278 if (should_merge_root_render_pass_with_target) { |
| 279 // Verify that the RenderPass we are appending to is created by our | 279 // Verify that the RenderPass we are appending to is created by our |
| 280 // render_target. | 280 // render_target. |
| 281 DCHECK(target_render_pass_id.layer_id == render_target()->id()); | 281 DCHECK(target_render_pass_id.layer_id == render_target()->id()); |
| 282 | 282 |
| 283 AppendRenderPassQuads(render_pass, | 283 AppendRenderPassQuads(render_pass, |
| 284 occlusion_tracker, | 284 occlusion_in_content_space, |
| 285 append_quads_data, | 285 append_quads_data, |
| 286 root_delegated_render_pass, | 286 root_delegated_render_pass, |
| 287 frame_size); | 287 frame_size); |
| 288 } else { | 288 } else { |
| 289 // Verify that the RenderPass we are appending to was created by us. | 289 // Verify that the RenderPass we are appending to was created by us. |
| 290 DCHECK(target_render_pass_id.layer_id == id()); | 290 DCHECK(target_render_pass_id.layer_id == id()); |
| 291 | 291 |
| 292 int render_pass_index = IdToIndex(target_render_pass_id.index); | 292 int render_pass_index = IdToIndex(target_render_pass_id.index); |
| 293 const RenderPass* delegated_render_pass = | 293 const RenderPass* delegated_render_pass = |
| 294 render_passes_in_draw_order_[render_pass_index]; | 294 render_passes_in_draw_order_[render_pass_index]; |
| 295 AppendRenderPassQuads(render_pass, | 295 AppendRenderPassQuads(render_pass, |
| 296 occlusion_tracker, | 296 occlusion_in_content_space, |
| 297 append_quads_data, | 297 append_quads_data, |
| 298 delegated_render_pass, | 298 delegated_render_pass, |
| 299 frame_size); | 299 frame_size); |
| 300 } | 300 } |
| 301 } | 301 } |
| 302 | 302 |
| 303 void DelegatedRendererLayerImpl::AppendRainbowDebugBorder( | 303 void DelegatedRendererLayerImpl::AppendRainbowDebugBorder( |
| 304 RenderPass* render_pass, | 304 RenderPass* render_pass, |
| 305 AppendQuadsData* append_quads_data) { | 305 AppendQuadsData* append_quads_data) { |
| 306 if (!ShowDebugBorders()) | 306 if (!ShowDebugBorders()) |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 SolidColorDrawQuad* right_quad = | 376 SolidColorDrawQuad* right_quad = |
| 377 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); | 377 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); |
| 378 right_quad->SetNew( | 378 right_quad->SetNew( |
| 379 shared_quad_state, right, right, colors[i % kNumColors], false); | 379 shared_quad_state, right, right, colors[i % kNumColors], false); |
| 380 } | 380 } |
| 381 } | 381 } |
| 382 } | 382 } |
| 383 | 383 |
| 384 void DelegatedRendererLayerImpl::AppendRenderPassQuads( | 384 void DelegatedRendererLayerImpl::AppendRenderPassQuads( |
| 385 RenderPass* render_pass, | 385 RenderPass* render_pass, |
| 386 const OcclusionTracker<LayerImpl>& occlusion_tracker, | 386 const Occlusion& occlusion_in_content_space, |
| 387 AppendQuadsData* append_quads_data, | 387 AppendQuadsData* append_quads_data, |
| 388 const RenderPass* delegated_render_pass, | 388 const RenderPass* delegated_render_pass, |
| 389 const gfx::Size& frame_size) const { | 389 const gfx::Size& frame_size) const { |
| 390 const SharedQuadState* delegated_shared_quad_state = NULL; | 390 const SharedQuadState* delegated_shared_quad_state = NULL; |
| 391 SharedQuadState* output_shared_quad_state = NULL; | 391 SharedQuadState* output_shared_quad_state = NULL; |
| 392 | 392 |
| 393 for (const auto& delegated_quad : delegated_render_pass->quad_list) { | 393 for (const auto& delegated_quad : delegated_render_pass->quad_list) { |
| 394 bool is_root_delegated_render_pass = | 394 bool is_root_delegated_render_pass = |
| 395 delegated_render_pass == render_passes_in_draw_order_.back(); | 395 delegated_render_pass == render_passes_in_draw_order_.back(); |
| 396 | 396 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 DCHECK(output_shared_quad_state); | 432 DCHECK(output_shared_quad_state); |
| 433 | 433 |
| 434 gfx::Transform quad_content_to_delegated_target_space = | 434 gfx::Transform quad_content_to_delegated_target_space = |
| 435 output_shared_quad_state->content_to_target_transform; | 435 output_shared_quad_state->content_to_target_transform; |
| 436 if (!is_root_delegated_render_pass) { | 436 if (!is_root_delegated_render_pass) { |
| 437 quad_content_to_delegated_target_space.ConcatTransform( | 437 quad_content_to_delegated_target_space.ConcatTransform( |
| 438 delegated_render_pass->transform_to_root_target); | 438 delegated_render_pass->transform_to_root_target); |
| 439 quad_content_to_delegated_target_space.ConcatTransform(draw_transform()); | 439 quad_content_to_delegated_target_space.ConcatTransform(draw_transform()); |
| 440 } | 440 } |
| 441 | 441 |
| 442 Occlusion occlusion_in_quad_space = |
| 443 occlusion_in_content_space.GetOcclusionWithGivenDrawTransform( |
| 444 quad_content_to_delegated_target_space); |
| 445 |
| 442 gfx::Rect quad_visible_rect = | 446 gfx::Rect quad_visible_rect = |
| 443 occlusion_tracker.GetCurrentOcclusionForLayer( | 447 occlusion_in_quad_space.GetUnoccludedContentRect( |
| 444 quad_content_to_delegated_target_space) | 448 delegated_quad.visible_rect); |
| 445 .GetUnoccludedContentRect(delegated_quad.visible_rect); | |
| 446 | 449 |
| 447 if (quad_visible_rect.IsEmpty()) | 450 if (quad_visible_rect.IsEmpty()) |
| 448 continue; | 451 continue; |
| 449 | 452 |
| 450 if (delegated_quad.material != DrawQuad::RENDER_PASS) { | 453 if (delegated_quad.material != DrawQuad::RENDER_PASS) { |
| 451 DrawQuad* output_quad = render_pass->CopyFromAndAppendDrawQuad( | 454 DrawQuad* output_quad = render_pass->CopyFromAndAppendDrawQuad( |
| 452 &delegated_quad, output_shared_quad_state); | 455 &delegated_quad, output_shared_quad_state); |
| 453 output_quad->visible_rect = quad_visible_rect; | 456 output_quad->visible_rect = quad_visible_rect; |
| 454 } else { | 457 } else { |
| 455 RenderPassId delegated_contributing_render_pass_id = | 458 RenderPassId delegated_contributing_render_pass_id = |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 if (own_child_id_) { | 491 if (own_child_id_) { |
| 489 ResourceProvider* provider = layer_tree_impl()->resource_provider(); | 492 ResourceProvider* provider = layer_tree_impl()->resource_provider(); |
| 490 provider->DestroyChild(child_id_); | 493 provider->DestroyChild(child_id_); |
| 491 } | 494 } |
| 492 | 495 |
| 493 resources_.clear(); | 496 resources_.clear(); |
| 494 child_id_ = 0; | 497 child_id_ = 0; |
| 495 } | 498 } |
| 496 | 499 |
| 497 } // namespace cc | 500 } // namespace cc |
| OLD | NEW |