diff options
author | Jaroslav Hensl <emulator@emulace.cz> | 2024-08-25 12:52:59 +0200 |
---|---|---|
committer | Jaroslav Hensl <emulator@emulace.cz> | 2024-08-25 12:52:59 +0200 |
commit | a31f4e91c1908b937e5d4f8421f0257043a89829 (patch) | |
tree | 2e0a29e891b465ac98e408932630fbe420959381 /vxd_svga_mem.c | |
parent | 9bbfec33c0344a80fccee0b25a0887f22e2d9a73 (diff) | |
download | vmdisp9x-a31f4e91c1908b937e5d4f8421f0257043a89829.tar.gz |
Gamma support
Diffstat (limited to 'vxd_svga_mem.c')
-rw-r--r-- | vxd_svga_mem.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/vxd_svga_mem.c b/vxd_svga_mem.c index 727ced7..026da70 100644 --- a/vxd_svga_mem.c +++ b/vxd_svga_mem.c @@ -97,6 +97,10 @@ static svga_cache_state_t cache_state = {0, 0}; static BOOL cache_enabled = FALSE;
+#define PHY_CACHE_SIZE (8192 + 1024)
+static DWORD phycache[PHY_CACHE_SIZE];
+static DWORD phycache_starta = 0;
+static DWORD phycache_enda = 0;
/*
* globals
@@ -109,14 +113,40 @@ extern LONG fb_lock_cnt; extern BOOL gb_support;
+static void cachePPN(DWORD virtualaddr, DWORD pages)
+{
+ DWORD i = 0;
+ if(pages > PHY_CACHE_SIZE)
+ {
+ pages = PHY_CACHE_SIZE;
+ }
+
+ _CopyPageTable(_PAGE(virtualaddr), pages, &phycache, 0);
+
+ for(i = 0; i < pages; i++)
+ {
+ phycache[i] = _PAGE(phycache[i]);
+ }
+
+ dbg_printf("cachePPN: %lX (size: %ld)\n", virtualaddr, pages);
+
+ phycache_starta = virtualaddr;
+ phycache_enda = virtualaddr + (pages << P_SHIFT);
+}
+
/**
* Return PPN (physical page number) to virtual address
*
**/
-
static DWORD getPPN(DWORD virtualaddr)
{
DWORD phy = 0;
+
+ if(virtualaddr >= phycache_starta && virtualaddr < phycache_enda)
+ {
+ return phycache[_PAGE(virtualaddr - phycache_starta)];
+ }
+
_CopyPageTable(_PAGE(virtualaddr), 1, &phy, 0);
return _PAGE(phy);
}
@@ -725,6 +755,8 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo) {
return FALSE;
}
+
+ cachePPN(maddr, nPages+pt_pages);
laddr = maddr + pt_pages*P_SIZE;
|