Comment puis-je obtenir ma mémoire GPU totale en utilisant OpenGL natif de Qt ?


M. Hello_world

J'essaie d'obtenir la quantité totale de mémoire GPU de ma carte vidéo en utilisant OpenGL de Qt natif, j'ai essayé des centaines de méthodes, mais aucune ne fonctionne. Voilà ce que j'ai en ce moment :

  QOpenGLContext context;
  context.create();
  QOffscreenSurface surface;
  surface.setFormat(context.format());
  surface.create();
  QOpenGLFunctions func;
  context.makeCurrent(&surface);
  func.initializeOpenGLFunctions();
  GLint total_mem_kb = 0;
  func.glGetIntegerv(GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVX,&total_mem_kb);
  qDebug()<<total_mem_kb;

Le problème est que la variable total_mem_kb est toujours 0, elle n'obtient pas la valeur à l'intérieur de glGetIntegerv. En exécutant ce code, j'obtiens 0. Quel peut être le problème ? Pouvez-vous s'il vous plaît me donner un indice?

valentin

Tout d'abord, vérifiez si l' extension NVX_gpu_memory_info est prise en charge.

Notez que l'extension nécessite au moins OpenGL 2.0.

GLint count;
glGetIntegerv(GL_NUM_EXTENSIONS, &count);

for (GLint i = 0; i < count; ++i)
{
    const char *extension = (const char*)glGetStringi(GL_EXTENSIONS, i);
    if (!strcmp(extension, "GL_NVX_gpu_memory_info"))
        printf("%d: %s\n", i, extension);
}

Je sais que vous venez de dire que vous avez une carte graphique Nvidia, mais cela ne garantit pas par défaut la prise en charge. De plus, si vous avez une carte graphique intégrée, assurez-vous que vous utilisez réellement votre carte graphique dédiée.

Si vous avez une carte graphique Nvidia GeForce, alors ce qui suit devrait aboutir à quelque chose du genre "Nvidia" et "GeForce".

glGetString(GL_VENDOR);
glGetString(GL_RENDERER);

S'il renvoie autre chose que "Nvidia", vous devez ouvrir votre panneau de configuration Nvidia et définir la carte graphique préférée sur votre carte graphique Nvidia.


Après avoir vérifié qu'il s'agit de la carte graphique Nvidia et que l'extension est prise en charge. Ensuite, vous pouvez essayer d'obtenir la mémoire disponible totale et actuelle :

GLint totalMemoryKb = 0;
glGetIntegerv(GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX, &totalMemoryKb);

GLint currentMemoryKb = 0;
glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &currentMemoryKb);

Je tiens également à souligner que l' extension NVX_gpu_memory_info le définit comme :

GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX

et pas

GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVX

Notez la différence MEMORYvs.MEM

Donc, soupçonner que vous vous êtes défini GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVXou tirer parti de quelque chose d'autre qui l'a défini. Cela indique qu'il pourrait être mal défini ou faire référence à autre chose.

Articles connexes