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 |