diff options
author | Pekka Paalanen <pekka.paalanen@collabora.com> | 2024-04-05 15:02:22 +0300 |
---|---|---|
committer | Pekka Paalanen <pq@iki.fi> | 2024-04-18 14:56:53 +0000 |
commit | 7d38e044dd086fad7c81c790de0b9050c224f0e5 (patch) | |
tree | d28383091b7219b445cc337320985d5f14c5b6ed | |
parent | 044379f66ad3cb5c218821baf82fb8a98b3db39e (diff) |
gl-renderer: consolidate powlin sampling GLSL
This is pure refactoring.
Ease readability by reducing code duplication between pre and post curve
powlin handling.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
-rw-r--r-- | libweston/renderer-gl/fragment.glsl | 81 |
1 files changed, 32 insertions, 49 deletions
diff --git a/libweston/renderer-gl/fragment.glsl b/libweston/renderer-gl/fragment.glsl index 7361df71..2f63150b 100644 --- a/libweston/renderer-gl/fragment.glsl +++ b/libweston/renderer-gl/fragment.glsl @@ -237,17 +237,6 @@ linpow(float x, float g, float a, float b, float c, float d) } float -powlin(float x, float g, float a, float b, float c, float d) -{ - /* See WESTON_COLOR_CURVE_TYPE_POWLIN for details about POWLIN. */ - - if (x >= d) - return a * pow(x, g) + b; - - return c * x; -} - -float sample_linpow(float params[MAX_CURVESET_PARAMS], bool must_clamp, float x, compile_const int color_channel) { @@ -283,42 +272,33 @@ sample_linpow_vec3(float params[MAX_CURVESET_PARAMS], bool must_clamp, } float -sample_color_pre_curve_powlin(float x, compile_const int color_channel) +powlin(float x, float g, float a, float b, float c, float d) { - float g, a, b, c, d; - - /* For each color channel we have 10 parameters. The params are - * linearized in an array of size 30, in RGB order. */ - g = color_pre_curve_params[0 + (color_channel * 10)]; - a = color_pre_curve_params[1 + (color_channel * 10)]; - b = color_pre_curve_params[2 + (color_channel * 10)]; - c = color_pre_curve_params[3 + (color_channel * 10)]; - d = color_pre_curve_params[4 + (color_channel * 10)]; - - if (color_pre_curve_clamped_input) - x = clamp(x, 0.0, 1.0); + /* See WESTON_COLOR_CURVE_TYPE_POWLIN for details about POWLIN. */ - /* We use mirroring for negative input values. */ - if (x < 0.0) - return -powlin(-x, g, a, b, c, d); + if (x >= d) + return a * pow(x, g) + b; - return powlin(x, g, a, b, c, d); + return c * x; } float -sample_color_post_curve_powlin(float x, compile_const int color_channel) +sample_powlin(float params[MAX_CURVESET_PARAMS], bool must_clamp, + float x, compile_const int color_channel) { float g, a, b, c, d; - /* For each color channel we have 10 parameters. The params are - * linearized in an array of size 30, in RGB order. */ - g = color_post_curve_params[0 + (color_channel * 10)]; - a = color_post_curve_params[1 + (color_channel * 10)]; - b = color_post_curve_params[2 + (color_channel * 10)]; - c = color_post_curve_params[3 + (color_channel * 10)]; - d = color_post_curve_params[4 + (color_channel * 10)]; + /* + * For each color channel we have MAX_CURVE_PARAMS parameters. + * The parameters for the three curves are stored in RGB order. + */ + g = params[0 + color_channel * MAX_CURVE_PARAMS]; + a = params[1 + color_channel * MAX_CURVE_PARAMS]; + b = params[2 + color_channel * MAX_CURVE_PARAMS]; + c = params[3 + color_channel * MAX_CURVE_PARAMS]; + d = params[4 + color_channel * MAX_CURVE_PARAMS]; - if (color_post_curve_clamped_input) + if (must_clamp) x = clamp(x, 0.0, 1.0); /* We use mirroring for negative input values. */ @@ -329,10 +309,17 @@ sample_color_post_curve_powlin(float x, compile_const int color_channel) } vec3 -color_pre_curve(vec3 color) +sample_powlin_vec3(float params[MAX_CURVESET_PARAMS], bool must_clamp, + vec3 color) { - vec3 ret; + return vec3(sample_powlin(params, must_clamp, color.r, 0), + sample_powlin(params, must_clamp, color.g, 1), + sample_powlin(params, must_clamp, color.b, 2)); +} +vec3 +color_pre_curve(vec3 color) +{ if (c_color_pre_curve == SHADER_COLOR_CURVE_IDENTITY) { return color; } else if (c_color_pre_curve == SHADER_COLOR_CURVE_LUT_3x1D) { @@ -344,10 +331,9 @@ color_pre_curve(vec3 color) color_pre_curve_clamped_input, color); } else if (c_color_pre_curve == SHADER_COLOR_CURVE_POWLIN) { - ret.r = sample_color_pre_curve_powlin(color.r, 0); - ret.g = sample_color_pre_curve_powlin(color.g, 1); - ret.b = sample_color_pre_curve_powlin(color.b, 2); - return ret; + return sample_powlin_vec3(color_pre_curve_params, + color_pre_curve_clamped_input, + color); } else { /* Never reached, bad c_color_pre_curve. */ return vec3(1.0, 0.3, 1.0); @@ -381,8 +367,6 @@ color_mapping(vec3 color) vec3 color_post_curve(vec3 color) { - vec3 ret; - if (c_color_post_curve == SHADER_COLOR_CURVE_IDENTITY) { return color; } else if (c_color_post_curve == SHADER_COLOR_CURVE_LUT_3x1D) { @@ -394,10 +378,9 @@ color_post_curve(vec3 color) color_post_curve_clamped_input, color); } else if (c_color_post_curve == SHADER_COLOR_CURVE_POWLIN) { - ret.r = sample_color_post_curve_powlin(color.r, 0); - ret.g = sample_color_post_curve_powlin(color.g, 1); - ret.b = sample_color_post_curve_powlin(color.b, 2); - return ret; + return sample_powlin_vec3(color_post_curve_params, + color_post_curve_clamped_input, + color); } else { /* Never reached, bad c_color_post_curve. */ return vec3(1.0, 0.3, 1.0); |