2017-04-07 30 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; 
}