Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: cc/surfaces/compositor_frame_sink_support_unittest.cc

Issue 2734783006: CompositorFrameSinkSupport should return resources before sending an ack (Closed)
Patch Set: Use MakeCompositorFrameWithResources Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/surfaces/compositor_frame_sink_support.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/macros.h" 8 #include "base/macros.h"
8 #include "cc/output/compositor_frame.h" 9 #include "cc/output/compositor_frame.h"
9 #include "cc/surfaces/compositor_frame_sink_support_client.h" 10 #include "cc/surfaces/compositor_frame_sink_support_client.h"
10 #include "cc/surfaces/frame_sink_id.h" 11 #include "cc/surfaces/frame_sink_id.h"
11 #include "cc/surfaces/surface_id.h" 12 #include "cc/surfaces/surface_id.h"
12 #include "cc/surfaces/surface_manager.h" 13 #include "cc/surfaces/surface_manager.h"
13 #include "cc/test/begin_frame_args_test.h" 14 #include "cc/test/begin_frame_args_test.h"
14 #include "cc/test/fake_external_begin_frame_source.h" 15 #include "cc/test/fake_external_begin_frame_source.h"
15 #include "testing/gmock/include/gmock/gmock.h" 16 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
17 18
18 using testing::UnorderedElementsAre; 19 using testing::UnorderedElementsAre;
19 using testing::IsEmpty; 20 using testing::IsEmpty;
20 using testing::SizeIs; 21 using testing::SizeIs;
22 using testing::Invoke;
23 using testing::_;
24 using testing::InSequence;
21 25
22 namespace cc { 26 namespace cc {
23 namespace test { 27 namespace test {
24 namespace { 28 namespace {
25 29
26 constexpr FrameSinkId kDisplayFrameSink(2, 0); 30 constexpr FrameSinkId kDisplayFrameSink(2, 0);
27 constexpr FrameSinkId kParentFrameSink(3, 0); 31 constexpr FrameSinkId kParentFrameSink(3, 0);
28 constexpr FrameSinkId kChildFrameSink1(65563, 0); 32 constexpr FrameSinkId kChildFrameSink1(65563, 0);
29 constexpr FrameSinkId kChildFrameSink2(65564, 0); 33 constexpr FrameSinkId kChildFrameSink2(65564, 0);
30 constexpr FrameSinkId kArbitraryFrameSink(1337, 7331); 34 constexpr FrameSinkId kArbitraryFrameSink(1337, 7331);
31 35
36 class MockCompositorFrameSinkSupportClient
37 : public CompositorFrameSinkSupportClient {
38 public:
39 MockCompositorFrameSinkSupportClient() {
40 ON_CALL(*this, ReclaimResources(_))
41 .WillByDefault(Invoke(
42 this,
43 &MockCompositorFrameSinkSupportClient::ReclaimResourcesInternal));
44 }
45
46 ReturnedResourceArray& last_returned_resources() {
47 return last_returned_resources_;
48 }
49
50 // CompositorFrameSinkSupportClient implementation.
51 MOCK_METHOD0(DidReceiveCompositorFrameAck, void());
52 MOCK_METHOD1(OnBeginFrame, void(const BeginFrameArgs&));
53 MOCK_METHOD1(ReclaimResources, void(const ReturnedResourceArray&));
54 MOCK_METHOD2(WillDrawSurface, void(const LocalSurfaceId&, const gfx::Rect&));
55
56 private:
57 void ReclaimResourcesInternal(const ReturnedResourceArray& resources) {
58 last_returned_resources_ = resources;
59 }
60
61 ReturnedResourceArray last_returned_resources_;
62 };
63
32 std::vector<SurfaceId> empty_surface_ids() { 64 std::vector<SurfaceId> empty_surface_ids() {
33 return std::vector<SurfaceId>(); 65 return std::vector<SurfaceId>();
34 } 66 }
35 67
36 SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) { 68 SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) {
37 return SurfaceId( 69 return SurfaceId(
38 frame_sink_id, 70 frame_sink_id,
39 LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u))); 71 LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u)));
40 } 72 }
41 73
(...skipping 22 matching lines...) Expand all
64 TransferableResource resource; 96 TransferableResource resource;
65 resource.id = id; 97 resource.id = id;
66 resource.format = format; 98 resource.format = format;
67 resource.filter = filter; 99 resource.filter = filter;
68 resource.size = size; 100 resource.size = size;
69 return resource; 101 return resource;
70 } 102 }
71 103
72 } // namespace 104 } // namespace
73 105
74 class CompositorFrameSinkSupportTest : public testing::Test, 106 class CompositorFrameSinkSupportTest : public testing::Test {
75 public CompositorFrameSinkSupportClient {
76 public: 107 public:
77 CompositorFrameSinkSupportTest() 108 CompositorFrameSinkSupportTest()
78 : surface_manager_(SurfaceManager::LifetimeType::REFERENCES) {} 109 : surface_manager_(SurfaceManager::LifetimeType::REFERENCES) {}
79 ~CompositorFrameSinkSupportTest() override {} 110 ~CompositorFrameSinkSupportTest() override {}
80 111
81 CompositorFrameSinkSupport& display_support() { return *supports_[0]; } 112 CompositorFrameSinkSupport& display_support() { return *supports_[0]; }
82 113
83 CompositorFrameSinkSupport& parent_support() { return *supports_[1]; } 114 CompositorFrameSinkSupport& parent_support() { return *supports_[1]; }
84 Surface* parent_surface() { 115 Surface* parent_surface() {
85 return parent_support().current_surface_for_testing(); 116 return parent_support().current_surface_for_testing();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 } 148 }
118 149
119 SurfaceDependencyTracker& dependency_tracker() { 150 SurfaceDependencyTracker& dependency_tracker() {
120 return *surface_manager_.dependency_tracker(); 151 return *surface_manager_.dependency_tracker();
121 } 152 }
122 153
123 FakeExternalBeginFrameSource* begin_frame_source() { 154 FakeExternalBeginFrameSource* begin_frame_source() {
124 return begin_frame_source_.get(); 155 return begin_frame_source_.get();
125 } 156 }
126 157
127 ReturnedResourceArray& last_returned_resources() {
128 return last_returned_resources_;
129 }
130
131 // testing::Test: 158 // testing::Test:
132 void SetUp() override { 159 void SetUp() override {
133 testing::Test::SetUp(); 160 testing::Test::SetUp();
134 begin_frame_source_ = 161 begin_frame_source_ =
135 base::MakeUnique<FakeExternalBeginFrameSource>(0.f, false); 162 base::MakeUnique<FakeExternalBeginFrameSource>(0.f, false);
136 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker( 163 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
137 new SurfaceDependencyTracker(&surface_manager_, 164 new SurfaceDependencyTracker(&surface_manager_,
138 begin_frame_source_.get())); 165 begin_frame_source_.get()));
139 surface_manager_.SetDependencyTracker(std::move(dependency_tracker)); 166 surface_manager_.SetDependencyTracker(std::move(dependency_tracker));
140 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>( 167 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
141 this, &surface_manager_, kDisplayFrameSink, true /* is_root */, 168 &support_client_, &surface_manager_, kDisplayFrameSink,
142 true /* handles_frame_sink_id_invalidation */, 169 true /* is_root */, true /* handles_frame_sink_id_invalidation */,
143 true /* needs_sync_points */)); 170 true /* needs_sync_points */));
144 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>( 171 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
145 this, &surface_manager_, kParentFrameSink, false /* is_root */, 172 &support_client_, &surface_manager_, kParentFrameSink,
146 true /* handles_frame_sink_id_invalidation */, 173 false /* is_root */, true /* handles_frame_sink_id_invalidation */,
147 true /* needs_sync_points */)); 174 true /* needs_sync_points */));
148 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>( 175 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
149 this, &surface_manager_, kChildFrameSink1, false /* is_root */, 176 &support_client_, &surface_manager_, kChildFrameSink1,
150 true /* handles_frame_sink_id_invalidation */, 177 false /* is_root */, true /* handles_frame_sink_id_invalidation */,
151 true /* needs_sync_points */)); 178 true /* needs_sync_points */));
152 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>( 179 supports_.push_back(base::MakeUnique<CompositorFrameSinkSupport>(
153 this, &surface_manager_, kChildFrameSink2, false /* is_root */, 180 &support_client_, &surface_manager_, kChildFrameSink2,
154 true /* handles_frame_sink_id_invalidation */, 181 false /* is_root */, true /* handles_frame_sink_id_invalidation */,
155 true /* needs_sync_points */)); 182 true /* needs_sync_points */));
156 183
157 // Normally, the BeginFrameSource would be registered by the Display. We 184 // Normally, the BeginFrameSource would be registered by the Display. We
158 // register it here so that BeginFrames are received by the display support, 185 // register it here so that BeginFrames are received by the display support,
159 // for use in the PassesOnBeginFrameAcks test. Other supports do not receive 186 // for use in the PassesOnBeginFrameAcks test. Other supports do not receive
160 // BeginFrames, since the frame sink hierarchy is not set up in this test. 187 // BeginFrames, since the frame sink hierarchy is not set up in this test.
161 surface_manager_.RegisterBeginFrameSource(begin_frame_source_.get(), 188 surface_manager_.RegisterBeginFrameSource(begin_frame_source_.get(),
162 kDisplayFrameSink); 189 kDisplayFrameSink);
163 } 190 }
164 191
165 void TearDown() override { 192 void TearDown() override {
166 surface_manager_.SetDependencyTracker(nullptr); 193 surface_manager_.SetDependencyTracker(nullptr);
167 surface_manager_.UnregisterBeginFrameSource(begin_frame_source_.get()); 194 surface_manager_.UnregisterBeginFrameSource(begin_frame_source_.get());
168 195
169 // SurfaceDependencyTracker depends on this BeginFrameSource and so it must 196 // SurfaceDependencyTracker depends on this BeginFrameSource and so it must
170 // be destroyed AFTER the dependency tracker is destroyed. 197 // be destroyed AFTER the dependency tracker is destroyed.
171 begin_frame_source_.reset(); 198 begin_frame_source_.reset();
172 199
173 supports_.clear(); 200 supports_.clear();
174 } 201 }
175 202
176 // CompositorFrameSinkSupportClient implementation. 203 protected:
177 void DidReceiveCompositorFrameAck() override {} 204 testing::NiceMock<MockCompositorFrameSinkSupportClient> support_client_;
178 void OnBeginFrame(const BeginFrameArgs& args) override {}
179 void ReclaimResources(const ReturnedResourceArray& resources) override {
180 last_returned_resources_ = resources;
181 }
182 void WillDrawSurface(const LocalSurfaceId& local_surface_id,
183 const gfx::Rect& damage_rect) override {}
184 205
185 private: 206 private:
186 SurfaceManager surface_manager_; 207 SurfaceManager surface_manager_;
187 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source_; 208 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source_;
188 std::vector<std::unique_ptr<CompositorFrameSinkSupport>> supports_; 209 std::vector<std::unique_ptr<CompositorFrameSinkSupport>> supports_;
189 ReturnedResourceArray last_returned_resources_;
190 210
191 DISALLOW_COPY_AND_ASSIGN(CompositorFrameSinkSupportTest); 211 DISALLOW_COPY_AND_ASSIGN(CompositorFrameSinkSupportTest);
192 }; 212 };
193 213
194 // The display root surface should have a surface reference from the top-level 214 // The display root surface should have a surface reference from the top-level
195 // root added/removed when a CompositorFrame is submitted with a new SurfaceId. 215 // root added/removed when a CompositorFrame is submitted with a new SurfaceId.
196 TEST_F(CompositorFrameSinkSupportTest, RootSurfaceReceivesReferences) { 216 TEST_F(CompositorFrameSinkSupportTest, RootSurfaceReceivesReferences) {
197 const SurfaceId display_id_first = MakeSurfaceId(kDisplayFrameSink, 1); 217 const SurfaceId display_id_first = MakeSurfaceId(kDisplayFrameSink, 1);
198 const SurfaceId display_id_second = MakeSurfaceId(kDisplayFrameSink, 2); 218 const SurfaceId display_id_second = MakeSurfaceId(kDisplayFrameSink, 2);
199 219
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 595
576 // The parent submits a CompositorFrame without any dependencies. That frame 596 // The parent submits a CompositorFrame without any dependencies. That frame
577 // should activate immediately, replacing the earlier frame. The resource from 597 // should activate immediately, replacing the earlier frame. The resource from
578 // the earlier frame should be returned to the client. 598 // the earlier frame should be returned to the client.
579 parent_support().SubmitCompositorFrame( 599 parent_support().SubmitCompositorFrame(
580 parent_id.local_surface_id(), MakeCompositorFrame({empty_surface_ids()})); 600 parent_id.local_surface_id(), MakeCompositorFrame({empty_surface_ids()}));
581 EXPECT_TRUE(parent_surface()->HasActiveFrame()); 601 EXPECT_TRUE(parent_surface()->HasActiveFrame());
582 EXPECT_FALSE(parent_surface()->HasPendingFrame()); 602 EXPECT_FALSE(parent_surface()->HasPendingFrame());
583 EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty()); 603 EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty());
584 ReturnedResource returned_resource = resource.ToReturnedResource(); 604 ReturnedResource returned_resource = resource.ToReturnedResource();
585 EXPECT_THAT(last_returned_resources(), 605 EXPECT_THAT(support_client_.last_returned_resources(),
586 UnorderedElementsAre(returned_resource)); 606 UnorderedElementsAre(returned_resource));
587 } 607 }
588 608
589 // This test verifies that a SurfaceReference from parent to child can be added 609 // This test verifies that a SurfaceReference from parent to child can be added
590 // prior to the child submitting a CompositorFrame. This test also verifies that 610 // prior to the child submitting a CompositorFrame. This test also verifies that
591 // when the child later submits a CompositorFrame, 611 // when the child later submits a CompositorFrame,
592 TEST_F(CompositorFrameSinkSupportTest, 612 TEST_F(CompositorFrameSinkSupportTest,
593 DisplayCompositorLockingReferenceAddedBeforeChildExists) { 613 DisplayCompositorLockingReferenceAddedBeforeChildExists) {
594 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); 614 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
595 const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 1); 615 const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 1);
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 BeginFrameArgs args = 960 BeginFrameArgs args =
941 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); 961 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
942 begin_frame_source()->TestOnBeginFrame(args); 962 begin_frame_source()->TestOnBeginFrame(args);
943 963
944 // Check that the support forwards our ack to the BeginFrameSource. 964 // Check that the support forwards our ack to the BeginFrameSource.
945 BeginFrameAck ack(0, 1, 1, 0, false); 965 BeginFrameAck ack(0, 1, 1, 0, false);
946 display_support().DidFinishFrame(ack); 966 display_support().DidFinishFrame(ack);
947 EXPECT_EQ(ack, begin_frame_source()->LastAckForObserver(&display_support())); 967 EXPECT_EQ(ack, begin_frame_source()->LastAckForObserver(&display_support()));
948 } 968 }
949 969
970 // Checks whether the resources are returned before we send an ack.
971 TEST_F(CompositorFrameSinkSupportTest, ReturnResourcesBeforeAck) {
972 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1);
973 TransferableResource resource;
974 resource.id = 1234;
975 parent_support().SubmitCompositorFrame(
976 parent_id.local_surface_id(),
977 MakeCompositorFrameWithResources(empty_surface_ids(), {resource}));
978 {
979 InSequence x;
980 EXPECT_CALL(support_client_, ReclaimResources(_));
981 EXPECT_CALL(support_client_, DidReceiveCompositorFrameAck());
982 }
983 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(),
984 CompositorFrame());
985 }
986
950 } // namespace test 987 } // namespace test
951 } // namespace cc 988 } // namespace cc
OLDNEW
« no previous file with comments | « cc/surfaces/compositor_frame_sink_support.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698