aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <jara@hensl.cz>2024-06-23 19:56:36 +0200
committerJaroslav Hensl <jara@hensl.cz>2024-06-23 19:56:36 +0200
commit5efd87a49ee3f93acd0cf089c8a0071047abdc12 (patch)
tree06b9a3a4095f0d8a70db015d5d2272ef1c5e4850
parent4b02bef1a7b00ca8a392b7fa7ef36d6ad8fd4e88 (diff)
downloadvmdisp9x-5efd87a49ee3f93acd0cf089c8a0071047abdc12.tar.gz
API: +FBHDA_access_rect
-rw-r--r--3d_accel.h34
-rw-r--r--enable.c7
-rw-r--r--makefile4
-rw-r--r--pm16_calls.c38
-rw-r--r--vxd_main.c7
-rw-r--r--vxd_svga.c121
-rw-r--r--vxd_svga.h7
-rw-r--r--vxd_svga_mouse.c20
-rw-r--r--vxd_svga_st.c1
-rw-r--r--vxd_vbe.c5
10 files changed, 159 insertions, 85 deletions
diff --git a/3d_accel.h b/3d_accel.h
index fc69391..bb8d62f 100644
--- a/3d_accel.h
+++ b/3d_accel.h
@@ -33,25 +33,28 @@ THE SOFTWARE.
#endif
#endif
-#define API_3DACCEL_VER 20240514
+#define API_3DACCEL_VER 20240621
+
+#define ESCAPE_DRV_NT 0x1103 /* (4355) */
/* function codes */
#define OP_FBHDA_SETUP 0x110B /* VXD, DRV, ExtEscape */
-#define OP_FBHDA_ACCESS_BEGIN 0x110C /* VXD, DRV */
-#define OP_FBHDA_ACCESS_END 0x110D /* VXD, DRV */
-#define OP_FBHDA_SWAP 0x110E /* VXD, DRV */
-#define OP_FBHDA_CLEAN 0x110F /* VXD, DRV */
-#define OP_FBHDA_PALETTE_SET 0x1110 /* VXD, DRV */
-#define OP_FBHDA_PALETTE_GET 0x1111 /* VXD, DRV */
-
-#define OP_SVGA_VALID 0x2000 /* VXD, DRV */
+#define OP_FBHDA_ACCESS_BEGIN 0x110C /* VXD, DRV, ESCAPE_DRV_NT */
+#define OP_FBHDA_ACCESS_END 0x110D /* VXD, DRV, ESCAPE_DRV_NT */
+#define OP_FBHDA_SWAP 0x110E /* VXD, DRV, ESCAPE_DRV_NT */
+#define OP_FBHDA_CLEAN 0x110F /* VXD, DRV, ESCAPE_DRV_NT */
+#define OP_FBHDA_PALETTE_SET 0x1110 /* VXD, DRV, ESCAPE_DRV_NT */
+#define OP_FBHDA_PALETTE_GET 0x1111 /* VXD, DRV, ESCAPE_DRV_NT */
+#define OP_FBHDA_ACCESS_RECT 0x1112 /* VXD, DRV, ESCAPE_DRV_NT */
+
+#define OP_SVGA_VALID 0x2000 /* VXD, DRV, ESCAPE_DRV_NT */
#define OP_SVGA_SETMODE 0x2001 /* DRV */
#define OP_SVGA_VALIDMODE 0x2002 /* DRV */
#define OP_SVGA_HW_ENABLE 0x2003 /* DRV */
#define OP_SVGA_HW_DISABLE 0x2004 /* DRV */
-#define OP_SVGA_CMB_ALLOC 0x2005 /* VXD, DRV */
-#define OP_SVGA_CMB_FREE 0x2006 /* VXD, DRV */
-#define OP_SVGA_CMB_SUBMIT 0x2007 /* VXD, DRV */
+#define OP_SVGA_CMB_ALLOC 0x2005 /* VXD, DRV, ESCAPE_DRV_NT */
+#define OP_SVGA_CMB_FREE 0x2006 /* VXD, DRV, ESCAPE_DRV_NT */
+#define OP_SVGA_CMB_SUBMIT 0x2007 /* VXD, DRV, ESCAPE_DRV_NT */
#define OP_SVGA_FENCE_GET 0x2008 /* VXD */
#define OP_SVGA_FENCE_QUERY 0x2009 /* VXD */
#define OP_SVGA_FENCE_WAIT 0x200A /* VXD */
@@ -64,11 +67,11 @@ THE SOFTWARE.
#define OP_SVGA_FLUSHCACHE 0x2011 /* VXD */
#define OP_SVGA_VXDCMD 0x2012 /* VXD */
-#define OP_VBE_VALID 0x3000 /* VXD, DRV */
+#define OP_VBE_VALID 0x3000 /* VXD, DRV, ESCAPE_DRV_NT */
#define OP_VBE_SETMODE 0x3001 /* DRV */
#define OP_VBE_VALIDMODE 0x3002 /* DRV */
-#define OP_VESA_VALID 0x4000 /* VXD, DRV */
+#define OP_VESA_VALID 0x4000 /* VXD, DRV, ESCAPE_DRV_NT */
#define OP_VESA_SETMODE 0x4001 /* DRV */
#define OP_VESA_VALIDMODE 0x4002 /* DRV */
@@ -107,7 +110,7 @@ typedef struct FBHDA
void __far *vram_pm16;
#endif
DWORD vram_size;
- char vxdname[16];
+ char vxdname[16]; /* file name or "NT" */
} FBHDA_t;
#define FB_SUPPORT_FLIPING 1
@@ -139,6 +142,7 @@ void FBHDA_free();
void FBHDA_access_begin(DWORD flags);
void FBHDA_access_end(DWORD flags);
+void FBHDA_access_rect(DWORD left, DWORD top, DWORD right, DWORD bottom);
BOOL FBHDA_swap(DWORD offset);
void FBHDA_clean();
diff --git a/enable.c b/enable.c
index 9958063..17e2fbd 100644
--- a/enable.c
+++ b/enable.c
@@ -145,10 +145,10 @@ DWORD PASCAL CreateDIBPDeviceX( LPBITMAPINFO lpInfo, LPPDEVICE lpDevice, LPVOID
VOID WINAPI __loadds BeginAccess_VXD( LPPDEVICE lpDevice, WORD wLeft, WORD wTop, WORD wRight, WORD wBottom, WORD wFlags )
{
- DWORD dflags = 0;
if(wFlags & CURSOREXCLUDE)
{
- FBHDA_access_begin(dflags);
+ FBHDA_access_rect(wLeft, wTop, wRight, wBottom);
+// FBHDA_access_begin(dflags);
}
if(!mouse_vxd)
{
@@ -158,14 +158,13 @@ VOID WINAPI __loadds BeginAccess_VXD( LPPDEVICE lpDevice, WORD wLeft, WORD wTop,
VOID WINAPI __loadds EndAccess_VXD( LPPDEVICE lpDevice, WORD wFlags )
{
- DWORD dflags = 0;
if(!mouse_vxd)
{
DIB_EndAccess(lpDevice, wFlags);
}
if(wFlags & CURSOREXCLUDE)
{
- FBHDA_access_end(dflags);
+ FBHDA_access_end(0);
}
}
diff --git a/makefile b/makefile
index 36e6896..0d0ebf1 100644
--- a/makefile
+++ b/makefile
@@ -12,7 +12,7 @@ OBJS += &
INCS = -I$(%WATCOM)\h\win -Iddk -Ivmware
-VER_BUILD = 48
+VER_BUILD = 54
FLAGS = -DDRV_VER_BUILD=$(VER_BUILD)
@@ -35,7 +35,7 @@ FIXER_CC = wcl386 -q drvfix.c -fe=$(FIXER_EXE)
#FLAGS += -DHWBLT
# Set DBGPRINT to add debug printf logging.
-DBGPRINT = 1
+#DBGPRINT = 1
!ifdef DBGPRINT
FLAGS += -DDBGPRINT
diff --git a/pm16_calls.c b/pm16_calls.c
index c391c74..c3a5d19 100644
--- a/pm16_calls.c
+++ b/pm16_calls.c
@@ -169,6 +169,44 @@ void FBHDA_access_end(DWORD flags)
}
}
+void FBHDA_access_rect(DWORD left, DWORD top, DWORD right, DWORD bottom)
+{
+ static DWORD sL;
+ static DWORD sTop;
+ static DWORD sR;
+ static DWORD sB;
+
+ sL = left;
+ sTop = top;
+ sR = right;
+ sB = bottom;
+
+ _asm
+ {
+ .386
+ push eax
+ push edx
+ push ebx
+ push ecx
+ push esi
+ push edi
+
+ mov edx, OP_FBHDA_ACCESS_RECT
+ mov ebx, [sL]
+ mov ecx, [sTop]
+ mov esi, [sR]
+ mov edi, [sB]
+ call dword ptr [VXD_VM]
+
+ pop edi
+ pop esi
+ pop ecx
+ pop ebx
+ pop edx
+ pop eax
+ }
+}
+
BOOL FBHDA_swap(DWORD offset)
{
static DWORD sOffset;
diff --git a/vxd_main.c b/vxd_main.c
index ff29170..4cacbc2 100644
--- a/vxd_main.c
+++ b/vxd_main.c
@@ -256,6 +256,10 @@ WORD __stdcall VXD_API_Proc(PCRS_32 state)
FBHDA_access_end(state->Client_ECX);
rc = 1;
break;
+ case OP_FBHDA_ACCESS_RECT:
+ FBHDA_access_rect(state->Client_EBX, state->Client_ECX, state->Client_ESI, state->Client_EDI);
+ rc = 1;
+ break;
case OP_FBHDA_SWAP:
{
BOOL rs;
@@ -506,6 +510,9 @@ DWORD __stdcall Device_IO_Control_proc(DWORD vmhandle, struct DIOCParams *params
case OP_FBHDA_ACCESS_END:
FBHDA_access_end(inBuf[0]);
return 0;
+ case OP_FBHDA_ACCESS_RECT:
+ FBHDA_access_rect(inBuf[0], inBuf[1], inBuf[2], inBuf[3]);
+ return 0;
case OP_FBHDA_SWAP:
outBuf[0] = FBHDA_swap(inBuf[0]);
return 0;
diff --git a/vxd_svga.c b/vxd_svga.c
index 924d072..e024bf6 100644
--- a/vxd_svga.c
+++ b/vxd_svga.c
@@ -161,15 +161,18 @@ static SVGA_OT_info_entry_t *otable = NULL;
* strings
*/
static char SVGA_conf_path[] = "Software\\VMWSVGA";
+/*
static char SVGA_conf_hw_cursor[] = "HWCursor";
+ ^ removed, use screen target + ST_CURSOR
+*/
static char SVGA_conf_vram_limit[] = "VRAMLimit";
static char SVGA_conf_rgb565bug[] = "RGB565bug";
static char SVGA_conf_cb[] = "CommandBuffers";
static char SVGA_conf_pref_fifo[] = "PreferFIFO";
static char SVGA_conf_hw_version[] = "HWVersion";
-static char SVGA_conf_st_size[] = "STSurface";
-static char SVGA_conf_st_16b[] = "ST16bpp";
-static char SVGA_vxd_name[] = "vmwsmini.vxd";
+static char SVGA_conf_st_size[] = "STSize";
+static char SVGA_conf_st_flags[] = "STOptions";
+static char SVGA_vxd_name[] = "vmwsmini.vxd";
/* VM handle */
extern DWORD ThisVM;
@@ -925,7 +928,7 @@ static DWORD fb_pm16 = 0;
static DWORD st_pm16 = 0;
static DWORD st_address = 0;
static DWORD st_surface_mb = 0;
-static DWORD st_16bpp = 0;
+
BOOL st_useable(DWORD bpp)
{
@@ -933,7 +936,7 @@ BOOL st_useable(DWORD bpp)
{
if(bpp == 32) return TRUE;
- if(bpp == 16 && st_16bpp)
+ if(bpp == 16 && (st_flags & ST_16BPP))
{
return TRUE;
}
@@ -951,7 +954,6 @@ BOOL st_useable(DWORD bpp)
BOOL SVGA_init_hw()
{
/* defaults */
- DWORD conf_hw_cursor = 0;
DWORD conf_vram_limit = 0;
DWORD conf_rgb565bug = 1;
DWORD conf_cb = 1;
@@ -960,7 +962,6 @@ BOOL SVGA_init_hw()
int rc;
/* configs in registry */
- RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_hw_cursor, &conf_hw_cursor);
RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_vram_limit, &conf_vram_limit);
RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_rgb565bug, &conf_rgb565bug);
RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_cb, &conf_cb);
@@ -968,7 +969,7 @@ BOOL SVGA_init_hw()
RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_pref_fifo, &prefer_fifo);
RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_st_size, &st_surface_mb);
- RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_st_16b, &st_16bpp);
+ RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_st_flags, &st_flags);
if(!FBHDA_init_hw())
{
@@ -990,22 +991,6 @@ BOOL SVGA_init_hw()
gSVGA.userFlags |= SVGA_USER_FLAGS_RGB565_BROKEN;
}
- if(SVGA_ReadReg(SVGA_REG_CAPABILITIES) & SVGA_CAP_CURSOR)
- {
- if(conf_hw_cursor)
- {
- gSVGA.userFlags |= SVGA_USER_FLAGS_HWCURSOR;
- }
- }
-
- if(SVGA_ReadReg(SVGA_REG_CAPABILITIES) & SVGA_CAP_ALPHA_CURSOR)
- {
- if(conf_hw_cursor)
- {
- gSVGA.userFlags |= SVGA_USER_FLAGS_ALPHA_CUR;
- }
- }
-
if(conf_vram_limit > SVGA_MIN_VRAM)
{
if(gSVGA.vramSize > conf_vram_limit*(1024*1024))
@@ -1488,32 +1473,6 @@ void SVGA_flushcache()
for(i = 0; i < cache_state.free_index_max ; i++)
{
cache_delete(i);
-/* if(cache_state.spare_region[i].used != FALSE)
- {
- SVGA_region_info_t *rinfo = &cache_state.spare_region[i].region;
- BYTE *free_ptr = (BYTE*)rinfo->address;
-
- if(rinfo->region_address != NULL)
- {
- dbg_printf(dbg_pagefree, rinfo->region_address);
- _PageFree((PVOID)rinfo->region_address, 0);
- }
- else
- {
- free_ptr -= P_SIZE;
- }
-
- if(rinfo->mob_address != NULL)
- {
- dbg_printf(dbg_pagefree, rinfo->mob_address);
- _PageFree((PVOID)rinfo->mob_address, 0);
- }
-
- dbg_printf(dbg_pagefree, free_ptr);
- _PageFree((PVOID)free_ptr, 0);
-
- cache_state.spare_region[i].used = FALSE;
- }*/
}
cache_state.free_index_max = 0;
@@ -2074,6 +2033,16 @@ BOOL FBHDA_swap(DWORD offset)
void FBHDA_access_begin(DWORD flags)
{
+ FBHDA_access_rect(0, 0, hda->width, hda->height);
+}
+
+static DWORD rect_left;
+static DWORD rect_top;
+static DWORD rect_right;
+static DWORD rect_bottom;
+
+void FBHDA_access_rect(DWORD left, DWORD top, DWORD right, DWORD bottom)
+{
Wait_Semaphore(hda_sem, 0);
if(fb_lock_cnt++ == 0)
@@ -2108,6 +2077,25 @@ void FBHDA_access_begin(DWORD flags)
}
mouse_erase();
+
+ rect_left = left;
+ rect_top = top;
+ rect_right = right;
+ rect_bottom = bottom;
+ }
+ else
+ {
+ if(left < rect_left)
+ rect_left = left;
+
+ if(top < rect_top)
+ rect_top = top;
+
+ if(right > rect_right)
+ rect_right = right;
+
+ if(bottom > rect_bottom)
+ rect_bottom = bottom;
}
Signal_Semaphore(hda_sem);
@@ -2127,19 +2115,40 @@ void FBHDA_access_end(DWORD flags)
{
SVGA3dCmdUpdateGBSurface *gbupdate;
SVGA3dCmdUpdateGBScreenTarget *stupdate;
+ SVGA3dCmdUpdateGBImage *gbupdate_rect;
DWORD cmd_offset = 0;
+ DWORD w = rect_right - rect_left;
+ DWORD h = rect_bottom - rect_top;
wait_for_cmdbuf();
- gbupdate = SVGA_cmd3d_ptr(cmdbuf, &cmd_offset, SVGA_3D_CMD_UPDATE_GB_SURFACE, sizeof(SVGA3dCmdUpdateGBSurface));
- gbupdate->sid = ST_SURFACE_ID;
+ if(w == hda->width && h == hda->height)
+ {
+ /* full screen update */
+ gbupdate = SVGA_cmd3d_ptr(cmdbuf, &cmd_offset, SVGA_3D_CMD_UPDATE_GB_SURFACE, sizeof(SVGA3dCmdUpdateGBSurface));
+ gbupdate->sid = ST_SURFACE_ID;
+ }
+ else
+ {
+ /* partial box */
+ gbupdate_rect = SVGA_cmd3d_ptr(cmdbuf, &cmd_offset, SVGA_3D_CMD_UPDATE_GB_IMAGE, sizeof(SVGA3dCmdUpdateGBImage));
+ gbupdate_rect->image.sid = ST_SURFACE_ID;
+ gbupdate_rect->image.face = 0;
+ gbupdate_rect->image.mipmap = 0;
+ gbupdate_rect->box.x = rect_left;
+ gbupdate_rect->box.y = rect_top;
+ gbupdate_rect->box.z = 0;
+ gbupdate_rect->box.w = w;
+ gbupdate_rect->box.h = h;
+ gbupdate_rect->box.d = 1;
+ }
stupdate = SVGA_cmd3d_ptr(cmdbuf, &cmd_offset, SVGA_3D_CMD_UPDATE_GB_SCREENTARGET, sizeof(SVGA3dCmdUpdateGBScreenTarget));
stupdate->stid = 0;
- stupdate->rect.x = 0;
- stupdate->rect.y = 0;
- stupdate->rect.w = hda->width;
- stupdate->rect.h = hda->height;
+ stupdate->rect.x = rect_left;
+ stupdate->rect.y = rect_top;
+ stupdate->rect.w = w;
+ stupdate->rect.h = h;
submit_cmdbuf(cmd_offset, SVGA_CB_PRESENT_ASYNC, 0);
}
diff --git a/vxd_svga.h b/vxd_svga.h
index 9443a22..d9c767d 100644
--- a/vxd_svga.h
+++ b/vxd_svga.h
@@ -9,7 +9,8 @@ void *SVGA_cmd3d_ptr(DWORD *buf, DWORD *pOffset, DWORD cmd, DWORD cmdsize);
DWORD SVGA_pitch(DWORD width, DWORD bpp);
void SVGA_region_usage_reset();
-extern BOOL st_used;
+extern BOOL st_used;
+extern DWORD st_flags;
BOOL st_memory_allocate(DWORD size, DWORD *out);
void st_defineScreen(DWORD w, DWORD h, DWORD bpp);
void st_destroyScreen();
@@ -19,6 +20,10 @@ SVGA_DB_surface_t *SVGA_GetSurfaceInfo(DWORD sid);
#define ST_REGION_ID 1
#define ST_SURFACE_ID 1
+#define ST_16BPP 1
+#define ST_CURSOR 2
+#define ST_CURSOR_HIDEABLE 3
+
BOOL st_useable(DWORD bpp);
DWORD map_pm16(DWORD vm, DWORD linear, DWORD size);
diff --git a/vxd_svga_mouse.c b/vxd_svga_mouse.c
index c3fea85..9059a8b 100644
--- a/vxd_svga_mouse.c
+++ b/vxd_svga_mouse.c
@@ -193,9 +193,12 @@ BOOL SVGA_mouse_hw()
{
if(st_used)
{
- if(SVGA_HasFIFOCap(SVGA_FIFO_CAP_CURSOR_BYPASS_3))
+ if(st_flags & ST_CURSOR)
{
- return TRUE;
+ if(SVGA_HasFIFOCap(SVGA_FIFO_CAP_CURSOR_BYPASS_3))
+ {
+ return TRUE;
+ }
}
}
@@ -232,15 +235,18 @@ void SVGA_mouse_show()
void SVGA_mouse_hide()
{
dbg_printf(dbg_hw_mouse_hide);
- if(hw_cursor_valid)
+
+ gSVGA.fifoMem[SVGA_FIFO_CURSOR_SCREEN_ID] = 0;
+ gSVGA.fifoMem[SVGA_FIFO_CURSOR_ON] = 0;
+
+ /* vbox bug, move cursor outside screen */
+ if((st_flags & ST_CURSOR_HIDEABLE) == 0)
{
- gSVGA.fifoMem[SVGA_FIFO_CURSOR_SCREEN_ID] = 0;
- gSVGA.fifoMem[SVGA_FIFO_CURSOR_ON] = 0;
- /* vbox bug, move cursor outside screen */
gSVGA.fifoMem[SVGA_FIFO_CURSOR_X] = hda->width;
gSVGA.fifoMem[SVGA_FIFO_CURSOR_Y] = hda->height;
- gSVGA.fifoMem[SVGA_FIFO_CURSOR_COUNT]++;
}
+
+ gSVGA.fifoMem[SVGA_FIFO_CURSOR_COUNT]++;
hw_cursor_visible = FALSE;
}
diff --git a/vxd_svga_st.c b/vxd_svga_st.c
index 832cd80..683c293 100644
--- a/vxd_svga_st.c
+++ b/vxd_svga_st.c
@@ -47,6 +47,7 @@ THE SOFTWARE.
#define SVGA3D_SURFACE_BIND_RENDER_TARGET (1 << 24)
BOOL st_used = FALSE;
+DWORD st_flags = 0;
static BOOL st_defined = FALSE;
static SVGA_region_info_t st_region;
diff --git a/vxd_vbe.c b/vxd_vbe.c
index b641b5d..9fe6673 100644
--- a/vxd_vbe.c
+++ b/vxd_vbe.c
@@ -318,6 +318,11 @@ void FBHDA_access_begin(DWORD flags)
}
}
+void FBHDA_access_rect(DWORD left, DWORD top, DWORD right, DWORD bottom)
+{
+ FBHDA_access_begin(0);
+}
+
void FBHDA_access_end(DWORD flags)
{
fb_lock_cnt--;