From 623f3ccbe301270b0a73f17720432ba4393a34db Mon Sep 17 00:00:00 2001 From: Werner Almesberger Date: Fri, 29 Apr 2011 13:04:02 -0300 Subject: [PATCH] ubb-vga2: non-contiguous allocation of frame buffer memory - ubb-vga.h (calloc_phys_vec), physmem.c: non-contiguous memory allocator (for now, without really considering any mapping to physical memory) - Makefile (OBJS): added physmem.o - ubb-vga.h (grabfb), grabfb.c (grabfb): API change for non-contiguous frame buffer - ubb-vga.h (ppmimg), ppmimg.c (convert, ppmimg): API change for non-contiguous frame buffer - ubb-vga.h (tstimg), tstimg.c (pixel, color_bars, grill, grid, sides, dot, line45, arc, printc, text, ctext, tstimg): API change for non-contiguous frame buffer - tstimg.c (tstimg): we no longer need to clear the frame buffer - ubb-vga.c (frame, session, main): use a vector of line buffers instead of a contiguous frame buffer --- ubb-vga/Makefile | 2 +- ubb-vga/grabfb.c | 10 ++++++---- ubb-vga/physmem.c | 35 +++++++++++++++++++++++++++++++++++ ubb-vga/ppmimg.c | 11 +++++++---- ubb-vga/tstimg.c | 27 +++++++++++++-------------- ubb-vga/ubb-vga.h | 10 +++++++--- ubb-vga/ubb-vga2.c | 21 ++++++++------------- 7 files changed, 77 insertions(+), 39 deletions(-) create mode 100644 ubb-vga/physmem.c diff --git a/ubb-vga/Makefile b/ubb-vga/Makefile index f5d1fa4..e2c329c 100644 --- a/ubb-vga/Makefile +++ b/ubb-vga/Makefile @@ -3,7 +3,7 @@ CC=mipsel-linux-gcc CFLAGS=-Wall -g -O9 -march=mips32 LDFLAGS=-lm -OBJS=ubb-vga2.o grabfb.o tstimg.o ppm.o ppmimg.o ccube.o +OBJS=ubb-vga2.o grabfb.o tstimg.o ppm.o ppmimg.o ccube.o physmem.o .PHONY: all asm sch clean spotless diff --git a/ubb-vga/grabfb.c b/ubb-vga/grabfb.c index 3bd7bb5..29d6191 100644 --- a/ubb-vga/grabfb.c +++ b/ubb-vga/grabfb.c @@ -17,10 +17,10 @@ #include "ubb-vga.h" -void grabfb(void *f, int xres, int yres) +void grabfb(void **f, int xres, int yres) { uint32_t *fb = map(0x01d00000, 4*320*240); - uint8_t *p = f; + uint8_t *p, *q; int x, y; uint32_t pix; uint8_t r, g, b; @@ -28,14 +28,16 @@ void grabfb(void *f, int xres, int yres) assert(xres == 640); assert(yres == 480); for (y = 0; y != 240; y++) { + p = f[y*2]; + q = f[y*2+1]; for (x = 0; x != 320; x++) { pix = *fb++; r = pix >> 16; g = pix >> 8; b = pix; - p[0] = p[320] = ccube_map(r, g, b)*0x11; + *p = *q = ccube_map(r, g, b)*0x11; p++; + q++; } - p += 320; } } diff --git a/ubb-vga/physmem.c b/ubb-vga/physmem.c new file mode 100644 index 0000000..b0921bc --- /dev/null +++ b/ubb-vga/physmem.c @@ -0,0 +1,35 @@ +/* + * physmem.c - Physical memory allocator + * + * Written 2011 by Werner Almesberger + * Copyright 2011 Werner Almesberger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + + +#include +#include +#include + + +/* + * dummy implementation + */ + + +void **calloc_phys_vec(size_t n, size_t size) +{ + void **vec; + int i; + + vec = sbrk(sizeof(void *)*n); + for (i = 0; i != n; i++) { + vec[i] = sbrk(size); + memset(vec[i], 0, size); + } + return vec; +} diff --git a/ubb-vga/ppmimg.c b/ubb-vga/ppmimg.c index 9dc2100..0afb8cd 100644 --- a/ubb-vga/ppmimg.c +++ b/ubb-vga/ppmimg.c @@ -22,25 +22,28 @@ char *img_name; -static void convert(uint8_t *f, int xres, int yres, uint8_t *ppm) +static void convert(void **f, int xres, int yres, uint8_t *ppm) { int x, y; + uint8_t *p; uint8_t v, last = 0; - for (y = 0; y != yres; y++) + for (y = 0; y != yres; y++) { + p = f[y]; for (x = 0; x != xres; x++) { v = ccube_map(ppm[0], ppm[1], ppm[2]); if (x & 1) { - *f++ = last | v; + *p++ = last | v; } else { last = v << 4; } ppm += 3; } + } } -void ppmimg(void *f, int xres, int yres) +void ppmimg(void **f, int xres, int yres) { uint8_t *ppm; int xr = 0, yr = 0; diff --git a/ubb-vga/tstimg.c b/ubb-vga/tstimg.c index be0932b..fc35e25 100644 --- a/ubb-vga/tstimg.c +++ b/ubb-vga/tstimg.c @@ -40,11 +40,11 @@ #define WHITE 0xf -static void pixel(void *f, int xres, int x, int y, uint8_t c) +static void pixel(void **f, int xres, int x, int y, uint8_t c) { uint8_t *p; - p = f+((y*xres+x) >> 1); + p = f[y]+(x >> 1); if (x & 1) *p = (*p & 0xf0) | c; else @@ -61,7 +61,7 @@ static void pixel(void *f, int xres, int x, int y, uint8_t c) #define CBAR_Y1 0.75 -static void color_bars(void *f, int xres, int yres, ...) +static void color_bars(void **f, int xres, int yres, ...) { int i, x, y; uint8_t c; @@ -81,7 +81,7 @@ static void color_bars(void *f, int xres, int yres, ...) #define GRID 50 -static void grill(void *f, int ares, int bres, int swap) +static void grill(void **f, int ares, int bres, int swap) { int n, o; int i, a, b; @@ -119,7 +119,7 @@ static void grill(void *f, int ares, int bres, int swap) } -static void grid(void *f, int xres, int yres) +static void grid(void **f, int xres, int yres) { grill(f, xres, yres, 0); grill(f, yres, xres, 1); @@ -129,7 +129,7 @@ static void grid(void *f, int xres, int yres) /* ----- Diagonal lines meeting at the sides ------------------------------- */ -static void sides(void *f, int xres, int yres) +static void sides(void **f, int xres, int yres) { int i; @@ -151,7 +151,7 @@ static void sides(void *f, int xres, int yres) /* ----- Text -------------------------------------------------------------- */ -static void dot(void *f, int xres, int x, int y, int color, int side) +static void dot(void **f, int xres, int x, int y, int color, int side) { int xi, yi; @@ -161,7 +161,7 @@ static void dot(void *f, int xres, int x, int y, int color, int side) } -static void line45(void *f, int xres, int x, int y, int dx, int dy, int n, +static void line45(void **f, int xres, int x, int y, int dx, int dy, int n, uint8_t color, int side) { while (n--) { @@ -173,7 +173,7 @@ static void line45(void *f, int xres, int x, int y, int dx, int dy, int n, } -static void arc(void *f, int xres, int x, int y, int n, int q, +static void arc(void **f, int xres, int x, int y, int n, int q, uint8_t color, int side) { int dx, dy; @@ -192,7 +192,7 @@ static void arc(void *f, int xres, int x, int y, int n, int q, } -static void printc(void *f, int xres, int x, int y, char c, int n, +static void printc(void **f, int xres, int x, int y, char c, int n, uint8_t color, int side) { switch (c) { @@ -299,7 +299,7 @@ static void printc(void *f, int xres, int x, int y, char c, int n, } -static void text(void *f, int xres, int x, int y, const char *s, int n, +static void text(void **f, int xres, int x, int y, const char *s, int n, uint8_t color, int side) { while (*s) { @@ -311,7 +311,7 @@ static void text(void *f, int xres, int x, int y, const char *s, int n, -static void ctext(void *f, int xres, int x, int y, const char *s, int n, +static void ctext(void **f, int xres, int x, int y, const char *s, int n, uint8_t color, int side) { text(f, xres, x+n*(1-3*(int) strlen(s))/2, y-2*n, s, n, color, side); @@ -321,11 +321,10 @@ static void ctext(void *f, int xres, int x, int y, const char *s, int n, /* ----- Generate the test image ------------------------------------------- */ -void tstimg(void *f, int xres, int yres) +void tstimg(void **f, int xres, int yres) { char buf[20]; - memset(f, 0, xres*yres/2); grid(f, xres, yres); sides(f, xres, yres); color_bars(f, xres, yres); diff --git a/ubb-vga/ubb-vga.h b/ubb-vga/ubb-vga.h index d0d7b48..fb5cf57 100644 --- a/ubb-vga/ubb-vga.h +++ b/ubb-vga/ubb-vga.h @@ -31,18 +31,22 @@ void *map(off_t addr, size_t size); uint8_t ccube_map(uint8_t r, uint8_t g, uint8_t b); void ccube_init(void); +/* physmem.c */ + +void **calloc_phys_vec(size_t n, size_t size); + /* grabfb.c */ -void grabfb(void *f, int xres, int yres); +void grabfb(void **f, int xres, int yres); /* tstimg.c */ -void tstimg(void *f, int xres, int yres); +void tstimg(void **f, int xres, int yres); /* ppmimg.c */ extern char *img_name; -void ppmimg(void *f, int xres, int yres); +void ppmimg(void **f, int xres, int yres); #endif /* !UBB_VGA_H */ diff --git a/ubb-vga/ubb-vga2.c b/ubb-vga/ubb-vga2.c index 6d72306..e201efd 100644 --- a/ubb-vga/ubb-vga2.c +++ b/ubb-vga/ubb-vga2.c @@ -328,9 +328,9 @@ static void hdelay(int cycles) } -static void frame(const uint32_t *f) +static void frame(void *const *f) { - const uint32_t *p; + void *const *p; /* VSYNC */ PDDATC = VSYNC; @@ -351,8 +351,8 @@ static void frame(const uint32_t *f) PDDATS = HSYNC; until(mode->line_cycles-US(0.79)); - for (p = f; p != f+mode->yres*mode->line_words; p += mode->line_words) - line(p); + for (p = f; p != f+mode->yres; p++) + line(*p); /* Back porch */ hdelay(14); @@ -362,18 +362,13 @@ static void frame(const uint32_t *f) /* ----- Command-line parsing and main loop -------------------------------- */ -static void session(void (*gen)(void *fb, int xres, int yres), int frames) +static void session(void (*gen)(void **fb, int xres, int yres), int frames) { - uint32_t *f; + void **f; int i; - f = malloc((mode->yres*mode->line_words)*4); - if (!f) { - perror("malloc"); - exit(1); - } - memset(f, 0, sizeof(f)); ccube_init(); + f = calloc_phys_vec(mode->yres, mode->xres/2); gen(f, mode->xres, mode->yres); disable_interrupts(); @@ -400,7 +395,7 @@ static void usage(const char *name) int main(int argc, char *const *argv) { - void (*gen)(void *fb, int xres, int yres) = grabfb; + void (*gen)(void **fb, int xres, int yres) = grabfb; int frames; int c;