У меня графика Intel HD Graphics 4600 и движок падает с порчей кучи. Я обнаружил, что если не создавать шейдеры, то порчи кучи нет. Ну и естественно, на AMD и NVidia всё работает идеально. Скорее всего драйвер портит кучу при создании шейдеров.
Я периодически обновляю драйвер интела, и один раз мне попалась какая-то версия, которая не вызывала порчи кучи и корректно работала (точнее был один графический глюк, но это уже другой вопрос). Но после очередного обновления повреждение кучи вернулось.
Большинство других демок тоже падает или работает некорректно, но есть и достаточно сложные демки со сложными шейдерами, которые на удивление полностью корректно работают и не падают. Видимо, они просто мало работают с кучей и поэтому не падают или там другая манера написания шейдеров, которые компилятор переваривает без порчи кучи. Такая же ситуация на компьютерах знакомых с intel HD 3xxx и 4xxx.
Я уж было думал просто проигнорировать интелы и не поддерживать их. Например сделать message box с таким текстом: "Игра обнаружила, что у вас Intel вместо видеокарты. Корректная работа игры не гарантируется.". Но видимо не получится. Они становятся всё более распространёнными и на некоторых устройствах, например на всех планшетах с Windows, есть только графика Intel. А я как раз собираюсь следующий планшет брать с виндой. Можно конечно добавить в движок поддержку DX11, но там есть большие сложности с шейдерами, которые я не знаю, как решить. Я бы отложил это на пару лет. Хотя через пару лет это будет неактуально, ведь будет Vulkan.
Кто пишет на OpenGL и тестирует на интеле? У вас всё нормально или тоже падает?
gammaker
А версию OpenGL проверял? Есть у меня какой-то Intel HD Graphics, он больше OpenGL 3.1 не держит вроде.
Panzerschrek[CN]
> А версию OpenGL проверял? Есть у меня какой-то Intel HD Graphics, он больше
> OpenGL 3.1 не держит вроде.
Наверное это HD Graphics 3xxx. Я проверял его версию и список расширений, всё что нужно там есть и даже больше. Если я не ошибаюсь, там есть всё 3.3, но без геометрических шейдеров. А у меня 4600, там даже GL 4.3 есть.
В любом случае, даже если бы не поддерживалась нужная версия расширений, был бы вызов по нулевому указателю или ошибка компиляции шейдера. Но никак не повреждение кучи.
Я думаю проблема в использовании апи, попробуйте использовать профайл для обноружения вашего косяка
P.s nvidia, ati могут прощять, попробуйте Xcode инструметарий
Если шейдеры пишутся без #version то вероятность того, что они незаработают на интеле очень высока. Но если принудительно задать версию, то компилятор сначала укажет на кучу ошибок и отходов от стандарта (которые он тем не менее успешно игнорирует, пока версия не указана явно), надо будет их исправить и тогда всё должно прекрасно заработать. Единственный косяк, с которым я столкнулся на интелах - это ругань на модификатор const, почему-то они его не знают.
Остальное всё работало без нареканий.
ReeV
> Я думаю проблема в использовании апи, попробуйте использовать профайл для
> обноружения вашего косяка
У меня стоит NVidia Nsight. На интеле она не работает, а на NVidia естественно ничего плохого не говорит. Debug output ничего не выдаёт кроме "API_ID_RECOMPILE_FRAGMENT_SHADER performance warning has been generated. Fragment shader recompiled due to state change.", но это всего лишь performance warning. Ошибок glGetError не возвращает. Точнее иногда возвращает, а иногда нет, чаще всего не возвращает. Но это из-за повреждения кучи. Если все ошибки, связанные с повреждением кучи в отладчике проигнорировать, то моя демка чаще всего запускается, работает и всё рендерит. То есть в итоге все шейдеры создаются и работают.
g-cont
> Если шейдеры пишутся без #version то вероятность того, что они незаработают на
> интеле очень высока.
У меня движок автоматически дописывает последнюю поддерживаемую версию в шейдер. В данном случае это #version 430 core. В случае HD Graphics 3000 это #version 140. Шейдеры компилируются без ошибок и предупреждений. Большинство шейдеров я проверил вот этой штукой https://www.khronos.org/opengles/sdk/tools/Reference-Compiler/ и исправил всё, к чему она придралась.
Раз повреждения кучи - надо разобраться что именно её повреждает. Где-то в драйвере херится.
gammaker
У меня работает. Intel HD 4000.
g-cont
> Раз повреждения кучи - надо разобраться что именно её повреждает. Где-то в
> драйвере херится.
Нашёл, вот в этой строчке:
glGetActiveUniform(sh->id, index, 1024, null, arraySize, &gltype, name);
Я поставил туда 1024, потому что мне было лень передавать в функцию размер буфера, потому что буфер был такого размера, чтобы гарантированно уместить любое имя uniform'а. Этот размер я заранее узнавал с помощью glGetProgramiv(sh->id, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUNL). Уместить-то умещает, но драйвер зачем-то дописывает 0 не только в конец названия uniform, но и в 1024-ю позицию. Естественно, NVidia и AMD такой фигнёй не страдают и на них всё работало.
Разработчики драйверов на видеокарты - люди с альтернативным мышлением, я давно это заметил.
g-cont
> Единственный косяк, с которым я столкнулся на интелах - это ругань на
> модификатор const, почему-то они его не знают.
Кстати, оказалось, что тот глюк, который я упоминал в #0 вылечился тем, что я убрал const в шейдере. Но ругани в логах никакой не было, просто неправильно рендерилось.
Я думаю это ключевая фраза
>>Я поставил туда 1024, потому что мне было лень передавать в функцию размер буфера
p.s ну и как всегда виновато Убогое АПИ
ReeV
> Я думаю это ключевая фраза
Но ведь в буфер должно было всё что угодно влезть. Лень конечно играет роль, но и интел не прав.
ReeV
> p.s ну и как всегда виновато Убогое АПИ
Скорее его реализация. У меня на каком-то древнем интеле игра падала, которая естественно была написана на DX9, который тот интел поддерживал. Вылечилось по-моему увеличением настроек графики и соответственно тормозов.
HD 4000
HD 4400
HD 4600
Все нормально
gammaker
> драйвер зачем-то дописывает 0 не только в конец названия uniform, но и в 1024-ю
> позицию.
Хвостики в массивах, оказывается, бывают нужны ))
Тема в архиве.