vlc | branch: master | Romain Vimont <[email protected]> | Tue Jul 7 12:34:01 2020 +0200| [e37c3d70282cc43576267a5b3e8667fa31361aaf] | committer: Alexandre Janniaux
opengl: init filters framebuffers in a second pass This paves the way to initialize multisample framebuffers, which depend on whether the filter is the last. Co-authored-by: Alexandre Janniaux <[email protected]> Signed-off-by: Alexandre Janniaux <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e37c3d70282cc43576267a5b3e8667fa31361aaf --- modules/video_output/opengl/filters.c | 59 ++++++++++++++++++------------- modules/video_output/opengl/filters.h | 12 +++++++ modules/video_output/opengl/vout_helper.c | 7 ++++ 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/modules/video_output/opengl/filters.c b/modules/video_output/opengl/filters.c index 41a023eb20..497ff2af68 100644 --- a/modules/video_output/opengl/filters.c +++ b/modules/video_output/opengl/filters.c @@ -215,35 +215,21 @@ vlc_gl_filters_Append(struct vlc_gl_filters *filters, const char *name, */ assert(!filter->config.blend || !priv->sampler); - if (filter->config.blend && !prev_filter) - { - /* We cannot blend with nothing, so insert a "draw" filter to draw the - * input picture to blend with. */ - struct vlc_gl_filter *draw = - vlc_gl_filters_Append(filters, "draw", NULL); - if (!draw) - { - vlc_gl_filter_Delete(filter); - return NULL; - } - } - else if (!filter->config.blend && prev_filter) + if (filter->config.blend) { - /* It was the last non-blend filter before we append this one */ - assert(!prev_filter->has_framebuffer_out); - - /* Every non-blend filter needs its own framebuffer, except the last - * one */ - ret = InitFramebufferOut(prev_filter); - if (ret != VLC_SUCCESS) + if (!prev_filter) { - vlc_gl_filter_Delete(filter); - return NULL; + /* We cannot blend with nothing, so insert a "draw" filter to draw + * the input picture to blend with. */ + struct vlc_gl_filter *draw = + vlc_gl_filters_Append(filters, "draw", NULL); + if (!draw) + { + vlc_gl_filter_Delete(filter); + return NULL; + } } - } - if (filter->config.blend) - { /* Append as a subfilter of a non-blend filter */ struct vlc_gl_filter_priv *last_filter = vlc_list_last_entry_or_null(&filters->list, @@ -268,6 +254,29 @@ vlc_gl_filters_Append(struct vlc_gl_filters *filters, const char *name, return filter; } +int +vlc_gl_filters_InitFramebuffers(struct vlc_gl_filters *filters) +{ + struct vlc_gl_filter_priv *priv; + vlc_list_foreach(priv, &filters->list, node) + { + bool is_last = vlc_list_is_last(&priv->node, &filters->list); + if (!is_last) + { + /* It was the last non-blend filter before we append this one */ + assert(!priv->has_framebuffer_out); + + /* Every non-blend filter needs its own framebuffer, except the last + * one */ + int ret = InitFramebufferOut(priv); + if (ret != VLC_SUCCESS) + return ret; + } + } + + return VLC_SUCCESS; +} + int vlc_gl_filters_UpdatePicture(struct vlc_gl_filters *filters, picture_t *picture) diff --git a/modules/video_output/opengl/filters.h b/modules/video_output/opengl/filters.h index c7b8ec3942..de2807cee7 100644 --- a/modules/video_output/opengl/filters.h +++ b/modules/video_output/opengl/filters.h @@ -67,6 +67,18 @@ struct vlc_gl_filter * vlc_gl_filters_Append(struct vlc_gl_filters *filters, const char *name, const config_chain_t *config); +/** + * Init the framebuffers for the appended filters. + * + * This function must be called once after all filters have been appended. It + * is an error to call vlc_gl_filters_Append() after this function. + * + * \param filters the filter chain + * \return VLC_SUCCESS on success, another value on error + */ +int +vlc_gl_filters_InitFramebuffers(struct vlc_gl_filters *filters); + /** * Update the input picture to pass to the first filter * diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c index d38b5caa30..ad3eba280b 100644 --- a/modules/video_output/opengl/vout_helper.c +++ b/modules/video_output/opengl/vout_helper.c @@ -164,6 +164,13 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt, * forward SetViewpoint() */ vgl->renderer = renderer_filter->sys; + ret = vlc_gl_filters_InitFramebuffers(vgl->filters); + if (ret != VLC_SUCCESS) + { + msg_Err(gl, "Could not init filters framebuffers"); + goto delete_filters; + } + vgl->sub_interop = vlc_gl_interop_NewForSubpictures(gl, api); if (!vgl->sub_interop) { _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
