1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-17 20:34:58 +00:00

vo_opengl: test FBOs only if they're going to be used

Change test_fbo() so that it checks the FBO lazily, and restructure
check_gl_features() to invoke it only if we know that a FBO will be
needed for a certain enabled feature.

This can avoid strange error messages when using --vo=opengl and the
FBO format does not work. It's also less confusing when reading the
verbose log (users might think that the FBO is actually used, etc.).
This commit is contained in:
wm4 2015-02-26 10:35:49 +01:00
parent a2e0cd7f25
commit 280c826379

View File

@ -2091,20 +2091,26 @@ void gl_video_upload_image(struct gl_video *p, struct mp_image *mpi)
gl->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); gl->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
} }
static bool test_fbo(struct gl_video *p, GLenum format) static bool test_fbo(struct gl_video *p, bool *success)
{ {
if (!*success)
return false;
GL *gl = p->gl; GL *gl = p->gl;
bool success = false; *success = false;
MP_VERBOSE(p, "Testing user-set FBO format (0x%x)\n",
(unsigned)p->opts.fbo_format);
struct fbotex fbo = {0}; struct fbotex fbo = {0};
if (fbotex_init(&fbo, p->gl, p->log, 16, 16, p->gl_target, GL_LINEAR, format)) if (fbotex_init(&fbo, p->gl, p->log, 16, 16, p->gl_target, GL_LINEAR,
p->opts.fbo_format))
{ {
gl->BindFramebuffer(GL_FRAMEBUFFER, fbo.fbo); gl->BindFramebuffer(GL_FRAMEBUFFER, fbo.fbo);
gl->BindFramebuffer(GL_FRAMEBUFFER, 0); gl->BindFramebuffer(GL_FRAMEBUFFER, 0);
success = true; *success = true;
} }
fbotex_uninit(&fbo); fbotex_uninit(&fbo);
glCheckError(gl, p->log, "FBO test"); glCheckError(gl, p->log, "FBO test");
return success; return *success;
} }
// Disable features that are not supported with the current OpenGL version. // Disable features that are not supported with the current OpenGL version.
@ -2121,22 +2127,15 @@ static void check_gl_features(struct gl_video *p)
char *disabled[10]; char *disabled[10];
int n_disabled = 0; int n_disabled = 0;
if (have_fbo) {
MP_VERBOSE(p, "Testing user-set FBO format (0x%x)\n",
(unsigned)p->opts.fbo_format);
have_fbo = test_fbo(p, p->opts.fbo_format);
}
// Normally, we want to disable them by default if FBOs are unavailable, // Normally, we want to disable them by default if FBOs are unavailable,
// because they will be slow (not critically slow, but still slower). // because they will be slow (not critically slow, but still slower).
// Without FP textures, we must always disable them. // Without FP textures, we must always disable them.
// I don't know if luminance alpha float textures exist, so disregard them. // I don't know if luminance alpha float textures exist, so disregard them.
if (!have_float_tex || !have_arrays || !have_fbo || !have_1d_tex) {
for (int n = 0; n < 2; n++) { for (int n = 0; n < 2; n++) {
const struct filter_kernel *kernel = mp_find_filter_kernel(p->opts.scalers[n]); const struct filter_kernel *kernel = mp_find_filter_kernel(p->opts.scalers[n]);
if (kernel) { if (kernel) {
char *reason = ""; char *reason = NULL;
if (!have_fbo) if (!test_fbo(p, &have_fbo))
reason = "scaler (FBO)"; reason = "scaler (FBO)";
if (!have_float_tex) if (!have_float_tex)
reason = "scaler (float tex.)"; reason = "scaler (float tex.)";
@ -2144,13 +2143,12 @@ static void check_gl_features(struct gl_video *p)
reason = "scaler (no GLSL support)"; reason = "scaler (no GLSL support)";
if (!have_1d_tex && kernel->polar) if (!have_1d_tex && kernel->polar)
reason = "scaler (1D tex.)"; reason = "scaler (1D tex.)";
if (*reason) { if (reason) {
p->opts.scalers[n] = "bilinear"; p->opts.scalers[n] = "bilinear";
disabled[n_disabled++] = reason; disabled[n_disabled++] = reason;
} }
} }
} }
}
// GLES3 doesn't provide filtered 16 bit integer textures // GLES3 doesn't provide filtered 16 bit integer textures
// GLES2 doesn't even provide 3D textures // GLES2 doesn't even provide 3D textures
@ -2172,12 +2170,12 @@ static void check_gl_features(struct gl_video *p)
p->opts.srgb = false; p->opts.srgb = false;
disabled[n_disabled++] = "sRGB output (GLSL version)"; disabled[n_disabled++] = "sRGB output (GLSL version)";
} }
if (!have_fbo && use_cms) { if (use_cms && !test_fbo(p, &have_fbo)) {
p->opts.srgb = false; p->opts.srgb = false;
p->use_lut_3d = false; p->use_lut_3d = false;
disabled[n_disabled++] = "color management (FBO)"; disabled[n_disabled++] = "color management (FBO)";
} }
if (!have_fbo && p->opts.smoothmotion) { if (p->opts.smoothmotion && !test_fbo(p, &have_fbo)) {
p->opts.smoothmotion = false; p->opts.smoothmotion = false;
disabled[n_disabled++] = "smoothmotion (FBO)"; disabled[n_disabled++] = "smoothmotion (FBO)";
} }