机器是飞思卡尔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库。
答案 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;