Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/wscons generic support for caching glyphs in video m...



details:   https://anonhg.NetBSD.org/src/rev/c86e4b139419
branches:  trunk
changeset: 777366:c86e4b139419
user:      macallan <macallan%NetBSD.org@localhost>
date:      Thu Feb 16 17:29:21 2012 +0000

description:
generic support for caching glyphs in video memory
for speeding up anti-aliased fonts on slow CPUs

diffstat:

 sys/dev/wscons/files.wscons              |    6 +-
 sys/dev/wscons/wsdisplay_glyphcache.c    |  118 +++++++++++++++++++++++++++++++
 sys/dev/wscons/wsdisplay_glyphcachevar.h |   65 +++++++++++++++++
 3 files changed, 188 insertions(+), 1 deletions(-)

diffs (209 lines):

diff -r c8b5492e9472 -r c86e4b139419 sys/dev/wscons/files.wscons
--- a/sys/dev/wscons/files.wscons       Thu Feb 16 17:25:35 2012 +0000
+++ b/sys/dev/wscons/files.wscons       Thu Feb 16 17:29:21 2012 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: files.wscons,v 1.45 2011/06/29 03:09:37 macallan Exp $
+# $NetBSD: files.wscons,v 1.46 2012/02/16 17:29:21 macallan Exp $
 
 #
 # "Workstation Console" glue; attaches frame buffer to emulator & keyboard,
@@ -77,3 +77,7 @@
 file   dev/wscons/wsdisplay_vcons.c            vcons
 file   dev/wscons/wsdisplay_vcons_util.c       vcons
 defflag        opt_vcons.h             VCONS_DRAW_INTR VCONS_INTR_DEBUG
