0

我正在尝试使用本机 Qt 的 OpenGL 从我的视频卡中获取 GPU 内存的总量,我尝试了数百种方法,但没有一种方法有效。这就是我目前所拥有的:

  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;

问题是变量total_mem_kb总是0,它没有得到glGetIntegerv里面的值。通过运行此代码,我得到 0。可能是什么问题?你能给我一个提示吗?

4

2 回答 2

3

首先检查是否支持NVX_gpu_memory_info扩展。

请注意,该扩展至少需要 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);
}

我知道你刚才说你有一个 Nvidia 显卡,但这并不保证默认支持。此外,如果您有集成显卡,请确保您实际使用的是专用显卡。

如果你有一个 Nvidia GeForce 显卡,那么下面应该会产生类似于“Nvidia”和“GeForce”的东西。

glGetString(GL_VENDOR);
glGetString(GL_RENDERER);

如果它返回“Nvidia”以外的任何内容,那么您需要打开 Nvidia 控制面板并将首选显卡设置为您的 Nvidia 显卡。


在您验证它是 Nvidia 显卡并且支持该扩展之后。然后您可以尝试获取总可用内存和当前可用内存:

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);

我还想指出,NVX_gpu_memory_info扩展将其定义为:

GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX

并不是

GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVX

注意MEMORYvs的MEM区别。

因此,怀疑您已经定义GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVX了自己或利用了其他定义了它的东西。这表明它可能被错误地定义或引用其他东西。

于 2017-04-07T00:46:24.567 回答
0

我使用以下内容:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
LONG __stdcall glxGpuTotalMemory()
{
    GLint total_mem_kb = 0;
    glGetIntegerv(GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVX, &total_mem_kb);

    if (total_mem_kb == 0 && wglGetGPUIDsAMD)
    {
        UINT n = wglGetGPUIDsAMD(0, 0);
        UINT *ids = new UINT[n];
        size_t total_mem_mb = 0;
        wglGetGPUIDsAMD(n, ids);
        wglGetGPUInfoAMD(ids[0], WGL_GPU_RAM_AMD, GL_UNSIGNED_INT, sizeof(size_t), &total_mem_mb);
        total_mem_kb = total_mem_mb * 1024;
    }

    return total_mem_kb;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////   
LONG __stdcall glxGpuAvailMemory()
{
    GLint cur_avail_mem_kb = 0;
    glGetIntegerv(GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX, &cur_avail_mem_kb);

    if (cur_avail_mem_kb == 0 && wglGetGPUIDsAMD)
    {
        glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, &cur_avail_mem_kb);
    }

    return cur_avail_mem_kb;
}
于 2017-05-01T17:29:27.027 回答