1*4882a593SmuzhiyunFrom 95857f9226c6bc661419cc12632544ad6297141d Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Thu, 7 Jul 2022 11:09:23 +0800
4*4882a593SmuzhiyunSubject: [PATCH 73/92] gl-renderer: Support more SHM RGB formats
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
7*4882a593Smuzhiyun---
8*4882a593Smuzhiyun libweston/pixel-formats.c                    | 10 ++++++
9*4882a593Smuzhiyun libweston/renderer-gl/fragment.glsl          | 21 +++++++++--
10*4882a593Smuzhiyun libweston/renderer-gl/gl-renderer-internal.h | 11 +++++-
11*4882a593Smuzhiyun libweston/renderer-gl/gl-renderer.c          | 38 ++++++++++++++++++++
12*4882a593Smuzhiyun libweston/renderer-gl/gl-shaders.c           | 17 +++++++++
13*4882a593Smuzhiyun 5 files changed, 93 insertions(+), 4 deletions(-)
14*4882a593Smuzhiyun
15*4882a593Smuzhiyundiff --git a/libweston/pixel-formats.c b/libweston/pixel-formats.c
16*4882a593Smuzhiyunindex 0aa9457..14af000 100644
17*4882a593Smuzhiyun--- a/libweston/pixel-formats.c
18*4882a593Smuzhiyun+++ b/libweston/pixel-formats.c
19*4882a593Smuzhiyun@@ -223,6 +223,8 @@ static const struct pixel_format_info pixel_format_table[] = {
20*4882a593Smuzhiyun 		DRM_FORMAT(RGB888),
21*4882a593Smuzhiyun 		BITS_RGBA_FIXED(8, 8, 8, 0),
22*4882a593Smuzhiyun 		.bpp = 24,
23*4882a593Smuzhiyun+		GL_FORMAT(GL_RGB),
24*4882a593Smuzhiyun+		GL_TYPE(GL_UNSIGNED_BYTE),
25*4882a593Smuzhiyun 	},
26*4882a593Smuzhiyun 	{
27*4882a593Smuzhiyun 		DRM_FORMAT(BGR888),
28*4882a593Smuzhiyun@@ -288,6 +290,8 @@ static const struct pixel_format_info pixel_format_table[] = {
29*4882a593Smuzhiyun 		DRM_FORMAT(RGBX8888),
30*4882a593Smuzhiyun 		BITS_RGBA_FIXED(8, 8, 8, 0),
31*4882a593Smuzhiyun 		.bpp = 32,
32*4882a593Smuzhiyun+		GL_FORMAT(GL_RGBA),
33*4882a593Smuzhiyun+		GL_TYPE(GL_UNSIGNED_BYTE),
34*4882a593Smuzhiyun #if __BYTE_ORDER == __LITTLE_ENDIAN
35*4882a593Smuzhiyun 		PIXMAN_FMT(r8g8b8x8),
36*4882a593Smuzhiyun #else
37*4882a593Smuzhiyun@@ -299,6 +303,8 @@ static const struct pixel_format_info pixel_format_table[] = {
38*4882a593Smuzhiyun 		BITS_RGBA_FIXED(8, 8, 8, 8),
39*4882a593Smuzhiyun 		.bpp = 32,
40*4882a593Smuzhiyun 		.opaque_substitute = DRM_FORMAT_RGBX8888,
41*4882a593Smuzhiyun+		GL_FORMAT(GL_RGBA),
42*4882a593Smuzhiyun+		GL_TYPE(GL_UNSIGNED_BYTE),
43*4882a593Smuzhiyun #if __BYTE_ORDER == __LITTLE_ENDIAN
44*4882a593Smuzhiyun 		PIXMAN_FMT(r8g8b8a8),
45*4882a593Smuzhiyun #else
46*4882a593Smuzhiyun@@ -309,6 +315,8 @@ static const struct pixel_format_info pixel_format_table[] = {
47*4882a593Smuzhiyun 		DRM_FORMAT(BGRX8888),
48*4882a593Smuzhiyun 		BITS_RGBA_FIXED(8, 8, 8, 0),
49*4882a593Smuzhiyun 		.bpp = 32,
50*4882a593Smuzhiyun+		GL_FORMAT(GL_RGBA),
51*4882a593Smuzhiyun+		GL_TYPE(GL_UNSIGNED_BYTE),
52*4882a593Smuzhiyun #if __BYTE_ORDER == __LITTLE_ENDIAN
53*4882a593Smuzhiyun 		PIXMAN_FMT(b8g8r8x8),
54*4882a593Smuzhiyun #else
55*4882a593Smuzhiyun@@ -320,6 +328,8 @@ static const struct pixel_format_info pixel_format_table[] = {
56*4882a593Smuzhiyun 		BITS_RGBA_FIXED(8, 8, 8, 8),
57*4882a593Smuzhiyun 		.bpp = 32,
58*4882a593Smuzhiyun 		.opaque_substitute = DRM_FORMAT_BGRX8888,
59*4882a593Smuzhiyun+		GL_FORMAT(GL_RGBA),
60*4882a593Smuzhiyun+		GL_TYPE(GL_UNSIGNED_BYTE),
61*4882a593Smuzhiyun #if __BYTE_ORDER == __LITTLE_ENDIAN
62*4882a593Smuzhiyun 		PIXMAN_FMT(b8g8r8a8),
63*4882a593Smuzhiyun #else
64*4882a593Smuzhiyundiff --git a/libweston/renderer-gl/fragment.glsl b/libweston/renderer-gl/fragment.glsl
65*4882a593Smuzhiyunindex 7de8d98..a950578 100644
66*4882a593Smuzhiyun--- a/libweston/renderer-gl/fragment.glsl
67*4882a593Smuzhiyun+++ b/libweston/renderer-gl/fragment.glsl
68*4882a593Smuzhiyun@@ -51,6 +51,12 @@
69*4882a593Smuzhiyun #define SHADER_COLOR_MAPPING_IDENTITY 0
70*4882a593Smuzhiyun #define SHADER_COLOR_MAPPING_3DLUT 1
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun+/* enum gl_shader_color_swap */
73*4882a593Smuzhiyun+#define SHADER_COLOR_SWAP_NONE  0
74*4882a593Smuzhiyun+#define SHADER_COLOR_SWAP_RGB   1
75*4882a593Smuzhiyun+#define SHADER_COLOR_SWAP_ALPHA 2
76*4882a593Smuzhiyun+#define SHADER_COLOR_SWAP_ALL   3
77*4882a593Smuzhiyun+
78*4882a593Smuzhiyun #if DEF_VARIANT == SHADER_VARIANT_EXTERNAL
79*4882a593Smuzhiyun #extension GL_OES_EGL_image_external : require
80*4882a593Smuzhiyun #endif
81*4882a593Smuzhiyun@@ -71,6 +77,7 @@ precision HIGHPRECISION float;
82*4882a593Smuzhiyun  * These undeclared identifiers will be #defined by a runtime generated code
83*4882a593Smuzhiyun  * snippet.
84*4882a593Smuzhiyun  */
85*4882a593Smuzhiyun+compile_const int c_color_swap = DEF_COLOR_SWAP;
86*4882a593Smuzhiyun compile_const int c_variant = DEF_VARIANT;
87*4882a593Smuzhiyun compile_const bool c_input_is_premult = DEF_INPUT_IS_PREMULT;
88*4882a593Smuzhiyun compile_const bool c_green_tint = DEF_GREEN_TINT;
89*4882a593Smuzhiyun@@ -140,13 +147,11 @@ sample_input_texture()
90*4882a593Smuzhiyun 		return unicolor;
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun 	if (c_variant == SHADER_VARIANT_RGBA ||
93*4882a593Smuzhiyun+	    c_variant == SHADER_VARIANT_RGBX ||
94*4882a593Smuzhiyun 	    c_variant == SHADER_VARIANT_EXTERNAL) {
95*4882a593Smuzhiyun 		return texture2D(tex, v_texcoord);
96*4882a593Smuzhiyun 	}
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun-	if (c_variant == SHADER_VARIANT_RGBX)
99*4882a593Smuzhiyun-		return vec4(texture2D(tex, v_texcoord).rgb, 1.0);
100*4882a593Smuzhiyun-
101*4882a593Smuzhiyun 	/* Requires conversion to RGBA */
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun 	if (c_variant == SHADER_VARIANT_Y_U_V) {
104*4882a593Smuzhiyun@@ -271,6 +276,16 @@ main()
105*4882a593Smuzhiyun 	/* Electrical (non-linear) RGBA values, may be premult or not */
106*4882a593Smuzhiyun 	color = sample_input_texture();
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun+	if (c_color_swap == SHADER_COLOR_SWAP_RGB)
109*4882a593Smuzhiyun+		color.bgr = color.rgb;
110*4882a593Smuzhiyun+	else if (c_color_swap == SHADER_COLOR_SWAP_ALPHA)
111*4882a593Smuzhiyun+		color.argb = color;
112*4882a593Smuzhiyun+	else if (c_color_swap == SHADER_COLOR_SWAP_ALL)
113*4882a593Smuzhiyun+		color.abgr = color;
114*4882a593Smuzhiyun+
115*4882a593Smuzhiyun+	if (c_variant == SHADER_VARIANT_RGBX)
116*4882a593Smuzhiyun+		color.a = 1.0;
117*4882a593Smuzhiyun+
118*4882a593Smuzhiyun 	if (c_need_color_pipeline)
119*4882a593Smuzhiyun 		color = color_pipeline(color); /* Produces straight alpha */
120*4882a593Smuzhiyun
121*4882a593Smuzhiyundiff --git a/libweston/renderer-gl/gl-renderer-internal.h b/libweston/renderer-gl/gl-renderer-internal.h
122*4882a593Smuzhiyunindex c9d0b8a..c4c2c89 100644
123*4882a593Smuzhiyun--- a/libweston/renderer-gl/gl-renderer-internal.h
124*4882a593Smuzhiyun+++ b/libweston/renderer-gl/gl-renderer-internal.h
125*4882a593Smuzhiyun@@ -63,6 +63,13 @@ enum gl_shader_color_mapping {
126*4882a593Smuzhiyun 	SHADER_COLOR_MAPPING_3DLUT,
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun+enum gl_shader_color_swap {
130*4882a593Smuzhiyun+	SHADER_COLOR_SWAP_NONE = 0,
131*4882a593Smuzhiyun+	SHADER_COLOR_SWAP_RGB,
132*4882a593Smuzhiyun+	SHADER_COLOR_SWAP_ALPHA,
133*4882a593Smuzhiyun+	SHADER_COLOR_SWAP_ALL,
134*4882a593Smuzhiyun+};
135*4882a593Smuzhiyun+
136*4882a593Smuzhiyun /** GL shader requirements key
137*4882a593Smuzhiyun  *
138*4882a593Smuzhiyun  * This structure is used as a binary blob key for building and searching
139*4882a593Smuzhiyun@@ -80,11 +87,13 @@ struct gl_shader_requirements
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun 	unsigned color_pre_curve:1; /* enum gl_shader_color_curve */
142*4882a593Smuzhiyun 	unsigned color_mapping:1; /* enum gl_shader_color_mapping */
143*4882a593Smuzhiyun+	unsigned color_swap:2; /* enum gl_shader_color_swap */
144*4882a593Smuzhiyun+
145*4882a593Smuzhiyun 	/*
146*4882a593Smuzhiyun 	 * The total size of all bitfields plus pad_bits_ must fill up exactly
147*4882a593Smuzhiyun 	 * how many bytes the compiler allocates for them together.
148*4882a593Smuzhiyun 	 */
149*4882a593Smuzhiyun-	unsigned pad_bits_:24;
150*4882a593Smuzhiyun+	unsigned pad_bits_:22;
151*4882a593Smuzhiyun };
152*4882a593Smuzhiyun static_assert(sizeof(struct gl_shader_requirements) ==
153*4882a593Smuzhiyun 	      4 /* total bitfield size in bytes */,
154*4882a593Smuzhiyundiff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
155*4882a593Smuzhiyunindex 259b24d..da20a88 100644
156*4882a593Smuzhiyun--- a/libweston/renderer-gl/gl-renderer.c
157*4882a593Smuzhiyun+++ b/libweston/renderer-gl/gl-renderer.c
158*4882a593Smuzhiyun@@ -157,6 +157,7 @@ struct gl_buffer_state {
159*4882a593Smuzhiyun 	EGLImageKHR images[3];
160*4882a593Smuzhiyun 	int num_images;
161*4882a593Smuzhiyun 	enum gl_shader_texture_variant shader_variant;
162*4882a593Smuzhiyun+	enum gl_shader_color_swap color_swap;
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun 	GLuint textures[3];
165*4882a593Smuzhiyun 	int num_textures;
166*4882a593Smuzhiyun@@ -965,6 +966,7 @@ gl_shader_config_set_input_textures(struct gl_shader_config *sconf,
167*4882a593Smuzhiyun 	int i;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun 	sconf->req.variant = gb->shader_variant;
170*4882a593Smuzhiyun+	sconf->req.color_swap = gb->color_swap;
171*4882a593Smuzhiyun 	sconf->req.input_is_premult =
172*4882a593Smuzhiyun 		gl_shader_texture_variant_can_be_premult(gb->shader_variant);
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun@@ -2078,6 +2080,7 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer)
175*4882a593Smuzhiyun 	unsigned int i;
176*4882a593Smuzhiyun 	bool using_glesv2 = gr->gl_version < gr_gl_version(3, 0);
177*4882a593Smuzhiyun 	const struct yuv_format_descriptor *yuv = NULL;
178*4882a593Smuzhiyun+	enum gl_shader_color_swap color_swap = SHADER_COLOR_SWAP_NONE;
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun 	/* When sampling YUV input textures and converting to RGB by hand, we
181*4882a593Smuzhiyun 	 * have to bind to each plane separately, with a different format. For
182*4882a593Smuzhiyun@@ -2150,6 +2153,31 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer)
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun 		gl_format[0] = buffer->pixel_format->gl_format;
185*4882a593Smuzhiyun 		gl_pixel_type = buffer->pixel_format->gl_type;
186*4882a593Smuzhiyun+
187*4882a593Smuzhiyun+		switch (buffer->pixel_format->format) {
188*4882a593Smuzhiyun+		case WL_SHM_FORMAT_RGBX8888:
189*4882a593Smuzhiyun+			color_swap = SHADER_COLOR_SWAP_ALL;
190*4882a593Smuzhiyun+			gl_format[0] = GL_RGBA;
191*4882a593Smuzhiyun+			break;
192*4882a593Smuzhiyun+		case WL_SHM_FORMAT_RGBA8888:
193*4882a593Smuzhiyun+			color_swap = SHADER_COLOR_SWAP_ALL;
194*4882a593Smuzhiyun+			gl_format[0] = GL_RGBA;
195*4882a593Smuzhiyun+			break;
196*4882a593Smuzhiyun+		case WL_SHM_FORMAT_BGRX8888:
197*4882a593Smuzhiyun+			color_swap = SHADER_COLOR_SWAP_ALPHA;
198*4882a593Smuzhiyun+			gl_format[0] = GL_RGBA;
199*4882a593Smuzhiyun+			break;
200*4882a593Smuzhiyun+		case WL_SHM_FORMAT_BGRA8888:
201*4882a593Smuzhiyun+			color_swap = SHADER_COLOR_SWAP_ALPHA;
202*4882a593Smuzhiyun+			gl_format[0] = GL_RGBA;
203*4882a593Smuzhiyun+			break;
204*4882a593Smuzhiyun+		case WL_SHM_FORMAT_BGR888:
205*4882a593Smuzhiyun+			color_swap = SHADER_COLOR_SWAP_RGB;
206*4882a593Smuzhiyun+			gl_format[0] = GL_RGB;
207*4882a593Smuzhiyun+			break;
208*4882a593Smuzhiyun+		default:
209*4882a593Smuzhiyun+			break;
210*4882a593Smuzhiyun+		}
211*4882a593Smuzhiyun 	}
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_LENGTH(gb->gl_format); i++) {
214*4882a593Smuzhiyun@@ -2203,6 +2231,8 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer)
215*4882a593Smuzhiyun 	wl_list_init(&gb->destroy_listener.link);
216*4882a593Smuzhiyun 	pixman_region32_init(&gb->texture_damage);
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun+	gb->color_swap = color_swap;
219*4882a593Smuzhiyun+
220*4882a593Smuzhiyun 	gb->pitch = pitch;
221*4882a593Smuzhiyun 	gb->shader_variant = shader_variant;
222*4882a593Smuzhiyun 	ARRAY_COPY(gb->offset, offset);
223*4882a593Smuzhiyun@@ -3820,6 +3850,14 @@ gl_renderer_display_create(struct weston_compositor *ec,
224*4882a593Smuzhiyun 		goto fail_with_error;
225*4882a593Smuzhiyun 	}
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun+	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XBGR8888);
228*4882a593Smuzhiyun+	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_ABGR8888);
229*4882a593Smuzhiyun+	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGBX8888);
230*4882a593Smuzhiyun+	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGBA8888);
231*4882a593Smuzhiyun+	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_BGRX8888);
232*4882a593Smuzhiyun+	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_BGRA8888);
233*4882a593Smuzhiyun+	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB888);
234*4882a593Smuzhiyun+	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_BGR888);
235*4882a593Smuzhiyun 	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB565);
236*4882a593Smuzhiyun 	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_YUV420);
237*4882a593Smuzhiyun 	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_YUV444);
238*4882a593Smuzhiyundiff --git a/libweston/renderer-gl/gl-shaders.c b/libweston/renderer-gl/gl-shaders.c
239*4882a593Smuzhiyunindex 66850e7..d1895bb 100644
240*4882a593Smuzhiyun--- a/libweston/renderer-gl/gl-shaders.c
241*4882a593Smuzhiyun+++ b/libweston/renderer-gl/gl-shaders.c
242*4882a593Smuzhiyun@@ -117,6 +117,21 @@ gl_shader_color_mapping_to_string(enum gl_shader_color_mapping kind)
243*4882a593Smuzhiyun 	return "!?!?"; /* never reached */
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun+static const char *
247*4882a593Smuzhiyun+gl_shader_color_swap_to_string(enum gl_shader_color_swap kind)
248*4882a593Smuzhiyun+{
249*4882a593Smuzhiyun+	switch (kind) {
250*4882a593Smuzhiyun+#define CASERET(x) case x: return #x;
251*4882a593Smuzhiyun+	CASERET(SHADER_COLOR_SWAP_NONE)
252*4882a593Smuzhiyun+	CASERET(SHADER_COLOR_SWAP_RGB)
253*4882a593Smuzhiyun+	CASERET(SHADER_COLOR_SWAP_ALPHA)
254*4882a593Smuzhiyun+	CASERET(SHADER_COLOR_SWAP_ALL)
255*4882a593Smuzhiyun+#undef CASERET
256*4882a593Smuzhiyun+	}
257*4882a593Smuzhiyun+
258*4882a593Smuzhiyun+	return "!?!?"; /* never reached */
259*4882a593Smuzhiyun+}
260*4882a593Smuzhiyun+
261*4882a593Smuzhiyun static void
262*4882a593Smuzhiyun dump_program_with_line_numbers(int count, const char **sources)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun@@ -204,11 +219,13 @@ create_shader_config_string(const struct gl_shader_requirements *req)
265*4882a593Smuzhiyun 			"#define DEF_INPUT_IS_PREMULT %s\n"
266*4882a593Smuzhiyun 			"#define DEF_COLOR_PRE_CURVE %s\n"
267*4882a593Smuzhiyun 			"#define DEF_COLOR_MAPPING %s\n"
268*4882a593Smuzhiyun+			"#define DEF_COLOR_SWAP %s\n"
269*4882a593Smuzhiyun 			"#define DEF_VARIANT %s\n",
270*4882a593Smuzhiyun 			req->green_tint ? "true" : "false",
271*4882a593Smuzhiyun 			req->input_is_premult ? "true" : "false",
272*4882a593Smuzhiyun 			gl_shader_color_curve_to_string(req->color_pre_curve),
273*4882a593Smuzhiyun 			gl_shader_color_mapping_to_string(req->color_mapping),
274*4882a593Smuzhiyun+			gl_shader_color_swap_to_string(req->color_swap),
275*4882a593Smuzhiyun 			gl_shader_texture_variant_to_string(req->variant));
276*4882a593Smuzhiyun 	if (size < 0)
277*4882a593Smuzhiyun 		return NULL;
278*4882a593Smuzhiyun--
279*4882a593Smuzhiyun2.20.1
280*4882a593Smuzhiyun
281