aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <jara@hensl.cz>2023-08-07 20:28:14 +0200
committerJaroslav Hensl <jara@hensl.cz>2023-08-07 20:28:14 +0200
commitfaa5dfab0aab9fde192329ba4216a69152518210 (patch)
treeb7b97819cd79232cb3b34cf16faed091dfe729ec
parent8f209e89ba708dbeb82494ec9da14f7cbb5f2d31 (diff)
downloadvmdisp9x-faa5dfab0aab9fde192329ba4216a69152518210.tar.gz
command buffers (vGPU9 + vGPU10)
-rw-r--r--control.c3
-rw-r--r--control_vxd.c63
-rw-r--r--control_vxd.h10
-rw-r--r--modes.c16
-rw-r--r--version.h2
-rw-r--r--vmware/svga_reg.h1
-rw-r--r--vmwsvxd.c128
-rw-r--r--vmwsvxd.h2
8 files changed, 189 insertions, 36 deletions
diff --git a/control.c b/control.c
index 8130ec5..40a996f 100644
--- a/control.c
+++ b/control.c
@@ -182,6 +182,7 @@ typedef struct _svga_hda_t
#define ULF_LOCK_FIFO 6
#define GMR_INDEX_CNT 6
+#define CTX_INDEX_CNT 2
static svga_hda_t SVGAHDA;
@@ -325,7 +326,7 @@ void SVGAHDA_init()
SVGAHDA.ul_gmr_count = SVGA_ReadReg(SVGA_REG_GMR_MAX_IDS);
SVGAHDA.ul_ctx_start = SVGAHDA.ul_gmr_start + SVGAHDA.ul_gmr_count*GMR_INDEX_CNT;
SVGAHDA.ul_ctx_count = GetDevCap(SVGA3D_DEVCAP_MAX_CONTEXT_IDS);
- SVGAHDA.ul_surf_start = SVGAHDA.ul_ctx_start + SVGAHDA.ul_ctx_count;
+ SVGAHDA.ul_surf_start = SVGAHDA.ul_ctx_start + SVGAHDA.ul_ctx_count*CTX_INDEX_CNT;
SVGAHDA.ul_surf_count = GetDevCap(SVGA3D_DEVCAP_MAX_SURFACE_IDS);
SVGAHDA.userlist_length = SVGAHDA.ul_surf_start + SVGAHDA.ul_surf_count;
diff --git a/control_vxd.c b/control_vxd.c
index aaefb18..04852ec 100644
--- a/control_vxd.c
+++ b/control_vxd.c
@@ -37,7 +37,7 @@ extern void dbg_printf( const char *s, ... );
#define dbg_printf(...)
#endif
-static uint32_t VXD_srv = 0;
+static DWORD VXD_srv = 0;
#pragma code_seg( _INIT )
@@ -73,12 +73,12 @@ BOOL VXD_load()
return VXD_srv != 0;
}
-BOOL VXD_CreateRegion(uint32_t nPages, uint32_t __far *lpLAddr, uint32_t __far *lpPPN, uint32_t __far *lpPGBLKAddr)
+BOOL VXD_CreateRegion(DWORD nPages, DWORD __far *lpLAddr, DWORD __far *lpPPN, DWORD __far *lpPGBLKAddr)
{
- static uint32_t snPages;
- static uint32_t sLAddr;
- static uint32_t sPPN;
- static uint32_t sPGBLKAddr;
+ static DWORD snPages;
+ static DWORD sLAddr;
+ static DWORD sPPN;
+ static DWORD sPGBLKAddr;
static uint16_t state = 0;
snPages = nPages;
@@ -124,11 +124,11 @@ BOOL VXD_CreateRegion(uint32_t nPages, uint32_t __far *lpLAddr, uint32_t __far *
return FALSE;
}
-BOOL VXD_FreeRegion(uint32_t LAddr, uint32_t PGBLKAddr)
+BOOL VXD_FreeRegion(DWORD LAddr, DWORD PGBLKAddr)
{
- static uint32_t sLAddr;
+ static DWORD sLAddr;
static uint16_t state;
- static uint32_t sPGBLKAddr;
+ static DWORD sPGBLKAddr;
sLAddr = LAddr;
sPGBLKAddr = PGBLKAddr;
@@ -164,10 +164,10 @@ BOOL VXD_FreeRegion(uint32_t LAddr, uint32_t PGBLKAddr)
return FALSE;
}
-void VXD_zeromem(uint32_t LAddr, uint32_t size)
+void VXD_zeromem(DWORD LAddr, DWORD size)
{
- static uint32_t sLAddr;
- static uint32_t ssize;
+ static DWORD sLAddr;
+ static DWORD ssize;
sLAddr = LAddr;
ssize = size;
@@ -195,9 +195,9 @@ void VXD_zeromem(uint32_t LAddr, uint32_t size)
}
}
-uint32_t VXD_apiver()
+DWORD VXD_apiver()
{
- static uint32_t sver = 0;
+ static DWORD sver = 0;
if(VXD_srv != 0)
{
@@ -220,3 +220,38 @@ uint32_t VXD_apiver()
return sver;
}
+
+
+void CB_start()
+{
+ if(VXD_srv != 0)
+ {
+ _asm
+ {
+ .386
+ push eax
+ push edx
+ mov edx, VMWSVXD_PM16_CB_START
+ call dword ptr [VXD_srv]
+ pop edx
+ pop eax
+ }
+ }
+}
+
+void CB_stop()
+{
+ if(VXD_srv != 0)
+ {
+ _asm
+ {
+ .386
+ push eax
+ push edx
+ mov edx, VMWSVXD_PM16_CB_STOP
+ call dword ptr [VXD_srv]
+ pop edx
+ pop eax
+ }
+ }
+}
diff --git a/control_vxd.h b/control_vxd.h
index e2b624f..53f446b 100644
--- a/control_vxd.h
+++ b/control_vxd.h
@@ -2,9 +2,11 @@
#define __CONTROL_VXD_H__INCLUDED__
BOOL VXD_load();
-BOOL VXD_CreateRegion(uint32_t nPages, uint32_t __far *lpLAddr, uint32_t __far *lpPPN, uint32_t __far *lpPGBLKAddr);
-BOOL VXD_FreeRegion(uint32_t LAddr, uint32_t PGBLKAddr);
-void VXD_zeromem(uint32_t LAddr, uint32_t size);
-uint32_t VXD_apiver();
+BOOL VXD_CreateRegion(DWORD nPages, DWORD __far *lpLAddr, DWORD __far *lpPPN, DWORD __far *lpPGBLKAddr);
+BOOL VXD_FreeRegion(DWORD LAddr, DWORD PGBLKAddr);
+void VXD_zeromem(DWORD LAddr, DWORD size);
+DWORD VXD_apiver();
+void CB_start();
+void CB_stop();
#endif
diff --git a/modes.c b/modes.c
index fef8099..2a7e8fd 100644
--- a/modes.c
+++ b/modes.c
@@ -37,6 +37,7 @@ THE SOFTWARE.
#ifdef SVGA
# include "svga_all.h"
+# include "control_vxd.h"
#endif
#include "drvlib.h"
@@ -255,6 +256,12 @@ static void ClearVisibleScreen( void )
lpScr += wScreenPitchBytes; // Scanline pitch.
}
#endif
+#ifdef SVGA
+ DWORD dwPS = ((wBpp+7) >> 3);
+ DWORD cb = ((DWORD)wScreenY)*((DWORD)wScreenX)*dwPS;
+ VXD_zeromem(dwScreenFlatAddr, cb);
+ SVGA_UpdateRect(0, 0, wScreenX, wScreenY);
+#else
DWORD dwLinestart = 0;
WORD wLines = wScreenY;
WORD wPS = ((wBpp+7) >> 3);
@@ -265,6 +272,7 @@ static void ClearVisibleScreen( void )
dwLinestart += (DWORD)wScreenPitchBytes;
}
+#endif
}
/* Map physical memory to memory space, lpLinAddress is option pointer to store
@@ -448,6 +456,9 @@ static int SetDisplayMode( WORD wXRes, WORD wYRes, int bFullSet )
/* Make sure, that we drain full FIFO */
SVGA_Flush();
+ /* stop command buffer context 0 */
+ CB_stop();
+
SVGA_SetMode(wXRes, wYRes, wBpp); /* setup by legacy registry */
wMesa3DEnabled = 0;
if(SVGA3D_Init())
@@ -459,7 +470,11 @@ static int SetDisplayMode( WORD wXRes, WORD wYRes, int bFullSet )
if(SVGA_hasAccelScreen())
{
SVGA_defineScreen(wXRes, wYRes, wBpp);
+ SVGA_Flush();
}
+
+ /* start command buffer context 0 */
+ CB_start();
/*
* JH: this is a bit stupid = all SVGA command cannot work with non 32 bpp.
@@ -716,6 +731,7 @@ UINT WINAPI __loadds ValidateMode( DISPVALMODE FAR *lpValMode )
void PhysicalDisable(void)
{
#ifdef SVGA
+ CB_stop();
SVGA_Disable();
#endif
}
diff --git a/version.h b/version.h
index a520bc0..596dab6 100644
--- a/version.h
+++ b/version.h
@@ -5,7 +5,7 @@
#define DRV_STR(x) DRV_STR_(x)
/* DRV, VXD and DLL have to have the same */
-#define DRV_API_LEVEL 20230805UL
+#define DRV_API_LEVEL 20230807UL
/* on binaries equals 1 and for INF is 1 = separate driver, 2 = softgpu pack */
#define DRV_VER_MAJOR 1
diff --git a/vmware/svga_reg.h b/vmware/svga_reg.h
index 030e77f..8c88121 100644
--- a/vmware/svga_reg.h
+++ b/vmware/svga_reg.h
@@ -402,6 +402,7 @@ typedef enum {
SVGA_CB_CONTEXT_DEVICE = 0x3f,
SVGA_CB_CONTEXT_0 = 0x0,
SVGA_CB_CONTEXT_MAX = 0x1,
+ SVGA_CB_CONTEXT_FORCE_UINT = MAX_UINT32,
} SVGACBContext;
diff --git a/vmwsvxd.c b/vmwsvxd.c
index 3e17b56..3a88ba8 100644
--- a/vmwsvxd.c
+++ b/vmwsvxd.c
@@ -105,7 +105,7 @@ char dbg_dic_unknown[] = "DeviceIOControl: Unknown: %d\n";
char dbg_dic_system[] = "DeviceIOControl: System code: %d\n";
char dbg_get_ppa[] = "%lx -> %lx\n";
char dbg_get_ppa_beg[] = "Virtual: %lx\n";
-char dbg_mob_allocate[] = "Allocted: %d\n";
+char dbg_mob_allocate[] = "Allocated OTable row: %d\n";
char dbg_str[] = "%s\n";
@@ -113,8 +113,11 @@ char dbg_submitcb_fail[] = "CB submit FAILED\n";
char dbg_submitcb[] = "CB submit %d\n";
char dbg_lockcb[] = "Reused CB (%d) with status: %d\n";
+char dbg_lockcb_lasterr[] = "Error command: %lX\n";
+
char dbg_cb_on[] = "CB supported and allocated\n";
char dbg_gb_on[] = "GB supported and allocated\n";
+char dbg_cb_ena[] = "CB context 0 enabled\n";
char dbg_region_info_1[] = "Region id = %d\n";
char dbg_region_info_2[] ="Region address = %lX, PPN = %lX, GMRBLK = %lX\n";
@@ -148,6 +151,7 @@ cmd_buf_t cmd_bufs[CB_COUNT] = {{0}};
BOOL cb_support = FALSE;
BOOL gb_support = FALSE;
+BOOL cb_context0 = FALSE;
#define ROUND_TO_PAGES(_cb)((((_cb) + PAGE_SIZE - 1)/PAGE_SIZE)*PAGE_SIZE)
@@ -615,10 +619,22 @@ static void *LockCB()
{
if(isCBfree(index))
{
+#ifdef DBGPRINT
{
SVGACBHeader *cb = (SVGACBHeader *)cmd_bufs[index].lin;
- dbg_printf(dbg_lockcb, index, cb->status);
+ if(cb->status > 1)
+ {
+ dbg_printf(dbg_lockcb, index, cb->status);
+
+ if(cb->status == SVGA_CB_STATUS_COMMAND_ERROR)
+ {
+ DWORD *ptr = (DWORD*)(((unsigned char*)cmd_bufs[index].lin) + sizeof(SVGACBHeader) + cb->errorOffset);
+ dbg_printf(dbg_lockcb_lasterr, *ptr);
+ }
+
+ }
}
+#endif
cmd_bufs[index].status = CB_STATUS_LOCKED;
return cmd_bufs[index].lin;
}
@@ -637,6 +653,12 @@ static BOOL submitCB(void *ptr, DWORD cbctx_id)
{
int index;
+ /* context 0 is turned on and of by driver and if it is off don't use it! */
+ if(cb_context0 == FALSE && cbctx_id == SVGA_CB_CONTEXT_0)
+ {
+ return FALSE;
+ }
+
for(index = 0; index < CB_COUNT; index++)
{
if(cmd_bufs[index].lin == ptr)
@@ -655,7 +677,7 @@ static BOOL submitCB(void *ptr, DWORD cbctx_id)
SVGA_WriteReg(SVGA_REG_COMMAND_LOW, cmd_bufs[index].phy | cbctx_id);
cmd_bufs[index].status = CB_STATUS_PROCESS;
- dbg_printf(dbg_submitcb, index);
+ //dbg_printf(dbg_submitcb, cbctx_id);
nextID_CB();
}
@@ -701,6 +723,11 @@ static void syncCB()
}
}
}
+
+ if(!synced)
+ {
+ SVGA_WriteReg(SVGA_REG_SYNC, 1);
+ }
} while(!synced);
}
@@ -717,6 +744,31 @@ BOOL FreeRegion(ULONG LAddr, ULONG PGBLK, ULONG MobAddr)
return GMRFree(LAddr, PGBLK, MobAddr);
}
+/* some CRT */
+void memset(void *dst, int c, unsigned int size)
+{
+ unsigned int par;
+ unsigned int i;
+ unsigned int dw_count;
+ unsigned int dw_size;
+
+ c &= 0xFF;
+ par = (c << 24) | (c << 16) | (c << 8) | c;
+ dw_count = size >> 2;
+ dw_size = size & 0xFFFFFFFCUL;
+
+ for(i = 0; i < dw_count; i++)
+ {
+ ((unsigned int*)dst)[i] = par;
+ }
+
+ for(i = dw_size; i < size; i++)
+ {
+ ((unsigned char*)dst)[i] = c;
+ }
+}
+
+
#if 0
/* I'm using this sometimes for developing, not for end user! */
BOOL AllocPhysical(DWORD nPages, DWORD *outLinear, DWORD *outPhysical)
@@ -737,6 +789,16 @@ void FreePhysical(DWORD linear)
}
#endif
+#pragma pack(push)
+#pragma pack(1)
+typedef struct _cb_enable_t
+{
+ SVGACBHeader cbheader;
+ uint32 cmd;
+ SVGADCCmdStartStop cbstart;
+} cb_enable_t;
+#pragma pack(pop)
+
/* process V86/PM16 calls */
WORD __stdcall VMWS_API_Proc(PCRS_32 state)
{
@@ -792,12 +854,15 @@ WORD __stdcall VMWS_API_Proc(PCRS_32 state)
/* clear memory on linear address (ESI) by defined size (ECX) */
case VMWSVXD_PM16_ZEROMEM:
{
+ /*
ULONG i = 0;
unsigned char *ptr = (unsigned char *)state->Client_ESI;
for(i = 0; i < state->Client_ECX; i++)
{
ptr[i] = 0;
}
+ */
+ memset((void*)state->Client_ESI, 0, state->Client_ECX);
rc = 1;
break;
}
@@ -806,6 +871,47 @@ WORD __stdcall VMWS_API_Proc(PCRS_32 state)
state->Client_ECX = DRV_API_LEVEL;
rc = 1;
break;
+ case VMWSVXD_PM16_CB_START:
+ if(cb_support)
+ {
+ cb_enable_t *cbe;
+ do
+ {
+ cbe = LockCB();
+ } while(cbe == NULL);
+ memset(cbe, 0, sizeof(cb_enable_t));
+ cbe->cbheader.length = sizeof(SVGADCCmdStartStop) + sizeof(uint32);
+ cbe->cmd = SVGA_DC_CMD_START_STOP_CONTEXT;
+ cbe->cbstart.enable = 1;
+ cbe->cbstart.context = SVGA_CB_CONTEXT_0;
+ submitCB(cbe, SVGA_CB_CONTEXT_DEVICE);
+ syncCB();
+
+ dbg_printf(dbg_cb_ena);
+ cb_context0 = TRUE;
+ }
+ rc = 1;
+ break;
+ case VMWSVXD_PM16_CB_STOP:
+ if(cb_support)
+ {
+ cb_enable_t *cbe;
+ cb_context0 = FALSE;
+
+ syncCB();
+ do
+ {
+ cbe = LockCB();
+ } while(cbe == NULL);
+ memset(cbe, 0, sizeof(cb_enable_t));
+ cbe->cbheader.length = sizeof(SVGADCCmdStartStop) + sizeof(uint32);
+ cbe->cmd = SVGA_DC_CMD_START_STOP_CONTEXT;
+ cbe->cbstart.enable = 0;
+ cbe->cbstart.context = SVGA_CB_CONTEXT_0;
+ submitCB(cbe, SVGA_CB_CONTEXT_DEVICE);
+ }
+ rc = 1;
+ break;
}
if(rc == 0xFFFF)
@@ -893,11 +999,9 @@ DWORD __stdcall Device_IO_Control_entry(struct DIOCParams *params)
dbg_printf(dbg_dic_system, params->dwIoControlCode);
return 0;
case SVGA_SYNC:
- //dbg_printf(dbg_dic_sync);
SVGA_Flush();
return 0;
case SVGA_RING:
- //dbg_printf(dbg_dic_ring);
SVGA_WriteReg(SVGA_REG_SYNC, 1);
return 0;
#if 0
@@ -973,13 +1077,9 @@ DWORD __stdcall Device_IO_Control_entry(struct DIOCParams *params)
{
if(cb_support)
{
- void *ptr = LockCB();
- if(ptr)
- {
- DWORD* out = (DWORD*)params->lpOutBuffer;
- *out = (DWORD)ptr;
- return 0;
- }
+ DWORD *out = (DWORD*)params->lpOutBuffer;
+ out[0] = (DWORD)LockCB();
+ return 0;
}
return 1;
}
@@ -1066,10 +1166,6 @@ DWORD __stdcall Device_IO_Control_entry(struct DIOCParams *params)
DWORD *lpIn = (DWORD*)params->lpInBuffer;
/* flush all register inc. fifo so make sure, that all commands are processed */
- if(cb_support)
- {
- syncCB();
- }
SVGA_Flush();
SVGA_WriteReg(SVGA_REG_GMR_ID, lpIn[0]);
diff --git a/vmwsvxd.h b/vmwsvxd.h
index 9e2f371..f991704 100644
--- a/vmwsvxd.h
+++ b/vmwsvxd.h
@@ -16,5 +16,7 @@
#define VMWSVXD_PM16_DESTROY_REGION 3
#define VMWSVXD_PM16_ZEROMEM 6
#define VMWSVXD_PM16_APIVER 7
+#define VMWSVXD_PM16_CB_START 8
+#define VMWSVXD_PM16_CB_STOP 9
#endif