112
112
std::shared_ptr<mtd::StubRenderable> const stub_renderable1;
113
113
std::shared_ptr<mtd::StubRenderable> const stub_renderable2;
114
114
std::shared_ptr<mtd::MockHWCDeviceWrapper> const mock_device;
115
mtd::StubSwappingGLContext stub_context;
115
mtd::StubSwappingGLContext const stub_context;
116
116
mg::RenderableList renderlist;
117
117
std::shared_ptr<mga::LayerAdapter> const layer_adapter;
118
mga::DisplayName primary{mga::DisplayName::primary};
130
131
EXPECT_CALL(*mock_device, prepare(MatchesPrimaryList(expected_list)))
133
mga::HwcDevice device(mock_device, layer_adapter);
134
device.post_gl(stub_context);
134
mga::LayerList list(layer_adapter, {});
135
mga::HwcDevice device(mock_device);
136
device.commit(primary, list, stub_context, stub_compositor);
137
139
TEST_F(HwcDevice, calls_backup_compositor_when_overlay_rejected)
164
166
EXPECT_CALL(mock_compositor, render(expected_renderable_list,Ref(stub_context)))
165
167
.InSequence(seq);
167
mga::HwcDevice device(mock_device, layer_adapter);
168
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, mock_compositor));
169
mga::LayerList list(layer_adapter, renderlist);
170
mga::HwcDevice device(mock_device);
171
device.commit(primary, list, stub_context, mock_compositor);
174
TEST_F(HwcDevice, swaps_buffers_directly_when_no_renderables)
176
using namespace testing;
177
mtd::MockRenderableListCompositor mock_compositor;
178
mtd::MockSwappingGLContext mock_context;
179
ON_CALL(mock_context, last_rendered_buffer())
180
.WillByDefault(Return(stub_fb_buffer));
182
EXPECT_CALL(mock_compositor, render(_,_))
184
EXPECT_CALL(mock_context, swap_buffers());
186
mga::LayerList list(layer_adapter, {});
187
mga::HwcDevice device(mock_device);
188
device.commit(primary, list, mock_context, mock_compositor);
171
191
TEST_F(HwcDevice, resets_layers_when_prepare_gl_called)
189
209
.InSequence(seq);
190
210
EXPECT_CALL(*mock_device, prepare(MatchesPrimaryList(expected_list2)))
191
211
.InSequence(seq);
192
mga::HwcDevice device(mock_device, layer_adapter);
194
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, stub_compositor));
195
device.post_gl(stub_context);
213
mga::HwcDevice device(mock_device);
214
mga::LayerList list(layer_adapter, renderlist);
215
device.commit(primary, list, stub_context, stub_compositor);
216
list.update_list({});
217
device.commit(primary, list, stub_context, stub_compositor);
198
220
TEST_F(HwcDevice, sets_and_updates_fences)
222
244
EXPECT_CALL(*mock_native_buffer3, update_usage(fb_release_fence, mga::BufferAccess::read))
223
245
.InSequence(seq);
225
mga::HwcDevice device(mock_device, layer_adapter);
226
device.post_gl(stub_context);
247
mga::HwcDevice device(mock_device);
248
mga::LayerList list(layer_adapter, {});
249
device.commit(primary, list, stub_context, stub_compositor);
228
251
//check that the retire fence is closed
229
252
bool retire_fence_was_closed{fcntl(hwc_retire_fence, F_GETFD) == -1};
273
295
EXPECT_CALL(*mock_native_buffer3, update_usage(fb_release_fence, mga::BufferAccess::read))
274
296
.InSequence(seq);
276
EXPECT_TRUE(device.post_overlays(stub_context, {stub_renderable1}, stub_compositor));
298
mga::HwcDevice device(mock_device);
299
mga::LayerList list(layer_adapter, {stub_renderable1});
300
device.commit(primary, list, stub_context, stub_compositor);
279
303
TEST_F(HwcDevice, commits_correct_list_when_all_accepted_as_overlays)
336
358
EXPECT_CALL(*mock_native_buffer2, update_usage(release_fence2, mga::BufferAccess::read))
337
359
.InSequence(seq);
339
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, stub_compositor));
342
TEST_F(HwcDevice, discards_second_set_if_all_overlays_and_nothing_has_changed)
344
using namespace testing;
345
ON_CALL(*mock_device, prepare(_))
346
.WillByDefault(Invoke(set_all_layers_to_overlay));
347
EXPECT_CALL(*mock_device, set(_))
350
mga::HwcDevice device(mock_device, layer_adapter);
351
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, stub_compositor));
352
EXPECT_FALSE(device.post_overlays(stub_context, renderlist, stub_compositor));
361
mga::HwcDevice device(mock_device);
362
mga::LayerList list(layer_adapter, renderlist);
363
device.commit(primary, list, stub_context, stub_compositor);
355
366
TEST_F(HwcDevice, submits_every_time_if_at_least_one_layer_is_gl_rendered)
357
368
using namespace testing;
358
mga::HwcDevice device(mock_device, layer_adapter);
369
mga::HwcDevice device(mock_device);
360
371
ON_CALL(*mock_device, prepare(_))
361
372
.WillByDefault(Invoke([&](std::array<hwc_display_contents_1_t*, HWC_NUM_DISPLAY_TYPES> const& contents)
369
380
EXPECT_CALL(*mock_device, set(_))
372
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, stub_compositor));
373
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, stub_compositor));
383
mga::LayerList list(layer_adapter, renderlist);
384
device.commit(primary, list, stub_context, stub_compositor);
385
list.update_list(renderlist);
386
device.commit(primary, list, stub_context, stub_compositor);
376
389
TEST_F(HwcDevice, resets_composition_type_with_prepare) //lp:1314399
378
391
using namespace testing;
379
392
mg::RenderableList renderlist({stub_renderable1});
380
393
mg::RenderableList renderlist2({stub_renderable2});
381
mga::HwcDevice device(mock_device, layer_adapter);
394
mga::HwcDevice device(mock_device);
383
396
std::list<hwc_layer_1_t*> expected_list1 { &layer, &target_layer };
384
397
std::list<hwc_layer_1_t*> expected_list2 { &layer2, &target_layer };
390
403
EXPECT_CALL(*mock_device, prepare(MatchesPrimaryList(expected_list2)))
391
404
.InSequence(seq);
393
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, stub_compositor));
394
EXPECT_TRUE(device.post_overlays(stub_context, renderlist2, stub_compositor));
406
mga::LayerList list(layer_adapter, renderlist);
407
device.commit(primary, list, stub_context, stub_compositor);
408
list.update_list(renderlist2);
409
device.commit(primary, list, stub_context, stub_compositor);
397
412
//note: HWC models overlay layer buffers as owned by the display hardware until a subsequent set.
402
417
.WillOnce(Invoke(set_all_layers_to_overlay))
403
418
.WillOnce(Return());
405
mga::HwcDevice device(mock_device, layer_adapter);
420
mga::HwcDevice device(mock_device);
407
422
auto use_count_before = stub_buffer1.use_count();
408
EXPECT_TRUE(device.post_overlays(stub_context, {stub_renderable1}, stub_compositor));
423
mga::LayerList list(layer_adapter, {stub_renderable1});
424
device.commit(primary, list, stub_context, stub_compositor);
409
425
EXPECT_THAT(stub_buffer1.use_count(), Gt(use_count_before));
411
EXPECT_TRUE(device.post_overlays(stub_context, {stub_renderable2}, stub_compositor));
426
list.update_list({stub_renderable1});
427
device.commit(primary, list, stub_context, stub_compositor);
412
428
EXPECT_THAT(stub_buffer1.use_count(), Eq(use_count_before));
486
502
.WillOnce(Invoke(set_fences_fn));
488
mga::HwcDevice device(mock_device, layer_adapter);
489
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, stub_compositor));
504
mga::HwcDevice device(mock_device);
505
mga::LayerList list(layer_adapter, renderlist);
506
device.commit(primary, list, stub_context, stub_compositor);
490
507
//set only the 2nd layer to a new buffer. the first buffer has the same buffer, and would
491
508
//still be onscreen if this wasn't against a mock
492
509
stub_renderable1->set_buffer(updated_buffer);
493
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, stub_compositor));
510
list.update_list(renderlist);
511
device.commit(primary, list, stub_context, stub_compositor);
496
514
TEST_F(HwcDevice, does_not_own_framebuffer_buffers_past_set)
504
522
contents[0]->hwLayers[1].compositionType = HWC_FRAMEBUFFER_TARGET;
507
mga::HwcDevice device(mock_device, layer_adapter);
525
mga::HwcDevice device(mock_device);
509
527
auto use_count_before = stub_buffer1.use_count();
510
EXPECT_TRUE(device.post_overlays(stub_context, {stub_renderable1}, stub_compositor));
529
mga::LayerList list(layer_adapter, {stub_renderable1});
530
device.commit(primary, list, stub_context, stub_compositor);
511
531
EXPECT_THAT(stub_buffer1.use_count(), Eq(use_count_before));
514
534
TEST_F(HwcDevice, rejects_empty_list)
516
mga::HwcDevice device(mock_device, layer_adapter);
536
mga::HwcDevice device(mock_device);
518
537
std::list<std::shared_ptr<mg::Renderable>> renderlist{};
519
EXPECT_FALSE(device.post_overlays(stub_context, renderlist, stub_compositor));
538
EXPECT_FALSE(device.compatible_renderlist(renderlist));
522
541
//TODO: we could accept a 90 degree transform
523
542
TEST_F(HwcDevice, rejects_list_containing_transformed)
525
mga::HwcDevice device(mock_device, layer_adapter);
544
mga::HwcDevice device(mock_device);
527
546
auto renderable = std::make_shared<mtd::StubTransformedRenderable>();
528
547
mg::RenderableList renderlist{renderable};
529
EXPECT_FALSE(device.post_overlays(stub_context, renderlist, stub_compositor));
548
EXPECT_FALSE(device.compatible_renderlist(renderlist));
532
551
//TODO: support plane alpha for hwc 1.2 and later
533
552
TEST_F(HwcDevice, rejects_list_containing_plane_alpha)
535
using namespace testing;
537
mga::HwcDevice device(mock_device, layer_adapter);
554
mga::HwcDevice device(mock_device);
539
555
mg::RenderableList renderlist{std::make_shared<mtd::PlaneAlphaRenderable>()};
540
EXPECT_FALSE(device.post_overlays(stub_context, renderlist, stub_compositor));
556
EXPECT_FALSE(device.compatible_renderlist(renderlist));
543
559
TEST_F(HwcDevice, does_not_own_overlay_buffers_after_screen_off)
546
562
EXPECT_CALL(*mock_device, prepare(_))
547
563
.WillOnce(Invoke(set_all_layers_to_overlay));
549
mga::HwcDevice device(mock_device, layer_adapter);
565
mga::HwcDevice device(mock_device);
551
567
auto use_count_before = stub_buffer1.use_count();
552
EXPECT_TRUE(device.post_overlays(stub_context, {stub_renderable1}, stub_compositor));
568
mga::LayerList list(layer_adapter, {stub_renderable1});
569
device.commit(primary, list, stub_context, stub_compositor);
553
570
EXPECT_THAT(stub_buffer1.use_count(), Gt(use_count_before));
555
572
device.content_cleared();
641
658
.InSequence(seq);
642
659
//end second post
644
mga::HwcDevice device(mock_device, layer_adapter);
645
EXPECT_TRUE(device.post_overlays(stub_context, renderlist1, stub_compositor));
647
EXPECT_TRUE(device.post_overlays(stub_context, renderlist2, stub_compositor));
661
mga::HwcDevice device(mock_device);
662
mga::LayerList list(layer_adapter, renderlist1);
663
device.commit(primary, list, stub_context, stub_compositor);
664
list.update_list(renderlist2);
665
device.commit(primary, list, stub_context, stub_compositor);
650
668
TEST_F(HwcDevice, tracks_hwc_owned_fences_across_list_rearrange)
743
761
.InSequence(seq);
744
762
//end second post
746
mga::HwcDevice device(mock_device, layer_adapter);
747
EXPECT_TRUE(device.post_overlays(stub_context, renderlist, stub_compositor));
748
EXPECT_TRUE(device.post_overlays(stub_context, renderlist2, stub_compositor));
764
mga::HwcDevice device(mock_device);
765
mga::LayerList list(layer_adapter, renderlist);
766
device.commit(primary, list, stub_context, stub_compositor);
767
list.update_list(renderlist2);
768
device.commit(primary, list, stub_context, stub_compositor);