[vlc-devel] [PATCH v4 15/20] opengl: apply viewport on filters

Romain Vimont rom1v at videolabs.io
Tue Jul 7 12:33:58 CEST 2020


The requested viewport must be applied only on filters which draw
directly to the output (from the last non-blend filter to the end).

Co-authored-by: Alexandre Janniaux <ajanni at videolabs.io>
---
 modules/video_output/opengl/filters.c     | 29 +++++++++++++++++++++++
 modules/video_output/opengl/filters.h     |  7 ++++++
 modules/video_output/opengl/vout_helper.c |  3 +--
 3 files changed, 37 insertions(+), 2 deletions(-)

diff --git a/modules/video_output/opengl/filters.c b/modules/video_output/opengl/filters.c
index 4e5dd9a1ae..a8724e474b 100644
--- a/modules/video_output/opengl/filters.c
+++ b/modules/video_output/opengl/filters.c
@@ -43,6 +43,13 @@ struct vlc_gl_filters {
     struct vlc_gl_interop *interop;
 
     struct vlc_list list; /**< list of vlc_gl_filter.node */
+
+    struct vlc_gl_filters_viewport {
+        int x;
+        int y;
+        unsigned width;
+        unsigned height;
+    } viewport;
 };
 
 struct vlc_gl_filters *
@@ -57,6 +64,9 @@ vlc_gl_filters_New(struct vlc_gl_t *gl, const struct vlc_gl_api *api,
     filters->api = api;
     filters->interop = interop;
     vlc_list_init(&filters->list);
+
+    memset(&filters->viewport, 0, sizeof(filters->viewport));
+
     return filters;
 }
 
@@ -301,6 +311,15 @@ vlc_gl_filters_Draw(struct vlc_gl_filters *filters)
 
         vt->BindFramebuffer(GL_DRAW_FRAMEBUFFER, draw_fb);
 
+        if (vlc_list_is_last(&priv->node, &filters->list))
+        {
+            /* The output viewport must be applied on the last filter */
+            struct vlc_gl_filters_viewport *vp = &filters->viewport;
+            vt->Viewport(vp->x, vp->y, vp->width, vp->height);
+        }
+        else
+            vt->Viewport(0, 0, priv->size_out.width, priv->size_out.height);
+
         struct vlc_gl_filter *filter = &priv->filter;
         int ret = filter->ops->draw(filter);
         if (ret != VLC_SUCCESS)
@@ -323,3 +342,13 @@ vlc_gl_filters_Draw(struct vlc_gl_filters *filters)
 
     return VLC_SUCCESS;
 }
+
+void
+vlc_gl_filters_SetViewport(struct vlc_gl_filters *filters, int x, int y,
+                           unsigned width, unsigned height)
+{
+    filters->viewport.x = x;
+    filters->viewport.y = y;
+    filters->viewport.width = width;
+    filters->viewport.height = height;
+}
diff --git a/modules/video_output/opengl/filters.h b/modules/video_output/opengl/filters.h
index 26b89b407c..3541bf0076 100644
--- a/modules/video_output/opengl/filters.h
+++ b/modules/video_output/opengl/filters.h
@@ -86,4 +86,11 @@ vlc_gl_filters_UpdatePicture(struct vlc_gl_filters *filters,
 int
 vlc_gl_filters_Draw(struct vlc_gl_filters *filters);
 
+/**
+ * Set the viewport.
+ */
+void
+vlc_gl_filters_SetViewport(struct vlc_gl_filters *filters, int x, int y,
+                           unsigned width, unsigned height);
+
 #endif
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index 22ca7350ea..f25ccbd962 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -246,8 +246,7 @@ void vout_display_opengl_SetWindowAspectRatio(vout_display_opengl_t *vgl,
 void vout_display_opengl_Viewport(vout_display_opengl_t *vgl, int x, int y,
                                   unsigned width, unsigned height)
 {
-    const opengl_vtable_t *vt = &vgl->api.vt;
-    vt->Viewport(x, y, width, height);
+    vlc_gl_filters_SetViewport(vgl->filters, x, y, width, height);
 }
 
 int vout_display_opengl_Prepare(vout_display_opengl_t *vgl,
-- 
2.27.0



More information about the vlc-devel mailing list