Skip to content

Commit d4ba01f

Browse files
committed
start work on compositor display infra
1 parent efacb05 commit d4ba01f

File tree

2 files changed

+156
-4
lines changed

2 files changed

+156
-4
lines changed

src/compositor_ng.c

Lines changed: 119 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

154158
static 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

269371
fail_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+
273384
void 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+
}

src/compositor_ng.h

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,26 @@ struct drm_resources;
9090

9191
typedef void (*compositor_frame_begin_cb_t)(void *userdata, uint64_t vblank_ns, uint64_t next_vblank_ns);
9292

93-
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);
93+
struct fl_display_interface {
94+
FlutterEngineNotifyDisplayUpdateFnPtr notify_display_update;
95+
FlutterEngine engine;
96+
};
97+
98+
struct compositor *compositor_new_multiview(
99+
struct tracer *tracer,
100+
struct evloop *raster_loop,
101+
struct udev *udev,
102+
struct drmdev *drmdev,
103+
struct drm_resources *resources,
104+
const struct fl_display_interface *display_interface
105+
);
106+
107+
struct compositor *compositor_new_singleview(
108+
struct tracer *tracer,
109+
struct evloop *raster_loop,
110+
struct window *window,
111+
const struct fl_display_interface *display_interface
112+
);
94113

95114
void compositor_destroy(struct compositor *compositor);
96115

@@ -279,6 +298,23 @@ void compositor_for_each_display(
279298
void *userdata
280299
);
281300

301+
302+
struct display_setup {
303+
size_t n_connectors;
304+
struct connector *connectors;
305+
306+
size_t n_displays;
307+
struct display *displays;
308+
};
309+
310+
/**
311+
* @brief Gets a value notifier for the displays & connectors attached to the compositor.
312+
*
313+
* The value is a @ref struct display_setup.
314+
*/
315+
struct notifier *compositor_get_display_setup_notifier(struct compositor *compositor);
316+
317+
282318
struct fl_layer_composition;
283319

284320
struct fl_layer_composition *fl_layer_composition_new(size_t n_layers);

0 commit comments

Comments
 (0)