From 9d2fbd54559ddd0ed0fb290f1a421ae336e62da0 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Tue, 14 Oct 2025 15:35:46 +0300 Subject: [PATCH] renderer-gl: compress shader descriptions Make the shader description strings easier to read. Before they looked like this: Compiling shader program for: SHADER_TEXCOORD_INPUT_ATTRIB SHADER_VARIANT_SOLID SHADER_COLOR_EFFECT_NONE SHADER_COLOR_CURVE_LINPOW SHADER_COLOR_MAPPING_IDENTITY SHADER_COLOR_CURVE_IDENTITY +input_is_premult -tint -shader_blending (SHADER_COLOR_CURVE_IDENTITY, SHADER_COLOR_CURVE_IDENTITY) Now they look like this: Compiling shader program for: attr tc, solid tex, no effect, CP{ linpow, I, I }, +premult_in -tint -shader_blending (I, I) Turn the switches into arrays for easier handling. This is different from weston_enum_map, because we need two different strings for each value: a symbol for the shader code, and a description for the debug logs. Unknown enum values will abort(), but they should be asserted anyway. Unfortunately getting a weston_compositor here would be inconvenient for using weston-assert macros. Signed-off-by: Pekka Paalanen --- libweston/renderer-gl/gl-shaders.c | 161 ++++++++++++++++------------- 1 file changed, 87 insertions(+), 74 deletions(-) diff --git a/libweston/renderer-gl/gl-shaders.c b/libweston/renderer-gl/gl-shaders.c index 3eca63d42..02ba41c7d 100644 --- a/libweston/renderer-gl/gl-shaders.c +++ b/libweston/renderer-gl/gl-shaders.c @@ -101,81 +101,94 @@ struct gl_shader { GLint yuv_coefficients_uniform; }; -static const char * +struct gl_shader_enum_map { + const char *symbol; + const char *desc; +}; + +static const struct gl_shader_enum_map * +gl_shader_enum_map_get_(const struct gl_shader_enum_map *map, + size_t map_len, + unsigned value) +{ + if (value >= map_len) + abort(); + + if (!map[value].symbol) + abort(); + + return &map[value]; +} + +#define gl_shader_enum_map_get(map, value) gl_shader_enum_map_get_((map), ARRAY_LENGTH(map), (value)) + +#define ENUMVAL(sym, text) [sym] = { #sym, text } + +static const struct gl_shader_enum_map gl_shader_texcoord_input_mapping[] = { + ENUMVAL(SHADER_TEXCOORD_INPUT_SURFACE, "surf"), + ENUMVAL(SHADER_TEXCOORD_INPUT_ATTRIB, "attr"), +}; + +static const struct gl_shader_enum_map * gl_shader_texcoord_input_to_string(enum gl_shader_texcoord_input kind) { - switch (kind) { -#define CASERET(x) case x: return #x; - CASERET(SHADER_TEXCOORD_INPUT_SURFACE) - CASERET(SHADER_TEXCOORD_INPUT_ATTRIB) -#undef CASERET - } - - return "!?!?"; /* never reached */ + return gl_shader_enum_map_get(gl_shader_texcoord_input_mapping, kind); } -static const char * +static const struct gl_shader_enum_map gl_shader_texture_variant_mapping[] = { + ENUMVAL(SHADER_VARIANT_NONE, "none"), + ENUMVAL(SHADER_VARIANT_RGBA, "RGBA"), + ENUMVAL(SHADER_VARIANT_Y_U_V, "Y_U_V"), + ENUMVAL(SHADER_VARIANT_Y_UV, "Y_UV"), + ENUMVAL(SHADER_VARIANT_XYUV, "XYUV"), + ENUMVAL(SHADER_VARIANT_SOLID, "solid"), + ENUMVAL(SHADER_VARIANT_EXTERNAL, "external"), +}; + +static const struct gl_shader_enum_map * gl_shader_texture_variant_to_string(enum gl_shader_texture_variant v) { - switch (v) { -#define CASERET(x) case x: return #x; - CASERET(SHADER_VARIANT_NONE) - CASERET(SHADER_VARIANT_RGBA) - CASERET(SHADER_VARIANT_Y_U_V) - CASERET(SHADER_VARIANT_Y_UV) - CASERET(SHADER_VARIANT_XYUV) - CASERET(SHADER_VARIANT_SOLID) - CASERET(SHADER_VARIANT_EXTERNAL) -#undef CASERET - } - - return "!?!?"; /* never reached */ + return gl_shader_enum_map_get(gl_shader_texture_variant_mapping, v); } -static const char * +static const struct gl_shader_enum_map gl_shader_color_effect_mapping[] = { + ENUMVAL(SHADER_COLOR_EFFECT_NONE, "no"), + ENUMVAL(SHADER_COLOR_EFFECT_INVERSION, "inv"), + ENUMVAL(SHADER_COLOR_EFFECT_GRAYSCALE, "gray"), + ENUMVAL(SHADER_COLOR_EFFECT_CVD_CORRECTION, "CVD-corr"), +}; + +static const struct gl_shader_enum_map * gl_shader_color_effect_to_string(enum gl_shader_color_effect kind) { - switch(kind) { -#define CASERET(x) case x: return #x; - CASERET(SHADER_COLOR_EFFECT_NONE) - CASERET(SHADER_COLOR_EFFECT_INVERSION) - CASERET(SHADER_COLOR_EFFECT_GRAYSCALE) - CASERET(SHADER_COLOR_EFFECT_CVD_CORRECTION) -#undef CASERET - } - - return "!?!?"; /* never reached */ + return gl_shader_enum_map_get(gl_shader_color_effect_mapping, kind); } -static const char * +static const struct gl_shader_enum_map gl_shader_color_curve_mapping[] = { + ENUMVAL(SHADER_COLOR_CURVE_IDENTITY, "I"), + ENUMVAL(SHADER_COLOR_CURVE_LUT_3x1D, "3x1D"), + ENUMVAL(SHADER_COLOR_CURVE_LINPOW, "linpow"), + ENUMVAL(SHADER_COLOR_CURVE_POWLIN, "powlin"), + ENUMVAL(SHADER_COLOR_CURVE_PQ, "PQ"), + ENUMVAL(SHADER_COLOR_CURVE_PQ_INVERSE, "PQ⁻¹"), +}; + +static const struct gl_shader_enum_map * gl_shader_color_curve_to_string(enum gl_shader_color_curve kind) { - switch (kind) { -#define CASERET(x) case x: return #x; - CASERET(SHADER_COLOR_CURVE_IDENTITY) - CASERET(SHADER_COLOR_CURVE_LUT_3x1D) - CASERET(SHADER_COLOR_CURVE_LINPOW) - CASERET(SHADER_COLOR_CURVE_POWLIN) - CASERET(SHADER_COLOR_CURVE_PQ) - CASERET(SHADER_COLOR_CURVE_PQ_INVERSE) -#undef CASERET - } - - return "!?!?"; /* never reached */ + return gl_shader_enum_map_get(gl_shader_color_curve_mapping, kind); } -static const char * +static const struct gl_shader_enum_map gl_shader_color_mapping_mapping[] = { + ENUMVAL(SHADER_COLOR_MAPPING_IDENTITY, "I"), + ENUMVAL(SHADER_COLOR_MAPPING_3DLUT, "3DLUT"), + ENUMVAL(SHADER_COLOR_MAPPING_MATRIX, "M"), +}; + +static const struct gl_shader_enum_map * gl_shader_color_mapping_to_string(enum gl_shader_color_mapping kind) { - switch (kind) { -#define CASERET(x) case x: return #x; - CASERET(SHADER_COLOR_MAPPING_IDENTITY) - CASERET(SHADER_COLOR_MAPPING_3DLUT) - CASERET(SHADER_COLOR_MAPPING_MATRIX) -#undef CASERET - } - - return "!?!?"; /* never reached */ + return gl_shader_enum_map_get(gl_shader_color_mapping_mapping, kind); } static void @@ -243,18 +256,18 @@ create_shader_description_string(const struct gl_shader_requirements *req) int size; char *str; - size = asprintf(&str, "%s %s %s %s %s %s %cinput_is_premult %ctint %cshader_blending (%s, %s)", - gl_shader_texcoord_input_to_string(req->texcoord_input), - gl_shader_texture_variant_to_string(req->variant), - gl_shader_color_effect_to_string(req->color_effect), - gl_shader_color_curve_to_string(req->color_pre_curve), - gl_shader_color_mapping_to_string(req->color_mapping), - gl_shader_color_curve_to_string(req->color_post_curve), + size = asprintf(&str, "%s tc, %s tex, %s effect, CP{ %s, %s, %s }, %cpremult_in %ctint %cshader_blending (%s, %s)", + gl_shader_texcoord_input_to_string(req->texcoord_input)->desc, + gl_shader_texture_variant_to_string(req->variant)->desc, + gl_shader_color_effect_to_string(req->color_effect)->desc, + gl_shader_color_curve_to_string(req->color_pre_curve)->desc, + gl_shader_color_mapping_to_string(req->color_mapping)->desc, + gl_shader_color_curve_to_string(req->color_post_curve)->desc, req->input_is_premult ? '+' : '-', req->tint ? '+' : '-', req->shader_blending ? '+' : '-', - gl_shader_color_curve_to_string(req->fb_fetch_curve), - gl_shader_color_curve_to_string(req->fb_store_curve)); + gl_shader_color_curve_to_string(req->fb_fetch_curve)->desc, + gl_shader_color_curve_to_string(req->fb_store_curve)->desc); if (size < 0) return NULL; return str; @@ -269,7 +282,7 @@ create_vertex_shader_config_string(const struct gl_shader_requirements *req) size = asprintf(&str, "#define DEF_TEXCOORD_INPUT %s\n" "#define DEF_WIREFRAME %s\n", - gl_shader_texcoord_input_to_string(req->texcoord_input), + gl_shader_texcoord_input_to_string(req->texcoord_input)->symbol, req->wireframe ? "true" : "false"); if (size < 0) @@ -300,14 +313,14 @@ create_fragment_shader_config_string(const struct gl_shader_requirements *req) req->tint ? "true" : "false", req->input_is_premult ? "true" : "false", req->wireframe ? "true" : "false", - gl_shader_color_curve_to_string(req->color_pre_curve), - gl_shader_color_mapping_to_string(req->color_mapping), - gl_shader_color_curve_to_string(req->color_post_curve), + gl_shader_color_curve_to_string(req->color_pre_curve)->symbol, + gl_shader_color_mapping_to_string(req->color_mapping)->symbol, + gl_shader_color_curve_to_string(req->color_post_curve)->symbol, req->shader_blending ? "1" : "0", - gl_shader_color_curve_to_string(req->fb_fetch_curve), - gl_shader_color_curve_to_string(req->fb_store_curve), - gl_shader_color_effect_to_string(req->color_effect), - gl_shader_texture_variant_to_string(req->variant)); + gl_shader_color_curve_to_string(req->fb_fetch_curve)->symbol, + gl_shader_color_curve_to_string(req->fb_store_curve)->symbol, + gl_shader_color_effect_to_string(req->color_effect)->symbol, + gl_shader_texture_variant_to_string(req->variant)->symbol); if (size < 0) return NULL; return str;