使用eglCreateImageKHR的两个图像的非幂

时间:2014-02-27 08:56:05

标签: opengl-es egl

机器是飞思卡尔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,只是一个带有自定义Linux发行版的2.6.35.4内核和OpenGL ES / EGL库。

1 个答案:

答案 0 :(得分:1)

我查看了我在飞思卡尔iMX53上的实现,你说得对 - eglCreateImageKHR()要求纹理尺寸为至少32像素(而不是字节)的倍数。事实上,我的代码将宽度四舍五入到64的倍数。

我认为这是GPU 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;