Роман Шувалов
> Чисто.
Ну простой пример из 3 строчек "создать заполнить удалить" не течет?
Vlad2001_MFS
> VAO может объединять несколько VBO.
Ок, приму к сведению, но в моем случае это пока не нужно.
MrShoor
> Убедись, что код с glDeleteVertexArrays вообще вызывается,
Убедился.
MrShoor
> Еще не красиво выглядит, что у тебя не зануляются дескрипторы:
Там в конце объект уничтожается. Вернее, выставляется status = 0. А при создании нового все заполняется нулями.
MrShoor
> Ну и наконец включен ли Break On OpenGL Errors и Break On Detected Errors в CodeXL?
Запустил сейчас последнюю версию - на выходе виснет и приложение, и CodeXL. Сейчас попробую в Windows.
foxes
> Ну простой пример из 3 строчек "создать заполнить удалить" не течет?
Сейчас испытаю. Но вообще, если отключить VAO (контекст OpenGL 2.1), то ничего не течёт. То есть утечка именно в местах, обёрнутых в
if (VaoEnabled) { // ... }
MrShoor
Утечки статические, т.е. не зависят от моих тестов. Они где-то на этапе загрузки приложения, даже если после загрузки меню сразу закрою - утечек столько же, так что они к делу не относятся.
foxes
> Ну простой пример из 3 строчек "создать заполнить удалить" не течет?
Не течёт :) Но ведь без VAO вообще ничего не течёт, а код внутри скобок if (VaoEnabled) { ... } только содержит только вызовы gl*, которые на простом тесте не дают текучки. Я в замешательстве.
Ну не знаю, скажи ему что он плАхой вдруг заработает.
В общем, если просто создать и удалить VAO+VBO, утечек нет.
А если в процессе создания-удаления нескольких сотен VAO+VBO заниматься чем-то еще, что занимает память, то VAO уже не удаляется.
Повреждение памяти было бы заметно, тем более в режиме OpenGL 2.1 без VAO всё работает чётко.
Похоже, единственный способ найти - комментировать всё подряд вплоть до заведомо рабочего состояния "создать-удалить".
Роман Шувалов
> то VAO уже не удаляется.
Заведи глобальный счетчик сразу после вызова:
glCreateVertexArrays() gvVAOCount++;
И после удаления:
glDeleteVertexArrays() gvVAOCount--;
А после удаления контекста выведи этот счетчик:
cout<<gvVAOCount<<"\n";
и посмотри чему он равен.
Нашёл! На некоторых шейдерах создание и сразу же удаление даёт утечку! Я тестировал на нескольких случайных, а сейчас скопировал тот список шейдеров, который реально используется. Сейчас буду поштучно вычеркивать по одному и найду засранца.
MrShoor
Я же написал выше -
О_О я не отправил предыдущее сообщение что ли... именно так я и поступил. Там ноль. (Ну, не ноль, а то, что после первоначальной загрузки осталось.)
#define GAME_SH_SHADOW_OBJ (RS_SH_USER + 36) #define GAME_SH_TRANSPARENT_SHADOW_OBJ ( RS_SH_USER + 36)
Дело закрыто.
Зато ты узнал немного больше о VAO.
вы изобрели refcounters? гениально :)
innuendo
> вы изобрели refcounters? гениально :)
Мне нужен был список из констант, если в Си есть лёгкий способ их автоматического инкрементального объявления, дайте знать.
Для GUI я заморочился и написал целую программу (ну там в любом случае был экспорт в мой собственный формат, так что несложно заодно и список сохранить в .h файл). Но для всего остального.
Роман Шувалов
> Мне нужен был список из констант, если в Си есть лёгкий способ их
> автоматического инкрементального объявления, дайте знать.
enum
Bowman
> enum
Тема в архиве.