Browse Source

Add more memory information.

aignacio_sf 18 years ago
parent
commit
2cf830835e

+ 114 - 0
panda/src/display/displayInformation.cxx

@@ -78,11 +78,23 @@ DisplayInformation() {
   _shader_model = shader_model;
   _video_memory = video_memory;
   _texture_memory = texture_memory;
+
   _physical_memory = physical_memory;
   _available_physical_memory = available_physical_memory;
+  _page_file_size = 0;
+  _available_page_file_size = 0;
+  _process_virtual_memory = 0;
+  _available_process_virtual_memory = 0;
+  _memory_load = 0;
+  _process_memory = 0;
+  _peak_process_memory = 0;
+  _page_file_usage = 0;
+  _peak_page_file_usage = 0;
 
   _vendor_id = 0;
   _device_id = 0;
+  
+  _get_memory_information_function = 0;
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -249,6 +261,18 @@ get_texture_memory() {
   return _texture_memory;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::update_memory_information
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+void DisplayInformation::
+update_memory_information() {
+  if (_get_memory_information_function) {
+    _get_memory_information_function (this);
+  }
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: DisplayInformation::get_physical_memory
 //       Access: Published
@@ -269,6 +293,96 @@ get_available_physical_memory() {
   return _available_physical_memory;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::get_page_file_size
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+PN_uint64 DisplayInformation::
+get_page_file_size() {
+  return _page_file_size;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::get_available_page_file_size
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+PN_uint64 DisplayInformation::
+get_available_page_file_size() {
+  return _available_page_file_size;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::_process_virtual_memory
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+PN_uint64 DisplayInformation::
+get_process_virtual_memory() {
+  return _process_virtual_memory;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::get_available_process_virtual_memory
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+PN_uint64 DisplayInformation::
+get_available_process_virtual_memory() {
+  return _available_process_virtual_memory;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::get_memory_load
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+int DisplayInformation::
+get_memory_load() {
+  return _memory_load;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::get_process_memory
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+PN_uint64 DisplayInformation::
+get_process_memory() {
+  return _process_memory;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::get_peak_process_memory
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+PN_uint64 DisplayInformation::
+get_peak_process_memory() {
+  return _peak_process_memory;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::get_page_file_usage
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+PN_uint64 DisplayInformation::
+get_page_file_usage() {
+  return _page_file_usage;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: DisplayInformation::get_peak_page_file_usage
+//       Access: Published
+//  Description: 
+////////////////////////////////////////////////////////////////////
+PN_uint64 DisplayInformation::
+get_peak_page_file_usage() {
+  return _peak_page_file_usage;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: DisplayInformation::get_vendor_id
 //       Access: Published

+ 26 - 1
panda/src/display/displayInformation.h

@@ -69,12 +69,22 @@ PUBLISHED:
   int get_video_memory();
   int get_texture_memory();
 
+  void update_memory_information();
   PN_uint64 get_physical_memory();
   PN_uint64 get_available_physical_memory();
+  PN_uint64 get_page_file_size();
+  PN_uint64 get_available_page_file_size();
+  PN_uint64 get_process_virtual_memory();
+  PN_uint64 get_available_process_virtual_memory();
+  int get_memory_load();
+  PN_uint64 get_process_memory();
+  PN_uint64 get_peak_process_memory();
+  PN_uint64 get_page_file_usage();
+  PN_uint64 get_peak_page_file_usage();
 
   int get_vendor_id();
   int get_device_id();
-
+  
 public:
   DetectionState _state;
   int _get_adapter_display_mode_state;
@@ -87,10 +97,25 @@ public:
   int _shader_model;
   int _video_memory;
   int _texture_memory;
+
   PN_uint64 _physical_memory;
   PN_uint64 _available_physical_memory;
+  PN_uint64 _page_file_size;
+  PN_uint64 _available_page_file_size;
+  PN_uint64 _process_virtual_memory;
+  PN_uint64 _available_process_virtual_memory;
+  
+  PN_uint64 _process_memory;
+  PN_uint64 _peak_process_memory;
+  PN_uint64 _page_file_usage;
+  PN_uint64 _peak_page_file_usage;
+  
+  int _memory_load;
+
   int _vendor_id;
   int _device_id;
+  
+  void (*_get_memory_information_function) (DisplayInformation *display_information);
 };
 
 #endif

+ 79 - 0
panda/src/windisplay/winGraphicsPipe.cxx

@@ -21,8 +21,84 @@
 #include "displaySearchParameters.h"
 #include "dtool_config.h"
 
+#include "psapi.h"
+
 TypeHandle WinGraphicsPipe::_type_handle;
 
+typedef BOOL (WINAPI *GetProcessMemoryInfoType) (HANDLE Process, PROCESS_MEMORY_COUNTERS *ppsmemCounters, DWORD cb);
+typedef BOOL (WINAPI *GlobalMemoryStatusExType) (LPMEMORYSTATUSEX lpBuffer);
+
+static int initialize = false;
+static HMODULE psapi_dll = 0;
+static HMODULE kernel32_dll = 0;
+static GetProcessMemoryInfoType GetProcessMemoryInfoFunction = 0;
+static GlobalMemoryStatusExType GlobalMemoryStatusExFunction = 0;
+
+void get_memory_information (DisplayInformation *display_information)
+{
+  if (initialize == false) {
+    psapi_dll = LoadLibrary ("psapi.dll");
+    if (psapi_dll) {
+      GetProcessMemoryInfoFunction = (GetProcessMemoryInfoType) GetProcAddress (psapi_dll, "GetProcessMemoryInfo");
+    }
+
+    kernel32_dll = LoadLibrary ("kernel32.dll");
+    if (kernel32_dll) {
+      GlobalMemoryStatusExFunction = (GlobalMemoryStatusExType) GetProcAddress (kernel32_dll, "GlobalMemoryStatusEx");
+    }
+  
+    initialize = true;
+  }
+
+  if (GlobalMemoryStatusExFunction) {
+    MEMORYSTATUSEX memory_status;
+
+    memory_status.dwLength = sizeof (MEMORYSTATUSEX);
+    if (GlobalMemoryStatusExFunction (&memory_status)) {
+      display_information -> _physical_memory = memory_status.ullTotalPhys;
+      display_information -> _available_physical_memory = memory_status.ullAvailPhys;
+      display_information -> _page_file_size = memory_status.ullTotalPageFile;
+      display_information -> _available_page_file_size = memory_status.ullAvailPageFile;
+      display_information -> _process_virtual_memory = memory_status.ullTotalVirtual;
+      display_information -> _available_process_virtual_memory = memory_status.ullAvailVirtual;
+      display_information -> _memory_load = memory_status.dwMemoryLoad;
+    }    
+  }
+  else {
+    MEMORYSTATUS memory_status;
+
+    memory_status.dwLength = sizeof (MEMORYSTATUS);
+    GlobalMemoryStatus (&memory_status);
+
+    display_information -> _physical_memory = memory_status.dwTotalPhys;
+    display_information -> _available_physical_memory = memory_status.dwAvailPhys;
+    display_information -> _page_file_size = memory_status.dwTotalPageFile;
+    display_information -> _available_page_file_size = memory_status.dwAvailPageFile;
+    display_information -> _process_virtual_memory = memory_status.dwTotalVirtual;
+    display_information -> _available_process_virtual_memory = memory_status.dwAvailVirtual;
+    display_information -> _memory_load = memory_status.dwMemoryLoad;
+  }
+
+  if (GetProcessMemoryInfoFunction) {
+    HANDLE process;
+    DWORD process_id;
+    PROCESS_MEMORY_COUNTERS process_memory_counters;
+
+    process_id = GetCurrentProcessId();
+    process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_id);
+    if (process) {
+      if (GetProcessMemoryInfoFunction (process, &process_memory_counters, sizeof (PROCESS_MEMORY_COUNTERS))) {
+        display_information -> _process_memory =  process_memory_counters.WorkingSetSize;
+        display_information -> _peak_process_memory = process_memory_counters.PeakWorkingSetSize;
+        display_information -> _page_file_usage = process_memory_counters.PagefileUsage;
+        display_information -> _peak_page_file_usage = process_memory_counters.PeakPagefileUsage;
+      }
+
+      CloseHandle(process);
+    }
+  }  
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: WinGraphicsPipe::Constructor
 //       Access: Public
@@ -65,6 +141,9 @@ WinGraphicsPipe() {
   }
 #endif
 
+  // set callback for memory function
+  _display_information -> _get_memory_information_function = get_memory_information;
+  
   if (state) {
 
   }