diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-12-10 17:50:06 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-12-10 17:50:06 +0000 |
commit | 2d0ede468ddd363243fd31580e3e86c39b51f7be (patch) | |
tree | 1796526cba0e86cc31f9df6550c728e594f00332 /sys/src/9 | |
parent | 9911557e45d5763320eb612aa6c5965f8ff39007 (diff) |
imx8: cleanup framebuffer code
We can get rid of a bunch of stuff now that we'r using a softscreen.
Get rid of the static Memimage and Memdata for the framebuffer;
just allocate gscreen as a memimage from the image pool.
Avoid exporting fbraw pointer, just have screeninit() return it.
Remove fbmemalloc() function. it used to create a write-thru
mapping but given that we are no more reading the framebuffer,
we can use ucalloc() instead.
Diffstat (limited to 'sys/src/9')
-rw-r--r-- | sys/src/9/imx8/fns.h | 1 | ||||
-rw-r--r-- | sys/src/9/imx8/lcd.c | 15 | ||||
-rw-r--r-- | sys/src/9/imx8/mmu.c | 6 | ||||
-rw-r--r-- | sys/src/9/imx8/screen.c | 62 | ||||
-rw-r--r-- | sys/src/9/imx8/screen.h | 2 |
5 files changed, 37 insertions, 49 deletions
diff --git a/sys/src/9/imx8/fns.h b/sys/src/9/imx8/fns.h index 59622d693..29cf6f3a7 100644 --- a/sys/src/9/imx8/fns.h +++ b/sys/src/9/imx8/fns.h @@ -80,7 +80,6 @@ extern void meminit(void); extern void putasid(Proc*); extern void* ucalloc(usize); -extern void* fbmemalloc(usize); /* clock */ extern void clockinit(void); diff --git a/sys/src/9/imx8/lcd.c b/sys/src/9/imx8/lcd.c index db09bab21..634286000 100644 --- a/sys/src/9/imx8/lcd.c +++ b/sys/src/9/imx8/lcd.c @@ -12,8 +12,6 @@ #include <cursor.h> #include "screen.h" -extern u8int *fbraw; - /* system reset controller registers */ enum { SRC_MIPIPHY_RCR = 0x28/4, @@ -455,7 +453,7 @@ lcdifreset(void) } static void -lcdifinit(struct video_mode *mode) +lcdifinit(struct video_mode *mode, u32int framebuffer) { wr(lcdif, LCDIF_CTRL_CLR, CTRL_SFTRST); while(rr(lcdif, LCDIF_CTRL) & CTRL_SFTRST) @@ -504,8 +502,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(fbraw)); - wr(lcdif, LCDIF_NEXT_BUF, PADDR(fbraw)); + wr(lcdif, LCDIF_CUR_BUF, framebuffer); + wr(lcdif, LCDIF_NEXT_BUF, framebuffer); wr(lcdif, LCDIF_CTRL_SET, CTRL_DOTCLK_MODE); @@ -891,6 +889,7 @@ lcdinit(void) struct dsi_cfg dsi_cfg; struct video_mode mode; char *err; + void *fb; intrenable(IRQlcdif, blankirq, nil, BUSUNKNOWN, "lcdif"); @@ -960,8 +959,8 @@ lcdinit(void) if(err != nil) goto out; - /* allocates the framebuffer (gscreen->data->bdata) */ - if(screeninit(mode.hactive, mode.vactive, 32) < 0){ + /* allocates the framebuffer */ + if((fb = screeninit(mode.hactive, mode.vactive, 32)) == nil){ err = "screeninit failed"; goto out; } @@ -980,7 +979,7 @@ lcdinit(void) bridgeinit(&mode, &dsi_cfg); /* send the pixels */ - lcdifinit(&mode); + lcdifinit(&mode, (u32int)PADDR(fb)); return; out: diff --git a/sys/src/9/imx8/mmu.c b/sys/src/9/imx8/mmu.c index 031514018..56e840fcf 100644 --- a/sys/src/9/imx8/mmu.c +++ b/sys/src/9/imx8/mmu.c @@ -517,9 +517,3 @@ ucalloc(usize size) { return ucramalloc(size, 8, PTEUNCACHED); } - -void* -fbmemalloc(usize size) -{ - return ucramalloc(PGROUND(size), BY2PG, PTEWT); -} diff --git a/sys/src/9/imx8/screen.c b/sys/src/9/imx8/screen.c index a87d6b6d4..d07715715 100644 --- a/sys/src/9/imx8/screen.c +++ b/sys/src/9/imx8/screen.c @@ -16,10 +16,9 @@ enum { }; Memimage *gscreen; -u8int *fbraw; -static Memdata xgdata; -static Memimage xgscreen; +static ulong *fbraw; + static Memimage *conscol; static Memimage *back; static Memsubfont *memdefont; @@ -85,6 +84,7 @@ int hwdraw(Memdrawparam *par) { Memimage *dst, *src, *mask; + uchar *scrd; if((dst = par->dst) == nil || dst->data == nil) return 0; @@ -93,24 +93,25 @@ hwdraw(Memdrawparam *par) if((mask = par->mask) && mask->data == nil) mask = nil; - if(dst->data->bdata == xgdata.bdata) + scrd = gscreen->data->bdata; + if(dst->data->bdata == scrd) swcursoravoid(par->r); - if(src && src->data->bdata == xgdata.bdata) + if(src && src->data->bdata == scrd) swcursoravoid(par->sr); - if(mask && mask->data->bdata == xgdata.bdata) + if(mask && mask->data->bdata == scrd) swcursoravoid(par->mr); return 0; } -int +void* screeninit(int width, int height, int depth) { ulong chan; switch(depth){ default: - return -1; + return nil; case 32: chan = XRGB32; break; @@ -121,46 +122,41 @@ screeninit(int width, int height, int depth) chan = RGB16; break; } - memsetchan(&xgscreen, chan); - xgscreen.r = Rect(0, 0, width, height); - xgscreen.clipr = xgscreen.r; - xgscreen.depth = depth; - xgscreen.width = wordsperline(xgscreen.r, xgscreen.depth); - xgdata.bdata = malloc(xgscreen.width*sizeof(ulong)*height); - xgdata.ref = 1; - - xgscreen.data = &xgdata; - gscreen = &xgscreen; - conf.monitor = 1; + memimageinit(); + + gscreen = allocmemimage(Rect(0, 0, width, height), chan); + if(gscreen == nil) + return nil; - fbraw = fbmemalloc(xgscreen.width*sizeof(ulong)*height); + conf.monitor = 1; + fbraw = ucalloc(PGROUND(gscreen->width*sizeof(ulong)*height)); - memimageinit(); memdefont = getmemdefont(); screenwin(); myscreenputs(kmesg.buf, kmesg.n); screenputs = myscreenputs; swcursorinit(); - return 0; + return fbraw; } void flushmemscreen(Rectangle r) { - int pitch, n, y; + int pitch, n; 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; - } + if(!rectclip(&r, gscreen->r)) + return; + + s = wordaddr(gscreen, r.min); + d = fbraw + (s - wordaddr(gscreen, gscreen->r.min)); + n = bytesperline(r, gscreen->depth); + pitch = wordsperline(gscreen->r, gscreen->depth); + while(r.min.y++ < r.max.y){ + memmove(d, s, n); + d += pitch; + s += pitch; } } diff --git a/sys/src/9/imx8/screen.h b/sys/src/9/imx8/screen.h index fc0b7f582..b8e9821ae 100644 --- a/sys/src/9/imx8/screen.h +++ b/sys/src/9/imx8/screen.h @@ -7,7 +7,7 @@ extern Point mousexy(void); extern void mouseaccelerate(int); /* screen.c */ -extern int screeninit(int width, int hight, int depth); +extern void* screeninit(int width, int hight, int depth); extern void blankscreen(int); extern void flushmemscreen(Rectangle); extern Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*); |