Как я могу получить свою общую память GPU, используя родной OpenGL Qt?

Я пытаюсь получить общий объем памяти 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. В чем может быть проблема? Можете ли вы дать мне подсказку?

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, &currentMemoryKb);

Я также хотел бы отметить, что 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 себя или используя что-то еще, что определило это. Это говорит о том, что оно может быть неправильно определено или относится к чему-то другому.

2

Другие решения

Я использую следующее:

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

По вопросам рекламы [email protected]