diff mbox series

[1/2] drm/i915/dsc: Use helper to calculate range_bpg_offset

Message ID 20231016052038.1905913-2-ankit.k.nautiyal@intel.com (mailing list archive)
State New, archived
Headers show
Series Add helper for range_bpg_offset and minor fixes | expand

Commit Message

Ankit Nautiyal Oct. 16, 2023, 5:20 a.m. UTC
We get range_bpg_offset for different bpps based on
linear-interpolation from values given for nearby bpps.
Use a helper to get these values.

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
 drivers/gpu/drm/i915/display/intel_vdsc.c | 59 ++++++++++++-----------
 1 file changed, 30 insertions(+), 29 deletions(-)

Comments

Kandpal, Suraj Oct. 31, 2023, 8:56 a.m. UTC | #1
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ankit
> Nautiyal
> Sent: Monday, October 16, 2023 10:51 AM
> To: intel-gfx@lists.freedesktop.org
> Subject: [Intel-gfx] [PATCH 1/2] drm/i915/dsc: Use helper to calculate
> range_bpg_offset
> 
> We get range_bpg_offset for different bpps based on linear-interpolation from
> values given for nearby bpps.
> Use a helper to get these values.
> 
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

LGTM. 

Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
	
> ---
>  drivers/gpu/drm/i915/display/intel_vdsc.c | 59 ++++++++++++-----------
>  1 file changed, 30 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c
> b/drivers/gpu/drm/i915/display/intel_vdsc.c
> index 6757dbae9ee5..708c6d4da0a2 100644
> --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
> +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
> @@ -65,6 +65,13 @@ intel_vdsc_set_min_max_qp(struct drm_dsc_config
> *vdsc_cfg, int buf,
>  		intel_lookup_range_max_qp(bpc, buf, bpp, vdsc_cfg-
> >native_420);  }
> 
> +static int
> +get_range_bpg_offset(int bpp_low, int offset_low, int bpp_high, int
> +offset_high, int bpp) {
> +	return offset_low + DIV_ROUND_UP((offset_high - offset_low) * (bpp -
> bpp_low),
> +					 (bpp_low - bpp_high));
> +}
> +
>  /*
>   * We are using the method provided in DSC 1.2a C-Model in codec_main.c
>   * Above method use a common formula to derive values for any combination
> of DSC @@ -82,7 +89,7 @@ calculate_rc_params(struct drm_dsc_config
> *vdsc_cfg)
>  	int qp_bpc_modifier = (bpc - 8) * 2;
>  	int uncompressed_bpg_rate;
>  	int first_line_bpg_offset;
> -	u32 res, buf_i, bpp_i;
> +	u32 buf_i, bpp_i;
> 
>  	if (vdsc_cfg->slice_height >= 8)
>  		first_line_bpg_offset =
> @@ -156,23 +163,19 @@ calculate_rc_params(struct drm_dsc_config
> *vdsc_cfg)
>  			intel_vdsc_set_min_max_qp(vdsc_cfg, buf_i, bpp_i);
> 
>  			/* Calculate range_bpg_offset */
> -			if (bpp <= 8) {
> +			if (bpp <= 8)
>  				range_bpg_offset = ofs_und4[buf_i];
> -			} else if (bpp <= 10) {
> -				res = DIV_ROUND_UP(((bpp - 8) *
> -						    (ofs_und5[buf_i] -
> ofs_und4[buf_i])), 2);
> -				range_bpg_offset = ofs_und4[buf_i] + res;
> -			} else if (bpp <= 12) {
> -				res = DIV_ROUND_UP(((bpp - 10) *
> -						    (ofs_und6[buf_i] -
> ofs_und5[buf_i])), 2);
> -				range_bpg_offset = ofs_und5[buf_i] + res;
> -			} else if (bpp <= 16) {
> -				res = DIV_ROUND_UP(((bpp - 12) *
> -						    (ofs_und8[buf_i] -
> ofs_und6[buf_i])), 4);
> -				range_bpg_offset = ofs_und6[buf_i] + res;
> -			} else {
> +			else if (bpp <= 10)
> +				range_bpg_offset = get_range_bpg_offset(8,
> ofs_und4[buf_i],
> +									10,
> ofs_und5[buf_i], bpp);
> +			else if (bpp <= 12)
> +				range_bpg_offset = get_range_bpg_offset(10,
> ofs_und5[buf_i],
> +									12,
> ofs_und6[buf_i], bpp);
> +			else if (bpp <= 16)
> +				range_bpg_offset = get_range_bpg_offset(12,
> ofs_und6[buf_i],
> +									16,
> ofs_und8[buf_i], bpp);
> +			else
>  				range_bpg_offset = ofs_und8[buf_i];
> -			}
> 
>  			vdsc_cfg->rc_range_params[buf_i].range_bpg_offset =
>  				range_bpg_offset &
> DSC_RANGE_BPG_OFFSET_MASK; @@ -198,21 +201,19 @@
> calculate_rc_params(struct drm_dsc_config *vdsc_cfg)
>  			intel_vdsc_set_min_max_qp(vdsc_cfg, buf_i, bpp_i);
> 
>  			/* Calculate range_bpg_offset */
> -			if (bpp <= 6) {
> +			if (bpp <= 6)
>  				range_bpg_offset = ofs_und6[buf_i];
> -			} else if (bpp <= 8) {
> -				res = DIV_ROUND_UP(((bpp - 6) *
> -						    (ofs_und8[buf_i] -
> ofs_und6[buf_i])), 2);
> -				range_bpg_offset = ofs_und6[buf_i] + res;
> -			} else if (bpp <= 12) {
> -				range_bpg_offset = ofs_und8[buf_i];
> -			} else if (bpp <= 15) {
> -				res = DIV_ROUND_UP(((bpp - 12) *
> -						    (ofs_und15[buf_i] -
> ofs_und12[buf_i])), 3);
> -				range_bpg_offset = ofs_und12[buf_i] + res;
> -			} else {
> +			else if (bpp <= 8)
> +				range_bpg_offset = get_range_bpg_offset(6,
> ofs_und6[buf_i],
> +									8,
> ofs_und8[buf_i], bpp);
> +			else if (bpp <= 12)
> +				range_bpg_offset = get_range_bpg_offset(8,
> ofs_und8[buf_i],
> +									12,
> ofs_und12[buf_i], bpp);
> +			else if (bpp <= 15)
> +				range_bpg_offset = get_range_bpg_offset(12,
> ofs_und12[buf_i],
> +									15,
> ofs_und15[buf_i], bpp);
> +			else
>  				range_bpg_offset = ofs_und15[buf_i];
> -			}
> 
>  			vdsc_cfg->rc_range_params[buf_i].range_bpg_offset =
>  				range_bpg_offset &
> DSC_RANGE_BPG_OFFSET_MASK;
> --
> 2.40.1
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c b/drivers/gpu/drm/i915/display/intel_vdsc.c
index 6757dbae9ee5..708c6d4da0a2 100644
--- a/drivers/gpu/drm/i915/display/intel_vdsc.c
+++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
@@ -65,6 +65,13 @@  intel_vdsc_set_min_max_qp(struct drm_dsc_config *vdsc_cfg, int buf,
 		intel_lookup_range_max_qp(bpc, buf, bpp, vdsc_cfg->native_420);
 }
 
