summaryrefslogtreecommitdiffstats
path: root/video/out/gl_common.c
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 /video/out/gl_common.c
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.
Diffstat (limited to 'video/out/gl_common.c')
-rw-r--r--video/out/gl_common.c230
1 files changed, 59 insertions, 171 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");