diff options
author | Sigrid Solveig Haflínudóttir <sigrid@ftrv.se> | 2022-12-05 20:11:33 +0000 |
---|---|---|
committer | Sigrid Solveig Haflínudóttir <sigrid@ftrv.se> | 2022-12-05 20:11:33 +0000 |
commit | 744053268d196e8c282d20243600fb33d4df0028 (patch) | |
tree | 27ae184e08d0e34c7c2f0bd7b8b37b13eeca34d1 /sys/src/9 | |
parent | cff0ebade5fb37b3d5614ae9ff76513e4b0e4640 (diff) |
imx8: a simple softscreen
Diffstat (limited to 'sys/src/9')
-rw-r--r-- | sys/src/9/imx8/lcd.c | 6 | ||||
-rw-r--r-- | sys/src/9/imx8/screen.c | 27 |
2 files changed, 24 insertions, 9 deletions
diff --git a/sys/src/9/imx8/lcd.c b/sys/src/9/imx8/lcd.c index ae4a4cf1a..db09bab21 100644 --- a/sys/src/9/imx8/lcd.c +++ b/sys/src/9/imx8/lcd.c @@ -12,7 +12,7 @@ #include <cursor.h> #include "screen.h" -extern Memimage *gscreen; +extern u8int *fbraw; /* system reset controller registers */ enum { @@ -504,8 +504,8 @@ lcdifinit(struct video_mode *mode) wr(lcdif, LCDIF_VDCTRL4, sm(mode->hactive, VDCTRL4_DOTCLK_H_VALID_DATA_CNT)); - wr(lcdif, LCDIF_CUR_BUF, PADDR(gscreen->data->bdata)); - wr(lcdif, LCDIF_NEXT_BUF, PADDR(gscreen->data->bdata)); + wr(lcdif, LCDIF_CUR_BUF, PADDR(fbraw)); + wr(lcdif, LCDIF_NEXT_BUF, PADDR(fbraw)); wr(lcdif, LCDIF_CTRL_SET, CTRL_DOTCLK_MODE); diff --git a/sys/src/9/imx8/screen.c b/sys/src/9/imx8/screen.c index 151b5b0af..a87d6b6d4 100644 --- a/sys/src/9/imx8/screen.c +++ b/sys/src/9/imx8/screen.c @@ -16,6 +16,7 @@ enum { }; Memimage *gscreen; +u8int *fbraw; static Memdata xgdata; static Memimage xgscreen; @@ -125,15 +126,15 @@ screeninit(int width, int height, int depth) xgscreen.clipr = xgscreen.r; xgscreen.depth = depth; xgscreen.width = wordsperline(xgscreen.r, xgscreen.depth); - xgdata.bdata = fbmemalloc(xgscreen.width*sizeof(ulong)*height); + xgdata.bdata = malloc(xgscreen.width*sizeof(ulong)*height); xgdata.ref = 1; xgscreen.data = &xgdata; - gscreen = &xgscreen; - conf.monitor = 1; + fbraw = fbmemalloc(xgscreen.width*sizeof(ulong)*height); + memimageinit(); memdefont = getmemdefont(); screenwin(); @@ -145,12 +146,26 @@ screeninit(int width, int height, int depth) } void -flushmemscreen(Rectangle) +flushmemscreen(Rectangle r) { + int pitch, n, y; + ulong *d, *s; + + if(rectclip(&r, xgscreen.r)){ + s = wordaddr(&xgscreen, r.min); + d = (ulong*)fbraw + (s - wordaddr(&xgscreen, xgscreen.r.min)); + n = bytesperline(r, xgscreen.depth); + pitch = wordsperline(xgscreen.r, xgscreen.depth); + for(y = 0; y < Dy(r); y++){ + memmove(d, s, n); + d += pitch; + s += pitch; + } + } } Memdata* -attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) +attachscreen(Rectangle *r, ulong *chan, int *d, int *width, int *softscreen) { if(gscreen == nil) return nil; @@ -159,7 +174,7 @@ attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) *d = gscreen->depth; *chan = gscreen->chan; *width = gscreen->width; - *softscreen = 0; + *softscreen = 1; gscreen->data->ref++; return gscreen->data; |