moved OS and CPU flags from bInfo to _GlideRoot

This commit is contained in:
koolsmoky
2003-06-26 19:23:59 +00:00
parent 2880476dbf
commit e115acc717
8 changed files with 202 additions and 355 deletions

View File

@@ -2020,19 +2020,14 @@ typedef struct GrGC_s
** stuff near the top is accessed a lot
*/
struct _GlideRoot_s {
int p6Fencer; /* xchg to here to keep this in cache!!! */
FxU32
tlsIndex,
tlsOffset;
int p6Fencer; /* xchg to here to keep this in cache!!! */
FxU32 tlsIndex;
FxU32 tlsOffset;
int current_sst;
_p_info
CPUType; /* Colourless's CPUID */
FxBool
OSWin95;
FxI32
windowsInit; /* Is the fullscreen part of glide initialized? */
int current_sst;
FxI32 windowsInit; /* Is the fullscreen part of glide initialized? */
_p_info CPUType; /* CPUID */
#if !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP
FxU32 paramCount;
@@ -2041,9 +2036,9 @@ struct _GlideRoot_s {
#endif /* !GLIDE_HW_TRI_SETUP || !GLIDE_PACKET3_TRI_SETUP */
#if GLIDE_MULTIPLATFORM
GrGCFuncs
curGCFuncs; /* Current dd Function pointer table */
GrGCFuncs curGCFuncs; /* Current dd Function pointer table */
#endif
int initialized;
struct { /* constant pool (minimizes cache misses) */
@@ -2160,6 +2155,16 @@ struct _GlideRoot_s {
GrTexDownloadProcVector* nullTexProcs;
} deviceArchProcs;
#if (GLIDE_PLATFORM & GLIDE_OS_WIN32)
#define OS_WIN32_95 0
#define OS_WIN32_98 1
#define OS_WIN32_ME 2
#define OS_WIN32_NT4 3
#define OS_WIN32_2K 4
#define OS_WIN32_XP 5
FxI32 OS;
#endif
};
extern struct _GlideRoot_s GR_CDECL _GlideRoot;
@@ -3182,57 +3187,6 @@ _grErrorCallback(const char* const procName,
va_list args);
#endif
#if 0 /* we now use Colourless's CPUID */
/* Returns 16:16 pair indicating the cpu's manufacturer and its
* capabilities. Non-Intel processors should have a vendor id w/ the
* high bit set so that it appears to be a negative #. The value of
* the capability field is assumed to be a monotonically increasing
* inclusive set.
*
* Unknown:
* 0xFFFF:0xFFFF
*
* Intel: 0x0000
* 4: 486 and lower
* 5: Pentium
* 6: P6 Core or better
* 7: p6 Core w/ katmai (instructions/write buffers)
*
* AMD: 0x8001
* 1: MMX
* 2: 3DNow!(tm)
* 4: K6-type MTRRs
* 8: P2-type MTRRs
*
* Cyrix: 0x8002
* 1: MMX
* 2: 3DNow!(tm)
*
* IDT: 0x8003
* 1: MMX
* 2: 3DNow!(tm)
*
*/
enum {
kCPUVendorIntel = 0x0000,
kCPUVendorAMD = 0x8001,
kCPUVendorCyrix = 0x8002,
kCPUVendorIDT = 0x8003,
kCPUVendorTransmeta = 0x8004,
kCPUVendorUnknown = 0xFFFF
};
extern FxI32 GR_CDECL
_cpu_detect_asm(void);
extern void GR_CDECL
single_precision_asm(void);
extern void GR_CDECL
double_precision_asm(void);
#endif /* we now use Colourless's CPUID */
/* The translation macros convert from the reasonable log2 formats to
* the somewhat whacked (For those of us coming back to sst1 things
* from sst2 w/ its saner lms notation) sst1 lod format. The api and

View File

@@ -1318,17 +1318,13 @@ void
_GlideInitEnvironment(int which)
{
#define FN_NAME "_GlideInitEnvironment"
/* int i; */
int i;
FxU32 ditherMode;
const char* envStr;
FxU32 ctx = which;
double pi = 3.1415926535;
const char* envStr2;
#if (GLIDE_PLATFORM & GLIDE_OS_WIN32)
OSVERSIONINFO ovi;
#endif
if (_GlideRoot.initialized) /* only execute once */
return;
@@ -1338,15 +1334,7 @@ _GlideInitEnvironment(int which)
#if (GLIDE_PLATFORM & GLIDE_OS_WIN32)
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT)
_GlideRoot.OSWin95 = 0;
else
_GlideRoot.OSWin95 = 1;
GDBG_INFO(80, "%s: OS = %s\n", FN_NAME, _GlideRoot.OSWin95 ? "W9X" : "WNT");
_GlideRoot.OS = hwcGetOS();
#if defined(FX_DLL_ENABLE) && (GLIDE_PLATFORM & GLIDE_OS_WIN32)
{ /* GMT: display the DLL pathname for sanity checking */
char buf[132] = "failed";
@@ -1908,130 +1896,15 @@ _GlideInitEnvironment(int which)
_GlideRoot.environment.useAppGamma = GLIDE_GETENV("FX_GLIDE_USE_APP_GAMMA", GC.bInfo->RegPath, 1L);
#if 0 /* use Colourless's CPUID */
_GlideRoot.CPUType = GLIDE_GETENV("FX_CPU", GC.bInfo->RegPath, _cpu_detect_asm() );
/* The FP part of SSE introduces a new architectural state and therefore
requires support from the operating system. So even if CPUID indicates
support for SSE FP, the application might not be able to use it. If
CPUID indicates support for SSE FP, check here whether it is also
supported by the OS, and turn off the SSE FP feature bit if there
is no OS support for SSE FP.
Operating systems that do not support SSE FP return an illegal
instruction exception if execution of an SSE FP instruction is performed.
Here, a sample SSE FP instruction is executed, and is checked for an
exception using the (non-standard) __try/__except mechanism
of Microsoft Visual C.
Although CR0 can be called from ring3, CR4 must be called from ring0
which prevents us from using the CR0.EM and the CR4.OSFXSR bits. The
main reason for this indirect method.
*/
if((_GlideRoot.CPUType & 0x10L) == 0x10UL) {
__try {
__asm _emit 0x0f
__asm _emit 0x56
__asm _emit 0xC0 ;; orps xmm0, xmm0
}
__except(EXCEPTION_EXECUTE_HANDLER) {
GDBG_INFO(0,"SSE is not supported by OS\n");
_GlideRoot.CPUType &= ~0x10UL;
}
}
if((_GlideRoot.CPUType & 0x40L) == 0x40UL) {
__try {
__asm _emit 0x66
__asm _emit 0x0f
__asm _emit 0x57
__asm _emit 0xc0 ;; xorpd xmm0, xmm0
}
__except(EXCEPTION_EXECUTE_HANDLER) {
GDBG_INFO(0,"SSE2 is not supported by OS\n");
_GlideRoot.CPUType &= ~0x40UL;
}
}
GDBG_INFO(0," cpu: 0x%x\n",_GlideRoot.CPUType);
/* Setup the basic proc tables based on the cpu type. */
{
/* Default case - rasterization routines */
_GlideRoot.deviceArchProcs.curTriProcs = _triSetupProcs + 0;
_GlideRoot.deviceArchProcs.curDrawTrisProc = _grDrawTriangles_Default;
_GlideRoot.deviceArchProcs.curVertexListProcs = _vertexListProcs[0];
/* Default case - texture download procs */
_GlideRoot.deviceArchProcs.curTexProcs = _texDownloadProcs + 0;
/* null proc case */
#define ARRAY_LAST(__array) ((sizeof(__array) / sizeof((__array)[0])) - 1)
_GlideRoot.deviceArchProcs.nullTriProcs = _triSetupProcs + ARRAY_LAST(_triSetupProcs);
_GlideRoot.deviceArchProcs.nullDrawTrisProc = _grDrawTriangles_null;
_GlideRoot.deviceArchProcs.nullVertexListProcs = _vertexListProcs[ARRAY_LAST(_vertexListProcs)];
_GlideRoot.deviceArchProcs.nullTexProcs = _texDownloadProcs + ARRAY_LAST(_texDownloadProcs);
#undef ARRAY_LAST
/* Check for vendor specific optimization cases */
switch((_GlideRoot.CPUType & 0xFFFF0000UL) >> 16UL) {
case kCPUVendorIntel:
GDBG_INFO(0,"Intel detected\n");
break;
case kCPUVendorAMD:
GDBG_INFO(0,"AMD detected\n");
break;
case kCPUVendorCyrix:
GDBG_INFO(0,"Cyrix detected\n");
break;
case kCPUVendorIDT:
GDBG_INFO(0,"IDT detected\n");
break;
case kCPUVendorTransmeta:
GDBG_INFO(0,"Transmeta detected\n");
break;
case kCPUVendorUnknown:
default:
GDBG_INFO(0,"unknown CPU\n");
break;
}
if(((_GlideRoot.CPUType & 0xFFFF0000UL) >> 16UL) != kCPUVendorUnknown) {
#if GL_MMX
if ((_GlideRoot.CPUType & 0x1L) == 0x1UL) { /* check for MMX feature */
GDBG_INFO(0,"using MMX\n");
_GlideRoot.deviceArchProcs.curTexProcs = _texDownloadProcs + 2;
}
#endif /* GL_MMX */
#if GL_SSE
if ((_GlideRoot.CPUType & 0x10L) == 0x10UL) { /* check for SSE FP feature */
GDBG_INFO(0,"using SSE\n");
_GlideRoot.deviceArchProcs.curTriProcs = _triSetupProcs + 2;
_GlideRoot.deviceArchProcs.curDrawTrisProc = _grDrawTriangles_SSE;
_GlideRoot.deviceArchProcs.curVertexListProcs = _vertexListProcs[2];
}
#endif /* GL_SSE */
#if GL_AMD3D
if ((_GlideRoot.CPUType & 0x2L) == 0x2UL) { /* check for 3DNow! feature */
GDBG_INFO(0,"using 3DNow!\n");
_GlideRoot.deviceArchProcs.curTriProcs = _triSetupProcs + 1;
_GlideRoot.deviceArchProcs.curDrawTrisProc = _grDrawTriangles_3DNow;
_GlideRoot.deviceArchProcs.curVertexListProcs = _vertexListProcs[1];
_GlideRoot.deviceArchProcs.curTexProcs = _texDownloadProcs + 1;
}
#endif /* GL_AMD3D */
#if GL_SSE2
if ((_GlideRoot.CPUType & 0x40L) == 0x40UL) { /* check for SSE2 feature */
GDBG_INFO(0,"using SSE2\n");
_GlideRoot.deviceArchProcs.curTexProcs = _texDownloadProcs + 3;
}
#endif /* GL_SSE2*/
}
}
#else
/* Get CPU type */
/* Get CPU Info */
_cpuid (&_GlideRoot.CPUType);
#ifndef __linux__
/* Pass retrieved CPU Info into minihwc */
hwcSetCPUInfo(&_GlideRoot.CPUType);
#endif
/* Setup the basic proc tables based on the cpu type. */
{
//int mmx_3dnow;
@@ -2053,7 +1926,7 @@ _GlideInitEnvironment(int which)
/* Check for vendor specific optimization cases */
GDBG_INFO( 0," CPU Vendor: %s\n", _GlideRoot.CPUType.v_name);
GDBG_INFO( 0," CPU Model: %s\n", _GlideRoot.CPUType.model_name);
GDBG_INFO( 0," CPU Model : %s\n", _GlideRoot.CPUType.model_name);
GDBG_INFO(80," MMX Support: %c\n", _GlideRoot.CPUType.os_support&_CPU_FEATURE_MMX ? 'Y' : 'N');
GDBG_INFO(80," SSE Support: %c\n", _GlideRoot.CPUType.os_support&_CPU_FEATURE_SSE ? 'Y' : 'N');
GDBG_INFO(80," SSE2 Support: %c\n", _GlideRoot.CPUType.os_support&_CPU_FEATURE_SSE2 ? 'Y' : 'N');
@@ -2070,7 +1943,7 @@ _GlideInitEnvironment(int which)
#if GL_MMX
if (_GlideRoot.CPUType.os_support & _CPU_FEATURE_MMX) { /* check for MMX feature */
GDBG_INFO(80,"Using MMX Texture Download Functions\n");
GDBG_INFO(0,"Using MMX Texture Download Functions\n");
_GlideRoot.deviceArchProcs.curTexProcs = _texDownloadProcs + 2;
}
#endif /* GL_MMX */
@@ -2084,7 +1957,7 @@ _GlideInitEnvironment(int which)
#endif /* GL_SSE */
#if GL_AMD3D
if (_GlideRoot.CPUType.os_support & _CPU_FEATURE_3DNOW) { /* check for 3DNow! feature */
GDBG_INFO(80,"Using 3DNow! Texture Download Functions\n");
GDBG_INFO(0,"Using 3DNow! Texture Download Functions\n");
_GlideRoot.deviceArchProcs.curTexProcs = _texDownloadProcs + 1;
GDBG_INFO(0,"Using 3DNow! Geometry Functions\n");
@@ -2100,8 +1973,6 @@ _GlideInitEnvironment(int which)
}
#endif /* GL_SSE2*/
}
#endif /* use Colourless's CPUID */
#if __POWERPC__ && PCI_BUMP_N_GRIND
@@ -2164,13 +2035,10 @@ _GlideInitEnvironment(int which)
#endif
} */
/* KoolSmoky - just get the info for the requested sst
/* display info for all sst devices */
for (i = 0; i < _GlideRoot.hwConfig.num_sst; i++) {
displayBoardInfo(i, &_GlideRoot.hwConfig);
}
*/
displayBoardInfo(ctx, &_GlideRoot.hwConfig);
_GlideRoot.initialized = FXTRUE; /* save this for the end */
} /* _GlideInitEnvironment */

