From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH v2] drm/i915: Account for scale factor when calculating initial phase
Date: Tue, 13 Nov 2018 18:00:11 +0200 [thread overview]
Message-ID: <20181113160011.GA9144@intel.com> (raw)
In-Reply-To: <4ae08803-2955-74a4-39f8-3c636773e027@gmail.com>
On Fri, Nov 02, 2018 at 11:47:13AM +0200, Juha-Pekka Heikkila wrote:
> This seems to fix some DRM_FORMAT_RGB565 (up-)scaling IGT tests on on my
> KBL.
>
> Tested-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Pushed with Maarten's irc r-b and t-b. Thanks for the review and
testing.
>
> On 29.10.2018 20:18, Ville Syrjala wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> >
> > To get the initial phase correct we need to account for the scale
> > factor as well. I forgot this initially and was mostly looking at
> > heavily upscaled content where the minor difference between -0.5
> > and the proper initial phase was not readily apparent.
> >
> > And let's toss in a comment that tries to explain the formula
> > a little bit.
> >
> > v2: The initial phase upper limit is 1.5, not 24.0!
> >
> > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> > Fixes: 0a59952b24e2 ("drm/i915: Configure SKL+ scaler initial phase correctly")
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> > drivers/gpu/drm/i915/intel_display.c | 45 ++++++++++++++++++++++++++--
> > drivers/gpu/drm/i915/intel_drv.h | 2 +-
> > drivers/gpu/drm/i915/intel_sprite.c | 20 +++++++++----
> > 3 files changed, 57 insertions(+), 10 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index fe045abb6472..33dd2e9751e6 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -4786,8 +4786,31 @@ static void cpt_verify_modeset(struct drm_device *dev, int pipe)
> > * chroma samples for both of the luma samples, and thus we don't
> > * actually get the expected MPEG2 chroma siting convention :(
> > * The same behaviour is observed on pre-SKL platforms as well.
> > + *
> > + * Theory behind the formula (note that we ignore sub-pixel
> > + * source coordinates):
> > + * s = source sample position
> > + * d = destination sample position
> > + *
> > + * Downscaling 4:1:
> > + * -0.5
> > + * | 0.0
> > + * | | 1.5 (initial phase)
> > + * | | |
> > + * v v v
> > + * | s | s | s | s |
> > + * | d |
> > + *
> > + * Upscaling 1:4:
> > + * -0.5
> > + * | -0.375 (initial phase)
> > + * | | 0.0
> > + * | | |
> > + * v v v
> > + * | s |
> > + * | d | d | d | d |
> > */
> > -u16 skl_scaler_calc_phase(int sub, bool chroma_cosited)
> > +u16 skl_scaler_calc_phase(int sub, int scale, bool chroma_cosited)
> > {
> > int phase = -0x8000;
> > u16 trip = 0;
> > @@ -4795,6 +4818,15 @@ u16 skl_scaler_calc_phase(int sub, bool chroma_cosited)
> > if (chroma_cosited)
> > phase += (sub - 1) * 0x8000 / sub;
> >
> > + phase += scale / (2 * sub);
> > +
> > + /*
> > + * Hardware initial phase limited to [-0.5:1.5].
> > + * Since the max hardware scale factor is 3.0, we
> > + * should never actually excdeed 1.0 here.
> > + */
> > + WARN_ON(phase < -0x8000 || phase > 0x18000);
> > +
> > if (phase < 0)
> > phase = 0x10000 + phase;
> > else
> > @@ -5003,13 +5035,20 @@ static void skylake_pfit_enable(const struct intel_crtc_state *crtc_state)
> >
> > if (crtc_state->pch_pfit.enabled) {
> > u16 uv_rgb_hphase, uv_rgb_vphase;
> > + int pfit_w, pfit_h, hscale, vscale;
> > int id;
> >
> > if (WARN_ON(crtc_state->scaler_state.scaler_id < 0))
> > return;
> >
> > - uv_rgb_hphase = skl_scaler_calc_phase(1, false);
> > - uv_rgb_vphase = skl_scaler_calc_phase(1, false);
> > + pfit_w = (crtc_state->pch_pfit.size >> 16) & 0xFFFF;
> > + pfit_h = crtc_state->pch_pfit.size & 0xFFFF;
> > +
> > + hscale = (crtc_state->pipe_src_w << 16) / pfit_w;
> > + vscale = (crtc_state->pipe_src_h << 16) / pfit_h;
> > +
> > + uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
> > + uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
> >
> > id = scaler_state->scaler_id;
> > I915_WRITE(SKL_PS_CTRL(pipe, id), PS_SCALER_EN |
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> > index db24308729b4..86d551a331b1 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -1709,7 +1709,7 @@ void intel_mode_from_pipe_config(struct drm_display_mode *mode,
> > void intel_crtc_arm_fifo_underrun(struct intel_crtc *crtc,
> > struct intel_crtc_state *crtc_state);
> >
> > -u16 skl_scaler_calc_phase(int sub, bool chroma_center);
> > +u16 skl_scaler_calc_phase(int sub, int scale, bool chroma_center);
> > int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state);
> > int skl_max_scale(const struct intel_crtc_state *crtc_state,
> > u32 pixel_format);
> > diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> > index cfaddc05fea6..fbb916506c77 100644
> > --- a/drivers/gpu/drm/i915/intel_sprite.c
> > +++ b/drivers/gpu/drm/i915/intel_sprite.c
> > @@ -326,27 +326,35 @@ skl_program_scaler(struct drm_i915_private *dev_priv,
> > uint32_t crtc_h = drm_rect_height(&plane_state->base.dst);
> > u16 y_hphase, uv_rgb_hphase;
> > u16 y_vphase, uv_rgb_vphase;
> > + int hscale, vscale;
> >
> > /* Sizes are 0 based */
> > crtc_w--;
> > crtc_h--;
> >
> > + hscale = drm_rect_calc_hscale(&plane_state->base.src,
> > + &plane_state->base.dst,
> > + 0, INT_MAX);
> > + vscale = drm_rect_calc_vscale(&plane_state->base.src,
> > + &plane_state->base.dst,
> > + 0, INT_MAX);
> > +
> > /* TODO: handle sub-pixel coordinates */
> > if (plane_state->base.fb->format->format == DRM_FORMAT_NV12 &&
> > !icl_is_hdr_plane(plane)) {
> > - y_hphase = skl_scaler_calc_phase(1, false);
> > - y_vphase = skl_scaler_calc_phase(1, false);
> > + y_hphase = skl_scaler_calc_phase(1, hscale, false);
> > + y_vphase = skl_scaler_calc_phase(1, vscale, false);
> >
> > /* MPEG2 chroma siting convention */
> > - uv_rgb_hphase = skl_scaler_calc_phase(2, true);
> > - uv_rgb_vphase = skl_scaler_calc_phase(2, false);
> > + uv_rgb_hphase = skl_scaler_calc_phase(2, hscale, true);
> > + uv_rgb_vphase = skl_scaler_calc_phase(2, vscale, false);
> > } else {
> > /* not used */
> > y_hphase = 0;
> > y_vphase = 0;
> >
> > - uv_rgb_hphase = skl_scaler_calc_phase(1, false);
> > - uv_rgb_vphase = skl_scaler_calc_phase(1, false);
> > + uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false);
> > + uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false);
> > }
> >
> > I915_WRITE_FW(SKL_PS_CTRL(pipe, scaler_id),
> >
--
Ville Syrjälä
Intel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2018-11-13 16:00 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-29 17:34 [PATCH] drm/i915: Account for scale factor when calculating initial phase Ville Syrjala
2018-10-29 18:18 ` [PATCH v2] " Ville Syrjala
2018-11-02 9:47 ` Juha-Pekka Heikkila
2018-11-13 16:00 ` Ville Syrjälä [this message]
2018-10-29 19:31 ` ✓ Fi.CI.BAT: success for drm/i915: Account for scale factor when calculating initial phase (rev2) Patchwork
2018-10-29 23:16 ` ✓ Fi.CI.IGT: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181113160011.GA9144@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=juhapekka.heikkila@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.