[PATCH v4 10/14] drm: amdgpu: Replace drm_fb_get_bpp_depth() with drm_format_plane_cpp()
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Thu Sep 22 06:33:56 UTC 2016
Hi Daniel,
On Thursday 22 Sep 2016 07:31:24 Daniel Vetter wrote:
> On Wed, Sep 21, 2016 at 3:59 PM, Laurent Pinchart wrote:
> > On Wednesday 21 Sep 2016 14:46:07 Daniel Vetter wrote:
> >> On Wed, Sep 21, 2016 at 2:39 PM, Laurent Pinchart wrote:
> >>>>> @@ -82,7 +82,7 @@ int amdgpu_align_pitch(struct amdgpu_device *adev,
> >>>>> int width, int bpp, bool tile
> >>>>>
> >>>>> aligned += pitch_mask;
> >>>>> aligned &= ~pitch_mask;
> >>>>>
> >>>>> - return aligned;
> >>>>> + return aligned * cpp;
> >>>>
> >>>> Now you multiply by cpp after the rounding.
> >>>
> >>> That's right, but I don't think that's a problem, as all bpp values
> >>> returned by drm_fb_get_bpp_depth() are multiple of 8 bits.
> >>
> >> Before we have ALIGN(width * cpp, pitch_mask + 1). With your patch we
> >> have ALIGN(width, pitch_mask + 1) * cpp. In short we overalign, and
> >> instead of e.g. aligning to 256bytes we now align to 256*4 (for
> >> xrgb8888).
> >
> > The current code is
> >
> > mode_cmd->pitches[0] = amdgpu_align_pitch(adev, mode_cmd->width,
> > bpp,
> > fb_tiled) * ((bpp + 1) /
> > 8);
> >
> > As bpp is a multiple of 8, this is equivalent to
> >
> > mode_cmd->pitches[0] = amdgpu_align_pitch(adev, mode_cmd->width,
> > bpp,
> > fb_tiled) * (bpp / 8);
> >
> > The patch replaces the code with
> >
> > mode_cmd->pitches[0] = amdgpu_align_pitch(adev, mode_cmd->width,
> > cpp,
> > fb_tiled);
> >
> > with cpp = bpp / 8, and amdgpu_align_pitch() now returns
> >
> > - return aligned;
> > + return aligned * cpp;
> >
> > So the patch just moves * (bpp / 8) inside the amdgpu_align_pitch()
> > function.
> >
> > The other code path is changed as follows:
> >
> > - args->pitch = amdgpu_align_pitch(adev, args->width, args->bpp, 0)
> > *
> > ((args->bpp + 1) / 8);
> > + args->pitch = amdgpu_align_pitch(adev, args->width,
> > + DIV_ROUND_UP(args->bpp, 8), 0);
> >
> > DIV_ROUND_UP(args->bpp, 8) is equal to ((args->bpp + 1) / 8) for all
> > supported bpp values, so this also moves the multiplication inside the
> > function, without changing the result as far as I can see.
> >
> > Note that amdgpu_align_width() is also changed as follows
> >
> > - switch (bpp / 8) {
> > + switch (cpp) {
> > case 1:
> > pitch_mask = 255;
> > break;
> > case 2:
> > pitch_mask = 127;
> > break;
> > case 3:
> > case 4:
> > pitch_mask = 63;
> > break;
> > }
> >
> > This will change the pitch mask if the bpp value isn't a multiple of 8.
> > However, all the formats we support use multiples of 8 as bpp values, so I
> > don't see a problem here.
>
> All correct. The trouble is that you move the * cpp over the following code:
>
> aligned += pitch_mask;
> aligned &= ~pitch_mask;
>
> Multiplying by 4 (for xrgb8888) before or after aligning to pitch_mask
> does make a difference.
It would, but the multiplication is done *after* that block of code, isn't it
?
aligned += pitch_mask;
aligned &= ~pitch_mask;
- return aligned;
+ return aligned * cpp
--
Regards,
Laurent Pinchart
More information about the dri-devel
mailing list