| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 namespace { | 38 namespace { |
| 39 | 39 |
| 40 class FakeCCSchedulerClient : public CCSchedulerClient { | 40 class FakeCCSchedulerClient : public CCSchedulerClient { |
| 41 public: | 41 public: |
| 42 FakeCCSchedulerClient() { reset(); } | 42 FakeCCSchedulerClient() { reset(); } |
| 43 void reset() | 43 void reset() |
| 44 { | 44 { |
| 45 m_actions.clear(); | 45 m_actions.clear(); |
| 46 m_hasMoreResourceUpdates = false; | 46 m_hasMoreResourceUpdates = false; |
| 47 m_canDraw = true; | 47 m_canDraw = true; |
| 48 m_drawSuccess = true; | 48 m_drawWillHappen = true; |
| 49 m_swapWillHappenIfDrawHappens = true; |
| 49 m_numDraws = 0; | 50 m_numDraws = 0; |
| 50 } | 51 } |
| 51 | 52 |
| 52 void setHasMoreResourceUpdates(bool b) { m_hasMoreResourceUpdates = b; } | 53 void setHasMoreResourceUpdates(bool b) { m_hasMoreResourceUpdates = b; } |
| 53 void setCanDraw(bool b) { m_canDraw = b; } | 54 void setCanDraw(bool b) { m_canDraw = b; } |
| 54 | 55 |
| 55 int numDraws() const { return m_numDraws; } | 56 int numDraws() const { return m_numDraws; } |
| 56 int numActions() const { return static_cast<int>(m_actions.size()); } | 57 int numActions() const { return static_cast<int>(m_actions.size()); } |
| 57 const char* action(int i) const { return m_actions[i]; } | 58 const char* action(int i) const { return m_actions[i]; } |
| 58 | 59 |
| 60 bool hasAction(const char* action) const |
| 61 { |
| 62 for (size_t i = 0; i < m_actions.size(); i++) |
| 63 if (!strcmp(m_actions[i], action)) |
| 64 return true; |
| 65 return false; |
| 66 } |
| 67 |
| 59 virtual bool canDraw() { return m_canDraw; } | 68 virtual bool canDraw() { return m_canDraw; } |
| 60 virtual bool hasMoreResourceUpdates() const { return m_hasMoreResourceUpdate
s; } | 69 virtual bool hasMoreResourceUpdates() const { return m_hasMoreResourceUpdate
s; } |
| 61 virtual void scheduledActionBeginFrame() { m_actions.push_back("scheduledAct
ionBeginFrame"); } | 70 virtual void scheduledActionBeginFrame() { m_actions.push_back("scheduledAct
ionBeginFrame"); } |
| 62 virtual bool scheduledActionDrawAndSwapIfPossible() | 71 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossi
ble() |
| 63 { | 72 { |
| 64 m_actions.push_back("scheduledActionDrawAndSwapIfPossible"); | 73 m_actions.push_back("scheduledActionDrawAndSwapIfPossible"); |
| 65 m_numDraws++; | 74 m_numDraws++; |
| 66 return m_drawSuccess; | 75 return CCScheduledActionDrawAndSwapResult(m_drawWillHappen, m_drawWillHa
ppen && m_swapWillHappenIfDrawHappens); |
| 67 } | 76 } |
| 68 | 77 |
| 69 virtual void scheduledActionDrawAndSwapForced() | 78 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced(
) |
| 70 { | 79 { |
| 71 m_actions.push_back("scheduledActionDrawAndSwapForced"); | 80 m_actions.push_back("scheduledActionDrawAndSwapForced"); |
| 72 m_numDraws++; | 81 return CCScheduledActionDrawAndSwapResult(true, m_swapWillHappenIfDrawHa
ppens); |
| 73 } | 82 } |
| 74 | 83 |
| 75 virtual void scheduledActionUpdateMoreResources() { m_actions.push_back("sch
eduledActionUpdateMoreResources"); } | 84 virtual void scheduledActionUpdateMoreResources() { m_actions.push_back("sch
eduledActionUpdateMoreResources"); } |
| 76 virtual void scheduledActionCommit() { m_actions.push_back("scheduledActionC
ommit"); } | 85 virtual void scheduledActionCommit() { m_actions.push_back("scheduledActionC
ommit"); } |
| 77 virtual void scheduledActionBeginContextRecreation() { m_actions.push_back("
scheduledActionBeginContextRecreation"); } | 86 virtual void scheduledActionBeginContextRecreation() { m_actions.push_back("
scheduledActionBeginContextRecreation"); } |
| 78 | 87 |
| 79 void setDrawSuccess(bool drawSuccess) { m_drawSuccess = drawSuccess; } | 88 void setDrawWillHappen(bool drawWillHappen) { m_drawWillHappen = drawWillHap
pen; } |
| 89 void setSwapWillHappenIfDrawHappens(bool swapWillHappenIfDrawHappens) { m_sw
apWillHappenIfDrawHappens = swapWillHappenIfDrawHappens; } |
| 80 | 90 |
| 81 protected: | 91 protected: |
| 82 bool m_hasMoreResourceUpdates; | 92 bool m_hasMoreResourceUpdates; |
| 83 bool m_canDraw; | 93 bool m_canDraw; |
| 84 bool m_drawSuccess; | 94 bool m_drawWillHappen; |
| 95 bool m_swapWillHappenIfDrawHappens; |
| 85 int m_numDraws; | 96 int m_numDraws; |
| 86 std::vector<const char*> m_actions; | 97 std::vector<const char*> m_actions; |
| 87 }; | 98 }; |
| 88 | 99 |
| 89 TEST(CCSchedulerTest, RequestCommit) | 100 TEST(CCSchedulerTest, RequestCommit) |
| 90 { | 101 { |
| 91 FakeCCSchedulerClient client; | 102 FakeCCSchedulerClient client; |
| 92 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); | 103 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); |
| 93 OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, adoptPtr(new CC
FrameRateController(timeSource))); | 104 OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, adoptPtr(new CC
FrameRateController(timeSource))); |
| 94 scheduler->setVisible(true); | 105 scheduler->setVisible(true); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 } | 167 } |
| 157 | 168 |
| 158 class SchedulerClientThatSetNeedsDrawInsideDraw : public FakeCCSchedulerClient { | 169 class SchedulerClientThatSetNeedsDrawInsideDraw : public FakeCCSchedulerClient { |
| 159 public: | 170 public: |
| 160 SchedulerClientThatSetNeedsDrawInsideDraw() | 171 SchedulerClientThatSetNeedsDrawInsideDraw() |
| 161 : m_scheduler(0) { } | 172 : m_scheduler(0) { } |
| 162 | 173 |
| 163 void setScheduler(CCScheduler* scheduler) { m_scheduler = scheduler; } | 174 void setScheduler(CCScheduler* scheduler) { m_scheduler = scheduler; } |
| 164 | 175 |
| 165 virtual void scheduledActionBeginFrame() { } | 176 virtual void scheduledActionBeginFrame() { } |
| 166 virtual bool scheduledActionDrawAndSwapIfPossible() | 177 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossi
ble() |
| 167 { | 178 { |
| 168 // Only setNeedsRedraw the first time this is called | 179 // Only setNeedsRedraw the first time this is called |
| 169 if (!m_numDraws) | 180 if (!m_numDraws) |
| 170 m_scheduler->setNeedsRedraw(); | 181 m_scheduler->setNeedsRedraw(); |
| 171 return FakeCCSchedulerClient::scheduledActionDrawAndSwapIfPossible(); | 182 return FakeCCSchedulerClient::scheduledActionDrawAndSwapIfPossible(); |
| 172 } | 183 } |
| 173 | 184 |
| 174 virtual void scheduledActionDrawAndSwapForced() { } | 185 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced(
) |
| 186 { |
| 187 ASSERT_NOT_REACHED(); |
| 188 return CCScheduledActionDrawAndSwapResult(true, true); |
| 189 } |
| 190 |
| 175 virtual void scheduledActionUpdateMoreResources() { } | 191 virtual void scheduledActionUpdateMoreResources() { } |
| 176 virtual void scheduledActionCommit() { } | 192 virtual void scheduledActionCommit() { } |
| 177 virtual void scheduledActionBeginContextRecreation() { } | 193 virtual void scheduledActionBeginContextRecreation() { } |
| 178 | 194 |
| 179 protected: | 195 protected: |
| 180 CCScheduler* m_scheduler; | 196 CCScheduler* m_scheduler; |
| 181 }; | 197 }; |
| 182 | 198 |
| 183 // Tests for two different situations: | 199 // Tests for two different situations: |
| 184 // 1. the scheduler dropping setNeedsRedraw requests that happen inside | 200 // 1. the scheduler dropping setNeedsRedraw requests that happen inside |
| (...skipping 24 matching lines...) Expand all Loading... |
| 209 } | 225 } |
| 210 | 226 |
| 211 // Test that requesting redraw inside a failed draw doesn't lose the request. | 227 // Test that requesting redraw inside a failed draw doesn't lose the request. |
| 212 TEST(CCSchedulerTest, RequestRedrawInsideFailedDraw) | 228 TEST(CCSchedulerTest, RequestRedrawInsideFailedDraw) |
| 213 { | 229 { |
| 214 SchedulerClientThatSetNeedsDrawInsideDraw client; | 230 SchedulerClientThatSetNeedsDrawInsideDraw client; |
| 215 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); | 231 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); |
| 216 OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, adoptPtr(new CC
FrameRateController(timeSource))); | 232 OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, adoptPtr(new CC
FrameRateController(timeSource))); |
| 217 client.setScheduler(scheduler.get()); | 233 client.setScheduler(scheduler.get()); |
| 218 scheduler->setVisible(true); | 234 scheduler->setVisible(true); |
| 219 client.setDrawSuccess(false); | 235 client.setDrawWillHappen(false); |
| 220 | 236 |
| 221 scheduler->setNeedsRedraw(); | 237 scheduler->setNeedsRedraw(); |
| 222 EXPECT_TRUE(scheduler->redrawPending()); | 238 EXPECT_TRUE(scheduler->redrawPending()); |
| 223 EXPECT_TRUE(timeSource->active()); | 239 EXPECT_TRUE(timeSource->active()); |
| 224 EXPECT_EQ(0, client.numDraws()); | 240 EXPECT_EQ(0, client.numDraws()); |
| 225 | 241 |
| 226 // Fail the draw. | 242 // Fail the draw. |
| 227 timeSource->tick(); | 243 timeSource->tick(); |
| 228 EXPECT_EQ(1, client.numDraws()); | 244 EXPECT_EQ(1, client.numDraws()); |
| 229 | 245 |
| 230 // We have a commit pending and the draw failed, and we didn't lose the redr
aw request. | 246 // We have a commit pending and the draw failed, and we didn't lose the redr
aw request. |
| 231 EXPECT_TRUE(scheduler->commitPending()); | 247 EXPECT_TRUE(scheduler->commitPending()); |
| 232 EXPECT_TRUE(scheduler->redrawPending()); | 248 EXPECT_TRUE(scheduler->redrawPending()); |
| 233 EXPECT_TRUE(timeSource->active()); | 249 EXPECT_TRUE(timeSource->active()); |
| 234 | 250 |
| 235 // Fail the draw again. | 251 // Fail the draw again. |
| 236 timeSource->tick(); | 252 timeSource->tick(); |
| 237 EXPECT_EQ(2, client.numDraws()); | 253 EXPECT_EQ(2, client.numDraws()); |
| 238 EXPECT_TRUE(scheduler->commitPending()); | 254 EXPECT_TRUE(scheduler->commitPending()); |
| 239 EXPECT_TRUE(scheduler->redrawPending()); | 255 EXPECT_TRUE(scheduler->redrawPending()); |
| 240 EXPECT_TRUE(timeSource->active()); | 256 EXPECT_TRUE(timeSource->active()); |
| 241 | 257 |
| 242 // Draw successfully. | 258 // Draw successfully. |
| 243 client.setDrawSuccess(true); | 259 client.setDrawWillHappen(true); |
| 244 timeSource->tick(); | 260 timeSource->tick(); |
| 245 EXPECT_EQ(3, client.numDraws()); | 261 EXPECT_EQ(3, client.numDraws()); |
| 246 EXPECT_TRUE(scheduler->commitPending()); | 262 EXPECT_TRUE(scheduler->commitPending()); |
| 247 EXPECT_FALSE(scheduler->redrawPending()); | 263 EXPECT_FALSE(scheduler->redrawPending()); |
| 248 EXPECT_FALSE(timeSource->active()); | 264 EXPECT_FALSE(timeSource->active()); |
| 249 } | 265 } |
| 250 | 266 |
| 251 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeCCSchedulerClient
{ | 267 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeCCSchedulerClient
{ |
| 252 public: | 268 public: |
| 253 SchedulerClientThatSetNeedsCommitInsideDraw() | 269 SchedulerClientThatSetNeedsCommitInsideDraw() |
| 254 : m_scheduler(0) { } | 270 : m_scheduler(0) { } |
| 255 | 271 |
| 256 void setScheduler(CCScheduler* scheduler) { m_scheduler = scheduler; } | 272 void setScheduler(CCScheduler* scheduler) { m_scheduler = scheduler; } |
| 257 | 273 |
| 258 virtual void scheduledActionBeginFrame() { } | 274 virtual void scheduledActionBeginFrame() { } |
| 259 virtual bool scheduledActionDrawAndSwapIfPossible() | 275 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapIfPossi
ble() |
| 260 { | 276 { |
| 261 // Only setNeedsCommit the first time this is called | 277 // Only setNeedsCommit the first time this is called |
| 262 if (!m_numDraws) | 278 if (!m_numDraws) |
| 263 m_scheduler->setNeedsCommit(); | 279 m_scheduler->setNeedsCommit(); |
| 264 return FakeCCSchedulerClient::scheduledActionDrawAndSwapIfPossible(); | 280 return FakeCCSchedulerClient::scheduledActionDrawAndSwapIfPossible(); |
| 265 } | 281 } |
| 266 | 282 |
| 267 virtual void scheduledActionDrawAndSwapForced() { } | 283 virtual CCScheduledActionDrawAndSwapResult scheduledActionDrawAndSwapForced(
) |
| 284 { |
| 285 ASSERT_NOT_REACHED(); |
| 286 return CCScheduledActionDrawAndSwapResult(true, true); |
| 287 } |
| 288 |
| 268 virtual void scheduledActionUpdateMoreResources() { } | 289 virtual void scheduledActionUpdateMoreResources() { } |
| 269 virtual void scheduledActionCommit() { } | 290 virtual void scheduledActionCommit() { } |
| 270 virtual void scheduledActionBeginContextRecreation() { } | 291 virtual void scheduledActionBeginContextRecreation() { } |
| 271 | 292 |
| 272 protected: | 293 protected: |
| 273 CCScheduler* m_scheduler; | 294 CCScheduler* m_scheduler; |
| 274 }; | 295 }; |
| 275 | 296 |
| 276 // Tests for the scheduler infinite-looping on setNeedsCommit requests that | 297 // Tests for the scheduler infinite-looping on setNeedsCommit requests that |
| 277 // happen inside a scheduledActionDrawAndSwap | 298 // happen inside a scheduledActionDrawAndSwap |
| (...skipping 23 matching lines...) Expand all Loading... |
| 301 } | 322 } |
| 302 | 323 |
| 303 // Tests that when a draw fails then the pending commit should not be dropped. | 324 // Tests that when a draw fails then the pending commit should not be dropped. |
| 304 TEST(CCSchedulerTest, RequestCommitInsideFailedDraw) | 325 TEST(CCSchedulerTest, RequestCommitInsideFailedDraw) |
| 305 { | 326 { |
| 306 SchedulerClientThatSetNeedsDrawInsideDraw client; | 327 SchedulerClientThatSetNeedsDrawInsideDraw client; |
| 307 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); | 328 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); |
| 308 OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, adoptPtr(new CC
FrameRateController(timeSource))); | 329 OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, adoptPtr(new CC
FrameRateController(timeSource))); |
| 309 client.setScheduler(scheduler.get()); | 330 client.setScheduler(scheduler.get()); |
| 310 scheduler->setVisible(true); | 331 scheduler->setVisible(true); |
| 311 client.setDrawSuccess(false); | 332 client.setDrawWillHappen(false); |
| 312 | 333 |
| 313 scheduler->setNeedsRedraw(); | 334 scheduler->setNeedsRedraw(); |
| 314 EXPECT_TRUE(scheduler->redrawPending()); | 335 EXPECT_TRUE(scheduler->redrawPending()); |
| 315 EXPECT_TRUE(timeSource->active()); | 336 EXPECT_TRUE(timeSource->active()); |
| 316 EXPECT_EQ(0, client.numDraws()); | 337 EXPECT_EQ(0, client.numDraws()); |
| 317 | 338 |
| 318 // Fail the draw. | 339 // Fail the draw. |
| 319 timeSource->tick(); | 340 timeSource->tick(); |
| 320 EXPECT_EQ(1, client.numDraws()); | 341 EXPECT_EQ(1, client.numDraws()); |
| 321 | 342 |
| 322 // We have a commit pending and the draw failed, and we didn't lose the comm
it request. | 343 // We have a commit pending and the draw failed, and we didn't lose the comm
it request. |
| 323 EXPECT_TRUE(scheduler->commitPending()); | 344 EXPECT_TRUE(scheduler->commitPending()); |
| 324 EXPECT_TRUE(scheduler->redrawPending()); | 345 EXPECT_TRUE(scheduler->redrawPending()); |
| 325 EXPECT_TRUE(timeSource->active()); | 346 EXPECT_TRUE(timeSource->active()); |
| 326 | 347 |
| 327 // Fail the draw again. | 348 // Fail the draw again. |
| 328 timeSource->tick(); | 349 timeSource->tick(); |
| 329 EXPECT_EQ(2, client.numDraws()); | 350 EXPECT_EQ(2, client.numDraws()); |
| 330 EXPECT_TRUE(scheduler->commitPending()); | 351 EXPECT_TRUE(scheduler->commitPending()); |
| 331 EXPECT_TRUE(scheduler->redrawPending()); | 352 EXPECT_TRUE(scheduler->redrawPending()); |
| 332 EXPECT_TRUE(timeSource->active()); | 353 EXPECT_TRUE(timeSource->active()); |
| 333 | 354 |
| 334 // Draw successfully. | 355 // Draw successfully. |
| 335 client.setDrawSuccess(true); | 356 client.setDrawWillHappen(true); |
| 336 timeSource->tick(); | 357 timeSource->tick(); |
| 337 EXPECT_EQ(3, client.numDraws()); | 358 EXPECT_EQ(3, client.numDraws()); |
| 338 EXPECT_TRUE(scheduler->commitPending()); | 359 EXPECT_TRUE(scheduler->commitPending()); |
| 339 EXPECT_FALSE(scheduler->redrawPending()); | 360 EXPECT_FALSE(scheduler->redrawPending()); |
| 340 EXPECT_FALSE(timeSource->active()); | 361 EXPECT_FALSE(timeSource->active()); |
| 341 } | 362 } |
| 342 | 363 |
| 343 TEST(CCSchedulerTest, NoBeginFrameWhenDrawFails) | 364 TEST(CCSchedulerTest, NoBeginFrameWhenDrawFails) |
| 344 { | 365 { |
| 345 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); | 366 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 373 EXPECT_EQ(2, client.numDraws()); | 394 EXPECT_EQ(2, client.numDraws()); |
| 374 EXPECT_EQ(1, controllerPtr->numFramesPending()); | 395 EXPECT_EQ(1, controllerPtr->numFramesPending()); |
| 375 scheduler->didSwapBuffersComplete(); | 396 scheduler->didSwapBuffersComplete(); |
| 376 EXPECT_EQ(0, controllerPtr->numFramesPending()); | 397 EXPECT_EQ(0, controllerPtr->numFramesPending()); |
| 377 | 398 |
| 378 scheduler->setNeedsRedraw(); | 399 scheduler->setNeedsRedraw(); |
| 379 EXPECT_TRUE(scheduler->redrawPending()); | 400 EXPECT_TRUE(scheduler->redrawPending()); |
| 380 EXPECT_TRUE(timeSource->active()); | 401 EXPECT_TRUE(timeSource->active()); |
| 381 | 402 |
| 382 // Fail to draw, this should not start a frame. | 403 // Fail to draw, this should not start a frame. |
| 383 client.setDrawSuccess(false); | 404 client.setDrawWillHappen(false); |
| 384 timeSource->tick(); | 405 timeSource->tick(); |
| 385 EXPECT_EQ(3, client.numDraws()); | 406 EXPECT_EQ(3, client.numDraws()); |
| 386 EXPECT_EQ(0, controllerPtr->numFramesPending()); | 407 EXPECT_EQ(0, controllerPtr->numFramesPending()); |
| 387 } | 408 } |
| 388 | 409 |
| 410 TEST(CCSchedulerTest, NoBeginFrameWhenSwapFailsDuringForcedCommit) |
| 411 { |
| 412 RefPtr<FakeCCTimeSource> timeSource = adoptRef(new FakeCCTimeSource()); |
| 413 FakeCCSchedulerClient client; |
| 414 OwnPtr<FakeCCFrameRateController> controller = adoptPtr(new FakeCCFrameRateC
ontroller(timeSource)); |
| 415 FakeCCFrameRateController* controllerPtr = controller.get(); |
| 416 OwnPtr<CCScheduler> scheduler = CCScheduler::create(&client, controller.rele
ase()); |
| 417 |
| 418 EXPECT_EQ(0, controllerPtr->numFramesPending()); |
| 419 |
| 420 // Tell the client that it will fail to swap. |
| 421 client.setDrawWillHappen(true); |
| 422 client.setSwapWillHappenIfDrawHappens(false); |
| 423 |
| 424 // Get the compositor to do a scheduledActionDrawAndSwapForced. |
| 425 scheduler->setNeedsRedraw(); |
| 426 scheduler->setNeedsForcedRedraw(); |
| 427 EXPECT_TRUE(client.hasAction("scheduledActionDrawAndSwapForced")); |
| 428 |
| 429 // We should not have told the frame rate controller that we began a frame. |
| 430 EXPECT_EQ(0, controllerPtr->numFramesPending()); |
| 389 } | 431 } |
| 432 |
| 433 } |
| OLD | NEW |