diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/framework/src/windows | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'APEX_1.4/framework/src/windows')
| -rw-r--r-- | APEX_1.4/framework/src/windows/AgMMFile.cpp | 80 | ||||
| -rw-r--r-- | APEX_1.4/framework/src/windows/AgMMFile.h | 39 | ||||
| -rw-r--r-- | APEX_1.4/framework/src/windows/PhysXIndicator.cpp | 166 | ||||
| -rw-r--r-- | APEX_1.4/framework/src/windows/PhysXIndicator.h | 53 | ||||
| -rw-r--r-- | APEX_1.4/framework/src/windows/nvPhysXtoDrv.h | 77 |
5 files changed, 415 insertions, 0 deletions
diff --git a/APEX_1.4/framework/src/windows/AgMMFile.cpp b/APEX_1.4/framework/src/windows/AgMMFile.cpp new file mode 100644 index 00000000..2b637772 --- /dev/null +++ b/APEX_1.4/framework/src/windows/AgMMFile.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#include "AgMMFile.h" + +using namespace nvidia; + +AgMMFile::AgMMFile(): +mAddr(0), mSize(0), mFileH(0) +{} + +AgMMFile::AgMMFile(char *name, unsigned int size, bool &alreadyExists) +{ + this->create(name, size, alreadyExists); +} + +void AgMMFile::create(char *name, unsigned int size, bool &alreadyExists) +{ + alreadyExists = false; + mSize = size; + + mFileH = CreateFileMapping(INVALID_HANDLE_VALUE, // use paging file + NULL, // default security + PAGE_READWRITE, // read/write access + 0, // buffer size (upper 32bits) + mSize, // buffer size (lower 32bits) + name); // name of mapping object + if (mFileH == NULL || mFileH == INVALID_HANDLE_VALUE) + { + mSize=0; + mAddr=0; + return; + } + + if (ERROR_ALREADY_EXISTS == GetLastError()) + { + alreadyExists = true; + } + + mAddr = MapViewOfFile(mFileH, // handle to map object + FILE_MAP_READ|FILE_MAP_WRITE, // read/write permission + 0, + 0, + mSize); + + if (mFileH == NULL || mAddr == NULL) + { + mSize=0; + mAddr=0; + return; + } +} + +void AgMMFile::destroy() +{ + if (!mAddr || !mFileH || !mSize) + return; + + UnmapViewOfFile(mAddr); + CloseHandle(mFileH); + + mAddr = 0; + mFileH = 0; + mSize = 0; +} + +AgMMFile::~AgMMFile() +{ + destroy(); +} diff --git a/APEX_1.4/framework/src/windows/AgMMFile.h b/APEX_1.4/framework/src/windows/AgMMFile.h new file mode 100644 index 00000000..ca2ddd73 --- /dev/null +++ b/APEX_1.4/framework/src/windows/AgMMFile.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef AG_MMFILE_H +#define AG_MMFILE_H + +#include "windows/PsWindowsInclude.h" + +namespace nvidia +{ + class AgMMFile + { + public: + AgMMFile(); + AgMMFile(char *name, unsigned int size, bool &alreadyExists); + void create(char *name, unsigned int size, bool &alreadyExists); + unsigned int getSize() {return mSize;}; + void * getAddr() {return mAddr;}; + void destroy(); + ~AgMMFile(); + + private: + void *mAddr; + unsigned int mSize; + HANDLE mFileH; + }; +} + +#endif // __AG_MM_FILE__ diff --git a/APEX_1.4/framework/src/windows/PhysXIndicator.cpp b/APEX_1.4/framework/src/windows/PhysXIndicator.cpp new file mode 100644 index 00000000..0ea99185 --- /dev/null +++ b/APEX_1.4/framework/src/windows/PhysXIndicator.cpp @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#include "PhysXIndicator.h" +#include "AgMMFile.h" + +#include <windows.h> +#if _MSC_VER >= 1800 +#include <VersionHelpers.h> // for IsWindowsVistaOrGreater +#endif +#include <stdio.h> + +using namespace nvidia; +using namespace physx; + +// Scope-based to indicate to NV driver that CPU PhysX is happening +PhysXCpuIndicator::PhysXCpuIndicator() : + mPhysXDataPtr(NULL) +{ + bool alreadyExists = false; + + mPhysXDataPtr = (physx::NvPhysXToDrv_Data_V1*)PhysXCpuIndicator::createIndicatorBlock(mSharedMemConfig, alreadyExists); + + if (!mPhysXDataPtr) + { + return; + } + + if (!alreadyExists) + { + mPhysXDataPtr->bGpuPhysicsPresent = 0; + mPhysXDataPtr->bCpuPhysicsPresent = 1; + } + else + { + mPhysXDataPtr->bCpuPhysicsPresent++; + } + + // init header last to prevent race conditions + // this must be done because the driver may have already created the shared memory block, + // thus alreadyExists may be true, even if PhysX hasn't been initialized + NvPhysXToDrv_Header_Init(mPhysXDataPtr->header); +} + +PhysXCpuIndicator::~PhysXCpuIndicator() +{ + if (!mPhysXDataPtr) + { + return; + } + + mPhysXDataPtr->bCpuPhysicsPresent--; + + mPhysXDataPtr = NULL; + mSharedMemConfig.destroy(); +} + +void* PhysXCpuIndicator::createIndicatorBlock(AgMMFile &mmfile, bool &alreadyExists) +{ + char configName[128]; + + // Get the windows version (we can only create Global\\ namespace objects in XP) +#if _MSC_VER >= 1800 + // Windows 8.1 SDK, which comes with VS2013, deprecated the GetVersionEx function + // Windows 8.1 SDK added the IsWindowsVistaOrGreater helper function which we use instead + BOOL bIsVistaOrGreater = IsWindowsVistaOrGreater(); +#else + OSVERSIONINFOEX windowsVersionInfo; + + /** + Operating system Version number + ---------------- -------------- + Windows 7 6.1 + Windows Server 2008 R2 6.1 + Windows Server 2008 6.0 + Windows Vista 6.0 + Windows Server 2003 R2 5.2 + Windows Server 2003 5.2 + Windows XP 5.1 + Windows 2000 5.0 + **/ + windowsVersionInfo.dwOSVersionInfoSize = sizeof(windowsVersionInfo); + GetVersionEx((LPOSVERSIONINFO)&windowsVersionInfo); + + bool bIsVistaOrGreater = (windowsVersionInfo.dwMajorVersion >= 6); +#endif + + if (bIsVistaOrGreater) + { + NvPhysXToDrv_Build_SectionName((uint32_t)GetCurrentProcessId(), configName); + } + else + { + NvPhysXToDrv_Build_SectionNameXP((uint32_t)GetCurrentProcessId(), configName); + } + + mmfile.create(configName, sizeof(physx::NvPhysXToDrv_Data_V1), alreadyExists); + + return mmfile.getAddr(); +} + +//----------------------------------------------------------------------------------------------------------- + +PhysXGpuIndicator::PhysXGpuIndicator() : + mPhysXDataPtr(NULL), + mAlreadyExists(false), + mGpuTrigger(false) +{ + mPhysXDataPtr = (physx::NvPhysXToDrv_Data_V1*)PhysXCpuIndicator::createIndicatorBlock(mSharedMemConfig, mAlreadyExists); + + // init header last to prevent race conditions + // this must be done because the driver may have already created the shared memory block, + // thus alreadyExists may be true, even if PhysX hasn't been initialized + NvPhysXToDrv_Header_Init(mPhysXDataPtr->header); +} + +PhysXGpuIndicator::~PhysXGpuIndicator() +{ + gpuOff(); + + mPhysXDataPtr = NULL; + mSharedMemConfig.destroy(); +} + +// Explicit set functions to indicate to NV driver that GPU PhysX is happening +void PhysXGpuIndicator::gpuOn() +{ + if (!mPhysXDataPtr || mGpuTrigger) + { + return; + } + + if (!mAlreadyExists) + { + mPhysXDataPtr->bGpuPhysicsPresent = 1; + mPhysXDataPtr->bCpuPhysicsPresent = 0; + } + else + { + mPhysXDataPtr->bGpuPhysicsPresent++; + } + + mGpuTrigger = true; +} + +void PhysXGpuIndicator::gpuOff() +{ + if (!mPhysXDataPtr || !mGpuTrigger) + { + return; + } + + mPhysXDataPtr->bGpuPhysicsPresent--; + + mGpuTrigger = false; +} diff --git a/APEX_1.4/framework/src/windows/PhysXIndicator.h b/APEX_1.4/framework/src/windows/PhysXIndicator.h new file mode 100644 index 00000000..155dd4a8 --- /dev/null +++ b/APEX_1.4/framework/src/windows/PhysXIndicator.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PHYS_XINDICATOR_H +#define PHYS_XINDICATOR_H + +#include "AgMMFile.h" +#include "nvPhysXtoDrv.h" + +namespace nvidia +{ + class PhysXCpuIndicator + { + public: + PhysXCpuIndicator(); + ~PhysXCpuIndicator(); + + static void* createIndicatorBlock(AgMMFile &mmfile, bool &alreadyExists); + + private: + AgMMFile mSharedMemConfig; + physx::NvPhysXToDrv_Data_V1* mPhysXDataPtr; + }; + + class PhysXGpuIndicator + { + public: + PhysXGpuIndicator(); + ~PhysXGpuIndicator(); + + void gpuOn(); + void gpuOff(); + + private: + AgMMFile mSharedMemConfig; + physx::NvPhysXToDrv_Data_V1* mPhysXDataPtr; + bool mAlreadyExists; + bool mGpuTrigger; + + }; +} + +#endif // __PHYSXINDICATOR_H__ diff --git a/APEX_1.4/framework/src/windows/nvPhysXtoDrv.h b/APEX_1.4/framework/src/windows/nvPhysXtoDrv.h new file mode 100644 index 00000000..047763a1 --- /dev/null +++ b/APEX_1.4/framework/src/windows/nvPhysXtoDrv.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef NV_PHYS_XTO_DRV_H +#define NV_PHYS_XTO_DRV_H + +// The puprose of this interface is to provide graphics drivers with information +// about PhysX state to draw PhysX visual indicator + +// We share information between modules using a memory section object. PhysX creates +// such object, graphics drivers try to open it. The name of the object has +// fixed part (NvPhysXToDrv_SectionName) followed by the process id. This allows +// each process to have its own communication channel. + +namespace physx +{ + +#define NvPhysXToDrv_SectionName "PH71828182845_" + +// Vista apps cannot create stuff in Global\\ namespace when NOT elevated, so use local scope +#define NvPhysXToDrv_Build_SectionName(PID, buf) sprintf(buf, NvPhysXToDrv_SectionName "%x", PID) +#define NvPhysXToDrv_Build_SectionNameXP(PID, buf) sprintf(buf, "Global\\" NvPhysXToDrv_SectionName "%x", PID) + +typedef struct NvPhysXToDrv_Header_ +{ + int signature; // header interface signature + int version; // version of the interface + int size; // size of the structure + int reserved; // reserved, must be zero +} NvPhysXToDrv_Header; + +// this structure describes layout of data in the shared memory section +typedef struct NvPhysXToDrv_Data_V1_ +{ + NvPhysXToDrv_Header header; // keep this member first in all versions of the interface. + + int bCpuPhysicsPresent; // nonzero if cpu physics is initialized + int bGpuPhysicsPresent; // nonzero if gpu physics is initialized + +} NvPhysXToDrv_Data_V1; + +// some random magic number as our interface signature +#define NvPhysXToDrv_Header_Signature 0xA7AB + +// use the macro to setup the header to the latest version of the interface +// update the macro when a new verson of the interface is added +#define NvPhysXToDrv_Header_Init(header) \ +{ \ + header.signature = NvPhysXToDrv_Header_Signature; \ + header.version = 1; \ + header.size = sizeof(NvPhysXToDrv_Data_V1); \ + header.reserved = 0; \ +} + +// validate the header against all known interface versions +// add validation checks when new interfaces are added +#define NvPhysXToDrv_Header_Validate(header, curVersion) \ + ( \ + (header.signature == NvPhysXToDrv_Header_Signature) && \ + (header.version == curVersion) && \ + (curVersion == 1) && \ + (header.size == sizeof(NvPhysXToDrv_Data_V1)) \ + ) + +} + +#endif // __NVPHYSXTODRV_H__ |