From cefc849a9521c9d5ba85d5aa88526d0f4b059db9 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 30 Jan 2019 18:22:52 +0100 Subject: [PATCH] devdraw: get rid of softscreen==0xa110c hack and make attachscreen() return Memdata* all screen implementations use a Memimage* internally for the framebuffer, so we can return a shared reference to its Memdata structure in attachscreen() instead of a framebuffer data pointer. this eleminates the softscreen == 0xa110c hack as we always use shared Memdata* now. --- sys/src/9/bcm/screen.c | 8 ++++++-- sys/src/9/bcm/screen.h | 2 +- sys/src/9/omap/screen.c | 11 ++++++++--- sys/src/9/omap/screen.h | 2 +- sys/src/9/pc/screen.c | 18 +++++------------- sys/src/9/pc/screen.h | 2 +- sys/src/9/port/devdraw.c | 29 +++++------------------------ sys/src/9/sgi/screen.c | 11 ++++++----- sys/src/9/sgi/screen.h | 2 +- sys/src/9/zynq/screen.c | 8 +++----- sys/src/9/zynq/screen.h | 2 +- sys/src/cmd/vnc/devdraw.c | 29 +++++------------------------ sys/src/cmd/vnc/screen.c | 5 +++-- sys/src/cmd/vnc/screen.h | 2 +- 14 files changed, 47 insertions(+), 84 deletions(-) diff --git a/sys/src/9/bcm/screen.c b/sys/src/9/bcm/screen.c index fc0076b78..ec914730e 100644 --- a/sys/src/9/bcm/screen.c +++ b/sys/src/9/bcm/screen.c @@ -171,16 +171,20 @@ flushmemscreen(Rectangle) { } -uchar* +Memdata* attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) { + if(gscreen == nil) + return nil; + *r = gscreen->r; *d = gscreen->depth; *chan = gscreen->chan; *width = gscreen->width; *softscreen = 0; - return gscreen->data->bdata; + gscreen->data->ref++; + return gscreen->data; } void diff --git a/sys/src/9/bcm/screen.h b/sys/src/9/bcm/screen.h index 901170725..0e9da4d3c 100644 --- a/sys/src/9/bcm/screen.h +++ b/sys/src/9/bcm/screen.h @@ -26,7 +26,7 @@ extern void mouseredraw(void); /* screen.c */ extern void blankscreen(int); extern void flushmemscreen(Rectangle); -extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); +extern Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*); extern void cursoron(void); extern void cursoroff(void); extern void setcursor(Cursor*); diff --git a/sys/src/9/omap/screen.c b/sys/src/9/omap/screen.c index 7d36a0fe4..0a4e005c5 100644 --- a/sys/src/9/omap/screen.c +++ b/sys/src/9/omap/screen.c @@ -436,15 +436,20 @@ flushmemscreen(Rectangle r) /* * export screen to devdraw */ -uchar* -attachscreen(Rectangle *r, ulong *chan, int *d, int *width, int *softscreen) +Memdata* +attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) { + if(gscreen == nil) + return nil; + *r = gscreen->r; *d = gscreen->depth; *chan = gscreen->chan; *width = gscreen->width; *softscreen = (landscape == 0); - return (uchar *)gscreen->data->bdata; + + gscreen->data->ref++; + return gscreen->data; } void diff --git a/sys/src/9/omap/screen.h b/sys/src/9/omap/screen.h index 882428056..d06f83863 100644 --- a/sys/src/9/omap/screen.h +++ b/sys/src/9/omap/screen.h @@ -23,7 +23,7 @@ extern void mouseresize(void); extern void mouseredraw(void); /* screen.c */ -extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); +extern Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*); extern void flushmemscreen(Rectangle); extern void cursoron(void); extern void cursoroff(void); diff --git a/sys/src/9/pc/screen.c b/sys/src/9/pc/screen.c index 20df768fd..8bfec7f3c 100644 --- a/sys/src/9/pc/screen.c +++ b/sys/src/9/pc/screen.c @@ -124,7 +124,7 @@ screenaperture(int size, int align) return 0; } -uchar* +Memdata* attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen) { VGAscr *scr; @@ -137,18 +137,10 @@ attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen) *chan = scr->gscreen->chan; *d = scr->gscreen->depth; *width = scr->gscreen->width; - if(scr->gscreendata->allocd){ - /* - * we use a memimage as softscreen. devdraw will create its own - * screen image on the backing store of that image. when our gscreen - * and devdraws screenimage gets freed, the imagedata will - * be released. - */ - *softscreen = 0xa110c; - scr->gscreendata->ref++; - } else - *softscreen = scr->useflush ? 1 : 0; - return scr->gscreendata->bdata; + *softscreen = (scr->gscreendata->allocd || scr->useflush) ? 1 : 0; + + scr->gscreendata->ref++; + return scr->gscreendata; } void diff --git a/sys/src/9/pc/screen.h b/sys/src/9/pc/screen.h index 401d056a3..0774f87c1 100644 --- a/sys/src/9/pc/screen.h +++ b/sys/src/9/pc/screen.h @@ -138,7 +138,7 @@ extern int hwaccel; /* use hw acceleration */ extern int hwblank; /* use hw blanking */ extern int panning; /* use virtual screen panning */ extern void addvgaseg(char*, ulong, ulong); -extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); +extern Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*); extern void flushmemscreen(Rectangle); extern void cursoron(void); extern void cursoroff(void); diff --git a/sys/src/9/port/devdraw.c b/sys/src/9/port/devdraw.c index db2e7eb20..c9b8be2e3 100644 --- a/sys/src/9/port/devdraw.c +++ b/sys/src/9/port/devdraw.c @@ -918,33 +918,14 @@ makescreenimage(void) Memdata *md; Memimage *i; Rectangle r; - uchar *data; - if((data = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen)) == nil) + if((md = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen)) == nil) return nil; - if(sdraw.softscreen == 0xa110c){ - /* hack: softscreen is memimage. */ - md = *((Memdata**)(data - sizeof(ulong) - sizeof(Memdata*))); - - assert(md->bdata == data); - assert(md->ref > 1); - assert(md->allocd); - - if((i = allocmemimaged(r, chan, md)) == nil){ - md->ref--; - return nil; - } - }else{ - if((md = malloc(sizeof *md)) == nil) - return nil; - md->allocd = 1; - md->base = nil; - md->bdata = data; - md->ref = 1; - if((i = allocmemimaged(r, chan, md)) == nil){ + assert(md->ref > 0); + if((i = allocmemimaged(r, chan, md)) == nil){ + if(--md->ref == 0 && md->allocd) free(md); - return nil; - } + return nil; } i->width = width; i->clipr = r; diff --git a/sys/src/9/sgi/screen.c b/sys/src/9/sgi/screen.c index 6d1829315..c5b96837c 100644 --- a/sys/src/9/sgi/screen.c +++ b/sys/src/9/sgi/screen.c @@ -600,19 +600,20 @@ screeninit(void) mouseaccelerate(3); } -uchar* +Memdata* attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) { + if(gscreen == nil) + return nil; + *r = gscreen->r; *d = gscreen->depth; *chan = gscreen->chan; *width = gscreen->width; + *softscreen = 1; - /* make devdraw use gscreen->data */ - *softscreen = 0xa110c; gscreen->data->ref++; - - return gscreen->data->bdata; + return gscreen->data; } void diff --git a/sys/src/9/sgi/screen.h b/sys/src/9/sgi/screen.h index 0633fbe74..b5ab1c9ba 100644 --- a/sys/src/9/sgi/screen.h +++ b/sys/src/9/sgi/screen.h @@ -26,7 +26,7 @@ extern void mouseredraw(void); /* screen.c */ extern void blankscreen(int); extern void flushmemscreen(Rectangle); -extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); +extern Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*); extern void cursoron(void); extern void cursoroff(void); extern void setcursor(Cursor*); diff --git a/sys/src/9/zynq/screen.c b/sys/src/9/zynq/screen.c index fcf3a365c..ec91a820b 100644 --- a/sys/src/9/zynq/screen.c +++ b/sys/src/9/zynq/screen.c @@ -65,7 +65,7 @@ screeninit(void) conf.monitor = 1; } -uchar* +Memdata* attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) { if(gscreen == nil) @@ -75,12 +75,10 @@ attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen) *d = gscreen->depth; *chan = gscreen->chan; *width = gscreen->width; + *softscreen = 1; - /* make devdraw use gscreen->data */ - *softscreen = 0xa110c; gscreen->data->ref++; - - return gscreen->data->bdata; + return gscreen->data; } void diff --git a/sys/src/9/zynq/screen.h b/sys/src/9/zynq/screen.h index 9ebbff673..1ea1a24d7 100644 --- a/sys/src/9/zynq/screen.h +++ b/sys/src/9/zynq/screen.h @@ -26,7 +26,7 @@ extern void mouseredraw(void); /* screen.c */ extern void blankscreen(int); extern void flushmemscreen(Rectangle); -extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); +extern Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*); extern void cursoron(void); extern void cursoroff(void); extern void setcursor(Cursor*); diff --git a/sys/src/cmd/vnc/devdraw.c b/sys/src/cmd/vnc/devdraw.c index 07d27c147..48ec63e03 100644 --- a/sys/src/cmd/vnc/devdraw.c +++ b/sys/src/cmd/vnc/devdraw.c @@ -925,33 +925,14 @@ makescreenimage(void) Memdata *md; Memimage *i; Rectangle r; - uchar *data; - if((data = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen)) == nil) + if((md = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen)) == nil) return nil; - if(sdraw.softscreen == 0xa110c){ - /* hack: softscreen is memimage. */ - md = *((Memdata**)(data - sizeof(ulong) - sizeof(Memdata*))); - - assert(md->bdata == data); - assert(md->ref > 1); - assert(md->allocd); - - if((i = allocmemimaged(r, chan, md)) == nil){ - md->ref--; - return nil; - } - }else{ - if((md = malloc(sizeof *md)) == nil) - return nil; - md->allocd = 1; - md->base = nil; - md->bdata = data; - md->ref = 1; - if((i = allocmemimaged(r, chan, md)) == nil){ + assert(md->ref > 0); + if((i = allocmemimaged(r, chan, md)) == nil){ + if(--md->ref == 0 && md->allocd) free(md); - return nil; - } + return nil; } i->width = width; i->clipr = r; diff --git a/sys/src/cmd/vnc/screen.c b/sys/src/cmd/vnc/screen.c index 6d507877c..51361584d 100644 --- a/sys/src/cmd/vnc/screen.c +++ b/sys/src/cmd/vnc/screen.c @@ -126,7 +126,7 @@ screenwin(void) qunlock(&drawlock); } -uchar* +Memdata* attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen) { *r = gscreen->clipr; @@ -135,7 +135,8 @@ attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen) *width = gscreen->width; *softscreen = 1; - return gscreen->data->bdata; + gscreen->data->ref++; + return gscreen->data; } void diff --git a/sys/src/cmd/vnc/screen.h b/sys/src/cmd/vnc/screen.h index ce525102c..5ba53a9ac 100644 --- a/sys/src/cmd/vnc/screen.h +++ b/sys/src/cmd/vnc/screen.h @@ -29,7 +29,7 @@ extern void blankscreen(int); void screeninit(int x, int y, char *chanstr); void screenwin(void); void absmousetrack(int x, int y, int b, ulong msec); -uchar *attachscreen(Rectangle*, ulong*, int*, int*, int*); +Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*); void deletescreenimage(void); void resetscreenimage(void);