| 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/referenced_surface_tracker.h" | 5 #include "cc/surfaces/referenced_surface_tracker.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 DISALLOW_COPY_AND_ASSIGN(ReferencedSurfaceTrackerTest); | 56 DISALLOW_COPY_AND_ASSIGN(ReferencedSurfaceTrackerTest); |
| 57 }; | 57 }; |
| 58 | 58 |
| 59 TEST_F(ReferencedSurfaceTrackerTest, SetCurrentSurfaceId) { | 59 TEST_F(ReferencedSurfaceTrackerTest, SetCurrentSurfaceId) { |
| 60 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 60 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 61 | 61 |
| 62 // Initially current_surface_id() should be invalid. | 62 // Initially current_surface_id() should be invalid. |
| 63 EXPECT_FALSE(tracker().current_surface_id().is_valid()); | 63 EXPECT_FALSE(tracker().current_surface_id().is_valid()); |
| 64 | 64 |
| 65 // After setting current SurfaceId then current_surface_id() should be valid. | 65 // After setting current SurfaceId then current_surface_id() should be valid. |
| 66 tracker().UpdateReferences(parent_id.local_surface_id(), nullptr, nullptr); | 66 tracker().UpdateReferences(parent_id.local_surface_id(), nullptr); |
| 67 EXPECT_EQ(parent_id, tracker().current_surface_id()); | 67 EXPECT_EQ(parent_id, tracker().current_surface_id()); |
| 68 } | 68 } |
| 69 | 69 |
| 70 TEST_F(ReferencedSurfaceTrackerTest, RefSurface) { | 70 TEST_F(ReferencedSurfaceTrackerTest, RefSurface) { |
| 71 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 71 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 72 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); | 72 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
| 73 const SurfaceReference reference(parent_id, child_id1); | 73 const SurfaceReference reference(parent_id, child_id1); |
| 74 | 74 |
| 75 // First frame has a reference to |child_id1|, check that reference is added. | 75 // First frame has a reference to |child_id1|, check that reference is added. |
| 76 std::vector<SurfaceId> active_referenced_surfaces = {child_id1}; | 76 std::vector<SurfaceId> active_referenced_surfaces = {child_id1}; |
| 77 tracker().UpdateReferences(parent_id.local_surface_id(), | 77 tracker().UpdateReferences(parent_id.local_surface_id(), |
| 78 &active_referenced_surfaces, | 78 &active_referenced_surfaces); |
| 79 nullptr /* pending_referenced_surfaces */); | |
| 80 EXPECT_THAT(tracker().references_to_add(), UnorderedElementsAre(reference)); | 79 EXPECT_THAT(tracker().references_to_add(), UnorderedElementsAre(reference)); |
| 81 EXPECT_THAT(tracker().references_to_remove(), IsEmpty()); | 80 EXPECT_THAT(tracker().references_to_remove(), IsEmpty()); |
| 82 } | 81 } |
| 83 | 82 |
| 84 TEST_F(ReferencedSurfaceTrackerTest, NoChangeToReferences) { | 83 TEST_F(ReferencedSurfaceTrackerTest, NoChangeToReferences) { |
| 85 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 84 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 86 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); | 85 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
| 87 const SurfaceReference reference(parent_id, child_id1); | 86 const SurfaceReference reference(parent_id, child_id1); |
| 88 | 87 |
| 89 // First frame has a reference to |child_id1|, check that reference is added. | 88 // First frame has a reference to |child_id1|, check that reference is added. |
| 90 std::vector<SurfaceId> active_referenced_surfaces = {child_id1}; | 89 std::vector<SurfaceId> active_referenced_surfaces = {child_id1}; |
| 91 tracker().UpdateReferences(parent_id.local_surface_id(), | 90 tracker().UpdateReferences(parent_id.local_surface_id(), |
| 92 &active_referenced_surfaces, | 91 &active_referenced_surfaces); |
| 93 nullptr /* pending_referenced_surfaces */); | |
| 94 EXPECT_THAT(tracker().references_to_remove(), IsEmpty()); | 92 EXPECT_THAT(tracker().references_to_remove(), IsEmpty()); |
| 95 EXPECT_THAT(tracker().references_to_add(), UnorderedElementsAre(reference)); | 93 EXPECT_THAT(tracker().references_to_add(), UnorderedElementsAre(reference)); |
| 96 | 94 |
| 97 // Second frame has same reference, check that no references are added or | 95 // Second frame has same reference, check that no references are added or |
| 98 // removed. | 96 // removed. |
| 99 tracker().UpdateReferences(parent_id.local_surface_id(), | 97 tracker().UpdateReferences(parent_id.local_surface_id(), |
| 100 &active_referenced_surfaces, | 98 &active_referenced_surfaces); |
| 101 nullptr /* pending_referenced_surfaces */); | |
| 102 EXPECT_THAT(tracker().references_to_remove(), IsEmpty()); | 99 EXPECT_THAT(tracker().references_to_remove(), IsEmpty()); |
| 103 EXPECT_THAT(tracker().references_to_add(), IsEmpty()); | 100 EXPECT_THAT(tracker().references_to_add(), IsEmpty()); |
| 104 } | 101 } |
| 105 | 102 |
| 106 TEST_F(ReferencedSurfaceTrackerTest, UnrefSurface) { | 103 TEST_F(ReferencedSurfaceTrackerTest, UnrefSurface) { |
| 107 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 104 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 108 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); | 105 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
| 109 const SurfaceReference reference(parent_id, child_id1); | 106 const SurfaceReference reference(parent_id, child_id1); |
| 110 | 107 |
| 111 std::vector<SurfaceId> active_referenced_surfaces = {child_id1}; | 108 std::vector<SurfaceId> active_referenced_surfaces = {child_id1}; |
| 112 tracker().UpdateReferences(parent_id.local_surface_id(), | 109 tracker().UpdateReferences(parent_id.local_surface_id(), |
| 113 &active_referenced_surfaces, | 110 &active_referenced_surfaces); |
| 114 nullptr /* pending_referenced_surfaces */); | |
| 115 | 111 |
| 116 // Second frame no longer references |child_id1|, check that reference to is | 112 // Second frame no longer references |child_id1|, check that reference to is |
| 117 // removed. | 113 // removed. |
| 118 tracker().UpdateReferences(parent_id.local_surface_id(), | 114 tracker().UpdateReferences(parent_id.local_surface_id(), |
| 119 nullptr /* active_referenced_surfaces */, | 115 nullptr /* active_referenced_surfaces */); |
| 120 nullptr /* pending_referenced_surfaces */); | |
| 121 EXPECT_THAT(tracker().references_to_add(), IsEmpty()); | 116 EXPECT_THAT(tracker().references_to_add(), IsEmpty()); |
| 122 EXPECT_THAT(tracker().references_to_remove(), | 117 EXPECT_THAT(tracker().references_to_remove(), |
| 123 UnorderedElementsAre(reference)); | 118 UnorderedElementsAre(reference)); |
| 124 } | 119 } |
| 125 | 120 |
| 126 TEST_F(ReferencedSurfaceTrackerTest, RefNewSurfaceForFrameSink) { | 121 TEST_F(ReferencedSurfaceTrackerTest, RefNewSurfaceForFrameSink) { |
| 127 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 122 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 128 const SurfaceId child_id1_first = MakeSurfaceId(kChildFrameSink1, 1); | 123 const SurfaceId child_id1_first = MakeSurfaceId(kChildFrameSink1, 1); |
| 129 const SurfaceId child_id1_second = MakeSurfaceId(kChildFrameSink1, 2); | 124 const SurfaceId child_id1_second = MakeSurfaceId(kChildFrameSink1, 2); |
| 130 const SurfaceReference reference_first(parent_id, child_id1_first); | 125 const SurfaceReference reference_first(parent_id, child_id1_first); |
| 131 const SurfaceReference reference_second(parent_id, child_id1_second); | 126 const SurfaceReference reference_second(parent_id, child_id1_second); |
| 132 | 127 |
| 133 // First frame has reference to |child_id1_first|. | 128 // First frame has reference to |child_id1_first|. |
| 134 std::vector<SurfaceId> active_referenced_surfaces1 = {child_id1_first}; | 129 std::vector<SurfaceId> active_referenced_surfaces1 = {child_id1_first}; |
| 135 tracker().UpdateReferences(parent_id.local_surface_id(), | 130 tracker().UpdateReferences(parent_id.local_surface_id(), |
| 136 &active_referenced_surfaces1, | 131 &active_referenced_surfaces1); |
| 137 nullptr /* pending_referenced_surfaces */); | |
| 138 EXPECT_THAT(tracker().references_to_add(), | 132 EXPECT_THAT(tracker().references_to_add(), |
| 139 UnorderedElementsAre(reference_first)); | 133 UnorderedElementsAre(reference_first)); |
| 140 | 134 |
| 141 // Second frame has reference to |child_id1_second| which has the same | 135 // Second frame has reference to |child_id1_second| which has the same |
| 142 // FrameSinkId but different LocalSurfaceId. Check that first reference is | 136 // FrameSinkId but different LocalSurfaceId. Check that first reference is |
| 143 // removed and second reference is added. | 137 // removed and second reference is added. |
| 144 std::vector<SurfaceId> active_referenced_surfaces2 = {child_id1_second}; | 138 std::vector<SurfaceId> active_referenced_surfaces2 = {child_id1_second}; |
| 145 tracker().UpdateReferences(parent_id.local_surface_id(), | 139 tracker().UpdateReferences(parent_id.local_surface_id(), |
| 146 &active_referenced_surfaces2, | 140 &active_referenced_surfaces2); |
| 147 nullptr /* pending_referenced_surfaces */); | |
| 148 EXPECT_THAT(tracker().references_to_remove(), | 141 EXPECT_THAT(tracker().references_to_remove(), |
| 149 UnorderedElementsAre(reference_first)); | 142 UnorderedElementsAre(reference_first)); |
| 150 EXPECT_THAT(tracker().references_to_add(), | 143 EXPECT_THAT(tracker().references_to_add(), |
| 151 UnorderedElementsAre(reference_second)); | 144 UnorderedElementsAre(reference_second)); |
| 152 } | 145 } |
| 153 | 146 |
| 154 TEST_F(ReferencedSurfaceTrackerTest, UpdateParentSurfaceId) { | 147 TEST_F(ReferencedSurfaceTrackerTest, UpdateParentSurfaceId) { |
| 155 const SurfaceId parent_id_first = MakeSurfaceId(kParentFrameSink, 1); | 148 const SurfaceId parent_id_first = MakeSurfaceId(kParentFrameSink, 1); |
| 156 const SurfaceId parent_id_second = MakeSurfaceId(kParentFrameSink, 2); | 149 const SurfaceId parent_id_second = MakeSurfaceId(kParentFrameSink, 2); |
| 157 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); | 150 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
| 158 const SurfaceReference reference(parent_id_second, child_id1); | 151 const SurfaceReference reference(parent_id_second, child_id1); |
| 159 | 152 |
| 160 // First frame references |child_id1|. | 153 // First frame references |child_id1|. |
| 161 std::vector<SurfaceId> active_referenced_surfaces = {child_id1}; | 154 std::vector<SurfaceId> active_referenced_surfaces = {child_id1}; |
| 162 tracker().UpdateReferences(parent_id_first.local_surface_id(), | 155 tracker().UpdateReferences(parent_id_first.local_surface_id(), |
| 163 &active_referenced_surfaces, | 156 &active_referenced_surfaces); |
| 164 nullptr /* pending_referenced_surfaces */); | |
| 165 EXPECT_THAT(tracker().references_to_add(), SizeIs(1)); | 157 EXPECT_THAT(tracker().references_to_add(), SizeIs(1)); |
| 166 | 158 |
| 167 // Second frame still reference |child_id1| but the parent SurfaceId has | 159 // Second frame still reference |child_id1| but the parent SurfaceId has |
| 168 // changed. The new parent SurfaceId should have a reference added to | 160 // changed. The new parent SurfaceId should have a reference added to |
| 169 // |child_id1|. | 161 // |child_id1|. |
| 170 tracker().UpdateReferences(parent_id_second.local_surface_id(), | 162 tracker().UpdateReferences(parent_id_second.local_surface_id(), |
| 171 &active_referenced_surfaces, | 163 &active_referenced_surfaces); |
| 172 nullptr /* pending_referenced_surfaces */); | |
| 173 EXPECT_THAT(tracker().references_to_add(), UnorderedElementsAre(reference)); | 164 EXPECT_THAT(tracker().references_to_add(), UnorderedElementsAre(reference)); |
| 174 EXPECT_THAT(tracker().references_to_remove(), IsEmpty()); | 165 EXPECT_THAT(tracker().references_to_remove(), IsEmpty()); |
| 175 } | 166 } |
| 176 | 167 |
| 177 TEST_F(ReferencedSurfaceTrackerTest, RefTwoThenUnrefOneSurface) { | 168 TEST_F(ReferencedSurfaceTrackerTest, RefTwoThenUnrefOneSurface) { |
| 178 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 169 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
| 179 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); | 170 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
| 180 const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 2); | 171 const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 2); |
| 181 const SurfaceReference reference1(parent_id, child_id1); | 172 const SurfaceReference reference1(parent_id, child_id1); |
| 182 const SurfaceReference reference2(parent_id, child_id2); | 173 const SurfaceReference reference2(parent_id, child_id2); |
| 183 | 174 |
| 184 // First frame references both surfaces. | 175 // First frame references both surfaces. |
| 185 std::vector<SurfaceId> active_referenced_surfaces1 = {child_id1, child_id2}; | 176 std::vector<SurfaceId> active_referenced_surfaces1 = {child_id1, child_id2}; |
| 186 tracker().UpdateReferences(parent_id.local_surface_id(), | 177 tracker().UpdateReferences(parent_id.local_surface_id(), |
| 187 &active_referenced_surfaces1, | 178 &active_referenced_surfaces1); |
| 188 nullptr /* pending_referenced_surfaces */); | |
| 189 EXPECT_THAT(tracker().references_to_add(), | 179 EXPECT_THAT(tracker().references_to_add(), |
| 190 UnorderedElementsAre(reference1, reference2)); | 180 UnorderedElementsAre(reference1, reference2)); |
| 191 | 181 |
| 192 // Second frame references only |child_id2|, check that reference to | 182 // Second frame references only |child_id2|, check that reference to |
| 193 // |child_id1| is removed. | 183 // |child_id1| is removed. |
| 194 std::vector<SurfaceId> active_referenced_surfaces2 = {child_id2}; | 184 std::vector<SurfaceId> active_referenced_surfaces2 = {child_id2}; |
| 195 tracker().UpdateReferences(parent_id.local_surface_id(), | 185 tracker().UpdateReferences(parent_id.local_surface_id(), |
| 196 &active_referenced_surfaces2, | 186 &active_referenced_surfaces2); |
| 197 nullptr /* pending_referenced_surfaces */); | |
| 198 EXPECT_THAT(tracker().references_to_remove(), | 187 EXPECT_THAT(tracker().references_to_remove(), |
| 199 UnorderedElementsAre(reference1)); | 188 UnorderedElementsAre(reference1)); |
| 200 EXPECT_THAT(tracker().references_to_add(), IsEmpty()); | 189 EXPECT_THAT(tracker().references_to_add(), IsEmpty()); |
| 201 } | 190 } |
| 202 | 191 |
| 203 } // namespace test | 192 } // namespace test |
| 204 } // namespace cc | 193 } // namespace cc |
| OLD | NEW |