@@ -149,6 +149,10 @@ struct compositor {
149149
150150 struct evloop * raster_loop ;
151151 struct evsrc * drm_monitor_evsrc ;
152+
153+ struct fl_display_interface display_interface ;
154+ struct display_setup * display_setup ;
155+ struct notifier display_setup_notifier ;
152156};
153157
154158static bool on_flutter_present_layers (const FlutterLayer * * layers , size_t layers_count , void * userdata );
@@ -193,7 +197,105 @@ static const struct drm_uevent_listener uevent_listener = {
193197 .on_uevent = on_drm_uevent ,
194198};
195199
196- MUST_CHECK struct compositor * compositor_new (struct tracer * tracer , struct evloop * raster_loop , struct window * main_window , struct udev * udev , struct drmdev * drmdev , struct drm_resources * resources ) {
200+ static void connector_init (const struct drm_connector * connector , struct connector * out ) {
201+ static const enum connector_type connector_types [] = {
202+ [DRM_MODE_CONNECTOR_Unknown ] = CONNECTOR_TYPE_OTHER ,
203+ [DRM_MODE_CONNECTOR_VGA ] = CONNECTOR_TYPE_VGA ,
204+ [DRM_MODE_CONNECTOR_DVII ] = CONNECTOR_TYPE_DVI ,
205+ [DRM_MODE_CONNECTOR_DVID ] = CONNECTOR_TYPE_DVI ,
206+ [DRM_MODE_CONNECTOR_DVIA ] = CONNECTOR_TYPE_DVI ,
207+ [DRM_MODE_CONNECTOR_Composite ] = CONNECTOR_TYPE_OTHER ,
208+ [DRM_MODE_CONNECTOR_SVIDEO ] = CONNECTOR_TYPE_OTHER ,
209+ [DRM_MODE_CONNECTOR_LVDS ] = CONNECTOR_TYPE_LVDS ,
210+ [DRM_MODE_CONNECTOR_Component ] = CONNECTOR_TYPE_OTHER ,
211+ [DRM_MODE_CONNECTOR_9PinDIN ] = CONNECTOR_TYPE_OTHER ,
212+ [DRM_MODE_CONNECTOR_DisplayPort ] = CONNECTOR_TYPE_DISPLAY_PORT ,
213+ [DRM_MODE_CONNECTOR_HDMIA ] = CONNECTOR_TYPE_HDMI ,
214+ [DRM_MODE_CONNECTOR_HDMIB ] = CONNECTOR_TYPE_HDMI ,
215+ [DRM_MODE_CONNECTOR_TV ] = CONNECTOR_TYPE_TV ,
216+ [DRM_MODE_CONNECTOR_eDP ] = CONNECTOR_TYPE_EDP ,
217+ [DRM_MODE_CONNECTOR_VIRTUAL ] = CONNECTOR_TYPE_OTHER ,
218+ [DRM_MODE_CONNECTOR_DSI ] = CONNECTOR_TYPE_DSI ,
219+ [DRM_MODE_CONNECTOR_DPI ] = CONNECTOR_TYPE_DPI ,
220+ [DRM_MODE_CONNECTOR_WRITEBACK ] = CONNECTOR_TYPE_OTHER ,
221+ [DRM_MODE_CONNECTOR_SPI ] = CONNECTOR_TYPE_OTHER ,
222+ [DRM_MODE_CONNECTOR_USB ] = CONNECTOR_TYPE_OTHER ,
223+ };
224+
225+ enum connector_type type = connector_types [connector -> type ];
226+ const char * type_name = drmModeGetConnectorTypeName (connector -> type ) ?: "Unknown" ;
227+
228+ out -> id = asprintf ("%s-%" PRIu32 , type_name , connector -> id );
229+ out -> type = type ;
230+ if (type == CONNECTOR_TYPE_OTHER ) {
231+ out -> other_type_name = type_name ;
232+ } else {
233+ out -> other_type_name = NULL ;
234+ }
235+ }
236+
237+ static void connector_fini (struct connector * connector ) {
238+ free (connector -> id );
239+ }
240+
241+ static void display_init (struct display * display , struct drm_crtc * crtc , struct drm_encoder * encoder , struct drm_connector * connector ) {
242+
243+ }
244+
245+ static void display_fini (struct display * display ) {
246+
247+ }
248+
249+ struct display_setup * display_setup_new (struct drm_resources * resources ) {
250+ struct display_setup * setup = malloc (sizeof * setup );
251+ if (setup == NULL ) {
252+ return NULL ;
253+ }
254+
255+ setup -> n_connectors = resources -> n_connectors ;
256+ setup -> connectors = malloc (setup -> n_connectors * sizeof * setup -> connectors );
257+ if (setup -> connectors == NULL ) {
258+ goto fail_free_setup ;
259+ }
260+
261+ for (int i = 0 ; i < setup -> n_connectors ; i ++ ) {
262+ connector_init (resources -> connectors + i , setup -> connectors + i );
263+ }
264+
265+ setup -> n_displays = 0 ;
266+ drm_resources_for_each_connector (resources , connector ) {
267+ if (connector -> variable_state .connection_state == DRM_CONNSTATE_CONNECTED ) {
268+ setup -> n_displays ++ ;
269+ }
270+ }
271+
272+ setup -> displays = malloc (setup -> n_displays * sizeof * setup -> displays );
273+ if (setup -> displays == NULL ) {
274+ goto fail_fini_connectors ;
275+ }
276+
277+ return setup ;
278+
279+ fail_fini_connectors :
280+ for (int i = 0 ; i < setup -> n_connectors ; i ++ ) {
281+ connector_fini (setup -> connectors + i );
282+ }
283+ free (setup -> connectors );
284+
285+ fail_free_setup :
286+ free (setup -> connectors );
287+ return NULL ;
288+ }
289+
290+ MUST_CHECK struct compositor * compositor_new_multiview (
291+ struct tracer * tracer ,
292+ struct evloop * raster_loop ,
293+ struct window * main_window ,
294+ struct udev * udev ,
295+ struct drmdev * drmdev ,
296+ struct drm_resources * resources ,
297+ const struct fl_display_interface * display_interface
298+ ) {
197299 struct compositor * c ;
198300 int bucket_status ;
199301
@@ -239,7 +341,6 @@ MUST_CHECK struct compositor *compositor_new(struct tracer *tracer, struct evloo
239341 c -> next_view_id = 1 ;
240342 c -> next_platform_view_id = 1 ;
241343
242-
243344 c -> raster_loop = evloop_ref (raster_loop );
244345 c -> drmdev = drmdev_ref (drmdev );
245346
@@ -262,14 +363,24 @@ MUST_CHECK struct compositor *compositor_new(struct tracer *tracer, struct evloo
262363 }
263364
264365 c -> resources = resources != NULL ? drm_resources_ref (resources ) : drmdev_query_resources (drmdev );
265-
266366 c -> drm_monitor_evsrc = evloop_add_io (raster_loop , drm_monitor_get_fd (c -> monitor ), EPOLLIN , on_drm_monitor_ready , c );
367+
368+ value_notifier_init (& c -> display_setup_notifier , );
267369 return c ;
268370
269371fail_return_null :
270372 return NULL ;
271373}
272374
375+ struct compositor * compositor_new_singleview (
376+ struct tracer * tracer ,
377+ struct evloop * raster_loop ,
378+ struct window * window ,
379+ const struct fl_display_interface * display_interface
380+ ) {
381+ return compositor_new_multiview (tracer , raster_loop , window , NULL , NULL , NULL , display_interface );
382+ }
383+
273384void compositor_destroy (struct compositor * compositor ) {
274385 struct window * window ;
275386 kh_foreach_value (compositor -> views , window ,
@@ -965,3 +1076,8 @@ void compositor_for_each_connector(
9651076 }
9661077 }
9671078}
1079+
1080+ struct notifier * compositor_get_display_setup_notifier (struct compositor * compositor ) {
1081+ ASSERT_NOT_NULL (compositor );
1082+ return & compositor -> display_setup_notifier ;
1083+ }
0 commit comments