116
168
TEST_F(DoubleBufferTest, TestSubBufferCopyIfNoFBOAndNoSubBufferBlit)
118
StrictMock <MockDoubleBuffer> dbStrict;
170
StrictMock <MockVSyncDoubleBuffer> dbStrict;
120
172
EXPECT_CALL (dbStrict, blitAvailable ()).WillOnce (Return (false));
121
173
EXPECT_CALL (dbStrict, fallbackBlitAvailable ()).WillOnce (Return (true));
174
EXPECT_CALL (dbStrict, enableAsyncVideoSync (DoubleBuffer::Blit, _))
175
.WillOnce (Return (false));
176
EXPECT_CALL (dbStrict, enableBlockingVideoSync (DoubleBuffer::Blit, _))
177
.WillOnce (Return (true));
122
178
EXPECT_CALL (dbStrict, fallbackBlit (blitRegion));
124
180
dbStrict.render (blitRegion, false);
183
TEST_F(DoubleBufferTest, TestCallWorkingStrategy)
185
EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Swap, _))
186
.WillOnce (Return (true));
188
db.vsync (DoubleBuffer::Swap);
191
TEST_F(DoubleBufferTest, TestCallNextWorkingStrategy)
194
EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _))
195
.WillOnce (Return (false));
196
/* Try the next one */
197
EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _))
198
.WillOnce (Return (true));
200
db.vsync (DoubleBuffer::Blit);
203
TEST_F(DoubleBufferTest, TestCallPrevCallNextPrevDeactivated)
206
EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _))
207
.WillOnce (Return (false));
208
/* Try the next one */
209
EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _))
210
.WillOnce (Return (true));
212
db.vsync (DoubleBuffer::Blit);
214
EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _))
215
.WillOnce (Return (true));
216
/* Previous one must be deactivated */
217
EXPECT_CALL (db, disableBlockingVideoSync ());
219
db.vsync (DoubleBuffer::Blit);
222
TEST_F(DoubleBufferTest, TestReportNoHardwareVSyncIfMoreThan5UnthrottledFrames)
224
/* This one succeeds but fails to throttle */
225
for (unsigned int i = 0; i < 5; ++i)
227
EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _))
228
.WillOnce (Return (false));
229
EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _))
230
.WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::ExternalFrameThrottlingRequired),
233
db.vsync (DoubleBuffer::Blit);
236
EXPECT_FALSE (db.hardwareVSyncFunctional ());
239
TEST_F(DoubleBufferTest, TestRestoreReportHardwareVSync)
241
/* This one succeeds but fails to throttle */
242
for (unsigned int i = 0; i < 5; ++i)
244
EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _))
245
.WillOnce (Return (false));
246
EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _))
247
.WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::ExternalFrameThrottlingRequired),
250
EXPECT_TRUE (db.hardwareVSyncFunctional ());
252
db.vsync (DoubleBuffer::Blit);
255
EXPECT_FALSE (db.hardwareVSyncFunctional ());
258
EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _))
259
.WillOnce (Return (false));
260
EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _))
261
.WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::FrameThrottledInternally),
264
db.vsync (DoubleBuffer::Blit);
266
/* And should report to work for another 5 bad frames */
267
for (unsigned int i = 0; i < 5; ++i)
269
EXPECT_CALL (db, enableAsyncVideoSync (DoubleBuffer::Blit, _))
270
.WillOnce (Return (false));
271
EXPECT_CALL (db, enableBlockingVideoSync (DoubleBuffer::Blit, _))
272
.WillOnce (DoAll (SetArgReferee <1> (DoubleBuffer::ExternalFrameThrottlingRequired),
275
EXPECT_TRUE (db.hardwareVSyncFunctional ());
277
db.vsync (DoubleBuffer::Blit);
280
EXPECT_FALSE (db.hardwareVSyncFunctional ());
285
class MockOpenGLFunctionsTable
289
MOCK_METHOD3 (waitVideoSyncSGI, int (int, int, unsigned int *));
290
MOCK_METHOD1 (swapIntervalEXT, void (int));
293
namespace cgl = compiz::opengl;
294
namespace cgli = compiz::opengl::impl;
296
cgli::GLXWaitVideoSyncSGIFunc
297
GetWaitVideoSyncFuncFromMock (MockOpenGLFunctionsTable &mock)
299
return boost::bind (&MockOpenGLFunctionsTable::waitVideoSyncSGI, &mock, _1, _2, _3);
302
cgli::GLXSwapIntervalEXTFunc
303
GetSwapIntervalFuncFromMock (MockOpenGLFunctionsTable &mock)
305
return boost::bind (&MockOpenGLFunctionsTable::swapIntervalEXT, &mock, _1);
309
class OpenGLVideoSyncTest :
310
public ::testing::Test
314
OpenGLVideoSyncTest () :
315
doubleBuffer (GetSwapIntervalFuncFromMock (functions),
316
GetWaitVideoSyncFuncFromMock (functions))
320
MockDoubleBuffer doubleBuffer;
321
MockOpenGLFunctionsTable functions;
324
TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalOnVSyncForFlip)
326
EXPECT_CALL (functions, swapIntervalEXT (1));
327
doubleBuffer.vsync (cgl::DoubleBuffer::Swap);
330
TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalOnEnableForFlipOnlyOnce)
332
EXPECT_CALL (functions, swapIntervalEXT (1)).Times (1);
333
doubleBuffer.vsync (cgl::DoubleBuffer::Swap);
334
doubleBuffer.vsync (cgl::DoubleBuffer::Swap);
337
TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalOnEnableForFlipAndZeroForDisable)
339
EXPECT_CALL (functions, swapIntervalEXT (1));
340
doubleBuffer.vsync (cgl::DoubleBuffer::Swap);
341
EXPECT_CALL (functions, swapIntervalEXT (0));
342
EXPECT_CALL (functions, waitVideoSyncSGI (1, 0, _));
343
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
346
TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalZeroForDisableOnce)
349
EXPECT_CALL (functions, swapIntervalEXT (1)).Times (1);
350
doubleBuffer.vsync (cgl::DoubleBuffer::Swap);
352
/* Disable it twice */
353
EXPECT_CALL (functions, swapIntervalEXT (0)).Times (1);
354
EXPECT_CALL (functions, waitVideoSyncSGI (1, 0, _)).Times (2);
355
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
356
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
359
TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalFailsToEnableForCopy)
361
EXPECT_CALL (functions, swapIntervalEXT (1)).Times (0);
362
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _));
363
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
366
TEST_F (OpenGLVideoSyncTest, TestCallSwapIntervalUnthrottledWhereSuccess)
368
EXPECT_CALL (functions, swapIntervalEXT (1));
370
/* At the moment there's no way to test except for the general throttled method */
371
doubleBuffer.vsync (cgl::DoubleBuffer::Swap);
373
EXPECT_FALSE (doubleBuffer.hardwareVSyncFunctional ());
376
TEST_F (OpenGLVideoSyncTest, TestCallsGetVideoSyncAndWaitVideoSyncForCopy)
378
EXPECT_CALL (functions, waitVideoSyncSGI (_, _, _));
379
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
382
TEST_F (OpenGLVideoSyncTest, TestCallsWaitVideoSyncAndThrottled)
385
ON_CALL (functions, waitVideoSyncSGI (1, _, _)).WillByDefault (DoAll (SetArgPointee<2> (0),
387
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).Times (5);
388
/* Returned next frame, this frame was throttled */
389
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
390
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
391
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
392
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
393
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
394
EXPECT_FALSE (doubleBuffer.hardwareVSyncFunctional ());
397
TEST_F (OpenGLVideoSyncTest, TestCallsWaitVideoSyncAndThrottledEveryFrame)
401
/* Frame 0 to frame 1 */
402
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (1),
404
/* Frame 1 to frame 2 */
405
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (2),
407
/* Frame 2 to frame 3 */
408
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (3),
410
/* Frame 3 to frame 4 */
411
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (4),
413
/* Frame 5 to frame 5 */
414
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (5),
416
/* Returned next frame, this frame was throttled */
417
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
418
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
419
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
420
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
421
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
422
EXPECT_TRUE (doubleBuffer.hardwareVSyncFunctional ());
425
TEST_F (OpenGLVideoSyncTest, TestCallsWaitVideoSyncAndUnthrottledDueToBrokenWaitVSync)
428
ON_CALL (functions, waitVideoSyncSGI (1, _, _)).WillByDefault (DoAll (SetArgPointee<2> (0),
430
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).Times (5);
431
/* Returned next frame, this frame was not throttled */
432
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
433
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
434
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
435
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
436
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
437
EXPECT_FALSE (doubleBuffer.hardwareVSyncFunctional ());
441
/* Frame 0 to frame 1 */
442
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (1),
444
/* Frame 1 to frame 2 */
445
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (2),
447
/* Frame 2 to frame 3 */
448
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (3),
450
/* Frame 3 to frame 4 */
451
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (4),
453
/* Frame 5 to frame 5 (eg, working waitVideoSyncSGI) */
454
EXPECT_CALL (functions, waitVideoSyncSGI (1, _, _)).WillOnce (DoAll (SetArgPointee<2> (5),
456
/* Returned next frame, this frame was throttled */
457
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
458
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
459
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
460
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
461
doubleBuffer.vsync (cgl::DoubleBuffer::Blit);
462
EXPECT_TRUE (doubleBuffer.hardwareVSyncFunctional ());