lkml.org 
[lkml]   [2006]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [Linux-fbdev-devel] fbmem: is bootup logo broken for monochrome LCD ?

> > Yipes!! Bit reversal. I have never seen that before. Is only the logo
> > messed up? Slow_imageblit can be called if there is no dword alignment
> > for the font bitmaps. So the question is do most if not all our fonts
> > look okay?
> >
>
> No, it's not an only logo issue. Bit reversals happen for all images
> which are passed to slow_imageblit() including all fonts.

I thought so.

> Can it be a 'bit_per_pixel = 1' issue ? It seems that this config has
> not been widely tested.

Nope. I have tested it on 4bpp and above. No monochrome.

> If you look at slow_imageblit() current implementation and for example
> let's say that at the begining of the function we have:
>
> - __LITTLE_ENDIAN is defined
> - bpp = 1
> - fgcolor = 1
> - bgcolor = 0
> - start_index = 0
>
> The function core can be simplified into:
>
> for (i = image->height; i--; ) {
> shift = val = 0;
> l = 8;
> j = image->width;
> dst = (u32 __iomem *) dst1;
> s = src;
>
> while (j--) {
> l--;
> color = (*s & (1 << l)) ? 1 : 0;
> val |= color << shift;
> /* Did the bitshift spill bits
> to the next long? */
> if (shift >= null_bits) {
> FB_WRITEL(val, dst++);
> val = (shift == null_bits) ? 0 :
> FB_SHIFT_LOW(color,32 - shift);
> }
> shift += 1;
> shift &= (32 - 1);
> if (!l) { l = 8; s++; };
> }
>
> [ ...]
>
> Doesn't this bit of code do a bit reversal ? Specially these 2
> following lines of code:
>
> color = (*s & (1 << l)) ? 1 : 0;
> val |= color << shift;
>
>
> with 'l' taking values from 7 to 0, and 'shift' taking values from 0
> to 31.

Lets look at the new code that I have done with your above parameters.

for (i = image->height; i--; ) {
shift = val = 0;
n = image->width;
dst = (u32 __iomem *) dst1;

while (n--) {
if (!s) { src++; s = 32; }
s -= 1;
color = (swapb32p(src) & (1 << s)) ? 1 : 0;
val |= color << shift;

/* Did the bitshift spill bits to the next long? */
if (shift >= 31) {
FB_WRITEL(val, dst++);
val = (shift == 31) ? 0 :(color >> (32 - shift));
}
shift += 1;
shift &= (32 - 1);
}

[ ...]

with 's' taking values from 31 to 0, and 'shift' taking values from 0 to
31. In the case of bits_per_pixel = 1 we have

s -= 1;
color = (swapb32p(src) & (1 << s)) ? 1 : 0;
val |= color << shift;

which reduces to val = color;

I'm I seeing it wrong? BTW what is your visual?



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-11-21 19:05    [W:0.076 / U:0.052 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site