aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <jara@hensl.cz>2024-04-04 22:50:29 +0200
committerJaroslav Hensl <jara@hensl.cz>2024-04-04 22:50:29 +0200
commita4133d1793b2037f409dfa2021f3b8057186022b (patch)
tree4225b86610467e0fd9d7d70085e1728758547734
parentb1b51c45629f0b6e39e8982f032c453b27b0f16e (diff)
downloadvmdisp9x-a4133d1793b2037f409dfa2021f3b8057186022b.tar.gz
faster ID allocation
-rw-r--r--3d_accel.h11
-rw-r--r--makefile2
-rw-r--r--vxd_svga.c22
3 files changed, 31 insertions, 4 deletions
diff --git a/3d_accel.h b/3d_accel.h
index 02e37b4..517f869 100644
--- a/3d_accel.h
+++ b/3d_accel.h
@@ -33,7 +33,7 @@ THE SOFTWARE.
#endif
#endif
-#define API_3DACCEL_VER 20240321
+#define API_3DACCEL_VER 20240404
/* function codes */
#define OP_FBHDA_SETUP 0x110B /* VXD, DRV, ExtEscape */
@@ -196,12 +196,16 @@ typedef struct SVGA_DB_region
{
DWORD pid;
SVGA_region_info_t info;
+ DWORD pad1;
+ DWORD pad2;
} SVGA_DB_region_t;
typedef struct SVGA_DB_context
{
DWORD pid;
void *cotable;
+ DWORD pad1;
+ DWORD pad2;
} SVGA_DB_context_t;
typedef struct SVGA_DB_surface
@@ -224,8 +228,13 @@ typedef struct SVGA_DB
DWORD regions_cnt;
DWORD contexts_cnt;
DWORD surfaces_cnt;
+ DWORD *regions_map;
+ DWORD *contexts_map;
+ DWORD *surfaces_map;
char mutexname[64];
DWORD stat_regions_usage;
+ DWORD pad1;
+ DWORD pad2;
} SVGA_DB_t;
/* internal VXD only */
diff --git a/makefile b/makefile
index 04f0eb8..633ac1e 100644
--- a/makefile
+++ b/makefile
@@ -11,7 +11,7 @@ OBJS += &
INCS = -I$(%WATCOM)\h\win -Iddk -Ivmware
-VER_BUILD = 41
+VER_BUILD = 43
FLAGS = -DDRV_VER_BUILD=$(VER_BUILD)
diff --git a/vxd_svga.c b/vxd_svga.c
index 5f2fc96..d29ce2e 100644
--- a/vxd_svga.c
+++ b/vxd_svga.c
@@ -452,11 +452,16 @@ static void SVGA_DB_alloc()
DWORD max_regions = SVGA3D_MAX_MOBS; ///SVGA_ReadReg(SVGA_REG_GMR_MAX_IDS);
+ DWORD regions_map_size = ((max_regions + 31) >> 3) & 0xFFFFFFFCUL;
+ DWORD contexts_map_size = ((SVGA3D_MAX_CONTEXT_IDS + 31) >> 3) & 0xFFFFFFFCUL;
+ DWORD surfaces_map_size = ((SVGA3D_MAX_SURFACE_IDS + 31) >> 3) & 0xFFFFFFFCUL;
+
size = max_regions * sizeof(SVGA_DB_region_t) +
SVGA3D_MAX_CONTEXT_IDS * sizeof(SVGA_DB_context_t) +
SVGA3D_MAX_SURFACE_IDS * sizeof(SVGA_DB_surface_t) +
- sizeof(SVGA_DB_t);
-
+ sizeof(SVGA_DB_t) +
+ regions_map_size + contexts_map_size + surfaces_map_size;
+
svga_db = (SVGA_DB_t*)_PageAllocate(RoundToPages(size), PG_VM, ThisVM, 0, 0x0, 0x100000, NULL, PAGEFIXED);
if(svga_db)
{
@@ -476,8 +481,21 @@ static void SVGA_DB_alloc()
svga_db->surfaces_cnt = SVGA3D_MAX_SURFACE_IDS;
mem += svga_db->surfaces_cnt * sizeof(SVGA_DB_surface_t);
+ svga_db->regions_map = (DWORD*)mem;
+ mem += regions_map_size;
+
+ svga_db->contexts_map = (DWORD*)mem;
+ mem += contexts_map_size;
+
+ svga_db->surfaces_map = (DWORD*)mem;
+ mem += surfaces_map_size;
+
memcpy(svga_db->mutexname, &(db_mutexname[0]), sizeof(db_mutexname));
+ memset(svga_db->regions_map, 0xFF, regions_map_size);
+ memset(svga_db->contexts_map, 0xFF, contexts_map_size);
+ memset(svga_db->surfaces_map, 0xFF, surfaces_map_size);
+
svga_db->stat_regions_usage = 0;
}
}