Включение тройной буферизации OpenGL + vsync в AMD CCC разрушает наше приложение

У нас есть настольное приложение для Windows, написанное на C ++, в котором используется представление OpenGL.

На некоторых картах AMD, если вы откроете Catalyst Control Center и включите Triple Buffering и V-sync, это нарушит наше приложение: вообще ничего не рендерится, это просто серый экран (в некоторых других версиях драйверов вместо этого возникает сбой при создании контекста ). Выключение или тройная буферизация или же V-Sync восстанавливает его до нормального.

Мы используем wglSwapIntervalEXT включить V-синхронизацию в нашем приложении. Думая, что это может конфликтовать, я удалил код для него; без изменений.

Это определенно ошибка драйвера или есть что-то другое, что мы должны сделать для обработки тройной буферизации?

1

Решение

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

1) Все ваши звонки, чтобы установить формат пикселя и создать GL RC, будут успешными. Однако GLDebugger покажет, что RC фактически не получает статические буферы.

2) Когда вы попытаетесь сделать RC текущим, он вернет false, и GetLastError () скажет, что есть недопустимый дескриптор.

3) Я могу только повторить эту проблему в MFC. Это то, что вы используете? Когда я создавал тестовое приложение с использованием прямого Win32 API, оно работало нормально. Здесь должно быть неясное взаимодействие …

4) Если я задержу создание RC до окончания OnCreate, то все будет хорошо.

Я боюсь, что мой ответ склоняется к «Driver Bug», но пункт 4 показывает обходной путь — вместо того, чтобы создавать окно GL в OnCreate, попробуйте вместо этого сделать его как единовременный в OnInitialUpdate — это пока работает в тесте для меня!

ОБНОВИТЬЯ связался с AMD по этому вопросу, и оказалось, что это результат того, что MFC изначально создал окно с нулевой шириной / высотой, а затем изменил размеры. Если в вашей функции PreCreate назначить ненулевые размеры, все работает.

Надеюсь, это будет хорошим ресурсом для всех, кто пытается выяснить, что происходит с этим!

4

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector