diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-10 15:17:27 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-10 15:17:27 +0200 |
commit | d1f1be9c57b6c7d9e5d826d82b08428590126e15 (patch) | |
tree | 72b9db89c2cb86f0d27d6d6f2b3a8c014729eecb | |
parent | dbc4833d1011dcd65091159c21738258b4329590 (diff) | |
download | plan9front-d1f1be9c57b6c7d9e5d826d82b08428590126e15.tar.xz |
vgavmware: fix hardware acceleration (fill is not available with SVGA2)
-rw-r--r-- | sys/src/9/pc/vgavmware.c | 93 | ||||
-rw-r--r-- | sys/src/cmd/aux/vga/vmware.c | 31 |
2 files changed, 52 insertions, 72 deletions
diff --git a/sys/src/9/pc/vgavmware.c b/sys/src/9/pc/vgavmware.c index 60c8cfa73..ddb7e523e 100644 --- a/sys/src/9/pc/vgavmware.c +++ b/sys/src/9/pc/vgavmware.c @@ -35,13 +35,13 @@ enum { Rgmask, Rbmask, Rbpl, - Rfbstart, + Rfbstart, /* deprecated */ Rfboffset, Rfbmaxsize, Rfbsize, Rcap, - Rmemstart, + Rmemstart, /* deprecated */ Rmemsize, Rconfigdone, @@ -55,17 +55,6 @@ enum { Rcursoron, Nreg, - Crectfill = 1<<0, - Crectcopy = 1<<1, - Crectpatfill = 1<<2, - Coffscreen = 1<<3, - Crasterop = 1<<4, - Ccursor = 1<<5, - Ccursorbypass = 1<<6, - Ccursorbypass2 = 1<<7, - C8bitemulation = 1<<8, - Calphacursor = 1<<9, - FifoMin = 0, FifoMax = 1, FifoNextCmd = 2, @@ -117,6 +106,7 @@ struct Vmware { char chan[32]; int depth; + int ver; }; Vmware xvm; @@ -160,13 +150,13 @@ vmwarelinear(VGAscr* scr, int, int) snprint(err, sizeof err, "unknown vmware pci did %.4ux", p->did); continue; - case VMWARE1: + vm->ver = 1; vm->ra = 0x4560; vm->rd = 0x4560 + 4; break; - case VMWARE2: + vm->ver = 2; vm->ra = p->mem[0].bar & ~3; vm->rd = vm->ra + 1; break; @@ -175,10 +165,33 @@ vmwarelinear(VGAscr* scr, int, int) } if(p == nil) error(err[0]? err: "no vmware vga card found"); - - vgalinearaddr(scr, vmrd(vm, Rfbstart), vmrd(vm, Rfbsize)); + // vm->fb = vmrd(vm, Rfbstart); + vm->fb = p->mem[1].bar & ~0xF; + vm->fb += vmrd(vm, Rfboffset); + vgalinearaddr(scr, vm->fb, vmrd(vm, Rfbmaxsize)); if(scr->apsize) addvgaseg("vmwarescreen", scr->paddr, scr->apsize); + + if(scr->mmio==nil){ + ulong mmiobase, mmiosize; + + // mmiobase = vmrd(vm, Rmemstart); + mmiobase = p->mem[2].bar & ~0xF; + if(mmiobase == 0) + return; + mmiosize = vmrd(vm, Rmemsize); + scr->mmio = vmap(mmiobase, mmiosize); + if(scr->mmio == nil) + return; + vm->mmio = scr->mmio; + vm->mmiosize = mmiosize; + addvgaseg("vmwaremmio", mmiobase, mmiosize); + } + scr->mmio[FifoMin] = 4*sizeof(ulong); + scr->mmio[FifoMax] = vm->mmiosize; + scr->mmio[FifoNextCmd] = 4*sizeof(ulong); + scr->mmio[FifoStop] = 4*sizeof(ulong); + vmwr(vm, Rconfigdone, 1); } static void @@ -187,11 +200,6 @@ vmfifowr(Vmware *vm, ulong v) ulong *mm; mm = vm->mmio; - if(mm == nil){ - iprint("!"); - return; - } - if(mm[FifoNextCmd]+sizeof(ulong) == mm[FifoStop] || (mm[FifoNextCmd]+sizeof(ulong) == mm[FifoMax] && mm[FifoStop] == mm[FifoMin])) @@ -230,6 +238,7 @@ vmwareload(VGAscr*, Cursor *c) if(vm->mmio == nil) return; + vmfifowr(vm, Xdefinecursor); vmfifowr(vm, 1); /* cursor id */ vmfifowr(vm, -c->offset.x); @@ -257,6 +266,8 @@ vmwareload(VGAscr*, Cursor *c) static int vmwaremove(VGAscr*, Point p) { + if(vm->mmio == nil) + return 1; vmwr(vm, Rcursorid, 1); vmwr(vm, Rcursorx, p.x); vmwr(vm, Rcursory, p.y); @@ -267,6 +278,8 @@ vmwaremove(VGAscr*, Point p) static void vmwaredisable(VGAscr*) { + if(vm->mmio == nil) + return; vmwr(vm, Rcursorid, 1); vmwr(vm, Rcursoron, CursorOnHide); } @@ -274,15 +287,12 @@ vmwaredisable(VGAscr*) static void vmwareenable(VGAscr*) { + if(vm->mmio == nil) + return; vmwr(vm, Rcursorid, 1); vmwr(vm, Rcursoron, CursorOnShow); } -static void -vmwareblank(int) -{ -} - static int vmwarescroll(VGAscr*, Rectangle r, Rectangle sr) { @@ -317,38 +327,13 @@ vmwarefill(VGAscr*, Rectangle r, ulong sval) static void vmwaredrawinit(VGAscr *scr) { - ulong offset; - ulong mmiobase, mmiosize; - - if(scr->mmio==nil){ - mmiobase = vmrd(vm, Rmemstart); - if(mmiobase == 0) - return; - mmiosize = vmrd(vm, Rmemsize); - scr->mmio = vmap(mmiobase, mmiosize); - if(scr->mmio == nil) - return; - vm->mmio = scr->mmio; - vm->mmiosize = mmiosize; - addvgaseg("vmwaremmio", mmiobase, mmiosize); - } - - scr->mmio[FifoMin] = 4*sizeof(ulong); - scr->mmio[FifoMax] = vm->mmiosize; - scr->mmio[FifoNextCmd] = 4*sizeof(ulong); - scr->mmio[FifoStop] = 4*sizeof(ulong); - vmwr(vm, Rconfigdone, 1); - scr->scroll = vmwarescroll; - scr->fill = vmwarefill; - - offset = vmrd(vm, Rfboffset); - scr->gscreendata->bdata += offset; + if(vm->ver == 1) + scr->fill = vmwarefill; } VGAdev vgavmwaredev = { "vmware", - 0, 0, 0, diff --git a/sys/src/cmd/aux/vga/vmware.c b/sys/src/cmd/aux/vga/vmware.c index 15e0589fb..71b35313b 100644 --- a/sys/src/cmd/aux/vga/vmware.c +++ b/sys/src/cmd/aux/vga/vmware.c @@ -6,6 +6,11 @@ #include "vga.h" enum { + VMWARE1 = 0x0710, /* PCI DID */ + VMWARE2 = 0x0405, +}; + +enum { Rid = 0, Renable, Rwidth, @@ -37,25 +42,11 @@ enum { Rhostbpp, Nreg, - Crectfill = 1<<0, - Crectcopy = 1<<1, - Crectpatfill = 1<<2, - Coffscreen = 1<<3, - Crasterop = 1<<4, - Ccursor = 1<<5, - Ccursorbypass = 1<<6, - Ccursorbypass2 = 1<<7, - C8bitemulation = 1<<8, - Calphacursor = 1<<9, - Rpalette = 1024, }; typedef struct Vmware Vmware; struct Vmware { - ulong mmio; - ulong fb; - ulong ra; ulong rd; @@ -63,6 +54,7 @@ struct Vmware { char chan[32]; int depth; + int ver; }; static char* @@ -135,14 +127,15 @@ snarf(Vga* vga, Ctlr* ctlr) error("%s: vga->pci not set\n", ctlr->name); vm = alloc(sizeof(Vmware)); - switch(p->did){ - case 0x710: /* VMware video chipset #1 */ + case VMWARE1: /* VMware video chipset #1 */ + vm->ver = 1; vm->ra = 0x4560; vm->rd = 0x4560+4; break; - case 0x405: /* VMware video chipset #2, untested */ + case VMWARE2: /* VMware video chipset #2 */ + vm->ver = 2; vm->ra = p->mem[0].bar&~3; vm->rd = vm->ra+1; break; @@ -177,7 +170,9 @@ snarf(Vga* vga, Ctlr* ctlr) sprint(vm->chan, "unknown"); /* Record the frame buffer start, size */ - vga->vmb = vm->r[Rfbstart]; + // vga->vmb = vm->r[Rfstart]; + vga->vmb = p->mem[1].bar & ~0xF; + vga->vmb += vm->r[Rfboffset]; vga->apz = vm->r[Rfbmaxsize]; vga->private = vm; |