diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-04-11 20:56:59 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-04-11 20:56:59 +0000 |
commit | 632defb65612ae342358a4effc5ae71c8d90b8b8 (patch) | |
tree | 73fd1ef6439f860482b9ffca78bcc5997a2958a0 /sys/src/9 | |
parent | 45bab89362ebe122d60d5e9b1e2b949b26168db3 (diff) |
vesa-changes
Diffstat (limited to 'sys/src/9')
-rw-r--r-- | sys/src/9/pc/devvga.c | 5 | ||||
-rw-r--r-- | sys/src/9/pc/screen.c | 181 | ||||
-rw-r--r-- | sys/src/9/pc/vga.c | 105 | ||||
-rw-r--r-- | sys/src/9/pc/vgavesa.c | 19 | ||||
-rw-r--r-- | sys/src/9/port/devdraw.c | 61 |
5 files changed, 184 insertions, 187 deletions
diff --git a/sys/src/9/pc/devvga.c b/sys/src/9/pc/devvga.c index ae28fdd79..8cd2f9583 100644 --- a/sys/src/9/pc/devvga.c +++ b/sys/src/9/pc/devvga.c @@ -368,11 +368,6 @@ vgactl(Cmdbuf *cb) if(screenaperture(size, align) < 0) error("not enough free address space"); return; -/* - case CMmemset: - memset((void*)strtoul(cb->f[1], 0, 0), atoi(cb->f[2]), atoi(cb->f[3])); - return; -*/ case CMblank: drawblankscreen(1); diff --git a/sys/src/9/pc/screen.c b/sys/src/9/pc/screen.c index d1d4ae729..b585c36ce 100644 --- a/sys/src/9/pc/screen.c +++ b/sys/src/9/pc/screen.c @@ -19,7 +19,6 @@ Point ZP = {0, 0}; Rectangle physgscreenr; -Memdata gscreendata; Memimage *gscreen; VGAscr vgascreen[1]; @@ -40,13 +39,18 @@ Cursor arrow = { int didswcursorinit; -static void *softscreen; - int -screensize(int x, int y, int z, ulong chan) +screensize(int x, int y, int, ulong chan) { VGAscr *scr; - void *oldsoft; + + qlock(&drawlock); + if(waserror()){ + qunlock(&drawlock); + nexterror(); + } + + memimageinit(); lock(&vgascreenlock); if(waserror()){ @@ -54,54 +58,51 @@ screensize(int x, int y, int z, ulong chan) nexterror(); } - memimageinit(); scr = &vgascreen[0]; - oldsoft = softscreen; + scr->gscreendata = nil; + scr->gscreen = nil; + if(gscreen){ + freememimage(gscreen); + gscreen = nil; + } if(scr->paddr == 0){ - int width = (x*z)/BI2WD; - void *p; - - p = xalloc(width*BY2WD*y); - if(p == nil) - error("no memory for vga soft screen"); - gscreendata.bdata = softscreen = p; + gscreen = allocmemimage(Rect(0,0,x,y), chan); if(scr->dev && scr->dev->page){ scr->vaddr = KADDR(VGAMEM()); scr->apsize = 1<<16; } scr->useflush = 1; - } - else{ - gscreendata.bdata = scr->vaddr; + }else{ + static Memdata md; + + md.ref = 1; + md.bdata = scr->vaddr; + gscreen = allocmemimaged(Rect(0,0,x,y), chan, &md); scr->useflush = scr->dev && scr->dev->flush; } - - scr->gscreen = nil; - if(gscreen) - freememimage(gscreen); - gscreen = allocmemimaged(Rect(0,0,x,y), chan, &gscreendata); if(gscreen == nil) error("no memory for vga memimage"); - vgaimageinit(chan); scr->palettedepth = 6; /* default */ - scr->gscreendata = &gscreendata; scr->memdefont = getmemdefont(); scr->gscreen = gscreen; + scr->gscreendata = gscreen->data; physgscreenr = gscreen->r; + + vgaimageinit(chan); + unlock(&vgascreenlock); poperror(); - if(oldsoft) - xfree(oldsoft); - - memimagedraw(gscreen, gscreen->r, memblack, ZP, nil, ZP, S); - flushmemscreen(gscreen->r); + drawcmap(); if(didswcursorinit) swcursorinit(); - drawcmap(); + + qunlock(&drawlock); + poperror(); + return 0; } @@ -152,8 +153,17 @@ attachscreen(Rectangle* r, ulong* chan, int* d, int* width, int *softscreen) *chan = scr->gscreen->chan; *d = scr->gscreen->depth; *width = scr->gscreen->width; - *softscreen = scr->useflush; - + 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; } @@ -168,12 +178,12 @@ flushmemscreen(Rectangle r) int y, len, incs, off, page; scr = &vgascreen[0]; + if(scr->gscreen == nil || scr->useflush == 0) + return; if(scr->dev && scr->dev->flush){ scr->dev->flush(scr, r); return; } - if(scr->gscreen == nil || scr->useflush == 0) - return; if(scr->dev == nil || scr->dev->page == nil) return; @@ -185,7 +195,6 @@ flushmemscreen(Rectangle r) switch(scr->gscreen->depth){ default: len = 0; - panic("flushmemscreen: depth\n"); break; case 8: len = Dx(r); @@ -358,36 +367,31 @@ hwdraw(Memdrawparam *par) { VGAscr *scr; Memimage *dst, *src, *mask; + Memdata *scrd; int m; - if(hwaccel == 0) - return 0; - scr = &vgascreen[0]; - if((dst=par->dst) == nil || dst->data == nil) + scrd = scr->gscreendata; + if(scr->gscreen == nil || scrd == nil) return 0; - if((src=par->src) == nil || src->data == nil) + if((dst = par->dst) == nil || dst->data == nil) return 0; - if((mask=par->mask) == nil || mask->data == nil) - return 0; - + if((src = par->src) && src->data == nil) + src = nil; + if((mask = par->mask) && mask->data == nil) + mask = nil; if(scr->cur == &swcursor){ - /* - * always calling swcursorhide here doesn't cure - * leaving cursor tracks nor failing to refresh menus - * with the latest libmemdraw/draw.c. - */ - if(dst->data->bdata == gscreendata.bdata) + if(dst->data->bdata == scrd->bdata) swcursoravoid(par->r); - if(src->data->bdata == gscreendata.bdata) + if(src && src->data->bdata == scrd->bdata) swcursoravoid(par->sr); - if(mask->data->bdata == gscreendata.bdata) + if(mask && mask->data->bdata == scrd->bdata) swcursoravoid(par->mr); } - - if(dst->data->bdata != gscreendata.bdata) + if(hwaccel == 0) + return 0; + if(dst->data->bdata != scrd->bdata || src == nil || mask == nil) return 0; - if(scr->fill==nil && scr->scroll==nil) return 0; @@ -607,29 +611,6 @@ swcursordraw(void) swvisible = 1; } -/* - * Need to lock drawlock for ourselves. - */ -void -swenable(VGAscr*) -{ - swenabled = 1; - if(canqlock(&drawlock)){ - swcursordraw(); - qunlock(&drawlock); - } -} - -void -swdisable(VGAscr*) -{ - swenabled = 0; - if(canqlock(&drawlock)){ - swcursorhide(); - qunlock(&drawlock); - } -} - void swload(VGAscr*, Cursor *curs) { @@ -693,7 +674,7 @@ swcursorclock(void) void swcursorinit(void) { - static int init, warned; + static int init; VGAscr *scr; didswcursorinit = 1; @@ -701,42 +682,56 @@ swcursorinit(void) init = 1; addclock0link(swcursorclock, 10); } - scr = &vgascreen[0]; - if(scr==nil || scr->gscreen==nil) - return; - if(scr->dev == nil || scr->dev->linear == nil){ - if(!warned){ - print("cannot use software cursor on non-linear vga screen\n"); - warned = 1; - } + scr = &vgascreen[0]; + if(scr->gscreen==nil) return; - } if(swback){ freememimage(swback); freememimage(swmask); freememimage(swmask1); freememimage(swimg); - freememimage(swimg1); + freememimage(swimg1); } - swback = allocmemimage(Rect(0,0,32,32), gscreen->chan); swmask = allocmemimage(Rect(0,0,16,16), GREY8); swmask1 = allocmemimage(Rect(0,0,16,16), GREY1); swimg = allocmemimage(Rect(0,0,16,16), GREY8); swimg1 = allocmemimage(Rect(0,0,16,16), GREY1); - if(swback==nil || swmask==nil || swmask1==nil || swimg==nil || swimg1 == nil){ + if(swback==nil || swmask==nil || swmask1==nil || swimg==nil || swimg1 == nil) print("software cursor: allocmemimage fails"); - return; - } - + memfillcolor(swback, DTransparent); memfillcolor(swmask, DOpaque); memfillcolor(swmask1, DOpaque); memfillcolor(swimg, DBlack); memfillcolor(swimg1, DBlack); } +/* + * Need to lock drawlock for ourselves. + */ +void +swenable(VGAscr *scr) +{ + swenabled = 1; + if(canqlock(&drawlock)){ + swload(scr, &arrow); + swcursordraw(); + qunlock(&drawlock); + } +} + +void +swdisable(VGAscr*) +{ + swenabled = 0; + if(canqlock(&drawlock)){ + swcursorhide(); + qunlock(&drawlock); + } +} + VGAcur swcursor = { "soft", diff --git a/sys/src/9/pc/vga.c b/sys/src/9/pc/vga.c index 587d8c185..265b8455e 100644 --- a/sys/src/9/pc/vga.c +++ b/sys/src/9/pc/vga.c @@ -12,8 +12,8 @@ #include <cursor.h> #include "screen.h" -static Memimage* back; static Memimage *conscol; +static Memimage *back; static Point curpos; static Rectangle window; @@ -23,25 +23,10 @@ Lock vgascreenlock; int drawdebug; void -vgaimageinit(ulong chan) +vgaimageinit(ulong) { - if(back == nil){ - back = allocmemimage(Rect(0,0,1,1), chan); /* RSC BUG */ - if(back == nil) - panic("back alloc"); /* RSC BUG */ - back->flags |= Frepl; - back->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF); - memfillcolor(back, DBlack); - } - - if(conscol == nil){ - conscol = allocmemimage(Rect(0,0,1,1), chan); /* RSC BUG */ - if(conscol == nil) - panic("conscol alloc"); /* RSC BUG */ - conscol->flags |= Frepl; - conscol->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF); - memfillcolor(conscol, DWhite); - } + conscol = memblack; + back = memwhite; } static void @@ -69,13 +54,11 @@ vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr) int h, w, pos; Rectangle r; -// drawdebug = 1; if(xp < xbuf || xp >= &xbuf[sizeof(xbuf)]) xp = xbuf; h = scr->memdefont->height; switch(buf[0]){ - case '\n': if(curpos.y+h >= window.max.y){ vgascroll(scr); @@ -100,7 +83,7 @@ vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr) pos = 4-(pos%4); *xp++ = curpos.x; r = Rect(curpos.x, curpos.y, curpos.x+pos*w, curpos.y + h); - memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min, S); + memimagedraw(scr->gscreen, r, back, ZP, nil, ZP, S); curpos.x += pos*w; break; @@ -109,7 +92,7 @@ vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr) break; xp--; r = Rect(*xp, curpos.y, curpos.x, curpos.y+h); - memimagedraw(scr->gscreen, r, back, back->r.min, nil, ZP, S); + memimagedraw(scr->gscreen, r, back, r.min, nil, ZP, S); combinerect(flushr, r); curpos.x = *xp; break; @@ -126,12 +109,11 @@ vgascreenputc(VGAscr* scr, char* buf, Rectangle *flushr) *xp++ = curpos.x; r = Rect(curpos.x, curpos.y, curpos.x+w, curpos.y+h); - memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min, S); + memimagedraw(scr->gscreen, r, back, r.min, nil, ZP, S); memimagestring(scr->gscreen, curpos, conscol, ZP, scr->memdefont, buf); combinerect(flushr, r); curpos.x += w; } -// drawdebug = 0; } static void @@ -184,19 +166,61 @@ vgascreenputs(char* s, int n) unlock(&vgascreenlock); } +static Memimage* +mkcolor(Memimage *screen, ulong color) +{ + Memimage *i; + + if(i = allocmemimage(Rect(0,0,1,1), screen->chan)){ + i->flags |= Frepl; + i->clipr = screen->r; + memfillcolor(i, color); + } + return i; +} + void vgascreenwin(VGAscr* scr) { - int h, w; + Memimage *i; + Rectangle r; + Point p; + int h; + qlock(&drawlock); + h = scr->memdefont->height; - w = scr->memdefont->info[' '].width; + r = scr->gscreen->r; + + if(i = mkcolor(scr->gscreen, 0x444488FF)){ + memimagedraw(scr->gscreen, r, i, ZP, nil, ZP, S); + freememimage(i); + } + + window = insetrect(r, 20); + memimagedraw(scr->gscreen, window, conscol, ZP, memopaque, ZP, S); + window = insetrect(window, 4); + memimagedraw(scr->gscreen, window, back, ZP, memopaque, ZP, S); + + if(i = mkcolor(scr->gscreen, 0xAAAAAAFF)){ + memimagedraw(scr->gscreen, Rect(window.min.x, window.min.y, + window.max.x, window.min.y+h+5+6), i, ZP, nil, ZP, S); + freememimage(i); - window = insetrect(scr->gscreen->r, 48); - window.max.x = window.min.x+((window.max.x-window.min.x)/w)*w; - window.max.y = window.min.y+((window.max.y-window.min.y)/h)*h; + window = insetrect(window, 5); + p = addpt(window.min, Pt(10, 0)); + memimagestring(scr->gscreen, p, memblack, ZP, scr->memdefont, " Plan 9 Console "); + window.min.y += h+6; + } else + window = insetrect(window, 5); + + window.max.y = window.min.y+(Dy(window)/h)*h; curpos = window.min; + flushmemscreen(r); + + qunlock(&drawlock); + screenputs = vgascreenputs; } @@ -240,24 +264,3 @@ addvgaseg(char *name, ulong pa, ulong size) seg.size = size; addphysseg(&seg); } - -void -cornerstring(char *s) -{ - int h, w; - VGAscr *scr; - Rectangle r; - Point p; - - scr = &vgascreen[0]; - if(scr->vaddr == nil || screenputs != vgascreenputs) - return; - p = memsubfontwidth(scr->memdefont, s); - w = p.x; - h = scr->memdefont->height; - - r = Rect(0, 0, w, h); - memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min, S); - memimagestring(scr->gscreen, r.min, conscol, ZP, scr->memdefont, s); -// flushmemscreen(r); -} diff --git a/sys/src/9/pc/vgavesa.c b/sys/src/9/pc/vgavesa.c index 3fe1bfb17..c2ea65138 100644 --- a/sys/src/9/pc/vgavesa.c +++ b/sys/src/9/pc/vgavesa.c @@ -62,15 +62,19 @@ vbecall(Ureg *u) nexterror(); } pa = PADDR(RMBUF); - /* TODO: check read and write return values */ - devtab[cmem->type]->write(cmem, modebuf, sizeof modebuf, pa); - u->trap = 0x10; - devtab[creg->type]->write(creg, u, sizeof *u, 0); + if(devtab[cmem->type]->write(cmem, modebuf, sizeof(modebuf), pa) != sizeof(modebuf)) + error("write modebuf"); - devtab[creg->type]->read(creg, u, sizeof *u, 0); + u->trap = 0x10; + if(devtab[creg->type]->write(creg, u, sizeof(*u), 0) != sizeof(*u)) + error("write ureg"); + if(devtab[creg->type]->read(creg, u, sizeof(*u), 0) != sizeof(*u)) + error("read ureg"); if((u->ax&0xFFFF) != 0x004F) error("vesa bios error"); - devtab[cmem->type]->read(cmem, modebuf, sizeof modebuf, pa); + + if(devtab[cmem->type]->read(cmem, modebuf, sizeof(modebuf), pa) != sizeof(modebuf)) + error("read modebuf"); poperror(); cclose(creg); @@ -124,7 +128,7 @@ vesalinear(VGAscr *scr, int, int) Pcidev *pci; if(hardscreen) { - scr->vaddr = 0; + scr->vaddr = hardscreen; scr->paddr = scr->apsize = 0; return; } @@ -180,7 +184,6 @@ vesalinear(VGAscr *scr, int, int) if(Usesoftscreen){ hardscreen = scr->vaddr; - scr->vaddr = 0; scr->paddr = scr->apsize = 0; } } diff --git a/sys/src/9/port/devdraw.c b/sys/src/9/port/devdraw.c index d11ab05a2..017942194 100644 --- a/sys/src/9/port/devdraw.c +++ b/sys/src/9/port/devdraw.c @@ -365,9 +365,8 @@ addflush(Rectangle r) int abb, ar, anbb; Rectangle nbb; - if(sdraw.softscreen==0 || !rectclip(&r, screenimage->r)) + if(sdraw.softscreen==0 || screenimage == nil || !rectclip(&r, screenimage->r)) return; - if(flushrect.min.x >= flushrect.max.x){ flushrect = r; waste = 0; @@ -413,13 +412,7 @@ dstflush(int dstid, Memimage *dst, Rectangle r) combinerect(&flushrect, r); return; } - /* how can this happen? -rsc, dec 12 2002 */ - if(dst == 0){ - print("nil dstflush\n"); - return; - } - l = dst->layer; - if(l == nil) + if(screenimage == nil || dst == nil || (l = dst->layer) == nil) return; do{ if(l->screen->image->data != screenimage->data) @@ -433,7 +426,7 @@ dstflush(int dstid, Memimage *dst, Rectangle r) void drawflush(void) { - if(flushrect.min.x < flushrect.max.x) + if(screenimage && flushrect.min.x < flushrect.max.x) flushmemscreen(flushrect); flushrect = Rect(10000, 10000, -10000, -10000); } @@ -676,12 +669,10 @@ drawfreedimage(DImage *dimage) drawfreedimage(dimage->fromname); goto Return; } -// if(dimage->image == screenimage) /* don't free the display */ -// goto Return; ds = dimage->dscreen; if(ds){ l = dimage->image; - if(l->data == screenimage->data) + if(screenimage && l->data == screenimage->data) addflush(l->layer->screenr); if(l->layer->refreshfn == drawrefresh) /* else true owner will clean up */ free(l->layer->refreshptr); @@ -929,26 +920,36 @@ makescreenimage(void) Memdata *md; Memimage *i; Rectangle r; + uchar *data; - md = malloc(sizeof *md); - if(md == nil) - return nil; - md->allocd = 1; - md->base = nil; - md->bdata = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen); - if(md->bdata == nil){ - free(md); - return nil; - } - md->ref = 1; - i = allocmemimaged(r, chan, md); - if(i == nil){ - free(md); + if((data = 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){ + free(md); + return nil; + } } i->width = width; i->clipr = r; - di = allocdimage(i); if(di == nil){ freememimage(i); /* frees md */ @@ -1859,7 +1860,7 @@ drawmesg(Client *client, void *av, int n) if(pp == nil) error(Enomem); doflush = 0; - if(dstid==0 || (dst->layer && dst->layer->screen->image->data == screenimage->data)) + if(dstid==0 || (screenimage && dst->layer && dst->layer->screen->image->data == screenimage->data)) doflush = 1; /* simplify test in loop */ ox = oy = 0; esize = 0; @@ -2048,7 +2049,7 @@ drawmesg(Client *client, void *av, int n) memltofrontn(lp, nw); else memltorearn(lp, nw); - if(lp[0]->layer->screen->image->data == screenimage->data) + if(screenimage && lp[0]->layer->screen->image->data == screenimage->data) for(j=0; j<nw; j++) addflush(lp[j]->layer->screenr); ll = drawlookup(client, BGLONG(a+1+1+2), 1); |