aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <emulator@emulace.cz>2024-07-26 02:07:52 +0200
committerJaroslav Hensl <emulator@emulace.cz>2024-07-26 02:07:52 +0200
commit6ce40234ffeddfc716389c8e89d336b9ff8a838b (patch)
tree03e4345319f4116c3de6bf944a12aa9c8f3fc0b3
parentbbcb8a42582dd2062d1fca5fa6eff3b49485f11f (diff)
downloadvmdisp9x-6ce40234ffeddfc716389c8e89d336b9ff8a838b.tar.gz
GMR was too fragmented (vmware), disable multisample option (for vmware)
-rw-r--r--makefile2
-rw-r--r--vxd_strings.h5
-rw-r--r--vxd_svga.c42
-rw-r--r--vxd_svga.h1
-rw-r--r--vxd_svga_cb.c10
-rw-r--r--vxd_svga_mem.c92
-rw-r--r--vxd_svga_st.c7
7 files changed, 117 insertions, 42 deletions
diff --git a/makefile b/makefile
index 3c7d9c2..f8bb043 100644
--- a/makefile
+++ b/makefile
@@ -12,7 +12,7 @@ OBJS += &
INCS = -I$(%WATCOM)\h\win -Iddk -Ivmware
-VER_BUILD = 66
+VER_BUILD = 67
FLAGS = -DDRV_VER_BUILD=$(VER_BUILD)
diff --git a/vxd_strings.h b/vxd_strings.h
index 0766bfb..88188dd 100644
--- a/vxd_strings.h
+++ b/vxd_strings.h
@@ -157,6 +157,11 @@ DSTR(dbg_pt_build_2, "PT_build(%ld): pt1_entries=%ld, pt2_entries=%ld\n");
DSTR(dbg_cb_suc, "submit SVGA_CB_SYNC success\n");
+DSTR(dbg_region_1, "SVGA_region_create #1: %ld, max: %ld\n");
+DSTR(dbg_region_2, "SVGA_region_create #2: %ld\n");
+
+DSTR(dbg_cb_error, "Error (%ld): offset %ld, error command: %ld\n");
+
#undef DSTR
#endif
diff --git a/vxd_svga.c b/vxd_svga.c
index 71055b5..7b5b44e 100644
--- a/vxd_svga.c
+++ b/vxd_svga.c
@@ -99,6 +99,8 @@ static char SVGA_conf_st_size[] = "STSize";
static char SVGA_conf_st_flags[] = "STOptions";
static char SVGA_vxd_name[] = "vmwsmini.vxd";
+static char SVGA_conf_disable_multisample[] = "NoMultisample";
+
/**
* Notify virtual HW that is some work to do
**/
@@ -255,9 +257,6 @@ BOOL SVGA_fence_is_passed(DWORD fence_id)
void SVGA_fence_wait(DWORD fence_id)
{
- //DWORD cnt = 0;
-
- //for(cnt = 0; cnt < SVGA_TIMEOUT; cnt++)
for(;;)
{
if(SVGA_fence_is_passed(fence_id))
@@ -265,15 +264,17 @@ void SVGA_fence_wait(DWORD fence_id)
break;
}
- CB_queue_check(NULL);
+ if(cb_support && cb_context0)
+ {
+ if(CB_queue_check(NULL))
+ {
+ /* waiting for fence but command queue is empty */
+ SVGA_Flush();
+ return;
+ }
+ }
SVGA_Sync();
}
-
- /*
- if(cnt == SVGA_TIMEOUT)
- {
- SVGA_Flush();
- }*/
}
void *SVGA_cmd_ptr(DWORD *buf, DWORD *pOffset, DWORD cmd, DWORD cmdsize)
@@ -330,7 +331,7 @@ static DWORD fb_pm16 = 0;
static DWORD st_pm16 = 0;
static DWORD st_address = 0;
static DWORD st_surface_mb = 0;
-
+static DWORD disable_multisample = 0;
BOOL st_useable(DWORD bpp)
{
@@ -402,6 +403,8 @@ BOOL SVGA_init_hw()
RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_st_size, &st_surface_mb);
RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_st_flags, &st_flags);
+ RegReadConf(HKEY_LOCAL_MACHINE, SVGA_conf_path, SVGA_conf_disable_multisample, &disable_multisample);
+
if(!FBHDA_init_hw())
{
return FALSE;
@@ -511,6 +514,8 @@ BOOL SVGA_init_hw()
}
}
+ set_fragmantation_limit();
+
SVGA_DB_alloc();
/* allocate buffer for enable and disable CB */
@@ -935,12 +940,15 @@ DWORD SVGA_FixDevCap(DWORD cap_id, DWORD cap_val)
}
break;
}
-#if 0
- /* VBox hasn't Z_DF16/Z_DF24, vmware has, for testing same behaviour */
- case SVGA3D_DEVCAP_SURFACEFMT_Z_DF16:
- case SVGA3D_DEVCAP_SURFACEFMT_Z_DF24:
- return 0;
-#endif
+ case SVGA3D_DEVCAP_MULTISAMPLE_2X:
+ case SVGA3D_DEVCAP_MULTISAMPLE_4X:
+ case SVGA3D_DEVCAP_MULTISAMPLE_8X:
+ if(disable_multisample)
+ {
+ return 0;
+ }
+ break;
+
}
return cap_val;
diff --git a/vxd_svga.h b/vxd_svga.h
index 04c1897..299089a 100644
--- a/vxd_svga.h
+++ b/vxd_svga.h
@@ -50,6 +50,7 @@ void SVGA_mouse_show();
void SVGA_mouse_hide(BOOL invalidate);
/* memory */
+void set_fragmantation_limit();
void SVGA_OTable_load();
void SVGA_OTable_alloc(BOOL screentargets);
void SVGA_OTable_unload();
diff --git a/vxd_svga_cb.c b/vxd_svga_cb.c
index 3b6e124..27d41fa 100644
--- a/vxd_svga_cb.c
+++ b/vxd_svga_cb.c
@@ -218,6 +218,13 @@ inline BOOL CB_queue_check_inline(SVGACBHeader *tracked)
if(cb->status > SVGA_CB_STATUS_COMPLETED)
{
+ #ifdef DBGPRINT
+ {
+ DWORD *cmd_ptr = (DWORD*)(cb+1);
+
+ dbg_printf(dbg_cb_error, cb->status, cb->errorOffset, cmd_ptr[cb->errorOffset/4]);
+ }
+ #endif
need_restart = TRUE;
}
@@ -309,7 +316,7 @@ static void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_s
}
#ifdef DBGPRINT
- debug_cmdbuf(cmb, cmb_size);
+// debug_cmdbuf(cmb, cmb_size);
// debug_cmdbuf_trace(cmb, cmb_size, SVGA_3D_CMD_BLIT_SURFACE_TO_SCREEN);
// debug_draw(cmb, cmb_size);
#endif
@@ -620,6 +627,7 @@ void SVGA_CB_stop()
SVGA_Sync();
CB_queue_erase();
+ present_fence = 0; // remove waiting fence
dbg_printf(dbg_cb_stop_status, status);
}
diff --git a/vxd_svga_mem.c b/vxd_svga_mem.c
index 2fc4748..fb1d87b 100644
--- a/vxd_svga_mem.c
+++ b/vxd_svga_mem.c
@@ -44,6 +44,7 @@ THE SOFTWARE.
* consts
*/
#define PTONPAGE (P_SIZE/sizeof(DWORD))
+#define MDONPAGE (P_SIZE/sizeof(SVGAGuestMemDescriptor))
#define SPARE_REGIONS_LARGE 2
#define SPARE_REGION_LARGE_SIZE (32*1024*1024)
@@ -577,14 +578,60 @@ void cache_enable(BOOL enabled)
cache_enabled = enabled;
}
+static DWORD pa_flags = PAGEFIXED;
+static DWORD pa_align = 0x00000000;
+
+void set_fragmantation_limit()
+{
+ DWORD max_len = SVGA_ReadReg(SVGA_REG_GMR_MAX_DESCRIPTOR_LENGTH);
+
+ if(max_len < 1024)
+ {
+ pa_flags = PAGEFIXED | PAGEUSEALIGN;
+ pa_align = 0x1F; // 128K
+ }
+ else if(max_len < 2048)
+ {
+ pa_flags = PAGEFIXED | PAGEUSEALIGN;
+ pa_align = 0x0F; // 64K
+ }
+ else if(max_len < 4096)
+ {
+ pa_flags = PAGEFIXED | PAGEUSEALIGN;
+ pa_align = 0x07; // 32K
+ }
+ else if(max_len < 8192)
+ {
+ pa_flags = PAGEFIXED | PAGEUSEALIGN;
+ pa_align = 0x03; // 16K
+ }
+ else if(max_len < 16384)
+ {
+ pa_flags = PAGEFIXED | PAGEUSEALIGN;
+ pa_align = 0x01; // 8K
+ }
+ else
+ {
+ pa_flags = PAGEFIXED;
+ pa_align = 0x0;
+ }
+}
+
+
//#define GMR_CONTIG
//#define GMR_SYSTEM
//static DWORD pa_flags = PAGEFIXED | PAGEUSEALIGN;
-//static DWORD pa_align = 0x0000000F; // 64k
+//static DWORD pa_align = 0x00000003; // 64k
-static DWORD pa_flags = PAGEFIXED;
-static DWORD pa_align = 0x00000000;
+/*
+0x00 = 4K
+0x01 = 8K
+0x03 = 16K
+0x07 = 32K
+0x0F = 64K
+0x1F = 128K
+*/
/**
* Allocate guest memory region (GMR) - HW needs know memory physical
@@ -645,7 +692,7 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
rinfo->address = (void*)(laddr+P_SIZE);
rinfo->region_address = 0;
rinfo->region_ppn = (phy/P_SIZE);
- rinfo->mob_address = 0;
+ rinfo->mob_address = 0;
rinfo->mob_ppn = (phy/P_SIZE)+1;
rinfo->mob_pt_depth = SVGA3D_MOBFMT_RANGE;
@@ -662,23 +709,25 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
ULONG pgi;
ULONG base_ppn;
ULONG base_cnt;
- ULONG blocks = 1;
+ ULONG blocks;
ULONG blk_pages = 0;
+ ULONG blk_pages_raw = 0;
/* allocate user block */
maddr = _PageAllocate(nPages+pt_pages, pa_type, pa_vm, pa_align, 0x0, 0x100000, NULL, pa_flags);
-
+
if(!maddr)
{
End_Critical_Section();
return FALSE;
}
-
+
laddr = maddr + pt_pages*P_SIZE;
-
+
/* determine how many physical continuous blocks we have */
base_ppn = getPPN(laddr);
base_cnt = 1;
+ blocks = 1;
for(pgi = 1; pgi < nPages; pgi++)
{
taddr = laddr + pgi*P_SIZE;
@@ -695,13 +744,15 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
base_cnt++;
}
}
-
+
// number of pages to store regions information
- blk_pages = ((blocks+1)/(P_SIZE/sizeof(SVGAGuestMemDescriptor))) + 1;
-
- // add extra descriptors for pages edge
- blk_pages = ((blocks+blk_pages+1)/(P_SIZE/sizeof(SVGAGuestMemDescriptor))) + 1;
+ blk_pages_raw = (blocks + MDONPAGE - 1)/MDONPAGE;
+
+ // number of pages including pages-cross descriptors
+ blk_pages = (blocks + blk_pages_raw + MDONPAGE - 1)/MDONPAGE;
+ dbg_printf(dbg_region_1, blocks+blk_pages_raw, SVGA_ReadReg(SVGA_REG_GMR_MAX_DESCRIPTOR_LENGTH));
+
/* allocate memory for GMR descriptor */
pgblk = _PageAllocate(blk_pages, pa_type, pa_vm, pa_align, 0x0, 0x100000, NULL, pa_flags);
if(!pgblk)
@@ -710,12 +761,13 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
End_Critical_Section();
return FALSE;
}
-
+
desc = (SVGAGuestMemDescriptor*)pgblk;
- desc->ppn = getPPN(laddr);
+ memset(desc, 0, blk_pages*P_SIZE);
+
+ blocks = 1;
+ desc->ppn = getPPN(laddr);
desc->numPages = 1;
- blocks = 1;
-
/* fill GMR physical structure */
for(pgi = 1; pgi < nPages; pgi++)
{
@@ -728,8 +780,8 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
}
else
{
- /* next descriptor is on page edge */
- if((blocks+1) % (P_SIZE/sizeof(SVGAGuestMemDescriptor)) == 0)
+ /* the next descriptor is on next page page */
+ if(((blocks+1) % MDONPAGE) == 0)
{
desc++;
desc->numPages = 0;
@@ -747,6 +799,8 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
desc++;
desc->ppn = 0;
desc->numPages = 0;
+
+ dbg_printf(dbg_region_2, blocks);
rinfo->mob_address = (void*)maddr;
rinfo->mob_ppn = 0;
diff --git a/vxd_svga_st.c b/vxd_svga_st.c
index 1109d9b..07c8c1c 100644
--- a/vxd_svga_st.c
+++ b/vxd_svga_st.c
@@ -78,7 +78,7 @@ void st_defineScreen(DWORD w, DWORD h, DWORD bpp)
SVGAFifoCmdDefineScreen *screen;
SVGAFifoCmdDefineGMRFB *fbgmr;
SVGA3dCmdDefineGBScreenTarget *stid;
- SVGA3dCmdDefineGBSurface_v3 *gbsurf;
+ SVGA3dCmdDefineGBSurface_v2 *gbsurf;
SVGA3dCmdBindGBSurface *gbbind;
SVGA3dCmdBindGBScreenTarget *stbind;
SVGA_DB_surface_t *sinfo;
@@ -128,10 +128,9 @@ void st_defineScreen(DWORD w, DWORD h, DWORD bpp)
cmdoff = 0;
/* create gb texture */
- gbsurf = SVGA_cmd3d_ptr(cmdbuf, &cmdoff, SVGA_3D_CMD_DEFINE_GB_SURFACE_V3, sizeof(SVGA3dCmdDefineGBSurface_v3));
+ gbsurf = SVGA_cmd3d_ptr(cmdbuf, &cmdoff, SVGA_3D_CMD_DEFINE_GB_SURFACE_V2, sizeof(SVGA3dCmdDefineGBSurface_v2));
gbsurf->sid = ST_SURFACE_ID;
- gbsurf->surfaceFlags.low = SVGA3D_SURFACE_SCREENTARGET | SVGA3D_SURFACE_HINT_RENDERTARGET | SVGA3D_SURFACE_BIND_RENDER_TARGET;
- gbsurf->surfaceFlags.hi = 0;
+ gbsurf->surfaceFlags = SVGA3D_SURFACE_SCREENTARGET | SVGA3D_SURFACE_HINT_RENDERTARGET | SVGA3D_SURFACE_BIND_RENDER_TARGET;
switch(bpp)
{
case 16: gbsurf->format = SVGA3D_R5G6B5; break;