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));