Я пытаюсь получить общий объем памяти GPU с моей видеокарты, используя OpenGL нативного Qt, я перепробовал сотни методов, но ни один из них не работает.
Вот что у меня на данный момент:
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. В чем может быть проблема? Можете ли вы дать мне подсказку?
Прежде всего, проверьте, если 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, ¤tMemoryKb);
Я также хотел бы отметить, что NVX_gpu_memory_info расширение определяет это как:
GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
и не
GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVX
Обратите внимание MEMORY
против MEM
разница.
Так что подозревая, что вы определили GL_GPU_MEM_INFO_TOTAL_AVAILABLE_MEM_NVX
себя или используя что-то еще, что определило это. Это говорит о том, что оно может быть неправильно определено или относится к чему-то другому.
Я использую следующее:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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;
}