#import #import #include "gpu_info_darwin.h" uint64_t getRecommendedMaxVRAM() { id device = MTLCreateSystemDefaultDevice(); uint64_t result = device.recommendedMaxWorkingSetSize; CFRelease(device); return result; } // getPhysicalMemory returns the total physical memory in bytes uint64_t getPhysicalMemory() { return [NSProcessInfo processInfo].physicalMemory; } // getFreeMemory returns the total free memory in bytes, including inactive // memory that can be reclaimed by the system. uint64_t getFreeMemory() { mach_port_t host_port = mach_host_self(); mach_msg_type_number_t host_size = sizeof(vm_statistics64_data_t) / sizeof(integer_t); vm_size_t pagesize; vm_statistics64_data_t vm_stat; host_page_size(host_port, &pagesize); if (host_statistics64(host_port, HOST_VM_INFO64, (host_info64_t)&vm_stat, &host_size) != KERN_SUCCESS) { return 0; } uint64_t used = (uint64_t)vm_stat.active_count * pagesize + (uint64_t)vm_stat.inactive_count * pagesize + (uint64_t)vm_stat.speculative_count * pagesize + (uint64_t)vm_stat.wire_count * pagesize + (uint64_t)vm_stat.compressor_page_count * pagesize - (uint64_t)vm_stat.purgeable_count * pagesize - (uint64_t)vm_stat.external_page_count * pagesize; uint64_t total_memory = [NSProcessInfo processInfo].physicalMemory; if (used >= total_memory) { return 0; } return total_memory - used; }