View File

@@ -418,8 +418,10 @@ GR_EXT_ENTRY(grSurfaceReleaseContext, void , (GrContext_t ctx) )
* context by yanking out the hardware mapping! %%KCD
*/
#if (GLIDE_OS & GLIDE_OS_WIN32)
if ( !gc->bInfo->osNT )
hwcUnmapMemory9x ( gc->bInfo );
if ((_GlideRoot.OS == OS_WIN32_95) ||
(_GlideRoot.OS == OS_WIN32_98) ||
(_GlideRoot.OS == OS_WIN32_ME))
hwcUnmapMemory9x ( gc->bInfo );
#endif
/* Free any windowed fifo associated w/ the context */

View File

@@ -3097,15 +3097,9 @@ GR_ENTRY(grSstWinClose, FxBool, (GrContext_t context))
** OpenGL fullscreen apps can run. If not, we will cause a lot
** of problems.
*/
#if 0
if (_GlideRoot.environment.is_opengl == FXTRUE) {
/* KoolSmoky- don't release Exclusive mode if we're running
* in NT5.1. This may cause probems. but, ohwell.
* Fix me! */
if( !gc->bInfo->osNT51 )
hwcRestoreVideo(gc->bInfo);
hwcRestoreVideo(gc->bInfo);
}
#endif
#ifndef __linux__
if (gc->lostContext) {
@@ -3222,10 +3216,13 @@ GR_ENTRY(grSstWinClose, FxBool, (GrContext_t context))
#if (GLIDE_OS & GLIDE_OS_WIN32)
if (_GlideRoot.environment.is_opengl != FXTRUE) {
if ( gc->bInfo->osNT )
hwcUnmapMemory();
else
hwcUnmapMemory9x ( gc->bInfo );
if ((_GlideRoot.OS == OS_WIN32_95) ||
(_GlideRoot.OS == OS_WIN32_98) ||
(_GlideRoot.OS == OS_WIN32_ME)) {
hwcUnmapMemory9x ( gc->bInfo );
} else {
hwcUnmapMemory();
}
}
#endif

View File

@@ -57,11 +57,14 @@ initThreadStorage( void )
threadInit = 1;
_GlideRoot.tlsIndex = TlsAlloc();
}
if (_GlideRoot.OSWin95)
_GlideRoot.tlsOffset = W95_TLS_INDEX_TO_OFFSET(_GlideRoot.tlsIndex);
else
_GlideRoot.tlsOffset = WNT_TLS_INDEX_TO_OFFSET(_GlideRoot.tlsIndex);
if ((_GlideRoot.OS == OS_WIN32_95) ||
(_GlideRoot.OS == OS_WIN32_98) ||
(_GlideRoot.OS == OS_WIN32_ME)) {
_GlideRoot.tlsOffset = W95_TLS_INDEX_TO_OFFSET(_GlideRoot.tlsIndex);
} else {
_GlideRoot.tlsOffset = WNT_TLS_INDEX_TO_OFFSET(_GlideRoot.tlsIndex);
}
} /* initThreadStorage */
void setThreadValue( FxU32 value ) {

View File

@@ -1026,6 +1026,7 @@ static __inline int min (int x, int y)
#define HWC_RAW_LFB_STRIDE SST_RAW_LFB_ADDR_STRIDE_8K
hwcInfo hInfo;
_p_info *CPUInfo = NULL;
#define MAX_ERROR_SIZE 1024
static char errorString[MAX_ERROR_SIZE];
@@ -1190,15 +1191,6 @@ static hwcBoardInfo *curBI = NULL;
#ifdef HWC_EXT_INIT
#if 0
#if !defined(HMONITOR_DECLARED) // AJB- Make def compatible w/ vc6 headers
typedef void *HMONITOR;
//DECLARE_HANDLE(HMONITOR);
#define HMONITOR_DECLARED
#endif
#endif
typedef BOOL (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM);
typedef WINUSERAPI BOOL WINAPI
EnumDisplayMonitors_func( HDC hdc,
@@ -1219,11 +1211,12 @@ static char *
getRegPathEx()
{
char *retVal = NULL;
OSVERSIONINFO ovi;
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
FxI32 OS = hwcGetOS();
if ((OS == OS_WIN32_NT4) ||
(OS == OS_WIN32_2K) ||
(OS == OS_WIN32_XP))
{
HKEY hKey;
DWORD type ;
static char strval[255];
@@ -1328,10 +1321,6 @@ monitorEnum( HMONITOR handle, HDC dc, LPRECT rect, LPARAM param )
drvName = "DISPLAY",
devName = NULL;
OSVERSIONINFO ovi;
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
/* If we're on a multi-mon capable system then we may have
* different display type devices so we have to get the device
* name explicitly for the CreateDC call.
@@ -1471,11 +1460,7 @@ hwcInit(FxU32 vID, FxU32 dID)
DevEnumRec
data[HWC_MAX_BOARDS*2];
int monitor;
_p_info CPUInfo;
OSVERSIONINFO ovi;
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
FxI32 OS = hwcGetOS();
GDBG_INFO(80, "%s\n", FN_NAME);
errorString[0] = '\0';
@@ -1642,25 +1627,16 @@ hwcInit(FxU32 vID, FxU32 dID)
data[num_monitor].dc = hdc;
strcpy(data[num_monitor].DeviceName, DispDev.DeviceName);
switch(ovi.dwPlatformId) {
case VER_PLATFORM_WIN32_NT:
{
// win2k/xp
if (OS == OS_WIN32_95) {
strcpy(data[num_monitor].RegPath, getRegPathEx());
} else if ( (OS == OS_WIN32_98) || (OS == OS_WIN32_ME) ) {
strcpy(data[num_monitor].RegPath, DispDev.DeviceKey);
} else {
char *pdest;
pdest = strstr(DispDev.DeviceKey, "\\Service");
strcpy(data[num_monitor].RegPath, "SYSTEM\\CurrentControlSet");
strcat(data[num_monitor].RegPath, pdest);
}
break;
case VER_PLATFORM_WIN32_WINDOWS:
{
if(ovi.dwMinorVersion < 10)
strcpy(data[num_monitor].RegPath, getRegPathEx()); // win95
else
strcpy(data[num_monitor].RegPath, DispDev.DeviceKey); // win98/me
}
break;
}
}
GDBG_INFO(80, "DeviceKey: %s\n", data[num_monitor].RegPath);
@@ -1772,16 +1748,6 @@ hwcInit(FxU32 vID, FxU32 dID)
}
}
}
/* Colourless - Get CPUInfo */
_cpuid (&CPUInfo);
{
/* No CPU Extensions Allowed */
for (monitor = 0; monitor < num_monitor; monitor++) {
const char *no_cpu_ext = GETENV("FX_GLIDE_NO_CPU_EXTENSIONS", data[monitor].RegPath);
if (no_cpu_ext && atoi(no_cpu_ext)) CPUInfo.feature = CPUInfo.os_support = 0;
}
}
hInfo.nBoards = 0;
for (monitor = 0; monitor < num_monitor; monitor++) {
@@ -1810,21 +1776,6 @@ hwcInit(FxU32 vID, FxU32 dID)
GDBG_INFO(80,"hInfo : [%d] DeviceName: %s\n", monitor, hInfo.boardInfo[monitor].DeviceName);
/* hInfo.boardInfo[monitor].extContextID = ctxRes.Ext.optData.allocContextRes.contextID; */
if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
hInfo.boardInfo[monitor].osNT = FXTRUE;
if ( ovi.dwMajorVersion >= 5 && ovi.dwMinorVersion >= 1) {
hInfo.boardInfo[monitor].osNT51 = FXTRUE;
GDBG_INFO(80, FN_NAME ": OS: NT5.1\n");
} else {
hInfo.boardInfo[monitor].osNT51 = FXFALSE;
GDBG_INFO(80, FN_NAME ": OS: NT\n");
}
} else {
hInfo.boardInfo[monitor].osNT = FXFALSE;
hInfo.boardInfo[monitor].osNT51 = FXFALSE;
GDBG_INFO(80, FN_NAME ": OS: 9X\n");
}
ctxReq.which = HWCEXT_GETDEVICECONFIG;
ctxReq.optData.deviceConfigReq.dc = hdc;
ctxReq.optData.deviceConfigReq.devNo = boardNum;
@@ -1870,19 +1821,14 @@ hwcInit(FxU32 vID, FxU32 dID)
ctxRes.optData.deviceConfigRes.isMaster;
hInfo.boardInfo[monitor].pciInfo.numChips =
ctxRes.optData.deviceConfigRes.numChips;
if /*(*/(hInfo.boardInfo[monitor].pciInfo.numChips > 4)/* ||
(hInfo.boardInfo[monitor].pciInfo.numChips < 0))*//* KoolSmoky */ {
if ((hInfo.boardInfo[monitor].pciInfo.numChips > 4) ||
(hInfo.boardInfo[monitor].pciInfo.numChips < 0))
hInfo.boardInfo[monitor].pciInfo.numChips = 0;
} //else {
/* KoolSmoky - Napalm framebuffer is unified, where the framebuffer
/* Napalm framebuffer is unified, where the framebuffer
** bound to each chip is effectively divided by SLI mode.
** (framebuffer of one chip) = (total framebuffer / SLI mode)
** 2 chip device can have 1-way-SLI or 2-way-SLI
** h3Mem is the amount of video ram dedicated for one chip.
hInfo.boardInfo[monitor].h3Mem =
(ctxRes.optData.deviceConfigRes.fbRam >> 20);
*/
//}
}
#endif /* FX_GLIDE_NAPALM */
@@ -1936,9 +1882,6 @@ hwcInit(FxU32 vID, FxU32 dID)
(FxU32) sizeof(resolutionSupported[0][0]) / sizeof(FxBool),
(void *) hInfo.boardInfo[monitor].hMon);
#endif
/* Colourless - CPUInfo */
hInfo.boardInfo[monitor].CPUInfo = CPUInfo;
}
}
#elif defined(HWC_GDX_INIT)
@@ -2153,6 +2096,7 @@ hwcInit(FxU32 vID, FxU32 dID)
}
#endif /* HWC_EXT_INIT */
if (hInfo.nBoards)
return &hInfo;
else
@@ -4503,6 +4447,7 @@ hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo *vidTiming,
#ifdef HWC_EXT_INIT
hwcExtRequest_t ctxReq;
hwcExtResult_t ctxRes;
FxI32 OS = hwcGetOS();
#endif
{
@@ -5045,7 +4990,9 @@ hwcInitVideo(hwcBoardInfo *bInfo, FxBool tiled, FxVideoTimingInfo *vidTiming,
GDBG_INFO(80, FN_NAME ": HWC_MINIVDD_HACK\n");
if (bInfo->osNT)
if ((OS == OS_WIN32_NT4) ||
(OS == OS_WIN32_2K) ||
(OS == OS_WIN32_XP))
{
FxU32 retVal = FXTRUE;
ctxReq.which = HWCEXT_SLI_AA_REQUEST ;
@@ -5703,6 +5650,11 @@ FxBool
hwcRestoreVideo(hwcBoardInfo *bInfo)
{
#define FN_NAME "hwcRestoreVideo"
#ifdef HWC_EXT_INIT
FxI32 OS = hwcGetOS();
#endif
#if 1
hwcIdleHardwareWithTimeout(bInfo);
@@ -5727,7 +5679,9 @@ hwcRestoreVideo(hwcBoardInfo *bInfo)
GDBG_INFO(80, FN_NAME ": HWC_MINIVDD_HACK\n");
if (bInfo->osNT)
if ((OS == OS_WIN32_NT4) ||
(OS == OS_WIN32_2K) ||
(OS == OS_WIN32_XP))
{
hwcExtRequest_t ctxReq ;
hwcExtResult_t ctxRes ;
@@ -6542,7 +6496,7 @@ static void hwcReadRegion565(hwcBoardInfo *bInfo, FxU32 src, FxU32 src_x, FxU32
stride_diff = strideInBytes - (src_width*2);
if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
if (CPUInfo && (CPUInfo->os_support & _CPU_FEATURE_MMX))
{
/* MMX Optimized Loop */
#ifdef __DJGPP__
@@ -6698,7 +6652,7 @@ static void hwcReadRegion1555(hwcBoardInfo *bInfo, FxU32 src, FxU32 src_x, FxU32
stride_diff = strideInBytes - (src_width*2);
if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
if (CPUInfo && (CPUInfo->os_support & _CPU_FEATURE_MMX))
{
/* MMX Optimized Loop */
#ifdef __DJGPP__
@@ -6854,7 +6808,7 @@ static void hwcReadRegion8888(hwcBoardInfo *bInfo, FxU32 src, FxU32 src_x, FxU32
stride_diff = strideInBytes - (src_width*4);
if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
if (CPUInfo && (CPUInfo->os_support & _CPU_FEATURE_MMX))
{
/* MMX Optimized Loop */
#ifdef __DJGPP__
@@ -7188,7 +7142,7 @@ static void hwcCopyBuffer8888Flipped(hwcBoardInfo *bInfo, FxU16 *source, int w,
FxU8 *endline = dst+w*4;
w*= 4;
if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
if (CPUInfo && (CPUInfo->os_support & _CPU_FEATURE_MMX))
{
/* MMX Optimized Loop */
#ifdef __DJGPP__
@@ -7323,7 +7277,7 @@ static void hwcCopyBuffer8888FlippedShifted(hwcBoardInfo *bInfo, FxU16 *source,
FxU8 *endline = dst+w*4;
w *= 4;
if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
if (CPUInfo && (CPUInfo->os_support & _CPU_FEATURE_MMX))
{
/* MMX Optimized Loop */
#ifdef __DJGPP__
@@ -7471,9 +7425,9 @@ static void hwcCopyBuffer8888FlippedDithered(hwcBoardInfo *bInfo, FxU16 *source,
val_max = (0xFF << aaShift);
dither_mask = ~((~0) << aaShift);
if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
if (CPUInfo && (CPUInfo->os_support & _CPU_FEATURE_MMX))
{
FxU32 sse_mmxplus = bInfo->CPUInfo.os_support & (_CPU_FEATURE_MMXPLUS|_CPU_FEATURE_SSE);
FxU32 sse_mmxplus = CPUInfo->os_support & (_CPU_FEATURE_MMXPLUS|_CPU_FEATURE_SSE);
/* MMX Optimized Loop */
#ifdef __DJGPP__
@@ -8074,7 +8028,7 @@ static void hwcCopyBuffer565Shifted(hwcBoardInfo *bInfo, FxU16 *src, int w, int
rshift = 8 - aaShift;
if (bInfo->CPUInfo.os_support & _CPU_FEATURE_MMX)
if (CPUInfo && (CPUInfo->os_support & _CPU_FEATURE_MMX))
{
/* MMX Optimized Loop */
#ifdef __DJGPP__
@@ -8989,11 +8943,12 @@ static char *
getRegPath()
{
char *retVal = NULL;
OSVERSIONINFO ovi;
FxI32 OS = hwcGetOS();
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
if ((OS == OS_WIN32_NT4) ||
(OS == OS_WIN32_2K) ||
(OS == OS_WIN32_XP))
{
HKEY hKey;
DWORD type ;
static char strval[255];
@@ -9324,6 +9279,7 @@ hwcShareContextData(hwcBoardInfo *bInfo, FxU32 **data)
#if HWC_EXT_INIT
hwcExtRequest_t ctxReq;
hwcExtResult_t ctxRes;
FxI32 OS = hwcGetOS();
GDBG_INFO(80, FN_NAME "\n");
@@ -9331,7 +9287,10 @@ hwcShareContextData(hwcBoardInfo *bInfo, FxU32 **data)
if( HWCEXT_PROTOCOL( bInfo->boardNum ) )
{
if (bInfo->osNT) {
if ((OS == OS_WIN32_NT4) ||
(OS == OS_WIN32_2K) ||
(OS == OS_WIN32_XP))
{
hwcExtRequest_t
ctxReq;
hwcExtResult_t
@@ -9394,7 +9353,9 @@ hwcShareContextData(hwcBoardInfo *bInfo, FxU32 **data)
* check the retVal and the pointer. This also screws with ALT-TAB.
*/
GDBG_INFO(80, FN_NAME ": ExtEscape retVal=%d, dwordOffset=%d, contextDWORD=%d\n", retVal, ctxRes.optData.contextDwordNTRes.dwordOffset, ctxRes.optData.shareContextDWORDRes.contextDWORD);
if( (retVal <= 0) || (ctxRes.optData.contextDwordNTRes.dwordOffset == 0) || (bInfo->osNT51)) { /* make exceptions for winxp escapecalls */
if( (retVal <= 0) ||
(ctxRes.optData.contextDwordNTRes.dwordOffset == 0) ||
(OS == OS_WIN32_XP)) { /* make exceptions for winxp escapecalls */
#if (WINXP_ALT_TAB_FIX || WINXP_FASTER_ALT_TAB_FIX)
cLostPointer =
#endif
@@ -9494,9 +9455,13 @@ hwcUnmapMemory()
FxU32 i;
hwcExtRequest_t ctxReq;
hwcExtResult_t ctxRes;
FxI32 OS = hwcGetOS();
if ( curBI ) {
if ( curBI->osNT ) {
if ((OS == OS_WIN32_NT4) ||
(OS == OS_WIN32_2K) ||
(OS == OS_WIN32_XP))
{
hwcExtRequest_t
ctxReq;
hwcExtResult_t
@@ -9508,7 +9473,7 @@ hwcUnmapMemory()
*/
ctxReq.optData.unmapMemoryReq.procHandle = (ULONG)GetCurrentProcessId();
ExtEscape((HDC)curBI->hdc, HWCEXT_ESCAPE(curBI->boardNum),
ExtEscape((HDC)curBI->hdc, HWCEXT_ESCAPE(curBI->boardNum),
sizeof(ctxReq), (LPSTR) &ctxReq,
sizeof(ctxRes), (LPSTR) &ctxRes);
curBI->isMapped = FXFALSE;
@@ -10016,3 +9981,72 @@ static FxI32 valarray[SST_SIPROCESS_OSC_CNTR + 1]; // is this how you do an
HWC_IO_STORE(bInfo->regInfo, pllCtrl1, pllCtrl1_save);
}
void
hwcSetCPUInfo(_p_info *CPUInfo_)
{
CPUInfo = CPUInfo_;
} /* hwcSetCPUInfo */
#ifdef __WIN32__
FxI32
hwcGetOS()
{
static FxI32 OS = -1;
OSVERSIONINFO ovi;
if ( OS != -1 ) return OS;
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
if (ovi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
if(ovi.dwMajorVersion == 4) {
if (ovi.dwMinorVersion >= 90) {
OS = OS_WIN32_ME;
} else if (ovi.dwMinorVersion >= 10) {
OS = OS_WIN32_98;
} else {
OS = OS_WIN32_95;
}
}
} else if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
if(ovi.dwMajorVersion == 4) {
OS = OS_WIN32_NT4;
} else if(ovi.dwMajorVersion >= 5) {
if (ovi.dwMinorVersion >= 1) {
OS = OS_WIN32_XP;
} else {
OS = OS_WIN32_2K;
}
}
}
switch(OS) {
case OS_WIN32_95:
GDBG_INFO(0, "hwcGetOS: OS = win95\n");
break;
case OS_WIN32_98:
GDBG_INFO(0, "hwcGetOS: OS = win98\n");
break;
case OS_WIN32_ME:
GDBG_INFO(0, "hwcGetOS: OS = winme\n");
break;
case OS_WIN32_NT4:
GDBG_INFO(0, "hwcGetOS: OS = winnt4.0\n");
break;
case OS_WIN32_2K:
GDBG_INFO(0, "hwcGetOS: OS = win2k\n");
break;
case OS_WIN32_XP:
GDBG_INFO(0, "hwcGetOS: OS = winxp\n");
break;
default:
GDBG_INFO(0, "hwcGetOS: OS = unknown\n");
break;
}
return OS;
#undef FN_NAME
} /* hwcGetOS */
#endif /* __WIN32__ */

View File

@@ -501,8 +501,6 @@ typedef struct hwcBoardInfo_s {
agpInfo;
FxU32
lostContextDWORD;
FxBool
osNT;
FxBool
isMapped;
FxU32
@@ -512,10 +510,8 @@ typedef struct hwcBoardInfo_s {
FxI32 hwcProtocol;
FxU32 devNode ; /* AJB- DevNode from display driver for minivdd ioctls */
FxI16/*FxI32*/ hwcEscape ; /* AJB- sucky: H5 TOT uses a diff't escape code than H3 */ /* KoolSmoky - new escape code for winxp *//* revert back to previous for now */
FxBool osNT51; /* KoolSmoky- WinXP flag */
char RegPath[255]; /* KoolSmoky - Device registry path */
char DeviceName[32]; /* KoolSmoky - Device Name */
_p_info CPUInfo; /* Colourless - CPU info */
} hwcBoardInfo;
@@ -625,6 +621,15 @@ hwcCheckMemSize(hwcBoardInfo *bInfo, FxU32 xres, FxU32 yres, FxU32 nColBuffers,
#ifdef __WIN32__
#define OS_WIN32_95 0
#define OS_WIN32_98 1
#define OS_WIN32_ME 2
#define OS_WIN32_NT4 3
#define OS_WIN32_2K 4
#define OS_WIN32_XP 5
FxI32
hwcGetOS();
FxU32
hwcAllocWinContext(hwcBoardInfo* bInfo);
@@ -769,3 +774,6 @@ extern void hwcAAReadRegion(hwcBoardInfo *bInfo, FxU32 colBufNum,
void hwcCalcSipValue(hwcBoardInfo *bInfo, FxU32 chipNum, FxU32 *nandChain, FxU32 *norChain);
#endif /* MINIHWC_H not defined */
void
hwcSetCPUInfo(_p_info *CPUInfo_);

View File

@@ -56,6 +56,7 @@
#include <sst1vid.h>
#include "qmodes.h"
#include "setmode.h"
#include "minihwc.h"
#define IS_32
#define Not_VxD
#include <minivdd.h>
@@ -238,23 +239,17 @@ static char *
getModesRegPath()
{
char *retVal = NULL;
OSVERSIONINFO ovi;
FxU32 OS = hwcGetOS();
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
if ((OS == OS_WIN32_NT4) ||
(OS == OS_WIN32_2K) ||
(OS == OS_WIN32_XP))
{
HKEY hKey;
DWORD type ;
static char strval[255];
DWORD szData = sizeof(strval) ;
/* GDBG_INFO(80, "OS == WNT\n"); */
if ( ovi.dwMajorVersion >= 5 && ovi.dwMinorVersion >= 1) {
GDBG_INFO(80, "REGPATH: OS == NT5.1\n");
} else {
GDBG_INFO(80, "REGPATH: OS == NT4\n");
}
/* Go fishing for the registry path on Win2K */
if (RegOpenKey(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\VIDEO", &hKey) == ERROR_SUCCESS)
{
@@ -327,7 +322,7 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int h3pixelSize, int refresh, void
//HRESULT ddRVal;
//DWORD style;
#ifdef IS_ALT_TAB
OSVERSIONINFO ovi;
FxU32 OS = hwcGetOS();
/* reset fullscreen flag */
is_fullscreen = FXFALSE;
@@ -445,12 +440,6 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int h3pixelSize, int refresh, void
// checkSpecialList();
#ifdef IS_ALT_TAB
/* get os version */
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
#endif
if (lpDD == NULL) {
/* only create directdraw object once */
@@ -542,8 +531,8 @@ setVideoMode( HWND hwnd, int xRes, int yRes, int h3pixelSize, int refresh, void
devMode.dmBitsPerPel = bpp;
devMode.dmDisplayFrequency = refresh;
if(((ovi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (ovi.dwMinorVersion < 10)) ||
((ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) && (ovi.dwMajorVersion < 5)))
if ((OS == OS_WIN32_95) ||
(OS == OS_WIN32_NT4))
{
// win95,nt4
if(ChangeDisplaySettings(&devMode, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL)
@@ -800,7 +789,7 @@ resetVideo( void )
#define FN_NAME "resetVideo"
#ifdef IS_ALT_TAB
OSVERSIONINFO ovi;
FxU32 OS = hwcGetOS();
#endif
GDBG_INFO(80, "%s: called!\n", FN_NAME);
@@ -840,13 +829,9 @@ resetVideo( void )
#endif
#ifdef IS_ALT_TAB
/* get os version */
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
//ChangeDisplaySettings(NULL, 0);
if(((ovi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (ovi.dwMinorVersion < 10)) ||
((ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) && (ovi.dwMajorVersion < 5)))
if ((OS == OS_WIN32_95) ||
(OS == OS_WIN32_NT4))
{
// win95,nt4
/* KoolSmoky - ripped from quake3 */
@@ -952,14 +937,10 @@ checkResolutions( FxBool *supportedByResolution, FxU32 stride, void *hmon, int h
#define FN_NAME "checkResolution"
DEVMODE chkDevMode;
DWORD chkRes, chkRefresh;
OSVERSIONINFO ovi;
FxU32 OS = hwcGetOS();
GDBG_INFO(80, "%s: called!\n", FN_NAME);
/* get os version */
ovi.dwOSVersionInfoSize = sizeof ( ovi );
GetVersionEx ( &ovi );
chkDevMode.dmSize = sizeof(DEVMODE);
chkDevMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
@@ -980,8 +961,8 @@ checkResolutions( FxBool *supportedByResolution, FxU32 stride, void *hmon, int h
chkDevMode.dmDisplayFrequency = refresh[chkRefresh];
//ChangeDisplaySettings(NULL, 0);
if(((ovi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (ovi.dwMinorVersion < 10)) ||
((ovi.dwPlatformId == VER_PLATFORM_WIN32_NT) && (ovi.dwMajorVersion < 5)))
if ((OS == OS_WIN32_95) ||
(OS == OS_WIN32_NT4))
{
// win95,nt4
if(ChangeDisplaySettings(&chkDevMode, CDS_TEST) == DISP_CHANGE_SUCCESSFUL)