5
5
#include " src/graphics/display/drivers/fake/fake-display.h"
6
6
7
7
#include < fidl/fuchsia.sysmem2/cpp/wire.h>
8
- #include < fuchsia/hardware/display/controller/c /banjo.h>
8
+ #include < fuchsia/hardware/display/controller/cpp /banjo.h>
9
9
#include < lib/fpromise/result.h>
10
10
#include < lib/fzl/vmo-mapper.h>
11
11
#include < lib/image-format/image_format.h>
@@ -49,6 +49,40 @@ namespace fake_display {
49
49
50
50
namespace {
51
51
52
+ class TestDisplayEngineListener
53
+ : public ddk::DisplayEngineListenerProtocol<TestDisplayEngineListener> {
54
+ public:
55
+ // fuchsia.hardware.display.controller/DisplayEngineListener:
56
+ void DisplayEngineListenerOnDisplayAdded (const raw_display_info_t * banjo_display_info) {
57
+ display_added_.Signal ();
58
+ }
59
+ void DisplayEngineListenerOnDisplayRemoved (uint64_t display_id) {
60
+ GTEST_FAIL () << " Unexpected call to OnDisplayRemoved" ;
61
+ }
62
+ void DisplayEngineListenerOnDisplayVsync (uint64_t banjo_display_id, zx_time_t timestamp,
63
+ const config_stamp_t * config_stamp) {
64
+ // VSync signals are ignored for now.
65
+ }
66
+ void DisplayEngineListenerOnCaptureComplete () { capture_completed_.Signal (); }
67
+
68
+ display_engine_listener_protocol_t GetProtocol () {
69
+ return {
70
+ .ops = &display_engine_listener_protocol_ops_,
71
+ .ctx = this ,
72
+ };
73
+ }
74
+
75
+ // Signaled when the driver signals that a display was added.
76
+ libsync::Completion& display_added () { return display_added_; }
77
+
78
+ // Signaled when the driver signals that a capture was completed.
79
+ libsync::Completion& capture_completed () { return capture_completed_; }
80
+
81
+ private:
82
+ libsync::Completion display_added_;
83
+ libsync::Completion capture_completed_;
84
+ };
85
+
52
86
class FakeDisplayTest : public testing ::Test {
53
87
public:
54
88
FakeDisplayTest () = default ;
@@ -57,6 +91,7 @@ class FakeDisplayTest : public testing::Test {
57
91
zx::result<std::unique_ptr<FakeSysmemDeviceHierarchy>> create_sysmem_provider_result =
58
92
FakeSysmemDeviceHierarchy::Create ();
59
93
ASSERT_OK (create_sysmem_provider_result);
94
+
60
95
fake_display_stack_ = std::make_unique<FakeDisplayStack>(
61
96
std::move (create_sysmem_provider_result).value (), GetFakeDisplayDeviceConfig ());
62
97
}
@@ -71,6 +106,9 @@ class FakeDisplayTest : public testing::Test {
71
106
}
72
107
73
108
protected:
109
+ TestDisplayEngineListener engine_listener_;
110
+ display_engine_listener_protocol_t engine_listener_banjo_protocol_ =
111
+ engine_listener_.GetProtocol();
74
112
std::unique_ptr<FakeDisplayStack> fake_display_stack_;
75
113
};
76
114
@@ -214,35 +252,6 @@ class FakeDisplayRealSysmemTest : public FakeDisplayTest {
214
252
fidl::WireSyncClient<fuchsia_sysmem2::Allocator> sysmem_;
215
253
};
216
254
217
- // A completion semaphore indicating the display capture is completed.
218
- class DisplayCaptureCompletion {
219
- public:
220
- // Tests can import the display controller interface protocol to set up the
221
- // callback to trigger the semaphore.
222
- display_engine_listener_protocol_t GetDisplayEngineListenerProtocol () {
223
- static constexpr display_engine_listener_protocol_ops_t kDisplayEngineListenerProtocolOps = {
224
- .on_display_added = [](void * ctx, const raw_display_info_t * display_info) {},
225
- .on_display_removed = [](void * ctx, uint64_t display_id) {},
226
- .on_display_vsync = [](void * ctx, uint64_t display_id, zx_time_t timestamp,
227
- const config_stamp_t * config_stamp) {},
228
- .on_capture_complete =
229
- [](void * ctx) {
230
- reinterpret_cast <DisplayCaptureCompletion*>(ctx)->OnCaptureComplete ();
231
- },
232
- };
233
- return display_engine_listener_protocol_t {
234
- .ops = &kDisplayEngineListenerProtocolOps ,
235
- .ctx = this ,
236
- };
237
- }
238
-
239
- libsync::Completion& completed () { return completed_; }
240
-
241
- private:
242
- void OnCaptureComplete () { completed ().Signal (); }
243
- libsync::Completion completed_;
244
- };
245
-
246
255
// Creates a BufferCollectionConstraints that tests can use to configure their
247
256
// own BufferCollections to allocate buffers.
248
257
//
@@ -579,13 +588,9 @@ TEST_F(FakeDisplayRealSysmemTest, CaptureImage) {
579
588
auto [framebuffer_collection_client, framebuffer_token] =
580
589
std::move (new_framebuffer_buffer_collection_result.value ());
581
590
582
- DisplayCaptureCompletion display_capture_completion = {};
583
- const display_engine_listener_protocol_t & controller_protocol =
584
- display_capture_completion.GetDisplayEngineListenerProtocol ();
585
-
586
591
engine_info_t banjo_engine_info;
587
592
fake_display_stack_->display_engine ().DisplayEngineCompleteCoordinatorConnection (
588
- &controller_protocol , &banjo_engine_info);
593
+ &engine_listener_banjo_protocol_ , &banjo_engine_info);
589
594
ASSERT_TRUE (banjo_engine_info.is_capture_supported );
590
595
591
596
constexpr display::DriverBufferCollectionId kCaptureBufferCollectionId (1 );
@@ -723,10 +728,10 @@ TEST_F(FakeDisplayRealSysmemTest, CaptureImage) {
723
728
&banjo_config_stamp);
724
729
725
730
// Start capture; wait until the capture ends.
726
- EXPECT_FALSE (display_capture_completion. completed ().signaled ());
731
+ ASSERT_FALSE (engine_listener_. capture_completed ().signaled ());
727
732
EXPECT_OK (fake_display_stack_->display_engine ().DisplayEngineStartCapture (capture_handle));
728
- display_capture_completion. completed ().Wait ();
729
- EXPECT_TRUE (display_capture_completion. completed ().signaled ());
733
+ engine_listener_. capture_completed ().Wait ();
734
+ EXPECT_TRUE (engine_listener_. capture_completed ().signaled ());
730
735
731
736
// Verify the captured image has the same content as the original image.
732
737
constexpr int kCaptureBytesPerPixel = 4 ;
@@ -805,13 +810,9 @@ TEST_F(FakeDisplayRealSysmemTest, CaptureSolidColorFill) {
805
810
auto [framebuffer_collection_client, framebuffer_token] =
806
811
std::move (new_framebuffer_buffer_collection_result.value ());
807
812
808
- DisplayCaptureCompletion display_capture_completion = {};
809
- const display_engine_listener_protocol_t & controller_protocol =
810
- display_capture_completion.GetDisplayEngineListenerProtocol ();
811
-
812
813
engine_info_t banjo_engine_info;
813
814
fake_display_stack_->display_engine ().DisplayEngineCompleteCoordinatorConnection (
814
- &controller_protocol , &banjo_engine_info);
815
+ &engine_listener_banjo_protocol_ , &banjo_engine_info);
815
816
ASSERT_TRUE (banjo_engine_info.is_capture_supported );
816
817
817
818
constexpr display::DriverBufferCollectionId kCaptureBufferCollectionId (1 );
@@ -918,10 +919,10 @@ TEST_F(FakeDisplayRealSysmemTest, CaptureSolidColorFill) {
918
919
&banjo_config_stamp);
919
920
920
921
// Start capture; wait until the capture ends.
921
- EXPECT_FALSE (display_capture_completion. completed ().signaled ());
922
+ ASSERT_FALSE (engine_listener_. capture_completed ().signaled ());
922
923
EXPECT_OK (fake_display_stack_->display_engine ().DisplayEngineStartCapture (capture_handle));
923
- display_capture_completion. completed ().Wait ();
924
- EXPECT_TRUE (display_capture_completion. completed ().signaled ());
924
+ engine_listener_. capture_completed ().Wait ();
925
+ EXPECT_TRUE (engine_listener_. capture_completed ().signaled ());
925
926
926
927
// Verify the captured image has the same content as the original image.
927
928
constexpr int kCaptureBytesPerPixel = 4 ;
0 commit comments