From a42b8b1142fd26e82ca0e8b0ea7ab6cafd78776d Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Fri, 29 Sep 2017 14:41:52 +0200 Subject: vo_gpu: attempt re-using the FBO format for p->output_tex This allows RAs with support for non-opaque FBO formats to use a more appropriate FBO format for the output tex, possibly enabling a more efficient blit operation. This requires distinguishing between real formats (which can be used to create textures) and fake formats (e.g. ra_gl's FBO hack). --- video/out/gpu/ra.h | 2 ++ video/out/gpu/video.c | 8 +++++++- video/out/opengl/ra_gl.c | 3 +++ video/out/vulkan/ra_vk.c | 1 + 4 files changed, 13 insertions(+), 1 deletion(-) (limited to 'video') diff --git a/video/out/gpu/ra.h b/video/out/gpu/ra.h index 08ccdaee70..34f3fb9b5c 100644 --- a/video/out/gpu/ra.h +++ b/video/out/gpu/ra.h @@ -85,6 +85,8 @@ struct ra_format { // only applies to 2-component textures bool linear_filter; // linear filtering available from shader bool renderable; // can be used for render targets + bool dummy_format; // is not a real ra_format but a fake one (e.g. FBO). + // dummy formats cannot be used to create textures // If not 0, the format represents some sort of packed fringe format, whose // shader representation is given by the special_imgfmt_desc pointer. diff --git a/video/out/gpu/video.c b/video/out/gpu/video.c index 1b50166dc4..3a000aee97 100644 --- a/video/out/gpu/video.c +++ b/video/out/gpu/video.c @@ -3069,9 +3069,15 @@ void gl_video_render_frame(struct gl_video *p, struct vo_frame *frame, if (frame->num_vsyncs > 1 && frame->display_synced && !p->dumb_mode && (p->ra->caps & RA_CAP_BLIT)) { + // Attempt to use the same format as the destination FBO + // if possible. Some RAs use a wrapped dummy format here, + // so fall back to the fbo_format in that case. + const struct ra_format *fmt = fbo.tex->params.format; + if (fmt->dummy_format) + fmt = p->fbo_format; bool r = ra_tex_resize(p->ra, p->log, &p->output_tex, fbo.tex->params.w, fbo.tex->params.h, - p->fbo_format); + fmt); if (r) { dest_fbo = (struct ra_fbo) { p->output_tex }; p->output_tex_valid = true; diff --git a/video/out/opengl/ra_gl.c b/video/out/opengl/ra_gl.c index 37b7285235..72b411a16f 100644 --- a/video/out/opengl/ra_gl.c +++ b/video/out/opengl/ra_gl.c @@ -283,6 +283,8 @@ static struct ra_tex *gl_tex_create(struct ra *ra, const struct ra_tex_params *params) { GL *gl = ra_gl_get(ra); + assert(!params->format->dummy_format); + struct ra_tex *tex = gl_tex_create_blank(ra, params); if (!tex) return NULL; @@ -382,6 +384,7 @@ static const struct ra_format fbo_dummy_format = { .flags = F_CR, }, .renderable = true, + .dummy_format = true, }; // Create a ra_tex that merely wraps an existing framebuffer. gl_fbo can be 0 diff --git a/video/out/vulkan/ra_vk.c b/video/out/vulkan/ra_vk.c index 1cfeb4a948..775fe7eaa5 100644 --- a/video/out/vulkan/ra_vk.c +++ b/video/out/vulkan/ra_vk.c @@ -511,6 +511,7 @@ static struct ra_tex *vk_tex_create(struct ra *ra, const struct ra_tex_params *params) { struct mpvk_ctx *vk = ra_vk_get(ra); + assert(!params->format->dummy_format); struct ra_tex *tex = talloc_zero(NULL, struct ra_tex); tex->params = *params; -- cgit v1.2.3