+static int
+get_range_bpg_offset(int bpp_low, int offset_low, int bpp_high, int offset_high, int bpp)
+{
+	return offset_low + DIV_ROUND_UP((offset_high - offset_low) * (bpp - bpp_low),
+					 (bpp_low - bpp_high));
+}
+
 /*
  * We are using the method provided in DSC 1.2a C-Model in codec_main.c
  * Above method use a common formula to derive values for any combination of DSC
@@ -82,7 +89,7 @@  calculate_rc_params(struct drm_dsc_config *vdsc_cfg)
 	int qp_bpc_modifier = (bpc - 8) * 2;
 	int uncompressed_bpg_rate;
 	int first_line_bpg_offset;
-	u32 res, buf_i, bpp_i;
+	u32 buf_i, bpp_i;
 
 	if (vdsc_cfg->slice_height >= 8)
 		first_line_bpg_offset =
@@ -156,23 +163,19 @@  calculate_rc_params(struct drm_dsc_config *vdsc_cfg)
 			intel_vdsc_set_min_max_qp(vdsc_cfg, buf_i, bpp_i);
 
 			/* Calculate range_bpg_offset */
-			if (bpp <= 8) {
+			if (bpp <= 8)
 				range_bpg_offset = ofs_und4[buf_i];
-			} else if (bpp <= 10) {
-				res = DIV_ROUND_UP(((bpp - 8) *
-						    (ofs_und5[buf_i] - ofs_und4[buf_i])), 2);
-				range_bpg_offset = ofs_und4[buf_i] + res;
-			} else if (bpp <= 12) {
-				res = DIV_ROUND_UP(((bpp - 10) *
-						    (ofs_und6[buf_i] - ofs_und5[buf_i])), 2);
-				range_bpg_offset = ofs_und5[buf_i] + res;
-			} else if (bpp <= 16) {
-				res = DIV_ROUND_UP(((bpp - 12) *
-						    (ofs_und8[buf_i] - ofs_und6[buf_i])), 4);
-				range_bpg_offset = ofs_und6[buf_i] + res;
-			} else {
+			else if (bpp <= 10)
+				range_bpg_offset = get_range_bpg_offset(8, ofs_und4[buf_i],
+									10, ofs_und5[buf_i], bpp);
+			else if (bpp <= 12)
+				range_bpg_offset = get_range_bpg_offset(10, ofs_und5[buf_i],
+									12, ofs_und6[buf_i], bpp);
+			else if (bpp <= 16)
+				range_bpg_offset = get_range_bpg_offset(12, ofs_und6[buf_i],
+									16, ofs_und8[buf_i], bpp);
+			else
 				range_bpg_offset = ofs_und8[buf_i];
-			}
 
 			vdsc_cfg->rc_range_params[buf_i].range_bpg_offset =
 				range_bpg_offset & DSC_RANGE_BPG_OFFSET_MASK;
