2017-04-07 133 views
0

我试图从我的视频卡使用原生QT的OpenGL获得GPU内存的总量,我尝试了数百种方法,但没有一个能够工作。 这是我的时刻:如何使用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.可能是什么问题?你能给我一个提示吗?

+0

[Qt的5.5和OpenGL:检索设备信息]的可能的复制(http://stackoverflow.com/questions/32386770/qt-5-5-and-opengl -retrieving-device-info) – Vallentin

+0

@Vallentin,我看到了一个,它不一样。 glGetString对我来说工作正常,但上面的代码不能按照它的方式工作。 –

+0

你可以更具体的“不工作”。请注意'GL_NVX_gpu_memory_info'是一个Nvidia扩展。所以如果你的显卡不是Nvidia,那么支持这款扩展的机会很渺茫。 – Vallentin

回答

2

首先检查是否支持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显卡后,支持该扩展。然后,你可以尝试获得总电流可用内存:

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 

注意MEMORYMEM的区别。

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

+0

glGetString(GL_VENDOR)=结果是“Intel”。为什么它说英特尔? –

+2

然后,这表明您正在使用您的集成显卡,而不是您的专用Nvidia显卡。 – Vallentin

+0

但是我如何才能获得Nvidia的视频卡信息?我已经换了GPU,现在Qt在Nvidia卡上运行,而不是Intel,结果是一样的。 –

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