+
+# generic support code for caching rendered glyphs in video memory
+define glyphcache
+file   dev/wscons/wsdisplay_glyphcache.c       glyphcache
diff -r c8b5492e9472 -r c86e4b139419 sys/dev/wscons/wsdisplay_glyphcache.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/wscons/wsdisplay_glyphcache.c     Thu Feb 16 17:29:21 2012 +0000
@@ -0,0 +1,118 @@
+/*     $NetBSD: wsdisplay_glyphcache.c,v 1.1 2012/02/16 17:29:21 macallan Exp $        */
+
+/*
+ * Copyright (c) 2012 Michael Lorenz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* 
+ * a simple glyph cache in offscreen memory
+ * For now it only caches glyphs with the default attribute ( assuming they're
+ * the most commonly used glyphs ) but the API should at least not prevent
+ * more sophisticated caching algorithms
+ */
+
+#include <sys/atomic.h>
+#include <sys/errno.h>
+#include <dev/wscons/wsdisplay_glyphcachevar.h>
+
+/* first line, lines, width, attr */
+int
+glyphcache_init(glyphcache *gc, int first, int lines, int width,
+    int cellwidth, int cellheight, long attr)
+{
+       int cache_lines;
+
+       gc->gc_cellwidth = cellwidth;
+       gc->gc_cellheight = cellheight;
+       gc->gc_firstline = first;
+       gc->gc_cellsperline = width / cellwidth;
+       cache_lines = lines / cellheight;
+       gc->gc_numcells = cache_lines * gc->gc_cellsperline;
+       if (gc->gc_numcells > 256)
+               gc->gc_numcells = 256;
+       gc->gc_attr = attr;
+       glyphcache_wipe(gc);
+       return 0;
+}
+
+void
+glyphcache_wipe(glyphcache *gc)
+{
+       int i;
+
+       gc->gc_usedcells = 0;
+       for (i = 0; i < 256; i++)
+               gc->gc_map[i] = -1;
+}
+
+/*
+ * add a glyph drawn at (x,y) to the cache as (c)
+ * call this only if glyphcache_try() returned GC_ADD
+ * caller or gc_bitblt must make sure the glyph is actually completely drawn
+ */
+int
+glyphcache_add(glyphcache *gc, int c, int x, int y)
+{
+       int cell;
+       int cx, cy;
+
+       if (gc->gc_map[c] != -1)
+               return EINVAL;
+       if (gc->gc_usedcells >= gc->gc_numcells)
+               return ENOMEM;
+       cell = atomic_add_int_nv(&gc->gc_usedcells, 1) - 1;
+       gc->gc_map[c] = cell;
+       cy = gc->gc_firstline +
+           (cell / gc->gc_cellsperline) * gc->gc_cellheight;
+       cx = (cell % gc->gc_cellsperline) * gc->gc_cellwidth;
+       gc->gc_bitblt(gc->gc_blitcookie, x, y, cx, cy,
+           gc->gc_cellwidth, gc->gc_cellheight, gc->gc_rop);
+       return 0;
+}
+
+/*
+ * check if (c) is in the cache, if so draw it at (x,y)
+ * return:
+ * - GC_OK when the glyph was found
+ * - GC_ADD when the glyph wasn't found but can be added
+ * - GC_NOPE when the glyph can't be cached
+ */
+int
+glyphcache_try(glyphcache *gc, int c, int x, int y, long attr)
+{
+       int cell, cx, cy;
+       if ((c < 0) || (c > 255) || (attr != gc->gc_attr))
+               return GC_NOPE;
+       if (gc->gc_usedcells >= gc->gc_numcells)
+               return GC_NOPE;
+       cell = gc->gc_map[c];
+       if (cell == -1)
+               return GC_ADD;
+       cy = gc->gc_firstline +
+           (cell / gc->gc_cellsperline) * gc->gc_cellheight;
+       cx = (cell % gc->gc_cellsperline) * gc->gc_cellwidth;
+       gc->gc_bitblt(gc->gc_blitcookie, cx, cy, x, y,
+           gc->gc_cellwidth, gc->gc_cellheight, gc->gc_rop);
+       return GC_OK;
+}
diff -r c8b5492e9472 -r c86e4b139419 sys/dev/wscons/wsdisplay_glyphcachevar.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/wscons/wsdisplay_glyphcachevar.h  Thu Feb 16 17:29:21 2012 +0000
@@ -0,0 +1,65 @@
+/*     $NetBSD: wsdisplay_glyphcachevar.h,v 1.1 2012/02/16 17:29:21 macallan Exp $     */
+
+/*
+ * Copyright (c) 2012 Michael Lorenz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* a simple glyph cache in offscreen memory */
+
+#ifndef WSDISPLAY_GLYPHCACHEVAR_H
+#define WSDISPLAY_GLYPHCACHEVAR_H
+
+typedef struct _glyphcache {
+       /* mapping char codes to cache cells */
+       volatile unsigned int gc_usedcells;
+       int gc_numcells;
+       int gc_map[256];
+       /* geometry */
+       int gc_cellwidth;
+       int gc_cellheight;
+       int gc_cellsperline;
+       int gc_firstline;       /* first line in vram to use for glyphs */
+       long gc_attr;
+       /*
+        * method to copy glyphs within vram,
+        * to be initialized before calling glyphcache_init()
+        */
+       void (*gc_bitblt)(void *, int, int, int, int, int, int, int);
+       void *gc_blitcookie;
+       int gc_rop;
+} glyphcache;
+
+/* first line, lines, width, cellwidth, cellheight, attr */
+int glyphcache_init(glyphcache *, int, int, int, int, int, long);
+/* clear out the cache, for example when returning from X */
+void glyphcache_wipe(glyphcache *);
+/* add a glyph to the cache */
+int glyphcache_add(glyphcache *, int, int, int); /* char code, x, y */
+/* try to draw a glyph from the cache */
+int glyphcache_try(glyphcache *, int, int, int, long); /* char code, x, y, attr */
+#define        GC_OK   0 /* glyph was in cache and has been drawn */
+#define GC_ADD 1 /* glyph is not in cache but can be added */
+#define GC_NOPE 2 /* glyph is not in cache and can't be added */
+
+#endif /* WSDISPLAY_GLYPHCACHEVAR_H */
\ No newline at end of file



Home | Main Index | Thread Index | Old Index