aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaroslav Hensl <jara@hensl.cz>2024-09-28 20:12:18 +0200
committerJaroslav Hensl <jara@hensl.cz>2024-09-28 20:12:18 +0200
commit1f394984ade4f339a2b4a29a6e4a7d0ed63576de (patch)
tree2ec5462ab2fe3baa6e777bb93373107de6069ba8
parent370bc9a33893c474f36e171e05b5aa60885c8997 (diff)
downloadvmdisp9x-1f394984ade4f339a2b4a29a6e4a7d0ed63576de.tar.gz
Gamma quirks for some buggy engines
-rw-r--r--makefile2
-rw-r--r--vmdisp9x.inf3
-rw-r--r--vxd_fbhda.c110
-rw-r--r--vxd_main.c4
-rw-r--r--vxd_svga_mem.c6
5 files changed, 88 insertions, 37 deletions
diff --git a/makefile b/makefile
index 8e00191..0bd81e2 100644
--- a/makefile
+++ b/makefile
@@ -12,7 +12,7 @@ OBJS += &
INCS = -I$(%WATCOM)\h\win -Iddk -Ivmware
-VER_BUILD = 84
+VER_BUILD = 85
FLAGS = -DDRV_VER_BUILD=$(VER_BUILD)
diff --git a/vmdisp9x.inf b/vmdisp9x.inf
index 8ca6bb2..73ab4bb 100644
--- a/vmdisp9x.inf
+++ b/vmdisp9x.inf
@@ -247,6 +247,7 @@ HKR,"MODES\32\1920,1080"
HKR,"MODES\32\1920,1200"
HKLM,Software\vmdisp9x,FORCE_QEMU3DFX,,0
HKLM,Software\vmdisp9x,FORCE_SOFTWARE,,0
+HKLM,Software\vmdisp9x,GAMMA_QUIRK,,2
HKLM,Software\VMWSVGA,RGB565bug,,0
HKLM,Software\VMWSVGA,CommandBuffers,,1
HKLM,Software\VMWSVGA,VRAMLimit,,128
@@ -399,6 +400,6 @@ QemuStd.DeviceDesc="QEMU STD VGA PCI Adapter"
QemuQXL.DeviceDesc="QEMU QXL VGA PCI Adapter"
[VM.regextra]
-HKLM,Software\vmdisp9x,OVERLAY_1_SIZE,,8
+;swvoodoo:HKLM,Software\vmdisp9x,OVERLAY_1_SIZE,,8
; extra registry section for installers (eg. SoftGPU)
; please do not add any other section below these lines!
diff --git a/vxd_fbhda.c b/vxd_fbhda.c
index b879db1..3371de6 100644
--- a/vxd_fbhda.c
+++ b/vxd_fbhda.c
@@ -36,6 +36,7 @@ THE SOFTWARE.
FBHDA_t *hda = NULL;
ULONG hda_sem = 0;
LONG fb_lock_cnt = 0;
+DWORD gamma_quirk = 0;
#include "vxd_strings.h"
@@ -100,9 +101,9 @@ static void init_ramp()
WORD i = 0;
for(i = 0; i < 256; i++)
{
- gamma_ramp[0][i] = i << 8;
- gamma_ramp[1][i] = i << 8;
- gamma_ramp[2][i] = i << 8;
+ gamma_ramp[0][i] = (i << 8) | i;
+ gamma_ramp[1][i] = (i << 8) | i;
+ gamma_ramp[2][i] = (i << 8) | i;
}
gamma_ramp_init = TRUE;
@@ -126,45 +127,92 @@ BOOL FBHDA_gamma_get(VOID FBPTR ramp, DWORD buffer_size)
return FALSE;
}
-
-
BOOL FBHDA_gamma_set(VOID FBPTR ramp, DWORD buffer_size)
{
if(sizeof(gamma_ramp) == buffer_size)
{
WORD *new_ramp = ramp;
- DWORD gamma = (
- gamma_table[(new_ramp[0*256 + 128] >> 8)] +
- gamma_table[(new_ramp[1*256 + 128] >> 8)] +
- gamma_table[(new_ramp[2*256 + 128] >> 8)]
- ) / 3;
-
- if(gamma >= 0x3000 && gamma < 0xFF0000) /* from ~0.2000 to 255.0000 */
+ DWORD gamma = 0;
+ DWORD used_quirk = gamma_quirk;
+ if(used_quirk == 0)
{
- hda->gamma = gamma;
- hda->gamma_update++;
-
- /* copy new ramp */
- memcpy(&gamma_ramp[0][0], ramp, sizeof(gamma_ramp));
- gamma_ramp_init = TRUE;
-
- dbg_printf("gamma update to 0x%lX\n", hda->gamma);
-
- return TRUE;
+ if(new_ramp[0*256 + 128] == 0xFFFF)
+ {
+ used_quirk = 1;
+ }
+ else
+ {
+ used_quirk = 2;
+ }
}
- else
+
+ dbg_printf("Gamma quirk: %ld\n", used_quirk);
+
+ if(used_quirk == 1) /* gamma quirk for ID Software games */
{
- dbg_printf("Gamma out of reach: 0x%lX\n", gamma);
+ gamma = (
+ gamma_table[(new_ramp[0*256 + 64] >> 8)] +
+ gamma_table[(new_ramp[1*256 + 64] >> 8)] +
+ gamma_table[(new_ramp[2*256 + 64] >> 8)]
+ ) / 3;
+
+ if(gamma >= 0x3000 && gamma < 0x1000000) /* from ~0.2000 to 256.0000 */
{
int i = 0;
- dbg_printf("RAMP\n");
- for(i = 0; i < 256; i++)
+ hda->gamma = gamma;
+ hda->gamma_update++;
+
+ /* copy new ramp and duplicate odd values */
+ for(i = 0; i < 128; i ++)
{
- dbg_printf("%d: R: %X, G: %X, B: %X\n", i,
- new_ramp[0*256 + i],
- new_ramp[1*256 + i],
- new_ramp[2*256 + i]);
+ gamma_ramp[0][(i*2) + 0] = new_ramp[0*256 + i];
+ gamma_ramp[0][(i*2) + 1] = new_ramp[0*256 + i];
+ gamma_ramp[1][(i*2) + 0] = new_ramp[1*256 + i];
+ gamma_ramp[1][(i*2) + 1] = new_ramp[1*256 + i];
+ gamma_ramp[2][(i*2) + 0] = new_ramp[2*256 + i];
+ gamma_ramp[2][(i*2) + 1] = new_ramp[2*256 + i];
}
+
+ gamma_ramp_init = TRUE;
+
+ dbg_printf("gamma update to 0x%lX\n", hda->gamma);
+
+ return TRUE;
+ }
+ }
+ else /* normal way by MS specification */
+ {
+ gamma = (
+ gamma_table[(new_ramp[0*256 + 128] >> 8)] +
+ gamma_table[(new_ramp[1*256 + 128] >> 8)] +
+ gamma_table[(new_ramp[2*256 + 128] >> 8)]
+ ) / 3;
+
+ if(gamma >= 0x3000 && gamma < 0x1000000) /* from ~0.2000 to 256.0000 */
+ {
+ hda->gamma = gamma;
+ hda->gamma_update++;
+
+ /* copy new ramp */
+ memcpy(&gamma_ramp[0][0], ramp, sizeof(gamma_ramp));
+ gamma_ramp_init = TRUE;
+
+ dbg_printf("gamma update to 0x%lX\n", hda->gamma);
+
+ return TRUE;
+ }
+ }
+
+ dbg_printf("Gamma out of reach: 0x%lX\n", gamma);
+ {
+ int i = 0;
+ dbg_printf("RAMP\n");
+ for(i = 0; i < 256; i++)
+ {
+ dbg_printf("%d: R: %X, G: %X, B: %X\n", i,
+ new_ramp[0*256 + i],
+ new_ramp[1*256 + i],
+ new_ramp[2*256 + i]);
}
}
}
@@ -172,7 +220,7 @@ BOOL FBHDA_gamma_set(VOID FBPTR ramp, DWORD buffer_size)
{
dbg_printf("Wrong ramp size: %ld\n", buffer_size);
}
-
+
return FALSE;
}
diff --git a/vxd_main.c b/vxd_main.c
index 68bae7f..0e0bf95 100644
--- a/vxd_main.c
+++ b/vxd_main.c
@@ -448,6 +448,7 @@ void __declspec(naked) VXD_API_entry()
}
const char reg_path[] = "Software\\vmdisp9x";
+extern DWORD gamma_quirk;
static void configure_FBHDA()
{
@@ -465,7 +466,8 @@ static void configure_FBHDA()
RegReadConf(HKEY_LOCAL_MACHINE, reg_path, "FORCE_SOFTWARE", &force_sw);
RegReadConf(HKEY_LOCAL_MACHINE, reg_path, "FORCE_QEMU3DFX", &force_qemu3dfx);
-
+ RegReadConf(HKEY_LOCAL_MACHINE, reg_path, "GAMMA_QUIRK", &gamma_quirk);
+
for(i = 1; i < FBHA_OVERLAYS_MAX; i++)
{
char *ptr;
diff --git a/vxd_svga_mem.c b/vxd_svga_mem.c
index 17f0518..9b731b3 100644
--- a/vxd_svga_mem.c
+++ b/vxd_svga_mem.c
@@ -128,7 +128,7 @@ static void cachePPN(DWORD virtualaddr, DWORD pages)
phycache[i] = _PAGE(phycache[i]);
}
- dbg_printf("cachePPN: %lX (size: %ld)\n", virtualaddr, pages);
+ //dbg_printf("cachePPN: %lX (size: %ld)\n", virtualaddr, pages);
phycache_starta = virtualaddr;
phycache_enda = virtualaddr + (pages << P_SHIFT);
@@ -921,7 +921,7 @@ BOOL SVGA_region_create(SVGA_region_info_t *rinfo)
svga_db->stat_regions_usage += rinfo->size;
- dbg_printf("More memory usage: %ld (+%ld)\n", svga_db->stat_regions_usage, rinfo->size);
+ //dbg_printf("More memory usage: %ld (+%ld)\n", svga_db->stat_regions_usage, rinfo->size);
Signal_Semaphore(mem_sem);
return TRUE;
@@ -939,7 +939,7 @@ void SVGA_region_free(SVGA_region_info_t *rinfo)
Wait_Semaphore(mem_sem, 0);
svga_db->stat_regions_usage -= rinfo->size;
- dbg_printf("Less memory usage: %ld (-%ld)\n", svga_db->stat_regions_usage, rinfo->size);
+ //dbg_printf("Less memory usage: %ld (-%ld)\n", svga_db->stat_regions_usage, rinfo->size);
saved_in_cache = cache_insert(rinfo);