EGLImages使用renderbuffer作为源兄弟和纹理作为目标兄弟

时间:2014-04-23 03:00:40

标签: android linux opengl-es egl

我正在尝试设置EGLImage,其中源同级为GL_RENDERBUFFEREGLClientBuffer指定为eglCreateImageKHR的参数。在另一个上下文中,我创建了一个GL_TEXTURE_2D,并使用EGLImage将其指定为glEGLImageTargetTexture2DOES的目标兄弟。不幸的是,后一个电话导致GL_INVALID_OPERATION。如果源和目标兄弟都是GL_TEXTURE_2D,则设置就像魅力一样。

从我对规范的阅读中,这应该是一个允许的操作。我的简化测试用例也可能存在其他一些正交问题。虽然我怀疑这一点,因为当源和目标兄弟都是GL_TEXTURE_2D时,设置工作正常。但是,如果这是问题(EGLImage的这种用法是允许的话),可能导致GL_INVALID_OPERATION的问题可能是什么。或者我对我对规范的解释错了?

参考扩展名:

http://www.khronos.org/registry/gles/extensions/OES/OES_EGL_image.txt

http://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_image_base.txt

澄清:

  • 我会检查规范中是否存在所有扩展程序(EGL_KHR_imageEGL_KHR_image_baseEGL_KHR_gl_texture_2D_imageEGL_KHR_gl_renderbuffer_image等。)。
  • 我也意识到当我使用GL_RENDERBUFFERGL_TEXTURE_2D作为源时,EGLImage的内部格式可能会有所不同。所以我尝试首先使用OES_EGL_image_external扩展名,然后将纹理作为源,然后使用渲染缓冲区。纹理一如既往地工作,与渲染缓冲区相同GL_INVALID_OPERATION。绑定时使用外部图像对生成的错误没有影响。
  • 每次通话后都会检查GL和EGL错误。

2 个答案:

答案 0 :(得分:0)

我担心这可能是一个合法的失败点。如果驱动程序无法从提供的EGLImage创建纹理,则可能会出现GL_INVALID_OPERATION错误。

http://www.khronos.org/registry/gles/extensions/OES/OES_EGL_image.txt

  

如果GL无法使用提供的指定纹理对象   eglImageOES(例如,如果是指多重采样   eglImageOES),生成错误INVALID_OPERATION。

在将glFramebufferRenderbufferOES传递给eglCreateImageKHR之前,您是否使用了渲染缓冲区?如果是这样,建议您尝试调整创建渲染缓冲区的方式(例如尝试不同的格式,大小)以确定导致此错误的条件。

答案 1 :(得分:0)

在遇到这个问题之后,我花了很多时间在这个和EGLImage上。 alonorbach的假设是正确的。

如果出于任何原因,驱动程序无法从提供的EGLImage创建纹理兄弟,则会返回相当模糊的GL_INVALID_OPERATION。我的印象是,如果我能够创建有效的EGLImage(即,不是EGL_NO_IMAGE_KHR)并且支持相应的扩展,我将能够使用rendebuffer绑定到相同的扩展名。或纹理兄弟(在GL_OES_EGL_image)。这肯定是的情况。它似乎也因设备而异。我能够在NVidia Tegra个单元上运行,但不能在Adreno 320上运行。

这是否意味着无法在Android上可靠地使用EGLImages?不完全的。特别针对我遇到的问题,通过在扩展名EGLImage中指定GL_RGBA8_OES作为源的内部格式,我能够将纹理兄弟绑定到使用渲染缓冲源创建的GL_OES_rgb8_rgba8 renderbuffer(参数2到glRenderbufferStorage)。这不太理想,但证明了源和目标兄弟姐妹的内部格式必须匹配的点,并且,如果不匹配,驱动程序没有义务容纳变化并且可以自由放弃。

尝试成功使用EGLImage时的另一个熵源(至少通常在Android上)是EGLImage s本身的创建方式。我发现使用EGLImage扩展程序中指定的EGL_NATIVE_BUFFER_ANDROID目标创建EGL_ANDROID_image_native_buffer更加可靠。如果您的平台可以使用此类扩展,则最好以后备方式使用它们。

总之,似乎对我来说可靠的解决方案似乎是首先尝试使用后备方式使用任何和所有可用扩展来创建有效的EGLImage。然后使用EGLImage尝试绑定到目标兄弟类型。如果这对操作没有产生错误,则该设备支持该EGLImage / TargetKind对,并可用于后续操作。如果任一操作失败,则检查后备链中的下一个项目。如果所有其他方法都失败,则可能存在不使用EGLImage的解决方案。我还没有遇到过这样的Android设备(手指交叉)

我仍在发现极端情况和优化,并会根据调查结果更新此答案。