4

我正在尝试设置EGLImage源兄弟为 a 的位置GL_RENDERBUFFEREGLClientBuffer指定为 的参数eglCreateImageKHR)。在另一种情况下,我创建 aGL_TEXTURE_2D并将其指定为EGLImage使用glEGLImageTargetTexture2DOES. 不幸的是,后一个调用导致GL_INVALID_OPERATION. 如果源兄弟姐妹和目标兄弟姐妹都是GL_TEXTURE_2D's,则设置就像一个魅力。

根据我对规范的阅读,这应该是允许的操作。我的简化测试用例也可能有其他一些正交问题。尽管我对此表示怀疑,因为当源兄弟姐妹和目标兄弟姐妹都是GL_TEXTURE_2D's. 但是,如果这是问题所在(并且 s 的这种用法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等)。
  • 我也意识到,当我使用 a GL_RENDERBUFFERvs aGL_TEXTURE_2D作为源时,EGLImage 的内部格式可能存在差异。所以我尝试OES_EGL_image_external先使用扩展,将纹理作为源,然后使用渲染缓冲区。纹理一如既往地工作正常,GL_INVALID_OPERATION渲染缓冲区也是如此。绑定时使用外部图像对生成的错误没有影响。
  • 每次调用后都会检查 GL 和 EGL 错误。
4

2 回答 2

0

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

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

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

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

于 2014-05-06T13:06:08.723 回答
0

在遇到这个问题后,我在这方面花了更多时间,而且EGLImage总的来说。alonorbach的假设是正确的。

如果出于任何原因,驱动程序无法从提供的 中创建纹理兄弟EGLImage,则返回相当模糊GL_INVALID_OPERATION的。我的印象是,如果我能够创建一个有效的EGLImage(即不是一个EGL_NO_IMAGE_KHR)并且支持适当的扩展,我将能够使用渲染缓冲区或纹理兄弟(in GL_OES_EGL_image)绑定到相同的扩展。当然不是这样。它似乎也因设备而异。我能够让这个在NVidia Tegra单位上工作,但不能在Adreno 320.

这是否意味着不可能可靠地使用 EGLImages Android?不完全的。特别是对于我遇到的问题,我能够通过在扩展中指定源渲染缓冲区的内部格式(参数 2 到) ,将纹理兄弟绑定到EGLImage使用渲染缓冲区源创建的纹理。这不太理想,但证明了源和目标兄弟的内部格式必须以某种方式匹配,并且在不匹配的情况下,驱动程序没有义务适应变化并且可以自由放弃。GL_RGBA8_OESGL_OES_rgb8_rgba8glRenderbufferStorage

尝试EGLImage成功使用 s 时(至少通常在 上Android)的另一个熵来源是EGLImages 本身的创建方式。EGLImage我发现使用扩展EGL_NATIVE_BUFFER_ANDROID中指定的目标创建一个要可靠得多。EGL_ANDROID_image_native_buffer如果此类扩展可用于您的平台,强烈建议以备用方式使用它们。

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

我仍在发现极端情况和优化,并将根据发现更新此答案。

于 2014-06-10T04:40:49.097 回答