Commit 41fd6f0a authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm/format-helper: Implement drm_fb_swab() with per-line helpers

Replace the inner loop of drm_fb_swab() with helper functions that
swap the bytes in each pixel. This will allow to share the outer
loop with other conversion helpers.
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220427141409.22842-2-tzimmermann@suse.de
parent 1bb533b6
......@@ -100,6 +100,26 @@ void drm_fb_memcpy_toio(void __iomem *dst, unsigned int dst_pitch, const void *v
}
EXPORT_SYMBOL(drm_fb_memcpy_toio);
static void drm_fb_swab16_line(void *dbuf, const void *sbuf, unsigned int pixels)
{
u16 *dbuf16 = dbuf;
const u16 *sbuf16 = sbuf;
const u16 *send16 = sbuf16 + pixels;
while (sbuf16 < send16)
*dbuf16++ = swab16(*sbuf16++);
}
static void drm_fb_swab32_line(void *dbuf, const void *sbuf, unsigned int pixels)
{
u32 *dbuf32 = dbuf;
const u32 *sbuf32 = sbuf;
const u32 *send32 = sbuf32 + pixels;
while (sbuf32 < send32)
*dbuf32++ = swab32(*sbuf32++);
}
/**
* drm_fb_swab - Swap bytes into clip buffer
* @dst: Destination buffer
......@@ -120,12 +140,11 @@ void drm_fb_swab(void *dst, unsigned int dst_pitch, const void *src,
bool cached)
{
u8 cpp = fb->format->cpp[0];
size_t len = drm_rect_width(clip) * cpp;
const u16 *src16;
const u32 *src32;
u16 *dst16;
u32 *dst32;
unsigned int x, y;
unsigned long linepixels = drm_rect_width(clip);
size_t len = linepixels * cpp;
const void *sbuf;
void *dbuf;
unsigned int y;
void *buf = NULL;
if (WARN_ON_ONCE(cpp != 2 && cpp != 4))
......@@ -133,31 +152,22 @@ void drm_fb_swab(void *dst, unsigned int dst_pitch, const void *src,
if (!dst_pitch)
dst_pitch = len;
src += clip_offset(clip, fb->pitches[0], cpp);
if (!cached)
buf = kmalloc(len, GFP_KERNEL);
src += clip_offset(clip, fb->pitches[0], cpp);
for (y = clip->y1; y < clip->y2; y++) {
if (buf) {
memcpy(buf, src, len);
src16 = buf;
src32 = buf;
} else {
src16 = src;
src32 = src;
}
dst16 = dst;
dst32 = dst;
if (buf)
sbuf = memcpy(buf, src, len);
else
sbuf = src;
dbuf = dst + clip->x1 * cpp;
for (x = clip->x1; x < clip->x2; x++) {
if (cpp == 4)
*dst32++ = swab32(*src32++);
drm_fb_swab32_line(dbuf, sbuf, linepixels);
else
*dst16++ = swab16(*src16++);
}
drm_fb_swab16_line(dbuf, sbuf, linepixels);
src += fb->pitches[0];
dst += dst_pitch;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment