glide2x, h3, win_mode.c: build fixes / mysterious bug fixes from glide3

This commit is contained in:
sezero
2018-08-19 16:13:40 +03:00
parent 6d7be29632
commit e0d29a1656

View File

@@ -21,63 +21,60 @@
#include <stdio.h> #include <stdio.h>
#include <3dfx.h> #include <3dfx.h>
#include <gdebug.h> #include <gdebug.h>
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <ddraw.h> #if (WINVER < 0x0500) && !defined(HMONITOR_DECLARED) /* <--- HACK */
DECLARE_HANDLE(HMONITOR);
#define HMONITOR_DECLARED
#endif
#include <ddraw.h>
#include <sst1vid.h> #include <sst1vid.h>
#include "qmodes.h" #include "qmodes.h"
#if 0 /* moved to asm so we don't need w9x ddk headers. */
#define IS_32 #define IS_32
#define Not_VxD #define Not_VxD
#include <minivdd.h> #include <minivdd.h>
#include <vmm.h> #include <vmm.h>
#include <configmg.h> #include <configmg.h>
#else
extern DWORD __cdecl CM_Get_DevNode_Key(DWORD,PCHAR,PVOID,ULONG,ULONG);
#define CM_REGISTRY_HARDWARE 0
#define CM_REGISTRY_SOFTWARE 1
#endif
/* Windows */ #ifndef IDirectDraw7_CreateSurface /* ddraw.h not from dx7 sdk */
#define SEPARATOR '\\' typedef BOOL (FAR PASCAL * LPDDENUMCALLBACKEXA)(GUID FAR *, LPSTR, LPSTR, LPVOID, HMONITOR);
/* UNIX */ typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEXA)(LPDDENUMCALLBACKEXA, LPVOID, DWORD);
#define SEPARATOR2 '/' #ifndef DDENUM_ATTACHEDSECONDARYDEVICES
#define DDENUM_ATTACHEDSECONDARYDEVICES 0x00000001L
#endif
#endif
/* static HWND hwndApp = 0;
* parseFilename
*
* Return the file name portion of a filename/path.
*/
static char *
_parseFilename(char *name)
{
int i;
if (name == NULL)
return NULL;
for(i = strlen(name); i >= 0; i--)
if ((name[i] == SEPARATOR) ||
(name[i] == SEPARATOR2))
return (name + i + 1);
return name;
} /* End of parseFilename*/
/* Direct Draw stuff */
LPDIRECTDRAW lpDD1 = NULL;
LPDIRECTDRAW2 lpDD = NULL;
static int _set_exclusive_relaxed; static int _set_exclusive_relaxed;
static int _set_vidmode_relaxed; static int _set_vidmode_relaxed;
typedef struct _enumInfoStruct {
GUID guid;
HMONITOR hmon;
} EnumInfo;
static BOOL FAR PASCAL static BOOL FAR PASCAL
ddEnumCbEx( GUID FAR *guid, LPSTR desc, LPSTR name, LPVOID ctx, HMONITOR hmon ) ddEnumCbEx( GUID FAR *guid, LPSTR desc, LPSTR name, LPVOID ctx, HMONITOR hmon )
{ {
DWORD *data = (DWORD*)ctx; EnumInfo* pEnumInfo = (EnumInfo*)ctx;
HMONITOR target = (HMONITOR)data[0]; BOOL rv = DDENUMRET_OK;
BOOL rv = DDENUMRET_OK;
if ( target == hmon ) { if(pEnumInfo->hmon == hmon) {
if ( guid ) { if ( guid ) CopyMemory(&pEnumInfo->guid, guid, sizeof(GUID));
fooGuid = *guid; rv = DDENUMRET_CANCEL;
data[1] = (DWORD)&fooGuid;
} else {
/* guid for primary display device */
data[1] = 0;
}
rv = DDENUMRET_CANCEL;
} }
return rv; return rv;
} }
@@ -207,13 +204,13 @@ getModesRegPath()
FxBool FxBool
setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon ) setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon )
{ {
LPGUID ddGuid = NULL; LPGUID ddGuid = NULL;
HMODULE ddraw = NULL; HMODULE ddraw = NULL;
DDSURFACEDESC ddsd; DDSURFACEDESC ddsd;
HRESULT hResult; HRESULT hResult;
DEVMODE devMode; DEVMODE devMode;
FxU32 bpp = 16; FxU32 bpp = 16;
EMCData emcData; /* Enum Modes Callbac Data */ EMCData emcData; /* Enum Modes Callbac Data */
GDBG_INFO( 80, "setVideoMode sees hwnd %x\n", hwnd); GDBG_INFO( 80, "setVideoMode sees hwnd %x\n", hwnd);
hwndApp = ( hwnd == NULL ) ? GetActiveWindow() : hwnd; hwndApp = ( hwnd == NULL ) ? GetActiveWindow() : hwnd;
@@ -223,21 +220,21 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon )
} }
ddGuid = NULL; ddGuid = NULL;
ddraw = GetModuleHandle( "ddraw.dll" ); ddraw = GetModuleHandle( "ddraw.dll" );
if ( ddraw ) { if ( ddraw ) {
LPDIRECTDRAWENUMERATEEXA ddEnumEx; LPDIRECTDRAWENUMERATEEXA ddEnumEx;
ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" ); ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" );
if ( ddEnumEx ) { if ( ddEnumEx ) {
DWORD data[2]; EnumInfo enumInfo;
data[0] = (DWORD)hmon;
data[1] = 0; ZeroMemory(&enumInfo, sizeof(enumInfo));
ddEnumEx( ddEnumCbEx, data, DDENUM_ATTACHEDSECONDARYDEVICES ); ZeroMemory(&enumInfo.guid, sizeof(GUID));
if ( data[1] ) { enumInfo.hmon = (HMONITOR)hmon;
ddGuid = (LPGUID)data[1]; ddEnumEx( ddEnumCbEx, &enumInfo, DDENUM_ATTACHEDSECONDARYDEVICES );
} ddGuid = &enumInfo.guid;
GDBG_INFO(80, "GUID %d\n", ddGuid);
} }
} }
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode); EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode);
@@ -256,7 +253,7 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon )
bpp = 8; bpp = 8;
} }
checkSpecialList(); //checkSpecialList(); /* [dBorca] disable for now */
if (lpDD == NULL) { if (lpDD == NULL) {
/* only create directdraw object once */ /* only create directdraw object once */
if ( DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) { if ( DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) {
@@ -269,8 +266,8 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon )
lpDD1 = NULL; lpDD1 = NULL;
lpDD = NULL; lpDD = NULL;
GDBG_INFO(80, "DDraw Obj Create Failed!\n"); GDBG_INFO(80, "DDraw Obj Create Failed!\n");
return FXFALSE; return FXFALSE;
} }
else GDBG_INFO(80, "DDraw2 Obj created!\n"); else GDBG_INFO(80, "DDraw2 Obj created!\n");
} }
@@ -286,7 +283,7 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon )
!= DD_OK) { != DD_OK) {
GDBG_INFO(80, "Couldn't set cooperative level: " ); GDBG_INFO(80, "Couldn't set cooperative level: " );
if (hResult & DDERR_EXCLUSIVEMODEALREADYSET) if (hResult & DDERR_EXCLUSIVEMODEALREADYSET)
GDBG_INFO_MORE(80, "DDERR_EXCLUSIVEMODEALREADYSET\n" ); GDBG_INFO_MORE(80, "DDERR_EXCLUSIVEMODEALREADYSET\n" );
if (hResult & DDERR_HWNDALREADYSET) { if (hResult & DDERR_HWNDALREADYSET) {
GDBG_INFO_MORE(80, "DDERR_HWNDALREADYSET\n" ); GDBG_INFO_MORE(80, "DDERR_HWNDALREADYSET\n" );
@@ -315,7 +312,6 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon )
/* Figure out if we can support the requested display mode. If not, /* Figure out if we can support the requested display mode. If not,
try to use the same x & y res, but the default refresh rate.*/ try to use the same x & y res, but the default refresh rate.*/
ddsd.dwSize = sizeof(ddsd); ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT; ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT;
ddsd.dwWidth = xRes; ddsd.dwWidth = xRes;
@@ -334,8 +330,8 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon )
if (hResult != DD_OK) { if (hResult != DD_OK) {
GDBG_INFO(80, "Warning: EnumDisplayModes failed due to: \n"); GDBG_INFO(80, "Warning: EnumDisplayModes failed due to: \n");
msgEnumDisplayModes(hResult); msgEnumDisplayModes(hResult);
} }
GDBG_INFO(80, "Setting Display Mode!\n"); GDBG_INFO(80, "Setting Display Mode!\n");
if (emcData.modeOK) { if (emcData.modeOK) {
@@ -351,7 +347,7 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int refresh, void *hmon )
if (hResult != DD_OK) { if (hResult != DD_OK) {
GDBG_INFO(80, "Setting video mode %dx%d@default refresh failed!\n", GDBG_INFO(80, "Setting video mode %dx%d@default refresh failed!\n",
xRes, yRes); xRes, yRes);
msgModeSetFailure(hResult); msgModeSetFailure(hResult);
if (!_set_vidmode_relaxed) { if (!_set_vidmode_relaxed) {
GDBG_INFO(80, "Returning FXFALSE\n"); GDBG_INFO(80, "Returning FXFALSE\n");
@@ -507,7 +503,7 @@ resetVideo( void )
IDirectDraw2_SetCooperativeLevel( lpDD, hwndApp, DDSCL_NORMAL ); IDirectDraw2_SetCooperativeLevel( lpDD, hwndApp, DDSCL_NORMAL );
GDBG_INFO(80, "%s: Set cooperative level!\n", FN_NAME); GDBG_INFO(80, "%s: Set cooperative level!\n", FN_NAME);
IDirectDraw2_Release( lpDD ); IDirectDraw2_Release( lpDD );
GDBG_INFO(80, "%s: Released lpDD!\n", FN_NAME); GDBG_INFO(80, "%s: Released lpDD!\n", FN_NAME);
if ( lpDD1 ) { if ( lpDD1 ) {
IDirectDraw_Release( lpDD1 ); IDirectDraw_Release( lpDD1 );
@@ -522,7 +518,7 @@ resetVideo( void )
} /* resetVideo */ } /* resetVideo */
typedef struct WidthHeight_s { typedef struct WidthHeight_s {
FxU32 width; FxU32 width;
FxU32 height; FxU32 height;
} WidthHeight_t; } WidthHeight_t;
@@ -553,33 +549,6 @@ static WidthHeight_t widthHeightByResolution[] = {
{2048, 2048} /* GR_RESOLUTION_2048x2048 */ {2048, 2048} /* GR_RESOLUTION_2048x2048 */
}; };
static char *resNames[] = {
"GR_RESOLUTION_320x200",
"GR_RESOLUTION_320x240",
"GR_RESOLUTION_400x256",
"GR_RESOLUTION_512x384",
"GR_RESOLUTION_640x200",
"GR_RESOLUTION_640x350",
"GR_RESOLUTION_640x400",
"GR_RESOLUTION_640x480",
"GR_RESOLUTION_800x600",
"GR_RESOLUTION_960x720",
"GR_RESOLUTION_856x480",
"GR_RESOLUTION_512x256",
"GR_RESOLUTION_1024x768",
"GR_RESOLUTION_1280x1024",
"GR_RESOLUTION_1600x1200",
"GR_RESOLUTION_400x300",
"GR_RESOLUTION_1152x864",
"GR_RESOLUTION_1280x960",
"GR_RESOLUTION_1600x1024",
"GR_RESOLUTION_1792x1344",
"GR_RESOLUTION_1856x1392",
"GR_RESOLUTION_1920x1440",
"GR_RESOLUTION_2048x1536",
"GR_RESOLUTION_2048x2048"
};
static HRESULT WINAPI static HRESULT WINAPI
checkResEMCallback(LPDDSURFACEDESC surfaceDesc, LPVOID lpContext) checkResEMCallback(LPDDSURFACEDESC surfaceDesc, LPVOID lpContext)
@@ -627,9 +596,9 @@ checkResEMCallback(LPDDSURFACEDESC surfaceDesc, LPVOID lpContext)
FxBool FxBool
checkResolutions(FxBool *supportedByResolution, void *hmon) checkResolutions(FxBool *supportedByResolution, void *hmon)
{ {
#define FN_NAME "checkResolution" #define FN_NAME "checkResolution"
LPGUID ddGuid = NULL; LPGUID ddGuid = NULL;
HMODULE ddraw = NULL; HMODULE ddraw = NULL;
HRESULT hResult; HRESULT hResult;
hwndApp = GetActiveWindow(); hwndApp = GetActiveWindow();
@@ -639,26 +608,27 @@ checkResolutions(FxBool *supportedByResolution, void *hmon)
} }
ddGuid = NULL; ddGuid = NULL;
ddraw = GetModuleHandle( "ddraw.dll" ); ddraw = GetModuleHandle( "ddraw.dll" );
if ( ddraw ) { if ( ddraw ) {
LPDIRECTDRAWENUMERATEEXA ddEnumEx; LPDIRECTDRAWENUMERATEEXA ddEnumEx;
ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" ); ddEnumEx = (void*)GetProcAddress( ddraw, "DirectDrawEnumerateExA" );
if ( ddEnumEx ) { if ( ddEnumEx ) {
DWORD data[2]; EnumInfo enumInfo;
data[0] = (DWORD)hmon;
data[1] = 0; ZeroMemory(&enumInfo, sizeof(enumInfo));
ddEnumEx( ddEnumCbEx, data, DDENUM_ATTACHEDSECONDARYDEVICES ); ZeroMemory(&enumInfo.guid, sizeof(GUID));
if ( data[1] ) { enumInfo.hmon = (HMONITOR)hmon;
ddGuid = (LPGUID)data[1]; ddEnumEx( ddEnumCbEx, &enumInfo, DDENUM_ATTACHEDSECONDARYDEVICES );
} ddGuid = &enumInfo.guid;
GDBG_INFO(80, "GUID %d\n", ddGuid);
} }
} }
checkSpecialList(); // checkSpecialList(); /* [dBorca] disable for now */
if (lpDD == NULL) { if (lpDD == NULL) {
/* only create directdraw object once */ /* only create directdraw object once */
if ( DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) { if ( DirectDrawCreate( ddGuid, &lpDD1, NULL ) != DD_OK) {
GDBG_INFO(80, "DDraw Obj Create Failed!\n"); GDBG_INFO(80, "DDraw Obj Create Failed!3\n");
} }
else GDBG_INFO(80, "DDraw Obj created!\n"); else GDBG_INFO(80, "DDraw Obj created!\n");
if ( IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2, if ( IDirectDraw_QueryInterface( lpDD1, &IID_IDirectDraw2,
@@ -667,8 +637,8 @@ checkResolutions(FxBool *supportedByResolution, void *hmon)
lpDD1 = NULL; lpDD1 = NULL;
lpDD = NULL; lpDD = NULL;
GDBG_INFO(80, "DDraw Obj Create Failed!\n"); GDBG_INFO(80, "DDraw Obj Create Failed!\n");
return FXFALSE; return FXFALSE;
} }
else GDBG_INFO(80, "DDraw2 Obj created!\n"); else GDBG_INFO(80, "DDraw2 Obj created!\n");
} }