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

Side by Side Diff: content/renderer/gpu/queue_message_swap_promise_unittest.cc

Issue 2905313002: Revert of Send FrameSwapMessageQueue's messages in QueueMessageSwapPromise (Closed)
Patch Set: Created 3 years, 6 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "content/renderer/gpu/queue_message_swap_promise.h" 5 #include "content/renderer/gpu/queue_message_swap_promise.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/test/scoped_task_environment.h" 14 #include "base/test/scoped_task_environment.h"
15 #include "cc/output/swap_promise.h" 15 #include "cc/output/swap_promise.h"
16 #include "content/common/view_messages.h"
17 #include "content/renderer/gpu/frame_swap_message_queue.h" 16 #include "content/renderer/gpu/frame_swap_message_queue.h"
18 #include "content/renderer/gpu/render_widget_compositor.h" 17 #include "content/renderer/gpu/render_widget_compositor.h"
19 #include "content/renderer/render_widget.h" 18 #include "content/renderer/render_widget.h"
20 #include "content/test/mock_render_process.h" 19 #include "content/test/mock_render_process.h"
21 #include "ipc/ipc_message.h" 20 #include "ipc/ipc_message.h"
22 #include "ipc/ipc_sync_message_filter.h" 21 #include "ipc/ipc_sync_message_filter.h"
23 #include "ipc/ipc_test_sink.h" 22 #include "ipc/ipc_test_sink.h"
24 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
25 24
26 namespace content { 25 namespace content {
27 26
28 class TestRenderWidget : public RenderWidget { 27 class TestRenderWidget : public RenderWidget {
29 public: 28 public:
30 using RenderWidget::QueueMessageImpl; 29 using RenderWidget::QueueMessageImpl;
31 30
32 private: 31 private:
33 ~TestRenderWidget() override {} 32 ~TestRenderWidget() override {}
34 33
35 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); 34 DISALLOW_COPY_AND_ASSIGN(TestRenderWidget);
36 }; 35 };
37 36
38 class TestSyncMessageFilter : public IPC::SyncMessageFilter { 37 class TestSyncMessageFilter : public IPC::SyncMessageFilter {
39 public: 38 public:
40 TestSyncMessageFilter() : IPC::SyncMessageFilter(nullptr) {} 39 TestSyncMessageFilter() : IPC::SyncMessageFilter(nullptr) {}
41 40
42 bool Send(IPC::Message* message) override { 41 bool Send(IPC::Message* message) override {
43 if (message->type() == ViewHostMsg_FrameSwapMessages::ID) { 42 messages_.push_back(base::WrapUnique(message));
44 ViewHostMsg_FrameSwapMessages::Param param;
45 ViewHostMsg_FrameSwapMessages::Read(message, &param);
46 std::vector<IPC::Message> messages = std::get<1>(param);
47 last_swap_messages_.clear();
48 for (const IPC::Message& message : messages) {
49 last_swap_messages_.push_back(base::MakeUnique<IPC::Message>(message));
50 }
51 delete message;
52 } else {
53 direct_send_messages_.push_back(base::WrapUnique(message));
54 }
55 return true; 43 return true;
56 } 44 }
57 45
58 std::vector<std::unique_ptr<IPC::Message>>& last_swap_messages() { 46 std::vector<std::unique_ptr<IPC::Message>>& messages() { return messages_; }
59 return last_swap_messages_;
60 }
61
62 const std::vector<std::unique_ptr<IPC::Message>>& direct_send_messages() {
63 return direct_send_messages_;
64 }
65 47
66 private: 48 private:
67 ~TestSyncMessageFilter() override {} 49 ~TestSyncMessageFilter() override {}
68 50
69 std::vector<std::unique_ptr<IPC::Message>> direct_send_messages_; 51 std::vector<std::unique_ptr<IPC::Message>> messages_;
70 std::vector<std::unique_ptr<IPC::Message>> last_swap_messages_;
71 52
72 DISALLOW_COPY_AND_ASSIGN(TestSyncMessageFilter); 53 DISALLOW_COPY_AND_ASSIGN(TestSyncMessageFilter);
73 }; 54 };
74 55
75 struct QueueMessageData { 56 struct QueueMessageData {
76 MessageDeliveryPolicy policy; 57 MessageDeliveryPolicy policy;
77 int source_frame_number; 58 int source_frame_number;
78 }; 59 };
79 60
80 class QueueMessageSwapPromiseTest : public testing::Test { 61 class QueueMessageSwapPromiseTest : public testing::Test {
81 public: 62 public:
82 QueueMessageSwapPromiseTest() 63 QueueMessageSwapPromiseTest()
83 : frame_swap_message_queue_(new FrameSwapMessageQueue(0)), 64 : frame_swap_message_queue_(new FrameSwapMessageQueue()),
84 sync_message_filter_(new TestSyncMessageFilter()) {} 65 sync_message_filter_(new TestSyncMessageFilter()) {}
85 66
86 ~QueueMessageSwapPromiseTest() override {} 67 ~QueueMessageSwapPromiseTest() override {}
87 68
88 std::unique_ptr<cc::SwapPromise> QueueMessageImpl( 69 std::unique_ptr<cc::SwapPromise> QueueMessageImpl(
89 IPC::Message* msg, 70 IPC::Message* msg,
90 MessageDeliveryPolicy policy, 71 MessageDeliveryPolicy policy,
91 int source_frame_number) { 72 int source_frame_number) {
92 return TestRenderWidget::QueueMessageImpl( 73 return TestRenderWidget::QueueMessageImpl(
93 msg, policy, frame_swap_message_queue_.get(), sync_message_filter_, 74 msg, policy, frame_swap_message_queue_.get(), sync_message_filter_,
94 source_frame_number); 75 source_frame_number);
95 } 76 }
96 77
97 const std::vector<std::unique_ptr<IPC::Message>>& DirectSendMessages() { 78 const std::vector<std::unique_ptr<IPC::Message>>& DirectSendMessages() {
98 return sync_message_filter_->direct_send_messages(); 79 return sync_message_filter_->messages();
99 }
100
101 std::vector<std::unique_ptr<IPC::Message>>& LastSwapMessages() {
102 return sync_message_filter_->last_swap_messages();
103 } 80 }
104 81
105 std::vector<std::unique_ptr<IPC::Message>>& NextSwapMessages() { 82 std::vector<std::unique_ptr<IPC::Message>>& NextSwapMessages() {
106 next_swap_messages_.clear(); 83 next_swap_messages_.clear();
107 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope> 84 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope>
108 send_message_scope = 85 send_message_scope =
109 frame_swap_message_queue_->AcquireSendMessageScope(); 86 frame_swap_message_queue_->AcquireSendMessageScope();
110 frame_swap_message_queue_->DrainMessages(&next_swap_messages_); 87 frame_swap_message_queue_->DrainMessages(&next_swap_messages_);
111 return next_swap_messages_; 88 return next_swap_messages_;
112 } 89 }
113 90
114 bool ContainsMessage( 91 bool ContainsMessage(
115 const std::vector<std::unique_ptr<IPC::Message>>& messages, 92 const std::vector<std::unique_ptr<IPC::Message>>& messages,
116 const IPC::Message& message) { 93 const IPC::Message& message) {
117 if (messages.empty()) 94 if (messages.empty())
118 return false; 95 return false;
119 for (const auto& msg : messages) { 96 for (const auto& msg : messages) {
120 if (msg->type() == message.type()) 97 if (msg->type() == message.type())
121 return true; 98 return true;
122 } 99 }
123 return false; 100 return false;
124 } 101 }
125 102
126 bool LastSwapHasMessage(const IPC::Message& message) {
127 return ContainsMessage(LastSwapMessages(), message);
128 }
129
130 bool NextSwapHasMessage(const IPC::Message& message) { 103 bool NextSwapHasMessage(const IPC::Message& message) {
131 return ContainsMessage(NextSwapMessages(), message); 104 return ContainsMessage(NextSwapMessages(), message);
132 } 105 }
133 106
134 void QueueMessages(QueueMessageData data[], size_t count) { 107 void QueueMessages(QueueMessageData data[], size_t count) {
135 for (size_t i = 0; i < count; ++i) { 108 for (size_t i = 0; i < count; ++i) {
136 messages_.push_back( 109 messages_.push_back(
137 IPC::Message(0, i + 1, IPC::Message::PRIORITY_NORMAL)); 110 IPC::Message(0, i + 1, IPC::Message::PRIORITY_NORMAL));
138 promises_.push_back(QueueMessageImpl(new IPC::Message(messages_[i]), 111 promises_.push_back(QueueMessageImpl(new IPC::Message(messages_[i]),
139 data[i].policy, 112 data[i].policy,
140 data[i].source_frame_number)); 113 data[i].source_frame_number));
141 } 114 }
142 } 115 }
143 116
144 void CleanupPromises() { 117 void CleanupPromises() {
145 for (const auto& promise : promises_) { 118 for (const auto& promise : promises_) {
146 if (promise.get()) { 119 if (promise.get()) {
147 promise->DidActivate(); 120 promise->DidActivate();
148 promise->WillSwap(&dummy_metadata_); 121 promise->WillSwap(NULL);
149 promise->DidSwap(); 122 promise->DidSwap();
150 } 123 }
151 } 124 }
152 } 125 }
153 126
154 protected: 127 protected:
155 void VisualStateSwapPromiseDidNotSwap( 128 void VisualStateSwapPromiseDidNotSwap(
156 cc::SwapPromise::DidNotSwapReason reason); 129 cc::SwapPromise::DidNotSwapReason reason);
157 130
158 base::test::ScopedTaskEnvironment scoped_task_environment_; 131 base::test::ScopedTaskEnvironment scoped_task_environment_;
159 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_; 132 scoped_refptr<FrameSwapMessageQueue> frame_swap_message_queue_;
160 scoped_refptr<TestSyncMessageFilter> sync_message_filter_; 133 scoped_refptr<TestSyncMessageFilter> sync_message_filter_;
161 std::vector<IPC::Message> messages_; 134 std::vector<IPC::Message> messages_;
162 std::vector<std::unique_ptr<cc::SwapPromise>> promises_; 135 std::vector<std::unique_ptr<cc::SwapPromise>> promises_;
163 cc::CompositorFrameMetadata dummy_metadata_;
164 136
165 private: 137 private:
166 std::vector<std::unique_ptr<IPC::Message>> next_swap_messages_; 138 std::vector<std::unique_ptr<IPC::Message>> next_swap_messages_;
167 139
168 DISALLOW_COPY_AND_ASSIGN(QueueMessageSwapPromiseTest); 140 DISALLOW_COPY_AND_ASSIGN(QueueMessageSwapPromiseTest);
169 }; 141 };
170 142
171 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySchedulesMessageForNextSwap) { 143 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySchedulesMessageForNextSwap) {
172 QueueMessageData data[] = { 144 QueueMessageData data[] = {
173 /* { policy, source_frame_number } */ 145 /* { policy, source_frame_number } */
174 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 146 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
175 }; 147 };
176 QueueMessages(data, arraysize(data)); 148 QueueMessages(data, arraysize(data));
177 149
178 ASSERT_TRUE(promises_[0].get()); 150 ASSERT_TRUE(promises_[0].get());
179 promises_[0]->DidActivate(); 151 promises_[0]->DidActivate();
180 promises_[0]->WillSwap(&dummy_metadata_); 152 promises_[0]->WillSwap(NULL);
181 promises_[0]->DidSwap(); 153 promises_[0]->DidSwap();
182 154
183 EXPECT_TRUE(DirectSendMessages().empty()); 155 EXPECT_TRUE(DirectSendMessages().empty());
184 EXPECT_TRUE(frame_swap_message_queue_->Empty()); 156 EXPECT_FALSE(frame_swap_message_queue_->Empty());
185 EXPECT_TRUE(LastSwapHasMessage(messages_[0])); 157 // frame_swap_message_queue_->WillSwap(1);
158 EXPECT_TRUE(NextSwapHasMessage(messages_[0]));
186 } 159 }
187 160
188 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyNeedsAtMostOnePromise) { 161 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyNeedsAtMostOnePromise) {
189 QueueMessageData data[] = { 162 QueueMessageData data[] = {
190 /* { policy, source_frame_number } */ 163 /* { policy, source_frame_number } */
191 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 164 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
192 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 165 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
193 }; 166 };
194 QueueMessages(data, arraysize(data)); 167 QueueMessages(data, arraysize(data));
195 168
196 ASSERT_TRUE(promises_[0].get()); 169 ASSERT_TRUE(promises_[0].get());
197 ASSERT_FALSE(promises_[1].get()); 170 ASSERT_FALSE(promises_[1].get());
198 171
199 CleanupPromises(); 172 CleanupPromises();
200 } 173 }
201 174
202 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnNoUpdate) { 175 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnNoUpdate) {
203 QueueMessageData data[] = { 176 QueueMessageData data[] = {
204 /* { policy, source_frame_number } */ 177 /* { policy, source_frame_number } */
205 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 178 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
206 }; 179 };
207 QueueMessages(data, arraysize(data)); 180 QueueMessages(data, arraysize(data));
208 181
209 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE); 182 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_NO_UPDATE);
210 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0])); 183 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
211 EXPECT_TRUE(LastSwapMessages().empty()); 184 EXPECT_TRUE(NextSwapMessages().empty());
212 EXPECT_TRUE(frame_swap_message_queue_->Empty()); 185 EXPECT_TRUE(frame_swap_message_queue_->Empty());
213 } 186 }
214 187
215 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnSwapFails) { 188 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicySendsMessageOnSwapFails) {
216 QueueMessageData data[] = { 189 QueueMessageData data[] = {
217 /* { policy, source_frame_number } */ 190 /* { policy, source_frame_number } */
218 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 191 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
219 }; 192 };
220 QueueMessages(data, arraysize(data)); 193 QueueMessages(data, arraysize(data));
221 194
222 promises_[0]->DidNotSwap(cc::SwapPromise::SWAP_FAILS); 195 promises_[0]->DidNotSwap(cc::SwapPromise::SWAP_FAILS);
223 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0])); 196 EXPECT_TRUE(ContainsMessage(DirectSendMessages(), messages_[0]));
224 EXPECT_TRUE(LastSwapMessages().empty()); 197 EXPECT_TRUE(NextSwapMessages().empty());
225 EXPECT_TRUE(frame_swap_message_queue_->Empty()); 198 EXPECT_TRUE(frame_swap_message_queue_->Empty());
226 } 199 }
227 200
228 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyRetainsMessageOnCommitFails) { 201 TEST_F(QueueMessageSwapPromiseTest, NextSwapPolicyRetainsMessageOnCommitFails) {
229 QueueMessageData data[] = { 202 QueueMessageData data[] = {
230 /* { policy, source_frame_number } */ 203 /* { policy, source_frame_number } */
231 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1}, 204 {MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP, 1},
232 }; 205 };
233 QueueMessages(data, arraysize(data)); 206 QueueMessages(data, arraysize(data));
234 207
235 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS); 208 promises_[0]->DidNotSwap(cc::SwapPromise::COMMIT_FAILS);
236 EXPECT_TRUE(DirectSendMessages().empty()); 209 EXPECT_TRUE(DirectSendMessages().empty());
237 EXPECT_TRUE(LastSwapMessages().empty());
238 EXPECT_FALSE(frame_swap_message_queue_->Empty()); 210 EXPECT_FALSE(frame_swap_message_queue_->Empty());
239 frame_swap_message_queue_->DidSwap(2); 211 frame_swap_message_queue_->DidSwap(2);
240 EXPECT_TRUE(NextSwapHasMessage(messages_[0])); 212 EXPECT_TRUE(NextSwapHasMessage(messages_[0]));
241 } 213 }
242 214
243 TEST_F(QueueMessageSwapPromiseTest, 215 TEST_F(QueueMessageSwapPromiseTest,
244 VisualStateQueuesMessageWhenCommitRequested) { 216 VisualStateQueuesMessageWhenCommitRequested) {
245 QueueMessageData data[] = { 217 QueueMessageData data[] = {
246 /* { policy, source_frame_number } */ 218 /* { policy, source_frame_number } */
247 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, 219 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1},
(...skipping 27 matching lines...) Expand all
275 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidActivate) { 247 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidActivate) {
276 QueueMessageData data[] = { 248 QueueMessageData data[] = {
277 /* { policy, source_frame_number } */ 249 /* { policy, source_frame_number } */
278 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, 250 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1},
279 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1}, 251 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 1},
280 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 2}, 252 {MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE, 2},
281 }; 253 };
282 QueueMessages(data, arraysize(data)); 254 QueueMessages(data, arraysize(data));
283 255
284 promises_[0]->DidActivate(); 256 promises_[0]->DidActivate();
285 promises_[0]->WillSwap(&dummy_metadata_); 257 promises_[0]->WillSwap(NULL);
286 promises_[0]->DidSwap(); 258 promises_[0]->DidSwap();
287 ASSERT_FALSE(promises_[1].get()); 259 ASSERT_FALSE(promises_[1].get());
288 std::vector<std::unique_ptr<IPC::Message>> messages; 260 std::vector<std::unique_ptr<IPC::Message>> messages;
289 messages.swap(LastSwapMessages()); 261 messages.swap(NextSwapMessages());
290 EXPECT_EQ(2u, messages.size()); 262 EXPECT_EQ(2u, messages.size());
291 EXPECT_TRUE(ContainsMessage(messages, messages_[0])); 263 EXPECT_TRUE(ContainsMessage(messages, messages_[0]));
292 EXPECT_TRUE(ContainsMessage(messages, messages_[1])); 264 EXPECT_TRUE(ContainsMessage(messages, messages_[1]));
293 EXPECT_FALSE(ContainsMessage(messages, messages_[2])); 265 EXPECT_FALSE(ContainsMessage(messages, messages_[2]));
294 266
295 promises_[2]->DidActivate(); 267 promises_[2]->DidActivate();
296 promises_[2]->DidNotSwap(cc::SwapPromise::SWAP_FAILS); 268 promises_[2]->DidNotSwap(cc::SwapPromise::SWAP_FAILS);
297 messages.swap(NextSwapMessages()); 269 messages.swap(NextSwapMessages());
298 EXPECT_TRUE(messages.empty()); 270 EXPECT_TRUE(messages.empty());
299 271
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidNotSwapSwapFails) { 319 TEST_F(QueueMessageSwapPromiseTest, VisualStateSwapPromiseDidNotSwapSwapFails) {
348 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::SWAP_FAILS); 320 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::SWAP_FAILS);
349 } 321 }
350 322
351 TEST_F(QueueMessageSwapPromiseTest, 323 TEST_F(QueueMessageSwapPromiseTest,
352 VisualStateSwapPromiseDidNotSwapActivationFails) { 324 VisualStateSwapPromiseDidNotSwapActivationFails) {
353 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::ACTIVATION_FAILS); 325 VisualStateSwapPromiseDidNotSwap(cc::SwapPromise::ACTIVATION_FAILS);
354 } 326 }
355 327
356 } // namespace content 328 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/gpu/queue_message_swap_promise.cc ('k') | content/renderer/gpu/renderer_compositor_frame_sink.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698