EGLImages с renderbuffer как родной брат и текстура в качестве целевого родственника

Я пытаюсь настроить EGLImage где исходный брат является GL_RENDERBUFFER ( EGLClientBuffer указан как аргумент eglCreateImageKHR ). В другом контексте я создаю GL_TEXTURE_2D и GL_TEXTURE_2D его как целевого родственника EGLImage с помощью glEGLImageTargetTexture2DOES . К сожалению, последний вызов приводит к GL_INVALID_OPERATION . Если исходным и целевым братьями и сестрами являются GL_TEXTURE_2D , настройка работает как шарм.

Из моего чтения спецификации это должна быть допустимая операция. Возможно также, что у моего уменьшенного тестового примера есть еще одна ортогональная проблема. Хотя я сомневаюсь в этом, так как настройка работает нормально, когда исходным и целевым братьями и сестрами являются GL_TEXTURE_2D . Однако, если это было проблемой (и такое использование EGLImage s было допустимым), какая может быть возможная проблема, которая может привести к 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_image , EGL_KHR_image_base , EGL_KHR_gl_texture_2D_image , EGL_KHR_gl_renderbuffer_image и т. Д.).
  • Я также понимаю, что во внутреннем формате EGLImage могут быть различия во время использования GL_RENDERBUFFER vs GL_TEXTURE_2D в качестве источника. Поэтому я попытался использовать расширение OES_EGL_image_external сначала с текстурой в качестве источника, а затем с помощью renderbuffer. Текстура работает отлично, как всегда, то же GL_INVALID_OPERATION для рендеринга. Использование внешних изображений при привязке не влияет на генерируемую ошибку.
  • Ошибки GL и EGL проверяются после каждого вызова.

Боюсь, это может быть законная точка отказа. Ошибка GL_INVALID_OPERATION может возникнуть, если драйвер не может создать текстуру из поставляемого EGLImage.

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

Если GL не может указать объект текстуры, используя поставляемый eglImageOES (если, например, относится к мультисэмплированному eglImageOES), генерируется ошибка INVALID_OPERATION.

Вы вызываете glFramebufferRenderbufferOES с помощью renderbuffer перед передачей его eglCreateImageKHR ? Если да, предложите вам попробовать настроить, как создать свой рендерингбуфер (например, попробуйте другой формат, размер), чтобы определить, какие условия вы получите эту ошибку.

Я потратил намного больше времени на это, и EGLImage в целом после EGLImage с этой проблемой. Гипотеза алонорбаха была правильной.

Если по какой-либо причине драйвер не может создать родной брат текстуры из поставляемого EGLImage , тогда GL_INVALID_OPERATION довольно неоднозначное GL_INVALID_OPERATION . У меня создалось впечатление, что если бы мне удалось создать допустимый EGLImage (т. EGLImage Не EGL_NO_IMAGE_KHR ) и соответствующие расширения были поддержаны, я мог бы привязываться к ним с использованием либо rendebuffer, либо брака текстуры (в GL_OES_EGL_image ). Это, конечно, не так. Похоже, он также сильно отличается от устройства к устройству. Я смог получить эту работу на устройствах NVidia Tegra но не на Adreno 320 .

Означает ли это, что невозможно надежно использовать EGLImages на Android ? Не совсем. В частности, для проблемы, с которой я EGLImage , мне удалось связать родной текстуры с EGLImage созданным с использованием источника renderbuffer, указав GL_RGBA8_OES в расширении GL_OES_rgb8_rgba8 как внутренний формат исходного рендеринга (аргумент 2 – glRenderbufferStorage ). Это меньше, чем идеально, но доказывает, что каким-то образом должны соответствовать внутренние форматы исходных и целевых братьев и сестер, а в случае несоответствия водитель не обязан вмещать вариацию и может отказаться.

Другим источником энтропии при попытке использовать EGLImage с успехом (по крайней мере в целом на Android ) является способ EGLImage самих EGLImage . Я обнаружил, что было гораздо надежнее создать EGLImage с использованием цели EGL_NATIVE_BUFFER_ANDROID указанной в расширении EGL_ANDROID_image_native_buffer . Если такие расширения доступны для вашей платформы, весьма целесообразно использовать их в резервном режиме.

Таким образом, решение, которое, похоже, работает надежно для меня, похоже, заключается в том, чтобы сначала попытаться создать действительный EGLImage используя любые доступные расширения в резервном режиме. Затем, используя этот EGLImage попробуйте EGLImage к целевому EGLImage . Если эта пара операций не дает ошибок, то эта пара EGLImage / TargetKind поддерживается на этом устройстве и может использоваться для последующих операций. Если какая-либо операция не удалась, проверяется следующий элемент в резервной цепочке. Если все остальное не срабатывает, скорее всего, будет существовать решение, которое не использует EGLImage . Я еще не сталкивался с таким устройством Android (пальцы скрещены)

Я все еще обнаруживаю угловые случаи и оптимизацию и буду держать этот ответ в курсе результатов.