summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.com>2024-04-05 14:08:17 +0300
committerPekka Paalanen <pq@iki.fi>2024-04-18 14:56:53 +0000
commit8fc5e0a333c1afb09b62c58cc047cbe42c5fabc0 (patch)
tree587357ac5c6f424bd27ed6812c14540b89da2634
parenta7b54706b5809f136eaf0d2f2fb03b3739b35624 (diff)
gl-renderer: consolidate pre and post curve LUT GLSL
This is pure refactoring. Ease readability by reducing code duplication between pre and post curve LUT handling. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
-rw-r--r--libweston/renderer-gl/fragment.glsl53
1 files changed, 22 insertions, 31 deletions
diff --git a/libweston/renderer-gl/fragment.glsl b/libweston/renderer-gl/fragment.glsl
index b19d0427..1a8b1ef8 100644
--- a/libweston/renderer-gl/fragment.glsl
+++ b/libweston/renderer-gl/fragment.glsl
@@ -188,6 +188,9 @@ sample_input_texture()
}
/*
+ * Sample a 1D LUT which is a single row of a 2D texture. The 2D texture has
+ * four rows so that the centers of texels have precise y-coordinates.
+ *
* Texture coordinates go from 0.0 to 1.0 corresponding to texture edges.
* When we do LUT look-ups with linear filtering, the correct range to sample
* from is not from edge to edge, but center of first texel to center of last
@@ -196,28 +199,27 @@ sample_input_texture()
* The scale and offset are precomputed to achieve this mapping.
*/
float
-lut_texcoord(float x, vec2 scale_offset)
+sample_lut_1d(HIGHPRECISION sampler2D lut, vec2 scale_offset,
+ float x, compile_const int row)
{
- return x * scale_offset.s + scale_offset.t;
+ float tx = x * scale_offset.s + scale_offset.t;
+ float ty = (float(row) + 0.5) / 4.0;
+
+ return texture2D(lut, vec2(tx, ty)).x;
}
vec3
-lut_texcoord(vec3 pos, vec2 scale_offset)
+sample_lut_3x1d(HIGHPRECISION sampler2D lut, vec2 scale_offset, vec3 color)
{
- return pos * scale_offset.s + scale_offset.t;
+ return vec3(sample_lut_1d(lut, scale_offset, color.r, 0),
+ sample_lut_1d(lut, scale_offset, color.g, 1),
+ sample_lut_1d(lut, scale_offset, color.b, 2));
}
-/*
- * Sample a 1D LUT which is a single row of a 2D texture. The 2D texture has
- * four rows so that the centers of texels have precise y-coordinates.
- */
-float
-sample_color_pre_curve_lut_2d(float x, compile_const int row)
+vec3
+lut_texcoord(vec3 pos, vec2 scale_offset)
{
- float tx = lut_texcoord(x, color_pre_curve_lut_scale_offset);
-
- return texture2D(color_pre_curve_lut_2d,
- vec2(tx, (float(row) + 0.5) / 4.0)).x;
+ return pos * scale_offset.s + scale_offset.t;
}
float
@@ -342,10 +344,9 @@ 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) {
- ret.r = sample_color_pre_curve_lut_2d(color.r, 0);
- ret.g = sample_color_pre_curve_lut_2d(color.g, 1);
- ret.b = sample_color_pre_curve_lut_2d(color.b, 2);
- return ret;
+ return sample_lut_3x1d(color_pre_curve_lut_2d,
+ color_pre_curve_lut_scale_offset,
+ color);
} else if (c_color_pre_curve == SHADER_COLOR_CURVE_LINPOW) {
ret.r = sample_color_pre_curve_linpow(color.r, 0);
ret.g = sample_color_pre_curve_linpow(color.g, 1);
@@ -386,15 +387,6 @@ color_mapping(vec3 color)
return vec3(1.0, 0.3, 1.0);
}
-float
-sample_color_post_curve_lut_2d(float x, compile_const int row)
-{
- float tx = lut_texcoord(x, color_post_curve_lut_scale_offset);
-
- return texture2D(color_post_curve_lut_2d,
- vec2(tx, (float(row) + 0.5) / 4.0)).x;
-}
-
vec3
color_post_curve(vec3 color)
{
@@ -403,10 +395,9 @@ color_post_curve(vec3 color)
if (c_color_post_curve == SHADER_COLOR_CURVE_IDENTITY) {
return color;
} else if (c_color_post_curve == SHADER_COLOR_CURVE_LUT_3x1D) {
- ret.r = sample_color_post_curve_lut_2d(color.r, 0);
- ret.g = sample_color_post_curve_lut_2d(color.g, 1);
- ret.b = sample_color_post_curve_lut_2d(color.b, 2);
- return ret;
+ return sample_lut_3x1d(color_post_curve_lut_2d,
+ color_post_curve_lut_scale_offset,
+ color);
} else if (c_color_post_curve == SHADER_COLOR_CURVE_LINPOW) {
ret.r = sample_color_post_curve_linpow(color.r, 0);
ret.g = sample_color_post_curve_linpow(color.g, 1);