summaryrefslogtreecommitdiffstats
path: root/meta-agl-bsp/meta-ti/recipes-arago/weston/weston/0001-compositor-drm-support-RGB565-with-pixman-renderer.patch
blob: 0d77f529e82d8136fcfedba84cff7fa234c4030e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
From 91b452fa515b94928d32af6e1b1b0405469747fd Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <tomi.valkeinen@ti.com>
Date: Wed, 8 Mar 2017 13:05:38 -0500
Subject: [PATCH] compositor-drm: support RGB565 with pixman renderer

At the moment only XRGB8888 is supported when using pixman renderer.
This patch adds support also for RGB565.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
Signed-off-by: Daniel Stone <daniels@collabora.com>
---
 src/compositor-drm.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 55 insertions(+), 7 deletions(-)

diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index fd89627..443b69a 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -262,10 +262,12 @@ drm_fb_destroy_callback(struct gbm_bo *bo, void *data)
 }
 
 static struct drm_fb *
-drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height)
+drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height,
+		   uint32_t format)
 {
 	struct drm_fb *fb;
 	int ret;
+	uint32_t bpp, depth;
 
 	struct drm_mode_create_dumb create_arg;
 	struct drm_mode_destroy_dumb destroy_arg;
@@ -275,8 +277,20 @@ drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height)
 	if (!fb)
 		return NULL;
 
+	switch (format) {
+		case GBM_FORMAT_XRGB8888:
+			bpp = 32;
+			depth = 24;
+			break;
+		case GBM_FORMAT_RGB565:
+			bpp = depth = 16;
+			break;
+		default:
+			return NULL;
+	}
+
 	memset(&create_arg, 0, sizeof create_arg);
-	create_arg.bpp = 32;
+	create_arg.bpp = bpp;
 	create_arg.width = width;
 	create_arg.height = height;
 
@@ -289,8 +303,29 @@ drm_fb_create_dumb(struct drm_backend *b, unsigned width, unsigned height)
 	fb->size = create_arg.size;
 	fb->fd = b->drm.fd;
 
-	ret = drmModeAddFB(b->drm.fd, width, height, 24, 32,
-			   fb->stride, fb->handle, &fb->fb_id);
+	ret = -1;
+
+	if (!b->no_addfb2) {
+		uint32_t handles[4], pitches[4], offsets[4];
+
+		handles[0] = fb->handle;
+		pitches[0] = fb->stride;
+		offsets[0] = 0;
+
+		ret = drmModeAddFB2(b->drm.fd, width, height,
+				    format, handles, pitches, offsets,
+				    &fb->fb_id, 0);
+		if (ret) {
+			weston_log("addfb2 failed: %m\n");
+			b->no_addfb2 = 1;
+		}
+	}
+
+	if (ret) {
+		ret = drmModeAddFB(b->drm.fd, width, height, depth, bpp,
+				   fb->stride, fb->handle, &fb->fb_id);
+	}
+
 	if (ret)
 		goto err_bo;
 
@@ -1879,17 +1914,30 @@ drm_output_init_pixman(struct drm_output *output, struct drm_backend *b)
 {
 	int w = output->base.current_mode->width;
 	int h = output->base.current_mode->height;
+	uint32_t format = output->gbm_format;
+	uint32_t pixman_format;
 	unsigned int i;
 
-	/* FIXME error checking */
+	switch (format) {
+		case GBM_FORMAT_XRGB8888:
+			pixman_format = PIXMAN_x8r8g8b8;
+			break;
+		case GBM_FORMAT_RGB565:
+			pixman_format = PIXMAN_r5g6b5;
+			break;
+		default:
+			weston_log("Unsupported pixman format 0x%x\n", format);
+			return -1;
+	}
 
+	/* FIXME error checking */
 	for (i = 0; i < ARRAY_LENGTH(output->dumb); i++) {
-		output->dumb[i] = drm_fb_create_dumb(b, w, h);
+		output->dumb[i] = drm_fb_create_dumb(b, w, h, format);
 		if (!output->dumb[i])
 			goto err;
 
 		output->image[i] =
-			pixman_image_create_bits(PIXMAN_x8r8g8b8, w, h,
+			pixman_image_create_bits(pixman_format, w, h,
 						 output->dumb[i]->map,
 						 output->dumb[i]->stride);
 		if (!output->image[i])
-- 
1.9.1