1From 649de6ed31f7d2450e0917b1928667063ffc188a Mon Sep 17 00:00:00 2001
2From: Jeffy Chen <jeffy.chen@rock-chips.com>
3Date: Fri, 22 Nov 2019 12:06:35 +0800
4Subject: [PATCH 19/79] gl-renderer: Support NV16 shmem format
5
6Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
7---
8 libweston/renderer-gl/gl-renderer.c | 36 +++++++++++++++++++++++++++++
9 1 file changed, 36 insertions(+)
10
11diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c
12index f853149..3c60f85 100644
13--- a/libweston/renderer-gl/gl-renderer.c
14+++ b/libweston/renderer-gl/gl-renderer.c
15@@ -2154,6 +2154,25 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer,
16 		}
17 		es->is_opaque = true;
18 		break;
19+	case WL_SHM_FORMAT_NV16:
20+		pitch = wl_shm_buffer_get_stride(shm_buffer);
21+		gl_pixel_type = GL_UNSIGNED_BYTE;
22+		num_planes = 2;
23+		gs->offset[1] = gs->offset[0] + (pitch / gs->hsub[0]) *
24+				(buffer->height / gs->vsub[0]);
25+		gs->hsub[1] = 2;
26+		gs->vsub[1] = 1;
27+		if (gr->has_gl_texture_rg) {
28+			gs->shader_variant = SHADER_VARIANT_Y_UV;
29+			gl_format[0] = GL_R8_EXT;
30+			gl_format[1] = GL_RG8_EXT;
31+		} else {
32+			gs->shader_variant = SHADER_VARIANT_Y_XUXV;
33+			gl_format[0] = GL_LUMINANCE;
34+			gl_format[1] = GL_LUMINANCE_ALPHA;
35+		}
36+		es->is_opaque = true;
37+		break;
38 	case WL_SHM_FORMAT_YUYV:
39 		gs->shader_variant = SHADER_VARIANT_Y_XUXV;
40 		pitch = wl_shm_buffer_get_stride(shm_buffer) / 2;
41@@ -2449,6 +2468,22 @@ struct yuv_format_descriptor yuv_formats[] = {
42 			.format = DRM_FORMAT_GR88,
43 			.plane_index = 1
44 		}}
45+	}, {
46+		.format = DRM_FORMAT_NV16,
47+		.input_planes = 2,
48+		.output_planes = 2,
49+		.texture_type = EGL_TEXTURE_Y_UV_WL,
50+		{{
51+			.width_divisor = 1,
52+			.height_divisor = 1,
53+			.format = DRM_FORMAT_R8,
54+			.plane_index = 0
55+		}, {
56+			.width_divisor = 2,
57+			.height_divisor = 1,
58+			.format = DRM_FORMAT_GR88,
59+			.plane_index = 1
60+		}}
61 	}, {
62 		.format = DRM_FORMAT_YUV420,
63 		.input_planes = 3,
64@@ -3852,6 +3887,7 @@ gl_renderer_display_create(struct weston_compositor *ec,
65 	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB565);
66 	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_YUV420);
67 	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_NV12);
68+	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_NV16);
69 	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_YUYV);
70 	wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XYUV8888);
71 #if __BYTE_ORDER == __LITTLE_ENDIAN
72--
732.20.1
74
75