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