]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
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 5105fd580017c3a5bc20d93eff65ab08221c7933..2f92e7d4981bae68529cf522ee48ef039d0fbfe9 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 403fd1221803bf5db044af608bd52dbfe822684d..133906e73a65c07d0ea57c10ff678b73a5161690 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 afcc66206ca2a799fd0186bc8d93294584057a96..89af91e19b6ce829d2c4fe01c2efb0ea9bfbd13e 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 fcb5d389592bef5978797ca7a1909e836e31931f..8b00ccb1dfdad01feb61c8a72c9861769957f5aa 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;