ref: c2180af956cce13b1a0705a7530328dd2b2df8f2
parent: b1fa1a51a2d426ebf0a9ccfc85ed13873b128aec
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Fri Aug 10 11:17:27 EDT 2012
vgavmware: fix hardware acceleration (fill is not available with SVGA2)
--- a/sys/src/9/pc/vgavmware.c
+++ b/sys/src/9/pc/vgavmware.c
@@ -35,13 +35,13 @@
Rgmask,
Rbmask,
Rbpl,
- Rfbstart,
+ Rfbstart, /* deprecated */
Rfboffset,
Rfbmaxsize,
Rfbsize,
Rcap,
- Rmemstart,
+ Rmemstart, /* deprecated */
Rmemsize,
Rconfigdone,
@@ -55,17 +55,6 @@
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 @@
char chan[32];
int depth;
+ int ver;
};
Vmware xvm;
@@ -160,13 +150,13 @@
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 @@
}
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 @@
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 @@
if(vm->mmio == nil)
return;
+
vmfifowr(vm, Xdefinecursor);
vmfifowr(vm, 1); /* cursor id */
vmfifowr(vm, -c->offset.x);
@@ -257,6 +266,8 @@
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 @@
static void
vmwaredisable(VGAscr*)
{+ if(vm->mmio == nil)
+ return;
vmwr(vm, Rcursorid, 1);
vmwr(vm, Rcursoron, CursorOnHide);
}
@@ -274,15 +287,12 @@
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 @@
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,
--- 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 @@
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 @@
char chan[32];
int depth;
+ int ver;
};
static char*
@@ -135,14 +127,15 @@
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 @@
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;
--
⑨