OpenGL Debug Предупреждение об эффективности контекста
Мне удалось реализовать OpenGL Debug Contexts (удивительный, наконец!), и большинство вещей выглядит хорошо и хорошо, но я вижу предупреждение о производительности, что я не могу найти хорошую информацию.
[ 0.0330 - 388.6340] OpenGL Version: 4.2.0 Quadro 600/PCIe/SSE2 NVIDIA Corporation
[ 0.0000 - 549.1920] OpenGL: Program/shader state performance warning: Fragment Shader is going to be recompiled because the shader key based on GL state mismatches. [source=API type=PERFORMANCE severity=MEDIUM id=131218]
Я понимаю, что он имеет какое-то отношение к состоянию OpenGL, которое изменяется с момента последнего компиляции шейдеров.
У нас есть четыре шейдера, которые работают на текстуре, которая разделяется между контекстами, а информация об ошибке появляется только после создания нового контекста. Поэтому, возможно, создание контекста изменяет состояние конечного автомата OpenGL. Возможно ли, что это невозможно обойти, потому что каждый контекст начинается с собственной "чистой" конечной машины?
Вероятно, это не очень важно, поскольку это происходит только при создании контекста, но мы используем множество контекстов (по крайней мере, до 15 из них одновременно), поэтому было бы интересно узнать, могу ли я исправить предупреждение и избавиться от него раз и навсегда.
Ответы
Ответ 1
Из какая небольшая информация, которую я смог найти, NVIDIA хочет, чтобы часть вашего состояния OpenGL во время компиляции шейдеров соответствовала состояние, когда шейдер связан и используется для рендеринга.
Лично, пока мы не получим больше информации, я просто отфильтрую это конкретное сообщение в своей функции отладки отладки:
static void CALLBACK DebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *userParam)
{
// Suppress some useless warnings
switch(id)
{
case 131218: // NVIDIA: "shader will be recompiled due to GL state mismatches"
return;
default:
break;
}
// Print/handle message as usual
}
Ответ 2
Я избавился от этого сообщения, вызвав glUseProgram (0) после окончания рисования некоторой геометрии, иначе следующая glUseProgram() с programId вызвала бы это сообщение.