summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/out/opengl/video.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/video/out/opengl/video.c b/video/out/opengl/video.c
index d580596e9e..8ba0597fa3 100644
--- a/video/out/opengl/video.c
+++ b/video/out/opengl/video.c
@@ -2500,14 +2500,13 @@ static void gl_video_upload_image(struct gl_video *p, struct mp_image *mpi)
gl->BindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
}
-static bool test_fbo(struct gl_video *p)
+static bool test_fbo(struct gl_video *p, GLint format)
{
GL *gl = p->gl;
bool success = false;
- MP_VERBOSE(p, "Testing user-set FBO format (0x%x)\n",
- (unsigned)p->opts.fbo_format);
+ MP_VERBOSE(p, "Testing FBO format 0x%x\n", (unsigned)format);
struct fbotex fbo = {0};
- if (fbotex_init(&fbo, p->gl, p->log, 16, 16, p->opts.fbo_format)) {
+ if (fbotex_init(&fbo, p->gl, p->log, 16, 16, format)) {
gl->BindFramebuffer(GL_FRAMEBUFFER, fbo.fbo);
gl->BindFramebuffer(GL_FRAMEBUFFER, 0);
success = true;
@@ -2556,12 +2555,21 @@ static void check_gl_features(struct gl_video *p)
bool have_mglsl = gl->glsl_version >= 130; // modern GLSL (1st class arrays etc.)
bool have_texrg = gl->mpgl_caps & MPGL_CAP_TEX_RG;
- if (!p->opts.fbo_format) {
- p->opts.fbo_format = GL_RGBA16;
- if (gl->es && !(gl->mpgl_caps & MPGL_CAP_EXT16))
- p->opts.fbo_format = have_float_tex ? GL_RGBA16F : GL_RGB10_A2;
+ const GLint auto_fbo_fmts[] = {GL_RGBA16, GL_RGBA16F, GL_RGB10_A2,
+ GL_RGBA8, 0};
+ GLint user_fbo_fmts[] = {p->opts.fbo_format, 0};
+ const GLint *fbo_fmts = user_fbo_fmts[0] ? user_fbo_fmts : auto_fbo_fmts;
+ bool have_fbo = false;
+ for (int n = 0; fbo_fmts[n]; n++) {
+ GLint fmt = fbo_fmts[n];
+ const struct gl_format *f = gl_find_internal_format(gl, fmt);
+ if (f && (f->flags & F_CF) == F_CF && test_fbo(p, fmt)) {
+ MP_VERBOSE(p, "Using FBO format 0x%x.\n", (unsigned)fmt);
+ have_fbo = true;
+ p->opts.fbo_format = fmt;
+ break;
+ }
}
- bool have_fbo = test_fbo(p);
if (gl->es && p->opts.pbo) {
p->opts.pbo = 0;