summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2019-01-30 18:22:52 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2019-01-30 18:22:52 +0100
commitcefc849a9521c9d5ba85d5aa88526d0f4b059db9 (patch)
treeb5f42fb9651de5734abc2e23647ca9ec7ea49c25 /sys/src
parent8e1218acebcb87bcf16e6bca5b5f213ff2a1df3a (diff)
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.
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/9/bcm/screen.c8
-rw-r--r--sys/src/9/bcm/screen.h2
-rw-r--r--sys/src/9/omap/screen.c11
-rw-r--r--sys/src/9/omap/screen.h2
-rw-r--r--sys/src/9/pc/screen.c18
-rw-r--r--sys/src/9/pc/screen.h2
-rw-r--r--sys/src/9/port/devdraw.c29
-rw-r--r--sys/src/9/sgi/screen.c11
-rw-r--r--sys/src/9/sgi/screen.h2
-rw-r--r--sys/src/9/zynq/screen.c8
-rw-r--r--sys/src/9/zynq/screen.h2
-rw-r--r--sys/src/cmd/vnc/devdraw.c29
-rw-r--r--sys/src/cmd/vnc/screen.c5
-rw-r--r--sys/src/cmd/vnc/screen.h2
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);