нарушение доступа в wglMakeCurrent - PullRequest
2 голосов
/ 22 декабря 2009

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

wglMakeCurrent(NULL, NULL);

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 25 декабря 2009

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

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

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

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

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

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

См:

1 голос
/ 07 апреля 2010

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

0 голосов
/ 25 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...