From be426ad76c3e486f1364dd292cf8e1c633c80e91 Mon Sep 17 00:00:00 2001
From: Vincent Davis Jr <vince@underview.tech>
Date: Thu, 8 Dec 2022 10:39:47 -0600
Subject: [PATCH] libavdevice: opengl_enc.c update dynamic function loader

Upstream-Status: Inappropriate

RPI-Distro repo clones original ffmpeg and applies patches to enable
raspiberry pi support.

For meta-raspberrypi ffmpeg builds, when opengl
is enabled do_compile will fail. Reasion is that
glGetProcAddress is undefined in either GLES2/gl2.h
or GLES2/gl2ext.h.

define SelectedGetProcAddress to SDL_GL_GetProcAddress
if sdl2 is included. If not included, define function
pointers at compile time versus runtime.

Signed-off-by: Vincent Davis Jr <vince@underview.tech>
---
 libavdevice/opengl_enc.c | 44 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 40 insertions(+), 4 deletions(-)

diff --git a/libavdevice/opengl_enc.c b/libavdevice/opengl_enc.c
index 2bdb8da7..eabc1bf8 100644
--- a/libavdevice/opengl_enc.c
+++ b/libavdevice/opengl_enc.c
@@ -37,12 +37,13 @@
 #include <OpenGL/gl3.h>
 #elif HAVE_ES2_GL_H
 #include <ES2/gl.h>
-#else
-#include <GL/gl.h>
-#include <GL/glext.h>
 #endif
 #if HAVE_GLXGETPROCADDRESS
 #include <GL/glx.h>
+#else
+#define GL_GLEXT_PROTOTYPES
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
 #endif
 
 #if CONFIG_SDL2
@@ -493,8 +494,14 @@ static int av_cold opengl_load_procedures(OpenGLContext *opengl)
 
 #if HAVE_GLXGETPROCADDRESS
 #define SelectedGetProcAddress glXGetProcAddress
+#define CAN_DYNAMIC_LOAD 1
 #elif HAVE_WGLGETPROCADDRESS
 #define SelectedGetProcAddress wglGetProcAddress
+#elif CONFIG_SDL2
+#define SelectedGetProcAddress SDL_GL_GetProcAddress
+#define CAN_DYNAMIC_LOAD 1
+#else
+#define CAN_DYNAMIC_LOAD 0
 #endif
 
 #define LOAD_OPENGL_FUN(name, type) \
@@ -504,7 +511,8 @@ static int av_cold opengl_load_procedures(OpenGLContext *opengl)
         return AVERROR(ENOSYS); \
     }
 
-#if CONFIG_SDL2
+#if CAN_DYNAMIC_LOAD
+#if CONFIG_SDL2 
     if (!opengl->no_window)
         return opengl_sdl_load_procedures(opengl);
 #endif
@@ -534,9 +542,37 @@ static int av_cold opengl_load_procedures(OpenGLContext *opengl)
     LOAD_OPENGL_FUN(glGetShaderInfoLog, FF_PFNGLGETSHADERINFOLOGPROC)
     LOAD_OPENGL_FUN(glEnableVertexAttribArray, FF_PFNGLENABLEVERTEXATTRIBARRAYPROC)
     LOAD_OPENGL_FUN(glVertexAttribPointer, FF_PFNGLVERTEXATTRIBPOINTERPROC)
+#else
+    procs->glActiveTexture = glActiveTexture;
+    procs->glGenBuffers = glGenBuffers;
+    procs->glDeleteBuffers = glDeleteBuffers;
+    procs->glBufferData = glBufferData;
+    procs->glBindBuffer = glBindBuffer;
+    procs->glGetAttribLocation = glGetAttribLocation;
+    procs->glGetUniformLocation = glGetUniformLocation;
+    procs->glUniform1f = glUniform1f;
+    procs->glUniform1i = glUniform1i;
+    procs->glUniformMatrix4fv = glUniformMatrix4fv;
+    procs->glCreateProgram = glCreateProgram;
+    procs->glDeleteProgram = glDeleteProgram;
+    procs->glUseProgram = glUseProgram;
+    procs->glLinkProgram = glLinkProgram;
+    procs->glGetProgramiv = glGetProgramiv;
+    procs->glGetProgramInfoLog = glGetProgramInfoLog;
+    procs->glAttachShader = glAttachShader;
+    procs->glCreateShader = glCreateShader;
+    procs->glDeleteShader = glDeleteShader;
+    procs->glCompileShader = glCompileShader;
+    procs->glShaderSource = glShaderSource;
+    procs->glGetShaderiv = glGetShaderiv;
+    procs->glGetShaderInfoLog = glGetShaderInfoLog;
+    procs->glEnableVertexAttribArray = glEnableVertexAttribArray;
+    procs->glVertexAttribPointer = (FF_PFNGLVERTEXATTRIBPOINTERPROC) glVertexAttribPointer;
+#endif
 
     return 0;
 
+#undef CAN_DYNAMIC_LOAD
 #undef SelectedGetProcAddress
 #undef LOAD_OPENGL_FUN
 }
-- 
2.38.1

