Enable usage of predefined transfer func in addition to shaper 1D LUT.
That means we can save some complexity by just setting a predefined
curve, instead of programming a custom curve when preparing color space
for applying 3D LUT.

Reviewed-by: Harry Wentland <harry.wentl...@amd.com>
Signed-off-by: Melissa Wen <m...@igalia.com>
---
 .../drm/amd/display/amdgpu_dm/amdgpu_dm_color.c   | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
index daa500b04cb5..8239904f9d90 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
@@ -624,20 +624,23 @@ amdgpu_tf_to_dc_tf(enum amdgpu_transfer_function tf)
 }
 
 static int amdgpu_dm_atomic_shaper_lut(const struct drm_color_lut *shaper_lut,
+                                      bool has_rom,
+                                      enum dc_transfer_func_predefined tf,
                                       uint32_t shaper_size,
                                       struct dc_transfer_func *func_shaper)
 {
        int ret = 0;
 
-       if (shaper_size) {
+       if (shaper_size || tf != TRANSFER_FUNCTION_LINEAR) {
                /*
                 * If user shaper LUT is set, we assume a linear color space
                 * (linearized by degamma 1D LUT or not).
                 */
                func_shaper->type = TF_TYPE_DISTRIBUTED_POINTS;
-               func_shaper->tf = TRANSFER_FUNCTION_LINEAR;
+               func_shaper->tf = tf;
+               func_shaper->sdr_ref_white_level = SDR_WHITE_LEVEL_INIT_VALUE;
 
-               ret = __set_output_tf(func_shaper, shaper_lut, shaper_size, 
false);
+               ret = __set_output_tf(func_shaper, shaper_lut, shaper_size, 
has_rom);
        } else {
                func_shaper->type = TF_TYPE_BYPASS;
                func_shaper->tf = TRANSFER_FUNCTION_LINEAR;
@@ -972,6 +975,7 @@ amdgpu_dm_plane_set_color_properties(struct drm_plane_state 
*plane_state,
                                     struct dc_plane_state *dc_plane_state)
 {
        struct dm_plane_state *dm_plane_state = to_dm_plane_state(plane_state);
+       enum amdgpu_transfer_function shaper_tf = 
AMDGPU_TRANSFER_FUNCTION_DEFAULT;
        const struct drm_color_lut *shaper_lut;
        uint32_t shaper_size;
        int ret;
@@ -980,8 +984,11 @@ amdgpu_dm_plane_set_color_properties(struct 
drm_plane_state *plane_state,
 
        shaper_lut = __extract_blob_lut(dm_plane_state->shaper_lut, 
&shaper_size);
        shaper_size = shaper_lut != NULL ? shaper_size : 0;
+       shaper_tf = dm_plane_state->shaper_tf;
 
-       ret = amdgpu_dm_atomic_shaper_lut(shaper_lut, shaper_size,
+       ret = amdgpu_dm_atomic_shaper_lut(shaper_lut, false,
+                                         amdgpu_tf_to_dc_tf(shaper_tf),
+                                         shaper_size,
                                          dc_plane_state->in_shaper_func);
        if (ret)
                drm_dbg_kms(plane_state->plane->dev,
-- 
2.40.1

Reply via email to