On Thu, Dec 19, 2024 at 06:02:25PM +0200, Ville Syrjälä wrote: > On Thu, Dec 12, 2024 at 08:03:28PM +0530, Nemesa Garg wrote: > > In panel fitter/pipe scaler scenario the pch_pfit configuration > > currently takes place before accounting for pipe_src width for > > joiner. This causes issue when pch_pfit and joiner get enabled > > together.So once pipe src is computed adjust the pfit_dst. > > It can be done by computing per pipe output area first and then > > and then find the intersection of above area with pfit_dst and > > then adjust the coordinates. > > > > Signed-off-by: Nemesa Garg <nemesa.garg@xxxxxxxxx> > > --- > > drivers/gpu/drm/i915/display/intel_display.c | 41 ++++++++++++++++++++ > > 1 file changed, 41 insertions(+) > > > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > > index 21319f753a34..7be2ea11b8b0 100644 > > --- a/drivers/gpu/drm/i915/display/intel_display.c > > +++ b/drivers/gpu/drm/i915/display/intel_display.c > > @@ -2563,6 +2563,36 @@ static int intel_crtc_compute_pipe_src(struct intel_crtc_state *crtc_state) > > return 0; > > } > > > > +/* > > + * The x-coordinate for Primary should be calculated in such a way > > + * that it remains consistent whether the pipes are joined or not. > > + * This means we need to consider the full width of the display even > > + * when the pipes are joined. The x-coordinate for secondaries is 0 > > + * because it starts at the leftmost point of its own display area, > > + * ensuring that the framebuffer is centered within Pipe B’s portion > > + * of the overall display. > > + */ > > +static int intel_crtc_compute_pfit(struct intel_atomic_state *state, > > + struct intel_crtc_state *crtc_state) > > +{ > > + struct drm_display_mode *mode = &crtc_state->hw.pipe_mode; > > const struct drm_display_mode *pipe_mode = ... > > > + struct drm_rect area; > > + > > + if (!crtc_state->pch_pfit.enabled) > > + return 0; > > + > > + drm_rect_init(&area, 0, 0, > > This needs a proper x offset to match the pipe's positon in > the overall screen layout (can be determined similarly to > intel_joiner_adjust_pipe_src(), except using crtc_hdisplay > as the width instead of the pipe_src width). > > > + mode->crtc_hdisplay, > > + mode->crtc_vdisplay); > > + > > + if (!drm_rect_intersect(&crtc_state->pch_pfit.dst, &area)) > > + return -EINVAL; > > + > > + drm_rect_translate(&crtc_state->pch_pfit.dst, -area.x1, -area.y1); > > And this needs to remove the same offset we added originally. Hmm. Now that I looked at this a bit I think we need a lot more than this to make things actually work correctly. I think what we need is roughly: - move pipesrc/pfit.dst/pixel_rate calculations out from intel_crtc_compute_config() into some new function (could call it something like intel_crtc_compute_config_final(()) which needs to be called after the joiner state copy has been performed (ie. where we now call intel_joiner_adjust_pipe_src() in intel_atomic_check()). - redesign the pipesrc readout to iterate through all the joined pipes to accumulate the x offset for the pipes, since not all the joined pipes necessarily have the same pipesrc width - reuse the same for the uapi.mode hdisplay/vdisplay fixup - steal the scaled clipping code from intel_atomic_plane_check_clipping() to properly calculate both pipesrc and pfit.dst -- Ville Syrjälä Intel