| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/surfaces/compositor_frame_sink_support.h" | 5 #include "cc/surfaces/compositor_frame_sink_support.h" |
| 6 | 6 |
| 7 #include "base/debug/stack_trace.h" | 7 #include "base/debug/stack_trace.h" |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "cc/output/compositor_frame.h" | 9 #include "cc/output/compositor_frame.h" |
| 10 #include "cc/surfaces/compositor_frame_sink_support_client.h" | 10 #include "cc/surfaces/compositor_frame_sink_support_client.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 std::vector<SurfaceId> empty_surface_ids() { | 64 std::vector<SurfaceId> empty_surface_ids() { |
| 65 return std::vector<SurfaceId>(); | 65 return std::vector<SurfaceId>(); |
| 66 } | 66 } |
| 67 | 67 |
| 68 SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) { | 68 SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) { |
| 69 return SurfaceId( | 69 return SurfaceId( |
| 70 frame_sink_id, | 70 frame_sink_id, |
| 71 LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u))); | 71 LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u))); |
| 72 } | 72 } |
| 73 | 73 |
| 74 CompositorFrame MakeCompositorFrame() { |
| 75 CompositorFrame compositor_frame; |
| 76 compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, 0, true); |
| 77 return compositor_frame; |
| 78 } |
| 79 |
| 74 CompositorFrame MakeCompositorFrame( | 80 CompositorFrame MakeCompositorFrame( |
| 75 std::vector<SurfaceId> referenced_surfaces) { | 81 std::vector<SurfaceId> referenced_surfaces) { |
| 76 CompositorFrame compositor_frame; | 82 CompositorFrame compositor_frame; |
| 83 compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, 0, true); |
| 77 compositor_frame.metadata.referenced_surfaces = | 84 compositor_frame.metadata.referenced_surfaces = |
| 78 std::move(referenced_surfaces); | 85 std::move(referenced_surfaces); |
| 79 return compositor_frame; | 86 return compositor_frame; |
| 80 } | 87 } |
| 81 | 88 |
| 82 CompositorFrame MakeCompositorFrameWithResources( | 89 CompositorFrame MakeCompositorFrameWithResources( |
| 83 std::vector<SurfaceId> referenced_surfaces, | 90 std::vector<SurfaceId> referenced_surfaces, |
| 84 TransferableResourceArray resource_list) { | 91 TransferableResourceArray resource_list) { |
| 85 CompositorFrame compositor_frame; | 92 CompositorFrame compositor_frame; |
| 93 compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, 0, true); |
| 86 compositor_frame.metadata.referenced_surfaces = | 94 compositor_frame.metadata.referenced_surfaces = |
| 87 std::move(referenced_surfaces); | 95 std::move(referenced_surfaces); |
| 88 compositor_frame.resource_list = std::move(resource_list); | 96 compositor_frame.resource_list = std::move(resource_list); |
| 89 return compositor_frame; | 97 return compositor_frame; |
| 90 } | 98 } |
| 91 | 99 |
| 92 TransferableResource MakeResource(ResourceId id, | 100 TransferableResource MakeResource(ResourceId id, |
| 93 ResourceFormat format, | 101 ResourceFormat format, |
| 94 uint32_t filter, | 102 uint32_t filter, |
| 95 const gfx::Size& size) { | 103 const gfx::Size& size) { |
| (...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 const int64_t latency_id1 = 234; | 767 const int64_t latency_id1 = 234; |
| 760 const int64_t latency_sequence_number1 = 5645432; | 768 const int64_t latency_sequence_number1 = 5645432; |
| 761 const ui::LatencyComponentType latency_type2 = ui::TAB_SHOW_COMPONENT; | 769 const ui::LatencyComponentType latency_type2 = ui::TAB_SHOW_COMPONENT; |
| 762 const int64_t latency_id2 = 31434351; | 770 const int64_t latency_id2 = 31434351; |
| 763 const int64_t latency_sequence_number2 = 663788; | 771 const int64_t latency_sequence_number2 = 663788; |
| 764 | 772 |
| 765 // Submit a frame with latency info | 773 // Submit a frame with latency info |
| 766 ui::LatencyInfo info; | 774 ui::LatencyInfo info; |
| 767 info.AddLatencyNumber(latency_type1, latency_id1, latency_sequence_number1); | 775 info.AddLatencyNumber(latency_type1, latency_id1, latency_sequence_number1); |
| 768 | 776 |
| 769 CompositorFrame frame; | 777 CompositorFrame frame = MakeCompositorFrame(); |
| 770 frame.metadata.latency_info.push_back(info); | 778 frame.metadata.latency_info.push_back(info); |
| 771 | 779 |
| 772 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), | 780 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
| 773 std::move(frame)); | 781 std::move(frame)); |
| 774 | 782 |
| 775 // Verify that the old surface has an active frame and no pending frame. | 783 // Verify that the old surface has an active frame and no pending frame. |
| 776 Surface* old_surface = surface_manager().GetSurfaceForId(parent_id1); | 784 Surface* old_surface = surface_manager().GetSurfaceForId(parent_id1); |
| 777 ASSERT_NE(nullptr, old_surface); | 785 ASSERT_NE(nullptr, old_surface); |
| 778 EXPECT_TRUE(old_surface->HasActiveFrame()); | 786 EXPECT_TRUE(old_surface->HasActiveFrame()); |
| 779 EXPECT_FALSE(old_surface->HasPendingFrame()); | 787 EXPECT_FALSE(old_surface->HasPendingFrame()); |
| 780 | 788 |
| 781 // Submit another frame with some other latency info and a different | 789 // Submit another frame with some other latency info and a different |
| 782 // LocalSurfaceId. | 790 // LocalSurfaceId. |
| 783 ui::LatencyInfo info2; | 791 ui::LatencyInfo info2; |
| 784 info2.AddLatencyNumber(latency_type2, latency_id2, latency_sequence_number2); | 792 info2.AddLatencyNumber(latency_type2, latency_id2, latency_sequence_number2); |
| 785 | 793 |
| 786 CompositorFrame frame2; | 794 CompositorFrame frame2 = MakeCompositorFrame(); |
| 787 frame2.metadata.latency_info.push_back(info2); | 795 frame2.metadata.latency_info.push_back(info2); |
| 788 | 796 |
| 789 parent_support().SubmitCompositorFrame(parent_id2.local_surface_id(), | 797 parent_support().SubmitCompositorFrame(parent_id2.local_surface_id(), |
| 790 std::move(frame2)); | 798 std::move(frame2)); |
| 791 | 799 |
| 792 // Verify that the new surface has an active frame and no pending frames. | 800 // Verify that the new surface has an active frame and no pending frames. |
| 793 Surface* surface = surface_manager().GetSurfaceForId(parent_id2); | 801 Surface* surface = surface_manager().GetSurfaceForId(parent_id2); |
| 794 ASSERT_NE(nullptr, surface); | 802 ASSERT_NE(nullptr, surface); |
| 795 EXPECT_TRUE(surface->HasActiveFrame()); | 803 EXPECT_TRUE(surface->HasActiveFrame()); |
| 796 EXPECT_FALSE(surface->HasPendingFrame()); | 804 EXPECT_FALSE(surface->HasPendingFrame()); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 823 const int64_t latency_id1 = 234; | 831 const int64_t latency_id1 = 234; |
| 824 const int64_t latency_sequence_number1 = 5645432; | 832 const int64_t latency_sequence_number1 = 5645432; |
| 825 const ui::LatencyComponentType latency_type2 = ui::TAB_SHOW_COMPONENT; | 833 const ui::LatencyComponentType latency_type2 = ui::TAB_SHOW_COMPONENT; |
| 826 const int64_t latency_id2 = 31434351; | 834 const int64_t latency_id2 = 31434351; |
| 827 const int64_t latency_sequence_number2 = 663788; | 835 const int64_t latency_sequence_number2 = 663788; |
| 828 | 836 |
| 829 // Submit a frame with no unresolved dependecy. | 837 // Submit a frame with no unresolved dependecy. |
| 830 ui::LatencyInfo info; | 838 ui::LatencyInfo info; |
| 831 info.AddLatencyNumber(latency_type1, latency_id1, latency_sequence_number1); | 839 info.AddLatencyNumber(latency_type1, latency_id1, latency_sequence_number1); |
| 832 | 840 |
| 833 CompositorFrame frame; | 841 CompositorFrame frame = MakeCompositorFrame(); |
| 834 frame.metadata.latency_info.push_back(info); | 842 frame.metadata.latency_info.push_back(info); |
| 835 | 843 |
| 836 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), | 844 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
| 837 std::move(frame)); | 845 std::move(frame)); |
| 838 | 846 |
| 839 // Submit a frame with unresolved dependencies. | 847 // Submit a frame with unresolved dependencies. |
| 840 ui::LatencyInfo info2; | 848 ui::LatencyInfo info2; |
| 841 info2.AddLatencyNumber(latency_type2, latency_id2, latency_sequence_number2); | 849 info2.AddLatencyNumber(latency_type2, latency_id2, latency_sequence_number2); |
| 842 | 850 |
| 843 CompositorFrame frame2 = MakeCompositorFrame({child_id}); | 851 CompositorFrame frame2 = MakeCompositorFrame({child_id}); |
| 844 frame2.metadata.latency_info.push_back(info2); | 852 frame2.metadata.latency_info.push_back(info2); |
| 845 | 853 |
| 846 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), | 854 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
| 847 std::move(frame2)); | 855 std::move(frame2)); |
| 848 | 856 |
| 849 // Verify that the old surface has both an active and a pending frame. | 857 // Verify that the old surface has both an active and a pending frame. |
| 850 Surface* old_surface = surface_manager().GetSurfaceForId(parent_id1); | 858 Surface* old_surface = surface_manager().GetSurfaceForId(parent_id1); |
| 851 ASSERT_NE(nullptr, old_surface); | 859 ASSERT_NE(nullptr, old_surface); |
| 852 EXPECT_TRUE(old_surface->HasActiveFrame()); | 860 EXPECT_TRUE(old_surface->HasActiveFrame()); |
| 853 EXPECT_TRUE(old_surface->HasPendingFrame()); | 861 EXPECT_TRUE(old_surface->HasPendingFrame()); |
| 854 | 862 |
| 855 // Submit a frame with a new local surface id. | 863 // Submit a frame with a new local surface id. |
| 856 parent_support().SubmitCompositorFrame(parent_id2.local_surface_id(), | 864 parent_support().SubmitCompositorFrame(parent_id2.local_surface_id(), |
| 857 CompositorFrame()); | 865 MakeCompositorFrame()); |
| 858 | 866 |
| 859 // Verify that the new surface has an active frame only. | 867 // Verify that the new surface has an active frame only. |
| 860 Surface* surface = surface_manager().GetSurfaceForId(parent_id2); | 868 Surface* surface = surface_manager().GetSurfaceForId(parent_id2); |
| 861 ASSERT_NE(nullptr, surface); | 869 ASSERT_NE(nullptr, surface); |
| 862 EXPECT_TRUE(surface->HasActiveFrame()); | 870 EXPECT_TRUE(surface->HasActiveFrame()); |
| 863 EXPECT_FALSE(surface->HasPendingFrame()); | 871 EXPECT_FALSE(surface->HasPendingFrame()); |
| 864 | 872 |
| 865 // Verify that the new surface has latency info from both active and pending | 873 // Verify that the new surface has latency info from both active and pending |
| 866 // frame of the old surface. | 874 // frame of the old surface. |
| 867 std::vector<ui::LatencyInfo> info_list; | 875 std::vector<ui::LatencyInfo> info_list; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 891 const int64_t latency_id1 = 234; | 899 const int64_t latency_id1 = 234; |
| 892 const int64_t latency_sequence_number1 = 5645432; | 900 const int64_t latency_sequence_number1 = 5645432; |
| 893 const ui::LatencyComponentType latency_type2 = ui::TAB_SHOW_COMPONENT; | 901 const ui::LatencyComponentType latency_type2 = ui::TAB_SHOW_COMPONENT; |
| 894 const int64_t latency_id2 = 31434351; | 902 const int64_t latency_id2 = 31434351; |
| 895 const int64_t latency_sequence_number2 = 663788; | 903 const int64_t latency_sequence_number2 = 663788; |
| 896 | 904 |
| 897 // Submit a frame with no unresolved dependencies. | 905 // Submit a frame with no unresolved dependencies. |
| 898 ui::LatencyInfo info; | 906 ui::LatencyInfo info; |
| 899 info.AddLatencyNumber(latency_type1, latency_id1, latency_sequence_number1); | 907 info.AddLatencyNumber(latency_type1, latency_id1, latency_sequence_number1); |
| 900 | 908 |
| 901 CompositorFrame frame; | 909 CompositorFrame frame = MakeCompositorFrame(); |
| 902 frame.metadata.latency_info.push_back(info); | 910 frame.metadata.latency_info.push_back(info); |
| 903 | 911 |
| 904 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), | 912 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
| 905 std::move(frame)); | 913 std::move(frame)); |
| 906 | 914 |
| 907 // Verify that the old surface has an active frame only. | 915 // Verify that the old surface has an active frame only. |
| 908 Surface* old_surface = surface_manager().GetSurfaceForId(parent_id1); | 916 Surface* old_surface = surface_manager().GetSurfaceForId(parent_id1); |
| 909 ASSERT_NE(nullptr, old_surface); | 917 ASSERT_NE(nullptr, old_surface); |
| 910 EXPECT_TRUE(old_surface->HasActiveFrame()); | 918 EXPECT_TRUE(old_surface->HasActiveFrame()); |
| 911 EXPECT_FALSE(old_surface->HasPendingFrame()); | 919 EXPECT_FALSE(old_surface->HasPendingFrame()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 922 std::move(frame2)); | 930 std::move(frame2)); |
| 923 | 931 |
| 924 // Verify that the new surface has a pending frame and no active frame. | 932 // Verify that the new surface has a pending frame and no active frame. |
| 925 Surface* surface = surface_manager().GetSurfaceForId(parent_id2); | 933 Surface* surface = surface_manager().GetSurfaceForId(parent_id2); |
| 926 ASSERT_NE(nullptr, surface); | 934 ASSERT_NE(nullptr, surface); |
| 927 EXPECT_TRUE(surface->HasPendingFrame()); | 935 EXPECT_TRUE(surface->HasPendingFrame()); |
| 928 EXPECT_FALSE(surface->HasActiveFrame()); | 936 EXPECT_FALSE(surface->HasActiveFrame()); |
| 929 | 937 |
| 930 // Resolve the dependencies. The frame in parent's surface must become active. | 938 // Resolve the dependencies. The frame in parent's surface must become active. |
| 931 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), | 939 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), |
| 932 CompositorFrame()); | 940 MakeCompositorFrame()); |
| 933 EXPECT_FALSE(surface->HasPendingFrame()); | 941 EXPECT_FALSE(surface->HasPendingFrame()); |
| 934 EXPECT_TRUE(surface->HasActiveFrame()); | 942 EXPECT_TRUE(surface->HasActiveFrame()); |
| 935 | 943 |
| 936 // Both latency info elements must exist in the now-activated frame of the | 944 // Both latency info elements must exist in the now-activated frame of the |
| 937 // new surface. | 945 // new surface. |
| 938 std::vector<ui::LatencyInfo> info_list; | 946 std::vector<ui::LatencyInfo> info_list; |
| 939 surface->TakeLatencyInfo(&info_list); | 947 surface->TakeLatencyInfo(&info_list); |
| 940 EXPECT_EQ(2u, info_list.size()); | 948 EXPECT_EQ(2u, info_list.size()); |
| 941 | 949 |
| 942 ui::LatencyInfo aggregated_latency_info = info_list[0]; | 950 ui::LatencyInfo aggregated_latency_info = info_list[0]; |
| 943 aggregated_latency_info.AddNewLatencyFrom(info_list[1]); | 951 aggregated_latency_info.AddNewLatencyFrom(info_list[1]); |
| 944 EXPECT_EQ(2u, aggregated_latency_info.latency_components().size()); | 952 EXPECT_EQ(2u, aggregated_latency_info.latency_components().size()); |
| 945 | 953 |
| 946 ui::LatencyInfo::LatencyComponent comp1; | 954 ui::LatencyInfo::LatencyComponent comp1; |
| 947 EXPECT_TRUE( | 955 EXPECT_TRUE( |
| 948 aggregated_latency_info.FindLatency(latency_type1, latency_id1, &comp1)); | 956 aggregated_latency_info.FindLatency(latency_type1, latency_id1, &comp1)); |
| 949 EXPECT_EQ(latency_sequence_number1, comp1.sequence_number); | 957 EXPECT_EQ(latency_sequence_number1, comp1.sequence_number); |
| 950 } | 958 } |
| 951 | 959 |
| 952 TEST_F(CompositorFrameSinkSupportTest, PassesOnBeginFrameAcks) { | 960 TEST_F(CompositorFrameSinkSupportTest, PassesOnBeginFrameAcks) { |
| 953 // Request BeginFrames. | 961 // Request BeginFrames. |
| 954 display_support().SetNeedsBeginFrame(true); | 962 display_support().SetNeedsBeginFrame(true); |
| 955 | 963 |
| 956 // Issue a BeginFrame. | 964 // Issue a BeginFrame. |
| 957 BeginFrameArgs args = | 965 BeginFrameArgs args = |
| 958 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); | 966 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); |
| 959 begin_frame_source()->TestOnBeginFrame(args); | 967 begin_frame_source()->TestOnBeginFrame(args); |
| 960 | 968 |
| 961 // Check that the support forwards our ack to the BeginFrameSource. | 969 // Check that the support forwards a BeginFrameDidNotSwap ack to the |
| 970 // BeginFrameSource. |
| 962 BeginFrameAck ack(0, 1, 1, 0, false); | 971 BeginFrameAck ack(0, 1, 1, 0, false); |
| 963 display_support().DidFinishFrame(ack); | 972 display_support().BeginFrameDidNotSwap(ack); |
| 964 EXPECT_EQ(ack, begin_frame_source()->LastAckForObserver(&display_support())); | 973 EXPECT_EQ(ack, begin_frame_source()->LastAckForObserver(&display_support())); |
| 974 |
| 975 // TODO(eseckler): Check that the support forwards the BeginFrameAck attached |
| 976 // to a CompositorFrame to the BeginFrameSource. |
| 965 } | 977 } |
| 966 | 978 |
| 967 // Checks whether the resources are returned before we send an ack. | 979 // Checks whether the resources are returned before we send an ack. |
| 968 TEST_F(CompositorFrameSinkSupportTest, ReturnResourcesBeforeAck) { | 980 TEST_F(CompositorFrameSinkSupportTest, ReturnResourcesBeforeAck) { |
| 969 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 981 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 970 TransferableResource resource; | 982 TransferableResource resource; |
| 971 resource.id = 1234; | 983 resource.id = 1234; |
| 972 parent_support().SubmitCompositorFrame( | 984 parent_support().SubmitCompositorFrame( |
| 973 parent_id.local_surface_id(), | 985 parent_id.local_surface_id(), |
| 974 MakeCompositorFrameWithResources(empty_surface_ids(), {resource})); | 986 MakeCompositorFrameWithResources(empty_surface_ids(), {resource})); |
| 975 { | 987 { |
| 976 InSequence x; | 988 InSequence x; |
| 977 EXPECT_CALL(support_client_, ReclaimResources(_)); | 989 EXPECT_CALL(support_client_, ReclaimResources(_)); |
| 978 EXPECT_CALL(support_client_, DidReceiveCompositorFrameAck()); | 990 EXPECT_CALL(support_client_, DidReceiveCompositorFrameAck()); |
| 979 } | 991 } |
| 980 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), | 992 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
| 981 CompositorFrame()); | 993 MakeCompositorFrame()); |
| 982 } | 994 } |
| 983 | 995 |
| 984 // Verifies that if a surface is marked destroyed and a new frame arrives for | 996 // Verifies that if a surface is marked destroyed and a new frame arrives for |
| 985 // it, it will be recovered. | 997 // it, it will be recovered. |
| 986 TEST_F(CompositorFrameSinkSupportTest, SurfaceResurrection) { | 998 TEST_F(CompositorFrameSinkSupportTest, SurfaceResurrection) { |
| 987 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 999 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 988 const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 3); | 1000 const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 3); |
| 989 | 1001 |
| 990 // Add a reference from the parent to the child. | 1002 // Add a reference from the parent to the child. |
| 991 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), | 1003 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
| 992 MakeCompositorFrame({child_id})); | 1004 MakeCompositorFrame({child_id})); |
| 993 | 1005 |
| 994 // Create the child surface by submitting a frame to it. | 1006 // Create the child surface by submitting a frame to it. |
| 995 EXPECT_EQ(nullptr, surface_manager().GetSurfaceForId(child_id)); | 1007 EXPECT_EQ(nullptr, surface_manager().GetSurfaceForId(child_id)); |
| 996 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), | 1008 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), |
| 997 CompositorFrame()); | 1009 MakeCompositorFrame()); |
| 998 | 1010 |
| 999 // Verify that the child surface is created. | 1011 // Verify that the child surface is created. |
| 1000 Surface* surface = surface_manager().GetSurfaceForId(child_id); | 1012 Surface* surface = surface_manager().GetSurfaceForId(child_id); |
| 1001 EXPECT_NE(nullptr, surface); | 1013 EXPECT_NE(nullptr, surface); |
| 1002 | 1014 |
| 1003 // Attempt to destroy the child surface. The surface must still exist since | 1015 // Attempt to destroy the child surface. The surface must still exist since |
| 1004 // the parent needs it but it will be marked as destroyed. | 1016 // the parent needs it but it will be marked as destroyed. |
| 1005 child_support1().EvictFrame(); | 1017 child_support1().EvictFrame(); |
| 1006 surface = surface_manager().GetSurfaceForId(child_id); | 1018 surface = surface_manager().GetSurfaceForId(child_id); |
| 1007 EXPECT_NE(nullptr, surface); | 1019 EXPECT_NE(nullptr, surface); |
| 1008 EXPECT_TRUE(surface->destroyed()); | 1020 EXPECT_TRUE(surface->destroyed()); |
| 1009 | 1021 |
| 1010 // Child submits another frame to the same local surface id that is marked | 1022 // Child submits another frame to the same local surface id that is marked |
| 1011 // destroyed. | 1023 // destroyed. |
| 1012 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), | 1024 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), |
| 1013 CompositorFrame()); | 1025 MakeCompositorFrame()); |
| 1014 | 1026 |
| 1015 // Verify that the surface that was marked destroyed is recovered and is being | 1027 // Verify that the surface that was marked destroyed is recovered and is being |
| 1016 // used again. | 1028 // used again. |
| 1017 Surface* surface2 = surface_manager().GetSurfaceForId(child_id); | 1029 Surface* surface2 = surface_manager().GetSurfaceForId(child_id); |
| 1018 EXPECT_EQ(surface, surface2); | 1030 EXPECT_EQ(surface, surface2); |
| 1019 EXPECT_FALSE(surface2->destroyed()); | 1031 EXPECT_FALSE(surface2->destroyed()); |
| 1020 } | 1032 } |
| 1021 | 1033 |
| 1022 // Verifies that if a LocalSurfaceId belonged to a surface that doesn't exist | 1034 // Verifies that if a LocalSurfaceId belonged to a surface that doesn't exist |
| 1023 // anymore, it can still be reused for new surfaces. | 1035 // anymore, it can still be reused for new surfaces. |
| 1024 TEST_F(CompositorFrameSinkSupportTest, LocalSurfaceIdIsReusable) { | 1036 TEST_F(CompositorFrameSinkSupportTest, LocalSurfaceIdIsReusable) { |
| 1025 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 1037 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 1026 const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 3); | 1038 const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 3); |
| 1027 | 1039 |
| 1028 // Add a reference from parent. | 1040 // Add a reference from parent. |
| 1029 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), | 1041 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
| 1030 MakeCompositorFrame({child_id})); | 1042 MakeCompositorFrame({child_id})); |
| 1031 | 1043 |
| 1032 // Submit the first frame. Creates the surface. | 1044 // Submit the first frame. Creates the surface. |
| 1033 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), | 1045 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), |
| 1034 CompositorFrame()); | 1046 MakeCompositorFrame()); |
| 1035 EXPECT_NE(nullptr, surface_manager().GetSurfaceForId(child_id)); | 1047 EXPECT_NE(nullptr, surface_manager().GetSurfaceForId(child_id)); |
| 1036 | 1048 |
| 1037 // Remove the reference from parant. This allows us to destroy the surface. | 1049 // Remove the reference from parant. This allows us to destroy the surface. |
| 1038 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), | 1050 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
| 1039 CompositorFrame()); | 1051 MakeCompositorFrame()); |
| 1040 | 1052 |
| 1041 // Destroy the surface. | 1053 // Destroy the surface. |
| 1042 child_support1().EvictFrame(); | 1054 child_support1().EvictFrame(); |
| 1043 EXPECT_EQ(nullptr, surface_manager().GetSurfaceForId(child_id)); | 1055 EXPECT_EQ(nullptr, surface_manager().GetSurfaceForId(child_id)); |
| 1044 | 1056 |
| 1045 // Submit another frame with the same local surface id. This should work fine | 1057 // Submit another frame with the same local surface id. This should work fine |
| 1046 // and a new surface must be created. | 1058 // and a new surface must be created. |
| 1047 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), | 1059 child_support1().SubmitCompositorFrame(child_id.local_surface_id(), |
| 1048 CompositorFrame()); | 1060 MakeCompositorFrame()); |
| 1049 EXPECT_NE(nullptr, surface_manager().GetSurfaceForId(child_id)); | 1061 EXPECT_NE(nullptr, surface_manager().GetSurfaceForId(child_id)); |
| 1050 } | 1062 } |
| 1051 | 1063 |
| 1052 // Checks whether a LocalSurfaceId can be reused after the | 1064 // Checks whether a LocalSurfaceId can be reused after the |
| 1053 // CompositorFrameSinkSupport is destroyed and recreated with the same | 1065 // CompositorFrameSinkSupport is destroyed and recreated with the same |
| 1054 // FrameSinkId. | 1066 // FrameSinkId. |
| 1055 TEST_F(CompositorFrameSinkSupportTest, ReuseSurfaceAfterSupportDestroyed) { | 1067 TEST_F(CompositorFrameSinkSupportTest, ReuseSurfaceAfterSupportDestroyed) { |
| 1056 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 1068 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 1057 const SurfaceId child_id = MakeSurfaceId(kArbitraryFrameSink, 1); | 1069 const SurfaceId child_id = MakeSurfaceId(kArbitraryFrameSink, 1); |
| 1058 std::unique_ptr<CompositorFrameSinkSupport> child_support = | 1070 std::unique_ptr<CompositorFrameSinkSupport> child_support = |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1083 // be used and destroyed() must return false. The surface must have a factory. | 1095 // be used and destroyed() must return false. The surface must have a factory. |
| 1084 child_support->SubmitCompositorFrame( | 1096 child_support->SubmitCompositorFrame( |
| 1085 child_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); | 1097 child_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); |
| 1086 EXPECT_EQ(surface, surface_manager().GetSurfaceForId(child_id)); | 1098 EXPECT_EQ(surface, surface_manager().GetSurfaceForId(child_id)); |
| 1087 EXPECT_TRUE(surface->factory()); | 1099 EXPECT_TRUE(surface->factory()); |
| 1088 EXPECT_FALSE(surface->destroyed()); | 1100 EXPECT_FALSE(surface->destroyed()); |
| 1089 } | 1101 } |
| 1090 | 1102 |
| 1091 } // namespace test | 1103 } // namespace test |
| 1092 } // namespace cc | 1104 } // namespace cc |
| OLD | NEW |