git: 9front

Download patch

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;
--