1

机器是 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 内核和带有自定义 linux 发行版的 OpenGL ES / EGL 库。

4

1 回答 1

1

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

我相信这是 GPU 的 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;
于 2014-02-27T17:09:12.203 回答