2010-09-23 7 views
1

est-ce que quelqu'un sait comment obtenir le (libre) vram sur os x?Free VRam sur OS X

Je sais que vous pouvez interroger pour une entrée de Registre:

typeCode = IORegistryEntrySearchCFProperty(dspPort,kIOServicePlane,CFSTR(kIOFBMemorySizeKey), 
              kCFAllocatorDefault, 
              kIORegistryIterateRecursively | kIORegistryIterateParents); 

mais cela vous donnera tous les VRAM, pas la VRAM libre. Sous windows, vous pouvez demander gratuitement VRAM en utilisant directhow

mDDrawResult = DirectDrawCreate(NULL, &mDDraw, NULL); 
mDDrawResult = mDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&mDDraw2); 
DDSCAPS ddscaps; 
DWORD totalmem, freemem; 
ddscaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; 
mDDrawResult = mDDraw2->GetAvailableVidMem(&ddscaps, &totalmem, &freemem); 

Laide, mais cela fonctionne. Quelqu'un connaît la façon osx?

Meilleur Wendy

Répondre

2

me répondre pour que les autres peuvent utiliser:


#include <IOKit/graphics/IOGraphicsLib.h> 
size_t currentFreeVRAM() 
{ 

    kern_return_t krc; 
    mach_port_t masterPort; 
    krc = IOMasterPort(bootstrap_port, &masterPort); 
    if (krc == KERN_SUCCESS) 
    { 
     CFMutableDictionaryRef pattern = IOServiceMatching(kIOAcceleratorClassName); 
     //CFShow(pattern); 

     io_iterator_t deviceIterator; 
     krc = IOServiceGetMatchingServices(masterPort, pattern, &deviceIterator); 
     if (krc == KERN_SUCCESS) 
     { 
      io_object_t object; 
      while ((object = IOIteratorNext(deviceIterator))) 
      { 
       CFMutableDictionaryRef properties = NULL; 
       krc = IORegistryEntryCreateCFProperties(object, &properties, kCFAllocatorDefault, (IOOptionBits)0); 
       if (krc == KERN_SUCCESS) 
       { 
        CFMutableDictionaryRef perf_properties = (CFMutableDictionaryRef) CFDictionaryGetValue(properties, CFSTR("PerformanceStatistics")); 
        //CFShow(perf_properties); 

        // look for a number of keys (this is mostly reverse engineering and best-guess effort) 
        const void* free_vram_number = CFDictionaryGetValue(perf_properties, CFSTR("vramFreeBytes")); 
        if (free_vram_number) 
        { 
         ssize_t vramFreeBytes; 
         CFNumberGetValue((CFNumberRef) free_vram_number, kCFNumberSInt64Type, &vramFreeBytes); 
         return vramFreeBytes; 
        } 
       } 
       if (properties) CFRelease(properties); 
       IOObjectRelease(object); 
      }   
      IOObjectRelease(deviceIterator); 
     } 
    } 
    return 0; // when we come here, this is a fail 
} 

  • je suis un peu surpris que cette question prend presque 3 msec ..
  • sachez qu'il peut y avoir plus d'un accélérateur sur votre s ystem (par ex. macbook) alors assurez-vous que vous sélectionnez le bon pour la requête
+0

Comment puis-je basculer entre les cartes comme sur macbook qui a 2? –