среда, 10 июля 2013 г.

Баги и фичи реализации OpenGL ES 2.0

Сборник багов в реализации драйверов OpenGL ES 2.0 с которыми мне пришлось столкнуться.
Фича номер 1.
На старых девайсах неправильно работает выравнивание пикселей. При попытке добавить часть изображения через glTexSubImage2D в текстуру формата 8-bit alpha,  изображение записывается с неправильным выравниванием, при этом не помогает даже использование однобайтного выравнивания пикселей при распаковке glPixelStorei(GL_UNPACK_ALIGNMENT, 1).
Обнаружено на GPU Adreno 205, названия остальных не помню.
Лечится это выравниванием изображения до значения, кратного 4.

Баг номер 2.
На девайсах с GPU PowerVR SGX530 и 540 при удалении фреймбуфера, в который происходит рендеринг, начинается неопределенное поведение - пропадают полигоны, иногда все иногда только часть.
Лечится биндом фреймбуфера поумолчанию при удалении текущего фреймбуфера, как и должен делать драйвер.

Фича номер 3.
На новых GPU Adreno (версии 320 если не ошибаюсь), есть баг с выравниванием пикселей - при добавлении изображения rgb8 формата через glTexSubImage2D со смещением не кратным 4 происходит искажение изображения и перемешиваются компоненты цвета.
Лечится выравниванием смещения до значения, кратного 4.

Фича номер 4.
На девайсах с GPU PowerVR SGX535 (например iPhone 3GS) при изменении значения юниформы сэмплера (вызов glUniform1i) происходит (частичная ?) перекомпиляция шейдера, что снижает производительность. А девайсы с Adreno 200 читают текстуру только из нулевого юнита.
Лечится полным уничтожением девайса.

Баг номер 5.
На девайсах с GPU PowerVR SGX530 и 540 (но не на всех) происходит падение (чтение по адресу 0х00000000) при чтении из инициализированной, но пустой текстуры. Это происходит, если выделить память для текстуры: glTexImage2D(..., 0) присоединить ее к FBO, но не вызвать ни одной команды отрисовки, после чего вывести квадрат с наложенной на него текстурой.
Лечится выкидыванием ненужных действий - оптимизацией.

Комментариев нет:

Отправить комментарий