Не мощь двух изображений с 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;
Другие вопросы по тегам