[vlc-devel] [PATCH v2 21/22] opengl: document filters implementation
Alexandre Janniaux
ajanni at videolabs.io
Thu Jul 2 17:12:03 CEST 2020
The documentation is not up-to-date anymore with the option.
I feel that we also didn't choose about how to handle --gl-filter
addition/removal which would change the documentation here.
What do you suggest currently?
Regards,
--
Alexandre Janniaux
Videolabs
On Wed, Jul 01, 2020 at 12:30:22PM +0200, Romain Vimont wrote:
> Add an overview of the implementation of OpenGL filters.
>
> Co-authored-by: Alexandre Janniaux <ajanni at videolabs.io>
> ---
> modules/video_output/opengl/filters.c | 78 +++++++++++++++++++++++++++
> 1 file changed, 78 insertions(+)
>
> diff --git a/modules/video_output/opengl/filters.c b/modules/video_output/opengl/filters.c
> index 66084b81cb..aefb8bff15 100644
> --- a/modules/video_output/opengl/filters.c
> +++ b/modules/video_output/opengl/filters.c
> @@ -32,6 +32,84 @@
> #include "renderer.h"
> #include "sampler_priv.h"
>
> +/* The filter chain contains the sequential list of filters, typically given
> + * via command-line arguments "--gl-filters=filter1:filter2:...:filtern".
> + *
> + * There are two types of filters:
> + * - blend filters just draw over the provided framebuffer (containing the
> + * result of the previous filter), without reading the input picture.
> + * - non-blend filters read their input picture and draw whatever they want to
> + * their own output framebuffer.
> + *
> + * For convenience, the filter chain does not store the filters as a single
> + * sequential list, but as a list of non-blend filters, each containing the
> + * list of their associated blend filters.
> + *
> + * For example, given:
> + *
> + * --gl-filters=draw:triangle:triangle_mask:triangle_clock:triangle:renderer
> + *
> + * the filters chain stores the filters as follow:
> + *
> + * +- draw (non-blend)
> + * | +- triangle (blend)
> + * +- triangle_mask (non-blend)
> + * | +- triangle_clock (blend)
> + * | +- triangle (blend)
> + * +- renderer (non-blend)
> + *
> + * An output framebuffer is created for each non-blend filters. It is used as
> + * draw framebuffer for that filter and all its associated blend filters.
> + *
> + * If the first filter is a blend filter, then a "draw" filter is automatically
> + * inserted. If the renderer does not appear in the filter list, it is
> + * automatically added at the end.
> + *
> + *
> + * ## Multisample anti-aliasing (MSAA)
> + *
> + * Each filter may also request multisample anti-aliasing, by providing a MSAA
> + * level during its Open(), for example:
> + *
> + * filter->config.msaa_level = 4;
> + *
> + * For example:
> + *
> + * +- draw msaa_level=0
> + * | +- triangle msaa_level=4
> + * | +- triangle_clock msaa_level=2
> + * +- renderer msaa_level=0
> + *
> + * Among a "group" of one non-blend filter and its associated blend filters,
> + * the highest MSAA level (or 0 if multisampling is not supported) is assigned
> + * both to the non-blend filter, to configure its MSAA framebuffer, and to the
> + * blend filters, just for information and consistency:
> + *
> + * +- draw msaa_level=4
> + * | +- triangle msaa_level=4
> + * | +- triangle_clock msaa_level=4
> + * +- renderer msaa_level=0
> + *
> + * Some platforms (Android) do not support resolving multisample to the default
> + * framebuffer. Therefore, the msaa_level must always be 0 on the last filter.
> + * If this is not the case, a "draw" filter is automatically appended.
> + *
> + * For example:
> + *
> + * +- draw msaa_level=0
> + * | +- triangle msaa_level=4
> + * +- renderer msaa_level=0
> + * +- triangle_clock msaa_level=2
> + *
> + * will become:
> + *
> + * +- draw msaa_level=4
> + * | +- triangle msaa_level=4
> + * +- renderer msaa_level=2
> + * | +- triangle_clock msaa_level=2
> + * +- draw msaa_level=0
> + */
> +
> struct vlc_gl_filters {
> struct vlc_gl_t *gl;
> const struct vlc_gl_api *api;
> --
> 2.27.0
>
More information about the vlc-devel
mailing list