Index | Thread | Search

From:
Crystal Kolipe <kolipe.c@exoticsilicon.com>
Subject:
Re: rasops32: fix fonts on byte swapped framebuffers
To:
Ted Bullock <tbullock@comlore.com>, tech@openbsd.org
Date:
Thu, 08 Oct 2026 12:19:02 -0000

Download raw body.

Thread
  • Crystal Kolipe:

    rasops32: fix fonts on byte swapped framebuffers

  • On Thu, Oct 08, 2026 at 11:33:57AM -0000, Crystal Kolipe wrote:
    > The attached patch replaces the union-based type punning with bit-shifting.
    
    Here is a cleaner version.  The elaborate array initialisation using:
    
    > ((uint64_t)((uint64_t)b * 0x100000001)) ^ (((i & 1)) * R_DH)
    >     ^ (((i & 2) >> 1) * R_DL)
    
    ... in the previous version was left over from trying to do the calculation on
    the fly for each pixel pair, (which was significantly slower).
    
    
    --- rasops32.c
    +++ rasops32.c
    @@ -68,10 +68,7 @@
     	uint32_t fb, clr[2];
     	struct rasops_info *ri;
     	int64_t *rp;
    -	union {
    -		int64_t q[4];
    -		int32_t d[4][2];
    -	} u;
    +	uint64_t u_dot_q[4];
     	u_char *fr;
     
     	ri = (struct rasops_info *)cookie;
    @@ -93,11 +90,12 @@
     
     	b = ri->ri_devcmap[(attr >> 16) & 0xf];
     	f = ri->ri_devcmap[(attr >> 24) & 0xf];
    -	u.d[0][0] = b; u.d[0][1] = b;
    -	u.d[1][0] = b; u.d[1][1] = f;
    -	u.d[2][0] = f; u.d[2][1] = b;
    -	u.d[3][0] = f; u.d[3][1] = f;
     
    +	u_dot_q[0] = (uint64_t)b | (uint64_t)b << 32;
    +	u_dot_q[1] = (uint64_t)b | (uint64_t)f << 32;
    +	u_dot_q[2] = (uint64_t)f | (uint64_t)b << 32;
    +	u_dot_q[3] = (uint64_t)f | (uint64_t)f << 32;
    +
     	if (uc == ' ') {
     		while (height--) {
     			/* the general, pixel-at-a-time case is fast enough */
    @@ -115,9 +113,9 @@
     		case 6:
     			while (height--) {
     				fb = fr[0];
    -				rp[0] = u.q[fb >> 6];
    -				rp[1] = u.q[(fb >> 4) & 3];
    -				rp[2] = u.q[(fb >> 2) & 3];
    +				rp[0] = u_dot_q[fb >> 6];
    +				rp[1] = u_dot_q[(fb >> 4) & 3];
    +				rp[2] = u_dot_q[(fb >> 2) & 3];
     				rp += step;
     				fr += 1;
     			}
    @@ -126,10 +124,10 @@
     		case 8:
     			while (height--) {
     				fb = fr[0];
    -				rp[0] = u.q[fb >> 6];
    -				rp[1] = u.q[(fb >> 4) & 3];
    -				rp[2] = u.q[(fb >> 2) & 3];
    -				rp[3] = u.q[fb & 3];
    +				rp[0] = u_dot_q[fb >> 6];
    +				rp[1] = u_dot_q[(fb >> 4) & 3];
    +				rp[2] = u_dot_q[(fb >> 2) & 3];
    +				rp[3] = u_dot_q[fb & 3];
     				rp += step;
     				fr += 1;
     			}
    @@ -138,13 +136,13 @@
     		case 12:
     			while (height--) {
     				fb = fr[0];
    -				rp[0] = u.q[fb >> 6];
    -				rp[1] = u.q[(fb >> 4) & 3];
    -				rp[2] = u.q[(fb >> 2) & 3];
    -				rp[3] = u.q[fb & 3];
    +				rp[0] = u_dot_q[fb >> 6];
    +				rp[1] = u_dot_q[(fb >> 4) & 3];
    +				rp[2] = u_dot_q[(fb >> 2) & 3];
    +				rp[3] = u_dot_q[fb & 3];
     				fb = fr[1];
    -				rp[4] = u.q[fb >> 6];
    -				rp[5] = u.q[(fb >> 4) & 3];
    +				rp[4] = u_dot_q[fb >> 6];
    +				rp[5] = u_dot_q[(fb >> 4) & 3];
     				rp += step;
     				fr += 2;
     			}
    @@ -153,15 +151,15 @@
     		case 16:
     			while (height--) {
     				fb = fr[0];
    -				rp[0] = u.q[fb >> 6];
    -				rp[1] = u.q[(fb >> 4) & 3];
    -				rp[2] = u.q[(fb >> 2) & 3];
    -				rp[3] = u.q[fb & 3];
    +				rp[0] = u_dot_q[fb >> 6];
    +				rp[1] = u_dot_q[(fb >> 4) & 3];
    +				rp[2] = u_dot_q[(fb >> 2) & 3];
    +				rp[3] = u_dot_q[fb & 3];
     				fb = fr[1];
    -				rp[4] = u.q[fb >> 6];
    -				rp[5] = u.q[(fb >> 4) & 3];
    -				rp[6] = u.q[(fb >> 2) & 3];
    -				rp[7] = u.q[fb & 3];
    +				rp[4] = u_dot_q[fb >> 6];
    +				rp[5] = u_dot_q[(fb >> 4) & 3];
    +				rp[6] = u_dot_q[(fb >> 2) & 3];
    +				rp[7] = u_dot_q[fb & 3];
     				rp += step;
     				fr += 2;
     			}
    @@ -170,25 +168,25 @@
     		case 32:
     			while (height--) {
     				fb = fr[0];
    -				rp[0] = u.q[fb >> 6];
    -				rp[1] = u.q[(fb >> 4) & 3];
    -				rp[2] = u.q[(fb >> 2) & 3];
    -				rp[3] = u.q[fb & 3];
    +				rp[0] = u_dot_q[fb >> 6];
    +				rp[1] = u_dot_q[(fb >> 4) & 3];
    +				rp[2] = u_dot_q[(fb >> 2) & 3];
    +				rp[3] = u_dot_q[fb & 3];
     				fb = fr[1];
    -				rp[4] = u.q[fb >> 6];
    -				rp[5] = u.q[(fb >> 4) & 3];
    -				rp[6] = u.q[(fb >> 2) & 3];
    -				rp[7] = u.q[fb & 3];
    +				rp[4] = u_dot_q[fb >> 6];
    +				rp[5] = u_dot_q[(fb >> 4) & 3];
    +				rp[6] = u_dot_q[(fb >> 2) & 3];
    +				rp[7] = u_dot_q[fb & 3];
     				fb = fr[2];
    -				rp[8] = u.q[fb >> 6];
    -				rp[9] = u.q[(fb >> 4) & 3];
    -				rp[10] = u.q[(fb >> 2) & 3];
    -				rp[11] = u.q[fb & 3];
    +				rp[8] = u_dot_q[fb >> 6];
    +				rp[9] = u_dot_q[(fb >> 4) & 3];
    +				rp[10] = u_dot_q[(fb >> 2) & 3];
    +				rp[11] = u_dot_q[fb & 3];
     				fb = fr[3];
    -				rp[12] = u.q[fb >> 6];
    -				rp[13] = u.q[(fb >> 4) & 3];
    -				rp[14] = u.q[(fb >> 2) & 3];
    -				rp[15] = u.q[fb & 3];
    +				rp[12] = u_dot_q[fb >> 6];
    +				rp[13] = u_dot_q[(fb >> 4) & 3];
    +				rp[14] = u_dot_q[(fb >> 2) & 3];
    +				rp[15] = u_dot_q[fb & 3];
     				rp += step;
     				fr += 4;
     			}
    
    
  • Crystal Kolipe:

    rasops32: fix fonts on byte swapped framebuffers