Re: [PATCH 2/4] drm/format-helper: Add drm_fb_gray8_to_mono_reversed()

From: Pekka Paalanen
Date: Tue Feb 01 2022 - 06:14:01 EST


On Tue, 1 Feb 2022 10:59:43 +0100
Thomas Zimmermann <tzimmermann@xxxxxxx> wrote:

> Hi
>
> Am 31.01.22 um 21:12 schrieb Javier Martinez Canillas:
> > Add support to convert 8-bit grayscale to reversed monochrome for drivers
> > that control monochromatic displays, that only have 1 bit per pixel depth.
> >
> > This helper function was based on repaper_gray8_to_mono_reversed() from
> > the drivers/gpu/drm/tiny/repaper.c driver.
>
> You could convert repaper to the new helper.
>
> >
> > Signed-off-by: Javier Martinez Canillas <javierm@xxxxxxxxxx>
> > ---
> >
> > drivers/gpu/drm/drm_format_helper.c | 35 +++++++++++++++++++++++++++++
> > include/drm/drm_format_helper.h | 2 ++
> > 2 files changed, 37 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/drm_format_helper.c b/drivers/gpu/drm/drm_format_helper.c
> > index 0f28dd2bdd72..bf477c136082 100644
> > --- a/drivers/gpu/drm/drm_format_helper.c
> > +++ b/drivers/gpu/drm/drm_format_helper.c
> > @@ -584,3 +584,38 @@ int drm_fb_blit_toio(void __iomem *dst, unsigned int dst_pitch, uint32_t dst_for
> > return -EINVAL;
> > }
> > EXPORT_SYMBOL(drm_fb_blit_toio);
> > +
> > +/**
> > + * drm_fb_gray8_to_mono_reversed - Convert grayscale to reversed monochrome
> > + * @dst: reversed monochrome destination buffer
> > + * @src: 8-bit grayscale source buffer
> > + * @clip: Clip rectangle area to copy
> > + *
> > + * DRM doesn't have native monochrome or grayscale support.
> > + * Such drivers can announce the commonly supported XR24 format to userspace
> > + * and use drm_fb_xrgb8888_to_gray8() to convert to grayscale and then this
> > + * helper function to convert to the native format.
> > + */
> > +void drm_fb_gray8_to_mono_reversed(void *dst, void *src, const struct drm_rect *clip)
>
> IMHO it would be better to have a function that converts xrgb8888 to
> mono and let it handle the intermediate step of gray8.
>
> > +{
> > + size_t width = drm_rect_width(clip);
> > + size_t height = drm_rect_width(clip);
> > +
> > + u8 *mono = dst, *gray8 = src;
> > + unsigned int y, xb, i;
> > +
> > + for (y = 0; y < height; y++)
> > + for (xb = 0; xb < width / 8; xb++) {
>
> The inner loop should probably go into a separate helper function. See
> the drm_fb_*_line() helpers in this file
>
> At some point, we's want to have a single blit helper that takes source
> and destination formats/buffers. It would then pick the correct per-line
> helper for the conversion. So yeah, we'd want something composable.

Btw. VKMS is going to do blending, and it needs to support various
formats, so the latest patches from Igor probably do something similar.


Thanks,
pq


>
> Best regards
> Thomas
>
> > + u8 byte = 0x00;
> > +
> > + for (i = 0; i < 8; i++) {
> > + int x = xb * 8 + i;
> > +
> > + byte >>= 1;
> > + if (gray8[y * width + x] >> 7)
> > + byte |= BIT(7);
> > + }
> > + *mono++ = byte;
> > + }
> > +}
> > +EXPORT_SYMBOL(drm_fb_gray8_to_mono_reversed);

Attachment: pgpw4txNqdVvc.pgp
Description: OpenPGP digital signature