aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <jara@hensl.cz>2024-07-28 18:34:16 +0200
committerJaroslav Hensl <jara@hensl.cz>2024-07-28 18:34:16 +0200
commitc7057f9dcfa40cfcbfdd104150ff27f505f6fea0 (patch)
tree56b876c043e365c570e17e10a142a437a89b8d48
parentc8b19a5217ea94727626ad08ce2acae6cc4b8540 (diff)
downloadvmdisp9x-c7057f9dcfa40cfcbfdd104150ff27f505f6fea0.tar.gz
fixed queue freezing, faster MOB processing
-rw-r--r--3d_accel.h1
-rw-r--r--makefile2
-rw-r--r--vxd_main.c8
-rw-r--r--vxd_strings.h14
-rw-r--r--vxd_svga.c3
-rw-r--r--vxd_svga.h3
-rw-r--r--vxd_svga_cb.c108
-rw-r--r--vxd_svga_debug.h4
-rw-r--r--vxd_svga_mem.c12
9 files changed, 120 insertions, 35 deletions
diff --git a/3d_accel.h b/3d_accel.h
index 06ec786..46f73a3 100644
--- a/3d_accel.h
+++ b/3d_accel.h
@@ -196,6 +196,7 @@ typedef struct SVGA_CMB_status
#define SVGA_PROC_NONE 0
#define SVGA_PROC_COMPLETED 1
+#define SVGA_PROC_QUEUED 2
#define SVGA_PROC_ERROR 3
#define SVGA_PROC_FENCE 0xFF
diff --git a/makefile b/makefile
index 67836e8..8cccb2a 100644
--- a/makefile
+++ b/makefile
@@ -12,7 +12,7 @@ OBJS += &
INCS = -I$(%WATCOM)\h\win -Iddk -Ivmware
-VER_BUILD = 68
+VER_BUILD = 69
FLAGS = -DDRV_VER_BUILD=$(VER_BUILD)
diff --git a/vxd_main.c b/vxd_main.c
index 7de327b..2075291 100644
--- a/vxd_main.c
+++ b/vxd_main.c
@@ -228,7 +228,7 @@ WORD __stdcall VXD_API_Proc(PCRS_32 state)
WORD rc = 0xFFFF;
WORD service = state->Client_EDX & 0xFFFF;
- //dbg_printf(dbg_vxd_api, service);
+// dbg_printf(dbg_vxd_api, service);
switch(service)
{
@@ -497,7 +497,7 @@ DWORD __stdcall Device_IO_Control_proc(DWORD vmhandle, struct DIOCParams *params
DWORD *outBuf = (DWORD*)params->lpOutBuffer;
DWORD rc = 1;
-// dbg_printf(dbg_deviceiocontrol, params->dwIoControlCode);
+ //dbg_printf(dbg_deviceiocontrol, params->dwIoControlCode);
switch(params->dwIoControlCode)
{
@@ -643,8 +643,8 @@ DWORD __stdcall Device_IO_Control_proc(DWORD vmhandle, struct DIOCParams *params
}
Cleanup_Critical_Section();
-// dbg_printf(dbg_deviceiocontrol_leave);
-
+ //dbg_printf(dbg_deviceiocontrol_leave);
+
return rc;
}
diff --git a/vxd_strings.h b/vxd_strings.h
index 5db428e..aa22a6a 100644
--- a/vxd_strings.h
+++ b/vxd_strings.h
@@ -67,8 +67,8 @@ DSTR(dbg_cmd_on, "SVGA_CMB_submit: ptr=%X, first cmd=%X, flags=%X, size=%d\n");
DSTR(dbg_cmd_off, "SVGA_CMB_submit: end - cmd: %X\n");
DSTR(dbg_cmd_error, "CB error: %d, first cmd %X (error at %d)\n");
-DSTR(dbg_deviceiocontrol, "DeviceIoControl(%x)\n");
-DSTR(dbg_deviceiocontrol_leave, "DeviceIoControl Leave\n");
+DSTR(dbg_deviceiocontrol, "I%x\n");
+DSTR(dbg_deviceiocontrol_leave, "IL\n");
DSTR(dbg_gmr, "GMR: %ld at %X\n");
DSTR(dbg_gmr_succ, "GMR ALLOC: %ld (size: %ld)\n");
@@ -170,6 +170,16 @@ DSTR(dbg_fence_wait, "SVGA_fence_wait(%lu) from line %ld\n");
DSTR(dbg_queue_check, "CB_queue_check\n");
+DSTR(dbg_cb_valid_err, "ERROR - %s: %lX, cmdbuf: %lX\n");
+
+DSTR(dbg_err_double_insert, "double_insert");
+DSTR(dbg_err_pop, "not pull out");
+
+DSTR(dbg_cb_valid_status, " -> status = %ld\n");
+
+DSTR(dbg_trace_insert, "<= %lX\n");
+DSTR(dbg_trace_remove, " => %lX\n");
+
#undef DSTR
#endif
diff --git a/vxd_svga.c b/vxd_svga.c
index befc82e..9d78250 100644
--- a/vxd_svga.c
+++ b/vxd_svga.c
@@ -531,6 +531,9 @@ BOOL SVGA_init_hw()
/* allocate CB for this driver */
cmdbuf = SVGA_CMB_alloc();
+
+ /* special set for faster MOB define */
+ mob_cb_alloc();
/* vGPU10 */
if(gb_support)
diff --git a/vxd_svga.h b/vxd_svga.h
index 9e4eadf..1fd237f 100644
--- a/vxd_svga.h
+++ b/vxd_svga.h
@@ -73,4 +73,7 @@ void SVGA_CB_stop();
void SVGA_CB_restart();
void SVGA_CMB_wait_update();
+void mob_cb_alloc();
+void *mob_cb_get();
+
#endif /* __VXD_SVGA_H__INCLUDED__ */
diff --git a/vxd_svga_cb.c b/vxd_svga_cb.c
index 17df34f..9c81c39 100644
--- a/vxd_svga_cb.c
+++ b/vxd_svga_cb.c
@@ -221,16 +221,17 @@ inline BOOL CB_queue_check_inline(SVGACBHeader *tracked)
if(cb->status > SVGA_CB_STATUS_COMPLETED)
{
- #ifdef DBGPRINT
+ #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;
}
+ //dbg_printf(dbg_trace_remove, item);
+
item = item->next;
}
else
@@ -244,7 +245,16 @@ inline BOOL CB_queue_check_inline(SVGACBHeader *tracked)
}
}
- cb_queue_info.last = last;
+ if(last)
+ {
+ cb_queue_info.last = last;
+ last->next = NULL;
+ }
+ else
+ {
+ cb_queue_info.first = NULL;
+ cb_queue_info.last = NULL;
+ }
if(need_restart)
{
@@ -271,6 +281,23 @@ BOOL CB_queue_check(SVGACBHeader *tracked)
return CB_queue_check_inline(tracked);
}
+void CB_queue_valid(SVGACBHeader *check, char *msg)
+{
+ cb_queue_t *test = (cb_queue_t*)(check-1);
+ cb_queue_t *item = cb_queue_info.first;
+
+ while(item != NULL)
+ {
+ if(item == test)
+ {
+ dbg_printf(dbg_cb_valid_err, msg, check, ((SVGACBHeader *)cmdbuf)-1);
+ dbg_printf(dbg_cb_valid_status, check->status);
+ }
+
+ item = item->next;
+ }
+}
+
static BOOL CB_queue_is_flags_set(DWORD flags)
{
cb_queue_t *item = cb_queue_info.first;
@@ -297,6 +324,8 @@ void CB_queue_insert(SVGACBHeader *cb, DWORD flags)
item->flags = flags;
item->data_size = cb->length;
+ //dbg_printf(dbg_trace_insert, item);
+
if(cb_queue_info.last != NULL)
{
cb_queue_info.last->next = item;
@@ -358,12 +387,12 @@ static DWORD flags_to_cbq_check(DWORD cb_flags)
if((cb_flags & SVGA_CB_RENDER) != 0)
{
- r |= CBQ_RENDER | SVGA_CB_UPDATE;
+ r |= CBQ_RENDER | CBQ_UPDATE;
}
if((cb_flags & SVGA_CB_UPDATE) != 0)
{
- r |= CBQ_RENDER | SVGA_CB_UPDATE;
+ r |= CBQ_RENDER | CBQ_UPDATE;
}
return r;
@@ -430,6 +459,17 @@ static void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_s
{
DWORD fence = 0;
SVGACBHeader *cb = ((SVGACBHeader *)cmb)-1;
+ BOOL proc_by_cb = cb_support && cb_context0 && (flags & SVGA_CB_FORCE_FIFO) == 0;
+
+ /* wait and tidy CB queue */
+ if(proc_by_cb)
+ {
+ DWORD cbq_check = flags_to_cbq_check(flags);
+ do
+ {
+ CB_queue_check_inline(NULL);
+ } while(CB_queue_is_flags_set(cbq_check));
+ }
if(status)
{
@@ -437,7 +477,7 @@ static void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_s
status->sStatus = SVGA_PROC_NONE;
status->qStatus = (volatile DWORD*)&cb->status;
}
-
+
#ifdef DBGPRINT
// debug_cmdbuf(cmb, cmb_size);
// debug_cmdbuf_trace(cmb, cmb_size, SVGA_3D_CMD_BLIT_SURFACE_TO_SCREEN);
@@ -449,10 +489,7 @@ static void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_s
ST_FB_invalid = TRUE;
}
- if( /* CB are supported and enabled */
- cb_support && cb_context0 &&
- (flags & SVGA_CB_FORCE_FIFO) == 0
- )
+ if(proc_by_cb)
{
/***
*
@@ -460,9 +497,6 @@ static void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_s
*
***/
DWORD cbhwctxid = SVGA_CB_CONTEXT_0;
- DWORD cbq_check = flags_to_cbq_check(flags);
-
- //if(flags & SVGA_CB_USE_CONTEXT_DEVICE) cbhwctxid = SVGA_CB_CONTEXT_DEVICE;
if(flags_cb_fence_need(flags))
{
@@ -473,12 +507,6 @@ static void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_s
cmb_size += sizeof(DWORD)*2;
}
- /* wait */
- do
- {
- CB_queue_check_inline(NULL);
- } while(CB_queue_is_flags_set(cbq_check));
-
if(cmb_size == 0)
{
cb->status = SVGA_PROC_COMPLETED;
@@ -491,6 +519,10 @@ static void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_s
}
else
{
+#ifdef DBGPRINT
+ CB_queue_valid(cb, dbg_err_double_insert);
+#endif
+
cb->status = SVGA_CB_STATUS_NONE;
cb->errorOffset = 0;
cb->offset = 0; /* VMware modified this, needs to be clear */
@@ -517,11 +549,14 @@ static void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_s
SVGA_Sync(); /* notify HV to read registers (VMware needs it) */
SVGA_cb_id_inc();
-
+
if(flags & SVGA_CB_SYNC)
{
WAIT_FOR_CB(cb, 0);
-
+#ifdef DBGPRINT
+ CB_queue_valid(cb, dbg_err_pop);
+#endif
+
if(cb->status != SVGA_CB_STATUS_COMPLETED)
{
dbg_printf(dbg_cmd_error, cb->status, cmb[0], cb->errorOffset);
@@ -552,7 +587,7 @@ static void SVGA_CMB_submit_critical(DWORD FBPTR cmb, DWORD cmb_size, SVGA_CMB_s
status->fifo_fence_used = fence;
}
}
- }
+ }
}
else
{
@@ -785,3 +820,32 @@ void SVGA_CMB_wait_update()
flags_fence_check(SVGA_CB_UPDATE);
}
}
+
+#define MOB_CB_COUNT 8
+
+void *mob_cb[MOB_CB_COUNT];
+DWORD act = 0;
+
+void mob_cb_alloc()
+{
+ int i = 0;
+ for(i = 0; i < MOB_CB_COUNT; i++)
+ {
+ mob_cb[i] = SVGA_CMB_alloc_size(1024);
+ }
+}
+
+void *mob_cb_get()
+{
+ int id = act++;
+ if(act >= MOB_CB_COUNT)
+ {
+ act = 0;
+ }
+
+ WAIT_FOR_CB(mob_cb[id], 0);
+
+ return mob_cb[id];
+}
+
+
diff --git a/vxd_svga_debug.h b/vxd_svga_debug.h
index e0c0d16..62b389c 100644
--- a/vxd_svga_debug.h
+++ b/vxd_svga_debug.h
@@ -257,7 +257,7 @@ static char svga_cmd_tables[][64] = {
#define CMD3D_MIN 1040
#define CMD3D_MAX 1291
-//static char dbg_bufinfo[] = "commands size: %d\n";
+static char dbg_bufinfo[] = "commands size: %d\n";
static char dbg_cmd3d[] = "cmd3D: %s (%d)\n";
static char dbg_cmd3d_trace[] = "cmd3D(%02ld): %s (%ld)\n";
//static char dbg_cmd_fence[] = "cmd FENCE\n";
@@ -268,7 +268,7 @@ void debug_cmdbuf(void *cmdbuf, DWORD cmd_size)
BYTE *ptr = cmdbuf;
BYTE *ptr_max = ptr + cmd_size;
- //dbg_printf(dbg_bufinfo, cmd_size);
+ dbg_printf(dbg_bufinfo, cmd_size);
while(ptr < ptr_max)
{
diff --git a/vxd_svga_mem.c b/vxd_svga_mem.c
index 16c3820..7ac915b 100644
--- a/vxd_svga_mem.c
+++ b/vxd_svga_mem.c
@@ -860,16 +860,20 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
{
SVGA3dCmdDefineGBMob *mob;
DWORD cmdoff = 0;
+ void *mobcb;
- wait_for_cmdbuf();
- mob = SVGA_cmd3d_ptr(cmdbuf, &cmdoff, SVGA_3D_CMD_DEFINE_GB_MOB, sizeof(SVGA3dCmdDefineGBMob));
+ //wait_for_cmdbuf();
+ mobcb = mob_cb_get();
+
+ //mob = SVGA_cmd3d_ptr(cmdbuf, &cmdoff, SVGA_3D_CMD_DEFINE_GB_MOB, sizeof(SVGA3dCmdDefineGBMob));
+ mob = SVGA_cmd3d_ptr(mobcb, &cmdoff, SVGA_3D_CMD_DEFINE_GB_MOB, sizeof(SVGA3dCmdDefineGBMob));
mob->mobid = rinfo->region_id;
mob->base = rinfo->mob_ppn;
mob->ptDepth = rinfo->mob_pt_depth;
mob->sizeInBytes = rinfo->size;
- submit_cmdbuf(cmdoff, SVGA_CB_SYNC, 0);
- SVGA_Sync();
+ //submit_cmdbuf(cmdoff, SVGA_CB_SYNC, 0);
+ SVGA_CMB_submit(mobcb, cmdoff, NULL, 0, 0);
rinfo->is_mob = 1;
}