drm/amd/display: store sharpness 1dlut table in dscl_prog_data
authorSamson Tam <Samson.Tam@amd.com>
Fri, 18 Oct 2024 04:26:41 +0000 (00:26 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 28 Oct 2024 20:37:02 +0000 (16:37 -0400)
[Why]
Previously dscl_prog_data stored pointer to sharpness 1dlut table.
SPL had four pre-generated tables, one for each setup. This allowed
us to minimize number of times we had to recalculate table when
switching between setups.
However, with dual display, this becomes an issue because for a given
setup, we could have a different per app sharpness value than the
global sharpness value. So the pre-generated table will change
but both displays may point to the same table and one of them
will have the wrong sharpness setting.

[How]
Store the sharpness 1dlut table in dscl_prog_data. This ensures
that each display can have its own sharpness setting.

Reviewed-by: Ilya Bakoulin <ilya.bakoulin@amd.com>
Signed-off-by: Samson Tam <Samson.Tam@amd.com>
Signed-off-by: Tom Chung <chiahsuan.chung@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dpp/dcn401/dcn401_dpp_dscl.c
drivers/gpu/drm/amd/display/dc/spl/dc_spl.c
drivers/gpu/drm/amd/display/dc/spl/dc_spl_isharp_filters.h
drivers/gpu/drm/amd/display/dc/spl/dc_spl_types.h

index 5105fd5..2f92e7d 100644 (file)
@@ -1091,7 +1091,8 @@ void dpp401_dscl_set_scaler_manual_scale(struct dpp *dpp_base,
                /* ISHARP_DELTA_LUT */
                dpp401_dscl_set_isharp_filter(dpp, scl_data->dscl_prog_data.isharp_delta);
                dpp->scl_data.dscl_prog_data.sharpness_level = scl_data->dscl_prog_data.sharpness_level;
-               dpp->scl_data.dscl_prog_data.isharp_delta = scl_data->dscl_prog_data.isharp_delta;
+               memcpy(dpp->scl_data.dscl_prog_data.isharp_delta, scl_data->dscl_prog_data.isharp_delta,
+                       sizeof(uint32_t) * ISHARP_LUT_TABLE_SIZE);
 
                if (memcmp(&dpp->scl_data, scl_data, sizeof(*scl_data)) == 0)
                        return;
index 403fd12..133906e 100644 (file)
@@ -1607,7 +1607,8 @@ static void spl_set_isharp_data(struct dscl_prog_data *dscl_prog_data,
 
        spl_build_isharp_1dlut_from_reference_curve(ratio, setup, adp_sharpness,
                scale_to_sharpness_policy);
-       dscl_prog_data->isharp_delta = spl_get_pregen_filter_isharp_1D_lut(setup);
+       memcpy(dscl_prog_data->isharp_delta, spl_get_pregen_filter_isharp_1D_lut(setup),
+               sizeof(uint32_t) * ISHARP_LUT_TABLE_SIZE);
        dscl_prog_data->sharpness_level = adp_sharpness.sharpness_level;
 
        dscl_prog_data->isharp_en = 1;  // ISHARP_EN
index afcc662..89af91e 100644 (file)
@@ -7,7 +7,6 @@
 
 #include "dc_spl_types.h"
 
-#define ISHARP_LUT_TABLE_SIZE 32
 const uint32_t *spl_get_filter_isharp_1D_lut_0(void);
 const uint32_t *spl_get_filter_isharp_1D_lut_0p5x(void);
 const uint32_t *spl_get_filter_isharp_1D_lut_1p0x(void);
index fcb5d38..8b00ccb 100644 (file)
@@ -250,6 +250,7 @@ enum isharp_en      {
        ISHARP_DISABLE,
        ISHARP_ENABLE
 };
+#define ISHARP_LUT_TABLE_SIZE 32
 // Below struct holds values that can be directly used to program
 // hardware registers. No conversion/clamping is required
 struct dscl_prog_data {
@@ -400,7 +401,7 @@ struct dscl_prog_data {
        uint32_t isharp_nl_en;  //      ISHARP_NL_EN ? TODO:check this
        struct isharp_lba isharp_lba;   //      ISHARP_LBA
        struct isharp_fmt isharp_fmt;   //      ISHARP_FMT
-       const uint32_t *isharp_delta;
+       uint32_t isharp_delta[ISHARP_LUT_TABLE_SIZE];
        struct isharp_nldelta_sclip isharp_nldelta_sclip;       //      ISHARP_NLDELTA_SCLIP
        /* blur and scale filter */
        const uint16_t *filter_blur_scale_v;