From 26c9ad7f0642e2612e217b702e1a5eebd49c0f60 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 15 May 2020 19:28:36 -0700 Subject: [PATCH] Use eglGetProcAddress() for all GLES 2.0 extensions --- .../video/ffmpeg-renderers/egl_extensions.cpp | 2 - .../video/ffmpeg-renderers/eglvid.cpp | 66 +++++++++++++------ app/streaming/video/ffmpeg-renderers/eglvid.h | 10 ++- 3 files changed, 54 insertions(+), 24 deletions(-) diff --git a/app/streaming/video/ffmpeg-renderers/egl_extensions.cpp b/app/streaming/video/ffmpeg-renderers/egl_extensions.cpp index 571531e8..a63a2974 100644 --- a/app/streaming/video/ffmpeg-renderers/egl_extensions.cpp +++ b/app/streaming/video/ffmpeg-renderers/egl_extensions.cpp @@ -1,6 +1,4 @@ // vim: noai:ts=4:sw=4:softtabstop=4:expandtab -#define GL_GLEXT_PROTOTYPES - #include "renderer.h" #include diff --git a/app/streaming/video/ffmpeg-renderers/eglvid.cpp b/app/streaming/video/ffmpeg-renderers/eglvid.cpp index 70a573cc..5a26a9b1 100644 --- a/app/streaming/video/ffmpeg-renderers/eglvid.cpp +++ b/app/streaming/video/ffmpeg-renderers/eglvid.cpp @@ -1,6 +1,4 @@ // vim: noai:ts=4:sw=4:softtabstop=4:expandtab -#define GL_GLEXT_PROTOTYPES - #include "eglvid.h" #include "path.h" @@ -13,7 +11,6 @@ #include #include -#include #include #include #include @@ -53,7 +50,10 @@ EGLRenderer::EGLRenderer(IFFmpegRenderer *backendRenderer) m_VAO(0), m_ColorSpace(AVCOL_SPC_NB), m_ColorFull(false), - EGLImageTargetTexture2DOES(nullptr), + m_glEGLImageTargetTexture2DOES(nullptr), + m_glGenVertexArraysOES(nullptr), + m_glBindVertexArrayOES(nullptr), + m_glDeleteVertexArraysOES(nullptr), m_DummyRenderer(nullptr) { SDL_assert(backendRenderer); @@ -65,12 +65,16 @@ EGLRenderer::~EGLRenderer() if (m_Context) { // Reattach the GL context to the main thread for destruction SDL_GL_MakeCurrent(m_Window, m_Context); - if (m_ShaderProgram) + if (m_ShaderProgram) { glDeleteProgram(m_ShaderProgram); - if (m_VAO) - glDeleteVertexArrays(1, &m_VAO); - if (m_DummyRenderer) + } + if (m_VAO) { + SDL_assert(m_glDeleteVertexArraysOES != nullptr); + m_glDeleteVertexArraysOES(1, &m_VAO); + } + if (m_DummyRenderer) { SDL_DestroyRenderer(m_DummyRenderer); + } SDL_GL_DeleteContext(m_Context); } } @@ -258,19 +262,41 @@ bool EGLRenderer::initialize(PDECODER_PARAMETERS params) return false; } - const EGLExtensions egl_extensions(m_EGLDisplay); - if (!egl_extensions.isSupported("EGL_KHR_image_base") && - !egl_extensions.isSupported("EGL_KHR_image")) { - EGL_LOG(Error, "KHR_image unsupported"); + const EGLExtensions eglExtensions(m_EGLDisplay); + if (!eglExtensions.isSupported("EGL_KHR_image_base") && + !eglExtensions.isSupported("EGL_KHR_image")) { + EGL_LOG(Error, "EGL_KHR_image unsupported"); + return false; + } + else if (!SDL_GL_ExtensionSupported("GL_OES_EGL_image")) { + EGL_LOG(Error, "GL_OES_EGL_image unsupported"); return false; } - if (!m_Backend->initializeEGL(m_EGLDisplay, egl_extensions)) + if (!m_Backend->initializeEGL(m_EGLDisplay, eglExtensions)) return false; - if (!(EGLImageTargetTexture2DOES = (EGLImageTargetTexture2DOES_t)eglGetProcAddress("glEGLImageTargetTexture2DOES"))) { + if (!(m_glEGLImageTargetTexture2DOES = (typeof(m_glEGLImageTargetTexture2DOES))eglGetProcAddress("glEGLImageTargetTexture2DOES"))) { EGL_LOG(Error, - "EGL: cannot retrieve `EGLImageTargetTexture2DOES` address"); + "EGL: cannot retrieve `glEGLImageTargetTexture2DOES` address"); + return false; + } + + // Vertex arrays are an extension on OpenGL ES 2.0 + if (SDL_GL_ExtensionSupported("GL_OES_vertex_array_object")) { + m_glGenVertexArraysOES = (typeof(m_glGenVertexArraysOES))eglGetProcAddress("glGenVertexArraysOES"); + m_glBindVertexArrayOES = (typeof(m_glBindVertexArrayOES))eglGetProcAddress("glBindVertexArrayOES"); + m_glDeleteVertexArraysOES = (typeof(m_glDeleteVertexArraysOES))eglGetProcAddress("glDeleteVertexArraysOES"); + } + else { + // They are included in OpenGL ES 3.0 as part of the standard + m_glGenVertexArraysOES = (typeof(m_glGenVertexArraysOES))eglGetProcAddress("glGenVertexArrays"); + m_glBindVertexArrayOES = (typeof(m_glBindVertexArrayOES))eglGetProcAddress("glBindVertexArray"); + m_glDeleteVertexArraysOES = (typeof(m_glDeleteVertexArraysOES))eglGetProcAddress("glDeleteVertexArrays"); + } + + if (!m_glGenVertexArraysOES || !m_glBindVertexArrayOES || !m_glDeleteVertexArraysOES) { + EGL_LOG(Error, "Failed to find VAO functions"); return false; } @@ -397,11 +423,11 @@ bool EGLRenderer::specialize() { glUseProgram(m_ShaderProgram); unsigned int VBO, EBO; - glGenVertexArrays(1, &m_VAO); + m_glGenVertexArraysOES(1, &m_VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); - glBindVertexArray(m_VAO); + m_glBindVertexArrayOES(m_VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof (vertices), vertices, GL_STATIC_DRAW); @@ -415,7 +441,7 @@ bool EGLRenderer::specialize() { glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + m_glBindVertexArrayOES(0); int yuvmatLocation = glGetUniformLocation(m_ShaderProgram, "yuvmat"); glUniformMatrix3fv(yuvmatLocation, 1, GL_FALSE, getColorMatrix()); @@ -479,7 +505,7 @@ void EGLRenderer::renderFrame(AVFrame* frame) for (ssize_t i = 0; i < plane_count; ++i) { glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_EXTERNAL_OES, m_Textures[i]); - EGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, imgs[i]); + m_glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, imgs[i]); } } else { // TODO: load texture for SW decoding ? @@ -489,7 +515,7 @@ void EGLRenderer::renderFrame(AVFrame* frame) glClear(GL_COLOR_BUFFER_BIT); glUseProgram(m_ShaderProgram); - glBindVertexArray(m_VAO); + m_glBindVertexArrayOES(m_VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); SDL_GL_SwapWindow(m_Window); diff --git a/app/streaming/video/ffmpeg-renderers/eglvid.h b/app/streaming/video/ffmpeg-renderers/eglvid.h index b843abb4..f0f8a9f7 100644 --- a/app/streaming/video/ffmpeg-renderers/eglvid.h +++ b/app/streaming/video/ffmpeg-renderers/eglvid.h @@ -2,6 +2,9 @@ #include "renderer.h" +#include +#include + class EGLRenderer : public IFFmpegRenderer { public: EGLRenderer(IFFmpegRenderer *backendRenderer); @@ -13,7 +16,6 @@ public: virtual bool isPixelFormatSupported(int videoFormat, enum AVPixelFormat pixelFormat) override; private: - using EGLImageTargetTexture2DOES_t = void (*)(int, void *); bool compileShader(); bool specialize(); @@ -30,6 +32,10 @@ private: unsigned int m_VAO; int m_ColorSpace; bool m_ColorFull; - EGLImageTargetTexture2DOES_t EGLImageTargetTexture2DOES; + PFNGLEGLIMAGETARGETTEXTURE2DOESPROC m_glEGLImageTargetTexture2DOES; + PFNGLGENVERTEXARRAYSOESPROC m_glGenVertexArraysOES; + PFNGLBINDVERTEXARRAYOESPROC m_glBindVertexArrayOES; + PFNGLDELETEVERTEXARRAYSOESPROC m_glDeleteVertexArraysOES; + SDL_Renderer *m_DummyRenderer; };