Signed-off-by: Harry Wentland <harry.wentl...@amd.com>
Cc: Ville Syrjala <ville.syrj...@linux.intel.com>
Cc: Pekka Paalanen <pekka.paala...@collabora.com>
Cc: Simon Ser <cont...@emersion.fr>
Cc: Harry Wentland <harry.wentl...@amd.com>
Cc: Melissa Wen <m...@igalia.com>
Cc: Jonas Ådahl <jad...@redhat.com>
Cc: Sebastian Wick <sebastian.w...@redhat.com>
Cc: Shashank Sharma <shashank.sha...@amd.com>
Cc: Alexander Goins <ago...@nvidia.com>
Cc: Joshua Ashton <jos...@froggi.es>
Cc: Michel Dänzer <mdaen...@redhat.com>
Cc: Aleix Pol <aleix...@kde.org>
Cc: Xaver Hugl <xaver.h...@gmail.com>
Cc: Victoria Brekenfeld <victo...@system76.com>
Cc: Sima <dan...@ffwll.ch>
Cc: Uma Shankar <uma.shan...@intel.com>
Cc: Naseer Ahmed <quic_nas...@quicinc.com>
Cc: Christopher Braga <quic_cbr...@quicinc.com>
Cc: Abhinav Kumar <quic_abhin...@quicinc.com>
Cc: Arthur Grillo <arthurgri...@riseup.net>
Cc: Hector Martin <mar...@marcan.st>
Cc: Liviu Dudau <liviu.du...@arm.com>
Cc: Sasha McIntosh <sashamcint...@google.com>
---
 drivers/gpu/drm/vkms/tests/vkms_color_tests.c | 38 ++++++++++++++++++-
 drivers/gpu/drm/vkms/vkms_composer.c          | 13 +------
 drivers/gpu/drm/vkms/vkms_composer.h          | 14 +++++++
 3 files changed, 52 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/vkms/tests/vkms_color_tests.c 
b/drivers/gpu/drm/vkms/tests/vkms_color_tests.c
index 843b2e1d607e..14decb5d1b64 100644
--- a/drivers/gpu/drm/vkms/tests/vkms_color_tests.c
+++ b/drivers/gpu/drm/vkms/tests/vkms_color_tests.c
@@ -5,6 +5,7 @@
 #include <drm/drm_fixed.h>
 
 #include "../vkms_composer.h"
+#include "../vkms_luts.h"
 
 #define TEST_LUT_SIZE 16
 
@@ -33,7 +34,6 @@ const struct vkms_color_lut test_linear_lut = {
        .channel_value2index_ratio = 0xf000fll
 };
 
-
 static void vkms_color_test_get_lut_index(struct kunit *test)
 {
        int i;
@@ -42,6 +42,19 @@ static void vkms_color_test_get_lut_index(struct kunit *test)
 
        for (i = 0; i < TEST_LUT_SIZE; i++)
                KUNIT_EXPECT_EQ(test, 
drm_fixp2int_ceil(get_lut_index(&test_linear_lut, test_linear_array[i].red)), 
i);
+
+       KUNIT_EXPECT_EQ(test, drm_fixp2int(get_lut_index(&srgb_eotf, 0x0)), 
0x0);
+       KUNIT_EXPECT_EQ(test, drm_fixp2int_ceil(get_lut_index(&srgb_eotf, 
0x0)), 0x0);
+       KUNIT_EXPECT_EQ(test, drm_fixp2int_ceil(get_lut_index(&srgb_eotf, 
0x101)), 0x1);
+       KUNIT_EXPECT_EQ(test, drm_fixp2int_ceil(get_lut_index(&srgb_eotf, 
0x202)), 0x2);
+
+       KUNIT_EXPECT_EQ(test, drm_fixp2int(get_lut_index(&srgb_inv_eotf, 0x0)), 
0x0);
+       KUNIT_EXPECT_EQ(test, drm_fixp2int_ceil(get_lut_index(&srgb_inv_eotf, 
0x0)), 0x0);
+       KUNIT_EXPECT_EQ(test, drm_fixp2int_ceil(get_lut_index(&srgb_inv_eotf, 
0x101)), 0x1);
+       KUNIT_EXPECT_EQ(test, drm_fixp2int_ceil(get_lut_index(&srgb_inv_eotf, 
0x202)), 0x2);
+
+       KUNIT_EXPECT_EQ(test, drm_fixp2int_ceil(get_lut_index(&srgb_eotf, 
0xfefe)), 0xfe);
+       KUNIT_EXPECT_EQ(test, drm_fixp2int_ceil(get_lut_index(&srgb_eotf, 
0xffff)), 0xff);
 }
 
 static void vkms_color_test_lerp(struct kunit *test)
