aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <emulator@emulace.cz>2025-07-05 12:12:47 +0200
committerJaroslav Hensl <emulator@emulace.cz>2025-07-05 12:12:47 +0200
commitd7cdd3f9a3c7fc6071e033e6605ea6541d45d491 (patch)
treeb22e5ffcad89b83adfed386d14b5dffbb12daf55
parent246d596f17232e8a8fc5239cb35b95f29abcb609 (diff)
downloadvmdisp9x-d7cdd3f9a3c7fc6071e033e6605ea6541d45d491.tar.gz
vram memory test (for vmware), support for QEMU+vmware-svga
-rw-r--r--3d_accel.h4
-rw-r--r--dddrv.c26
-rw-r--r--makefile2
-rw-r--r--vmm.h19
-rw-r--r--vxd_color.h21
-rw-r--r--vxd_fbhda.c35
-rw-r--r--vxd_halloc.c26
-rw-r--r--vxd_halloc.h2
-rw-r--r--vxd_lib.c5
-rw-r--r--vxd_lib.h2
-rw-r--r--vxd_main.c33
-rw-r--r--vxd_svga.c229
-rw-r--r--vxd_svga_cb.c9
-rw-r--r--vxd_vbe.c5
-rw-r--r--vxd_vdd.c38
15 files changed, 300 insertions, 156 deletions
diff --git a/3d_accel.h b/3d_accel.h
index 2badeb4..ba8d390 100644
--- a/3d_accel.h
+++ b/3d_accel.h
@@ -139,7 +139,7 @@ typedef struct FBHDA
DWORD vram_pm32;
void __far *vram_pm16;
#endif
- DWORD vram_size;
+ DWORD vram_size; /* real r/w memory size */
char vxdname[16]; /* file name or "NT" */
DWORD overlay;
FBHDA_overlay_t overlays[FBHDA_OVERLAYS_MAX];
@@ -162,7 +162,7 @@ typedef struct FBHDA
#endif
DWORD heap_count; /* number of blocks = heap_size_in_bytes / FB_VRAM_HEAP_GRANULARITY */
DWORD heap_length; /* maximum usable block with current framebuffer */
- DWORD res1;
+ DWORD vram_bar_size; /* PCI region size, may be larger then vram_size */
DWORD res2;
DWORD res3;
} FBHDA_t;
diff --git a/dddrv.c b/dddrv.c
index cfa4552..bc437ef 100644
--- a/dddrv.c
+++ b/dddrv.c
@@ -253,29 +253,19 @@ static void buildDDHALInfo(VMDAHAL_t __far *hal, int modeidx)
hal->vidMem[0].dwFlags = VIDMEM_ISLINEAR;
hal->vidMem[0].ddsCaps.dwCaps = 0;//DDSCAPS_OFFSCREENPLAIN; - what this memory CANNOT be used for
+ hal->vidMem[0].fpStart = hda->vram_pm32 + hda->system_surface + hda->stride;
+ hal->vidMem[0].fpEnd = hda->vram_pm32 + hda->vram_size - hda->overlays_size - 1;
+ hal->ddHALInfo.vmiData.dwNumHeaps = 1;
-#if 0
- if(hda->system_surface + hda->stride < FB_MEM_POOL && hda->vram_size > FB_MEM_POOL)
+ if(hda->vram_size < hda->vram_bar_size)
{
- hal->vidMem[0].fpStart = hda->vram_pm32 + FB_MEM_POOL;
- hal->vidMem[0].fpEnd = hda->vram_pm32 + hda->vram_size - hda->overlays_size - 1;
-
- hal->vidMem[1].fpStart = hda->vram_pm32 + hda->system_surface + hda->stride;
- hal->vidMem[1].fpEnd = hda->vram_pm32 + FB_MEM_POOL - 1;
+ /* on vmware is only first 16 MB regular memory, we map the "blackhole" to another heap, but driver will alocate surface in system memory */
+ hal->vidMem[1].fpStart = hda->vram_pm32 + hda->vram_size;
+ hal->vidMem[1].fpEnd = hda->vram_pm32 + hda->vram_bar_size - 1;
hal->vidMem[1].dwFlags = VIDMEM_ISLINEAR;
- hal->vidMem[1].ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
-
+ hal->vidMem[1].ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN;
hal->ddHALInfo.vmiData.dwNumHeaps = 2;
}
- else
- {
-#endif
- hal->vidMem[0].fpStart = hda->vram_pm32 + hda->system_surface + hda->stride;
- hal->vidMem[0].fpEnd = hda->vram_pm32 + hda->vram_size - hda->overlays_size - 1;
- hal->ddHALInfo.vmiData.dwNumHeaps = 1;
-#if 0
- }
-#endif
/*
* capabilities supported
diff --git a/makefile b/makefile
index 51f3783..cd69b71 100644
--- a/makefile
+++ b/makefile
@@ -13,7 +13,7 @@ OBJS += &
INCS = -I$(%WATCOM)\h\win -Iddk -Ivmware
-VER_BUILD = 105
+VER_BUILD = 107
FLAGS = -DDRV_VER_BUILD=$(VER_BUILD)
diff --git a/vmm.h b/vmm.h
index fc64c36..a12a6d8 100644
--- a/vmm.h
+++ b/vmm.h
@@ -1138,6 +1138,25 @@ typedef struct tagVxD_Desc_Block
#endif
+#define VMM___CallRing3 339
+#define VMM__Exec_PM_Int 340
+#define VMM___RegFlushKey 341
+#define VMM___PageCommitContig 342
+#define VMM___GetCurrentContext 343
+
+#define VMM___LocalizeSprintf 344
+#define VMM___LocalizeStackSprintf 345
+
+#define VMM__Call_Restricted_Event 346
+#define VMM__Cancel_Restricted_Event 347
+
+#define VMM__Register_PEF_Provider 348
+
+#define VMM___GetPhysPageInfo 349
+
+#define VMM___RegQueryInfoKey 350
+#define VMM__MemArb_Reserve_Pages 351
+
#pragma pack(push)
#pragma pack(1)
typedef struct tagCRS_32
diff --git a/vxd_color.h b/vxd_color.h
index 7b9ecf0..9123da5 100644
--- a/vxd_color.h
+++ b/vxd_color.h
@@ -3,6 +3,27 @@
DWORD palette_emulation[256] = {0};
+static inline void blit32(
+ void *src, DWORD src_pitch,
+ void *dst, DWORD dst_pitch,
+ DWORD blit_x, DWORD blit_y, DWORD blit_w, DWORD blit_h)
+{
+ const DWORD bottom = blit_y+blit_h;
+ DWORD x, y;
+ for(y = blit_y; y < bottom; y++)
+ {
+ DWORD *src_ptr = ((DWORD*)(((BYTE*)src) + src_pitch*y))+blit_x;
+ DWORD *dst_ptr = ((DWORD*)(((BYTE*)dst) + dst_pitch*y))+blit_x;
+
+ for(x = 0; x < blit_w; x++)
+ {
+ *dst_ptr = *src_ptr;
+ src_ptr++;
+ dst_ptr++;
+ }
+ }
+}
+
static inline void blit16(
void *src, DWORD src_pitch,
void *dst, DWORD dst_pitch,
diff --git a/vxd_fbhda.c b/vxd_fbhda.c
index b8bba8c..06e55b9 100644
--- a/vxd_fbhda.c
+++ b/vxd_fbhda.c
@@ -259,3 +259,38 @@ BOOL FBHDA_gamma_set(VOID FBPTR ramp, DWORD buffer_size)
return FALSE;
}
+#define TEST_PATTERN 0xAAAAAAAAUL
+
+void FBHDA_memtest()
+{
+ if(hda)
+ {
+ DWORD i;
+ DWORD *ptr = hda->vram_pm32;
+ DWORD size4 = hda->vram_size/4;
+
+ for(i = 0; i < size4; i++)
+ {
+ ptr[i] = TEST_PATTERN;
+ }
+
+ for(i = 0; i < size4; i++)
+ {
+ if(ptr[i] != TEST_PATTERN)
+ {
+ dbg_printf("VRAM memory error at %ld, fixing size\n", i*4);
+ hda->vram_size = i*4;
+ break;
+ }
+ }
+
+ size4 = i;
+ /* write black, parent may confuse some users... */
+ for(i = 0; i < size4; i++)
+ {
+ ptr[i] = 0;
+ }
+
+ dbg_printf("VRAM real size=%ld\n", size4);
+ }
+}
diff --git a/vxd_halloc.c b/vxd_halloc.c
index 65fb2a3..250f01c 100644
--- a/vxd_halloc.c
+++ b/vxd_halloc.c
@@ -131,14 +131,14 @@ static void block_clr(DWORD *bitmap, DWORD pos, DWORD cnt)
}
}
-static void update_stats()
+void vxd_hstats_update()
{
if(hda)
{
hda->gpu_mem_total = mem_total;
hda->gpu_mem_used = mem_used;
}
- dbg_printf("TOTAL: %ld, USED: %ld\n", mem_total, mem_used);
+ dbg_printf("GMR total: %ld, used: %ld\n", mem_total, mem_used);
}
static BOOL vxd_block(hblock_t *blk, DWORD pages_cnt, void **flat)
@@ -167,7 +167,7 @@ static BOOL vxd_block(hblock_t *blk, DWORD pages_cnt, void **flat)
if(blk->stats)
{
mem_used += pages_cnt * P_SIZE;
- update_stats();
+ vxd_hstats_update();
}
return TRUE;
@@ -194,7 +194,7 @@ static void vxd_block_free(hblock_t *blk, DWORD start_n)
if(blk->stats)
{
mem_used -= cnt * P_SIZE;
- update_stats();
+ vxd_hstats_update();
}
for(i = 0; i < cnt; i++)
@@ -218,12 +218,20 @@ static hblock_t *vxd_hinit_block(DWORD pages_cnt, BOOL shared, BOOL stats)
flat = _PageReserve(shared ? PR_SHARED : PR_SYSTEM, service_pages+pages_cnt, PR_FIXED);
if(flat)
{
- if(_PageCommit(flat >> 12, service_pages+pages_cnt, PD_FIXED, 0, PC_FIXED | PC_WRITEABLE | PC_USER) == 0)
+#if 0
+ if(_PageCommitContig(flat >> 12, service_pages+pages_cnt, PC_FIXED | PC_WRITEABLE | PC_USER, 0x00, 0, -1) == 0)
{
- dbg_printf("_PageCommit failed\n");
- _PageFree((PVOID)flat, 0);
- return NULL;
+ dbg_printf("_PageCommitContig failed, using mode more fragmented metod.\n");
+#endif
+ if(_PageCommit(flat >> 12, service_pages+pages_cnt, PD_FIXED, 0, PC_FIXED | PC_WRITEABLE | PC_USER) == 0)
+ {
+ dbg_printf("_PageCommit failed\n");
+ _PageFree((PVOID)flat, 0);
+ return NULL;
+ }
+#if 0
}
+#endif
/*
DWORD flat2 = _PageReAllocate(flat, service_pages+pages_cnt, 0);
@@ -249,6 +257,7 @@ static hblock_t *vxd_hinit_block(DWORD pages_cnt, BOOL shared, BOOL stats)
{
out->stats = TRUE;
mem_total += pages_cnt*P_SIZE;
+ vxd_hstats_update();
}
for(i = 0; i < pages_cnt; i++)
@@ -354,6 +363,7 @@ BOOL vxd_hinit()
{
hblocks[2]->id = 4;
}
+
return TRUE;
}
return FALSE;
diff --git a/vxd_halloc.h b/vxd_halloc.h
index 275d89a..bde2537 100644
--- a/vxd_halloc.h
+++ b/vxd_halloc.h
@@ -5,4 +5,6 @@ BOOL vxd_hinit();
BOOL vxd_halloc(DWORD pages, void **flat/*, DWORD *phy*/);
void vxd_hfree(void *flat);
+void vxd_hstats_update();
+
#endif /* __VXD_HALLOC__INCLUDED__ */
diff --git a/vxd_lib.c b/vxd_lib.c
index ed650e3..11ff92a 100644
--- a/vxd_lib.c
+++ b/vxd_lib.c
@@ -514,6 +514,11 @@ DWORD __declspec(naked) __cdecl _PageCommitPhys(ULONG page, ULONG npages, ULONG
VMMJmp(_PageCommitPhys);
}
+DWORD __declspec(naked) __cdecl _PageCommitContig(ULONG page, ULONG npages, ULONG flags, ULONG alignmask, ULONG minphys, ULONG maxphys)
+{
+ VMMJmp(_PageCommitContig);
+}
+
void Enable_Global_Trapping(DWORD port)
{
_asm push edx
diff --git a/vxd_lib.h b/vxd_lib.h
index 712c911..517aa49 100644
--- a/vxd_lib.h
+++ b/vxd_lib.h
@@ -59,6 +59,7 @@ DWORD __cdecl _PageReserve(ULONG page, ULONG npages, ULONG flags);
DWORD __cdecl _PageCommit(ULONG page, ULONG npages, ULONG hpd, ULONG pagerdata, ULONG flags);
DWORD __cdecl _PageCommitPhys(ULONG page, ULONG npages, ULONG physpg, ULONG flags);
DWORD __cdecl _PageReAllocate(ULONG hMem, ULONG nPages, ULONG flags);
+DWORD __cdecl _PageCommitContig(ULONG page, ULONG npages, ULONG flags, ULONG alignmask, ULONG minphys, ULONG maxphys);
void __cdecl Resume_VM(ULONG VM);
void Release_Time_Slice();
@@ -105,3 +106,4 @@ BOOL VPICD_Virtualize_IRQ(struct _VPICD_IRQ_Descriptor *vid);
/* extra FBHA */
void FBHDA_update_heap_size(BOOL init);
+void FBHDA_memtest();
diff --git a/vxd_main.c b/vxd_main.c
index 425765d..a3efe92 100644
--- a/vxd_main.c
+++ b/vxd_main.c
@@ -101,8 +101,9 @@ DDB VXD_DDB = {
DWORD *DispatchTable = 0;
DWORD DispatchTableLength = 0;
DWORD ThisVM = 0;
+DWORD is_qemu = FALSE;
-#ifdef QEMU
+#if defined(QEMU) || defined(SVGA)
/**
* This is fix of broken screen when open DOS window
*
@@ -126,7 +127,7 @@ void __declspec(naked) virtual_0x1ce()
}
VxDJmp(VDD, Do_Physical_IO);
}
-#endif /* QEMU */
+#endif /* QEMU/SVGA */
/**
* VDD calls wrapers
@@ -562,13 +563,25 @@ void Device_Init_proc(DWORD VM)
VBE_init_hw();
#endif
-#ifdef QEMU
+#if defined(QEMU)
Install_IO_Handler(0x1ce, (DWORD)virtual_0x1ce);
Disable_Global_Trapping(0x1ce);
Install_IO_Handler(0x1cf, (DWORD)virtual_0x1ce);
Disable_Global_Trapping(0x1cf);
+
+ is_qemu = TRUE;
+#elif defined(SVGA)
+ if(!SVGA_HasFIFOCap(SVGA_FIFO_CAP_FENCE)) /* no SVGA_FIFO_CAP_FENCE => QEMU */
+ {
+ Install_IO_Handler(0x1ce, (DWORD)virtual_0x1ce);
+ Disable_Global_Trapping(0x1ce);
+ Install_IO_Handler(0x1cf, (DWORD)virtual_0x1ce);
+ Disable_Global_Trapping(0x1cf);
+
+ is_qemu = TRUE;
+ }
#endif
-
+
/* register miniVDD functions */
VDD_Get_Mini_Dispatch_Table();
if(DispatchTableLength >= 0x31)
@@ -577,6 +590,9 @@ void Device_Init_proc(DWORD VM)
}
configure_FBHDA();
+#ifdef SVGA
+ vxd_hstats_update();
+#endif
End_Critical_Section();
}
#undef VDDFUNC
@@ -791,7 +807,7 @@ DWORD __stdcall Device_IO_Control_proc(DWORD vmhandle, struct DIOCParams *params
void Device_Init_Complete(DWORD VM)
{
-#ifdef QEMU
+#if defined(QEMU) || defined(SVGA)
/*
* At Windows shutdown time, the display driver calls VDD_DRIVER_UNREGISTER,
* which calls our DisplayDriverDisabling callback, and soon thereafter
@@ -810,8 +826,11 @@ void Device_Init_Complete(DWORD VM)
* At entry, EBX contains a Windows VM handle.
*
*/
- _PhysIntoV86(0xA0, VM, 0xA0, 16, 0);
- _PhysIntoV86(0xB8, VM, 0xB8, 8, 0);
+ if(is_qemu)
+ {
+ _PhysIntoV86(0xA0, VM, 0xA0, 16, 0);
+ _PhysIntoV86(0xB8, VM, 0xB8, 8, 0);
+ }
#endif
}
diff --git a/vxd_svga.c b/vxd_svga.c
index 68c58d6..4c8e6bd 100644
--- a/vxd_svga.c
+++ b/vxd_svga.c
@@ -110,6 +110,7 @@ static char SVGA_conf_hw_version[] = "HWVersion";
static char SVGA_conf_disable_multisample[] = "NoMultisample";
static char SVGA_conf_reg_multisample[] = "RegMultisample";
static char SVGA_conf_async_mobs[] = "AsyncMOBs";
+static char SVGA_conf_no_scr_accel[] = "NoScreenAccel";
static char SVGA_vxd_name[] = "vmwsmini.vxd";
@@ -217,7 +218,12 @@ DWORD SVGA_fence_passed()
return SVGA_ReadReg(SVGA_REG_FENCE);
}
- return gSVGA.fifoMem[SVGA_FIFO_FENCE];
+ if(SVGA_HasFIFOCap(SVGA_FIFO_CAP_FENCE))
+ {
+ return gSVGA.fifoMem[SVGA_FIFO_FENCE];
+ }
+
+ return 0;
}
DWORD SVGA_fence_get()
@@ -256,6 +262,12 @@ BOOL SVGA_fence_is_passed(DWORD fence_id)
{
DWORD last_pased;
DWORD last_fence;
+
+ if(!SVGA_HasFIFOCap(SVGA_FIFO_CAP_FENCE))
+ {
+ SVGA_Flush();
+ return TRUE;
+ }
SVGA_fence_query(&last_pased, &last_fence);
if(fence_id > last_fence)
@@ -359,6 +371,7 @@ static DWORD fb_pm16 = 0;
static DWORD st_surface_mb = 0;
static DWORD disable_multisample = 0;
static DWORD reg_multisample = 0;
+static DWORD disable_screen_accel = 0;
static void SVGA_write_driver_id()
{
@@ -410,34 +423,35 @@ BOOL SVGA_init_hw()
cb_sem = Create_Semaphore(1);
/* configs in registry */
- 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);
- RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_hw_version, &conf_hw_version);
- RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_pref_fifo, &prefer_fifo);
-
- RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_disable_multisample, &disable_multisample);
- RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_reg_multisample, &reg_multisample);
-
- RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_async_mobs, &async_mobs);
- RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_hw_cursor, &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);
+ RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_hw_version, &conf_hw_version);
+ RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_pref_fifo, &prefer_fifo);
+
+ RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_disable_multisample, &disable_multisample);
+ RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_reg_multisample, &reg_multisample);
+
+ RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_async_mobs, &async_mobs);
+ RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_hw_cursor, &hw_cursor);
+ RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_no_scr_accel, &disable_screen_accel);
+
if(async_mobs < 1)
async_mobs = 1;
-
+
if(async_mobs >= SVGA_CB_MAX_QUEUED_PER_CONTEXT)
async_mobs = SVGA_CB_MAX_QUEUED_PER_CONTEXT-1;
-
+
if(!FBHDA_init_hw())
{
return FALSE;
}
-
+
dbg_printf(dbg_test, 0);
-
+
rc = SVGA_Init(FALSE, conf_hw_version);
dbg_printf(dbg_SVGA_Init, rc);
-
+
if(rc == 0)
{
/* default flags */
@@ -570,6 +584,7 @@ BOOL SVGA_init_hw()
/* fill address in FBHDA */
hda->vram_pm32 = (void*)gSVGA.fbLinear;
hda->vram_size = gSVGA.vramSize;
+ hda->vram_bar_size = gSVGA.vramSize;
hda->vram_pm16 = fb_pm16;
memcpy(hda->vxdname, SVGA_vxd_name, sizeof(SVGA_vxd_name));
@@ -585,7 +600,9 @@ BOOL SVGA_init_hw()
/* switch back to VGA mode, SVGA mode will be request by 16 bit driver later */
SVGA_HW_disable();
-
+
+ FBHDA_memtest();
+
return TRUE;
}
@@ -595,9 +612,12 @@ BOOL SVGA_init_hw()
/* Check if screen acceleration is available */
static BOOL SVGA_hasAccelScreen()
{
- if(SVGA_HasFIFOCap(SVGA_FIFO_CAP_SCREEN_OBJECT | SVGA_FIFO_CAP_SCREEN_OBJECT_2))
+ if(disable_screen_accel == 0)
{
- return TRUE;
+ if(SVGA_HasFIFOCap(SVGA_FIFO_CAP_SCREEN_OBJECT | SVGA_FIFO_CAP_SCREEN_OBJECT_2))
+ {
+ return TRUE;
+ }
}
return FALSE;
@@ -749,16 +769,13 @@ BOOL SVGA_validmode(DWORD w, DWORD h, DWORD bpp)
{
if(h <= SVGA_ReadReg(SVGA_REG_MAX_HEIGHT))
{
- DWORD size = SVGA_pitch(w, bpp) * h;
- if(size < hda->vram_size)
+ DWORD size = SVGA_pitch(w, 32) * h;
+ size += SVGA_pitch(w, bpp) * h;
+ if(size > hda->vram_size)
{
- if(bpp != 32 && size > SVGA_FB_MAX_TRACEABLE_SIZE)
- {
- return FALSE;
- }
-
- return TRUE;
+ return FALSE;
}
+ return TRUE;
}
}
@@ -795,15 +812,8 @@ static void SVGA_setmode_phy(DWORD w, DWORD h, DWORD bpp)
/* stop command buffer context 0 */
SVGA_CB_stop();
- /* setup by legacy registry */
- if(SVGA_hasAccelScreen())
- {
- SVGA_SetModeLegacy(w, h, 32);
- }
- else
- {
- SVGA_SetModeLegacy(w, h, bpp);
- }
+ /* setup by legacy registry */
+ SVGA_SetModeLegacy(w, h, 32);
/* VMware, vGPU10: OK, when screen has change, whoale GPU is reset including FIFO */
SVGA_Enable();
@@ -890,31 +900,23 @@ BOOL SVGA_setmode(DWORD w, DWORD h, DWORD bpp)
hda->flags &= ~((DWORD)FB_ACCEL_VMSVGA10_ST);
+/*
hda->vram_pm32 = (void*)gSVGA.fbLinear;
hda->vram_size = gSVGA.vramSize;
hda->vram_pm16 = fb_pm16;
-
+ JH: this doesn't change at runtime!
+*/
hda->width = w;//SVGA_ReadReg(SVGA_REG_WIDTH);
hda->height = h;//SVGA_ReadReg(SVGA_REG_HEIGHT);
- if(SVGA_hasAccelScreen())
+ if(bpp >= 8)
{
- if(bpp >= 8)
- {
- DWORD offset = SVGA_DT_stride(hda->width, hda->height);
-
- hda->bpp = bpp;
- hda->pitch = SVGA_pitch(hda->width, bpp);
- hda->system_surface = offset;
- hda->surface = offset;
- }
- else
- {
- hda->bpp = SVGA_ReadReg(SVGA_REG_BITS_PER_PIXEL);
- hda->pitch = SVGA_ReadReg(SVGA_REG_BYTES_PER_LINE);
- hda->surface = 0;
- hda->system_surface = 0;
- }
+ DWORD offset = SVGA_DT_stride(hda->width, hda->height);
+
+ hda->bpp = bpp;
+ hda->pitch = SVGA_pitch(hda->width, bpp);
+ hda->system_surface = offset;
+ hda->surface = offset;
}
else
{
@@ -923,8 +925,9 @@ BOOL SVGA_setmode(DWORD w, DWORD h, DWORD bpp)
hda->surface = 0;
hda->system_surface = 0;
}
+
hda->stride = hda->height * hda->pitch;
-
+
if(has3D && SVGA_GetDevCap(SVGA3D_DEVCAP_3D) > 0)
{
hda->flags |= FB_ACCEL_VMSVGA3D;
@@ -934,15 +937,18 @@ BOOL SVGA_setmode(DWORD w, DWORD h, DWORD bpp)
{
hda->flags &= ~((DWORD)FB_ACCEL_VMSVGA3D);
}
-
+
if(hda->system_surface > 0)
{
hda->flags |= FB_SUPPORT_FLIPING;
- SVGA_DefineGMRFB();
+ if(SVGA_hasAccelScreen())
+ {
+ SVGA_DefineGMRFB();
+ }
}
-
+
SVGA_clear();
-
+
mouse_invalidate();
FBHDA_update_heap_size(FALSE);
@@ -1126,12 +1132,15 @@ BOOL FBHDA_swap(DWORD offset)
{
FBHDA_access_begin(0);
if(hda->bpp >= 8)
- {
- hda->surface = offset;
- SVGA_DefineGMRFB();
- rc = TRUE;
+ {
+ hda->surface = offset;
+ if(SVGA_hasAccelScreen())
+ {
+ SVGA_DefineGMRFB();
+ }
+ rc = TRUE;
}
- FBHDA_access_end(0);
+ FBHDA_access_end(0);
}
return rc;
@@ -1177,22 +1186,29 @@ static inline void check_dirty()
{
case 32:
{
- SVGAFifoCmdBlitScreenToGMRFB *gmrblit;
- DWORD cmd_offset = 0;
-
- wait_for_cmdbuf();
-
- gmrblit = SVGA_cmd_ptr(cmdbuf, &cmd_offset, SVGA_CMD_BLIT_SCREEN_TO_GMRFB, sizeof(SVGAFifoCmdBlitScreenToGMRFB));
-
- gmrblit->destOrigin.x = 0;
- gmrblit->destOrigin.y = 0;
- gmrblit->srcRect.left = 0;
- gmrblit->srcRect.top = 0;
- gmrblit->srcRect.right = hda->width;
- gmrblit->srcRect.bottom = hda->height;
- gmrblit->srcScreenId = 0;
-
- submit_cmdbuf(cmd_offset, SVGA_CB_UPDATE, 0);
+ if(SVGA_hasAccelScreen())
+ {
+ SVGAFifoCmdBlitScreenToGMRFB *gmrblit;
+ DWORD cmd_offset = 0;
+
+ wait_for_cmdbuf();
+
+ gmrblit = SVGA_cmd_ptr(cmdbuf, &cmd_offset, SVGA_CMD_BLIT_SCREEN_TO_GMRFB, sizeof(SVGAFifoCmdBlitScreenToGMRFB));
+
+ gmrblit->destOrigin.x = 0;
+ gmrblit->destOrigin.y = 0;
+ gmrblit->srcRect.left = 0;
+ gmrblit->srcRect.top = 0;
+ gmrblit->srcRect.right = hda->width;
+ gmrblit->srcRect.bottom = hda->height;
+ gmrblit->srcScreenId = 0;
+
+ submit_cmdbuf(cmd_offset, SVGA_CB_UPDATE, 0);
+ }
+ else
+ {
+ memcpy(hda->vram_pm32, ((BYTE*)hda->vram_pm32)+hda->surface, hda->stride);
+ }
break;
}
case 16:
@@ -1205,7 +1221,7 @@ static inline void check_dirty()
break;
}
} // switch
-
+
surface_dirty = FALSE;
}
}
@@ -1356,23 +1372,36 @@ void FBHDA_access_end(DWORD flags)
{
case 32:
{
- SVGAFifoCmdBlitGMRFBToScreen *gmrblit;
- DWORD cmd_offset = 0;
-
- wait_for_cmdbuf();
-
- gmrblit = SVGA_cmd_ptr(cmdbuf, &cmd_offset, SVGA_CMD_BLIT_GMRFB_TO_SCREEN, sizeof(SVGAFifoCmdBlitGMRFBToScreen));
-
- gmrblit->srcOrigin.x = rect_left;
- gmrblit->srcOrigin.y = rect_top;
- gmrblit->destRect.left = rect_left;
- gmrblit->destRect.top = rect_top;
- gmrblit->destRect.right = rect_right;
- gmrblit->destRect.bottom = rect_bottom;
-
- gmrblit->destScreenId = 0;
-
- submit_cmdbuf(cmd_offset, SVGA_CB_UPDATE, 0);
+ if(SVGA_hasAccelScreen())
+ {
+ SVGAFifoCmdBlitGMRFBToScreen *gmrblit;
+ DWORD cmd_offset = 0;
+
+ wait_for_cmdbuf();
+
+ gmrblit = SVGA_cmd_ptr(cmdbuf, &cmd_offset, SVGA_CMD_BLIT_GMRFB_TO_SCREEN, sizeof(SVGAFifoCmdBlitGMRFBToScreen));
+
+ gmrblit->srcOrigin.x = rect_left;
+ gmrblit->srcOrigin.y = rect_top;
+ gmrblit->destRect.left = rect_left;
+ gmrblit->destRect.top = rect_top;
+ gmrblit->destRect.right = rect_right;
+ gmrblit->destRect.bottom = rect_bottom;
+
+ gmrblit->destScreenId = 0;
+
+ submit_cmdbuf(cmd_offset, SVGA_CB_UPDATE, 0);
+ }
+ else
+ {
+ blit32(
+ ((BYTE*)hda->vram_pm32)+hda->surface, hda->pitch,
+ hda->vram_pm32, hda->pitch,
+ rect_left, rect_top,
+ rect_right - rect_left, rect_bottom - rect_top
+ );
+ need_refresh = TRUE;
+ }
break;
}
case 16:
diff --git a/vxd_svga_cb.c b/vxd_svga_cb.c
index 24bc383..088fb24 100644
--- a/vxd_svga_cb.c
+++ b/vxd_svga_cb.c
@@ -619,9 +619,12 @@ void SVGA_CMB_submit(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_status_t FBPTR st
/* insert fence CMD */
if(flags_fifo_fence_need(flags))
{
- fence = SVGA_fence_get();
- ptr[dwords++] = SVGA_CMD_FENCE;
- ptr[dwords++] = fence;
+ if(SVGA_HasFIFOCap(SVGA_FIFO_CAP_FENCE))
+ {
+ fence = SVGA_fence_get();
+ ptr[dwords++] = SVGA_CMD_FENCE;
+ ptr[dwords++] = fence;
+ }
}
flags_fence_check(flags);
diff --git a/vxd_vbe.c b/vxd_vbe.c
index b87efcc..86fe61b 100644
--- a/vxd_vbe.c
+++ b/vxd_vbe.c
@@ -148,7 +148,10 @@ BOOL VBE_init_hw()
dbg_printf(dbg_vbe_init, vram_phy, vram_size);
- hda->vram_size = vram_size;
+ hda->vram_size = vram_size;
+ hda->vram_bar_size = vram_size;
+ FBHDA_memtest();
+
hda->vram_pm32 = (void*)_MapPhysToLinear(vram_phy, vram_size, 0);
hda->flags |= FB_SUPPORT_FLIPING;
diff --git a/vxd_vdd.c b/vxd_vdd.c
index af7b200..e1157d3 100644
--- a/vxd_vdd.c
+++ b/vxd_vdd.c
@@ -51,6 +51,8 @@ THE SOFTWARE.
extern FBHDA_t *hda;
extern DWORD ThisVM;
+extern DWORD is_qemu;
+
static DWORD hda_pm16 = 0;
static DWORD mouse_pm16 = 0;
@@ -451,19 +453,21 @@ VDDPROC(VESA_SUPPORT, vesa_support)
VDDPROC(PRE_HIRES_TO_VGA, pre_hires_to_vga)
{
mode_changing = TRUE;
-#ifdef QEMU
- Disable_Global_Trapping(0x1CE);
- Disable_Global_Trapping(0x1CF);
-#endif
+ if(is_qemu)
+ {
+ Disable_Global_Trapping(0x1CE);
+ Disable_Global_Trapping(0x1CF);
+ }
}
VDDPROC(POST_HIRES_TO_VGA, post_hires_to_vga)
{
mode_changing = FALSE;
-#ifdef QEMU
- Enable_Global_Trapping(0x1CE);
- Enable_Global_Trapping(0x1CF);
-#endif
+ if(is_qemu)
+ {
+ Enable_Global_Trapping(0x1CE);
+ Enable_Global_Trapping(0x1CF);
+ }
}
VDDPROC(PRE_VGA_TO_HIRES, pre_vga_to_hires)
@@ -478,18 +482,20 @@ VDDPROC(POST_VGA_TO_HIRES, post_vga_to_hires)
VDDPROC(ENABLE_TRAPS, enable_traps)
{
-#ifdef QEMU
- Enable_Global_Trapping(0x1CE);
- Enable_Global_Trapping(0x1CF);
-#endif
+ if(is_qemu)
+ {
+ Enable_Global_Trapping(0x1CE);
+ Enable_Global_Trapping(0x1CF);
+ }
}
VDDPROC(DISPLAY_DRIVER_DISABLING, display_driver_disabling)
{
-#ifdef QEMU
- Disable_Global_Trapping(0x1CE);
- Disable_Global_Trapping(0x1CF);
-#endif
+ if(is_qemu)
+ {
+ Disable_Global_Trapping(0x1CE);
+ Disable_Global_Trapping(0x1CF);
+ }
}
VDDPROC(SAVE_REGISTERS, save_registers)