From 3c3515391c447efa5b03c6b19aa3c559312678d5 Mon Sep 17 00:00:00 2001 From: Jeffy Chen Date: Fri, 22 Nov 2019 12:06:35 +0800 Subject: [PATCH 19/74] gl-renderer: Support NV16 shmem format Signed-off-by: Jeffy Chen --- libweston/renderer-gl/gl-renderer.c | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index f853149..3c60f85 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -2154,6 +2154,25 @@ gl_renderer_attach_shm(struct weston_surface *es, struct weston_buffer *buffer, } es->is_opaque = true; break; + case WL_SHM_FORMAT_NV16: + pitch = wl_shm_buffer_get_stride(shm_buffer); + gl_pixel_type = GL_UNSIGNED_BYTE; + num_planes = 2; + gs->offset[1] = gs->offset[0] + (pitch / gs->hsub[0]) * + (buffer->height / gs->vsub[0]); + gs->hsub[1] = 2; + gs->vsub[1] = 1; + if (gr->has_gl_texture_rg) { + gs->shader_variant = SHADER_VARIANT_Y_UV; + gl_format[0] = GL_R8_EXT; + gl_format[1] = GL_RG8_EXT; + } else { + gs->shader_variant = SHADER_VARIANT_Y_XUXV; + gl_format[0] = GL_LUMINANCE; + gl_format[1] = GL_LUMINANCE_ALPHA; + } + es->is_opaque = true; + break; case WL_SHM_FORMAT_YUYV: gs->shader_variant = SHADER_VARIANT_Y_XUXV; pitch = wl_shm_buffer_get_stride(shm_buffer) / 2; @@ -2449,6 +2468,22 @@ struct yuv_format_descriptor yuv_formats[] = { .format = DRM_FORMAT_GR88, .plane_index = 1 }} + }, { + .format = DRM_FORMAT_NV16, + .input_planes = 2, + .output_planes = 2, + .texture_type = EGL_TEXTURE_Y_UV_WL, + {{ + .width_divisor = 1, + .height_divisor = 1, + .format = DRM_FORMAT_R8, + .plane_index = 0 + }, { + .width_divisor = 2, + .height_divisor = 1, + .format = DRM_FORMAT_GR88, + .plane_index = 1 + }} }, { .format = DRM_FORMAT_YUV420, .input_planes = 3, @@ -3852,6 +3887,7 @@ gl_renderer_display_create(struct weston_compositor *ec, wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_RGB565); wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_YUV420); wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_NV12); + wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_NV16); wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_YUYV); wl_display_add_shm_format(ec->wl_display, WL_SHM_FORMAT_XYUV8888); #if __BYTE_ORDER == __LITTLE_ENDIAN -- 2.20.1