tge/engine/platformMacCarb/macCarbCPUInfo.cc
2025-02-17 23:17:30 -06:00

158 lines
6.7 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "PlatformMacCarb/platformMacCarb.h"
#include "console/console.h"
#include "Core/stringTable.h"
#include <math.h>
#include <Gestalt.h>
/* at some future time...
#if (UNIVERSAL_INTERFACES_VERSION<0x0341) || (UNIVERSAL_INTERFACES_VERSION==0x0341 && UNIVERSAL_INTERFACES_SEED_VERSION<2) || (UNIVERSAL_INTERFACES_VERSION==0x0400) // since OSX base headers are earlier than 3.4.1
// missing the new cpu type until carbonlib 1.5...
#define gestaltCPUG47450 0x0110
#endif
*/
// possibly useful gestalts I haven't used yet:
// gestaltDisplayMgrVers = FOUR_CHAR_CODE('dplv') /* Display Manager version */
// gestaltDisplayMgrAttr = FOUR_CHAR_CODE('dply'), /* Display Manager attributes */
// gestaltOSAttr = FOUR_CHAR_CODE('os '), /* o/s attributes */
// gestaltSysZoneGrowable = 0, /* system heap is growable */
// gestaltLaunchCanReturn = 1, /* can return from launch */
// gestaltLaunchFullFileSpec = 2, /* can launch from full file spec */
// gestaltLaunchControl = 3, /* launch control support available */
// gestaltTempMemSupport = 4, /* temp memory support */
// gestaltRealTempMemory = 5, /* temp memory handles are real */
// gestaltTempMemTracked = 6, /* temporary memory handles are tracked */
// gestaltIPCSupport = 7, /* IPC support is present */
// gestaltSysDebuggerSupport = 8 /* system debugger support is present */
// gestaltPowerMgrAttr = FOUR_CHAR_CODE('powr'), /* power manager attributes */
// gestaltPMgrExists = 0,
// gestaltPMgrCPUIdle = 1,
// gestaltPMgrSCC = 2,
// gestaltPMgrSound = 3,
// gestaltPMgrDispatchExists = 4,
// gestaltPMgrSupportsAVPowerStateAtSleepWake = 5
// should add multiprocessing check
// should add threadmgr check -- and we'll need optional code to do something diff.
Platform::SystemInfo_struct Platform::SystemInfo;
#define BASE_MHZ_SPEED 200
void Processor::init()
{
OSErr err;
long raw, mhzSpeed = BASE_MHZ_SPEED;
Con::printf("System & Processor Information:");
err = Gestalt(gestaltSystemVersion, &raw);
Con::printf(" MacOS version: %x.%x.%x", (raw>>8), (raw&0xFF)>>4, (raw&0x0F));
err = Gestalt(gestaltCarbonVersion, &raw);
if (err) raw = 0;
if (raw==0)
Con::printf(" No CarbonLib support.");
else
Con::printf(" CarbonLib version: %x.%x.%x", (raw>>8), (raw&0xFF)>>4, (raw&0x0F));
err = Gestalt(gestaltPhysicalRAMSize, &raw);
raw /= (1024*1024); // MB
Con::printf(" Physical RAM: %dMB", raw);
err = Gestalt(gestaltLogicalRAMSize, &raw);
raw /= (1024*1024); // MB
Con::printf(" Logical RAM: %dMB", raw);
// this is known to have issues with some Processor Upgrade cards
err = Gestalt(gestaltProcClkSpeed, &raw);
if (err==noErr && raw)
{
mhzSpeed = (float)raw / 1000000.0f;
if (mhzSpeed < BASE_MHZ_SPEED)
{ // something drastically wrong.
mhzSpeed = BASE_MHZ_SPEED;
}
}
Platform::SystemInfo.processor.mhz = mhzSpeed;
Platform::SystemInfo.processor.type = CPU_PowerPC_Unknown;
err = Gestalt(gestaltNativeCPUtype, &raw);
switch(raw)
{
case gestaltCPU601:
Platform::SystemInfo.processor.type = CPU_PowerPC_601;
Platform::SystemInfo.processor.name = StringTable->insert("PowerPC 601");
break;
case gestaltCPU603e:
case gestaltCPU603ev:
Platform::SystemInfo.processor.type = CPU_PowerPC_603e;
Platform::SystemInfo.processor.name = StringTable->insert("PowerPC 603e");
break;
case gestaltCPU603:
Platform::SystemInfo.processor.type = CPU_PowerPC_603;
Platform::SystemInfo.processor.name = StringTable->insert("PowerPC 603");
break;
case gestaltCPU604e:
case gestaltCPU604ev:
Platform::SystemInfo.processor.type = CPU_PowerPC_604e;
Platform::SystemInfo.processor.name = StringTable->insert("PowerPC 604e");
break;
case gestaltCPU604:
Platform::SystemInfo.processor.type = CPU_PowerPC_604;
Platform::SystemInfo.processor.name = StringTable->insert("PowerPC 604");
break;
case gestaltCPU750: //G3
Platform::SystemInfo.processor.type = CPU_PowerPC_G3;
Platform::SystemInfo.processor.name = StringTable->insert("PowerPC G3");
break;
case gestaltCPUG4:
Platform::SystemInfo.processor.type = CPU_PowerPC_G4;
Platform::SystemInfo.processor.name = StringTable->insert("PowerPC G4");
break;
/* at some point -- I these are either speedbump or the TiBooks or the new TiMacs
// gestaltCPUVger = 0x0110, // Vger , Altivec
// gestaltCPUApollo = 0x0111 // Apollo , Altivec
case gestaltCPUVger:
case gestaltCPUVger:
Platform::SystemInfo.processor.type = CPU_PowerPC_G4_FUTURE;
Platform::SystemInfo.processor.name = StringTable->insert("PowerPC G4 FUTURE");
break;
*/
default:
if (raw>gestaltCPUG4)
{ // for now, ID it as a G4u
Platform::SystemInfo.processor.type = CPU_PowerPC_G4u;
Platform::SystemInfo.processor.name = StringTable->insert("Unknown/PowerPC G4u ++");
}
else
{
Platform::SystemInfo.processor.type = CPU_PowerPC_Unknown;
Platform::SystemInfo.processor.name = StringTable->insert("Unknown PowerPC");
}
break;
}
Platform::SystemInfo.processor.properties = CPU_PROP_PPCMIN;
err = Gestalt(gestaltPowerPCProcessorFeatures, &raw);
if ((1 << gestaltPowerPCHasVectorInstructions) & (raw))
Platform::SystemInfo.processor.properties |= CPU_PROP_ALTIVEC; // OR it in as they are flags...
Con::printf(" %s, %d Mhz", Platform::SystemInfo.processor.name, Platform::SystemInfo.processor.mhz);
if (Platform::SystemInfo.processor.properties & CPU_PROP_PPCMIN)
Con::printf(" FPU detected");
if (Platform::SystemInfo.processor.properties & CPU_PROP_ALTIVEC)
Con::printf(" AltiVec detected");
Con::printf(" ");
}