commit 9158770
Michael Forney
·
2019-08-29 06:36:35 +0000 UTC
parent 74b4842
drm: Move framebuffer exporting code to a shared helper This will be needed for cursor support with universal planes.
3 files changed,
+73,
-64
+67,
-0
1@@ -387,3 +387,70 @@ drm_create_screens(struct wl_list *screens)
2
3 return true;
4 }
5+
6+enum {
7+ WLD_USER_OBJECT_FRAMEBUFFER = WLD_USER_ID
8+};
9+
10+struct framebuffer {
11+ struct wld_exporter exporter;
12+ struct wld_destructor destructor;
13+ uint32_t id;
14+};
15+
16+static bool
17+framebuffer_export(struct wld_exporter *exporter, struct wld_buffer *buffer, uint32_t type, union wld_object *object)
18+{
19+ struct framebuffer *framebuffer = wl_container_of(exporter, framebuffer, exporter);
20+
21+ switch (type) {
22+ case WLD_USER_OBJECT_FRAMEBUFFER:
23+ object->u32 = framebuffer->id;
24+ break;
25+ default:
26+ return false;
27+ }
28+
29+ return true;
30+}
31+
32+static void
33+framebuffer_destroy(struct wld_destructor *destructor)
34+{
35+ struct framebuffer *framebuffer = wl_container_of(destructor, framebuffer, destructor);
36+
37+ drmModeRmFB(swc.drm->fd, framebuffer->id);
38+ free(framebuffer);
39+}
40+
41+uint32_t
42+drm_get_framebuffer(struct wld_buffer *buffer)
43+{
44+ struct framebuffer *framebuffer;
45+ union wld_object object;
46+ int ret;
47+
48+ if (wld_export(buffer, WLD_USER_OBJECT_FRAMEBUFFER, &object))
49+ return object.u32;
50+
51+ if (!wld_export(buffer, WLD_DRM_OBJECT_HANDLE, &object)) {
52+ ERROR("Could not get buffer handle\n");
53+ return 0;
54+ }
55+
56+ if (!(framebuffer = malloc(sizeof(*framebuffer))))
57+ return 0;
58+
59+ ret = drmModeAddFB(swc.drm->fd, buffer->width, buffer->height, 24, 32, buffer->pitch, object.u32, &framebuffer->id);
60+ if (ret < 0) {
61+ free(framebuffer);
62+ return 0;
63+ }
64+
65+ framebuffer->exporter.export = &framebuffer_export;
66+ wld_buffer_add_exporter(buffer, &framebuffer->exporter);
67+ framebuffer->destructor.destroy = &framebuffer_destroy;
68+ wld_buffer_add_destructor(buffer, &framebuffer->destructor);
69+
70+ return framebuffer->id;
71+}
+2,
-0
1@@ -5,6 +5,7 @@
2 #include <stdint.h>
3
4 struct wl_list;
5+struct wld_buffer;
6
7 struct drm_handler {
8 void (*page_flip)(struct drm_handler *handler, uint32_t time);
9@@ -21,5 +22,6 @@ bool drm_initialize(void);
10 void drm_finalize(void);
11
12 bool drm_create_screens(struct wl_list *screens);
13+uint32_t drm_get_framebuffer(struct wld_buffer *buffer);
14
15 #endif
+4,
-64
1@@ -34,41 +34,6 @@
2 #include <xf86drm.h>
3 #include <xf86drmMode.h>
4
5-enum {
6- WLD_USER_OBJECT_FRAMEBUFFER = WLD_USER_ID
7-};
8-
9-struct framebuffer {
10- struct wld_exporter exporter;
11- struct wld_destructor destructor;
12- uint32_t id;
13-};
14-
15-static bool
16-framebuffer_export(struct wld_exporter *exporter, struct wld_buffer *buffer, uint32_t type, union wld_object *object)
17-{
18- struct framebuffer *framebuffer = wl_container_of(exporter, framebuffer, exporter);
19-
20- switch (type) {
21- case WLD_USER_OBJECT_FRAMEBUFFER:
22- object->u32 = framebuffer->id;
23- break;
24- default:
25- return false;
26- }
27-
28- return true;
29-}
30-
31-static void
32-framebuffer_destroy(struct wld_destructor *destructor)
33-{
34- struct framebuffer *framebuffer = wl_container_of(destructor, framebuffer, destructor);
35-
36- drmModeRmFB(swc.drm->fd, framebuffer->id);
37- free(framebuffer);
38-}
39-
40 static bool
41 update(struct view *view)
42 {
43@@ -87,37 +52,12 @@ static int
44 attach(struct view *view, struct wld_buffer *buffer)
45 {
46 struct primary_plane *plane = wl_container_of(view, plane, view);
47- union wld_object object;
48+ uint32_t fb;
49 int ret;
50
51- if (!wld_export(buffer, WLD_USER_OBJECT_FRAMEBUFFER, &object)) {
52- struct framebuffer *framebuffer;
53-
54- if (!wld_export(buffer, WLD_DRM_OBJECT_HANDLE, &object)) {
55- ERROR("Could not get buffer handle\n");
56- return -EINVAL;
57- }
58-
59- if (!(framebuffer = malloc(sizeof(*framebuffer))))
60- return -ENOMEM;
61-
62- ret = drmModeAddFB(swc.drm->fd, buffer->width, buffer->height, 24, 32, buffer->pitch, object.u32, &framebuffer->id);
63-
64- if (ret < 0) {
65- free(framebuffer);
66- return ret;
67- }
68-
69- framebuffer->exporter.export = &framebuffer_export;
70- wld_buffer_add_exporter(buffer, &framebuffer->exporter);
71- framebuffer->destructor.destroy = &framebuffer_destroy;
72- wld_buffer_add_destructor(buffer, &framebuffer->destructor);
73-
74- object.u32 = framebuffer->id;
75- }
76-
77+ fb = drm_get_framebuffer(buffer);
78 if (plane->need_modeset) {
79- ret = drmModeSetCrtc(swc.drm->fd, plane->crtc, object.u32, 0, 0, plane->connectors.data, plane->connectors.size / 4, &plane->mode.info);
80+ ret = drmModeSetCrtc(swc.drm->fd, plane->crtc, fb, 0, 0, plane->connectors.data, plane->connectors.size / 4, &plane->mode.info);
81
82 if (ret == 0) {
83 wl_event_loop_add_idle(swc.event_loop, &send_frame, plane);
84@@ -127,7 +67,7 @@ attach(struct view *view, struct wld_buffer *buffer)
85 return ret;
86 }
87 } else {
88- ret = drmModePageFlip(swc.drm->fd, plane->crtc, object.u32, DRM_MODE_PAGE_FLIP_EVENT, &plane->drm_handler);
89+ ret = drmModePageFlip(swc.drm->fd, plane->crtc, fb, DRM_MODE_PAGE_FLIP_EVENT, &plane->drm_handler);
90
91 if (ret < 0) {
92 ERROR("Page flip failed: %s\n", strerror(errno));