wglCreateContext возвращает NULL с GetLastError, говоря "без ошибок" во многих контекстах OpenGL
У меня есть несколько "плагинов" - DLL, которые все имеют графический интерфейс, теперь на основе OpenGL. Все работает нормально, но когда я открываю многие из них, возникает проблема (ниже)... Это происходит на моей основной машине для разработки с довольно старой, но все еще приемлемой ATI Radeon HD 4600 (с новейшими драйверами, хотя все еще отмеченными как устаревшие), но не на довольно современном ноутбуке без встроенного Intel HD и NVidia.
Может произойти 2 вещи, кажется случайным:
A) wglCreateContext возвращает NULL, но GetLastError говорит, что все в порядке! В этом случае у меня есть план резервного копирования с эмуляцией с использованием процессора. Медленно, но работает...
к несчастью...
B) "aticfx64.dll" вылетает с нарушением прав доступа, читая 0xffffffffffffffff. Очевидно, это драйвер ATI, но в любом случае от этого не уйти...
Есть идеи? Я имею в виду, что это не совсем типично иметь так много открытых окон, но все же он должен справиться с этим, верно? Моя главная проблема заключается в том, есть ли какой-то предел или способ справиться с этим. Я просто немного боюсь, что это может произойти, скажем, с 2 окнами... это было бы просто плохо.
2 ответа
Я бы предложил проверить использование памяти. Если это происходит только в нескольких открытых окнах, вы можете вызвать ошибку драйвера, которая не проверяет, успешно ли выделено место (выделение может завершиться ошибкой, если ваша память фрагментирована или у вас ограниченный объем памяти). Когда wglCreateContext возвращает NULL, попытайтесь выделить больший кусок памяти - в случае неудачи это может иметь место.
Другой проблемой может быть использование большего количества общих контекстов, чем позволяет драйвер. В теории spec ( http://www.opengl.org/registry/specs/ARB/wgl_create_context.txt) говорит, что "произвольное количество контекстов может обмениваться данными таким способом". но использование сколь угодно большого количества общих контекстов является пыльным уголком спецификации и может быть плохо протестировано. Это может иметь место, если вы используете более 32 общих контекстов (общие контексты могут храниться внутри DWORD как битовая маска). Вы можете легко проверить это, попытавшись создать 33 общих контекста и проверив, возвращает ли какой-либо из них значение NULL.
Не забудьте вызвать wglDeleteContext, когда вы больше не используете HGLRC, иначе у вас будут утечки памяти и, в конце концов, нарушение доступа (по крайней мере, на ati).
(У меня была эта странная ошибка, пока я не нашел проблему)