summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-01-21 20:32:42 +0100
committerwm4 <wm4@nowhere>2015-01-21 20:32:42 +0100
commite34957940b5012dba23616469fb5aec56fcde5ee (patch)
tree460acc027f1cdae8814992ec6f4a6f3a63de37c7
parentc15697477fca133b69cad58ad2d43b94b994f6fd (diff)
downloadmpv-e34957940b5012dba23616469fb5aec56fcde5ee.tar.bz2
mpv-e34957940b5012dba23616469fb5aec56fcde5ee.tar.xz
vo_opengl: cleanups after vo_opengl_old removal
Don't load all the legacy functions (including ancient extensions). Slightly simplify function loader and context creation, now that legacy GL doesn't need to be handled. Remove the code for drawing OSD in legacy mode. Remove all the header hacks, which were meant for ancient OpenGL headers which didn't even support things like OpenGL 1.3. Instead, adjust the GLX check to make sure we get both OpenGL 3x and 2.1 symbols. For win32 and OSX, we assume that the user has the latest headers anyway. For wayland, we hope that things somehow go right.
-rw-r--r--video/out/gl_common.c230
-rw-r--r--video/out/gl_common.h44
-rw-r--r--video/out/gl_header_fixes.h117
-rw-r--r--video/out/gl_osd.c103
-rw-r--r--video/out/gl_osd.h6
-rw-r--r--video/out/gl_video.c4
-rw-r--r--video/out/gl_w32.c3
-rw-r--r--video/out/gl_x11.c9
-rw-r--r--video/out/vo_opengl.c2
-rw-r--r--waftools/fragments/gl_x11.c2
10 files changed, 75 insertions, 445 deletions
diff --git a/video/out/gl_common.c b/video/out/gl_common.c
index 3eeef29ea5..9384bc9e18 100644
--- a/video/out/gl_common.c
+++ b/video/out/gl_common.c
@@ -83,22 +83,12 @@ static int get_alignment(int stride)
return 1;
}
-// adjusts the GL_UNPACK_ALIGNMENT to fit the stride.
-void glAdjustAlignment(GL *gl, int stride)
-{
- GLint gl_alignment = get_alignment(stride);
- gl->PixelStorei(GL_UNPACK_ALIGNMENT, gl_alignment);
- gl->PixelStorei(GL_PACK_ALIGNMENT, gl_alignment);
-}
-
struct feature {
int id;
const char *name;
};
static const struct feature features[] = {
- {MPGL_CAP_GL_LEGACY, "Legacy OpenGL"},
- {MPGL_CAP_GL21, "OpenGL 2.1+ (or subset)"},
{MPGL_CAP_FB, "Framebuffers"},
{MPGL_CAP_VAO, "VAOs"},
{MPGL_CAP_SRGB_TEX, "sRGB textures"},
@@ -146,91 +136,62 @@ struct gl_functions {
int ver_removed; // removed as required function (no replacement)
int ver_es_core; // introduced as required GL ES function
int ver_es_removed; // removed as required function (no replacement)
- bool partial_ok; // loading only some functions is ok
const struct gl_function *functions;
};
-#define MAX_FN_COUNT 50 // max functions per gl_functions section
+#define MAX_FN_COUNT 100 // max functions per gl_functions section
// Note: to keep the number of sections low, some functions are in multiple
// sections (if there are tricky combinations of GL/ES versions)
static const struct gl_functions gl_functions[] = {
- // GL functions which are always available anywhere at least since 1.1/ES2.0
- {
- .ver_core = 110,
- .ver_es_core = 200,
- .functions = (const struct gl_function[]) {
- DEF_FN(BlendFunc),
- DEF_FN(Clear),
- DEF_FN(ClearColor),
- DEF_FN(ColorMask),
- DEF_FN(DeleteTextures),
- DEF_FN(DepthMask),
- DEF_FN(Disable),
- DEF_FN(DrawArrays),
- DEF_FN(Enable),
- DEF_FN(Finish),
- DEF_FN(Flush),
- DEF_FN(GenTextures),
- DEF_FN(GetBooleanv),
- DEF_FN(GetError),
- DEF_FN(GetIntegerv),
- DEF_FN(GetString),
- DEF_FN(PixelStorei),
- DEF_FN(ReadPixels),
- DEF_FN(TexImage2D),
- DEF_FN(TexParameteri),
- DEF_FN(TexParameterf),
- DEF_FN(TexParameterfv),
- DEF_FN(TexSubImage2D),
- DEF_FN(Viewport),
- {0}
- },
- },
- // GL 1.1+ desktop only
+ // GL 2.1+ desktop and GLES 2.0+ (anything we support)
+ // Probably all of these are in GL 2.0 too, but we require GLSL 120.
{
- .ver_core = 110,
- .provides = MPGL_CAP_ROW_LENGTH,
- .functions = (const struct gl_function[]) {
- DEF_FN(DrawBuffer),
- DEF_FN(GetTexImage),
- DEF_FN(GetTexLevelParameteriv),
- DEF_FN(ReadBuffer),
- DEF_FN(TexEnvi),
- DEF_FN(TexImage1D),
- {0}
- },
- },
- // GL 2.1+ functions (also: GLSL 120 shaders)
- // All of the listed functions are also in GL 2.0 and ES 2.0
- {
- .ver_core = 210, // not 200, so that we're guaranteed GLSL 120
+ .ver_core = 210,
.ver_es_core = 200,
- .provides = MPGL_CAP_GL21,
.functions = (const struct gl_function[]) {
DEF_FN(ActiveTexture),
DEF_FN(AttachShader),
DEF_FN(BindAttribLocation),
DEF_FN(BindBuffer),
DEF_FN(BindTexture),
+ DEF_FN(BlendFuncSeparate),
DEF_FN(BufferData),
+ DEF_FN(Clear),
+ DEF_FN(ClearColor),
DEF_FN(CompileShader),
DEF_FN(CreateProgram),
DEF_FN(CreateShader),
DEF_FN(DeleteBuffers),
DEF_FN(DeleteProgram),
DEF_FN(DeleteShader),
+ DEF_FN(DeleteTextures),
+ DEF_FN(Disable),
DEF_FN(DisableVertexAttribArray),
+ DEF_FN(DrawArrays),
+ DEF_FN(Enable),
DEF_FN(EnableVertexAttribArray),
- DEF_FN(GetAttribLocation),
+ DEF_FN(Finish),
+ DEF_FN(Flush),
DEF_FN(GenBuffers),
- DEF_FN(GetShaderInfoLog),
- DEF_FN(GetShaderiv),
+ DEF_FN(GenTextures),
+ DEF_FN(GetBooleanv),
+ DEF_FN(GetAttribLocation),
+ DEF_FN(GetError),
+ DEF_FN(GetIntegerv),
DEF_FN(GetProgramInfoLog),
DEF_FN(GetProgramiv),
+ DEF_FN(GetShaderInfoLog),
+ DEF_FN(GetShaderiv),
+ DEF_FN(GetString),
DEF_FN(GetUniformLocation),
DEF_FN(LinkProgram),
+ DEF_FN(PixelStorei),
+ DEF_FN(ReadPixels),
DEF_FN(ShaderSource),
+ DEF_FN(TexImage2D),
+ DEF_FN(TexParameteri),
+ DEF_FN(TexSubImage2D),
DEF_FN(Uniform1f),
DEF_FN(Uniform2f),
DEF_FN(Uniform3f),
@@ -239,23 +200,28 @@ static const struct gl_functions gl_functions[] = {
DEF_FN(UniformMatrix3fv),
DEF_FN(UseProgram),
DEF_FN(VertexAttribPointer),
- // Added in GL 1.4 and ES 2.0, but vo_opengl_old doesn't need it
- DEF_FN(BlendFuncSeparate),
- {0},
+ DEF_FN(Viewport),
+ {0}
},
},
- // GL 2.1+ desktop only, GLSL 120
+ // GL 2.1+ desktop only (and GLSL 120 shaders)
{
.ver_core = 210,
- .provides = MPGL_CAP_3D_TEX | MPGL_CAP_1ST_CLASS_ARRAYS,
+ .provides = MPGL_CAP_ROW_LENGTH | MPGL_CAP_3D_TEX |
+ MPGL_CAP_1ST_CLASS_ARRAYS,
.functions = (const struct gl_function[]) {
+ DEF_FN(DrawBuffer),
+ DEF_FN(GetTexImage),
+ DEF_FN(GetTexLevelParameteriv),
DEF_FN(MapBuffer),
+ DEF_FN(ReadBuffer),
+ DEF_FN(TexImage1D),
DEF_FN(TexImage3D),
DEF_FN(UnmapBuffer),
{0}
},
},
- // GL+ES 3.x core only functions.
+ // GL 3.0+ and ES 3.x core only functions.
{
.ver_core = 300,
.ver_es_core = 300,
@@ -364,77 +330,6 @@ static const struct gl_functions gl_functions[] = {
{0},
},
},
- // GL legacy functions in GL 1.x - 2.x, removed from GL 3.x
- {
- .ver_core = 110,
- .ver_removed = 300,
- .provides = MPGL_CAP_GL_LEGACY,
- .functions = (const struct gl_function[]) {
- DEF_FN(Begin),
- DEF_FN(End),
- DEF_FN(MatrixMode),
- DEF_FN(LoadIdentity),
- DEF_FN(Translated),
- DEF_FN(Scaled),
- DEF_FN(Ortho),
- DEF_FN(PushMatrix),
- DEF_FN(PopMatrix),
- DEF_FN(GenLists),
- DEF_FN(DeleteLists),
- DEF_FN(NewList),
- DEF_FN(EndList),
- DEF_FN(CallList),
- DEF_FN(CallLists),
- DEF_FN(Color4ub),
- DEF_FN(Color4f),
- DEF_FN(TexCoord2f),
- DEF_FN(TexCoord2fv),
- DEF_FN(Vertex2f),
- DEF_FN(VertexPointer),
- DEF_FN(ColorPointer),
- DEF_FN(TexCoordPointer),
- DEF_FN(EnableClientState),
- DEF_FN(DisableClientState),
- {0}
- },
- },
- // Loading of old extensions, which are later added to GL 2.0.
- // NOTE: actually we should be checking the extension strings: the OpenGL
- // library could provide an entry point, but not implement it.
- // But the previous code didn't do that, and nobody ever complained.
- {
- .ver_removed = 210,
- .ver_es_removed = 100,
- .partial_ok = true,
- .functions = (const struct gl_function[]) {
- DEF_FN_NAMES(GenBuffers, "glGenBuffers", "glGenBuffersARB"),
- DEF_FN_NAMES(DeleteBuffers, "glDeleteBuffers", "glDeleteBuffersARB"),
- DEF_FN_NAMES(BindBuffer, "glBindBuffer", "glBindBufferARB"),
- DEF_FN_NAMES(MapBuffer, "glMapBuffer", "glMapBufferARB"),
- DEF_FN_NAMES(UnmapBuffer, "glUnmapBuffer", "glUnmapBufferARB"),
- DEF_FN_NAMES(BufferData, "glBufferData", "glBufferDataARB"),
- DEF_FN_NAMES(ActiveTexture, "glActiveTexture", "glActiveTextureARB"),
- DEF_FN_NAMES(BindTexture, "glBindTexture", "glBindTextureARB", "glBindTextureEXT"),
- DEF_FN_NAMES(MultiTexCoord2f, "glMultiTexCoord2f", "glMultiTexCoord2fARB"),
- DEF_FN_NAMES(TexImage3D, "glTexImage3D"),
- {0}
- },
- },
- // Ancient ARB shaders.
- {
- .extension = "_program",
- .ver_removed = 300,
- .ver_es_removed = 100,
- .functions = (const struct gl_function[]) {
- DEF_FN_NAMES(GenPrograms, "glGenProgramsARB"),
- DEF_FN_NAMES(DeletePrograms, "glDeleteProgramsARB"),
- DEF_FN_NAMES(BindProgram, "glBindProgramARB"),
- DEF_FN_NAMES(ProgramString, "glProgramStringARB"),
- DEF_FN_NAMES(GetProgramivARB, "glGetProgramivARB"),
- DEF_FN_NAMES(ProgramEnvParameter4f, "glProgramEnvParameter4fARB"),
- {0}
- },
- },
// For gl_hwdec_vdpau.c
// http://www.opengl.org/registry/specs/NV/vdpau_interop.txt
{
@@ -495,7 +390,7 @@ void mpgl_load_functions2(GL *gl, void *(*get_fn)(void *ctx, const char *n),
gl->GetString = get_fn(fn_ctx, "glGetString");
if (!gl->GetString) {
mp_err(log, "Can't load OpenGL functions.\n");
- return;
+ goto error;
}
int major = 0, minor = 0;
@@ -514,7 +409,7 @@ void mpgl_load_functions2(GL *gl, void *(*get_fn)(void *ctx, const char *n),
gl->version = 0;
if (gl->es < 200) {
mp_fatal(log, "At least GLESv2 required.\n");
- return;
+ goto error;
}
}
@@ -536,7 +431,7 @@ void mpgl_load_functions2(GL *gl, void *(*get_fn)(void *ctx, const char *n),
gl->GetIntegerv = get_fn(fn_ctx, "glGetIntegerv");
if (!(gl->GetStringi && gl->GetIntegerv))
- return;
+ goto error;
GLint exts;
gl->GetIntegerv(GL_NUM_EXTENSIONS, &exts);
@@ -587,9 +482,6 @@ void mpgl_load_functions2(GL *gl, void *(*get_fn)(void *ctx, const char *n),
if (section->extension && strstr(gl->extensions, section->extension))
exists = true;
- if (section->partial_ok)
- exists = true; // possibly
-
exists |= must_exist;
if (!exists)
continue;
@@ -608,24 +500,22 @@ void mpgl_load_functions2(GL *gl, void *(*get_fn)(void *ctx, const char *n),
}
if (!ptr) {
all_loaded = false;
- if (!section->partial_ok) {
- mp_warn(log, "Required function '%s' not "
- "found for %s OpenGL %d.%d.\n", fn->funcnames[0],
- section->extension ? section->extension : "builtin",
- MPGL_VER_GET_MAJOR(ver_core),
- MPGL_VER_GET_MINOR(ver_core));
- if (must_exist) {
- gl->mpgl_caps = 0;
- return;
- }
- break;
+ mp_warn(log, "Required function '%s' not "
+ "found for %s OpenGL %d.%d.\n", fn->funcnames[0],
+ section->extension ? section->extension : "builtin",
+ MPGL_VER_GET_MAJOR(ver_core),
+ MPGL_VER_GET_MINOR(ver_core));
+ if (must_exist) {
+ gl->mpgl_caps = 0;
+ goto error;
}
+ break;
}
assert(i < MAX_FN_COUNT);
loaded[i] = ptr;
}
- if (all_loaded || section->partial_ok) {
+ if (all_loaded) {
gl->mpgl_caps |= section->provides;
for (int i = 0; fnlist && fnlist[i].funcnames[0]; i++) {
const struct gl_function *fn = &fnlist[i];
@@ -669,6 +559,12 @@ void mpgl_load_functions2(GL *gl, void *(*get_fn)(void *ctx, const char *n),
// Provided for simpler handling if no framebuffer support is available.
if (!gl->BindFramebuffer)
gl->BindFramebuffer = &dummy_glBindFramebuffer;
+ return;
+
+error:
+ gl->version = 0;
+ gl->es = 0;
+ gl->mpgl_caps = 0;
}
static void *get_procaddr_wrapper(void *ctx, const char *name)
@@ -715,7 +611,6 @@ int glFmt2bpp(GLenum format, GLenum type)
case GL_LUMINANCE:
case GL_ALPHA:
return component_size;
- case GL_YCBCR_MESA:
case GL_RGB_422_APPLE:
return 2;
case GL_RGB:
@@ -945,26 +840,19 @@ static MPGLContext *mpgl_create(struct vo *vo, const char *backend_name)
return ctx;
}
-MPGLContext *mpgl_init(struct vo *vo, const char *backend_name,
- int gl_flavor, int vo_flags)
+MPGLContext *mpgl_init(struct vo *vo, const char *backend_name, int vo_flags)
{
MPGLContext *ctx = mpgl_create(vo, backend_name);
if (!ctx)
goto cleanup;
- // A bit strange; but <300 triggers legacy context creation in mpv code.
- ctx->requested_gl_version = gl_flavor < 210 ? 210 : 300;
+ ctx->requested_gl_version = 300;
if (!ctx->config_window(ctx, vo_flags | VOFLAG_HIDDEN))
goto cleanup;
- if (gl_flavor >= 210 && !(ctx->gl->mpgl_caps & MPGL_CAP_GL21)) {
- MP_WARN(ctx->vo, "At least OpenGL 2.1 required.\n");
- goto cleanup;
- } else if (gl_flavor < 210 && !(ctx->gl->mpgl_caps & MPGL_CAP_GL_LEGACY)) {
- MP_WARN(ctx->vo, "OpenGL context creation failed!\n");
+ if (!ctx->gl->version && !ctx->gl->es)
goto cleanup;
- }
if (ctx->gl->es && vo->probing) {
MP_INFO(ctx->vo, "Skipping experimental GLES support (use --vo=opengl).\n");
diff --git a/video/out/gl_common.h b/video/out/gl_common.h
index 92ba81a249..81437b0852 100644
--- a/video/out/gl_common.h
+++ b/video/out/gl_common.h
@@ -55,7 +55,6 @@
struct GL;
typedef struct GL GL;
-void glAdjustAlignment(GL *gl, int stride);
int glFmt2bpp(GLenum format, GLenum type);
void glUploadTex(GL *gl, GLenum target, GLenum format, GLenum type,
const void *dataptr, int stride,
@@ -68,8 +67,6 @@ void glCheckError(GL *gl, struct mp_log *log, const char *info);
mp_image_t *glGetWindowScreenshot(GL *gl);
enum {
- MPGL_CAP_GL_LEGACY = (1 << 1), // GL 1.1 (excluding 3.x)
- MPGL_CAP_GL21 = (1 << 3), // GL 2.1+ (excluding legacy)
MPGL_CAP_ROW_LENGTH = (1 << 4), // GL_[UN]PACK_ROW_LENGTH
MPGL_CAP_FB = (1 << 5),
MPGL_CAP_VAO = (1 << 6),
@@ -142,8 +139,7 @@ bool mpgl_is_thread_safe(MPGLContext *ctx);
// gl_flavor: 110 for legacy GL, 210 for GL 2.1 or 3.x core
// flags: passed to the backend's create window function
// Returns success.
-MPGLContext *mpgl_init(struct vo *vo, const char *backend_name,
- int gl_flavor, int vo_flags);
+MPGLContext *mpgl_init(struct vo *vo, const char *backend_name, int vo_flags);
void mpgl_uninit(MPGLContext *ctx);
// flags: passed to the backend function
@@ -184,26 +180,10 @@ struct GL {
int mpgl_caps; // Bitfield of MPGL_CAP_* constants
bool debug_context; // use of e.g. GLX_CONTEXT_DEBUG_BIT_ARB
- void (GLAPIENTRY *Begin)(GLenum);
- void (GLAPIENTRY *End)(void);
void (GLAPIENTRY *Viewport)(GLint, GLint, GLsizei, GLsizei);
- void (GLAPIENTRY *MatrixMode)(GLenum);
- void (GLAPIENTRY *LoadIdentity)(void);
- void (GLAPIENTRY *Translated)(double, double, double);
- void (GLAPIENTRY *Scaled)(double, double, double);
- void (GLAPIENTRY *Ortho)(double, double, double, double, double,double);
- void (GLAPIENTRY *PushMatrix)(void);
- void (GLAPIENTRY *PopMatrix)(void);
void (GLAPIENTRY *Clear)(GLbitfield);
- GLuint (GLAPIENTRY *GenLists)(GLsizei);
- void (GLAPIENTRY *DeleteLists)(GLuint, GLsizei);
- void (GLAPIENTRY *NewList)(GLuint, GLenum);
- void (GLAPIENTRY *EndList)(void);
- void (GLAPIENTRY *CallList)(GLuint);
- void (GLAPIENTRY *CallLists)(GLsizei, GLenum, const GLvoid *);
void (GLAPIENTRY *GenTextures)(GLsizei, GLuint *);
void (GLAPIENTRY *DeleteTextures)(GLsizei, const GLuint *);
- void (GLAPIENTRY *TexEnvi)(GLenum, GLenum, GLint);
void (GLAPIENTRY *Color4ub)(GLubyte, GLubyte, GLubyte, GLubyte);
void (GLAPIENTRY *Color4f)(GLfloat, GLfloat, GLfloat, GLfloat);
void (GLAPIENTRY *ClearColor)(GLclampf, GLclampf, GLclampf, GLclampf);
@@ -211,8 +191,6 @@ struct GL {
void (GLAPIENTRY *Disable)(GLenum);
const GLubyte *(GLAPIENTRY * GetString)(GLenum);
void (GLAPIENTRY *DrawBuffer)(GLenum);
- void (GLAPIENTRY *DepthMask)(GLboolean);
- void (GLAPIENTRY *BlendFunc)(GLenum, GLenum);
void (GLAPIENTRY *BlendFuncSeparate)(GLenum, GLenum, GLenum, GLenum);
void (GLAPIENTRY *Flush)(void);
void (GLAPIENTRY *Finish)(void);
@@ -226,27 +204,15 @@ struct GL {
const GLvoid *);
void (GLAPIENTRY *GetTexImage)(GLenum, GLint, GLenum, GLenum, GLvoid *);
void (GLAPIENTRY *TexParameteri)(GLenum, GLenum, GLint);
- void (GLAPIENTRY *TexParameterf)(GLenum, GLenum, GLfloat);
- void (GLAPIENTRY *TexParameterfv)(GLenum, GLenum, const GLfloat *);
- void (GLAPIENTRY *TexCoord2f)(GLfloat, GLfloat);
- void (GLAPIENTRY *TexCoord2fv)(const GLfloat *);
- void (GLAPIENTRY *Vertex2f)(GLfloat, GLfloat);
void (GLAPIENTRY *GetIntegerv)(GLenum, GLint *);
void (GLAPIENTRY *GetBooleanv)(GLenum, GLboolean *);
- void (GLAPIENTRY *ColorMask)(GLboolean, GLboolean, GLboolean, GLboolean);
void (GLAPIENTRY *ReadPixels)(GLint, GLint, GLsizei, GLsizei, GLenum,
GLenum, GLvoid *);
void (GLAPIENTRY *ReadBuffer)(GLenum);
- void (GLAPIENTRY *VertexPointer)(GLint, GLenum, GLsizei, const GLvoid *);
- void (GLAPIENTRY *ColorPointer)(GLint, GLenum, GLsizei, const GLvoid *);
- void (GLAPIENTRY *TexCoordPointer)(GLint, GLenum, GLsizei, const GLvoid *);
void (GLAPIENTRY *DrawArrays)(GLenum, GLint, GLsizei);
- void (GLAPIENTRY *EnableClientState)(GLenum);
- void (GLAPIENTRY *DisableClientState)(GLenum);
GLenum (GLAPIENTRY *GetError)(void);
void (GLAPIENTRY *GetTexLevelParameteriv)(GLenum, GLint, GLenum, GLint *);
-
void (GLAPIENTRY *GenBuffers)(GLsizei, GLuint *);
void (GLAPIENTRY *DeleteBuffers)(GLsizei, const GLuint *);
void (GLAPIENTRY *BindBuffer)(GLenum, GLuint);
@@ -255,14 +221,6 @@ struct GL {
void (GLAPIENTRY *BufferData)(GLenum, intptr_t, const GLvoid *, GLenum);
void (GLAPIENTRY *ActiveTexture)(GLenum);
void (GLAPIENTRY *BindTexture)(GLenum, GLuint);
- void (GLAPIENTRY *MultiTexCoord2f)(GLenum, GLfloat, GLfloat);
- void (GLAPIENTRY *GenPrograms)(GLsizei, GLuint *);
- void (GLAPIENTRY *DeletePrograms)(GLsizei, const GLuint *);
- void (GLAPIENTRY *BindProgram)(GLenum, GLuint);
- void (GLAPIENTRY *ProgramString)(GLenum, GLenum, GLsizei, const GLvoid *);
- void (GLAPIENTRY *GetProgramivARB)(GLenum, GLenum, GLint *);
- void (GLAPIENTRY *ProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat,
- GLfloat, GLfloat);
int (GLAPIENTRY *SwapInterval)(int);
void (GLAPIENTRY *TexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei,
GLsizei, GLint, GLenum, GLenum,
diff --git a/video/out/gl_header_fixes.h b/video/out/gl_header_fixes.h
index 0a8cef9684..d7c48b3f0b 100644
--- a/video/out/gl_header_fixes.h
+++ b/video/out/gl_header_fixes.h
@@ -34,132 +34,15 @@
#endif
#endif
-#ifndef GL_TEXTURE_3D
-#define GL_TEXTURE_3D 0x806F
-#endif
-#ifndef GL_TEXTURE_WRAP_R
-#define GL_TEXTURE_WRAP_R 0x8072
-#endif
-#ifndef GL_CLAMP_TO_EDGE
-#define GL_CLAMP_TO_EDGE 0x812F
-#endif
-#ifndef GL_GENERATE_MIPMAP
-#define GL_GENERATE_MIPMAP 0x8191
-#endif
-#ifndef GL_MAX_TEXTURE_UNITS
-#define GL_MAX_TEXTURE_UNITS 0x84E2
-#endif
-#ifndef GL_TEXTURE0
-#define GL_TEXTURE0 0x84C0
-#endif
-#ifndef GL_TEXTURE1
-#define GL_TEXTURE1 0x84C1
-#endif
-#ifndef GL_TEXTURE2
-#define GL_TEXTURE2 0x84C2
-#endif
-#ifndef GL_TEXTURE3
-#define GL_TEXTURE3 0x84C3
-#endif
#ifndef GL_TEXTURE_RECTANGLE
#define GL_TEXTURE_RECTANGLE 0x84F5
#endif
-#ifndef GL_PIXEL_UNPACK_BUFFER
-#define GL_PIXEL_UNPACK_BUFFER 0x88EC
-#endif
-#ifndef GL_STREAM_DRAW
-#define GL_STREAM_DRAW 0x88E0
-#endif
-#ifndef GL_DYNAMIC_DRAW
-#define GL_DYNAMIC_DRAW 0x88E8
-#endif
-#ifndef GL_WRITE_ONLY
-#define GL_WRITE_ONLY 0x88B9
-#endif
-#ifndef GL_BGR
-#define GL_BGR 0x80E0
-#endif
-#ifndef GL_BGRA
-#define GL_BGRA 0x80E1
-#endif
-#ifndef GL_UNSIGNED_BYTE_3_3_2
-#define GL_UNSIGNED_BYTE_3_3_2 0x8032
-#endif
-#ifndef GL_UNSIGNED_BYTE_2_3_3_REV
-#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362
-#endif
-#ifndef GL_UNSIGNED_SHORT_4_4_4_4
-#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033
-#endif
-#ifndef GL_UNSIGNED_SHORT_4_4_4_4_REV
-#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
-#endif
-#ifndef GL_UNSIGNED_SHORT_5_6_5
-#define GL_UNSIGNED_SHORT_5_6_5 0x8363
-#endif
-#ifndef GL_UNSIGNED_INT_8_8_8_8
-#define GL_UNSIGNED_INT_8_8_8_8 0x8035
-#endif
-#ifndef GL_UNSIGNED_INT_8_8_8_8_REV
-#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367
-#endif
-#ifndef GL_UNSIGNED_SHORT_5_6_5_REV
-#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
-#endif
-#ifndef GL_UNSIGNED_INT_10_10_10_2
-#define GL_UNSIGNED_INT_10_10_10_2 0x8036
-#endif
-#ifndef GL_UNSIGNED_INT_2_10_10_10_REV
-#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
-#endif
-#ifndef GL_UNSIGNED_SHORT_5_5_5_1
-#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034
-#endif
-#ifndef GL_UNSIGNED_SHORT_1_5_5_5_REV
-#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
-#endif
#ifndef GL_UNSIGNED_SHORT_8_8
#define GL_UNSIGNED_SHORT_8_8 0x85BA
#endif
#ifndef GL_UNSIGNED_SHORT_8_8_REV
#define GL_UNSIGNED_SHORT_8_8_REV 0x85BB
#endif
-#ifndef GL_YCBCR_MESA
-#define GL_YCBCR_MESA 0x8757
-#endif
-#ifndef GL_RGB32F
-#define GL_RGB32F 0x8815
-#endif
-#ifndef GL_FLOAT_RGB32_NV
-#define GL_FLOAT_RGB32_NV 0x8889
-#endif
-#ifndef GL_LUMINANCE16
-#define GL_LUMINANCE16 0x8042
-#endif
-#ifndef GL_R16
-#define GL_R16 0x822A
-#endif
-#ifndef GL_UNPACK_CLIENT_STORAGE_APPLE
-#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2
-#endif
-#ifndef GL_FRAGMENT_PROGRAM
-#define GL_FRAGMENT_PROGRAM 0x8804
-#endif
-#ifndef GL_PROGRAM_FORMAT_ASCII
-#define GL_PROGRAM_FORMAT_ASCII 0x8875
-#endif
-#ifndef GL_PROGRAM_ERROR_POSITION
-#define GL_PROGRAM_ERROR_POSITION 0x864B
-#endif
-#ifndef GL_MAX_TEXTURE_IMAGE_UNITS
-#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872
-#endif
-#ifndef GL_PROGRAM_ERROR_STRING
-#define GL_PROGRAM_ERROR_STRING 0x8874
-#endif
-#ifndef GL_RGBA32F
-#define GL_RGBA32F 0x8814
-#endif
#if HAVE_GL_WIN32 && !defined(WGL_CONTEXT_MAJOR_VERSION_ARB)
/* these are supposed to be defined in wingdi.h but mingw's is too old */
diff --git a/video/out/gl_osd.c b/video/out/gl_osd.c
index 5477b24197..8a92d3ee8c 100644
--- a/video/out/gl_osd.c
+++ b/video/out/gl_osd.c
@@ -52,13 +52,7 @@ static const struct osd_fmt_entry osd_to_gl2_formats[SUBBITMAP_COUNT] = {
[SUBBITMAP_RGBA] = {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE},
};
-static const struct osd_fmt_entry osd_to_gl_legacy_formats[SUBBITMAP_COUNT] = {
- [SUBBITMAP_LIBASS] = {GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE},
- [SUBBITMAP_RGBA] = {GL_RGBA, GL_BGRA, GL_UNSIGNED_BYTE},
-};
-
-struct mpgl_osd *mpgl_osd_init(GL *gl, struct mp_log *log, struct osd_state *osd,
- bool legacy)
+struct mpgl_osd *mpgl_osd_init(GL *gl, struct mp_log *log, struct osd_state *osd)
{
GLint max_texture_size;
gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
@@ -72,9 +66,7 @@ struct mpgl_osd *mpgl_osd_init(GL *gl, struct mp_log *log, struct osd_state *osd
.scratch = talloc_zero_size(ctx, 1),
};
- if (legacy) {
- ctx->fmt_table = osd_to_gl_legacy_formats;
- } else if (gl->es >= 300) {
+ if (gl->es >= 300) {
ctx->fmt_table = osd_to_gles3_formats;
} else if (!(gl->mpgl_caps & MPGL_CAP_TEX_RG)) {
ctx->fmt_table = osd_to_gl2_formats;
@@ -257,11 +249,7 @@ void mpgl_osd_set_gl_state(struct mpgl_osd *ctx, struct mpgl_osd_part *p)
gl->Enable(GL_BLEND);
const int *factors = &blend_factors[p->format][0];
- if (gl->BlendFuncSeparate) {
- gl->BlendFuncSeparate(factors[0], factors[1], factors[2], factors[3]);
- } else {
- gl->BlendFunc(factors[0], factors[1]);
- }
+ gl->BlendFuncSeparate(factors[0], factors[1], factors[2], factors[3]);
}
void mpgl_osd_unset_gl_state(struct mpgl_osd *ctx, struct mpgl_osd_part *p)
@@ -271,88 +259,3 @@ void mpgl_osd_unset_gl_state(struct mpgl_osd *ctx, struct mpgl_osd_part *p)
gl->Disable(GL_BLEND);
gl->BindTexture(GL_TEXTURE_2D, 0);
}
-
-struct vertex {
- float position[2];
- uint8_t color[4];
- float texcoord[2];
-};
-
-static void draw_legacy_cb(void *pctx, struct sub_bitmaps *imgs)
-{
- struct mpgl_osd *ctx = pctx;
- struct mpgl_osd_part *osd = mpgl_osd_generate(ctx, imgs);
- if (!osd)
- return;
-
- if (!osd->num_vertices) {
- // 2 triangles primitives per quad = 6 vertices per quad
- // not using GL_QUADS, as it is deprecated in OpenGL 3.x and later
- osd->vertices = talloc_realloc(osd, osd->vertices, struct vertex,
- osd->packer->count * 6);
-
- struct vertex *va = osd->vertices;
- float tex_w = osd->w;
- float tex_h = osd->h;
-
- for (int n = 0; n < osd->packer->count; n++) {
- struct sub_bitmap *b = &imgs->parts[n];
- struct pos p = osd->packer->result[n];
-
- uint32_t c = imgs->format == SUBBITMAP_LIBASS
- ? b->libass.color : 0xFFFFFF00;
- uint8_t color[4] = { c >> 24, (c >> 16) & 0xff,
- (c >> 8) & 0xff, 255 - (c & 0xff) };
-
- float x0 = b->x;
- float y0 = b->y;
- float x1 = b->x + b->dw;
- float y1 = b->y + b->dh;
- float tx0 = p.x / tex_w;
- float ty0 = p.y / tex_h;
- float tx1 = (p.x + b->w) / tex_w;
- float ty1 = (p.y + b->h) / tex_h;
-
-#define COLOR_INIT {color[0], color[1], color[2], color[3]}
- struct vertex *v = &va[osd->num_vertices];
- v[0] = (struct vertex) { {x0, y0}, COLOR_INIT, {tx0, ty0} };
- v[1] = (struct vertex) { {x0, y1}, COLOR_INIT, {tx0, ty1} };
- v[2] = (struct vertex) { {x1, y0}, COLOR_INIT, {tx1, ty0} };
- v[3] = (struct vertex) { {x1, y1}, COLOR_INIT, {tx1, ty1} };
- v[4] = v[2];
- v[5] = v[1];
-#undef COLOR_INIT
- osd->num_vertices += 6;
- }
- }
-
- GL *gl = ctx->gl;
-
- struct vertex *va = osd->vertices;
- size_t stride = sizeof(va[0]);
-
- gl->VertexPointer(2, GL_FLOAT, stride, &va[0].position[0]);
- gl->ColorPointer(4, GL_UNSIGNED_BYTE, stride, &va[0].color[0]);
- gl->TexCoordPointer(2, GL_FLOAT, stride, &va[0].texcoord[0]);
-
- gl->EnableClientState(GL_VERTEX_ARRAY);
- gl->EnableClientState(GL_TEXTURE_COORD_ARRAY);
- gl->EnableClientState(GL_COLOR_ARRAY);
-
- mpgl_osd_set_gl_state(ctx, osd);
- gl->DrawArrays(GL_TRIANGLES, 0, osd->num_vertices);
- mpgl_osd_unset_gl_state(ctx, osd);
-
- gl->DisableClientState(GL_VERTEX_ARRAY);
- gl->DisableClientState(GL_TEXTURE_COORD_ARRAY);
- gl->DisableClientState(GL_COLOR_ARRAY);
-}
-
-void mpgl_osd_draw_legacy(struct mpgl_osd *ctx, double pts,
- struct mp_osd_res res)
-{
- ctx->fmt_table = osd_to_gl_legacy_formats;
- for (int n = 0; n < SUBBITMAP_COUNT; n++)
- ctx->formats[n] = ctx->fmt_table[n].type != 0;
- osd_draw(ctx->osd, res, pts, 0, ctx->formats, draw_legacy_cb, ctx);
-}
diff --git a/video/out/gl_osd.h b/video/out/gl_osd.h
index f05385b547..fce87bafe4 100644
--- a/video/out/gl_osd.h
+++ b/video/out/gl_osd.h
@@ -30,8 +30,7 @@ struct mpgl_osd {
void *scratch;
};
-struct mpgl_osd *mpgl_osd_init(GL *gl, struct mp_log *log, struct osd_state *osd,
- bool legacy);
+struct mpgl_osd *mpgl_osd_init(GL *gl, struct mp_log *log, struct osd_state *osd);
void mpgl_osd_destroy(struct mpgl_osd *ctx);
struct mpgl_osd_part *mpgl_osd_generate(struct mpgl_osd *ctx,
@@ -40,7 +39,4 @@ struct mpgl_osd_part *mpgl_osd_generate(struct mpgl_osd *ctx,
void mpgl_osd_set_gl_state(struct mpgl_osd *ctx, struct mpgl_osd_part *p);
void mpgl_osd_unset_gl_state(struct mpgl_osd *ctx, struct mpgl_osd_part *p);
-void mpgl_osd_draw_legacy(struct mpgl_osd *ctx, double pts,
- struct mp_osd_res res);
-
#endif
diff --git a/video/out/gl_video.c b/video/out/gl_video.c
index 50be85d3fe..9aacf57ae9 100644
--- a/video/out/gl_video.c
+++ b/video/out/gl_video.c
@@ -1417,7 +1417,7 @@ static void recreate_osd(struct gl_video *p)
{
if (p->osd)
mpgl_osd_destroy(p->osd);
- p->osd = mpgl_osd_init(p->gl, p->log, p->osd_state, false);
+ p->osd = mpgl_osd_init(p->gl, p->log, p->osd_state);
p->osd->use_pbo = p->opts.pbo;
}
@@ -2551,7 +2551,7 @@ void gl_video_set_output_depth(struct gl_video *p, int r, int g, int b)
struct gl_video *gl_video_init(GL *gl, struct mp_log *log, struct osd_state *osd)
{
- if (!(gl->mpgl_caps & MPGL_CAP_GL21)) {
+ if (gl->version < 210 && gl->es < 200) {
mp_err(log, "At least OpenGL 2.1 or OpenGL ES 2.0 required.\n");
return NULL;
}
diff --git a/video/out/gl_w32.c b/video/out/gl_w32.c
index abdea60775..3af58cf21d 100644
--- a/video/out/gl_w32.c
+++ b/video/out/gl_w32.c
@@ -202,8 +202,7 @@ static void create_ctx(void *ptr)
if (!create_dc(ctx, w32_ctx->flags))
return;
- if (ctx->requested_gl_version >= MPGL_VER(3, 0))
- create_context_w32_gl3(ctx);
+ create_context_w32_gl3(ctx);
if (!w32_ctx->context)
create_context_w32_old(ctx);
wglMakeCurrent(w32_ctx->hdc, NULL);
diff --git a/video/out/gl_x11.c b/video/out/gl_x11.c
index b99f5ccc0a..fa1ab62a28 100644
--- a/video/out/gl_x11.c
+++ b/video/out/gl_x11.c
@@ -261,11 +261,12 @@ static bool config_window_x11(struct MPGLContext *ctx, int flags)
int gl_version = ctx->requested_gl_version;
bool success = false;
- if (gl_version >= 300 && !glx_ctx->force_es)
+ if (!glx_ctx->force_es) {
success = create_context_x11_gl3(ctx, flags, gl_version, false);
- if (!success && !glx_ctx->force_es)
- success = create_context_x11_old(ctx);
- if (!success && gl_version >= 300) // 3.00 = vo_opengl; accepts GLES 2 or 3
+ if (!success)
+ success = create_context_x11_old(ctx);
+ }
+ if (!success) // try ES
success = create_context_x11_gl3(ctx, flags, 200, true);
if (success && !glXIsDirect(vo->x11->display, glx_ctx->context))
ctx->gl->mpgl_caps |= MPGL_CAP_SW;
diff --git a/video/out/vo_opengl.c b/video/out/vo_opengl.c
index 1d908148e3..54da31f2e3 100644
--- a/video/out/vo_opengl.c
+++ b/video/out/vo_opengl.c
@@ -412,7 +412,7 @@ static int preinit(struct vo *vo)
if (p->allow_sw)
vo->probing = false;
- p->glctx = mpgl_init(vo, p->backend, 210, vo_flags);
+ p->glctx = mpgl_init(vo, p->backend, vo_flags);
if (!p->glctx)
goto err_out;
p->gl = p->glctx->gl;
diff --git a/waftools/fragments/gl_x11.c b/waftools/fragments/gl_x11.c
index 36f4ef1f09..53b82e46ba 100644
--- a/waftools/fragments/gl_x11.c
+++ b/waftools/fragments/gl_x11.c
@@ -9,5 +9,7 @@ int main(int argc, char *argv[]) {
glXGetProcAddressARB("");
glXGetCu