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:
parent
8e1218aceb
commit
cefc849a95
|
@ -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
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue