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.
This commit is contained in:
cinap_lenrek 2019-01-30 18:22:52 +01:00
parent 8e1218aceb
commit cefc849a95
14 changed files with 47 additions and 84 deletions

View file

@ -171,16 +171,20 @@ flushmemscreen(Rectangle)
{ {
} }
uchar* 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;
*r = gscreen->r; *r = gscreen->r;
*d = gscreen->depth; *d = gscreen->depth;
*chan = gscreen->chan; *chan = gscreen->chan;
*width = gscreen->width; *width = gscreen->width;
*softscreen = 0; *softscreen = 0;
return gscreen->data->bdata; gscreen->data->ref++;
return gscreen->data;
} }
void void

View file

@ -26,7 +26,7 @@ extern void mouseredraw(void);
/* screen.c */ /* screen.c */
extern void blankscreen(int); extern void blankscreen(int);
extern void flushmemscreen(Rectangle); 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 cursoron(void);
extern void cursoroff(void); extern void cursoroff(void);
extern void setcursor(Cursor*); extern void setcursor(Cursor*);

View file

@ -436,15 +436,20 @@ flushmemscreen(Rectangle r)
/* /*
* export screen to devdraw * export screen to devdraw
*/ */
uchar* 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;
*r = gscreen->r; *r = gscreen->r;
*d = gscreen->depth; *d = gscreen->depth;
*chan = gscreen->chan; *chan = gscreen->chan;
*width = gscreen->width; *width = gscreen->width;
*softscreen = (landscape == 0); *softscreen = (landscape == 0);
return (uchar *)gscreen->data->bdata;
gscreen->data->ref++;
return gscreen->data;
} }
void void

View file

@ -23,7 +23,7 @@ extern void mouseresize(void);
extern void mouseredraw(void); extern void mouseredraw(void);
/* screen.c */ /* screen.c */
extern uchar* attachscreen(Rectangle*, ulong*, int*, int*, int*); extern Memdata* attachscreen(Rectangle*, ulong*, int*, int*, int*);
extern void flushmemscreen(Rectangle); extern void flushmemscreen(Rectangle);
extern void cursoron(void); extern void cursoron(void);
extern void cursoroff(void); extern void cursoroff(void);

View file

@ -124,7 +124,7 @@ screenaperture(int size, int align)
return 0; return 0;
} }
uchar* Memdata*
attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen) attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen)
{ {
VGAscr *scr; VGAscr *scr;
@ -137,18 +137,10 @@ attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen)
*chan = scr->gscreen->chan; *chan = scr->gscreen->chan;
*d = scr->gscreen->depth; *d = scr->gscreen->depth;
*width = scr->gscreen->width; *width = scr->gscreen->width;
if(scr->gscreendata->allocd){ *softscreen = (scr->gscreendata->allocd || scr->useflush) ? 1 : 0;
/*
* we use a memimage as softscreen. devdraw will create its own scr->gscreendata->ref++;
* screen image on the backing store of that image. when our gscreen return scr->gscreendata;
* 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;
} }
void void

View file

@ -138,7 +138,7 @@ extern int hwaccel; /* use hw acceleration */
extern int hwblank; /* use hw blanking */ extern int hwblank; /* use hw blanking */
extern int panning; /* use virtual screen panning */ extern int panning; /* use virtual screen panning */
extern void addvgaseg(char*, ulong, ulong); 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 flushmemscreen(Rectangle);
extern void cursoron(void); extern void cursoron(void);
extern void cursoroff(void); extern void cursoroff(void);

View file

@ -918,33 +918,14 @@ makescreenimage(void)
Memdata *md; Memdata *md;
Memimage *i; Memimage *i;
Rectangle r; 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; return nil;
if(sdraw.softscreen == 0xa110c){ assert(md->ref > 0);
/* hack: softscreen is memimage. */ if((i = allocmemimaged(r, chan, md)) == nil){
md = *((Memdata**)(data - sizeof(ulong) - sizeof(Memdata*))); if(--md->ref == 0 && md->allocd)
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){
free(md); free(md);
return nil; return nil;
}
} }
i->width = width; i->width = width;
i->clipr = r; i->clipr = r;

View file

@ -600,19 +600,20 @@ screeninit(void)
mouseaccelerate(3); mouseaccelerate(3);
} }
uchar* 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;
*r = gscreen->r; *r = gscreen->r;
*d = gscreen->depth; *d = gscreen->depth;
*chan = gscreen->chan; *chan = gscreen->chan;
*width = gscreen->width; *width = gscreen->width;
*softscreen = 1;
/* make devdraw use gscreen->data */
*softscreen = 0xa110c;
gscreen->data->ref++; gscreen->data->ref++;
return gscreen->data;
return gscreen->data->bdata;
} }
void void

