Низкая производительность glTexSubImage2D на Nexus 10 / Android 4.2.2 (Samsung Exynos 5 w / Mali-T604)

У меня есть приложение для Android, которое декодирует видео в формате yuv420p, а затем создает видеоролики с использованием OpenGLES. Я использую glTexSubImage2D () для загрузки буфера y / u / v в GPU, а затем преобразования YUV2RGB с использованием шейдера. Весь код установки / рендеринга EGL / OpenGL – это собственный код.

Теперь я не говорю, что с моим кодом нет проблем, но, учитывая тот же код, он отлично работает на iOS (iPad / iPhone), Nexus 7, Kindle HD 8.9, Samsung Note 1 и несколько других дешевых китайских таблеток (A31 / RockChip 3188) под управлением Android 4.0 / 4.1 / 4.2. Я бы сказал, что менее вероятно, что мой код ошибочен. На этих устройствах glTexSubImage2D () использует менее 16 мс для загрузки текстуры HD SD или 720P.

Однако на Nexus 10 glTexSubImage2D () для текстуры SD или 720P HD требуется около 50 ~ 90 мс, что слишком медленно для видео с частотой 30 кадров в секунду или 60 кадров в секунду.

я бы хотел знать

1) если я должен выбрать другой формат текстуры (RGBA или BGRA). Есть ли способы определить, какой формат текстур лучше использовать для графического процессора?

2) если есть функция «ВЫКЛ» для всех других SOC, но установлена ​​на «ON» на Exynos 5. Например, автоматический вариант генерации MIPMAP. (У меня это есть, кстати)

3) если это известная проблема Samsung Exynos SOC – я не могу найти форум поддержки для Exynos CPU

4) Есть ли какой-либо параметр, который мне нужно установить при настройке поверхности EGL? Например, прозрачность, формат поверхности и т. Д.? (Я понятия не имею, о чем говорю)

5) Это может означать, что GPU выполняет неявное преобразование формата, но я проверял, что GL_LUMINANCE всегда используется. Снова он работает на любой другой платформе.

6) что-нибудь еще?

Моя конфигурация EGL:

const EGLint attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_NONE }; 

Начальная настройка:

 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, ctx->frameW, ctx->frameH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); /* also for U/V */ 

Последующая частичная замена:

 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ctx->frameW, ctx->frameH, GL_LUMINANCE, GL_UNSIGNED_BYTE, yBuffer); /*also for U/V */ 

Я пытаюсь сделать видео с разрешением ~ 30FPS или ~ 60FPS при разрешении SD или 720P HD.

Solutions Collecting From Web of "Низкая производительность glTexSubImage2D на Nexus 10 / Android 4.2.2 (Samsung Exynos 5 w / Mali-T604)"

Это известная проблема с драйверами, о которой мы сообщили в ARM. Будущее обновление должно исправить это.

Обновление статуса EDIT

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

Если вы дублируете идентификаторы текстур (например, кадр N = ID X, N + 1 = ID Y, N + 2 = ID X, N + 3 = ID Y и т. Д.) Для текстур, которые вы загружаете на него, должны помочь избежать этого На текущей прошивке.

Спасибо, Iso

Я могу подтвердить, что это было исправлено в Android 4.3 – я вижу увеличение производительности в 2-3 раза с RGBA-форматом и в 10-50 раз с другими форматами текстур по сравнению с Android 4.2.2. Эти результаты применимы как для glTexImage2D, так и для glTexSubImage2D. (Не могу добавить комментарии, поэтому мне пришлось поставить это здесь)

EDIT: Если вы застряли с 4.2.2, вы можете попробовать использовать текстуру RGBA вместо этого, она должна иметь лучшую производительность (3-10x или около того с большими размерами текстуры с двумя размерами).