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/delegated_renderer_layer_impl.h" | 5 #include "cc/delegated_renderer_layer_impl.h" |
6 | 6 |
7 #include "cc/append_quads_data.h" | 7 #include "cc/append_quads_data.h" |
8 #include "cc/layer_tree_host_impl.h" | 8 #include "cc/layer_tree_host_impl.h" |
9 #include "cc/layer_tree_impl.h" | 9 #include "cc/layer_tree_impl.h" |
10 #include "cc/quad_sink.h" | 10 #include "cc/quad_sink.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 gfx::Transform transform; | 81 gfx::Transform transform; |
82 transform.Translate(1, 1); | 82 transform.Translate(1, 1); |
83 delegatedRendererLayer->setTransform(transform); | 83 delegatedRendererLayer->setTransform(transform); |
84 | 84 |
85 ScopedPtrVector<RenderPass> delegatedRenderPasses; | 85 ScopedPtrVector<RenderPass> delegatedRenderPasses; |
86 TestRenderPass* pass1 = addRenderPass(delegatedRenderPasses, RenderPass:
:Id(9, 6), gfx::Rect(6, 6, 6, 6), gfx::Transform()); | 86 TestRenderPass* pass1 = addRenderPass(delegatedRenderPasses, RenderPass:
:Id(9, 6), gfx::Rect(6, 6, 6, 6), gfx::Transform()); |
87 addQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u); | 87 addQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u); |
88 TestRenderPass* pass2 = addRenderPass(delegatedRenderPasses, RenderPass:
:Id(9, 7), gfx::Rect(7, 7, 7, 7), gfx::Transform()); | 88 TestRenderPass* pass2 = addRenderPass(delegatedRenderPasses, RenderPass:
:Id(9, 7), gfx::Rect(7, 7, 7, 7), gfx::Transform()); |
89 addQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u); | 89 addQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u); |
90 addRenderPassQuad(pass2, pass1); | 90 addRenderPassQuad(pass2, pass1); |
91 TestRenderPass* pass3 = addRenderPass(delegatedRenderPasses, RenderPass:
:Id(9, 8), gfx::Rect(8, 8, 8, 8), gfx::Transform()); | 91 TestRenderPass* pass3 = addRenderPass(delegatedRenderPasses, RenderPass:
:Id(9, 8), gfx::Rect(0, 0, 8, 8), gfx::Transform()); |
92 addRenderPassQuad(pass3, pass2); | 92 addRenderPassQuad(pass3, pass2); |
93 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses); | 93 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses); |
94 | 94 |
95 // The RenderPasses should be taken by the layer. | 95 // The RenderPasses should be taken by the layer. |
96 EXPECT_EQ(0u, delegatedRenderPasses.size()); | 96 EXPECT_EQ(0u, delegatedRenderPasses.size()); |
97 | 97 |
98 m_rootLayerPtr = rootLayer.get(); | 98 m_rootLayerPtr = rootLayer.get(); |
99 m_layerBeforePtr = layerBefore.get(); | 99 m_layerBeforePtr = layerBefore.get(); |
100 m_layerAfterPtr = layerAfter.get(); | 100 m_layerAfterPtr = layerAfter.get(); |
101 m_delegatedRendererLayerPtr = delegatedRendererLayer.get(); | 101 m_delegatedRendererLayerPtr = delegatedRendererLayer.get(); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 TEST_F(DelegatedRendererLayerImplTestSimple, QuadsFromRootRenderPassAreModifiedF
orTheTarget) | 203 TEST_F(DelegatedRendererLayerImplTestSimple, QuadsFromRootRenderPassAreModifiedF
orTheTarget) |
204 { | 204 { |
205 LayerTreeHostImpl::FrameData frame; | 205 LayerTreeHostImpl::FrameData frame; |
206 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 206 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); |
207 | 207 |
208 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. | 208 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. |
209 ASSERT_EQ(5u, frame.renderPasses.size()); | 209 ASSERT_EQ(5u, frame.renderPasses.size()); |
210 | 210 |
211 // The DelegatedRendererLayer is at position 3,3 compared to its target, and
has a translation transform of 1,1. | 211 // The DelegatedRendererLayer is at position 3,3 compared to its target, and
has a translation transform of 1,1. |
212 // So its root RenderPass' quads should all be transformed by that combined
amount. | 212 // So its root RenderPass' quads should all be transformed by that combined
amount. |
| 213 // The DelegatedRendererLayer has a size of 10x10, but the root delegated Re
nderPass has a size of 8x8, so |
| 214 // any quads should be scaled by 10/8. |
213 gfx::Transform transform; | 215 gfx::Transform transform; |
214 transform.Translate(4, 4); | 216 transform.Translate(4.0, 4.0); |
| 217 transform.Scale(10.0 / 8.0, 10.0 / 8.0); |
215 EXPECT_TRANSFORMATION_MATRIX_EQ(transform, frame.renderPasses[3]->quad_list[
0]->quadTransform()); | 218 EXPECT_TRANSFORMATION_MATRIX_EQ(transform, frame.renderPasses[3]->quad_list[
0]->quadTransform()); |
216 | 219 |
217 // Quads from non-root RenderPasses should not be shifted though. | 220 // Quads from non-root RenderPasses should not be shifted though. |
218 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); | 221 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); |
219 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua
d_list[0]->quadTransform()); | 222 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua
d_list[0]->quadTransform()); |
220 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua
d_list[1]->quadTransform()); | 223 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua
d_list[1]->quadTransform()); |
221 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); | 224 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); |
222 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[1]->qua
d_list[0]->quadTransform()); | 225 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[1]->qua
d_list[0]->quadTransform()); |
223 | 226 |
224 m_hostImpl->drawLayers(frame); | 227 m_hostImpl->drawLayers(frame); |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 | 501 |
499 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; | 502 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; |
500 EXPECT_EQ(rootSharedState, rootQuadList[1]->shared_quad_state); | 503 EXPECT_EQ(rootSharedState, rootQuadList[1]->shared_quad_state); |
501 EXPECT_EQ(rootSharedState, rootQuadList[2]->shared_quad_state); | 504 EXPECT_EQ(rootSharedState, rootQuadList[2]->shared_quad_state); |
502 EXPECT_EQ(rootSharedState, rootQuadList[3]->shared_quad_state); | 505 EXPECT_EQ(rootSharedState, rootQuadList[3]->shared_quad_state); |
503 EXPECT_EQ(rootSharedState, rootQuadList[4]->shared_quad_state); | 506 EXPECT_EQ(rootSharedState, rootQuadList[4]->shared_quad_state); |
504 | 507 |
505 EXPECT_NE(rootQuadList[0]->shared_quad_state, contribQuadList[0]->shared_qua
d_state); | 508 EXPECT_NE(rootQuadList[0]->shared_quad_state, contribQuadList[0]->shared_qua
d_state); |
506 | 509 |
507 // The state should be transformed only once. | 510 // The state should be transformed only once. |
| 511 |
508 // The x/y values are: position (20) + transform (8 * 2) = 36 | 512 // The x/y values are: position (20) + transform (8 * 2) = 36 |
509 // 36 - (width / 2) = 36 - 30 / 2 = 21 | 513 // 36 - (width / 2) = 36 - 30 / 2 = 21 |
510 EXPECT_RECT_EQ(gfx::Rect(21, 21, 100, 100), rootSharedState->clipped_rect_in
_target); | 514 // The size is 100 scaled to fit inside the layer's bounds at 30x30 from a f
rame at 50x50. |
511 EXPECT_RECT_EQ(gfx::Rect(21, 21, 100, 100), rootSharedState->clip_rect); | 515 // 100 * 30 / 50 = 60. |
| 516 EXPECT_RECT_EQ(gfx::Rect(21, 21, 60, 60), rootSharedState->clipped_rect_in_t
arget); |
| 517 EXPECT_RECT_EQ(gfx::Rect(21, 21, 60, 60), rootSharedState->clip_rect); |
512 gfx::Transform expected; | 518 gfx::Transform expected; |
| 519 // This is the transform from the layer's space to its target. |
513 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5 | 520 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5 |
514 expected.Translate(5.0, 5.0); | 521 expected.Translate(5.0, 5.0); |
515 expected.Scale(2.0, 2.0); | 522 expected.Scale(2.0, 2.0); |
516 expected.Translate(8.0, 8.0); | 523 expected.Translate(8.0, 8.0); |
| 524 // The frame has size 50x50 but the layer's bounds are 30x30. |
| 525 expected.Scale(30.0 / 50.0, 30.0 / 50.0); |
| 526 // This is the transform within the source frame. |
517 expected.Scale(1.5, 1.5); | 527 expected.Scale(1.5, 1.5); |
518 expected.Translate(7.0, 7.0); | 528 expected.Translate(7.0, 7.0); |
519 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target
_transform); | 529 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target
_transform); |
520 | 530 |
521 // The contributing render pass should not be transformed from its input. | 531 // The contributing render pass should not be transformed from its input. |
522 EXPECT_RECT_EQ(gfx::Rect(20, 20, 7, 7), contribSharedState->clipped_rect_in_
target); | 532 EXPECT_RECT_EQ(gfx::Rect(20, 20, 7, 7), contribSharedState->clipped_rect_in_
target); |
523 EXPECT_RECT_EQ(gfx::Rect(20, 20, 7, 7), contribSharedState->clip_rect); | 533 EXPECT_RECT_EQ(gfx::Rect(20, 20, 7, 7), contribSharedState->clip_rect); |
524 expected.MakeIdentity(); | 534 expected.MakeIdentity(); |
525 expected.Scale(0.8, 0.8); | 535 expected.Scale(0.8, 0.8); |
526 expected.Translate(9.0, 9.0); | 536 expected.Translate(9.0, 9.0); |
527 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar
get_transform); | 537 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar
get_transform); |
528 | 538 |
529 m_hostImpl->drawLayers(frame); | 539 m_hostImpl->drawLayers(frame); |
530 m_hostImpl->didDrawAllLayers(frame); | 540 m_hostImpl->didDrawAllLayers(frame); |
531 } | 541 } |
532 | 542 |
| 543 TEST_F(DelegatedRendererLayerImplTestSharedData, DisplaySize) |
| 544 { |
| 545 // Cause the layer to scale its output to be larger than its bounds. |
| 546 m_delegatedRendererLayerPtr->setDisplaySize(gfx::Size(40, 40)); |
| 547 EXPECT_LT(m_delegatedRendererLayerPtr->bounds().width(), 40); |
| 548 EXPECT_LT(m_delegatedRendererLayerPtr->bounds().height(), 40); |
| 549 |
| 550 LayerTreeHostImpl::FrameData frame; |
| 551 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); |
| 552 |
| 553 ASSERT_EQ(2u, frame.renderPasses.size()); |
| 554 |
| 555 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; |
| 556 ASSERT_EQ(5u, rootQuadList.size()); |
| 557 |
| 558 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; |
| 559 |
| 560 // The results are similar to the SharedData test, but are scaled up by disp
laySize/bounds, which is 40/30. |
| 561 EXPECT_RECT_EQ(gfx::Rect(21, 21, 80, 80), rootSharedState->clipped_rect_in_t
arget); |
| 562 EXPECT_RECT_EQ(gfx::Rect(21, 21, 80, 80), rootSharedState->clip_rect); |
| 563 gfx::Transform expected; |
| 564 // This is the transform from the layer's space to its target. |
| 565 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5 |
| 566 expected.Translate(5.0, 5.0); |
| 567 expected.Scale(2.0, 2.0); |
| 568 expected.Translate(8.0, 8.0); |
| 569 // The frame has size 50x50 but the layer's bounds are 30x30. |
| 570 expected.Scale(30.0 / 50.0, 30.0 / 50.0); |
| 571 // The display size is 40x40 but the bounds are 30x30. |
| 572 expected.Scale(40.0 / 30.0, 40.0 / 30.0); |
| 573 // This is the transform within the source frame. |
| 574 expected.Scale(1.5, 1.5); |
| 575 expected.Translate(7.0, 7.0); |
| 576 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target
_transform); |
| 577 |
| 578 m_hostImpl->drawLayers(frame); |
| 579 m_hostImpl->didDrawAllLayers(frame); |
| 580 } |
| 581 |
533 } // namespace | 582 } // namespace |
534 } // namespace cc | 583 } // namespace cc |
OLD | NEW |