| 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 11 matching lines...) Expand all Loading... |
| 22 #include "cc/test/mock_quad_culler.h" | 22 #include "cc/test/mock_quad_culler.h" |
| 23 #include "cc/test/render_pass_test_common.h" | 23 #include "cc/test/render_pass_test_common.h" |
| 24 #include "cc/test/render_pass_test_utils.h" | 24 #include "cc/test/render_pass_test_utils.h" |
| 25 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 26 #include "ui/gfx/transform.h" | 26 #include "ui/gfx/transform.h" |
| 27 | 27 |
| 28 namespace cc { | 28 namespace cc { |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 class DelegatedRendererLayerImplTest : public testing::Test { | 31 class DelegatedRendererLayerImplTest : public testing::Test { |
| 32 public: | 32 public: |
| 33 DelegatedRendererLayerImplTest() | 33 DelegatedRendererLayerImplTest() |
| 34 : m_proxy(scoped_ptr<Thread>(NULL)) | 34 : proxy_(scoped_ptr<Thread>(NULL)) |
| 35 , m_alwaysImplThreadAndMainThreadBlocked(&m_proxy) | 35 , always_impl_thread_and_main_thread_blocked_(&proxy_) { |
| 36 LayerTreeSettings settings; |
| 37 settings.minimumOcclusionTrackingSize = gfx::Size(); |
| 38 |
| 39 host_impl_ = LayerTreeHostImpl::create(settings, &client_, &proxy_); |
| 40 host_impl_->initializeRenderer(createFakeOutputSurface()); |
| 41 host_impl_->setViewportSize(gfx::Size(10, 10), gfx::Size(10, 10)); |
| 42 } |
| 43 |
| 44 protected: |
| 45 FakeProxy proxy_; |
| 46 FakeLayerTreeHostImplClient client_; |
| 47 DebugScopedSetImplThreadAndMainThreadBlocked |
| 48 always_impl_thread_and_main_thread_blocked_; |
| 49 scoped_ptr<LayerTreeHostImpl> host_impl_; |
| 50 }; |
| 51 |
| 52 class DelegatedRendererLayerImplTestSimple |
| 53 : public DelegatedRendererLayerImplTest { |
| 54 public: |
| 55 DelegatedRendererLayerImplTestSimple() |
| 56 : DelegatedRendererLayerImplTest() { |
| 57 scoped_ptr<LayerImpl> root_layer = SolidColorLayerImpl::create( |
| 58 host_impl_->activeTree(), 1).PassAs<LayerImpl>(); |
| 59 scoped_ptr<LayerImpl> layer_before = SolidColorLayerImpl::create( |
| 60 host_impl_->activeTree(), 2).PassAs<LayerImpl>(); |
| 61 scoped_ptr<LayerImpl> layer_after = SolidColorLayerImpl::create( |
| 62 host_impl_->activeTree(), 3).PassAs<LayerImpl>(); |
| 63 scoped_ptr<DelegatedRendererLayerImpl> delegated_renderer_layer = |
| 64 DelegatedRendererLayerImpl::Create(host_impl_->activeTree(), 4); |
| 65 |
| 66 host_impl_->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100)); |
| 67 root_layer->setBounds(gfx::Size(100, 100)); |
| 68 |
| 69 layer_before->setPosition(gfx::Point(20, 20)); |
| 70 layer_before->setBounds(gfx::Size(14, 14)); |
| 71 layer_before->setContentBounds(gfx::Size(14, 14)); |
| 72 layer_before->setDrawsContent(true); |
| 73 layer_before->setForceRenderSurface(true); |
| 74 |
| 75 layer_after->setPosition(gfx::Point(5, 5)); |
| 76 layer_after->setBounds(gfx::Size(15, 15)); |
| 77 layer_after->setContentBounds(gfx::Size(15, 15)); |
| 78 layer_after->setDrawsContent(true); |
| 79 layer_after->setForceRenderSurface(true); |
| 80 |
| 81 delegated_renderer_layer->setPosition(gfx::Point(3, 3)); |
| 82 delegated_renderer_layer->setBounds(gfx::Size(10, 10)); |
| 83 delegated_renderer_layer->setContentBounds(gfx::Size(10, 10)); |
| 84 delegated_renderer_layer->setDrawsContent(true); |
| 85 gfx::Transform transform; |
| 86 transform.Translate(1.0, 1.0); |
| 87 delegated_renderer_layer->setTransform(transform); |
| 88 |
| 89 ScopedPtrVector<RenderPass> delegated_render_passes; |
| 90 TestRenderPass* pass1 = addRenderPass( |
| 91 delegated_render_passes, |
| 92 RenderPass::Id(9, 6), |
| 93 gfx::Rect(6, 6, 6, 6), |
| 94 gfx::Transform()); |
| 95 addQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u); |
| 96 TestRenderPass* pass2 = addRenderPass( |
| 97 delegated_render_passes, |
| 98 RenderPass::Id(9, 7), |
| 99 gfx::Rect(7, 7, 7, 7), |
| 100 gfx::Transform()); |
| 101 addQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u); |
| 102 addRenderPassQuad(pass2, pass1); |
| 103 TestRenderPass* pass3 = addRenderPass( |
| 104 delegated_render_passes, |
| 105 RenderPass::Id(9, 8), |
| 106 gfx::Rect(0, 0, 8, 8), |
| 107 gfx::Transform()); |
| 108 addRenderPassQuad(pass3, pass2); |
| 109 delegated_renderer_layer->SetRenderPasses(delegated_render_passes); |
| 110 |
| 111 // The RenderPasses should be taken by the layer. |
| 112 EXPECT_EQ(0u, delegated_render_passes.size()); |
| 113 |
| 114 root_layer_ = root_layer.get(); |
| 115 layer_before_ = layer_before.get(); |
| 116 layer_after_ = layer_after.get(); |
| 117 delegated_renderer_layer_ = delegated_renderer_layer.get(); |
| 118 |
| 119 // Force the delegated RenderPasses to come before the RenderPass from |
| 120 // layer_after. |
| 121 layer_after->addChild(delegated_renderer_layer.PassAs<LayerImpl>()); |
| 122 root_layer->addChild(layer_after.Pass()); |
| 123 |
| 124 // Get the RenderPass generated by layer_before to come before the delegated |
| 125 // RenderPasses. |
| 126 root_layer->addChild(layer_before.Pass()); |
| 127 host_impl_->activeTree()->SetRootLayer(root_layer.Pass()); |
| 128 } |
| 129 |
| 130 protected: |
| 131 LayerImpl* root_layer_; |
| 132 LayerImpl* layer_before_; |
| 133 LayerImpl* layer_after_; |
| 134 DelegatedRendererLayerImpl* delegated_renderer_layer_; |
| 135 }; |
| 136 |
| 137 TEST_F(DelegatedRendererLayerImplTestSimple, AddsContributingRenderPasses) { |
| 138 LayerTreeHostImpl::FrameData frame; |
| 139 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 140 |
| 141 // Each non-DelegatedRendererLayer added one RenderPass. The |
| 142 // DelegatedRendererLayer added two contributing passes. |
| 143 ASSERT_EQ(5u, frame.renderPasses.size()); |
| 144 |
| 145 // The DelegatedRendererLayer should have added its contributing RenderPasses |
| 146 // to the frame. |
| 147 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); |
| 148 EXPECT_EQ(1, frame.renderPasses[1]->id.index); |
| 149 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); |
| 150 EXPECT_EQ(2, frame.renderPasses[2]->id.index); |
| 151 // And all other RenderPasses should be non-delegated. |
| 152 EXPECT_NE(4, frame.renderPasses[0]->id.layer_id); |
| 153 EXPECT_EQ(0, frame.renderPasses[0]->id.index); |
| 154 EXPECT_NE(4, frame.renderPasses[3]->id.layer_id); |
| 155 EXPECT_EQ(0, frame.renderPasses[3]->id.index); |
| 156 EXPECT_NE(4, frame.renderPasses[4]->id.layer_id); |
| 157 EXPECT_EQ(0, frame.renderPasses[4]->id.index); |
| 158 |
| 159 // The DelegatedRendererLayer should have added its RenderPasses to the frame |
| 160 // in order. |
| 161 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(), |
| 162 frame.renderPasses[1]->output_rect.ToString()); |
| 163 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(), |
| 164 frame.renderPasses[2]->output_rect.ToString()); |
| 165 |
| 166 host_impl_->drawLayers(frame); |
| 167 host_impl_->didDrawAllLayers(frame); |
| 168 } |
| 169 |
| 170 TEST_F(DelegatedRendererLayerImplTestSimple, |
| 171 AddsQuadsToContributingRenderPasses) { |
| 172 LayerTreeHostImpl::FrameData frame; |
| 173 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 174 |
| 175 // Each non-DelegatedRendererLayer added one RenderPass. The |
| 176 // DelegatedRendererLayer added two contributing passes. |
| 177 ASSERT_EQ(5u, frame.renderPasses.size()); |
| 178 |
| 179 // The DelegatedRendererLayer should have added its contributing RenderPasses |
| 180 // to the frame. |
| 181 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); |
| 182 EXPECT_EQ(1, frame.renderPasses[1]->id.index); |
| 183 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); |
| 184 EXPECT_EQ(2, frame.renderPasses[2]->id.index); |
| 185 |
| 186 // The DelegatedRendererLayer should have added copies of its quads to |
| 187 // contributing RenderPasses. |
| 188 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); |
| 189 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(), |
| 190 frame.renderPasses[1]->quad_list[0]->rect.ToString()); |
| 191 |
| 192 // Verify it added the right quads. |
| 193 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); |
| 194 EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(), |
| 195 frame.renderPasses[2]->quad_list[0]->rect.ToString()); |
| 196 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(), |
| 197 frame.renderPasses[2]->quad_list[1]->rect.ToString()); |
| 198 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); |
| 199 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(), |
| 200 frame.renderPasses[1]->quad_list[0]->rect.ToString()); |
| 201 |
| 202 host_impl_->drawLayers(frame); |
| 203 host_impl_->didDrawAllLayers(frame); |
| 204 } |
| 205 |
| 206 TEST_F(DelegatedRendererLayerImplTestSimple, AddsQuadsToTargetRenderPass) { |
| 207 LayerTreeHostImpl::FrameData frame; |
| 208 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 209 |
| 210 // Each non-DelegatedRendererLayer added one RenderPass. The |
| 211 // DelegatedRendererLayer added two contributing passes. |
| 212 ASSERT_EQ(5u, frame.renderPasses.size()); |
| 213 |
| 214 // The layer's target is the RenderPass from m_layer_after. |
| 215 EXPECT_EQ(RenderPass::Id(3, 0), frame.renderPasses[3]->id); |
| 216 |
| 217 // The DelegatedRendererLayer should have added copies of quads in its root |
| 218 // RenderPass to its target RenderPass. The m_layer_after also adds one quad. |
| 219 ASSERT_EQ(2u, frame.renderPasses[3]->quad_list.size()); |
| 220 |
| 221 // Verify it added the right quads. |
| 222 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(), |
| 223 frame.renderPasses[3]->quad_list[0]->rect.ToString()); |
| 224 |
| 225 // Its target layer should have a quad as well. |
| 226 EXPECT_EQ(gfx::Rect(0, 0, 15, 15).ToString(), |
| 227 frame.renderPasses[3]->quad_list[1]->rect.ToString()); |
| 228 |
| 229 host_impl_->drawLayers(frame); |
| 230 host_impl_->didDrawAllLayers(frame); |
| 231 } |
| 232 |
| 233 TEST_F(DelegatedRendererLayerImplTestSimple, |
| 234 QuadsFromRootRenderPassAreModifiedForTheTarget) { |
| 235 LayerTreeHostImpl::FrameData frame; |
| 236 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 237 |
| 238 // Each non-DelegatedRendererLayer added one RenderPass. The |
| 239 // DelegatedRendererLayer added two contributing passes. |
| 240 ASSERT_EQ(5u, frame.renderPasses.size()); |
| 241 |
| 242 // The DelegatedRendererLayer is at position 3,3 compared to its target, and |
| 243 // has a translation transform of 1,1. So its root RenderPass' quads should |
| 244 // all be transformed by that combined amount. |
| 245 // The DelegatedRendererLayer has a size of 10x10, but the root delegated |
| 246 // RenderPass has a size of 8x8, so any quads should be scaled by 10/8. |
| 247 gfx::Transform transform; |
| 248 transform.Translate(4.0, 4.0); |
| 249 transform.Scale(10.0 / 8.0, 10.0 / 8.0); |
| 250 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 251 transform, frame.renderPasses[3]->quad_list[0]->quadTransform()); |
| 252 |
| 253 // Quads from non-root RenderPasses should not be shifted though. |
| 254 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); |
| 255 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 256 gfx::Transform(), frame.renderPasses[2]->quad_list[0]->quadTransform()); |
| 257 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 258 gfx::Transform(), frame.renderPasses[2]->quad_list[1]->quadTransform()); |
| 259 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); |
| 260 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 261 gfx::Transform(), frame.renderPasses[1]->quad_list[0]->quadTransform()); |
| 262 |
| 263 host_impl_->drawLayers(frame); |
| 264 host_impl_->didDrawAllLayers(frame); |
| 265 } |
| 266 |
| 267 TEST_F(DelegatedRendererLayerImplTestSimple, DoesNotOwnARenderSurface) { |
| 268 LayerTreeHostImpl::FrameData frame; |
| 269 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 270 |
| 271 // If the DelegatedRendererLayer is axis aligned and has opacity 1, then it |
| 272 // has no need to be a renderSurface for the quads it carries. |
| 273 EXPECT_FALSE(delegated_renderer_layer_->renderSurface()); |
| 274 |
| 275 host_impl_->drawLayers(frame); |
| 276 host_impl_->didDrawAllLayers(frame); |
| 277 } |
| 278 |
| 279 TEST_F(DelegatedRendererLayerImplTestSimple, DoesOwnARenderSurfaceForOpacity) { |
| 280 delegated_renderer_layer_->setOpacity(0.5f); |
| 281 |
| 282 LayerTreeHostImpl::FrameData frame; |
| 283 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 284 |
| 285 // This test case has quads from multiple layers in the delegated renderer, so |
| 286 // if the DelegatedRendererLayer has opacity < 1, it should end up with a |
| 287 // render surface. |
| 288 EXPECT_TRUE(delegated_renderer_layer_->renderSurface()); |
| 289 |
| 290 host_impl_->drawLayers(frame); |
| 291 host_impl_->didDrawAllLayers(frame); |
| 292 } |
| 293 |
| 294 TEST_F(DelegatedRendererLayerImplTestSimple, |
| 295 DoesOwnARenderSurfaceForTransform) { |
| 296 gfx::Transform rotation; |
| 297 rotation.RotateAboutZAxis(30.0); |
| 298 delegated_renderer_layer_->setTransform(rotation); |
| 299 |
| 300 LayerTreeHostImpl::FrameData frame; |
| 301 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 302 |
| 303 // This test case has quads from multiple layers in the delegated renderer, so |
| 304 // if the DelegatedRendererLayer has opacity < 1, it should end up with a |
| 305 // render surface. |
| 306 EXPECT_TRUE(delegated_renderer_layer_->renderSurface()); |
| 307 |
| 308 host_impl_->drawLayers(frame); |
| 309 host_impl_->didDrawAllLayers(frame); |
| 310 } |
| 311 |
| 312 class DelegatedRendererLayerImplTestOwnSurface |
| 313 : public DelegatedRendererLayerImplTestSimple { |
| 314 public: |
| 315 DelegatedRendererLayerImplTestOwnSurface() |
| 316 : DelegatedRendererLayerImplTestSimple() { |
| 317 delegated_renderer_layer_->setForceRenderSurface(true); |
| 318 } |
| 319 }; |
| 320 |
| 321 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsRenderPasses) { |
| 322 LayerTreeHostImpl::FrameData frame; |
| 323 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 324 |
| 325 // Each non-DelegatedRendererLayer added one RenderPass. The |
| 326 // DelegatedRendererLayer added two contributing passes and its owned surface |
| 327 // added one pass. |
| 328 ASSERT_EQ(6u, frame.renderPasses.size()); |
| 329 |
| 330 // The DelegatedRendererLayer should have added its contributing RenderPasses |
| 331 // to the frame. |
| 332 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); |
| 333 EXPECT_EQ(1, frame.renderPasses[1]->id.index); |
| 334 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); |
| 335 EXPECT_EQ(2, frame.renderPasses[2]->id.index); |
| 336 // The DelegatedRendererLayer should have added a RenderPass for its surface |
| 337 // to the frame. |
| 338 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); |
| 339 EXPECT_EQ(0, frame.renderPasses[3]->id.index); |
| 340 // And all other RenderPasses should be non-delegated. |
| 341 EXPECT_NE(4, frame.renderPasses[0]->id.layer_id); |
| 342 EXPECT_EQ(0, frame.renderPasses[0]->id.index); |
| 343 EXPECT_NE(4, frame.renderPasses[4]->id.layer_id); |
| 344 EXPECT_EQ(0, frame.renderPasses[4]->id.index); |
| 345 EXPECT_NE(4, frame.renderPasses[5]->id.layer_id); |
| 346 EXPECT_EQ(0, frame.renderPasses[5]->id.index); |
| 347 |
| 348 // The DelegatedRendererLayer should have added its RenderPasses to the frame |
| 349 // in order. |
| 350 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(), |
| 351 frame.renderPasses[1]->output_rect.ToString()); |
| 352 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(), |
| 353 frame.renderPasses[2]->output_rect.ToString()); |
| 354 |
| 355 host_impl_->drawLayers(frame); |
| 356 host_impl_->didDrawAllLayers(frame); |
| 357 } |
| 358 |
| 359 TEST_F(DelegatedRendererLayerImplTestOwnSurface, |
| 360 AddsQuadsToContributingRenderPasses) { |
| 361 LayerTreeHostImpl::FrameData frame; |
| 362 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 363 |
| 364 // Each non-DelegatedRendererLayer added one RenderPass. The |
| 365 // DelegatedRendererLayer added two contributing passes and its owned surface |
| 366 // added one pass. |
| 367 ASSERT_EQ(6u, frame.renderPasses.size()); |
| 368 |
| 369 // The DelegatedRendererLayer should have added its contributing RenderPasses |
| 370 // to the frame. |
| 371 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); |
| 372 EXPECT_EQ(1, frame.renderPasses[1]->id.index); |
| 373 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); |
| 374 EXPECT_EQ(2, frame.renderPasses[2]->id.index); |
| 375 |
| 376 // The DelegatedRendererLayer should have added copies of its quads to |
| 377 // contributing RenderPasses. |
| 378 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); |
| 379 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(), |
| 380 frame.renderPasses[1]->quad_list[0]->rect.ToString()); |
| 381 |
| 382 // Verify it added the right quads. |
| 383 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); |
| 384 EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(), |
| 385 frame.renderPasses[2]->quad_list[0]->rect.ToString()); |
| 386 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(), |
| 387 frame.renderPasses[2]->quad_list[1]->rect.ToString()); |
| 388 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); |
| 389 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(), |
| 390 frame.renderPasses[1]->quad_list[0]->rect.ToString()); |
| 391 |
| 392 host_impl_->drawLayers(frame); |
| 393 host_impl_->didDrawAllLayers(frame); |
| 394 } |
| 395 |
| 396 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsQuadsToTargetRenderPass) { |
| 397 LayerTreeHostImpl::FrameData frame; |
| 398 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 399 |
| 400 // Each non-DelegatedRendererLayer added one RenderPass. The |
| 401 // DelegatedRendererLayer added two contributing passes and its owned surface |
| 402 // added one pass. |
| 403 ASSERT_EQ(6u, frame.renderPasses.size()); |
| 404 |
| 405 // The layer's target is the RenderPass owned by itself. |
| 406 EXPECT_EQ(RenderPass::Id(4, 0), frame.renderPasses[3]->id); |
| 407 |
| 408 // The DelegatedRendererLayer should have added copies of quads in its root |
| 409 // RenderPass to its target RenderPass. |
| 410 // The m_layer_after also adds one quad. |
| 411 ASSERT_EQ(1u, frame.renderPasses[3]->quad_list.size()); |
| 412 |
| 413 // Verify it added the right quads. |
| 414 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(), |
| 415 frame.renderPasses[3]->quad_list[0]->rect.ToString()); |
| 416 |
| 417 host_impl_->drawLayers(frame); |
| 418 host_impl_->didDrawAllLayers(frame); |
| 419 } |
| 420 |
| 421 TEST_F(DelegatedRendererLayerImplTestOwnSurface, |
| 422 QuadsFromRootRenderPassAreNotModifiedForTheTarget) { |
| 423 LayerTreeHostImpl::FrameData frame; |
| 424 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 425 |
| 426 // Each non-DelegatedRendererLayer added one RenderPass. The |
| 427 // DelegatedRendererLayer added two contributing passes and its owned surface |
| 428 // added one pass. |
| 429 ASSERT_EQ(6u, frame.renderPasses.size()); |
| 430 |
| 431 // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root |
| 432 // RenderPass' quads do not need to be translated at all. However, they are |
| 433 // scaled from the frame's size (8x8) to the layer's bounds (10x10). |
| 434 gfx::Transform transform; |
| 435 transform.Scale(10.0 / 8.0, 10.0 / 8.0); |
| 436 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 437 transform, frame.renderPasses[3]->quad_list[0]->quadTransform()); |
| 438 |
| 439 // Quads from non-root RenderPasses should not be shifted either. |
| 440 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); |
| 441 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 442 gfx::Transform(), frame.renderPasses[2]->quad_list[0]->quadTransform()); |
| 443 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 444 gfx::Transform(), frame.renderPasses[2]->quad_list[1]->quadTransform()); |
| 445 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); |
| 446 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 447 gfx::Transform(), frame.renderPasses[1]->quad_list[0]->quadTransform()); |
| 448 |
| 449 host_impl_->drawLayers(frame); |
| 450 host_impl_->didDrawAllLayers(frame); |
| 451 } |
| 452 |
| 453 class DelegatedRendererLayerImplTestTransform |
| 454 : public DelegatedRendererLayerImplTest { |
| 455 public: |
| 456 void SetUpTest() { |
| 457 scoped_ptr<LayerImpl> root_layer = LayerImpl::create( |
| 458 host_impl_->activeTree(), 1); |
| 459 scoped_ptr<DelegatedRendererLayerImpl> delegated_renderer_layer = |
| 460 DelegatedRendererLayerImpl::Create(host_impl_->activeTree(), 2); |
| 461 |
| 462 host_impl_->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100)); |
| 463 root_layer->setBounds(gfx::Size(100, 100)); |
| 464 |
| 465 delegated_renderer_layer->setPosition(gfx::Point(20, 20)); |
| 466 delegated_renderer_layer->setBounds(gfx::Size(30, 30)); |
| 467 delegated_renderer_layer->setContentBounds(gfx::Size(30, 30)); |
| 468 delegated_renderer_layer->setDrawsContent(true); |
| 469 gfx::Transform transform; |
| 470 transform.Scale(2.0, 2.0); |
| 471 transform.Translate(8.0, 8.0); |
| 472 delegated_renderer_layer->setTransform(transform); |
| 473 |
| 474 ScopedPtrVector<RenderPass> delegated_render_passes; |
| 475 |
| 476 gfx::Rect child_pass_rect(20, 20, 7, 7); |
| 477 gfx::Transform child_pass_transform; |
| 478 child_pass_transform.Scale(0.8, 0.8); |
| 479 child_pass_transform.Translate(9.0, 9.0); |
| 480 gfx::Rect child_pass_clip_rect(21, 21, 3, 3); |
| 481 bool child_pass_clipped = false; |
| 482 |
| 36 { | 483 { |
| 37 LayerTreeSettings settings; | 484 TestRenderPass* pass = addRenderPass( |
| 38 settings.minimumOcclusionTrackingSize = gfx::Size(); | 485 delegated_render_passes, |
| 39 | 486 RenderPass::Id(10, 7), |
| 40 m_hostImpl = LayerTreeHostImpl::create(settings, &m_client, &m_proxy); | 487 child_pass_rect, |
| 41 m_hostImpl->initializeRenderer(createFakeOutputSurface()); | 488 gfx::Transform()); |
| 42 m_hostImpl->setViewportSize(gfx::Size(10, 10), gfx::Size(10, 10)); | 489 MockQuadCuller quad_sink(pass->quad_list, pass->shared_quad_state_list); |
| 490 AppendQuadsData data(pass->id); |
| 491 SharedQuadState* shared_quad_state = quad_sink.useSharedQuadState( |
| 492 SharedQuadState::Create()); |
| 493 shared_quad_state->SetAll( |
| 494 child_pass_transform, |
| 495 child_pass_rect, |
| 496 child_pass_clip_rect, |
| 497 child_pass_clipped, |
| 498 1.f); |
| 499 |
| 500 scoped_ptr<SolidColorDrawQuad> color_quad; |
| 501 color_quad = SolidColorDrawQuad::Create(); |
| 502 color_quad->SetNew(shared_quad_state, gfx::Rect(20, 20, 3, 7), 1u); |
| 503 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 504 |
| 505 color_quad = SolidColorDrawQuad::Create(); |
| 506 color_quad->SetNew(shared_quad_state, gfx::Rect(23, 20, 4, 7), 1u); |
| 507 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 43 } | 508 } |
| 44 | 509 |
| 45 protected: | 510 gfx::Rect root_pass_rect(0, 0, 50, 50); |
| 46 FakeProxy m_proxy; | 511 gfx::Transform root_pass_transform; |
| 47 FakeLayerTreeHostImplClient m_client; | 512 root_pass_transform.Scale(1.5, 1.5); |
| 48 DebugScopedSetImplThreadAndMainThreadBlocked m_alwaysImplThreadAndMainThread
Blocked; | 513 root_pass_transform.Translate(7.0, 7.0); |
| 49 scoped_ptr<LayerTreeHostImpl> m_hostImpl; | 514 gfx::Rect root_pass_clip_rect(10, 10, 35, 35); |
| 515 bool root_pass_clipped = root_delegated_render_pass_is_clipped_; |
| 516 |
| 517 TestRenderPass* pass = addRenderPass( |
| 518 delegated_render_passes, |
| 519 RenderPass::Id(9, 6), |
| 520 root_pass_rect, |
| 521 gfx::Transform()); |
| 522 MockQuadCuller quad_sink(pass->quad_list, pass->shared_quad_state_list); |
| 523 AppendQuadsData data(pass->id); |
| 524 SharedQuadState* shared_quad_state = quad_sink.useSharedQuadState(SharedQuad
State::Create()); |
| 525 shared_quad_state->SetAll( |
| 526 root_pass_transform, |
| 527 root_pass_rect, |
| 528 root_pass_clip_rect, |
| 529 root_pass_clipped, |
| 530 1.f); |
| 531 |
| 532 scoped_ptr<RenderPassDrawQuad> render_pass_quad = |
| 533 RenderPassDrawQuad::Create(); |
| 534 render_pass_quad->SetNew( |
| 535 shared_quad_state, |
| 536 gfx::Rect(5, 5, 7, 7), // rect |
| 537 RenderPass::Id(10, 7), // render_pass_id |
| 538 false, // is_replica |
| 539 0, // mask_resource_id |
| 540 child_pass_rect, // contents_changed_since_last_frame |
| 541 gfx::RectF(), // mask_uv_rect |
| 542 WebKit::WebFilterOperations(), // filters |
| 543 skia::RefPtr<SkImageFilter>(), // filter |
| 544 WebKit::WebFilterOperations()); // background_filters |
| 545 quad_sink.append(render_pass_quad.PassAs<DrawQuad>(), data); |
| 546 |
| 547 scoped_ptr<SolidColorDrawQuad> color_quad; |
| 548 color_quad = SolidColorDrawQuad::Create(); |
| 549 color_quad->SetNew(shared_quad_state, gfx::Rect(0, 0, 10, 10), 1u); |
| 550 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 551 |
| 552 color_quad = SolidColorDrawQuad::Create(); |
| 553 color_quad->SetNew(shared_quad_state, gfx::Rect(0, 10, 10, 10), 2u); |
| 554 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 555 |
| 556 color_quad = SolidColorDrawQuad::Create(); |
| 557 color_quad->SetNew(shared_quad_state, gfx::Rect(10, 0, 10, 10), 3u); |
| 558 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 559 |
| 560 color_quad = SolidColorDrawQuad::Create(); |
| 561 color_quad->SetNew(shared_quad_state, gfx::Rect(10, 10, 10, 10), 4u); |
| 562 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 563 |
| 564 delegated_renderer_layer->SetRenderPasses(delegated_render_passes); |
| 565 |
| 566 // The RenderPasses should be taken by the layer. |
| 567 EXPECT_EQ(0u, delegated_render_passes.size()); |
| 568 |
| 569 root_layer_ = root_layer.get(); |
| 570 delegated_renderer_layer_ = delegated_renderer_layer.get(); |
| 571 |
| 572 root_layer->addChild(delegated_renderer_layer.PassAs<LayerImpl>()); |
| 573 host_impl_->activeTree()->SetRootLayer(root_layer.Pass()); |
| 574 } |
| 575 |
| 576 void VerifyRenderPasses( |
| 577 const LayerTreeHostImpl::FrameData& frame, |
| 578 size_t num_render_passes, |
| 579 const SharedQuadState** root_delegated_shared_quad_state, |
| 580 const SharedQuadState** contrib_delegated_shared_quad_state) { |
| 581 ASSERT_EQ(num_render_passes, frame.renderPasses.size()); |
| 582 // The contributing render pass in the DelegatedRendererLayer. |
| 583 EXPECT_EQ(2, frame.renderPasses[0]->id.layer_id); |
| 584 EXPECT_EQ(1, frame.renderPasses[0]->id.index); |
| 585 // The root render pass. |
| 586 EXPECT_EQ(1, frame.renderPasses.back()->id.layer_id); |
| 587 EXPECT_EQ(0, frame.renderPasses.back()->id.index); |
| 588 |
| 589 const QuadList& contrib_delegated_quad_list = |
| 590 frame.renderPasses[0]->quad_list; |
| 591 ASSERT_EQ(2u, contrib_delegated_quad_list.size()); |
| 592 |
| 593 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list; |
| 594 ASSERT_EQ(5u, root_delegated_quad_list.size()); |
| 595 |
| 596 // All quads in a render pass should share the same state. |
| 597 *contrib_delegated_shared_quad_state = |
| 598 contrib_delegated_quad_list[0]->shared_quad_state; |
| 599 EXPECT_EQ(*contrib_delegated_shared_quad_state, |
| 600 contrib_delegated_quad_list[1]->shared_quad_state); |
| 601 |
| 602 *root_delegated_shared_quad_state = |
| 603 root_delegated_quad_list[0]->shared_quad_state; |
| 604 EXPECT_EQ(*root_delegated_shared_quad_state, |
| 605 root_delegated_quad_list[1]->shared_quad_state); |
| 606 EXPECT_EQ(*root_delegated_shared_quad_state, |
| 607 root_delegated_quad_list[2]->shared_quad_state); |
| 608 EXPECT_EQ(*root_delegated_shared_quad_state, |
| 609 root_delegated_quad_list[3]->shared_quad_state); |
| 610 EXPECT_EQ(*root_delegated_shared_quad_state, |
| 611 root_delegated_quad_list[4]->shared_quad_state); |
| 612 |
| 613 EXPECT_NE(*contrib_delegated_shared_quad_state, |
| 614 *root_delegated_shared_quad_state); |
| 615 } |
| 616 |
| 617 protected: |
| 618 LayerImpl* root_layer_; |
| 619 DelegatedRendererLayerImpl* delegated_renderer_layer_; |
| 620 bool root_delegated_render_pass_is_clipped_; |
| 50 }; | 621 }; |
| 51 | 622 |
| 52 class DelegatedRendererLayerImplTestSimple : public DelegatedRendererLayerImplTe
st { | 623 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_NoSurface) { |
| 53 public: | 624 root_delegated_render_pass_is_clipped_ = false; |
| 54 DelegatedRendererLayerImplTestSimple() | 625 SetUpTest(); |
| 55 : DelegatedRendererLayerImplTest() | 626 |
| 627 LayerTreeHostImpl::FrameData frame; |
| 628 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 629 |
| 630 const SharedQuadState* root_delegated_shared_quad_state = NULL; |
| 631 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; |
| 632 VerifyRenderPasses( |
| 633 frame, |
| 634 2, |
| 635 &root_delegated_shared_quad_state, |
| 636 &contrib_delegated_shared_quad_state); |
| 637 |
| 638 // When the quads don't have a clip of their own, the clip rect is set to |
| 639 // the drawableContentRect of the delegated renderer layer. |
| 640 EXPECT_EQ(gfx::Rect(21, 21, 60, 60).ToString(), |
| 641 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 642 |
| 643 // Even though the quads in the root pass have no clip of their own, they |
| 644 // inherit the clip rect from the delegated renderer layer if it does not |
| 645 // own a surface. |
| 646 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
| 647 |
| 648 gfx::Transform expected; |
| 649 // This is the transform from the layer's space to its target. |
| 650 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5 |
| 651 expected.Translate(5.0, 5.0); |
| 652 expected.Scale(2.0, 2.0); |
| 653 expected.Translate(8.0, 8.0); |
| 654 // The frame has size 50x50 but the layer's bounds are 30x30. |
| 655 expected.Scale(30.0 / 50.0, 30.0 / 50.0); |
| 656 // This is the transform within the source frame. |
| 657 expected.Scale(1.5, 1.5); |
| 658 expected.Translate(7.0, 7.0); |
| 659 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 660 expected, root_delegated_shared_quad_state->content_to_target_transform); |
| 661 |
| 662 // The contributing render pass should not be transformed from its input. |
| 663 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), |
| 664 contrib_delegated_shared_quad_state->clip_rect.ToString()); |
| 665 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); |
| 666 expected.MakeIdentity(); |
| 667 expected.Scale(0.8, 0.8); |
| 668 expected.Translate(9.0, 9.0); |
| 669 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 670 expected, |
| 671 contrib_delegated_shared_quad_state->content_to_target_transform); |
| 672 |
| 673 host_impl_->drawLayers(frame); |
| 674 host_impl_->didDrawAllLayers(frame); |
| 675 } |
| 676 |
| 677 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_NoSurface) { |
| 678 root_delegated_render_pass_is_clipped_ = true; |
| 679 SetUpTest(); |
| 680 |
| 681 LayerTreeHostImpl::FrameData frame; |
| 682 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 683 |
| 684 const SharedQuadState* root_delegated_shared_quad_state = NULL; |
| 685 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; |
| 686 VerifyRenderPasses( |
| 687 frame, |
| 688 2, |
| 689 &root_delegated_shared_quad_state, |
| 690 &contrib_delegated_shared_quad_state); |
| 691 |
| 692 // Since the quads have a clip_rect it should be modified by delegated |
| 693 // renderer layer's drawTransform. |
| 694 // The position of the resulting clip_rect is: |
| 695 // (clip rect position (10) * scale to layer (30/50) + translate (8)) * |
| 696 // layer scale (2) + layer position (20) = 48 |
| 697 // But the layer is centered, so: 48 - (width / 2) = 48 - 30 / 2 = 33 |
| 698 // |
| 699 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from |
| 700 // a frame at 50x50: 35 * 2 (layer's scale) * 30 / 50 = 42. |
| 701 EXPECT_EQ(gfx::Rect(33, 33, 42, 42).ToString(), |
| 702 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 703 |
| 704 // The quads had a clip and it should be preserved. |
| 705 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
| 706 |
| 707 gfx::Transform expected; |
| 708 // This is the transform from the layer's space to its target. |
| 709 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5 |
| 710 expected.Translate(5.0, 5.0); |
| 711 expected.Scale(2.0, 2.0); |
| 712 expected.Translate(8.0, 8.0); |
| 713 // The frame has size 50x50 but the layer's bounds are 30x30. |
| 714 expected.Scale(30.0 / 50.0, 30.0 / 50.0); |
| 715 // This is the transform within the source frame. |
| 716 expected.Scale(1.5, 1.5); |
| 717 expected.Translate(7.0, 7.0); |
| 718 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 719 expected, root_delegated_shared_quad_state->content_to_target_transform); |
| 720 |
| 721 // The contributing render pass should not be transformed from its input. |
| 722 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), |
| 723 contrib_delegated_shared_quad_state->clip_rect.ToString()); |
| 724 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); |
| 725 expected.MakeIdentity(); |
| 726 expected.Scale(0.8, 0.8); |
| 727 expected.Translate(9.0, 9.0); |
| 728 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 729 expected, |
| 730 contrib_delegated_shared_quad_state->content_to_target_transform); |
| 731 |
| 732 host_impl_->drawLayers(frame); |
| 733 host_impl_->didDrawAllLayers(frame); |
| 734 } |
| 735 |
| 736 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_Surface) { |
| 737 root_delegated_render_pass_is_clipped_ = false; |
| 738 SetUpTest(); |
| 739 |
| 740 delegated_renderer_layer_->setForceRenderSurface(true); |
| 741 |
| 742 LayerTreeHostImpl::FrameData frame; |
| 743 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 744 |
| 745 const SharedQuadState* root_delegated_shared_quad_state = NULL; |
| 746 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; |
| 747 VerifyRenderPasses( |
| 748 frame, |
| 749 3, |
| 750 &root_delegated_shared_quad_state, |
| 751 &contrib_delegated_shared_quad_state); |
| 752 |
| 753 // When the layer owns a surface, then its position and translation are not |
| 754 // a part of its draw transform. |
| 755 // The position of the resulting clip_rect is: |
| 756 // (clip rect position (10) * scale to layer (30/50)) * layer scale (2) = 12 |
| 757 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from |
| 758 // a frame at 50x50: 35 * 2 (layer's scale) * 30 / 50 = 42. |
| 759 EXPECT_EQ(gfx::Rect(12, 12, 42, 42).ToString(), |
| 760 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 761 |
| 762 // Since the layer owns a surface it doesn't need to clip its quads, so |
| 763 // unclipped quads remain unclipped. |
| 764 EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped); |
| 765 |
| 766 gfx::Transform expected; |
| 767 expected.Scale(2.0, 2.0); |
| 768 // The frame has size 50x50 but the layer's bounds are 30x30. |
| 769 expected.Scale(30.0 / 50.0, 30.0 / 50.0); |
| 770 // This is the transform within the source frame. |
| 771 expected.Scale(1.5, 1.5); |
| 772 expected.Translate(7.0, 7.0); |
| 773 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 774 expected, root_delegated_shared_quad_state->content_to_target_transform); |
| 775 |
| 776 // The contributing render pass should not be transformed from its input. |
| 777 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), |
| 778 contrib_delegated_shared_quad_state->clip_rect.ToString()); |
| 779 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); |
| 780 expected.MakeIdentity(); |
| 781 expected.Scale(0.8, 0.8); |
| 782 expected.Translate(9.0, 9.0); |
| 783 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 784 expected, |
| 785 contrib_delegated_shared_quad_state->content_to_target_transform); |
| 786 |
| 787 host_impl_->drawLayers(frame); |
| 788 host_impl_->didDrawAllLayers(frame); |
| 789 } |
| 790 |
| 791 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_Surface) { |
| 792 root_delegated_render_pass_is_clipped_ = true; |
| 793 SetUpTest(); |
| 794 |
| 795 delegated_renderer_layer_->setForceRenderSurface(true); |
| 796 |
| 797 LayerTreeHostImpl::FrameData frame; |
| 798 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 799 |
| 800 const SharedQuadState* root_delegated_shared_quad_state = NULL; |
| 801 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; |
| 802 VerifyRenderPasses( |
| 803 frame, |
| 804 3, |
| 805 &root_delegated_shared_quad_state, |
| 806 &contrib_delegated_shared_quad_state); |
| 807 |
| 808 // When the layer owns a surface, then its position and translation are not |
| 809 // a part of its draw transform. |
| 810 // The position of the resulting clip_rect is: |
| 811 // (clip rect position (10) * scale to layer (30/50)) * layer scale (2) = 12 |
| 812 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from |
| 813 // a frame at 50x50: 35 * 2 (layer's scale) * 30 / 50 = 42. |
| 814 EXPECT_EQ(gfx::Rect(12, 12, 42, 42).ToString(), |
| 815 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 816 |
| 817 // The quads had a clip and it should be preserved. |
| 818 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
| 819 |
| 820 gfx::Transform expected; |
| 821 expected.Scale(2.0, 2.0); |
| 822 // The frame has size 50x50 but the layer's bounds are 30x30. |
| 823 expected.Scale(30.0 / 50.0, 30.0 / 50.0); |
| 824 // This is the transform within the source frame. |
| 825 expected.Scale(1.5, 1.5); |
| 826 expected.Translate(7.0, 7.0); |
| 827 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 828 expected, root_delegated_shared_quad_state->content_to_target_transform); |
| 829 |
| 830 // The contributing render pass should not be transformed from its input. |
| 831 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), |
| 832 contrib_delegated_shared_quad_state->clip_rect.ToString()); |
| 833 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); |
| 834 expected.MakeIdentity(); |
| 835 expected.Scale(0.8, 0.8); |
| 836 expected.Translate(9.0, 9.0); |
| 837 EXPECT_TRANSFORMATION_MATRIX_EQ( |
| 838 expected, |
| 839 contrib_delegated_shared_quad_state->content_to_target_transform); |
| 840 |
| 841 host_impl_->drawLayers(frame); |
| 842 host_impl_->didDrawAllLayers(frame); |
| 843 } |
| 844 |
| 845 class DelegatedRendererLayerImplTestClip |
| 846 : public DelegatedRendererLayerImplTest { |
| 847 public: |
| 848 void SetUpTest() { |
| 849 scoped_ptr<LayerImpl> root_layer = |
| 850 LayerImpl::create(host_impl_->activeTree(), 1); |
| 851 scoped_ptr<DelegatedRendererLayerImpl> delegated_renderer_layer = |
| 852 DelegatedRendererLayerImpl::Create(host_impl_->activeTree(), 2); |
| 853 scoped_ptr<LayerImpl> clip_layer = |
| 854 LayerImpl::create(host_impl_->activeTree(), 3); |
| 855 scoped_ptr<LayerImpl> origin_layer = |
| 856 LayerImpl::create(host_impl_->activeTree(), 4); |
| 857 |
| 858 host_impl_->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100)); |
| 859 root_layer->setBounds(gfx::Size(100, 100)); |
| 860 |
| 861 delegated_renderer_layer->setPosition(gfx::Point(20, 20)); |
| 862 delegated_renderer_layer->setBounds(gfx::Size(50, 50)); |
| 863 delegated_renderer_layer->setContentBounds(gfx::Size(50, 50)); |
| 864 delegated_renderer_layer->setDrawsContent(true); |
| 865 |
| 866 ScopedPtrVector<RenderPass> delegated_render_passes; |
| 867 |
| 868 gfx::Rect child_pass_rect(20, 20, 7, 7); |
| 869 gfx::Transform child_pass_transform; |
| 870 gfx::Rect child_pass_clip_rect(21, 21, 3, 3); |
| 871 bool child_pass_clipped = false; |
| 872 |
| 56 { | 873 { |
| 57 scoped_ptr<LayerImpl> rootLayer = SolidColorLayerImpl::create(m_hostImpl
->activeTree(), 1).PassAs<LayerImpl>(); | 874 TestRenderPass* pass = addRenderPass( |
| 58 scoped_ptr<LayerImpl> layerBefore = SolidColorLayerImpl::create(m_hostIm
pl->activeTree(), 2).PassAs<LayerImpl>(); | 875 delegated_render_passes, |
| 59 scoped_ptr<LayerImpl> layerAfter = SolidColorLayerImpl::create(m_hostImp
l->activeTree(), 3).PassAs<LayerImpl>(); | 876 RenderPass::Id(10, 7), |
| 60 scoped_ptr<DelegatedRendererLayerImpl> delegatedRendererLayer = Delegate
dRendererLayerImpl::create(m_hostImpl->activeTree(), 4); | 877 child_pass_rect, |
| 61 | 878 gfx::Transform()); |
| 62 m_hostImpl->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100)); | 879 MockQuadCuller quad_sink(pass->quad_list, pass->shared_quad_state_list); |
| 63 rootLayer->setBounds(gfx::Size(100, 100)); | 880 AppendQuadsData data(pass->id); |
| 64 | 881 SharedQuadState* shared_quad_state = |
| 65 layerBefore->setPosition(gfx::Point(20, 20)); | 882 quad_sink.useSharedQuadState(SharedQuadState::Create()); |
| 66 layerBefore->setBounds(gfx::Size(14, 14)); | 883 shared_quad_state->SetAll( |
| 67 layerBefore->setContentBounds(gfx::Size(14, 14)); | 884 child_pass_transform, |
| 68 layerBefore->setDrawsContent(true); | 885 child_pass_rect, |
| 69 layerBefore->setForceRenderSurface(true); | 886 child_pass_clip_rect, |
| 70 | 887 child_pass_clipped, |
| 71 layerAfter->setPosition(gfx::Point(5, 5)); | 888 1.f); |
| 72 layerAfter->setBounds(gfx::Size(15, 15)); | 889 |
| 73 layerAfter->setContentBounds(gfx::Size(15, 15)); | 890 scoped_ptr<SolidColorDrawQuad> color_quad; |
| 74 layerAfter->setDrawsContent(true); | 891 color_quad = SolidColorDrawQuad::Create(); |
| 75 layerAfter->setForceRenderSurface(true); | 892 color_quad->SetNew(shared_quad_state, gfx::Rect(20, 20, 3, 7), 1u); |
| 76 | 893 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 77 delegatedRendererLayer->setPosition(gfx::Point(3, 3)); | 894 |
| 78 delegatedRendererLayer->setBounds(gfx::Size(10, 10)); | 895 color_quad = SolidColorDrawQuad::Create(); |
| 79 delegatedRendererLayer->setContentBounds(gfx::Size(10, 10)); | 896 color_quad->SetNew(shared_quad_state, gfx::Rect(23, 20, 4, 7), 1u); |
| 80 delegatedRendererLayer->setDrawsContent(true); | 897 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 81 gfx::Transform transform; | |
| 82 transform.Translate(1, 1); | |
| 83 delegatedRendererLayer->setTransform(transform); | |
| 84 | |
| 85 ScopedPtrVector<RenderPass> delegatedRenderPasses; | |
| 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); | |
| 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); | |
| 90 addRenderPassQuad(pass2, pass1); | |
| 91 TestRenderPass* pass3 = addRenderPass(delegatedRenderPasses, RenderPass:
:Id(9, 8), gfx::Rect(0, 0, 8, 8), gfx::Transform()); | |
| 92 addRenderPassQuad(pass3, pass2); | |
| 93 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses); | |
| 94 | |
| 95 // The RenderPasses should be taken by the layer. | |
| 96 EXPECT_EQ(0u, delegatedRenderPasses.size()); | |
| 97 | |
| 98 m_rootLayerPtr = rootLayer.get(); | |
| 99 m_layerBeforePtr = layerBefore.get(); | |
| 100 m_layerAfterPtr = layerAfter.get(); | |
| 101 m_delegatedRendererLayerPtr = delegatedRendererLayer.get(); | |
| 102 | |
| 103 // Force the delegated RenderPasses to come before the RenderPass from l
ayerAfter. | |
| 104 layerAfter->addChild(delegatedRendererLayer.PassAs<LayerImpl>()); | |
| 105 rootLayer->addChild(layerAfter.Pass()); | |
| 106 | |
| 107 // Get the RenderPass generated by layerBefore to come before the delega
ted RenderPasses. | |
| 108 rootLayer->addChild(layerBefore.Pass()); | |
| 109 | |
| 110 m_hostImpl->activeTree()->SetRootLayer(rootLayer.Pass()); | |
| 111 } | 898 } |
| 112 | 899 |
| 113 protected: | 900 gfx::Rect root_pass_rect(0, 0, 50, 50); |
| 114 LayerImpl* m_rootLayerPtr; | 901 gfx::Transform root_pass_transform; |
| 115 LayerImpl* m_layerBeforePtr; | 902 gfx::Rect root_pass_clip_rect(5, 5, 40, 40); |
| 116 LayerImpl* m_layerAfterPtr; | 903 bool root_pass_clipped = root_delegated_render_pass_is_clipped_; |
| 117 DelegatedRendererLayerImpl* m_delegatedRendererLayerPtr; | 904 |
| 905 TestRenderPass* pass = addRenderPass( |
| 906 delegated_render_passes, |
| 907 RenderPass::Id(9, 6), |
| 908 root_pass_rect, |
| 909 gfx::Transform()); |
| 910 MockQuadCuller quad_sink(pass->quad_list, pass->shared_quad_state_list); |
| 911 AppendQuadsData data(pass->id); |
| 912 SharedQuadState* shared_quad_state = |
| 913 quad_sink.useSharedQuadState(SharedQuadState::Create()); |
| 914 shared_quad_state->SetAll(root_pass_transform, root_pass_rect, root_pass_cli
p_rect, root_pass_clipped, 1); |
| 915 |
| 916 scoped_ptr<RenderPassDrawQuad> render_pass_quad = |
| 917 RenderPassDrawQuad::Create(); |
| 918 render_pass_quad->SetNew( |
| 919 shared_quad_state, |
| 920 gfx::Rect(5, 5, 7, 7), // rect |
| 921 RenderPass::Id(10, 7), // render_pass_id |
| 922 false, // is_replica |
| 923 0, // mask_resource_id |
| 924 child_pass_rect, // contents_changed_since_last_frame |
| 925 gfx::RectF(), // mask_uv_rect |
| 926 WebKit::WebFilterOperations(), // filters |
| 927 skia::RefPtr<SkImageFilter>(), // filter |
| 928 WebKit::WebFilterOperations()); // background_filters |
| 929 quad_sink.append(render_pass_quad.PassAs<DrawQuad>(), data); |
| 930 |
| 931 scoped_ptr<SolidColorDrawQuad> color_quad; |
| 932 color_quad = SolidColorDrawQuad::Create(); |
| 933 color_quad->SetNew(shared_quad_state, gfx::Rect(0, 0, 10, 10), 1u); |
| 934 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 935 |
| 936 color_quad = SolidColorDrawQuad::Create(); |
| 937 color_quad->SetNew(shared_quad_state, gfx::Rect(0, 10, 10, 10), 2u); |
| 938 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 939 |
| 940 color_quad = SolidColorDrawQuad::Create(); |
| 941 color_quad->SetNew(shared_quad_state, gfx::Rect(10, 0, 10, 10), 3u); |
| 942 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 943 |
| 944 color_quad = SolidColorDrawQuad::Create(); |
| 945 color_quad->SetNew(shared_quad_state, gfx::Rect(10, 10, 10, 10), 4u); |
| 946 quad_sink.append(color_quad.PassAs<DrawQuad>(), data); |
| 947 |
| 948 delegated_renderer_layer->SetRenderPasses(delegated_render_passes); |
| 949 |
| 950 // The RenderPasses should be taken by the layer. |
| 951 EXPECT_EQ(0u, delegated_render_passes.size()); |
| 952 |
| 953 root_layer_ = root_layer.get(); |
| 954 delegated_renderer_layer_ = delegated_renderer_layer.get(); |
| 955 |
| 956 if (clip_delegated_renderer_layer_) { |
| 957 gfx::Rect clip_rect(21, 27, 23, 21); |
| 958 |
| 959 clip_layer->setPosition(clip_rect.origin()); |
| 960 clip_layer->setBounds(clip_rect.size()); |
| 961 clip_layer->setContentBounds(clip_rect.size()); |
| 962 clip_layer->setMasksToBounds(true); |
| 963 |
| 964 origin_layer->setPosition( |
| 965 gfx::PointAtOffsetFromOrigin(-clip_rect.OffsetFromOrigin())); |
| 966 |
| 967 origin_layer->addChild(delegated_renderer_layer.PassAs<LayerImpl>()); |
| 968 clip_layer->addChild(origin_layer.Pass()); |
| 969 root_layer->addChild(clip_layer.Pass()); |
| 970 } else { |
| 971 root_layer->addChild(delegated_renderer_layer.PassAs<LayerImpl>()); |
| 972 } |
| 973 |
| 974 host_impl_->activeTree()->SetRootLayer(root_layer.Pass()); |
| 975 } |
| 976 |
| 977 protected: |
| 978 LayerImpl* root_layer_; |
| 979 DelegatedRendererLayerImpl* delegated_renderer_layer_; |
| 980 bool root_delegated_render_pass_is_clipped_; |
| 981 bool clip_delegated_renderer_layer_; |
| 118 }; | 982 }; |
| 119 | 983 |
| 120 TEST_F(DelegatedRendererLayerImplTestSimple, AddsContributingRenderPasses) | 984 TEST_F(DelegatedRendererLayerImplTestClip, |
| 121 { | 985 QuadsUnclipped_LayerUnclipped_NoSurface) { |
| 122 LayerTreeHostImpl::FrameData frame; | 986 root_delegated_render_pass_is_clipped_ = false; |
| 123 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 987 clip_delegated_renderer_layer_ = false; |
| 124 | 988 SetUpTest(); |
| 125 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. | 989 |
| 126 ASSERT_EQ(5u, frame.renderPasses.size()); | 990 LayerTreeHostImpl::FrameData frame; |
| 127 | 991 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 128 // The DelegatedRendererLayer should have added its contributing RenderPasse
s to the frame. | 992 |
| 129 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); | 993 ASSERT_EQ(2u, frame.renderPasses.size()); |
| 130 EXPECT_EQ(1, frame.renderPasses[1]->id.index); | 994 const QuadList& contrib_delegated_quad_list = |
| 131 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); | 995 frame.renderPasses[0]->quad_list; |
| 132 EXPECT_EQ(2, frame.renderPasses[2]->id.index); | 996 ASSERT_EQ(2u, contrib_delegated_quad_list.size()); |
| 133 // And all other RenderPasses should be non-delegated. | 997 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list; |
| 134 EXPECT_NE(4, frame.renderPasses[0]->id.layer_id); | 998 ASSERT_EQ(5u, root_delegated_quad_list.size()); |
| 135 EXPECT_EQ(0, frame.renderPasses[0]->id.index); | 999 const SharedQuadState* root_delegated_shared_quad_state = |
| 136 EXPECT_NE(4, frame.renderPasses[3]->id.layer_id); | 1000 root_delegated_quad_list[0]->shared_quad_state; |
| 137 EXPECT_EQ(0, frame.renderPasses[3]->id.index); | 1001 const SharedQuadState* contrib_delegated_shared_quad_state = |
| 138 EXPECT_NE(4, frame.renderPasses[4]->id.layer_id); | 1002 contrib_delegated_quad_list[0]->shared_quad_state; |
| 139 EXPECT_EQ(0, frame.renderPasses[4]->id.index); | 1003 |
| 140 | 1004 // When the quads don't have a clip of their own, the clip rect is set to |
| 141 // The DelegatedRendererLayer should have added its RenderPasses to the fram
e in order. | 1005 // the drawableContentRect of the delegated renderer layer. |
| 142 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame.renderPasses[1]->output_rect); | 1006 EXPECT_EQ(gfx::Rect(20, 20, 50, 50).ToString(), |
| 143 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame.renderPasses[2]->output_rect); | 1007 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 144 | 1008 // Quads are clipped to the delegated renderer layer. |
| 145 m_hostImpl->drawLayers(frame); | 1009 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
| 146 m_hostImpl->didDrawAllLayers(frame); | 1010 |
| 147 } | 1011 host_impl_->drawLayers(frame); |
| 148 | 1012 host_impl_->didDrawAllLayers(frame); |
| 149 TEST_F(DelegatedRendererLayerImplTestSimple, AddsQuadsToContributingRenderPasses
) | 1013 } |
| 150 { | 1014 |
| 151 LayerTreeHostImpl::FrameData frame; | 1015 TEST_F(DelegatedRendererLayerImplTestClip, |
| 152 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 1016 QuadsClipped_LayerUnclipped_NoSurface) { |
| 153 | 1017 root_delegated_render_pass_is_clipped_ = true; |
| 154 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. | 1018 clip_delegated_renderer_layer_ = false; |
| 155 ASSERT_EQ(5u, frame.renderPasses.size()); | 1019 SetUpTest(); |
| 156 | 1020 |
| 157 // The DelegatedRendererLayer should have added its contributing RenderPasse
s to the frame. | 1021 LayerTreeHostImpl::FrameData frame; |
| 158 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); | 1022 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 159 EXPECT_EQ(1, frame.renderPasses[1]->id.index); | 1023 |
| 160 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); | 1024 ASSERT_EQ(2u, frame.renderPasses.size()); |
| 161 EXPECT_EQ(2, frame.renderPasses[2]->id.index); | 1025 const QuadList& contrib_delegated_quad_list = |
| 162 | 1026 frame.renderPasses[0]->quad_list; |
| 163 // The DelegatedRendererLayer should have added copies of its quads to contr
ibuting RenderPasses. | 1027 ASSERT_EQ(2u, contrib_delegated_quad_list.size()); |
| 164 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); | 1028 const QuadList& root_delegated_quad_list = |
| 165 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame.renderPasses[1]->quad_list[0]->r
ect); | 1029 frame.renderPasses[1]->quad_list; |
| 166 | 1030 ASSERT_EQ(5u, root_delegated_quad_list.size()); |
| 167 // Verify it added the right quads. | 1031 const SharedQuadState* root_delegated_shared_quad_state = |
| 168 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); | 1032 root_delegated_quad_list[0]->shared_quad_state; |
| 169 EXPECT_RECT_EQ(gfx::Rect(0, 0, 7, 7), frame.renderPasses[2]->quad_list[0]->r
ect); | 1033 const SharedQuadState* contrib_delegated_shared_quad_state = |
| 170 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame.renderPasses[2]->quad_list[1]->r
ect); | 1034 contrib_delegated_quad_list[0]->shared_quad_state; |
| 171 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); | 1035 |
| 172 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame.renderPasses[1]->quad_list[0]->r
ect); | 1036 // When the quads have a clip of their own, it is used. |
| 173 | 1037 EXPECT_EQ(gfx::Rect(25, 25, 40, 40).ToString(), |
| 174 m_hostImpl->drawLayers(frame); | 1038 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 175 m_hostImpl->didDrawAllLayers(frame); | 1039 // Quads came with a clip rect. |
| 176 } | 1040 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
| 177 | 1041 |
| 178 TEST_F(DelegatedRendererLayerImplTestSimple, AddsQuadsToTargetRenderPass) | 1042 host_impl_->drawLayers(frame); |
| 179 { | 1043 host_impl_->didDrawAllLayers(frame); |
| 180 LayerTreeHostImpl::FrameData frame; | 1044 } |
| 181 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 1045 |
| 182 | 1046 TEST_F(DelegatedRendererLayerImplTestClip, |
| 183 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. | 1047 QuadsUnclipped_LayerClipped_NoSurface) { |
| 184 ASSERT_EQ(5u, frame.renderPasses.size()); | 1048 root_delegated_render_pass_is_clipped_ = false; |
| 185 | 1049 clip_delegated_renderer_layer_ = true; |
| 186 // The layer's target is the RenderPass from m_layerAfter. | 1050 SetUpTest(); |
| 187 EXPECT_EQ(RenderPass::Id(3, 0), frame.renderPasses[3]->id); | 1051 |
| 188 | 1052 LayerTreeHostImpl::FrameData frame; |
| 189 // The DelegatedRendererLayer should have added copies of quads in its root
RenderPass to its target RenderPass. | 1053 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 190 // The m_layerAfter also adds one quad. | 1054 |
| 191 ASSERT_EQ(2u, frame.renderPasses[3]->quad_list.size()); | 1055 ASSERT_EQ(2u, frame.renderPasses.size()); |
| 192 | 1056 const QuadList& contrib_delegated_quad_list = |
| 193 // Verify it added the right quads. | 1057 frame.renderPasses[0]->quad_list; |
| 194 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame.renderPasses[3]->quad_list[0]->r
ect); | 1058 ASSERT_EQ(2u, contrib_delegated_quad_list.size()); |
| 195 | 1059 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list; |
| 196 // Its target layer should have a quad as well. | 1060 ASSERT_EQ(5u, root_delegated_quad_list.size()); |
| 197 EXPECT_RECT_EQ(gfx::Rect(0, 0, 15, 15), frame.renderPasses[3]->quad_list[1]-
>rect); | 1061 const SharedQuadState* root_delegated_shared_quad_state = |
| 198 | 1062 root_delegated_quad_list[0]->shared_quad_state; |
| 199 m_hostImpl->drawLayers(frame); | 1063 const SharedQuadState* contrib_delegated_shared_quad_state = |
| 200 m_hostImpl->didDrawAllLayers(frame); | 1064 contrib_delegated_quad_list[0]->shared_quad_state; |
| 201 } | 1065 |
| 202 | 1066 // When the quads don't have a clip of their own, the clip rect is set to |
| 203 TEST_F(DelegatedRendererLayerImplTestSimple, QuadsFromRootRenderPassAreModifiedF
orTheTarget) | 1067 // the drawableContentRect of the delegated renderer layer. When the layer |
| 204 { | 1068 // is clipped, that should be seen in the quads' clip_rect. |
| 205 LayerTreeHostImpl::FrameData frame; | 1069 EXPECT_EQ(gfx::Rect(21, 27, 23, 21).ToString(), |
| 206 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 1070 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 207 | 1071 // Quads are clipped to the delegated renderer layer. |
| 208 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. | 1072 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
| 209 ASSERT_EQ(5u, frame.renderPasses.size()); | 1073 |
| 210 | 1074 host_impl_->drawLayers(frame); |
| 211 // The DelegatedRendererLayer is at position 3,3 compared to its target, and
has a translation transform of 1,1. | 1075 host_impl_->didDrawAllLayers(frame); |
| 212 // So its root RenderPass' quads should all be transformed by that combined
amount. | 1076 } |
| 213 // The DelegatedRendererLayer has a size of 10x10, but the root delegated Re
nderPass has a size of 8x8, so | 1077 |
| 214 // any quads should be scaled by 10/8. | 1078 TEST_F(DelegatedRendererLayerImplTestClip, |
| 215 gfx::Transform transform; | 1079 QuadsClipped_LayerClipped_NoSurface) { |
| 216 transform.Translate(4.0, 4.0); | 1080 root_delegated_render_pass_is_clipped_ = true; |
| 217 transform.Scale(10.0 / 8.0, 10.0 / 8.0); | 1081 clip_delegated_renderer_layer_ = true; |
| 218 EXPECT_TRANSFORMATION_MATRIX_EQ(transform, frame.renderPasses[3]->quad_list[
0]->quadTransform()); | 1082 SetUpTest(); |
| 219 | 1083 |
| 220 // Quads from non-root RenderPasses should not be shifted though. | 1084 LayerTreeHostImpl::FrameData frame; |
| 221 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); | 1085 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 222 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua
d_list[0]->quadTransform()); | 1086 |
| 223 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua
d_list[1]->quadTransform()); | 1087 ASSERT_EQ(2u, frame.renderPasses.size()); |
| 224 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); | 1088 const QuadList& contrib_delegated_quad_list = |
| 225 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[1]->qua
d_list[0]->quadTransform()); | 1089 frame.renderPasses[0]->quad_list; |
| 226 | 1090 ASSERT_EQ(2u, contrib_delegated_quad_list.size()); |
| 227 m_hostImpl->drawLayers(frame); | 1091 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list; |
| 228 m_hostImpl->didDrawAllLayers(frame); | 1092 ASSERT_EQ(5u, root_delegated_quad_list.size()); |
| 229 } | 1093 const SharedQuadState* root_delegated_shared_quad_state = |
| 230 | 1094 root_delegated_quad_list[0]->shared_quad_state; |
| 231 TEST_F(DelegatedRendererLayerImplTestSimple, DoesNotOwnARenderSurface) | 1095 const SharedQuadState* contrib_delegated_shared_quad_state = |
| 232 { | 1096 contrib_delegated_quad_list[0]->shared_quad_state; |
| 233 LayerTreeHostImpl::FrameData frame; | 1097 |
| 234 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 1098 // When the quads have a clip of their own, it is used, but it is |
| 235 | 1099 // combined with the clip rect of the delegated renderer layer. |
| 236 // If the DelegatedRendererLayer is axis aligned and has opacity 1, then | 1100 EXPECT_EQ(gfx::Rect(25, 27, 19, 21).ToString(), |
| 237 // it has no need to be a renderSurface for the quads it carries. | 1101 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 238 EXPECT_FALSE(m_delegatedRendererLayerPtr->renderSurface()); | 1102 // Quads came with a clip rect. |
| 239 | 1103 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
| 240 m_hostImpl->drawLayers(frame); | 1104 |
| 241 m_hostImpl->didDrawAllLayers(frame); | 1105 host_impl_->drawLayers(frame); |
| 242 } | 1106 host_impl_->didDrawAllLayers(frame); |
| 243 | 1107 } |
| 244 TEST_F(DelegatedRendererLayerImplTestSimple, DoesOwnARenderSurfaceForOpacity) | 1108 |
| 245 { | 1109 TEST_F(DelegatedRendererLayerImplTestClip, |
| 246 m_delegatedRendererLayerPtr->setOpacity(0.5f); | 1110 QuadsUnclipped_LayerUnclipped_Surface) { |
| 247 | 1111 root_delegated_render_pass_is_clipped_ = false; |
| 248 LayerTreeHostImpl::FrameData frame; | 1112 clip_delegated_renderer_layer_ = false; |
| 249 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 1113 SetUpTest(); |
| 250 | 1114 |
| 251 // This test case has quads from multiple layers in the delegated renderer, | 1115 delegated_renderer_layer_->setForceRenderSurface(true); |
| 252 // so if the DelegatedRendererLayer has opacity < 1, it should end up with | 1116 |
| 253 // a render surface. | 1117 LayerTreeHostImpl::FrameData frame; |
| 254 EXPECT_TRUE(m_delegatedRendererLayerPtr->renderSurface()); | 1118 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 255 | 1119 |
| 256 m_hostImpl->drawLayers(frame); | 1120 ASSERT_EQ(3u, frame.renderPasses.size()); |
| 257 m_hostImpl->didDrawAllLayers(frame); | 1121 const QuadList& contrib_delegated_quad_list = |
| 258 } | 1122 frame.renderPasses[0]->quad_list; |
| 259 | 1123 ASSERT_EQ(2u, contrib_delegated_quad_list.size()); |
| 260 TEST_F(DelegatedRendererLayerImplTestSimple, DoesOwnARenderSurfaceForTransform) | 1124 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list; |
| 261 { | 1125 ASSERT_EQ(5u, root_delegated_quad_list.size()); |
| 262 gfx::Transform rotation; | 1126 const SharedQuadState* root_delegated_shared_quad_state = |
| 263 rotation.RotateAboutZAxis(30.0); | 1127 root_delegated_quad_list[0]->shared_quad_state; |
| 264 m_delegatedRendererLayerPtr->setTransform(rotation); | 1128 const SharedQuadState* contrib_delegated_shared_quad_state = |
| 265 | 1129 contrib_delegated_quad_list[0]->shared_quad_state; |
| 266 LayerTreeHostImpl::FrameData frame; | 1130 |
| 267 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 1131 // When the layer owns a surface, the quads don't need to be clipped |
| 268 | 1132 // further than they already specify. If they aren't clipped, then their |
| 269 // This test case has quads from multiple layers in the delegated renderer, | 1133 // clip rect is ignored, and they are not set as clipped. |
| 270 // so if the DelegatedRendererLayer has opacity < 1, it should end up with | 1134 EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped); |
| 271 // a render surface. | 1135 |
| 272 EXPECT_TRUE(m_delegatedRendererLayerPtr->renderSurface()); | 1136 host_impl_->drawLayers(frame); |
| 273 | 1137 host_impl_->didDrawAllLayers(frame); |
| 274 m_hostImpl->drawLayers(frame); | 1138 } |
| 275 m_hostImpl->didDrawAllLayers(frame); | 1139 |
| 276 } | 1140 TEST_F(DelegatedRendererLayerImplTestClip, |
| 277 | 1141 QuadsClipped_LayerUnclipped_Surface) { |
| 278 class DelegatedRendererLayerImplTestOwnSurface : public DelegatedRendererLayerIm
plTestSimple { | 1142 root_delegated_render_pass_is_clipped_ = true; |
| 279 public: | 1143 clip_delegated_renderer_layer_ = false; |
| 280 DelegatedRendererLayerImplTestOwnSurface() | 1144 SetUpTest(); |
| 281 : DelegatedRendererLayerImplTestSimple() | 1145 |
| 282 { | 1146 delegated_renderer_layer_->setForceRenderSurface(true); |
| 283 m_delegatedRendererLayerPtr->setForceRenderSurface(true); | 1147 |
| 284 } | 1148 LayerTreeHostImpl::FrameData frame; |
| 285 }; | 1149 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 286 | 1150 |
| 287 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsRenderPasses) | 1151 ASSERT_EQ(3u, frame.renderPasses.size()); |
| 288 { | 1152 const QuadList& contrib_delegated_quad_list = frame.renderPasses[0]->quad_list
; |
| 289 LayerTreeHostImpl::FrameData frame; | 1153 ASSERT_EQ(2u, contrib_delegated_quad_list.size()); |
| 290 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 1154 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list; |
| 291 | 1155 ASSERT_EQ(5u, root_delegated_quad_list.size()); |
| 292 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes and its owned surface added one pass. | 1156 const SharedQuadState* root_delegated_shared_quad_state = root_delegated_quad_
list[0]->shared_quad_state; |
| 293 ASSERT_EQ(6u, frame.renderPasses.size()); | 1157 const SharedQuadState* contrib_delegated_shared_quad_state = |
| 294 | 1158 contrib_delegated_quad_list[0]->shared_quad_state; |
| 295 // The DelegatedRendererLayer should have added its contributing RenderPasse
s to the frame. | 1159 |
| 296 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); | 1160 // When the quads have a clip of their own, it is used. |
| 297 EXPECT_EQ(1, frame.renderPasses[1]->id.index); | 1161 EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(), |
| 298 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); | 1162 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 299 EXPECT_EQ(2, frame.renderPasses[2]->id.index); | 1163 // Quads came with a clip rect. |
| 300 // The DelegatedRendererLayer should have added a RenderPass for its surface
to the frame. | 1164 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
| 301 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); | 1165 |
| 302 EXPECT_EQ(0, frame.renderPasses[3]->id.index); | 1166 host_impl_->drawLayers(frame); |
| 303 // And all other RenderPasses should be non-delegated. | 1167 host_impl_->didDrawAllLayers(frame); |
| 304 EXPECT_NE(4, frame.renderPasses[0]->id.layer_id); | 1168 } |
| 305 EXPECT_EQ(0, frame.renderPasses[0]->id.index); | 1169 |
| 306 EXPECT_NE(4, frame.renderPasses[4]->id.layer_id); | 1170 TEST_F(DelegatedRendererLayerImplTestClip, |
| 307 EXPECT_EQ(0, frame.renderPasses[4]->id.index); | 1171 QuadsUnclipped_LayerClipped_Surface) { |
| 308 EXPECT_NE(4, frame.renderPasses[5]->id.layer_id); | 1172 root_delegated_render_pass_is_clipped_ = false; |
| 309 EXPECT_EQ(0, frame.renderPasses[5]->id.index); | 1173 clip_delegated_renderer_layer_ = true; |
| 310 | 1174 SetUpTest(); |
| 311 // The DelegatedRendererLayer should have added its RenderPasses to the fram
e in order. | 1175 |
| 312 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame.renderPasses[1]->output_rect); | 1176 delegated_renderer_layer_->setForceRenderSurface(true); |
| 313 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame.renderPasses[2]->output_rect); | 1177 |
| 314 | 1178 LayerTreeHostImpl::FrameData frame; |
| 315 m_hostImpl->drawLayers(frame); | 1179 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 316 m_hostImpl->didDrawAllLayers(frame); | 1180 |
| 317 } | 1181 ASSERT_EQ(3u, frame.renderPasses.size()); |
| 318 | 1182 const QuadList& contrib_delegated_quad_list = |
| 319 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsQuadsToContributingRenderPa
sses) | 1183 frame.renderPasses[0]->quad_list; |
| 320 { | 1184 ASSERT_EQ(2u, contrib_delegated_quad_list.size()); |
| 321 LayerTreeHostImpl::FrameData frame; | 1185 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list; |
| 322 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 1186 ASSERT_EQ(5u, root_delegated_quad_list.size()); |
| 323 | 1187 const SharedQuadState* root_delegated_shared_quad_state = |
| 324 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes and its owned surface added one pass. | 1188 root_delegated_quad_list[0]->shared_quad_state; |
| 325 ASSERT_EQ(6u, frame.renderPasses.size()); | 1189 const SharedQuadState* contrib_delegated_shared_quad_state = |
| 326 | 1190 contrib_delegated_quad_list[0]->shared_quad_state; |
| 327 // The DelegatedRendererLayer should have added its contributing RenderPasse
s to the frame. | 1191 |
| 328 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); | 1192 // When the layer owns a surface, the quads don't need to be clipped |
| 329 EXPECT_EQ(1, frame.renderPasses[1]->id.index); | 1193 // further than they already specify. If they aren't clipped, then their |
| 330 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); | 1194 // clip rect is ignored, and they are not set as clipped. |
| 331 EXPECT_EQ(2, frame.renderPasses[2]->id.index); | 1195 EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped); |
| 332 | 1196 |
| 333 // The DelegatedRendererLayer should have added copies of its quads to contr
ibuting RenderPasses. | 1197 host_impl_->drawLayers(frame); |
| 334 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); | 1198 host_impl_->didDrawAllLayers(frame); |
| 335 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame.renderPasses[1]->quad_list[0]->r
ect); | 1199 } |
| 336 | 1200 |
| 337 // Verify it added the right quads. | 1201 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerClipped_Surface) { |
| 338 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); | 1202 root_delegated_render_pass_is_clipped_ = true; |
| 339 EXPECT_RECT_EQ(gfx::Rect(0, 0, 7, 7), frame.renderPasses[2]->quad_list[0]->r
ect); | 1203 clip_delegated_renderer_layer_ = true; |
| 340 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame.renderPasses[2]->quad_list[1]->r
ect); | 1204 SetUpTest(); |
| 341 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); | 1205 |
| 342 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame.renderPasses[1]->quad_list[0]->r
ect); | 1206 delegated_renderer_layer_->setForceRenderSurface(true); |
| 343 | 1207 |
| 344 m_hostImpl->drawLayers(frame); | 1208 LayerTreeHostImpl::FrameData frame; |
| 345 m_hostImpl->didDrawAllLayers(frame); | 1209 EXPECT_TRUE(host_impl_->prepareToDraw(frame)); |
| 346 } | 1210 |
| 347 | 1211 ASSERT_EQ(3u, frame.renderPasses.size()); |
| 348 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsQuadsToTargetRenderPass) | 1212 const QuadList& contrib_delegated_quad_list = |
| 349 { | 1213 frame.renderPasses[0]->quad_list; |
| 350 LayerTreeHostImpl::FrameData frame; | 1214 ASSERT_EQ(2u, contrib_delegated_quad_list.size()); |
| 351 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 1215 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list; |
| 352 | 1216 ASSERT_EQ(5u, root_delegated_quad_list.size()); |
| 353 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes and its owned surface added one pass. | 1217 const SharedQuadState* root_delegated_shared_quad_state = |
| 354 ASSERT_EQ(6u, frame.renderPasses.size()); | 1218 root_delegated_quad_list[0]->shared_quad_state; |
| 355 | 1219 const SharedQuadState* contrib_delegated_shared_quad_state = |
| 356 // The layer's target is the RenderPass owned by itself. | 1220 contrib_delegated_quad_list[0]->shared_quad_state; |
| 357 EXPECT_EQ(RenderPass::Id(4, 0), frame.renderPasses[3]->id); | 1221 |
| 358 | 1222 // When the quads have a clip of their own, it is used, but it is |
| 359 // The DelegatedRendererLayer should have added copies of quads in its root
RenderPass to its target RenderPass. | 1223 // combined with the clip rect of the delegated renderer layer. If the |
| 360 // The m_layerAfter also adds one quad. | 1224 // layer owns a surface, then it does not have a clip rect of its own. |
| 361 ASSERT_EQ(1u, frame.renderPasses[3]->quad_list.size()); | 1225 EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(), |
| 362 | 1226 root_delegated_shared_quad_state->clip_rect.ToString()); |
| 363 // Verify it added the right quads. | 1227 // Quads came with a clip rect. |
| 364 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame.renderPasses[3]->quad_list[0]->r
ect); | 1228 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
| 365 | 1229 |
| 366 m_hostImpl->drawLayers(frame); | 1230 host_impl_->drawLayers(frame); |
| 367 m_hostImpl->didDrawAllLayers(frame); | 1231 host_impl_->didDrawAllLayers(frame); |
| 368 } | |
| 369 | |
| 370 TEST_F(DelegatedRendererLayerImplTestOwnSurface, QuadsFromRootRenderPassAreNotMo
difiedForTheTarget) | |
| 371 { | |
| 372 LayerTreeHostImpl::FrameData frame; | |
| 373 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 374 | |
| 375 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes and its owned surface added one pass. | |
| 376 ASSERT_EQ(6u, frame.renderPasses.size()); | |
| 377 | |
| 378 // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root Ren
derPass' quads do not need to be | |
| 379 // translated at all. However, they are scaled from the frame's size (8x8) t
o the layer's bounds (10x10). | |
| 380 gfx::Transform transform; | |
| 381 transform.Scale(10.0 / 8.0, 10.0 / 8.0); | |
| 382 EXPECT_TRANSFORMATION_MATRIX_EQ(transform, frame.renderPasses[3]->quad_list[
0]->quadTransform()); | |
| 383 | |
| 384 // Quads from non-root RenderPasses should not be shifted either. | |
| 385 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); | |
| 386 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua
d_list[0]->quadTransform()); | |
| 387 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua
d_list[1]->quadTransform()); | |
| 388 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); | |
| 389 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[1]->qua
d_list[0]->quadTransform()); | |
| 390 | |
| 391 m_hostImpl->drawLayers(frame); | |
| 392 m_hostImpl->didDrawAllLayers(frame); | |
| 393 } | |
| 394 | |
| 395 class DelegatedRendererLayerImplTestTransform : public DelegatedRendererLayerImp
lTest { | |
| 396 public: | |
| 397 void setUpTest() | |
| 398 { | |
| 399 scoped_ptr<LayerImpl> rootLayer = LayerImpl::create(m_hostImpl->activeTr
ee(), 1); | |
| 400 scoped_ptr<DelegatedRendererLayerImpl> delegatedRendererLayer = Delegate
dRendererLayerImpl::create(m_hostImpl->activeTree(), 2); | |
| 401 | |
| 402 m_hostImpl->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100)); | |
| 403 rootLayer->setBounds(gfx::Size(100, 100)); | |
| 404 | |
| 405 delegatedRendererLayer->setPosition(gfx::Point(20, 20)); | |
| 406 delegatedRendererLayer->setBounds(gfx::Size(30, 30)); | |
| 407 delegatedRendererLayer->setContentBounds(gfx::Size(30, 30)); | |
| 408 delegatedRendererLayer->setDrawsContent(true); | |
| 409 gfx::Transform transform; | |
| 410 transform.Scale(2.0, 2.0); | |
| 411 transform.Translate(8.0, 8.0); | |
| 412 delegatedRendererLayer->setTransform(transform); | |
| 413 | |
| 414 ScopedPtrVector<RenderPass> delegatedRenderPasses; | |
| 415 | |
| 416 gfx::Rect childPassRect(20, 20, 7, 7); | |
| 417 gfx::Transform childPassTransform; | |
| 418 childPassTransform.Scale(0.8, 0.8); | |
| 419 childPassTransform.Translate(9.0, 9.0); | |
| 420 gfx::Rect childPassClipRect(21, 21, 3, 3); | |
| 421 bool childPassClipped = false; | |
| 422 | |
| 423 { | |
| 424 TestRenderPass* pass = addRenderPass(delegatedRenderPasses, RenderPa
ss::Id(10, 7), childPassRect, gfx::Transform()); | |
| 425 MockQuadCuller quadSink(pass->quad_list, pass->shared_quad_state_lis
t); | |
| 426 AppendQuadsData data(pass->id); | |
| 427 SharedQuadState* sharedState = quadSink.useSharedQuadState(SharedQua
dState::Create()); | |
| 428 sharedState->SetAll(childPassTransform, childPassRect, childPassClip
Rect, childPassClipped, 1); | |
| 429 scoped_ptr<SolidColorDrawQuad> colorQuad; | |
| 430 | |
| 431 colorQuad = SolidColorDrawQuad::Create(); | |
| 432 colorQuad->SetNew(sharedState, gfx::Rect(20, 20, 3, 7), 1u); | |
| 433 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 434 | |
| 435 colorQuad = SolidColorDrawQuad::Create(); | |
| 436 colorQuad->SetNew(sharedState, gfx::Rect(23, 20, 4, 7), 1u); | |
| 437 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 438 } | |
| 439 | |
| 440 gfx::Rect passRect(0, 0, 50, 50); | |
| 441 gfx::Transform passTransform; | |
| 442 passTransform.Scale(1.5, 1.5); | |
| 443 passTransform.Translate(7.0, 7.0); | |
| 444 gfx::Rect passClipRect(10, 10, 35, 35); | |
| 445 bool passClipped = m_rootDelegatedRenderPassIsClipped; | |
| 446 | |
| 447 TestRenderPass* pass = addRenderPass(delegatedRenderPasses, RenderPass::
Id(9, 6), passRect, gfx::Transform()); | |
| 448 MockQuadCuller quadSink(pass->quad_list, pass->shared_quad_state_list); | |
| 449 AppendQuadsData data(pass->id); | |
| 450 SharedQuadState* sharedState = quadSink.useSharedQuadState(SharedQuadSta
te::Create()); | |
| 451 sharedState->SetAll(passTransform, passRect, passClipRect, passClipped,
1); | |
| 452 scoped_ptr<SolidColorDrawQuad> colorQuad; | |
| 453 | |
| 454 scoped_ptr<RenderPassDrawQuad> renderPassQuad = RenderPassDrawQuad::Crea
te(); | |
| 455 renderPassQuad->SetNew( | |
| 456 sharedState, | |
| 457 gfx::Rect(5, 5, 7, 7), | |
| 458 RenderPass::Id(10, 7), | |
| 459 false, // is_replica | |
| 460 0, // mask_resource_id | |
| 461 childPassRect, // contents_changed_since_last_frame | |
| 462 gfx::RectF(), // mask_uv_rect | |
| 463 WebKit::WebFilterOperations(), // filters | |
| 464 skia::RefPtr<SkImageFilter>(), // filter | |
| 465 WebKit::WebFilterOperations()); // background_filters | |
| 466 quadSink.append(renderPassQuad.PassAs<DrawQuad>(), data); | |
| 467 | |
| 468 colorQuad = SolidColorDrawQuad::Create(); | |
| 469 colorQuad->SetNew(sharedState, gfx::Rect(0, 0, 10, 10), 1u); | |
| 470 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 471 | |
| 472 colorQuad = SolidColorDrawQuad::Create(); | |
| 473 colorQuad->SetNew(sharedState, gfx::Rect(0, 10, 10, 10), 2u); | |
| 474 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 475 | |
| 476 colorQuad = SolidColorDrawQuad::Create(); | |
| 477 colorQuad->SetNew(sharedState, gfx::Rect(10, 0, 10, 10), 3u); | |
| 478 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 479 | |
| 480 colorQuad = SolidColorDrawQuad::Create(); | |
| 481 colorQuad->SetNew(sharedState, gfx::Rect(10, 10, 10, 10), 4u); | |
| 482 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 483 | |
| 484 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses); | |
| 485 | |
| 486 // The RenderPasses should be taken by the layer. | |
| 487 EXPECT_EQ(0u, delegatedRenderPasses.size()); | |
| 488 | |
| 489 m_rootLayerPtr = rootLayer.get(); | |
| 490 m_delegatedRendererLayerPtr = delegatedRendererLayer.get(); | |
| 491 | |
| 492 rootLayer->addChild(delegatedRendererLayer.PassAs<LayerImpl>()); | |
| 493 | |
| 494 m_hostImpl->activeTree()->SetRootLayer(rootLayer.Pass()); | |
| 495 } | |
| 496 | |
| 497 void verifyRenderPasses( | |
| 498 const LayerTreeHostImpl::FrameData& frame, | |
| 499 size_t numRenderPasses, | |
| 500 const SharedQuadState** rootSharedState, | |
| 501 const SharedQuadState** contribSharedState) | |
| 502 { | |
| 503 ASSERT_EQ(numRenderPasses, frame.renderPasses.size()); | |
| 504 // The contributing render pass in the DelegatedRendererLayer. | |
| 505 EXPECT_EQ(2, frame.renderPasses[0]->id.layer_id); | |
| 506 EXPECT_EQ(1, frame.renderPasses[0]->id.index); | |
| 507 // The root render pass. | |
| 508 EXPECT_EQ(1, frame.renderPasses.back()->id.layer_id); | |
| 509 EXPECT_EQ(0, frame.renderPasses.back()->id.index); | |
| 510 | |
| 511 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list; | |
| 512 ASSERT_EQ(2u, contribQuadList.size()); | |
| 513 | |
| 514 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; | |
| 515 ASSERT_EQ(5u, rootQuadList.size()); | |
| 516 | |
| 517 // All quads in a render pass should share the same state. | |
| 518 *contribSharedState = contribQuadList[0]->shared_quad_state; | |
| 519 EXPECT_EQ(*contribSharedState, contribQuadList[1]->shared_quad_state); | |
| 520 | |
| 521 *rootSharedState = rootQuadList[0]->shared_quad_state; | |
| 522 EXPECT_EQ(*rootSharedState, rootQuadList[1]->shared_quad_state); | |
| 523 EXPECT_EQ(*rootSharedState, rootQuadList[2]->shared_quad_state); | |
| 524 EXPECT_EQ(*rootSharedState, rootQuadList[3]->shared_quad_state); | |
| 525 EXPECT_EQ(*rootSharedState, rootQuadList[4]->shared_quad_state); | |
| 526 | |
| 527 EXPECT_NE(*contribSharedState, *rootSharedState); | |
| 528 } | |
| 529 | |
| 530 protected: | |
| 531 LayerImpl* m_rootLayerPtr; | |
| 532 DelegatedRendererLayerImpl* m_delegatedRendererLayerPtr; | |
| 533 bool m_rootDelegatedRenderPassIsClipped; | |
| 534 }; | |
| 535 | |
| 536 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_NoSurface) | |
| 537 { | |
| 538 m_rootDelegatedRenderPassIsClipped = false; | |
| 539 setUpTest(); | |
| 540 | |
| 541 LayerTreeHostImpl::FrameData frame; | |
| 542 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 543 | |
| 544 const SharedQuadState* rootSharedState = NULL; | |
| 545 const SharedQuadState* contribSharedState = NULL; | |
| 546 verifyRenderPasses(frame, 2, &rootSharedState, &contribSharedState); | |
| 547 | |
| 548 // When the quads don't have a clip of their own, the clip rect is set to | |
| 549 // the drawableContentRect of the delegated renderer layer. | |
| 550 EXPECT_RECT_EQ(gfx::Rect(21, 21, 60, 60), rootSharedState->clip_rect); | |
| 551 | |
| 552 // Even though the quads in the root pass have no clip of their own, they | |
| 553 // inherit the clip rect from the delegated renderer layer if it does not | |
| 554 // own a surface. | |
| 555 EXPECT_TRUE(rootSharedState->is_clipped); | |
| 556 | |
| 557 gfx::Transform expected; | |
| 558 // This is the transform from the layer's space to its target. | |
| 559 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5 | |
| 560 expected.Translate(5.0, 5.0); | |
| 561 expected.Scale(2.0, 2.0); | |
| 562 expected.Translate(8.0, 8.0); | |
| 563 // The frame has size 50x50 but the layer's bounds are 30x30. | |
| 564 expected.Scale(30.0 / 50.0, 30.0 / 50.0); | |
| 565 // This is the transform within the source frame. | |
| 566 expected.Scale(1.5, 1.5); | |
| 567 expected.Translate(7.0, 7.0); | |
| 568 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target
_transform); | |
| 569 | |
| 570 // The contributing render pass should not be transformed from its input. | |
| 571 EXPECT_RECT_EQ(gfx::Rect(21, 21, 3, 3), contribSharedState->clip_rect); | |
| 572 EXPECT_FALSE(contribSharedState->is_clipped); | |
| 573 expected.MakeIdentity(); | |
| 574 expected.Scale(0.8, 0.8); | |
| 575 expected.Translate(9.0, 9.0); | |
| 576 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar
get_transform); | |
| 577 | |
| 578 m_hostImpl->drawLayers(frame); | |
| 579 m_hostImpl->didDrawAllLayers(frame); | |
| 580 } | |
| 581 | |
| 582 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_NoSurface) | |
| 583 { | |
| 584 m_rootDelegatedRenderPassIsClipped = true; | |
| 585 setUpTest(); | |
| 586 | |
| 587 LayerTreeHostImpl::FrameData frame; | |
| 588 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 589 | |
| 590 const SharedQuadState* rootSharedState = NULL; | |
| 591 const SharedQuadState* contribSharedState = NULL; | |
| 592 verifyRenderPasses(frame, 2, &rootSharedState, &contribSharedState); | |
| 593 | |
| 594 // Since the quads have a clip_rect it should be modified by delegated | |
| 595 // renderer layer's drawTransform. | |
| 596 // The position of the resulting clip_rect is: | |
| 597 // (clip rect position (10) * scale to layer (30/50) + translate (8)) * laye
r scale (2) + layer position (20) = 48 | |
| 598 // 48 - (width / 2) = 48 - 30 / 2 = 33 | |
| 599 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from | |
| 600 // a frame at 50x50: | |
| 601 // 35 * 2 (layer's scale) * 30 / 50 = 42. | |
| 602 EXPECT_RECT_EQ(gfx::Rect(33, 33, 42, 42), rootSharedState->clip_rect); | |
| 603 | |
| 604 // The quads had a clip and it should be preserved. | |
| 605 EXPECT_TRUE(rootSharedState->is_clipped); | |
| 606 | |
| 607 gfx::Transform expected; | |
| 608 // This is the transform from the layer's space to its target. | |
| 609 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5 | |
| 610 expected.Translate(5.0, 5.0); | |
| 611 expected.Scale(2.0, 2.0); | |
| 612 expected.Translate(8.0, 8.0); | |
| 613 // The frame has size 50x50 but the layer's bounds are 30x30. | |
| 614 expected.Scale(30.0 / 50.0, 30.0 / 50.0); | |
| 615 // This is the transform within the source frame. | |
| 616 expected.Scale(1.5, 1.5); | |
| 617 expected.Translate(7.0, 7.0); | |
| 618 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target
_transform); | |
| 619 | |
| 620 // The contributing render pass should not be transformed from its input. | |
| 621 EXPECT_RECT_EQ(gfx::Rect(21, 21, 3, 3), contribSharedState->clip_rect); | |
| 622 EXPECT_FALSE(contribSharedState->is_clipped); | |
| 623 expected.MakeIdentity(); | |
| 624 expected.Scale(0.8, 0.8); | |
| 625 expected.Translate(9.0, 9.0); | |
| 626 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar
get_transform); | |
| 627 | |
| 628 m_hostImpl->drawLayers(frame); | |
| 629 m_hostImpl->didDrawAllLayers(frame); | |
| 630 } | |
| 631 | |
| 632 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_Surface) | |
| 633 { | |
| 634 m_rootDelegatedRenderPassIsClipped = false; | |
| 635 setUpTest(); | |
| 636 | |
| 637 m_delegatedRendererLayerPtr->setForceRenderSurface(true); | |
| 638 | |
| 639 LayerTreeHostImpl::FrameData frame; | |
| 640 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 641 | |
| 642 const SharedQuadState* rootSharedState = NULL; | |
| 643 const SharedQuadState* contribSharedState = NULL; | |
| 644 verifyRenderPasses(frame, 3, &rootSharedState, &contribSharedState); | |
| 645 | |
| 646 // When the layer owns a surface, then its position and translation are not | |
| 647 // a part of its draw transform. | |
| 648 // The position of the resulting clip_rect is: | |
| 649 // (clip rect position (10) * scale to layer (30/50)) * layer scale (2) = 12 | |
| 650 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from | |
| 651 // a frame at 50x50: | |
| 652 // 35 * 2 (layer's scale) * 30 / 50 = 42. | |
| 653 EXPECT_RECT_EQ(gfx::Rect(12, 12, 42, 42), rootSharedState->clip_rect); | |
| 654 | |
| 655 // Since the layer owns a surface it doesn't need to clip its quads, so | |
| 656 // unclipped quads remain unclipped. | |
| 657 EXPECT_FALSE(rootSharedState->is_clipped); | |
| 658 | |
| 659 gfx::Transform expected; | |
| 660 expected.Scale(2.0, 2.0); | |
| 661 // The frame has size 50x50 but the layer's bounds are 30x30. | |
| 662 expected.Scale(30.0 / 50.0, 30.0 / 50.0); | |
| 663 // This is the transform within the source frame. | |
| 664 expected.Scale(1.5, 1.5); | |
| 665 expected.Translate(7.0, 7.0); | |
| 666 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target
_transform); | |
| 667 | |
| 668 // The contributing render pass should not be transformed from its input. | |
| 669 EXPECT_RECT_EQ(gfx::Rect(21, 21, 3, 3), contribSharedState->clip_rect); | |
| 670 EXPECT_FALSE(contribSharedState->is_clipped); | |
| 671 expected.MakeIdentity(); | |
| 672 expected.Scale(0.8, 0.8); | |
| 673 expected.Translate(9.0, 9.0); | |
| 674 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar
get_transform); | |
| 675 | |
| 676 m_hostImpl->drawLayers(frame); | |
| 677 m_hostImpl->didDrawAllLayers(frame); | |
| 678 } | |
| 679 | |
| 680 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_Surface) | |
| 681 { | |
| 682 m_rootDelegatedRenderPassIsClipped = true; | |
| 683 setUpTest(); | |
| 684 | |
| 685 m_delegatedRendererLayerPtr->setForceRenderSurface(true); | |
| 686 | |
| 687 LayerTreeHostImpl::FrameData frame; | |
| 688 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 689 | |
| 690 const SharedQuadState* rootSharedState = NULL; | |
| 691 const SharedQuadState* contribSharedState = NULL; | |
| 692 verifyRenderPasses(frame, 3, &rootSharedState, &contribSharedState); | |
| 693 | |
| 694 // When the layer owns a surface, then its position and translation are not | |
| 695 // a part of its draw transform. | |
| 696 // The position of the resulting clip_rect is: | |
| 697 // (clip rect position (10) * scale to layer (30/50)) * layer scale (2) = 12 | |
| 698 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from | |
| 699 // a frame at 50x50: | |
| 700 // 35 * 2 (layer's scale) * 30 / 50 = 42. | |
| 701 EXPECT_RECT_EQ(gfx::Rect(12, 12, 42, 42), rootSharedState->clip_rect); | |
| 702 | |
| 703 // The quads had a clip and it should be preserved. | |
| 704 EXPECT_TRUE(rootSharedState->is_clipped); | |
| 705 | |
| 706 gfx::Transform expected; | |
| 707 expected.Scale(2.0, 2.0); | |
| 708 // The frame has size 50x50 but the layer's bounds are 30x30. | |
| 709 expected.Scale(30.0 / 50.0, 30.0 / 50.0); | |
| 710 // This is the transform within the source frame. | |
| 711 expected.Scale(1.5, 1.5); | |
| 712 expected.Translate(7.0, 7.0); | |
| 713 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target
_transform); | |
| 714 | |
| 715 // The contributing render pass should not be transformed from its input. | |
| 716 EXPECT_RECT_EQ(gfx::Rect(21, 21, 3, 3), contribSharedState->clip_rect); | |
| 717 EXPECT_FALSE(contribSharedState->is_clipped); | |
| 718 expected.MakeIdentity(); | |
| 719 expected.Scale(0.8, 0.8); | |
| 720 expected.Translate(9.0, 9.0); | |
| 721 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar
get_transform); | |
| 722 | |
| 723 m_hostImpl->drawLayers(frame); | |
| 724 m_hostImpl->didDrawAllLayers(frame); | |
| 725 } | |
| 726 | |
| 727 class DelegatedRendererLayerImplTestClip : public DelegatedRendererLayerImplTest
{ | |
| 728 public: | |
| 729 void setUpTest() | |
| 730 { | |
| 731 scoped_ptr<LayerImpl> rootLayer = LayerImpl::create(m_hostImpl->activeTr
ee(), 1); | |
| 732 scoped_ptr<DelegatedRendererLayerImpl> delegatedRendererLayer = Delegate
dRendererLayerImpl::create(m_hostImpl->activeTree(), 2); | |
| 733 scoped_ptr<LayerImpl> clipLayer = LayerImpl::create(m_hostImpl->activeTr
ee(), 3); | |
| 734 scoped_ptr<LayerImpl> originLayer = LayerImpl::create(m_hostImpl->active
Tree(), 4); | |
| 735 | |
| 736 m_hostImpl->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100)); | |
| 737 rootLayer->setBounds(gfx::Size(100, 100)); | |
| 738 | |
| 739 delegatedRendererLayer->setPosition(gfx::Point(20, 20)); | |
| 740 delegatedRendererLayer->setBounds(gfx::Size(50, 50)); | |
| 741 delegatedRendererLayer->setContentBounds(gfx::Size(50, 50)); | |
| 742 delegatedRendererLayer->setDrawsContent(true); | |
| 743 | |
| 744 ScopedPtrVector<RenderPass> delegatedRenderPasses; | |
| 745 | |
| 746 gfx::Rect childPassRect(20, 20, 7, 7); | |
| 747 gfx::Transform childPassTransform; | |
| 748 gfx::Rect childPassClipRect(21, 21, 3, 3); | |
| 749 bool childPassClipped = false; | |
| 750 | |
| 751 { | |
| 752 TestRenderPass* pass = addRenderPass(delegatedRenderPasses, RenderPa
ss::Id(10, 7), childPassRect, gfx::Transform()); | |
| 753 MockQuadCuller quadSink(pass->quad_list, pass->shared_quad_state_lis
t); | |
| 754 AppendQuadsData data(pass->id); | |
| 755 SharedQuadState* sharedState = quadSink.useSharedQuadState(SharedQua
dState::Create()); | |
| 756 sharedState->SetAll(childPassTransform, childPassRect, childPassClip
Rect, childPassClipped, 1); | |
| 757 scoped_ptr<SolidColorDrawQuad> colorQuad; | |
| 758 | |
| 759 colorQuad = SolidColorDrawQuad::Create(); | |
| 760 colorQuad->SetNew(sharedState, gfx::Rect(20, 20, 3, 7), 1u); | |
| 761 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 762 | |
| 763 colorQuad = SolidColorDrawQuad::Create(); | |
| 764 colorQuad->SetNew(sharedState, gfx::Rect(23, 20, 4, 7), 1u); | |
| 765 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 766 } | |
| 767 | |
| 768 gfx::Rect passRect(0, 0, 50, 50); | |
| 769 gfx::Transform passTransform; | |
| 770 gfx::Rect passClipRect(5, 5, 40, 40); | |
| 771 bool passClipped = m_rootDelegatedRenderPassIsClipped; | |
| 772 | |
| 773 TestRenderPass* pass = addRenderPass(delegatedRenderPasses, RenderPass::
Id(9, 6), passRect, gfx::Transform()); | |
| 774 MockQuadCuller quadSink(pass->quad_list, pass->shared_quad_state_list); | |
| 775 AppendQuadsData data(pass->id); | |
| 776 SharedQuadState* sharedState = quadSink.useSharedQuadState(SharedQuadSta
te::Create()); | |
| 777 sharedState->SetAll(passTransform, passRect, passClipRect, passClipped,
1); | |
| 778 scoped_ptr<SolidColorDrawQuad> colorQuad; | |
| 779 | |
| 780 scoped_ptr<RenderPassDrawQuad> renderPassQuad = RenderPassDrawQuad::Crea
te(); | |
| 781 renderPassQuad->SetNew( | |
| 782 sharedState, | |
| 783 gfx::Rect(5, 5, 7, 7), | |
| 784 RenderPass::Id(10, 7), | |
| 785 false, // is_replica | |
| 786 0, // mask_resource_id | |
| 787 childPassRect, // contents_changed_since_last_frame | |
| 788 gfx::RectF(), // mask_uv_rect | |
| 789 WebKit::WebFilterOperations(), // filters | |
| 790 skia::RefPtr<SkImageFilter>(), // filter | |
| 791 WebKit::WebFilterOperations()); // background_filters | |
| 792 quadSink.append(renderPassQuad.PassAs<DrawQuad>(), data); | |
| 793 | |
| 794 colorQuad = SolidColorDrawQuad::Create(); | |
| 795 colorQuad->SetNew(sharedState, gfx::Rect(0, 0, 10, 10), 1u); | |
| 796 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 797 | |
| 798 colorQuad = SolidColorDrawQuad::Create(); | |
| 799 colorQuad->SetNew(sharedState, gfx::Rect(0, 10, 10, 10), 2u); | |
| 800 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 801 | |
| 802 colorQuad = SolidColorDrawQuad::Create(); | |
| 803 colorQuad->SetNew(sharedState, gfx::Rect(10, 0, 10, 10), 3u); | |
| 804 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 805 | |
| 806 colorQuad = SolidColorDrawQuad::Create(); | |
| 807 colorQuad->SetNew(sharedState, gfx::Rect(10, 10, 10, 10), 4u); | |
| 808 quadSink.append(colorQuad.PassAs<DrawQuad>(), data); | |
| 809 | |
| 810 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses); | |
| 811 | |
| 812 // The RenderPasses should be taken by the layer. | |
| 813 EXPECT_EQ(0u, delegatedRenderPasses.size()); | |
| 814 | |
| 815 m_rootLayerPtr = rootLayer.get(); | |
| 816 m_delegatedRendererLayerPtr = delegatedRendererLayer.get(); | |
| 817 | |
| 818 if (m_clipDelegatedRendererLayer) { | |
| 819 gfx::Rect clipRect(21, 27, 23, 21); | |
| 820 | |
| 821 clipLayer->setPosition(clipRect.origin()); | |
| 822 clipLayer->setBounds(clipRect.size()); | |
| 823 clipLayer->setContentBounds(clipRect.size()); | |
| 824 clipLayer->setMasksToBounds(true); | |
| 825 clipLayer->setAnchorPoint(gfx::PointF()); | |
| 826 | |
| 827 originLayer->setPosition(gfx::PointAtOffsetFromOrigin(-clipRect.Offs
etFromOrigin())); | |
| 828 originLayer->setAnchorPoint(gfx::PointF()); | |
| 829 | |
| 830 originLayer->addChild(delegatedRendererLayer.PassAs<LayerImpl>()); | |
| 831 clipLayer->addChild(originLayer.Pass()); | |
| 832 rootLayer->addChild(clipLayer.Pass()); | |
| 833 } else { | |
| 834 rootLayer->addChild(delegatedRendererLayer.PassAs<LayerImpl>()); | |
| 835 } | |
| 836 | |
| 837 m_hostImpl->activeTree()->SetRootLayer(rootLayer.Pass()); | |
| 838 } | |
| 839 | |
| 840 protected: | |
| 841 LayerImpl* m_rootLayerPtr; | |
| 842 DelegatedRendererLayerImpl* m_delegatedRendererLayerPtr; | |
| 843 bool m_rootDelegatedRenderPassIsClipped; | |
| 844 bool m_clipDelegatedRendererLayer; | |
| 845 }; | |
| 846 | |
| 847 TEST_F(DelegatedRendererLayerImplTestClip, QuadsUnclipped_LayerUnclipped_NoSurfa
ce) | |
| 848 { | |
| 849 m_rootDelegatedRenderPassIsClipped = false; | |
| 850 m_clipDelegatedRendererLayer = false; | |
| 851 setUpTest(); | |
| 852 | |
| 853 LayerTreeHostImpl::FrameData frame; | |
| 854 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 855 | |
| 856 ASSERT_EQ(2u, frame.renderPasses.size()); | |
| 857 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list; | |
| 858 ASSERT_EQ(2u, contribQuadList.size()); | |
| 859 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; | |
| 860 ASSERT_EQ(5u, rootQuadList.size()); | |
| 861 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; | |
| 862 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_
state; | |
| 863 | |
| 864 // When the quads don't have a clip of their own, the clip rect is set to | |
| 865 // the drawableContentRect of the delegated renderer layer. | |
| 866 EXPECT_RECT_EQ(gfx::Rect(20, 20, 50, 50), rootSharedState->clip_rect); | |
| 867 // Quads are clipped to the delegated renderer layer. | |
| 868 EXPECT_TRUE(rootSharedState->is_clipped); | |
| 869 | |
| 870 m_hostImpl->drawLayers(frame); | |
| 871 m_hostImpl->didDrawAllLayers(frame); | |
| 872 } | |
| 873 | |
| 874 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerUnclipped_NoSurface
) | |
| 875 { | |
| 876 m_rootDelegatedRenderPassIsClipped = true; | |
| 877 m_clipDelegatedRendererLayer = false; | |
| 878 setUpTest(); | |
| 879 | |
| 880 LayerTreeHostImpl::FrameData frame; | |
| 881 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 882 | |
| 883 ASSERT_EQ(2u, frame.renderPasses.size()); | |
| 884 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list; | |
| 885 ASSERT_EQ(2u, contribQuadList.size()); | |
| 886 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; | |
| 887 ASSERT_EQ(5u, rootQuadList.size()); | |
| 888 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; | |
| 889 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_
state; | |
| 890 | |
| 891 // When the quads have a clip of their own, it is used. | |
| 892 EXPECT_RECT_EQ(gfx::Rect(25, 25, 40, 40), rootSharedState->clip_rect); | |
| 893 // Quads came with a clip rect. | |
| 894 EXPECT_TRUE(rootSharedState->is_clipped); | |
| 895 | |
| 896 m_hostImpl->drawLayers(frame); | |
| 897 m_hostImpl->didDrawAllLayers(frame); | |
| 898 } | |
| 899 | |
| 900 TEST_F(DelegatedRendererLayerImplTestClip, QuadsUnclipped_LayerClipped_NoSurface
) | |
| 901 { | |
| 902 m_rootDelegatedRenderPassIsClipped = false; | |
| 903 m_clipDelegatedRendererLayer = true; | |
| 904 setUpTest(); | |
| 905 | |
| 906 LayerTreeHostImpl::FrameData frame; | |
| 907 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 908 | |
| 909 ASSERT_EQ(2u, frame.renderPasses.size()); | |
| 910 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list; | |
| 911 ASSERT_EQ(2u, contribQuadList.size()); | |
| 912 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; | |
| 913 ASSERT_EQ(5u, rootQuadList.size()); | |
| 914 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; | |
| 915 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_
state; | |
| 916 | |
| 917 // When the quads don't have a clip of their own, the clip rect is set to | |
| 918 // the drawableContentRect of the delegated renderer layer. When the layer | |
| 919 // is clipped, that should be seen in the quads' clip_rect. | |
| 920 EXPECT_RECT_EQ(gfx::Rect(21, 27, 23, 21), rootSharedState->clip_rect); | |
| 921 // Quads are clipped to the delegated renderer layer. | |
| 922 EXPECT_TRUE(rootSharedState->is_clipped); | |
| 923 | |
| 924 m_hostImpl->drawLayers(frame); | |
| 925 m_hostImpl->didDrawAllLayers(frame); | |
| 926 } | |
| 927 | |
| 928 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerClipped_NoSurface) | |
| 929 { | |
| 930 m_rootDelegatedRenderPassIsClipped = true; | |
| 931 m_clipDelegatedRendererLayer = true; | |
| 932 setUpTest(); | |
| 933 | |
| 934 LayerTreeHostImpl::FrameData frame; | |
| 935 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 936 | |
| 937 ASSERT_EQ(2u, frame.renderPasses.size()); | |
| 938 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list; | |
| 939 ASSERT_EQ(2u, contribQuadList.size()); | |
| 940 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; | |
| 941 ASSERT_EQ(5u, rootQuadList.size()); | |
| 942 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; | |
| 943 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_
state; | |
| 944 | |
| 945 // When the quads have a clip of their own, it is used, but it is | |
| 946 // combined with the clip rect of the delegated renderer layer. | |
| 947 EXPECT_RECT_EQ(gfx::Rect(25, 27, 19, 21), rootSharedState->clip_rect); | |
| 948 // Quads came with a clip rect. | |
| 949 EXPECT_TRUE(rootSharedState->is_clipped); | |
| 950 | |
| 951 m_hostImpl->drawLayers(frame); | |
| 952 m_hostImpl->didDrawAllLayers(frame); | |
| 953 } | |
| 954 | |
| 955 TEST_F(DelegatedRendererLayerImplTestClip, QuadsUnclipped_LayerUnclipped_Surface
) | |
| 956 { | |
| 957 m_rootDelegatedRenderPassIsClipped = false; | |
| 958 m_clipDelegatedRendererLayer = false; | |
| 959 setUpTest(); | |
| 960 | |
| 961 m_delegatedRendererLayerPtr->setForceRenderSurface(true); | |
| 962 | |
| 963 LayerTreeHostImpl::FrameData frame; | |
| 964 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 965 | |
| 966 ASSERT_EQ(3u, frame.renderPasses.size()); | |
| 967 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list; | |
| 968 ASSERT_EQ(2u, contribQuadList.size()); | |
| 969 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; | |
| 970 ASSERT_EQ(5u, rootQuadList.size()); | |
| 971 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; | |
| 972 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_
state; | |
| 973 | |
| 974 // When the layer owns a surface, the quads don't need to be clipped | |
| 975 // further than they already specify. If they aren't clipped, then their | |
| 976 // clip rect is ignored, and they are not set as clipped. | |
| 977 EXPECT_FALSE(rootSharedState->is_clipped); | |
| 978 | |
| 979 m_hostImpl->drawLayers(frame); | |
| 980 m_hostImpl->didDrawAllLayers(frame); | |
| 981 } | |
| 982 | |
| 983 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerUnclipped_Surface) | |
| 984 { | |
| 985 m_rootDelegatedRenderPassIsClipped = true; | |
| 986 m_clipDelegatedRendererLayer = false; | |
| 987 setUpTest(); | |
| 988 | |
| 989 m_delegatedRendererLayerPtr->setForceRenderSurface(true); | |
| 990 | |
| 991 LayerTreeHostImpl::FrameData frame; | |
| 992 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 993 | |
| 994 ASSERT_EQ(3u, frame.renderPasses.size()); | |
| 995 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list; | |
| 996 ASSERT_EQ(2u, contribQuadList.size()); | |
| 997 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; | |
| 998 ASSERT_EQ(5u, rootQuadList.size()); | |
| 999 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; | |
| 1000 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_
state; | |
| 1001 | |
| 1002 // When the quads have a clip of their own, it is used. | |
| 1003 EXPECT_RECT_EQ(gfx::Rect(5, 5, 40, 40), rootSharedState->clip_rect); | |
| 1004 // Quads came with a clip rect. | |
| 1005 EXPECT_TRUE(rootSharedState->is_clipped); | |
| 1006 | |
| 1007 m_hostImpl->drawLayers(frame); | |
| 1008 m_hostImpl->didDrawAllLayers(frame); | |
| 1009 } | |
| 1010 | |
| 1011 TEST_F(DelegatedRendererLayerImplTestClip, QuadsUnclipped_LayerClipped_Surface) | |
| 1012 { | |
| 1013 m_rootDelegatedRenderPassIsClipped = false; | |
| 1014 m_clipDelegatedRendererLayer = true; | |
| 1015 setUpTest(); | |
| 1016 | |
| 1017 m_delegatedRendererLayerPtr->setForceRenderSurface(true); | |
| 1018 | |
| 1019 LayerTreeHostImpl::FrameData frame; | |
| 1020 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 1021 | |
| 1022 ASSERT_EQ(3u, frame.renderPasses.size()); | |
| 1023 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list; | |
| 1024 ASSERT_EQ(2u, contribQuadList.size()); | |
| 1025 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; | |
| 1026 ASSERT_EQ(5u, rootQuadList.size()); | |
| 1027 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; | |
| 1028 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_
state; | |
| 1029 | |
| 1030 // When the layer owns a surface, the quads don't need to be clipped | |
| 1031 // further than they already specify. If they aren't clipped, then their | |
| 1032 // clip rect is ignored, and they are not set as clipped. | |
| 1033 EXPECT_FALSE(rootSharedState->is_clipped); | |
| 1034 | |
| 1035 m_hostImpl->drawLayers(frame); | |
| 1036 m_hostImpl->didDrawAllLayers(frame); | |
| 1037 } | |
| 1038 | |
| 1039 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerClipped_Surface) | |
| 1040 { | |
| 1041 m_rootDelegatedRenderPassIsClipped = true; | |
| 1042 m_clipDelegatedRendererLayer = true; | |
| 1043 setUpTest(); | |
| 1044 | |
| 1045 m_delegatedRendererLayerPtr->setForceRenderSurface(true); | |
| 1046 | |
| 1047 LayerTreeHostImpl::FrameData frame; | |
| 1048 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
| 1049 | |
| 1050 ASSERT_EQ(3u, frame.renderPasses.size()); | |
| 1051 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list; | |
| 1052 ASSERT_EQ(2u, contribQuadList.size()); | |
| 1053 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list; | |
| 1054 ASSERT_EQ(5u, rootQuadList.size()); | |
| 1055 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state; | |
| 1056 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_
state; | |
| 1057 | |
| 1058 // When the quads have a clip of their own, it is used, but it is | |
| 1059 // combined with the clip rect of the delegated renderer layer. If the | |
| 1060 // layer owns a surface, then it does not have a clip rect of its own. | |
| 1061 EXPECT_RECT_EQ(gfx::Rect(5, 5, 40, 40), rootSharedState->clip_rect); | |
| 1062 // Quads came with a clip rect. | |
| 1063 EXPECT_TRUE(rootSharedState->is_clipped); | |
| 1064 | |
| 1065 m_hostImpl->drawLayers(frame); | |
| 1066 m_hostImpl->didDrawAllLayers(frame); | |
| 1067 } | 1232 } |
| 1068 | 1233 |
| 1069 } // namespace | 1234 } // namespace |
| 1070 } // namespace cc | 1235 } // namespace cc |
| OLD | NEW |