Graphics stuff is weird. It doesn't just care about endianness on the
byte level, but also about endianness on the bit level. This matters
for monochrome framebuffers, where a true big-endian framebuffer will
have the leftmost pixel in the MSB wheras a little-endian framebuffer
will have it in the LSB. The optimized rasops1_putchar8() and
rasops1_putchar16() assume the framebuffer uses the big-endian byte
order since that is how our fonts are encoded. The generic
rasops1_putchar() function assumes native bit order though. This is
inconsistent and confusing.
The diff below disables the optimized functions on little-endian
architectures such that we always use rasops1_putchar(). This makes
ssdfb(4) work with the default 8x16 font on arm64.
ok?
Index: dev/rasops/rasops1.c
===================================================================
RCS file: /cvs/src/sys/dev/rasops/rasops1.c,v
retrieving revision 1.10
diff -u -p -r1.10 rasops1.c
--- dev/rasops/rasops1.c 25 May 2020 09:55:49 -0000 1.10
+++ dev/rasops/rasops1.c 18 Dec 2020 21:19:55 -0000
@@ -44,7 +44,7 @@ int rasops1_copycols(void *, int, int, i
int rasops1_erasecols(void *, int, int, int, uint32_t);
int rasops1_do_cursor(struct rasops_info *);
int rasops1_putchar(void *, int, int col, u_int, uint32_t);
-#ifndef RASOPS_SMALL
+#if defined(RASOPS_SMALL) && BYTE_ORDER == BIG_ENDIAN
int rasops1_putchar8(void *, int, int col, u_int, uint32_t);
int rasops1_putchar16(void *, int, int col, u_int, uint32_t);
#endif
@@ -58,7 +58,7 @@ rasops1_init(struct rasops_info *ri)
rasops_masks_init();
switch (ri->ri_font->fontwidth) {
-#ifndef RASOPS_SMALL
+#if defined(RASOPS_SMALL) && BYTE_ORDER == BIG_ENDIAN
case 8:
ri->ri_ops.putchar = rasops1_putchar8;
break;
@@ -223,7 +223,7 @@ rasops1_putchar(void *cookie, int row, i
return 0;
}
-#ifndef RASOPS_SMALL
+#if defined(RASOPS_SMALL) && BYTE_ORDER == BIG_ENDIAN
/*
* Paint a single character. This is for 8-pixel wide fonts.
*/
@@ -350,7 +350,7 @@ rasops1_putchar16(void *cookie, int row,
return 0;
}
-#endif /* !RASOPS_SMALL */
+#endif /* !defined(RASOPS_SMALL) && BYTE_ORDER == BIG_ENDIAN */
/*
* Grab routines common to depths where (bpp < 8)