Не мощь двух изображений с eglCreateImageKHR
Машина Freescale iMX53, моя программа создает много изображений с помощью вызова:
EGLint attr[] = {
EGL_WIDTH, 720,
EGL_HEIGHT, 576,
EGL_IMAGE_FORMAT_FSL, EGL_FORMAT_YUV_YV12_FSL,
EGL_NONE
};
img = eglCreateImageKHR(egl_display, EGL_NO_CONTEXT, EGL_NEW_IMAGE_FSL, NULL, attr);
Позже такой вызов получает детали (физические / виртуальные адреса, шаг) выделенного изображения:
eglQueryImageFSL(egl_display, img, EGL_CLIENTBUFFER_TYPE_FSL, (EGLint *)&info);
iMX53 работает на EGL 1.4 и OpenGL ES 2.0. Мне кажется (исследуя значение шага), что eglCreateImageKHR(...) способен распределять ширину изображения только с кратным 32, что в моем случае абсолютно плохо. К сожалению, я не могу использовать glTexImage2D и друзей из-за снижения производительности, которое они вызывают.
Можно ли как-то заставить eglCreateImageKHR(...) избегать использования 32-байтовых кратных или даже заставить его использовать выравнивание 4/8/16 байтов? 16-байтовое выравнивание также будет достаточно для меня. Я не использую Android, просто ядро 2.6.35.4 и библиотеки OpenGL ES / EGL с пользовательским дистрибутивом Linux.
1 ответ
Я посмотрел на мою реализацию на Freescale iMX53, и вы правы - eglCreateImageKHR() требует, чтобы размеры текстуры были кратны не менее 32 пикселям (не байтам). Фактически, мой код округляет ширину до кратного 64.
Я считаю, что это требование AMD Z430, которая является графическим процессором. Мое решение состояло в том, чтобы просто выделить наихудший размер 1920 x 1088 раз и использовать эти текстуры для всех видеоформатов, поскольку их EGL не позволяет изменять размеры в любом случае. Используйте координаты текстуры, чтобы компенсировать меньшие форматы, например:
static GLfloat gafTexCoords[] =
{
0.0f, 1.0f,
1.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f
};
iTextureWidth = (iOriginalTextureWidth + 63) & ~63;
iTextureHeight = (iOriginalTextureHeight + 31) & ~31;
gafTexCoords[2] = gafTexCoords[4] = (GLfloat)iOriginalTextureWidth / (GLfloat)iTextureWidth;
gafTexCoords[1] = gafTexCoords[3] = (GLfloat)iOriginalTextureHeight / (GLfloat)iTextureHeight;