| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 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 | 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/layer_tree_host_impl.h" | 5 #include "cc/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 3758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3769 LayerTreeHostImpl::FrameData frame; | 3769 LayerTreeHostImpl::FrameData frame; |
| 3770 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3770 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3771 | 3771 |
| 3772 // Must receive two render passes, each with one quad | 3772 // Must receive two render passes, each with one quad |
| 3773 ASSERT_EQ(2U, frame.renderPasses.size()); | 3773 ASSERT_EQ(2U, frame.renderPasses.size()); |
| 3774 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3774 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3775 EXPECT_EQ(1U, frame.renderPasses[1]->quad_list.size()); | 3775 EXPECT_EQ(1U, frame.renderPasses[1]->quad_list.size()); |
| 3776 | 3776 |
| 3777 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); | 3777 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); |
| 3778 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); | 3778 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); |
| 3779 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3779 RenderPass* targetPass = frame.renderPassesById[quad->render_pass_id]; |
| 3780 ASSERT_TRUE(targetPass); |
| 3780 EXPECT_FALSE(targetPass->damage_rect.IsEmpty()); | 3781 EXPECT_FALSE(targetPass->damage_rect.IsEmpty()); |
| 3781 | 3782 |
| 3782 myHostImpl->drawLayers(frame); | 3783 myHostImpl->drawLayers(frame); |
| 3783 myHostImpl->didDrawAllLayers(frame); | 3784 myHostImpl->didDrawAllLayers(frame); |
| 3784 } | 3785 } |
| 3785 | 3786 |
| 3786 // Draw without any change | 3787 // Draw without any change |
| 3787 { | 3788 { |
| 3788 LayerTreeHostImpl::FrameData frame; | 3789 LayerTreeHostImpl::FrameData frame; |
| 3789 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3790 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3790 | 3791 |
| 3791 // Must receive one render pass, as the other one should be culled | 3792 // Must receive one render pass, as the other one should be culled |
| 3792 ASSERT_EQ(1U, frame.renderPasses.size()); | 3793 ASSERT_EQ(1U, frame.renderPasses.size()); |
| 3793 | 3794 |
| 3794 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3795 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3795 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); | 3796 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); |
| 3796 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); | 3797 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); |
| 3797 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3798 EXPECT_TRUE(frame.renderPassesById.find(quad->render_pass_id) == frame.r
enderPassesById.end()); |
| 3798 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); | |
| 3799 | 3799 |
| 3800 myHostImpl->drawLayers(frame); | 3800 myHostImpl->drawLayers(frame); |
| 3801 myHostImpl->didDrawAllLayers(frame); | 3801 myHostImpl->didDrawAllLayers(frame); |
| 3802 } | 3802 } |
| 3803 | 3803 |
| 3804 // Change opacity and draw | 3804 // Change opacity and draw |
| 3805 surfaceLayerPtr->setOpacity(0.6f); | 3805 surfaceLayerPtr->setOpacity(0.6f); |
| 3806 { | 3806 { |
| 3807 LayerTreeHostImpl::FrameData frame; | 3807 LayerTreeHostImpl::FrameData frame; |
| 3808 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3808 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3809 | 3809 |
| 3810 // Must receive one render pass, as the other one should be culled | 3810 // Must receive one render pass, as the other one should be culled |
| 3811 ASSERT_EQ(1U, frame.renderPasses.size()); | 3811 ASSERT_EQ(1U, frame.renderPasses.size()); |
| 3812 | 3812 |
| 3813 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3813 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3814 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); | 3814 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); |
| 3815 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); | 3815 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); |
| 3816 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3816 EXPECT_TRUE(frame.renderPassesById.find(quad->render_pass_id) == frame.r
enderPassesById.end()); |
| 3817 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); | |
| 3818 | 3817 |
| 3819 myHostImpl->drawLayers(frame); | 3818 myHostImpl->drawLayers(frame); |
| 3820 myHostImpl->didDrawAllLayers(frame); | 3819 myHostImpl->didDrawAllLayers(frame); |
| 3821 } | 3820 } |
| 3822 | 3821 |
| 3823 // Change less benign property and draw - should have contents changed flag | 3822 // Change less benign property and draw - should have contents changed flag |
| 3824 surfaceLayerPtr->setStackingOrderChanged(true); | 3823 surfaceLayerPtr->setStackingOrderChanged(true); |
| 3825 { | 3824 { |
| 3826 LayerTreeHostImpl::FrameData frame; | 3825 LayerTreeHostImpl::FrameData frame; |
| 3827 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3826 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3828 | 3827 |
| 3829 // Must receive two render passes, each with one quad | 3828 // Must receive two render passes, each with one quad |
| 3830 ASSERT_EQ(2U, frame.renderPasses.size()); | 3829 ASSERT_EQ(2U, frame.renderPasses.size()); |
| 3831 | 3830 |
| 3832 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3831 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3833 EXPECT_EQ(DrawQuad::SOLID_COLOR, frame.renderPasses[0]->quad_list[0]->ma
terial); | 3832 EXPECT_EQ(DrawQuad::SOLID_COLOR, frame.renderPasses[0]->quad_list[0]->ma
terial); |
| 3834 | 3833 |
| 3835 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); | 3834 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); |
| 3836 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); | 3835 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); |
| 3837 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3836 RenderPass* targetPass = frame.renderPassesById[quad->render_pass_id]; |
| 3837 ASSERT_TRUE(targetPass); |
| 3838 EXPECT_FALSE(targetPass->damage_rect.IsEmpty()); | 3838 EXPECT_FALSE(targetPass->damage_rect.IsEmpty()); |
| 3839 | 3839 |
| 3840 myHostImpl->drawLayers(frame); | 3840 myHostImpl->drawLayers(frame); |
| 3841 myHostImpl->didDrawAllLayers(frame); | 3841 myHostImpl->didDrawAllLayers(frame); |
| 3842 } | 3842 } |
| 3843 | 3843 |
| 3844 // Change opacity again, and evict the cached surface texture. | 3844 // Change opacity again, and evict the cached surface texture. |
| 3845 surfaceLayerPtr->setOpacity(0.5f); | 3845 surfaceLayerPtr->setOpacity(0.5f); |
| 3846 static_cast<GLRendererWithReleaseTextures*>(myHostImpl->renderer())->release
RenderPassTextures(); | 3846 static_cast<GLRendererWithReleaseTextures*>(myHostImpl->renderer())->release
RenderPassTextures(); |
| 3847 | 3847 |
| 3848 // Change opacity and draw | 3848 // Change opacity and draw |
| 3849 surfaceLayerPtr->setOpacity(0.6f); | 3849 surfaceLayerPtr->setOpacity(0.6f); |
| 3850 { | 3850 { |
| 3851 LayerTreeHostImpl::FrameData frame; | 3851 LayerTreeHostImpl::FrameData frame; |
| 3852 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3852 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3853 | 3853 |
| 3854 // Must receive two render passes | 3854 // Must receive two render passes |
| 3855 ASSERT_EQ(2U, frame.renderPasses.size()); | 3855 ASSERT_EQ(2U, frame.renderPasses.size()); |
| 3856 | 3856 |
| 3857 // Even though not enough properties changed, the entire thing must be | 3857 // Even though not enough properties changed, the entire thing must be |
| 3858 // redrawn as we don't have cached textures | 3858 // redrawn as we don't have cached textures |
| 3859 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3859 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3860 EXPECT_EQ(1U, frame.renderPasses[1]->quad_list.size()); | 3860 EXPECT_EQ(1U, frame.renderPasses[1]->quad_list.size()); |
| 3861 | 3861 |
| 3862 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); | 3862 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); |
| 3863 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); | 3863 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); |
| 3864 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3864 RenderPass* targetPass = frame.renderPassesById[quad->render_pass_id]; |
| 3865 ASSERT_TRUE(targetPass); |
| 3865 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); | 3866 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); |
| 3866 | 3867 |
| 3867 // Was our surface evicted? | 3868 // Was our surface evicted? |
| 3868 EXPECT_FALSE(myHostImpl->renderer()->haveCachedResourcesForRenderPassId(
targetPass->id)); | 3869 EXPECT_FALSE(myHostImpl->renderer()->haveCachedResourcesForRenderPassId(
targetPass->id)); |
| 3869 | 3870 |
| 3870 myHostImpl->drawLayers(frame); | 3871 myHostImpl->drawLayers(frame); |
| 3871 myHostImpl->didDrawAllLayers(frame); | 3872 myHostImpl->didDrawAllLayers(frame); |
| 3872 } | 3873 } |
| 3873 | 3874 |
| 3874 // Draw without any change, to make sure the state is clear | 3875 // Draw without any change, to make sure the state is clear |
| 3875 { | 3876 { |
| 3876 LayerTreeHostImpl::FrameData frame; | 3877 LayerTreeHostImpl::FrameData frame; |
| 3877 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3878 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3878 | 3879 |
| 3879 // Must receive one render pass, as the other one should be culled | 3880 // Must receive one render pass, as the other one should be culled |
| 3880 ASSERT_EQ(1U, frame.renderPasses.size()); | 3881 ASSERT_EQ(1U, frame.renderPasses.size()); |
| 3881 | 3882 |
| 3882 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3883 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3883 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); | 3884 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); |
| 3884 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); | 3885 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); |
| 3885 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3886 EXPECT_TRUE(frame.renderPassesById.find(quad->render_pass_id) == frame.r
enderPassesById.end()); |
| 3886 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); | |
| 3887 | 3887 |
| 3888 myHostImpl->drawLayers(frame); | 3888 myHostImpl->drawLayers(frame); |
| 3889 myHostImpl->didDrawAllLayers(frame); | 3889 myHostImpl->didDrawAllLayers(frame); |
| 3890 } | 3890 } |
| 3891 | 3891 |
| 3892 // Change location of the intermediate layer | 3892 // Change location of the intermediate layer |
| 3893 gfx::Transform transform = intermediateLayerPtr->transform(); | 3893 gfx::Transform transform = intermediateLayerPtr->transform(); |
| 3894 transform.matrix().setDouble(0, 3, 1.0001); | 3894 transform.matrix().setDouble(0, 3, 1.0001); |
| 3895 intermediateLayerPtr->setTransform(transform); | 3895 intermediateLayerPtr->setTransform(transform); |
| 3896 { | 3896 { |
| 3897 LayerTreeHostImpl::FrameData frame; | 3897 LayerTreeHostImpl::FrameData frame; |
| 3898 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3898 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3899 | 3899 |
| 3900 // Must receive one render pass, as the other one should be culled. | 3900 // Must receive one render pass, as the other one should be culled. |
| 3901 ASSERT_EQ(1U, frame.renderPasses.size()); | 3901 ASSERT_EQ(1U, frame.renderPasses.size()); |
| 3902 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3902 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3903 | 3903 |
| 3904 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); | 3904 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); |
| 3905 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); | 3905 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); |
| 3906 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3906 EXPECT_TRUE(frame.renderPassesById.find(quad->render_pass_id) == frame.r
enderPassesById.end()); |
| 3907 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); | |
| 3908 | 3907 |
| 3909 myHostImpl->drawLayers(frame); | 3908 myHostImpl->drawLayers(frame); |
| 3910 myHostImpl->didDrawAllLayers(frame); | 3909 myHostImpl->didDrawAllLayers(frame); |
| 3911 } | 3910 } |
| 3912 } | 3911 } |
| 3913 | 3912 |
| 3914 TEST_P(LayerTreeHostImplTest, surfaceTextureCachingNoPartialSwap) | 3913 TEST_P(LayerTreeHostImplTest, surfaceTextureCachingNoPartialSwap) |
| 3915 { | 3914 { |
| 3916 LayerTreeSettings settings; | 3915 LayerTreeSettings settings; |
| 3917 settings.minimumOcclusionTrackingSize = gfx::Size(); | 3916 settings.minimumOcclusionTrackingSize = gfx::Size(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3928 LayerTreeHostImpl::FrameData frame; | 3927 LayerTreeHostImpl::FrameData frame; |
| 3929 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3928 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3930 | 3929 |
| 3931 // Must receive two render passes, each with one quad | 3930 // Must receive two render passes, each with one quad |
| 3932 ASSERT_EQ(2U, frame.renderPasses.size()); | 3931 ASSERT_EQ(2U, frame.renderPasses.size()); |
| 3933 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3932 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3934 EXPECT_EQ(1U, frame.renderPasses[1]->quad_list.size()); | 3933 EXPECT_EQ(1U, frame.renderPasses[1]->quad_list.size()); |
| 3935 | 3934 |
| 3936 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); | 3935 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); |
| 3937 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); | 3936 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); |
| 3938 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3937 RenderPass* targetPass = frame.renderPassesById[quad->render_pass_id]; |
| 3939 EXPECT_FALSE(targetPass->damage_rect.IsEmpty()); | 3938 EXPECT_FALSE(targetPass->damage_rect.IsEmpty()); |
| 3940 | 3939 |
| 3941 EXPECT_FALSE(frame.renderPasses[0]->damage_rect.IsEmpty()); | 3940 EXPECT_FALSE(frame.renderPasses[0]->damage_rect.IsEmpty()); |
| 3942 EXPECT_FALSE(frame.renderPasses[1]->damage_rect.IsEmpty()); | 3941 EXPECT_FALSE(frame.renderPasses[1]->damage_rect.IsEmpty()); |
| 3943 | 3942 |
| 3944 EXPECT_FALSE(frame.renderPasses[0]->has_occlusion_from_outside_target_su
rface); | 3943 EXPECT_FALSE(frame.renderPasses[0]->has_occlusion_from_outside_target_su
rface); |
| 3945 EXPECT_FALSE(frame.renderPasses[1]->has_occlusion_from_outside_target_su
rface); | 3944 EXPECT_FALSE(frame.renderPasses[1]->has_occlusion_from_outside_target_su
rface); |
| 3946 | 3945 |
| 3947 myHostImpl->drawLayers(frame); | 3946 myHostImpl->drawLayers(frame); |
| 3948 myHostImpl->didDrawAllLayers(frame); | 3947 myHostImpl->didDrawAllLayers(frame); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3970 { | 3969 { |
| 3971 LayerTreeHostImpl::FrameData frame; | 3970 LayerTreeHostImpl::FrameData frame; |
| 3972 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3971 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3973 | 3972 |
| 3974 // Must receive one render pass, as the other one should be culled | 3973 // Must receive one render pass, as the other one should be culled |
| 3975 ASSERT_EQ(1U, frame.renderPasses.size()); | 3974 ASSERT_EQ(1U, frame.renderPasses.size()); |
| 3976 | 3975 |
| 3977 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3976 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3978 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); | 3977 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); |
| 3979 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); | 3978 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); |
| 3980 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3979 EXPECT_TRUE(frame.renderPassesById.find(quad->render_pass_id) == frame.r
enderPassesById.end()); |
| 3981 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); | |
| 3982 | 3980 |
| 3983 myHostImpl->drawLayers(frame); | 3981 myHostImpl->drawLayers(frame); |
| 3984 myHostImpl->didDrawAllLayers(frame); | 3982 myHostImpl->didDrawAllLayers(frame); |
| 3985 } | 3983 } |
| 3986 | 3984 |
| 3987 // Change less benign property and draw - should have contents changed flag | 3985 // Change less benign property and draw - should have contents changed flag |
| 3988 surfaceLayerPtr->setStackingOrderChanged(true); | 3986 surfaceLayerPtr->setStackingOrderChanged(true); |
| 3989 { | 3987 { |
| 3990 LayerTreeHostImpl::FrameData frame; | 3988 LayerTreeHostImpl::FrameData frame; |
| 3991 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 3989 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 3992 | 3990 |
| 3993 // Must receive two render passes, each with one quad | 3991 // Must receive two render passes, each with one quad |
| 3994 ASSERT_EQ(2U, frame.renderPasses.size()); | 3992 ASSERT_EQ(2U, frame.renderPasses.size()); |
| 3995 | 3993 |
| 3996 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 3994 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 3997 EXPECT_EQ(DrawQuad::SOLID_COLOR, frame.renderPasses[0]->quad_list[0]->ma
terial); | 3995 EXPECT_EQ(DrawQuad::SOLID_COLOR, frame.renderPasses[0]->quad_list[0]->ma
terial); |
| 3998 | 3996 |
| 3999 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); | 3997 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); |
| 4000 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); | 3998 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); |
| 4001 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 3999 RenderPass* targetPass = frame.renderPassesById[quad->render_pass_id]; |
| 4000 ASSERT_TRUE(targetPass); |
| 4002 EXPECT_FALSE(targetPass->damage_rect.IsEmpty()); | 4001 EXPECT_FALSE(targetPass->damage_rect.IsEmpty()); |
| 4003 | 4002 |
| 4004 myHostImpl->drawLayers(frame); | 4003 myHostImpl->drawLayers(frame); |
| 4005 myHostImpl->didDrawAllLayers(frame); | 4004 myHostImpl->didDrawAllLayers(frame); |
| 4006 } | 4005 } |
| 4007 | 4006 |
| 4008 // Change opacity again, and evict the cached surface texture. | 4007 // Change opacity again, and evict the cached surface texture. |
| 4009 surfaceLayerPtr->setOpacity(0.5f); | 4008 surfaceLayerPtr->setOpacity(0.5f); |
| 4010 static_cast<GLRendererWithReleaseTextures*>(myHostImpl->renderer())->release
RenderPassTextures(); | 4009 static_cast<GLRendererWithReleaseTextures*>(myHostImpl->renderer())->release
RenderPassTextures(); |
| 4011 | 4010 |
| 4012 // Change opacity and draw | 4011 // Change opacity and draw |
| 4013 surfaceLayerPtr->setOpacity(0.6f); | 4012 surfaceLayerPtr->setOpacity(0.6f); |
| 4014 { | 4013 { |
| 4015 LayerTreeHostImpl::FrameData frame; | 4014 LayerTreeHostImpl::FrameData frame; |
| 4016 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 4015 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 4017 | 4016 |
| 4018 // Must receive two render passes | 4017 // Must receive two render passes |
| 4019 ASSERT_EQ(2U, frame.renderPasses.size()); | 4018 ASSERT_EQ(2U, frame.renderPasses.size()); |
| 4020 | 4019 |
| 4021 // Even though not enough properties changed, the entire thing must be | 4020 // Even though not enough properties changed, the entire thing must be |
| 4022 // redrawn as we don't have cached textures | 4021 // redrawn as we don't have cached textures |
| 4023 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 4022 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 4024 EXPECT_EQ(1U, frame.renderPasses[1]->quad_list.size()); | 4023 EXPECT_EQ(1U, frame.renderPasses[1]->quad_list.size()); |
| 4025 | 4024 |
| 4026 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); | 4025 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[1]->quad_list[0]->ma
terial); |
| 4027 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); | 4026 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[1]->quad_list[0]); |
| 4028 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 4027 RenderPass* targetPass = frame.renderPassesById[quad->render_pass_id]; |
| 4028 ASSERT_TRUE(targetPass); |
| 4029 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); | 4029 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); |
| 4030 | 4030 |
| 4031 // Was our surface evicted? | 4031 // Was our surface evicted? |
| 4032 EXPECT_FALSE(myHostImpl->renderer()->haveCachedResourcesForRenderPassId(
targetPass->id)); | 4032 EXPECT_FALSE(myHostImpl->renderer()->haveCachedResourcesForRenderPassId(
targetPass->id)); |
| 4033 | 4033 |
| 4034 myHostImpl->drawLayers(frame); | 4034 myHostImpl->drawLayers(frame); |
| 4035 myHostImpl->didDrawAllLayers(frame); | 4035 myHostImpl->didDrawAllLayers(frame); |
| 4036 } | 4036 } |
| 4037 | 4037 |
| 4038 // Draw without any change, to make sure the state is clear | 4038 // Draw without any change, to make sure the state is clear |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4057 { | 4057 { |
| 4058 LayerTreeHostImpl::FrameData frame; | 4058 LayerTreeHostImpl::FrameData frame; |
| 4059 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); | 4059 EXPECT_TRUE(myHostImpl->prepareToDraw(frame)); |
| 4060 | 4060 |
| 4061 // Must receive one render pass, as the other one should be culled. | 4061 // Must receive one render pass, as the other one should be culled. |
| 4062 ASSERT_EQ(1U, frame.renderPasses.size()); | 4062 ASSERT_EQ(1U, frame.renderPasses.size()); |
| 4063 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); | 4063 EXPECT_EQ(1U, frame.renderPasses[0]->quad_list.size()); |
| 4064 | 4064 |
| 4065 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); | 4065 EXPECT_EQ(DrawQuad::RENDER_PASS, frame.renderPasses[0]->quad_list[0]->ma
terial); |
| 4066 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); | 4066 const RenderPassDrawQuad* quad = RenderPassDrawQuad::MaterialCast(frame.
renderPasses[0]->quad_list[0]); |
| 4067 RenderPass* targetPass = frame.renderPassesById.get(quad->render_pass_id
); | 4067 EXPECT_TRUE(frame.renderPassesById.find(quad->render_pass_id) == frame.r
enderPassesById.end()); |
| 4068 EXPECT_TRUE(targetPass->damage_rect.IsEmpty()); | |
| 4069 | 4068 |
| 4070 myHostImpl->drawLayers(frame); | 4069 myHostImpl->drawLayers(frame); |
| 4071 myHostImpl->didDrawAllLayers(frame); | 4070 myHostImpl->didDrawAllLayers(frame); |
| 4072 } | 4071 } |
| 4073 } | 4072 } |
| 4074 | 4073 |
| 4075 TEST_P(LayerTreeHostImplTest, releaseContentsTextureShouldTriggerCommit) | 4074 TEST_P(LayerTreeHostImplTest, releaseContentsTextureShouldTriggerCommit) |
| 4076 { | 4075 { |
| 4077 setReduceMemoryResult(false); | 4076 setReduceMemoryResult(false); |
| 4078 | 4077 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4216 renderer->setHaveCachedResourcesForRenderPassId(newRende
rPassId); | 4215 renderer->setHaveCachedResourcesForRenderPassId(newRende
rPassId); |
| 4217 | 4216 |
| 4218 scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); | 4217 scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); |
| 4219 pass->SetNew(newRenderPassId, gfx::Rect(), gfx::Rect(), gfx:
:Transform()); | 4218 pass->SetNew(newRenderPassId, gfx::Rect(), gfx::Rect(), gfx:
:Transform()); |
| 4220 testData.renderPassCache.add(newRenderPassId, pass.Pass()); | 4219 testData.renderPassCache.add(newRenderPassId, pass.Pass()); |
| 4221 } | 4220 } |
| 4222 | 4221 |
| 4223 gfx::Rect quadRect = gfx::Rect(0, 0, 1, 1); | 4222 gfx::Rect quadRect = gfx::Rect(0, 0, 1, 1); |
| 4224 gfx::Rect contentsChangedRect = contentsChanged ? quadRect : gfx
::Rect(); | 4223 gfx::Rect contentsChangedRect = contentsChanged ? quadRect : gfx
::Rect(); |
| 4225 scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create
(); | 4224 scoped_ptr<RenderPassDrawQuad> quad = RenderPassDrawQuad::Create
(); |
| 4226 quad->SetNew(testData.sharedQuadState.get(), quadRect, newRender
PassId, isReplica, 1, contentsChangedRect, gfx::RectF(0, 0, 1, 1)); | 4225 quad->SetNew(testData.sharedQuadState.get(), quadRect, newRender
PassId, isReplica, 1, contentsChangedRect, gfx::RectF(0, 0, 1, 1), WebKit::WebFi
lterOperations(), skia::RefPtr<SkImageFilter>(), WebKit::WebFilterOperations()); |
| 4227 renderPass->AppendQuad(quad.PassAs<DrawQuad>()); | 4226 renderPass->AppendQuad(quad.PassAs<DrawQuad>()); |
| 4228 } | 4227 } |
| 4229 } | 4228 } |
| 4230 testData.renderPasses.insert(testData.renderPasses.begin(), renderPass.g
et()); | 4229 testData.renderPassesById[renderPassId] = renderPass.get(); |
| 4231 testData.renderPassesById.add(renderPassId, renderPass.PassAs<RenderPass
>()); | 4230 testData.renderPasses.insert(0, renderPass.PassAs<RenderPass>()); |
| 4232 if (*currentChar) | 4231 if (*currentChar) |
| 4233 currentChar++; | 4232 currentChar++; |
| 4234 } | 4233 } |
| 4235 } | 4234 } |
| 4236 | 4235 |
| 4237 void dumpRenderPassTestData(const RenderPassRemovalTestData& testData, char* buf
fer) | 4236 void dumpRenderPassTestData(const RenderPassRemovalTestData& testData, char* buf
fer) |
| 4238 { | 4237 { |
| 4239 char* pos = buffer; | 4238 char* pos = buffer; |
| 4240 for (RenderPassList::const_reverse_iterator it = testData.renderPasses.rbegi
n(); it != testData.renderPasses.rend(); ++it) { | 4239 for (RenderPassList::const_reverse_iterator it = testData.renderPasses.rbegi
n(); it != testData.renderPasses.rend(); ++it) { |
| 4241 const RenderPass* currentPass = *it; | 4240 const RenderPass* currentPass = *it; |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4813 WebKit::WebGraphicsContext3D::Attributes attrs; | 4812 WebKit::WebGraphicsContext3D::Attributes attrs; |
| 4814 return FakeOutputSurface::CreateDelegating3d(FakeWebGraphicsContext3D::C
reate(attrs).PassAs<WebKit::WebGraphicsContext3D>()).PassAs<OutputSurface>(); | 4813 return FakeOutputSurface::CreateDelegating3d(FakeWebGraphicsContext3D::C
reate(attrs).PassAs<WebKit::WebGraphicsContext3D>()).PassAs<OutputSurface>(); |
| 4815 } | 4814 } |
| 4816 | 4815 |
| 4817 void drawFrameAndTestDamage(const gfx::RectF& expectedDamage) { | 4816 void drawFrameAndTestDamage(const gfx::RectF& expectedDamage) { |
| 4818 LayerTreeHostImpl::FrameData frame; | 4817 LayerTreeHostImpl::FrameData frame; |
| 4819 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | 4818 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); |
| 4820 ASSERT_EQ(1u, frame.renderPasses.size()); | 4819 ASSERT_EQ(1u, frame.renderPasses.size()); |
| 4821 | 4820 |
| 4822 // Verify the damage rect for the root render pass. | 4821 // Verify the damage rect for the root render pass. |
| 4823 const RenderPass* rootRenderPass = frame.renderPasses.back(); | 4822 const RenderPass* rootRenderPass = frame.renderPasses.last(); |
| 4824 EXPECT_RECT_EQ(expectedDamage, rootRenderPass->damage_rect); | 4823 EXPECT_RECT_EQ(expectedDamage, rootRenderPass->damage_rect); |
| 4825 | 4824 |
| 4826 // Verify the root layer's quad is generated and not being culled. | 4825 // Verify the root layer's quad is generated and not being culled. |
| 4827 ASSERT_EQ(1u, rootRenderPass->quad_list.size()); | 4826 ASSERT_EQ(1u, rootRenderPass->quad_list.size()); |
| 4828 gfx::Rect expectedVisibleRect(m_hostImpl->rootLayer()->contentBounds()); | 4827 gfx::Rect expectedVisibleRect(m_hostImpl->rootLayer()->contentBounds()); |
| 4829 EXPECT_RECT_EQ(expectedVisibleRect, rootRenderPass->quad_list[0]->visibl
e_rect); | 4828 EXPECT_RECT_EQ(expectedVisibleRect, rootRenderPass->quad_list[0]->visibl
e_rect); |
| 4830 | 4829 |
| 4831 m_hostImpl->drawLayers(frame); | 4830 m_hostImpl->drawLayers(frame); |
| 4832 m_hostImpl->didDrawAllLayers(frame); | 4831 m_hostImpl->didDrawAllLayers(frame); |
| 4833 } | 4832 } |
| 4834 }; | 4833 }; |
| 4835 | 4834 |
| 4836 TEST_P(LayerTreeHostImplTestWithDelegatingRenderer, FrameIncludesDamageRect) | 4835 TEST_P(LayerTreeHostImplTestWithDelegatingRenderer, FrameIncludesDamageRect) |
| 4837 { | 4836 { |
| 4838 // Draw a frame. In the first frame, the entire viewport should be damaged. | 4837 // Draw a frame. In the first frame, the entire viewport should be damaged. |
| 4839 gfx::Rect fullFrameDamage = gfx::Rect(m_hostImpl->deviceViewportSize()); | 4838 gfx::Rect fullFrameDamage = gfx::Rect(m_hostImpl->deviceViewportSize()); |
| 4840 drawFrameAndTestDamage(fullFrameDamage); | 4839 drawFrameAndTestDamage(fullFrameDamage); |
| 4841 | 4840 |
| 4842 // The second frame should have no damage, but the quads should still be gen
erated. | 4841 // The second frame should have no damage, but the quads should still be gen
erated. |
| 4843 gfx::Rect noDamage = gfx::Rect(m_hostImpl->deviceViewportSize()); | 4842 gfx::Rect noDamage = gfx::Rect(m_hostImpl->deviceViewportSize()); |
| 4844 drawFrameAndTestDamage(noDamage); | 4843 drawFrameAndTestDamage(noDamage); |
| 4845 } | 4844 } |
| 4846 | 4845 |
| 4847 INSTANTIATE_TEST_CASE_P(LayerTreeHostImplTests, | 4846 INSTANTIATE_TEST_CASE_P(LayerTreeHostImplTests, |
| 4848 LayerTreeHostImplTest, | 4847 LayerTreeHostImplTest, |
| 4849 ::testing::Values(false, true)); | 4848 ::testing::Values(false, true)); |
| 4850 | 4849 |
| 4851 } // namespace | 4850 } // namespace |
| 4852 } // namespace cc | 4851 } // namespace cc |
| OLD | NEW |