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