@@ -198,21 +201,19 @@  calculate_rc_params(struct drm_dsc_config *vdsc_cfg)
 			intel_vdsc_set_min_max_qp(vdsc_cfg, buf_i, bpp_i);
 
 			/* Calculate range_bpg_offset */
-			if (bpp <= 6) {
+			if (bpp <= 6)
 				range_bpg_offset = ofs_und6[buf_i];
-			} else if (bpp <= 8) {
-				res = DIV_ROUND_UP(((bpp - 6) *
-						    (ofs_und8[buf_i] - ofs_und6[buf_i])), 2);
-				range_bpg_offset = ofs_und6[buf_i] + res;
-			} else if (bpp <= 12) {
-				range_bpg_offset = ofs_und8[buf_i];
-			} else if (bpp <= 15) {
-				res = DIV_ROUND_UP(((bpp - 12) *
-						    (ofs_und15[buf_i] - ofs_und12[buf_i])), 3);
-				range_bpg_offset = ofs_und12[buf_i] + res;
-			} else {
+			else if (bpp <= 8)
+				range_bpg_offset = get_range_bpg_offset(6, ofs_und6[buf_i],
+									8, ofs_und8[buf_i], bpp);
+			else if (bpp <= 12)
+				range_bpg_offset = get_range_bpg_offset(8, ofs_und8[buf_i],
+									12, ofs_und12[buf_i], bpp);
+			else if (bpp <= 15)
+				range_bpg_offset = get_range_bpg_offset(12, ofs_und12[buf_i],
+									15, ofs_und15[buf_i], bpp);
+			else
 				range_bpg_offset = ofs_und15[buf_i];
-			}
 
 			vdsc_cfg->rc_range_params[buf_i].range_bpg_offset =
 				range_bpg_offset & DSC_RANGE_BPG_OFFSET_MASK;