View file

@ -26,7 +26,7 @@ extern void mouseredraw(void);
/* screen.c */ /* screen.c */
extern void blankscreen(int); extern void blankscreen(int);
extern void flushmemscreen(Rectangle); 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 cursoron(void);
extern void cursoroff(void); extern void cursoroff(void);
extern void setcursor(Cursor*); extern void setcursor(Cursor*);

View file

@ -65,7 +65,7 @@ screeninit(void)
conf.monitor = 1; conf.monitor = 1;
} }
uchar* 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) if(gscreen == nil)
@ -75,12 +75,10 @@ attachscreen(Rectangle *r, ulong *chan, int* d, int *width, int *softscreen)
*d = gscreen->depth; *d = gscreen->depth;
*chan = gscreen->chan; *chan = gscreen->chan;
*width = gscreen->width; *width = gscreen->width;
*softscreen = 1;
/* make devdraw use gscreen->data */
*softscreen = 0xa110c;
gscreen->data->ref++; gscreen->data->ref++;
return gscreen->data;
return gscreen->data->bdata;
} }
void void

View file

@ -26,7 +26,7 @@ extern void mouseredraw(void);
/* screen.c */ /* screen.c */
extern void blankscreen(int); extern void blankscreen(int);
extern void flushmemscreen(Rectangle); 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 cursoron(void);
extern void cursoroff(void); extern void cursoroff(void);
extern void setcursor(Cursor*); extern void setcursor(Cursor*);

View file

@ -925,33 +925,14 @@ makescreenimage(void)
Memdata *md; Memdata *md;
Memimage *i; Memimage *i;
Rectangle r; 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; return nil;
if(sdraw.softscreen == 0xa110c){ assert(md->ref > 0);
/* hack: softscreen is memimage. */ if((i = allocmemimaged(r, chan, md)) == nil){
md = *((Memdata**)(data - sizeof(ulong) - sizeof(Memdata*))); if(--md->ref == 0 && md->allocd)
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){
free(md); free(md);
return nil; return nil;
}
} }
i->width = width; i->width = width;
i->clipr = r; i->clipr = r;

View file

@ -126,7 +126,7 @@ screenwin(void)
qunlock(&drawlock); qunlock(&drawlock);
} }
uchar* Memdata*
attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen) attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen)
{ {
*r = gscreen->clipr; *r = gscreen->clipr;
@ -135,7 +135,8 @@ attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen)
*width = gscreen->width; *width = gscreen->width;
*softscreen = 1; *softscreen = 1;
return gscreen->data->bdata; gscreen->data->ref++;
return gscreen->data;
} }
void void

View file

@ -29,7 +29,7 @@ extern void blankscreen(int);
void screeninit(int x, int y, char *chanstr); void screeninit(int x, int y, char *chanstr);
void screenwin(void); void screenwin(void);
void absmousetrack(int x, int y, int b, ulong msec); 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 deletescreenimage(void);
void resetscreenimage(void); void resetscreenimage(void);