glide2x, h3, win_mode.c: build fixes / mysterious bug fixes from glide3
This commit is contained in:
@@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user