We already have the steps to program post-blending shaper/3D LUT on AMD
display driver, so that we can reuse them and map plane properties to DC
plane for pre-blending (plane) shaper/3D LUT setup.

Signed-off-by: Melissa Wen <m...@igalia.com>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_color.c   | 34 +++++++++++++++++--
 .../drm/amd/display/dc/dcn20/dcn20_hwseq.c    |  5 +--
 2 files changed, 35 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 854510b05194..e17141fc8d12 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
@@ -909,6 +909,35 @@ __set_dm_plane_degamma(struct drm_plane_state *plane_state,
        }
        return 0;
 }
+
+static int
+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 drm_transfer_function shaper_tf = DRM_TRANSFER_FUNCTION_DEFAULT;
+       const struct drm_color_lut *shaper_lut, *lut3d;
+       uint32_t lut3d_size, shaper_size;
+
+       /* We have nothing to do here, return */
+       if (!plane_state->color_mgmt_changed)
+               return 0;
+
+       dc_plane_state->hdr_mult = 
dc_fixpt_from_s3132(dm_plane_state->hdr_mult);
+
+       shaper_tf = dm_plane_state->shaper_tf;
+       shaper_lut = __extract_blob_lut(dm_plane_state->shaper_lut, 
&shaper_size);
+       lut3d = __extract_blob_lut(dm_plane_state->lut3d, &lut3d_size);
+       lut3d_size = lut3d != NULL ? lut3d_size : 0;
+       shaper_size = shaper_lut != NULL ? shaper_size : 0;
+
+       amdgpu_dm_atomic_lut3d(lut3d, lut3d_size, dc_plane_state->lut3d_func);
+       ret = amdgpu_dm_atomic_shaper_lut(shaper_lut, false,
+                                         drm_tf_to_dc_tf(shaper_tf),
+                                         shaper_size, 
dc_plane_state->in_shaper_func);
+
+       return ret;
+}
 #endif
 
 /**
@@ -939,7 +968,9 @@ int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state 
*crtc,
        has_crtc_cm_degamma = (crtc->cm_has_degamma || 
crtc->cm_is_degamma_srgb);
 
 #ifdef CONFIG_STEAM_DECK
-       dc_plane_state->hdr_mult = 
dc_fixpt_from_s3132(dm_plane_state->hdr_mult);
+       ret = amdgpu_dm_plane_set_color_properties(plane_state, dc_plane_state);
+       if(ret)
+               return ret;
 
        ret = __set_dm_plane_degamma(plane_state, dc_plane_state);
        if (ret != -EINVAL)
@@ -971,6 +1002,5 @@ int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state 
*crtc,
                        return ret;
        }
 
-
        return 0;
 }
diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c 
b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
index 5800acf6aae1..91fee60410f4 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
@@ -1759,8 +1759,9 @@ static void dcn20_program_pipe(
                hws->funcs.set_hdr_multiplier(pipe_ctx);
 
        if (pipe_ctx->update_flags.bits.enable ||
-                       
pipe_ctx->plane_state->update_flags.bits.in_transfer_func_change ||
-                       pipe_ctx->plane_state->update_flags.bits.gamma_change)
+           pipe_ctx->plane_state->update_flags.bits.in_transfer_func_change ||
+           pipe_ctx->plane_state->update_flags.bits.gamma_change ||
+           pipe_ctx->plane_state->update_flags.bits.lut_3d)
                hws->funcs.set_input_transfer_func(dc, pipe_ctx, 
pipe_ctx->plane_state);
 
        /* dcn10_translate_regamma_to_hw_format takes 750us to finish
-- 
2.39.2

Reply via email to