diff options
-rw-r--r-- | video/out/gl_common.c | 10 | ||||
-rw-r--r-- | video/out/gl_common.h | 2 | ||||
-rw-r--r-- | video/out/gl_video.c | 28 | ||||
-rw-r--r-- | video/out/gl_video_shaders.glsl | 6 |
4 files changed, 30 insertions, 16 deletions
diff --git a/video/out/gl_common.c b/video/out/gl_common.c index 05bce4dfb5..a94ad1fc75 100644 --- a/video/out/gl_common.c +++ b/video/out/gl_common.c @@ -105,6 +105,8 @@ static const struct feature features[] = { {MPGL_CAP_SRGB_FB, "sRGB framebuffers"}, {MPGL_CAP_FLOAT_TEX, "Float textures"}, {MPGL_CAP_TEX_RG, "RG textures"}, + {MPGL_CAP_1ST_CLASS_ARRAYS, "1st class shader arrays"}, + {MPGL_CAP_3D_TEX, "3D textures"}, {MPGL_CAP_SW, "suspected software renderer"}, {0}, }; @@ -241,9 +243,10 @@ static const struct gl_functions gl_functions[] = { {0}, }, }, - // GL 2.1+ desktop only + // GL 2.1+ desktop only, GLSL 120 { .ver_core = 210, + .provides = MPGL_CAP_3D_TEX | MPGL_CAP_1ST_CLASS_ARRAYS, .functions = (const struct gl_function[]) { DEF_FN(MapBuffer), DEF_FN(TexImage3D), @@ -255,7 +258,8 @@ static const struct gl_functions gl_functions[] = { { .ver_core = 300, .ver_es_core = 300, - .provides = MPGL_CAP_SRGB_TEX | MPGL_CAP_SRGB_FB | MPGL_CAP_VAO, + .provides = MPGL_CAP_SRGB_TEX | MPGL_CAP_SRGB_FB | MPGL_CAP_VAO | + MPGL_CAP_3D_TEX | MPGL_CAP_1ST_CLASS_ARRAYS, .functions = (const struct gl_function[]) { DEF_FN(BindVertexArray), DEF_FN(DeleteVertexArrays), @@ -388,7 +392,7 @@ static const struct gl_functions gl_functions[] = { // But the previous code didn't do that, and nobody ever complained. { .ver_removed = 210, - .ver_es_removed = 300, + .ver_es_removed = 100, .partial_ok = true, .functions = (const struct gl_function[]) { DEF_FN_NAMES(GenBuffers, "glGenBuffers", "glGenBuffersARB"), diff --git a/video/out/gl_common.h b/video/out/gl_common.h index ac9efe5c41..6f7c8b8ce5 100644 --- a/video/out/gl_common.h +++ b/video/out/gl_common.h @@ -79,6 +79,8 @@ enum { MPGL_CAP_TEX_RG = (1 << 10), // GL_ARB_texture_rg / GL 3.x MPGL_CAP_VDPAU = (1 << 11), // GL_NV_vdpau_interop MPGL_CAP_APPLE_RGB_422 = (1 << 12), // GL_APPLE_rgb_422 + MPGL_CAP_1ST_CLASS_ARRAYS = (1 << 13), + MPGL_CAP_3D_TEX = (1 << 14), MPGL_CAP_SW = (1 << 30), // indirect or sw renderer }; diff --git a/video/out/gl_video.c b/video/out/gl_video.c index 970681b38f..62b7f11584 100644 --- a/video/out/gl_video.c +++ b/video/out/gl_video.c @@ -949,13 +949,17 @@ static void compile_shaders(struct gl_video *p) char *shader_prelude = get_section(tmp, src, "prelude"); char *s_video = get_section(tmp, src, "frag_video"); - int rg = !!(gl->mpgl_caps & MPGL_CAP_TEX_RG); + bool rg = gl->mpgl_caps & MPGL_CAP_TEX_RG; + bool tex3d = gl->mpgl_caps & MPGL_CAP_3D_TEX; + bool arrays = gl->mpgl_caps & MPGL_CAP_1ST_CLASS_ARRAYS; char *header = talloc_asprintf(tmp, "#version %d%s\n" "#define HAVE_RG %d\n" + "#define HAVE_3DTEX %d\n" + "#define HAVE_ARRAYS %d\n" "%s%s", gl->glsl_version, gl->es >= 300 ? " es" : "", - rg, shader_prelude, PRELUDE_END); + rg, tex3d, arrays, shader_prelude, PRELUDE_END); bool use_cms = p->opts.srgb || p->use_lut_3d; @@ -2088,7 +2092,7 @@ static void check_gl_features(struct gl_video *p) bool have_float_tex = gl->mpgl_caps & MPGL_CAP_FLOAT_TEX; bool have_fbo = gl->mpgl_caps & MPGL_CAP_FB; bool have_srgb = gl->mpgl_caps & MPGL_CAP_SRGB_TEX; - bool have_rg = gl->mpgl_caps & MPGL_CAP_TEX_RG; + bool have_arrays = gl->mpgl_caps & MPGL_CAP_1ST_CLASS_ARRAYS; bool have_mix = gl->glsl_version >= 130; char *disabled[10]; @@ -2106,23 +2110,33 @@ static void check_gl_features(struct gl_video *p) // because they will be slow (not critically slow, but still slower). // Without FP textures, we must always disable them. // I don't know if luminance alpha float textures exist, so disregard them. - if (!have_float_tex || !have_rg || (!have_fbo && p->opts.scale_sep)) { + if (!have_float_tex || !have_arrays || (!have_fbo && p->opts.scale_sep)) { for (int n = 0; n < 2; n++) { if (mp_find_filter_kernel(p->opts.scalers[n])) { p->opts.scalers[n] = "bilinear"; - disabled[n_disabled++] - = have_float_tex ? "scaler (FBO)" : "scaler (float tex.)"; + char *reason = "scaler (FBO)"; + if (!have_float_tex) + reason = "scaler (float tex.)"; + if (!have_arrays) + reason = "scaler (no GLSL support)"; + disabled[n_disabled++] = reason; } } } // GLES3 doesn't provide filtered 16 bit integer textures // GLES2 doesn't even provide 3D textures - if (p->use_lut_3d && gl->es) { + if (p->use_lut_3d && (gl->es < 300 || !have_float_tex)) { p->use_lut_3d = false; disabled[n_disabled++] = "color management (GLES unsupported)"; } + // Missing float textures etc. (maybe ordered would actually work) + if (p->opts.dither_algo >= 0 && gl->es) { + p->opts.dither_algo = -1; + disabled[n_disabled++] = "dithering (GLES unsupported)"; + } + int use_cms = p->opts.srgb || p->use_lut_3d; // srgb_compand() not available diff --git a/video/out/gl_video_shaders.glsl b/video/out/gl_video_shaders.glsl index 2cbce5b71e..86f3c5afb2 100644 --- a/video/out/gl_video_shaders.glsl +++ b/video/out/gl_video_shaders.glsl @@ -29,12 +29,6 @@ #ifdef GL_ES precision mediump float; -#define HAVE_3DTEX (__VERSION__ >= 300) -#define HAVE_ARRAYS (__VERSION__ >= 300) -#else -// Desktop GL -#define HAVE_3DTEX 1 -#define HAVE_ARRAYS 1 #endif // GLSL 1.20 compatibility layer |