summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.com>2024-04-05 15:02:22 +0300
committerPekka Paalanen <pq@iki.fi>2024-04-18 14:56:53 +0000
commit7d38e044dd086fad7c81c790de0b9050c224f0e5 (patch)
treed28383091b7219b445cc337320985d5f14c5b6ed
parent044379f66ad3cb5c218821baf82fb8a98b3db39e (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.glsl81
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);