ref: cefc849a9521c9d5ba85d5aa88526d0f4b059db9
parent: 8e1218acebcb87bcf16e6bca5b5f213ff2a1df3a
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Wed Jan 30 13:22:52 EST 2019
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.
--- a/sys/src/9/bcm/screen.c
+++ b/sys/src/9/bcm/screen.c
@@ -171,9 +171,12 @@
{
}
-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;
@@ -180,7 +183,8 @@
*width = gscreen->width;
*softscreen = 0;
- return gscreen->data->bdata;
+ gscreen->data->ref++;
+ return gscreen->data;
}
void
--- a/sys/src/9/bcm/screen.h
+++ b/sys/src/9/bcm/screen.h
@@ -26,7 +26,7 @@
/* 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*);
--- a/sys/src/9/omap/screen.c
+++ b/sys/src/9/omap/screen.c
@@ -436,15 +436,20 @@
/*
* 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
--- a/sys/src/9/omap/screen.h
+++ b/sys/src/9/omap/screen.h
@@ -23,7 +23,7 @@
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);
--- a/sys/src/9/pc/screen.c
+++ b/sys/src/9/pc/screen.c
@@ -124,7 +124,7 @@
return 0;
}
-uchar*
+Memdata*
attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen)
{
VGAscr *scr;
@@ -137,18 +137,10 @@
*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
--- a/sys/src/9/pc/screen.h
+++ b/sys/src/9/pc/screen.h
@@ -138,7 +138,7 @@
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);
--- a/sys/src/9/port/devdraw.c
+++ b/sys/src/9/port/devdraw.c
@@ -918,33 +918,14 @@
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;
--- a/sys/src/9/sgi/screen.c
+++ b/sys/src/9/sgi/screen.c
@@ -600,19 +600,20 @@
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
--- a/sys/src/9/sgi/screen.h
+++ b/sys/src/9/sgi/screen.h
@@ -26,7 +26,7 @@
/* 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*);
--- a/sys/src/9/zynq/screen.c
+++ b/sys/src/9/zynq/screen.c
@@ -65,7 +65,7 @@
conf.monitor = 1;
}
-uchar*
+Memdata*
attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen)
{
if(gscreen == nil)
@@ -75,12 +75,10 @@
*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
--- a/sys/src/9/zynq/screen.h
+++ b/sys/src/9/zynq/screen.h
@@ -26,7 +26,7 @@
/* 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*);
--- a/sys/src/cmd/vnc/devdraw.c
+++ b/sys/src/cmd/vnc/devdraw.c
@@ -925,33 +925,14 @@
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;
--- a/sys/src/cmd/vnc/screen.c
+++ b/sys/src/cmd/vnc/screen.c
@@ -126,7 +126,7 @@
qunlock(&drawlock);
}
-uchar*
+Memdata*
attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen)
{
*r = gscreen->clipr;
@@ -135,7 +135,8 @@
*width = gscreen->width;
*softscreen = 1;
- return gscreen->data->bdata;
+ gscreen->data->ref++;
+ return gscreen->data;
}
void
--- a/sys/src/cmd/vnc/screen.h
+++ b/sys/src/cmd/vnc/screen.h
@@ -29,7 +29,7 @@
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);