190
190
modes0, encoder_ids, connector_physical_size_mm);
193
for (int i = 0; i < disconnected; i++)
195
uint32_t const connector_id{connector_base_id + connected + i};
197
connector_ids.push_back(connector_id);
198
resources.add_connector(connector_id, DRM_MODE_CONNECTOR_VGA,
199
DRM_MODE_DISCONNECTED, 0,
200
modes_empty, encoder_ids, geom::Size{});
193
203
resources.prepare();
215
225
using namespace testing;
217
int const num_outputs{3};
227
int const num_connected_outputs{3};
228
int const num_disconnected_outputs{2};
218
229
uint32_t const fb_id{66};
220
setup_outputs(num_outputs);
231
setup_outputs(num_connected_outputs, num_disconnected_outputs);
222
233
/* Create DRM FBs */
223
234
EXPECT_CALL(mock_drm, drmModeAddFB(mock_drm.fake_drm.fd(),
258
269
using namespace testing;
260
int const num_outputs{3};
271
int const num_connected_outputs{3};
272
int const num_disconnected_outputs{2};
261
273
EGLContext const shared_context{reinterpret_cast<EGLContext>(0x77)};
263
setup_outputs(num_outputs);
275
setup_outputs(num_connected_outputs, num_disconnected_outputs);
265
277
/* Will create only one shared context */
266
278
EXPECT_CALL(mock_egl, eglCreateContext(_, _, EGL_NO_CONTEXT, _))
304
316
using namespace testing;
306
int const num_outputs{3};
318
int const num_connected_outputs{3};
319
int const num_disconnected_outputs{2};
307
320
uint32_t const fb_id{66};
308
std::vector<void*> user_data(num_outputs, nullptr);
321
std::vector<void*> user_data(num_connected_outputs, nullptr);
310
setup_outputs(num_outputs);
323
setup_outputs(num_connected_outputs, num_disconnected_outputs);
312
325
/* Create DRM FBs */
313
326
EXPECT_CALL(mock_drm, drmModeAddFB(mock_drm.fake_drm.fd(),
330
343
/* Handle the events properly */
331
344
EXPECT_CALL(mock_drm, drmHandleEvent(mock_drm.fake_drm.fd(), _))
345
.Times(num_connected_outputs)
333
346
.WillOnce(DoAll(InvokePageFlipHandler(&user_data[0]), Return(0)))
334
347
.WillOnce(DoAll(InvokePageFlipHandler(&user_data[1]), Return(0)))
335
348
.WillOnce(DoAll(InvokePageFlipHandler(&user_data[2]), Return(0)));
383
396
using namespace testing;
385
int const num_outputs{3};
398
int const num_connected_outputs{3};
399
int const num_disconnected_outputs{2};
386
400
uint32_t const base_fb_id{66};
387
401
FBIDContainer fb_id_container{base_fb_id};
389
setup_outputs(num_outputs);
403
setup_outputs(num_connected_outputs, num_disconnected_outputs);
391
405
/* Create DRM FBs */
392
406
EXPECT_CALL(mock_drm, drmModeAddFB(mock_drm.fake_drm.fd(),
393
407
_, _, _, _, _, _, _))
408
.Times(num_connected_outputs)
395
409
.WillRepeatedly(Invoke(&fb_id_container, &FBIDContainer::add_fb));
397
411
ExpectationSet crtc_setups;
399
413
/* All crtcs are set */
400
for (int i = 0; i < num_outputs; i++)
414
for (int i = 0; i < num_connected_outputs; i++)
402
416
crtc_setups += EXPECT_CALL(mock_drm,
403
417
drmModeSetCrtc(mock_drm.fake_drm.fd(),
424
438
auto display = create_display_side_by_side(create_platform());
441
TEST_F(GBMDisplayMultiMonitorTest, configure_clears_unused_connected_outputs)
443
using namespace testing;
445
int const num_connected_outputs{3};
446
int const num_disconnected_outputs{2};
448
setup_outputs(num_connected_outputs, num_disconnected_outputs);
450
auto display = create_display_cloned(create_platform());
452
Mock::VerifyAndClearExpectations(&mock_drm);
454
/* All unused connected outputs are cleared */
455
for (int i = 0; i < num_connected_outputs; i++)
457
EXPECT_CALL(mock_drm,
458
drmModeSetCursor(mock_drm.fake_drm.fd(),
459
crtc_ids[i], 0, 0, 0))
461
EXPECT_CALL(mock_drm,
462
drmModeSetCrtc(mock_drm.fake_drm.fd(),
463
crtc_ids[i], 0, 0, 0,
464
nullptr, 0, nullptr))
468
/* Set all outputs to unused */
469
auto conf = display->configuration();
471
conf->for_each_output(
472
[&](mg::DisplayConfigurationOutput const& conf_output)
474
conf->configure_output(conf_output.id, false, conf_output.top_left,
475
conf_output.preferred_mode_index, mir_power_mode_on);
478
display->configure(*conf);
480
Mock::VerifyAndClearExpectations(&mock_drm);
482
/* All crtcs are restored at teardown */
483
for (int i = 0; i < num_connected_outputs; i++)
485
EXPECT_CALL(mock_drm,
486
drmModeSetCrtc(mock_drm.fake_drm.fd(), crtc_ids[i],
487
0, _, _, Pointee(connector_ids[i]),
493
TEST_F(GBMDisplayMultiMonitorTest, resume_clears_unused_connected_outputs)
495
using namespace testing;
497
int const num_connected_outputs{3};
498
int const num_disconnected_outputs{2};
500
setup_outputs(num_connected_outputs, num_disconnected_outputs);
502
auto display = create_display_cloned(create_platform());
504
/* Set all outputs to unused */
505
auto conf = display->configuration();
507
conf->for_each_output(
508
[&](mg::DisplayConfigurationOutput const& conf_output)
510
conf->configure_output(conf_output.id, false, conf_output.top_left,
511
conf_output.preferred_mode_index, mir_power_mode_on);
514
display->configure(*conf);
518
Mock::VerifyAndClearExpectations(&mock_drm);
520
/* All unused connected outputs are cleared */
521
for (int i = 0; i < num_connected_outputs; i++)
523
EXPECT_CALL(mock_drm,
524
drmModeSetCrtc(mock_drm.fake_drm.fd(),
525
crtc_ids[i], 0, 0, 0,
526
nullptr, 0, nullptr))
532
Mock::VerifyAndClearExpectations(&mock_drm);
534
/* All crtcs are restored at teardown */
535
for (int i = 0; i < num_connected_outputs; i++)
537
EXPECT_CALL(mock_drm,
538
drmModeSetCrtc(mock_drm.fake_drm.fd(), crtc_ids[i],
539
0, _, _, Pointee(connector_ids[i]),