aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/framework/src/windows
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/framework/src/windows
downloadphysx-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.cpp80
-rw-r--r--APEX_1.4/framework/src/windows/AgMMFile.h39
-rw-r--r--APEX_1.4/framework/src/windows/PhysXIndicator.cpp166
-rw-r--r--APEX_1.4/framework/src/windows/PhysXIndicator.h53
-rw-r--r--APEX_1.4/framework/src/windows/nvPhysXtoDrv.h77
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__