diff options
Diffstat (limited to 'src/user/lib/draw')
-rw-r--r-- | src/user/lib/draw/draw.c | 83 | ||||
-rw-r--r-- | src/user/lib/draw/flush.c | 43 |
2 files changed, 0 insertions, 126 deletions
diff --git a/src/user/lib/draw/draw.c b/src/user/lib/draw/draw.c deleted file mode 100644 index 1c2a371..0000000 --- a/src/user/lib/draw/draw.c +++ /dev/null @@ -1,83 +0,0 @@ -#include <camellia.h> -#include <camellia/syscalls.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <draw.h> - -void dirty_reset(struct rect *d) { - d->x1 = ~0; d->y1 = ~0; - d->x2 = 0; d->y2 = 0; -} - -void dirty_mark(struct rect *d, uint32_t x, uint32_t y) { - if (d->x1 > x) d->x1 = x; - if (d->x2 < x) d->x2 = x; - if (d->y1 > y) d->y1 = y; - if (d->y2 < y) d->y2 = y; -} - -int fb_setup(struct framebuf *fb, const char *base) { - char path[64], *spec; - size_t pos; - FILE *f; - - f = fopen(base, "r"); - if (!f) return -errno; - - pos = strlen(base); - memcpy(path, base, pos); - spec = path + pos; - fread(spec, 1, sizeof(path) - pos, f); - /* assumes the read went correctly */ - fclose(f); - - fb->fd = camellia_open(path, OPEN_RW); - if (fb->fd < 0) return fb->fd; - - fb->width = strtol(spec, &spec, 0); - if (*spec++ != 'x') return -EINVAL; - fb->height = strtol(spec, &spec, 0); - if (*spec++ != 'x') return -EINVAL; - fb->bpp = strtol(spec, &spec, 0); - if (fb->bpp != 32) return -EINVAL; - - fb->len = _sys_getsize(fb->fd); - fb->pitch = fb->len / fb->height; - fb->b = malloc(fb->len); - - _sys_read(fb->fd, fb->b, fb->len, 0); - - return 0; -} - -int fb_anon(struct framebuf *fb, size_t w, size_t h) { - fb->width = w; - fb->height = h; - fb->bpp = 32; - fb->pitch = fb->width * fb->bpp / 8; - fb->len = fb->pitch * fb->height; - fb->b = malloc(fb->len); - fb->fd = -1; - return 0; -} - -uint32_t *fb_pixel(struct framebuf *fb, uint32_t x, uint32_t y) { - if (x < fb->width && y < fb->height) - return (void*)fb->b + fb->pitch * y + 4 * x; - return NULL; -} - -void fb_cpy( - struct framebuf *dest, const struct framebuf *src, - size_t xd, size_t yd, size_t xs, size_t ys, size_t w, size_t h) -{ - for (size_t y = 0; y < h; y++) { - memcpy( - fb_pixel( dest, xd, yd + y), - fb_pixel((void*)src, xs, ys + y), - w * 4 - ); - } -} diff --git a/src/user/lib/draw/flush.c b/src/user/lib/draw/flush.c deleted file mode 100644 index 88bf3d6..0000000 --- a/src/user/lib/draw/flush.c +++ /dev/null @@ -1,43 +0,0 @@ -#include <camellia/execbuf.h> -#include <camellia/syscalls.h> -#include <draw.h> - -static void flush_combined(struct rect pix, struct framebuf *fb) { - size_t low = fb->pitch * pix.y1 + 4 * pix.x1; - size_t high = fb->pitch * pix.y2 + 4 * pix.y2 + 4; - _sys_write(fb->fd, fb->b + low, high - low, low, 0); -} - -static void flush_split(struct rect pix, struct framebuf *fb) { - static uint64_t execbuf[EXECBUF_MAX_LEN / sizeof(uint64_t)]; - size_t epos = 0; - if (7 * (pix.y2 - pix.y1) * sizeof(uint64_t) >= sizeof execbuf) { - flush_combined(pix, fb); - return; - } - - for (uint32_t y = pix.y1; y < pix.y2; y++) { - size_t low = fb->pitch * y + 4 * pix.x1; - size_t high = fb->pitch * y + 4 * pix.x2 + 4; - - execbuf[epos++] = EXECBUF_SYSCALL; - execbuf[epos++] = _SYS_WRITE; - execbuf[epos++] = fb->fd; - execbuf[epos++] = (uintptr_t)fb->b + low; - execbuf[epos++] = high - low; - execbuf[epos++] = low; - execbuf[epos++] = 0; - } - _sys_execbuf(execbuf, epos * sizeof(uint64_t)); -} - -void dirty_flush(struct rect *d, struct framebuf *fb) { - if (~d->x1 == 0) return; - if (d->x2 >= fb->width) d->x2 = fb->width - 1; - if (d->y2 >= fb->height) d->y2 = fb->height - 1; - - /* the threshold is mostly arbitrary, wasn't based on any real benchmarks */ - if (d->x2 - d->x1 > fb->width - 600) flush_combined(*d, fb); - else flush_split(*d, fb); - dirty_reset(d); -} |