| 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/quad_sink.h" | |
| 15 #include "cc/layers/render_pass_sink.h" | 14 #include "cc/layers/render_pass_sink.h" |
| 16 #include "cc/output/delegated_frame_data.h" | 15 #include "cc/output/delegated_frame_data.h" |
| 17 #include "cc/quads/render_pass_draw_quad.h" | 16 #include "cc/quads/render_pass_draw_quad.h" |
| 18 #include "cc/quads/solid_color_draw_quad.h" | 17 #include "cc/quads/solid_color_draw_quad.h" |
| 19 #include "cc/trees/layer_tree_impl.h" | 18 #include "cc/trees/layer_tree_impl.h" |
| 19 #include "cc/trees/occlusion_tracker.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 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 } | 249 } |
| 250 | 250 |
| 251 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, | 251 bool DelegatedRendererLayerImpl::WillDraw(DrawMode draw_mode, |
| 252 ResourceProvider* resource_provider) { | 252 ResourceProvider* resource_provider) { |
| 253 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) | 253 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) |
| 254 return false; | 254 return false; |
| 255 return LayerImpl::WillDraw(draw_mode, resource_provider); | 255 return LayerImpl::WillDraw(draw_mode, resource_provider); |
| 256 } | 256 } |
| 257 | 257 |
| 258 void DelegatedRendererLayerImpl::AppendQuads( | 258 void DelegatedRendererLayerImpl::AppendQuads( |
| 259 QuadSink* quad_sink, | 259 RenderPass* render_pass, |
| 260 const OcclusionTracker<LayerImpl>& occlusion_tracker, |
| 260 AppendQuadsData* append_quads_data) { | 261 AppendQuadsData* append_quads_data) { |
| 261 AppendRainbowDebugBorder(quad_sink, append_quads_data); | 262 AppendRainbowDebugBorder(render_pass, append_quads_data); |
| 262 | 263 |
| 263 // This list will be empty after a lost context until a new frame arrives. | 264 // This list will be empty after a lost context until a new frame arrives. |
| 264 if (render_passes_in_draw_order_.empty()) | 265 if (render_passes_in_draw_order_.empty()) |
| 265 return; | 266 return; |
| 266 | 267 |
| 267 RenderPass::Id target_render_pass_id = append_quads_data->render_pass_id; | 268 RenderPass::Id target_render_pass_id = append_quads_data->render_pass_id; |
| 268 | 269 |
| 269 const RenderPass* root_delegated_render_pass = | 270 const RenderPass* root_delegated_render_pass = |
| 270 render_passes_in_draw_order_.back(); | 271 render_passes_in_draw_order_.back(); |
| 271 | 272 |
| 272 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin()); | 273 DCHECK(root_delegated_render_pass->output_rect.origin().IsOrigin()); |
| 273 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); | 274 gfx::Size frame_size = root_delegated_render_pass->output_rect.size(); |
| 274 | 275 |
| 275 // If the index of the RenderPassId is 0, then it is a RenderPass generated | 276 // If the index of the RenderPassId is 0, then it is a RenderPass generated |
| 276 // for a layer in this compositor, not the delegating renderer. Then we want | 277 // for a layer in this compositor, not the delegating renderer. Then we want |
| 277 // to merge our root RenderPass with the target RenderPass. Otherwise, it is | 278 // to merge our root RenderPass with the target RenderPass. Otherwise, it is |
| 278 // some RenderPass which we added from the delegating renderer. | 279 // some RenderPass which we added from the delegating renderer. |
| 279 bool should_merge_root_render_pass_with_target = !target_render_pass_id.index; | 280 bool should_merge_root_render_pass_with_target = !target_render_pass_id.index; |
| 280 if (should_merge_root_render_pass_with_target) { | 281 if (should_merge_root_render_pass_with_target) { |
| 281 // Verify that the RenderPass we are appending to is created by our | 282 // Verify that the RenderPass we are appending to is created by our |
| 282 // render_target. | 283 // render_target. |
| 283 DCHECK(target_render_pass_id.layer_id == render_target()->id()); | 284 DCHECK(target_render_pass_id.layer_id == render_target()->id()); |
| 284 | 285 |
| 285 AppendRenderPassQuads( | 286 AppendRenderPassQuads(render_pass, |
| 286 quad_sink, append_quads_data, root_delegated_render_pass, frame_size); | 287 occlusion_tracker, |
| 288 append_quads_data, |
| 289 root_delegated_render_pass, |
| 290 frame_size); |
| 287 } else { | 291 } else { |
| 288 // Verify that the RenderPass we are appending to was created by us. | 292 // Verify that the RenderPass we are appending to was created by us. |
| 289 DCHECK(target_render_pass_id.layer_id == id()); | 293 DCHECK(target_render_pass_id.layer_id == id()); |
| 290 | 294 |
| 291 int render_pass_index = IdToIndex(target_render_pass_id.index); | 295 int render_pass_index = IdToIndex(target_render_pass_id.index); |
| 292 const RenderPass* delegated_render_pass = | 296 const RenderPass* delegated_render_pass = |
| 293 render_passes_in_draw_order_[render_pass_index]; | 297 render_passes_in_draw_order_[render_pass_index]; |
| 294 AppendRenderPassQuads( | 298 AppendRenderPassQuads(render_pass, |
| 295 quad_sink, append_quads_data, delegated_render_pass, frame_size); | 299 occlusion_tracker, |
| 300 append_quads_data, |
| 301 delegated_render_pass, |
| 302 frame_size); |
| 296 } | 303 } |
| 297 } | 304 } |
| 298 | 305 |
| 299 void DelegatedRendererLayerImpl::AppendRainbowDebugBorder( | 306 void DelegatedRendererLayerImpl::AppendRainbowDebugBorder( |
| 300 QuadSink* quad_sink, | 307 RenderPass* render_pass, |
| 301 AppendQuadsData* append_quads_data) { | 308 AppendQuadsData* append_quads_data) { |
| 302 if (!ShowDebugBorders()) | 309 if (!ShowDebugBorders()) |
| 303 return; | 310 return; |
| 304 | 311 |
| 305 SharedQuadState* shared_quad_state = quad_sink->CreateSharedQuadState(); | 312 SharedQuadState* shared_quad_state = |
| 313 render_pass->CreateAndAppendSharedQuadState(); |
| 306 PopulateSharedQuadState(shared_quad_state); | 314 PopulateSharedQuadState(shared_quad_state); |
| 307 | 315 |
| 308 SkColor color; | 316 SkColor color; |
| 309 float border_width; | 317 float border_width; |
| 310 GetDebugBorderProperties(&color, &border_width); | 318 GetDebugBorderProperties(&color, &border_width); |
| 311 | 319 |
| 312 SkColor colors[] = { | 320 SkColor colors[] = { |
| 313 0x80ff0000, // Red. | 321 0x80ff0000, // Red. |
| 314 0x80ffa500, // Orange. | 322 0x80ffa500, // Orange. |
| 315 0x80ffff00, // Yellow. | 323 0x80ffff00, // Yellow. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 342 border_width, | 350 border_width, |
| 343 height); | 351 height); |
| 344 | 352 |
| 345 if (top.IsEmpty() && left.IsEmpty()) | 353 if (top.IsEmpty() && left.IsEmpty()) |
| 346 break; | 354 break; |
| 347 | 355 |
| 348 if (!top.IsEmpty()) { | 356 if (!top.IsEmpty()) { |
| 349 scoped_ptr<SolidColorDrawQuad> top_quad = SolidColorDrawQuad::Create(); | 357 scoped_ptr<SolidColorDrawQuad> top_quad = SolidColorDrawQuad::Create(); |
| 350 top_quad->SetNew( | 358 top_quad->SetNew( |
| 351 shared_quad_state, top, top, colors[i % kNumColors], false); | 359 shared_quad_state, top, top, colors[i % kNumColors], false); |
| 352 quad_sink->Append(top_quad.PassAs<DrawQuad>()); | 360 render_pass->AppendDrawQuad(top_quad.PassAs<DrawQuad>()); |
| 353 | 361 |
| 354 scoped_ptr<SolidColorDrawQuad> bottom_quad = SolidColorDrawQuad::Create(); | 362 scoped_ptr<SolidColorDrawQuad> bottom_quad = SolidColorDrawQuad::Create(); |
| 355 bottom_quad->SetNew(shared_quad_state, | 363 bottom_quad->SetNew(shared_quad_state, |
| 356 bottom, | 364 bottom, |
| 357 bottom, | 365 bottom, |
| 358 colors[kNumColors - 1 - (i % kNumColors)], | 366 colors[kNumColors - 1 - (i % kNumColors)], |
| 359 false); | 367 false); |
| 360 quad_sink->Append(bottom_quad.PassAs<DrawQuad>()); | 368 render_pass->AppendDrawQuad(bottom_quad.PassAs<DrawQuad>()); |
| 361 } | 369 } |
| 362 if (!left.IsEmpty()) { | 370 if (!left.IsEmpty()) { |
| 363 scoped_ptr<SolidColorDrawQuad> left_quad = SolidColorDrawQuad::Create(); | 371 scoped_ptr<SolidColorDrawQuad> left_quad = SolidColorDrawQuad::Create(); |
| 364 left_quad->SetNew(shared_quad_state, | 372 left_quad->SetNew(shared_quad_state, |
| 365 left, | 373 left, |
| 366 left, | 374 left, |
| 367 colors[kNumColors - 1 - (i % kNumColors)], | 375 colors[kNumColors - 1 - (i % kNumColors)], |
| 368 false); | 376 false); |
| 369 quad_sink->Append(left_quad.PassAs<DrawQuad>()); | 377 render_pass->AppendDrawQuad(left_quad.PassAs<DrawQuad>()); |
| 370 | 378 |
| 371 scoped_ptr<SolidColorDrawQuad> right_quad = SolidColorDrawQuad::Create(); | 379 scoped_ptr<SolidColorDrawQuad> right_quad = SolidColorDrawQuad::Create(); |
| 372 right_quad->SetNew( | 380 right_quad->SetNew( |
| 373 shared_quad_state, right, right, colors[i % kNumColors], false); | 381 shared_quad_state, right, right, colors[i % kNumColors], false); |
| 374 quad_sink->Append(right_quad.PassAs<DrawQuad>()); | 382 render_pass->AppendDrawQuad(right_quad.PassAs<DrawQuad>()); |
| 375 } | 383 } |
| 376 } | 384 } |
| 377 } | 385 } |
| 378 | 386 |
| 379 void DelegatedRendererLayerImpl::AppendRenderPassQuads( | 387 void DelegatedRendererLayerImpl::AppendRenderPassQuads( |
| 380 QuadSink* quad_sink, | 388 RenderPass* render_pass, |
| 389 const OcclusionTracker<LayerImpl>& occlusion_tracker, |
| 381 AppendQuadsData* append_quads_data, | 390 AppendQuadsData* append_quads_data, |
| 382 const RenderPass* delegated_render_pass, | 391 const RenderPass* delegated_render_pass, |
| 383 const gfx::Size& frame_size) const { | 392 const gfx::Size& frame_size) const { |
| 384 | |
| 385 const SharedQuadState* delegated_shared_quad_state = NULL; | 393 const SharedQuadState* delegated_shared_quad_state = NULL; |
| 386 SharedQuadState* output_shared_quad_state = NULL; | 394 SharedQuadState* output_shared_quad_state = NULL; |
| 387 | 395 |
| 388 for (size_t i = 0; i < delegated_render_pass->quad_list.size(); ++i) { | 396 for (size_t i = 0; i < delegated_render_pass->quad_list.size(); ++i) { |
| 389 const DrawQuad* delegated_quad = delegated_render_pass->quad_list[i]; | 397 const DrawQuad* delegated_quad = delegated_render_pass->quad_list[i]; |
| 390 | 398 |
| 391 if (delegated_quad->shared_quad_state != delegated_shared_quad_state) { | 399 if (delegated_quad->shared_quad_state != delegated_shared_quad_state) { |
| 392 delegated_shared_quad_state = delegated_quad->shared_quad_state; | 400 delegated_shared_quad_state = delegated_quad->shared_quad_state; |
| 393 output_shared_quad_state = quad_sink->CreateSharedQuadState(); | 401 output_shared_quad_state = render_pass->CreateAndAppendSharedQuadState(); |
| 394 output_shared_quad_state->CopyFrom(delegated_shared_quad_state); | 402 output_shared_quad_state->CopyFrom(delegated_shared_quad_state); |
| 395 | 403 |
| 396 bool is_root_delegated_render_pass = | 404 bool is_root_delegated_render_pass = |
| 397 delegated_render_pass == render_passes_in_draw_order_.back(); | 405 delegated_render_pass == render_passes_in_draw_order_.back(); |
| 398 if (is_root_delegated_render_pass) { | 406 if (is_root_delegated_render_pass) { |
| 399 gfx::Transform delegated_frame_to_target_transform = draw_transform(); | 407 gfx::Transform delegated_frame_to_target_transform = draw_transform(); |
| 400 delegated_frame_to_target_transform.Scale(inverse_device_scale_factor_, | 408 delegated_frame_to_target_transform.Scale(inverse_device_scale_factor_, |
| 401 inverse_device_scale_factor_); | 409 inverse_device_scale_factor_); |
| 402 | 410 |
| 403 output_shared_quad_state->content_to_target_transform.ConcatTransform( | 411 output_shared_quad_state->content_to_target_transform.ConcatTransform( |
| (...skipping 16 matching lines...) Expand all Loading... |
| 420 } | 428 } |
| 421 output_shared_quad_state->clip_rect = clip_rect; | 429 output_shared_quad_state->clip_rect = clip_rect; |
| 422 output_shared_quad_state->is_clipped = true; | 430 output_shared_quad_state->is_clipped = true; |
| 423 } | 431 } |
| 424 | 432 |
| 425 output_shared_quad_state->opacity *= draw_opacity(); | 433 output_shared_quad_state->opacity *= draw_opacity(); |
| 426 } | 434 } |
| 427 } | 435 } |
| 428 DCHECK(output_shared_quad_state); | 436 DCHECK(output_shared_quad_state); |
| 429 | 437 |
| 430 gfx::Rect quad_visible_rect = quad_sink->UnoccludedContentRect( | 438 gfx::Rect quad_visible_rect = occlusion_tracker.UnoccludedContentRect( |
| 431 delegated_quad->visible_rect, | 439 delegated_quad->visible_rect, |
| 432 output_shared_quad_state->content_to_target_transform); | 440 output_shared_quad_state->content_to_target_transform); |
| 433 if (quad_visible_rect.IsEmpty()) | 441 if (quad_visible_rect.IsEmpty()) |
| 434 continue; | 442 continue; |
| 435 | 443 |
| 436 scoped_ptr<DrawQuad> output_quad; | 444 scoped_ptr<DrawQuad> output_quad; |
| 437 if (delegated_quad->material != DrawQuad::RENDER_PASS) { | 445 if (delegated_quad->material != DrawQuad::RENDER_PASS) { |
| 438 output_quad = delegated_quad->Copy(output_shared_quad_state); | 446 output_quad = delegated_quad->Copy(output_shared_quad_state); |
| 439 output_quad->visible_rect = quad_visible_rect; | 447 output_quad->visible_rect = quad_visible_rect; |
| 440 } else { | 448 } else { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 453 append_quads_data->render_pass_id); | 461 append_quads_data->render_pass_id); |
| 454 | 462 |
| 455 output_quad = RenderPassDrawQuad::MaterialCast(delegated_quad)->Copy( | 463 output_quad = RenderPassDrawQuad::MaterialCast(delegated_quad)->Copy( |
| 456 output_shared_quad_state, | 464 output_shared_quad_state, |
| 457 output_contributing_render_pass_id).PassAs<DrawQuad>(); | 465 output_contributing_render_pass_id).PassAs<DrawQuad>(); |
| 458 output_quad->visible_rect = quad_visible_rect; | 466 output_quad->visible_rect = quad_visible_rect; |
| 459 } | 467 } |
| 460 } | 468 } |
| 461 | 469 |
| 462 if (output_quad) | 470 if (output_quad) |
| 463 quad_sink->Append(output_quad.Pass()); | 471 render_pass->AppendDrawQuad(output_quad.Pass()); |
| 464 } | 472 } |
| 465 } | 473 } |
| 466 | 474 |
| 467 const char* DelegatedRendererLayerImpl::LayerTypeAsString() const { | 475 const char* DelegatedRendererLayerImpl::LayerTypeAsString() const { |
| 468 return "cc::DelegatedRendererLayerImpl"; | 476 return "cc::DelegatedRendererLayerImpl"; |
| 469 } | 477 } |
| 470 | 478 |
| 471 void DelegatedRendererLayerImpl::ClearChildId() { | 479 void DelegatedRendererLayerImpl::ClearChildId() { |
| 472 if (!child_id_) | 480 if (!child_id_) |
| 473 return; | 481 return; |
| 474 | 482 |
| 475 if (own_child_id_) { | 483 if (own_child_id_) { |
| 476 ResourceProvider* provider = layer_tree_impl()->resource_provider(); | 484 ResourceProvider* provider = layer_tree_impl()->resource_provider(); |
| 477 provider->DestroyChild(child_id_); | 485 provider->DestroyChild(child_id_); |
| 478 } | 486 } |
| 479 | 487 |
| 480 resources_.clear(); | 488 resources_.clear(); |
| 481 child_id_ = 0; | 489 child_id_ = 0; |
| 482 } | 490 } |
| 483 | 491 |
| 484 } // namespace cc | 492 } // namespace cc |
| OLD | NEW |