Hi tech@,

Now that efifb(4) supports remapping the framebuffer in write combining
mode, it's on par with inteldrm regarding display performance as for as
rasops(9) is concerned.

Therefore, I'm proposing reverting changes which were introduced in
rasops32_putchar() in revision 1.8 [1] as they are now also slowing
things down on efifb(4).

I used a 6.3M text file for testing display performance:
ftp https://norvig.com/big.txt

The inteldrm and efifb tests were done on the same machine, the
radeondrm ones were done on another (faster) machine.

Screen size: 1920x1080
Font size: 16x32

Here are the results (3 runs each) of running: time cat big.txt

inteldrm:

    2m39.52s real     0m00.00s user     2m39.52s system
    2m39.74s real     0m00.00s user     2m39.84s system
    2m39.74s real     0m00.00s user     2m39.77s system

inteldrm (with revert diff applied):

    1m37m76s real     0m00.00s user     1m37m60s system
    1m37m80s real     0m00.00s user     1m37m56s system
    1m37m43s real     0m00.00s user     1m37m47s system

efifb:

    2m40.46s real     0m00.00s user     2m39.43s system
    2m39.49s real     0m00.00s user     2m39.52s system
    2m39.45s real     0m00.00s user     2m39.48s system

efifb (with revert diff applied):

    1m37m66s real     0m00.00s user     1m37m19s system
    1m37m17s real     0m00.00s user     1m37m22s system
    1m37m15s real     0m00.00s user     1m37m20s system

radeondrm:

    4m40.75s real     0m00.00s user     4m39m75s system
    4m39.84s real     0m00.00s user     4m39m85s system
    4m39.68s real     0m00.00s user     4m39m71s system

radeondrm (with revert diff applied):

    0m21.08s real     0m00.00s user     0m21.08s system
    0m21.15s real     0m00.00s user     0m21.05s system
    0m21.10s real     0m00.00s user     0m21.06s system

[1] 
http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/sys/dev/rasops/rasops32.c.diff?r1=1.7&r2=1.8

Comments? OK?

Index: sys/dev/rasops/rasops32.c
===================================================================
RCS file: /cvs/src/sys/dev/rasops/rasops32.c,v
retrieving revision 1.8
diff -u -p -r1.8 rasops32.c
--- sys/dev/rasops/rasops32.c   20 Feb 2017 15:35:05 -0000      1.8
+++ sys/dev/rasops/rasops32.c   18 Mar 2019 08:15:18 -0000
@@ -69,7 +69,6 @@ rasops32_putchar(void *cookie, int row, 
        struct rasops_info *ri;
        int32_t *dp, *rp;
        u_char *fr;
-       uint32_t buffer[64];
 
        ri = (struct rasops_info *)cookie;
 
@@ -91,13 +90,12 @@ rasops32_putchar(void *cookie, int row, 
        clr[1] = ri->ri_devcmap[(attr >> 24) & 0xf];
 
        if (uc == ' ') {
-               for (cnt = 0; cnt < width; cnt++)
-                       buffer[cnt] = clr[0];
                while (height--) {
                        dp = rp;
                        DELTA(rp, ri->ri_stride, int32_t *);
 
-                       memcpy(dp, buffer, width << 2);
+                       for (cnt = width; cnt; cnt--)
+                               *dp++ = clr[0];
                }
        } else {
                uc -= ri->ri_font->firstchar;
@@ -111,11 +109,10 @@ rasops32_putchar(void *cookie, int row, 
                        fr += fs;
                        DELTA(rp, ri->ri_stride, int32_t *);
 
-                       for (cnt = 0; cnt < width; cnt++) {
-                               buffer[cnt] = clr[(fb >> 31) & 1];
+                       for (cnt = width; cnt; cnt--) {
+                               *dp++ = clr[(fb >> 31) & 1];
                                fb <<= 1;
                        }
-                       memcpy(dp, buffer, width << 2);
                }
        }
 

Reply via email to