@@ -49,9 +62,32 @@ static void vkms_color_test_lerp(struct kunit *test)
        KUNIT_EXPECT_EQ(test, lerp_u16(0x0, 0x10, 0x80000000), 0x8);
 }
 
+static void vkms_color_test_linear(struct kunit *test)
+{
+       for (int i = 0; i < LUT_SIZE; i++) {
+               int linear = apply_lut_to_channel_value(&linear_eotf, i * 
0x101, LUT_RED);
+               KUNIT_EXPECT_EQ(test, DIV_ROUND_CLOSEST(linear, 0x101), i);
+       }
+}
+
+static void vkms_color_srgb_inv_srgb(struct kunit *test)
+{
+       u16 srgb, final;
+
+       for (int i = 0; i < LUT_SIZE; i++) {
+               srgb = apply_lut_to_channel_value(&srgb_eotf, i * 0x101, 
LUT_RED);
+               final = apply_lut_to_channel_value(&srgb_inv_eotf, srgb, 
LUT_RED);
+
+               KUNIT_EXPECT_GE(test, final / 0x101, i-1);
+               KUNIT_EXPECT_LE(test, final / 0x101, i+1);
+       }
+}
+
 static struct kunit_case vkms_color_test_cases[] = {
        KUNIT_CASE(vkms_color_test_get_lut_index),
        KUNIT_CASE(vkms_color_test_lerp),
+       KUNIT_CASE(vkms_color_test_linear),
+       KUNIT_CASE(vkms_color_srgb_inv_srgb),
        {}
 };
 
diff --git a/drivers/gpu/drm/vkms/vkms_composer.c 
b/drivers/gpu/drm/vkms/vkms_composer.c
index 73b7d5e94021..24c984f2876f 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -110,18 +110,7 @@ s64 get_lut_index(const struct vkms_color_lut *lut, u16 
channel_value)
        return drm_fixp_mul(color_channel_fp, lut->channel_value2index_ratio);
 }
 
-/*
- * This enum is related to the positions of the variables inside
- * `struct drm_color_lut`, so the order of both needs to be the same.
- */
-enum lut_channel {
-       LUT_RED = 0,
-       LUT_GREEN,
-       LUT_BLUE,
-       LUT_RESERVED
-};
-
-static u16 apply_lut_to_channel_value(const struct vkms_color_lut *lut, u16 
channel_value,
+u16 apply_lut_to_channel_value(const struct vkms_color_lut *lut, u16 
channel_value,
                                      enum lut_channel channel)
 {
        s64 lut_index = get_lut_index(lut, channel_value);
diff --git a/drivers/gpu/drm/vkms/vkms_composer.h 
b/drivers/gpu/drm/vkms/vkms_composer.h
index 11c5de9cc961..d92497c555eb 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.h
+++ b/drivers/gpu/drm/vkms/vkms_composer.h
@@ -8,4 +8,18 @@
 s64 get_lut_index(const struct vkms_color_lut *lut, u16 channel_value);
 u16 lerp_u16(u16 a, u16 b, s64 t);
 
+/*
+ * This enum is related to the positions of the variables inside
+ * `struct drm_color_lut`, so the order of both needs to be the same.
+ */
+enum lut_channel {
+       LUT_RED = 0,
+       LUT_GREEN,
+       LUT_BLUE,
+       LUT_RESERVED
+};
+
+u16 apply_lut_to_channel_value(const struct vkms_color_lut *lut, u16 
channel_value,
+                              enum lut_channel channel);
+
 #endif /* _VKMS_COMPOSER_H_ */
\ No newline at end of file
-- 
2.42.0

Reply via email to