| OLD | NEW |
| (Empty) |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "cc/base/scoped_ptr_vector.h" | |
| 6 #include "cc/layers/append_quads_data.h" | |
| 7 #include "cc/layers/layer_impl.h" | |
| 8 #include "cc/layers/render_pass_sink.h" | |
| 9 #include "cc/layers/render_surface_impl.h" | |
| 10 #include "cc/quads/shared_quad_state.h" | |
| 11 #include "cc/test/fake_impl_proxy.h" | |
| 12 #include "cc/test/fake_layer_tree_host_impl.h" | |
| 13 #include "cc/test/geometry_test_utils.h" | |
| 14 #include "cc/test/mock_occlusion_tracker.h" | |
| 15 #include "cc/test/test_shared_bitmap_manager.h" | |
| 16 #include "cc/trees/single_thread_proxy.h" | |
| 17 #include "testing/gmock/include/gmock/gmock.h" | |
| 18 #include "testing/gtest/include/gtest/gtest.h" | |
| 19 #include "ui/gfx/transform.h" | |
| 20 | |
| 21 namespace cc { | |
| 22 namespace { | |
| 23 | |
| 24 #define EXECUTE_AND_VERIFY_SURFACE_CHANGED(code_to_test) \ | |
| 25 render_surface->ResetPropertyChangedFlag(); \ | |
| 26 code_to_test; \ | |
| 27 EXPECT_TRUE(render_surface->SurfacePropertyChanged()) | |
| 28 | |
| 29 #define EXECUTE_AND_VERIFY_SURFACE_DID_NOT_CHANGE(code_to_test) \ | |
| 30 render_surface->ResetPropertyChangedFlag(); \ | |
| 31 code_to_test; \ | |
| 32 EXPECT_FALSE(render_surface->SurfacePropertyChanged()) | |
| 33 | |
| 34 TEST(RenderSurfaceTest, VerifySurfaceChangesAreTrackedProperly) { | |
| 35 // | |
| 36 // This test checks that SurfacePropertyChanged() has the correct behavior. | |
| 37 // | |
| 38 | |
| 39 FakeImplProxy proxy; | |
| 40 TestSharedBitmapManager shared_bitmap_manager; | |
| 41 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr); | |
| 42 scoped_ptr<LayerImpl> owning_layer = | |
| 43 LayerImpl::Create(host_impl.active_tree(), 1); | |
| 44 owning_layer->SetHasRenderSurface(true); | |
| 45 ASSERT_TRUE(owning_layer->render_surface()); | |
| 46 RenderSurfaceImpl* render_surface = owning_layer->render_surface(); | |
| 47 gfx::Rect test_rect(3, 4, 5, 6); | |
| 48 owning_layer->ResetAllChangeTrackingForSubtree(); | |
| 49 | |
| 50 // Currently, the content_rect, clip_rect, and | |
| 51 // owning_layer->layerPropertyChanged() are the only sources of change. | |
| 52 EXECUTE_AND_VERIFY_SURFACE_CHANGED(render_surface->SetClipRect(test_rect)); | |
| 53 EXECUTE_AND_VERIFY_SURFACE_CHANGED(render_surface->SetContentRect(test_rect)); | |
| 54 | |
| 55 owning_layer->SetOpacity(0.5f); | |
| 56 EXPECT_TRUE(render_surface->SurfacePropertyChanged()); | |
| 57 owning_layer->ResetAllChangeTrackingForSubtree(); | |
| 58 | |
| 59 // Setting the surface properties to the same values again should not be | |
| 60 // considered "change". | |
| 61 EXECUTE_AND_VERIFY_SURFACE_DID_NOT_CHANGE( | |
| 62 render_surface->SetClipRect(test_rect)); | |
| 63 EXECUTE_AND_VERIFY_SURFACE_DID_NOT_CHANGE( | |
| 64 render_surface->SetContentRect(test_rect)); | |
| 65 | |
| 66 scoped_ptr<LayerImpl> dummy_mask = | |
| 67 LayerImpl::Create(host_impl.active_tree(), 2); | |
| 68 gfx::Transform dummy_matrix; | |
| 69 dummy_matrix.Translate(1.0, 2.0); | |
| 70 | |
| 71 // The rest of the surface properties are either internal and should not cause | |
| 72 // change, or they are already accounted for by the | |
| 73 // owninglayer->layerPropertyChanged(). | |
| 74 EXECUTE_AND_VERIFY_SURFACE_DID_NOT_CHANGE( | |
| 75 render_surface->SetDrawOpacity(0.5f)); | |
| 76 EXECUTE_AND_VERIFY_SURFACE_DID_NOT_CHANGE( | |
| 77 render_surface->SetDrawTransform(dummy_matrix)); | |
| 78 EXECUTE_AND_VERIFY_SURFACE_DID_NOT_CHANGE( | |
| 79 render_surface->SetReplicaDrawTransform(dummy_matrix)); | |
| 80 EXECUTE_AND_VERIFY_SURFACE_DID_NOT_CHANGE(render_surface->ClearLayerLists()); | |
| 81 } | |
| 82 | |
| 83 TEST(RenderSurfaceTest, SanityCheckSurfaceCreatesCorrectSharedQuadState) { | |
| 84 FakeImplProxy proxy; | |
| 85 TestSharedBitmapManager shared_bitmap_manager; | |
| 86 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr); | |
| 87 scoped_ptr<LayerImpl> root_layer = | |
| 88 LayerImpl::Create(host_impl.active_tree(), 1); | |
| 89 | |
| 90 scoped_ptr<LayerImpl> owning_layer = | |
| 91 LayerImpl::Create(host_impl.active_tree(), 2); | |
| 92 owning_layer->SetHasRenderSurface(true); | |
| 93 ASSERT_TRUE(owning_layer->render_surface()); | |
| 94 owning_layer->draw_properties().render_target = owning_layer.get(); | |
| 95 | |
| 96 SkXfermode::Mode blend_mode = SkXfermode::kSoftLight_Mode; | |
| 97 owning_layer->SetBlendMode(blend_mode); | |
| 98 RenderSurfaceImpl* render_surface = owning_layer->render_surface(); | |
| 99 | |
| 100 root_layer->AddChild(owning_layer.Pass()); | |
| 101 | |
| 102 gfx::Rect content_rect(0, 0, 50, 50); | |
| 103 gfx::Rect clip_rect(5, 5, 40, 40); | |
| 104 gfx::Transform origin; | |
| 105 origin.Translate(30, 40); | |
| 106 | |
| 107 render_surface->SetContentRect(content_rect); | |
| 108 render_surface->SetClipRect(clip_rect); | |
| 109 render_surface->SetDrawOpacity(1.f); | |
| 110 | |
| 111 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); | |
| 112 AppendQuadsData append_quads_data; | |
| 113 | |
| 114 render_surface->AppendQuads(render_pass.get(), origin, Occlusion(), | |
| 115 SK_ColorBLACK, 1.f, nullptr, &append_quads_data, | |
| 116 RenderPassId(2, 0)); | |
| 117 | |
| 118 ASSERT_EQ(1u, render_pass->shared_quad_state_list.size()); | |
| 119 SharedQuadState* shared_quad_state = | |
| 120 render_pass->shared_quad_state_list.front(); | |
| 121 | |
| 122 EXPECT_EQ( | |
| 123 30.0, | |
| 124 shared_quad_state->content_to_target_transform.matrix().getDouble(0, 3)); | |
| 125 EXPECT_EQ( | |
| 126 40.0, | |
| 127 shared_quad_state->content_to_target_transform.matrix().getDouble(1, 3)); | |
| 128 EXPECT_EQ(content_rect, gfx::Rect(shared_quad_state->visible_content_rect)); | |
| 129 EXPECT_EQ(1.f, shared_quad_state->opacity); | |
| 130 EXPECT_EQ(blend_mode, shared_quad_state->blend_mode); | |
| 131 } | |
| 132 | |
| 133 class TestRenderPassSink : public RenderPassSink { | |
| 134 public: | |
| 135 void AppendRenderPass(scoped_ptr<RenderPass> render_pass) override { | |
| 136 render_passes_.push_back(render_pass.Pass()); | |
| 137 } | |
| 138 | |
| 139 const RenderPassList& RenderPasses() const { | |
| 140 return render_passes_; | |
| 141 } | |
| 142 | |
| 143 private: | |
| 144 RenderPassList render_passes_; | |
| 145 }; | |
| 146 | |
| 147 TEST(RenderSurfaceTest, SanityCheckSurfaceCreatesCorrectRenderPass) { | |
| 148 FakeImplProxy proxy; | |
| 149 TestSharedBitmapManager shared_bitmap_manager; | |
| 150 FakeLayerTreeHostImpl host_impl(&proxy, &shared_bitmap_manager, nullptr); | |
| 151 scoped_ptr<LayerImpl> root_layer = | |
| 152 LayerImpl::Create(host_impl.active_tree(), 1); | |
| 153 | |
| 154 scoped_ptr<LayerImpl> owning_layer = | |
| 155 LayerImpl::Create(host_impl.active_tree(), 2); | |
| 156 owning_layer->SetHasRenderSurface(true); | |
| 157 ASSERT_TRUE(owning_layer->render_surface()); | |
| 158 owning_layer->draw_properties().render_target = owning_layer.get(); | |
| 159 RenderSurfaceImpl* render_surface = owning_layer->render_surface(); | |
| 160 | |
| 161 root_layer->AddChild(owning_layer.Pass()); | |
| 162 | |
| 163 gfx::Rect content_rect(0, 0, 50, 50); | |
| 164 gfx::Transform origin; | |
| 165 origin.Translate(30.0, 40.0); | |
| 166 | |
| 167 render_surface->SetScreenSpaceTransform(origin); | |
| 168 render_surface->SetContentRect(content_rect); | |
| 169 | |
| 170 TestRenderPassSink pass_sink; | |
| 171 | |
| 172 render_surface->AppendRenderPasses(&pass_sink); | |
| 173 | |
| 174 ASSERT_EQ(1u, pass_sink.RenderPasses().size()); | |
| 175 RenderPass* pass = pass_sink.RenderPasses()[0]; | |
| 176 | |
| 177 EXPECT_EQ(RenderPassId(2, 0), pass->id); | |
| 178 EXPECT_EQ(content_rect, pass->output_rect); | |
| 179 EXPECT_EQ(origin, pass->transform_to_root_target); | |
| 180 } | |
| 181 | |
| 182 } // namespace | |
| 183 } // namespace cc | |
| OLD | NEW |