2009-12-22 2 views
2

Иногда в моей OpenGL приложения я получаю нарушение прав доступа в следующий вызов API:нарушение прав доступа в wglMakeCurrent

wglMakeCurrent(NULL, NULL); 

Приложение имеет только одну единственную нить, и я проверил, что до этого вызова, как DC и HGLRC, которые в настоящее время используются, являются правильными и действительными.

Существует три разных окна с содержимым OpenGL, и все они перерисовываются в сообщениях WM_PAINT, и если требуется обновление из-за взаимодействия с пользователем (например, выбор объекта).

Также это нарушение прав доступа происходит на разных машинах с разными графическими картами, поэтому я не думаю, что это проблема с драйвером.

Что может привести к сбою вызова API? Что я должен исследовать в коде приложения, чтобы узнать, где/почему это происходит? Я действительно потерялся здесь, так как я проверил все, о чем я мог думать. Я надеюсь, что кто-то может дать мне подсказки/идеи о том, что еще нужно проверить.

+0

Возможно проверить возвращаемое значение вызова wglMakeCurrent или GetLastError. – Stringer

+2

Ошибка wglMakeCurrent, поэтому нет возвращаемого значения. – Stefan

ответ

1

Оказывается, что обновленный графический драйвер исправили проблему. Так что это была проблема в драйвере.

0

Попробуйте добавить вызов glFlush перед тем, как сделать это. Возможно, конвейер рендеринга еще не полностью очищен до графического процессора.

2

Является ли целью этого вызова освободить контекст устройства текущего потока? Это единственный момент, когда NULL для обоих параметров действителен. Из документации:

«Если hglrc является NULL, то функция не делает текущий контекст рендеринга вызывающего потока больше не ток, и освобождает контекст устройства, который используется в контексте рендеринга В этом случае HDC игнорируется.. "

В дополнении к предложению Tarydon о добавлении glFlush, похоже, что это было бы излишним:

«Прежде чем перейти к новому контексту рендеринга, OpenGL смывает любой предыдущий контекст рендеринга, который был текущим вызывающим поток «.

Учитывая API на самом деле происходит сбой, и не просто привести к сбою, единственное предложение, которое я могу думать о том, что нить, на которой вы звоните wglMakeCurrent выпустить HGLRC это не то же контекст нити используется для связать HGLRC с этим контекстом устройства. Таким образом, драйвер может искать неправильное локальное хранилище потоков для вызова, что приводит к сбою.

Что произойдет, если вы добавите некоторые записи в свой код и распечатаете текущий идентификатор потока перед каждым звонком до wglMakeCurrent?

См:

+0

Как я уже говорил, все приложение использует только один поток, поэтому проблемы с разными потоками невозможны. И добавление кода регистрации не помогает: приложение действительно меня ненавидит и просто не сбой, когда я добавляю код регистрации. Думаю, мне нужно копать здесь очень глубоко в десятилетнем коде :( – Stefan

+0

@Stefan Далее я бы предложил добавить код регистрации ко всем вашим вызовам 'wglMakeCurrent' и отобразить значения' DC' и 'HGLRC' и его возврат (например, запись в файл или использование OutputDebugString и т. д.). В прошлом я обнаружил, что если ваше приложение меняет поведение при добавлении (или удаление), это может быть признаком повреждения памяти. Возможно, вы захотите попробовать такой инструмент, как BoundsChecker, который может обнаруживать ошибки во время выполнения (повреждение памяти, а также сбои API и т. д.). – gavinb

Смежные вопросы