[vlc-commits] [Git][videolan/vlc][master] 14 commits: test: add test for OpenGL provider API

Rémi Denis-Courmont (@Courmisch) gitlab at videolan.org
Tue May 3 16:32:01 UTC 2022



Rémi Denis-Courmont pushed to branch master at VideoLAN / VLC


Commits:
35336b80 by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
test: add test for OpenGL provider API

Add a test which checks that the API is correctly routed to the member
function and allocation function are working correctly.

- - - - -
ccbe8358 by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
include: opengl: add operation structure for vlc_gl_t

The separate operation structure is implemented with a default fallback
to the previous API, which will allow a smooth transition to the new
virtual table.

- - - - -
57e405a1 by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: egl_pbuffer: use new vtable

- - - - -
346ec7ce by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: egl_surfacetexture: use new vtable

- - - - -
251c41d1 by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: VLCCVOpenGLProvider: use new vtable

- - - - -
cb6cf454 by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: VLCOpenGLES2VideoView: use new vtable

- - - - -
42a6424f by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: caopengllayer: use new vtable

- - - - -
0cd2612e by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: glx: use new vtable

- - - - -
f9e1d294 by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: macosx: use new vtable

- - - - -
704fd7cf by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: egl: use new vtable

- - - - -
b8450f60 by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: vgl: use new vtable

- - - - -
28b63bd3 by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: wgl: use new vtable

- - - - -
a58d9e3b by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
test: opengl: use new operation table

- - - - -
3a44de13 by Alexandre Janniaux at 2022-05-03T16:15:29+00:00
opengl: remove previous in-struct vtable

- - - - -


14 changed files:

- include/vlc_opengl.h
- modules/video_filter/egl_pbuffer.c
- modules/video_filter/egl_surfacetexture.c
- modules/video_output/apple/VLCCVOpenGLProvider.m
- modules/video_output/apple/VLCOpenGLES2VideoView.m
- modules/video_output/caopengllayer.m
- modules/video_output/glx.c
- modules/video_output/macosx.m
- modules/video_output/opengl/egl.c
- modules/video_output/vgl.c
- modules/video_output/win32/wgl.c
- src/video_output/opengl.c
- test/Makefile.am
- + test/src/video_output/opengl.c


Changes:

=====================================
include/vlc_opengl.h
=====================================
@@ -49,6 +49,19 @@ enum vlc_gl_api_type {
     VLC_OPENGL_ES2,
 };
 
+struct vlc_gl_operations
+{
+    union {
+        void (*swap)(vlc_gl_t *);
+        picture_t *(*swap_offscreen)(vlc_gl_t *);
+    };
+    int  (*make_current)(vlc_gl_t *gl);
+    void (*release_current)(vlc_gl_t *gl);
+    void (*resize)(vlc_gl_t *gl, unsigned width, unsigned height);
+    void*(*get_proc_address)(vlc_gl_t *gl, const char *symbol);
+    void (*close)(vlc_gl_t *gl);
+};
+
 struct vlc_gl_t
 {
     struct vlc_object_t obj;
@@ -59,13 +72,9 @@ struct vlc_gl_t
     struct vlc_decoder_device *device;
     union {
         struct { /* on-screen */
-            void (*swap)(vlc_gl_t *);
-
             struct vout_window_t *surface;
         };
         struct { /* off-screen */
-            picture_t *(*swap_offscreen)(vlc_gl_t *);
-
             vlc_fourcc_t offscreen_chroma_out;
             struct vlc_video_context *offscreen_vctx_out;
             /* Flag to indicate if the OpenGL implementation produces upside-down
@@ -74,14 +83,10 @@ struct vlc_gl_t
         };
     };
 
-    int  (*make_current)(vlc_gl_t *);
-    void (*release_current)(vlc_gl_t *);
-    void (*resize)(vlc_gl_t *, unsigned, unsigned);
-    void*(*get_proc_address)(vlc_gl_t *, const char *);
-    void (*destroy)(vlc_gl_t *);
-
     /* Defined by the core for libvlc_opengl API loading. */
     enum vlc_gl_api_type api_type;
+
+    const struct vlc_gl_operations *ops;
 };
 
 /**
@@ -105,33 +110,33 @@ VLC_API void vlc_gl_Delete(vlc_gl_t *);
 
 static inline int vlc_gl_MakeCurrent(vlc_gl_t *gl)
 {
-    return gl->make_current(gl);
+    return gl->ops->make_current(gl);
 }
 
 static inline void vlc_gl_ReleaseCurrent(vlc_gl_t *gl)
 {
-    gl->release_current(gl);
+    gl->ops->release_current(gl);
 }
 
 static inline void vlc_gl_Resize(vlc_gl_t *gl, unsigned w, unsigned h)
 {
-    if (gl->resize != NULL)
-        gl->resize(gl, w, h);
+    if (gl->ops->resize != NULL)
+        gl->ops->resize(gl, w, h);
 }
 
 static inline void vlc_gl_Swap(vlc_gl_t *gl)
 {
-    gl->swap(gl);
+    gl->ops->swap(gl);
 }
 
 static inline picture_t *vlc_gl_SwapOffscreen(vlc_gl_t *gl)
 {
-    return gl->swap_offscreen(gl);
+    return gl->ops->swap_offscreen(gl);
 }
 
 static inline void *vlc_gl_GetProcAddress(vlc_gl_t *gl, const char *name)
 {
-    return gl->get_proc_address(gl, name);
+    return gl->ops->get_proc_address(gl, name);
 }
 
 VLC_API vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *,


=====================================
modules/video_filter/egl_pbuffer.c
=====================================
@@ -396,12 +396,15 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
         goto error1;
     }
 
-    gl->make_current = MakeCurrent;
-    gl->release_current = ReleaseCurrent;
-    gl->resize = NULL;
-    gl->swap_offscreen = Swap;
-    gl->get_proc_address = GetSymbol;
-    gl->destroy = Close;
+    static const struct vlc_gl_operations gl_ops =
+    {
+        .make_current = MakeCurrent,
+        .release_current = ReleaseCurrent,
+        .swap_offscreen = Swap,
+        .get_proc_address = GetSymbol,
+        .close = Close,
+    };
+    gl->ops = &gl_ops;
     gl->offscreen_vflip = true;
 
     vlc_gl_MakeCurrent(gl);


=====================================
modules/video_filter/egl_surfacetexture.c
=====================================
@@ -367,12 +367,15 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
         goto error2;
     }
 
-    gl->make_current = MakeCurrent;
-    gl->release_current = ReleaseCurrent;
-    gl->resize = NULL;
-    gl->swap_offscreen = SwapOffscreen;
-    gl->get_proc_address = GetSymbol;
-    gl->destroy = Close;
+    static const struct vlc_gl_operations gl_ops =
+    {
+        .make_current = MakeCurrent,
+        .release_current = ReleaseCurrent,
+        .swap_offscreen = SwapOffscreen,
+        .get_proc_address = GetSymbol,
+        .close = Close,
+    };
+    gl->ops = &gl_ops;
 
     struct video_ctx *vctx = GetVCtx(gl);
 


=====================================
modules/video_output/apple/VLCCVOpenGLProvider.m
=====================================
@@ -345,12 +345,16 @@ static void FreeCVBuffer(picture_t *picture)
     if ([self resize:CGSizeMake(width, height)] != VLC_SUCCESS)
         return nil;
 
-    gl->make_current = MakeCurrent;
-    gl->release_current = ReleaseCurrent;
-    gl->resize = Resize;
-    gl->swap_offscreen = Swap;
-    gl->get_proc_address = GetSymbol;
-    gl->destroy = Close;
+    static const struct vlc_gl_operations gl_ops =
+    {
+        .make_current = MakeCurrent,
+        .release_current = ReleaseCurrent,
+        .resize = Resize,
+        .swap_offscreen = Swap,
+        .get_proc_address = GetSymbol,
+        .close = Close,
+    };
+    gl->ops = &gl_ops;
     gl->offscreen_vflip = true;
     gl->offscreen_vctx_out = _vctx_out;
     gl->offscreen_chroma_out = VLC_CODEC_CVPX_BGRA;


=====================================
modules/video_output/apple/VLCOpenGLES2VideoView.m
=====================================
@@ -229,12 +229,16 @@ static void Close(vlc_gl_t *gl)
 
     /* Setup the usual vlc_gl_t callbacks before loading the API since we need
      * the get_proc_address symbol and a current context. */
-    gl->make_current = MakeCurrent;
-    gl->release_current = ReleaseCurrent;
-    gl->resize = Resize;
-    gl->swap = Swap;
-    gl->get_proc_address = GetSymbol;
-    gl->destroy = Close;
+    static const struct vlc_gl_operations gl_ops =
+    {
+        .make_current = MakeCurrent,
+        .release_current = ReleaseCurrent,
+        .resize = Resize,
+        .swap = Swap,
+        .get_proc_address = GetSymbol,
+        .close = Close,
+    };
+    gl->ops = &gl_ops;
 
     return self;
 }


=====================================
modules/video_output/caopengllayer.m
=====================================
@@ -326,10 +326,14 @@ static int Open (vout_display_t *vd,
         if (unlikely(!sys->gl))
             goto error;
 
-        sys->gl->make_current = gl_cb_MakeCurrent;
-        sys->gl->release_current = gl_cb_ReleaseCurrent;
-        sys->gl->swap = gl_cb_Swap;
-        sys->gl->get_proc_address = gl_cb_GetProcAddress;
+        static const struct vlc_gl_operations gl_ops =
+        {
+            .make_current = gl_cb_MakeCurrent,
+            .release_current = gl_cb_ReleaseCurrent,
+            .swap = gl_cb_Swap,
+            .get_proc_address = gl_cb_GetProcAddress,
+        };
+        sys->gl->ops = &gl_ops;
         sys->gl->api_type = VLC_OPENGL;
 
         struct vlc_gl_sys *glsys = sys->gl->sys = malloc(sizeof(*glsys));


=====================================
modules/video_output/glx.c
=====================================
@@ -230,13 +230,17 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
         sys->restore_forget_gravity = false;
 
     /* Initialize OpenGL callbacks */
+    static const struct vlc_gl_operations gl_ops =
+    {
+        .make_current = MakeCurrent,
+        .release_current = ReleaseCurrent,
+        .resize = NULL,
+        .swap = SwapBuffers,
+        .get_proc_address = GetSymbol,
+        .close = Close,
+    };
     gl->sys = sys;
-    gl->make_current = MakeCurrent;
-    gl->release_current = ReleaseCurrent;
-    gl->resize = NULL;
-    gl->swap = SwapBuffers;
-    gl->get_proc_address = GetSymbol;
-    gl->destroy = Close;
+    gl->ops = &gl_ops;
 
     bool is_swap_interval_set = false;
 


=====================================
modules/video_output/macosx.m
=====================================
@@ -212,10 +212,15 @@ static int Open (vout_display_t *vd,
         }
         glsys->locked_ctx = NULL;
         glsys->glView = sys->glView;
-        sys->gl->make_current = OpenglLock;
-        sys->gl->release_current = OpenglUnlock;
-        sys->gl->swap = OpenglSwap;
-        sys->gl->get_proc_address = OurGetProcAddress;
+
+        static const struct vlc_gl_operations gl_ops =
+        {
+            .make_current = OpenglLock,
+            .release_current = OpenglUnlock,
+            .swap = OpenglSwap,
+            .get_proc_address = OurGetProcAddress,
+        };
+        sys->gl->ops = &gl_ops;
         sys->gl->api_type = VLC_OPENGL;
 
         const vlc_fourcc_t *subpicture_chromas;


=====================================
modules/video_output/opengl/egl.c
=====================================
@@ -457,12 +457,16 @@ static int Open(vlc_gl_t *gl, const struct gl_api *api,
     sys->context = ctx;
 
     /* Initialize OpenGL callbacks */
-    gl->make_current = MakeCurrent;
-    gl->release_current = ReleaseCurrent;
-    gl->resize = Resize;
-    gl->swap = SwapBuffers;
-    gl->get_proc_address = GetSymbol;
-    gl->destroy = Close;
+    static const struct vlc_gl_operations ops =
+    {
+        .make_current = MakeCurrent,
+        .release_current = ReleaseCurrent,
+        .resize = Resize,
+        .swap = SwapBuffers,
+        .get_proc_address = GetSymbol,
+        .close = Close,
+    };
+    gl->ops = &ops;
 
     return VLC_SUCCESS;
 


=====================================
modules/video_output/vgl.c
=====================================
@@ -142,13 +142,6 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
     SET_CALLBACK_ADDR(sys->makeCurrentCb, "vout-cb-make-current");
     SET_CALLBACK_ADDR(sys->getProcAddressCb, "vout-cb-get-proc-address");
 
-    gl->make_current = MakeCurrent;
-    gl->release_current = ReleaseCurrent;
-    gl->resize = Resize;
-    gl->swap = VglSwapBuffers;
-    gl->get_proc_address = OurGetProcAddress;
-    gl->destroy = Close;
-
     if( sys->setupCb )
     {
         libvlc_video_setup_device_cfg_t setup_cfg = {};
@@ -159,8 +152,19 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
             return VLC_EGENERIC;
         }
     }
-
     Resize(gl, width, height);
+
+    static const struct vlc_gl_operations gl_ops =
+    {
+        .make_current = MakeCurrent,
+        .release_current = ReleaseCurrent,
+        .resize = Resize,
+        .swap = VglSwapBuffers,
+        .get_proc_address = OurGetProcAddress,
+        .close = Close,
+    };
+    gl->ops = &gl_ops;
+
     return VLC_SUCCESS;
 }
 


=====================================
modules/video_output/win32/wgl.c
=====================================
@@ -218,12 +218,16 @@ static int Open(vlc_gl_t *gl, unsigned width, unsigned height)
 
     wglMakeCurrent(sys->hGLDC, NULL);
 
-    gl->make_current = MakeCurrent;
-    gl->release_current = ReleaseCurrent;
-    gl->resize = NULL;
-    gl->swap = Swap;
-    gl->get_proc_address = OurGetProcAddress;
-    gl->destroy = Close;
+    static const struct vlc_gl_operations gl_ops =
+    {
+        .make_current = MakeCurrent,
+        .release_current = ReleaseCurrent,
+        .resize = NULL,
+        .swap = Swap,
+        .get_proc_address = OurGetProcAddress,
+        .close = Close,
+    };
+    gl->ops = &gl_ops;
 
     (void) width; (void) height;
     return VLC_SUCCESS;


=====================================
src/video_output/opengl.c
=====================================
@@ -91,8 +91,12 @@ vlc_gl_t *vlc_gl_Create(const struct vout_display_cfg *restrict cfg,
         vlc_object_delete(gl);
         return NULL;
     }
-    assert(gl->make_current && gl->release_current && gl->swap
-        && gl->get_proc_address);
+
+    assert(gl->ops);
+    assert(gl->ops->make_current);
+    assert(gl->ops->release_current);
+    assert(gl->ops->swap);
+    assert(gl->ops->get_proc_address);
 
     return &glpriv->gl;
 }
@@ -146,18 +150,19 @@ vlc_gl_t *vlc_gl_CreateOffscreen(vlc_object_t *parent,
     /* The implementation must initialize the output chroma */
     assert(gl->offscreen_chroma_out != VLC_CODEC_UNKNOWN);
 
-    assert(gl->make_current);
-    assert(gl->release_current);
-    assert(gl->swap_offscreen);
-    assert(gl->get_proc_address);
+    assert(gl->ops);
+    assert(gl->ops->make_current);
+    assert(gl->ops->release_current);
+    assert(gl->ops->swap_offscreen);
+    assert(gl->ops->get_proc_address);
 
     return &glpriv->gl;
 }
 
 void vlc_gl_Delete(vlc_gl_t *gl)
 {
-    if (gl->destroy != NULL)
-        gl->destroy(gl);
+    if (gl->ops->close != NULL)
+        gl->ops->close(gl);
 
     if (gl->device)
         vlc_decoder_device_Release(gl->device);


=====================================
test/Makefile.am
=====================================
@@ -35,6 +35,7 @@ check_PROGRAMS = \
 	test_src_misc_epg \
 	test_src_misc_keystore \
 	test_src_video_output \
+	test_src_video_output_opengl \
 	test_modules_packetizer_helpers \
 	test_modules_packetizer_hxxx \
 	test_modules_packetizer_h264 \
@@ -173,6 +174,8 @@ test_src_video_output_SOURCES = \
 	src/video_output/video_output.h \
 	src/video_output/video_output_scenarios.c
 test_src_video_output_LDADD = $(LIBVLCCORE) $(LIBVLC)
+test_src_video_output_opengl_SOURCES = src/video_output/opengl.c
+test_src_video_output_opengl_LDADD = $(LIBVLCCORE) $(LIBVLC)
 
 checkall:
 	$(MAKE) check_PROGRAMS="$(check_PROGRAMS) $(EXTRA_PROGRAMS)" check


=====================================
test/src/video_output/opengl.c
=====================================
@@ -0,0 +1,275 @@
+/*****************************************************************************
+ * opengl.c: test for the OpenGL provider
+ *****************************************************************************
+ * Copyright (C) 2022 VideoLabs
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* Define a builtin module for mocked parts */
+#define MODULE_NAME test_offscreen_mock
+#define MODULE_STRING "test_offscreen_mock"
+#undef __PLUGIN__
+
+#include "../../libvlc/test.h"
+#include "../../../lib/libvlc_internal.h"
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_codec.h>
+#include <vlc_opengl.h>
+#include <vlc_filter.h>
+#include <vlc_modules.h>
+#include <vlc_vout_display.h>
+
+static char dummy;
+static bool swapped;
+static bool swapped_offscreen;
+
+/**
+ * Dummy decoder device implementation
+ */
+
+static void DecoderDeviceClose(struct vlc_decoder_device *device)
+    { VLC_UNUSED(device); }
+
+static const struct vlc_decoder_device_operations decoder_device_ops =
+    { .close = DecoderDeviceClose, };
+
+static int OpenDecoderDevice(
+        struct vlc_decoder_device *device,
+        vout_window_t *window
+) {
+    VLC_UNUSED(window);
+
+    /* Note: the decoder device type could be anything since we'll hook
+     *       it in the test code below. */
+    device->type = VLC_DECODER_DEVICE_VAAPI;
+    device->ops = &decoder_device_ops;
+    return VLC_SUCCESS;
+}
+
+/**
+ * Dummy vout_window implementation
+ */
+static const struct vout_window_operations wnd_ops = {
+    .destroy = NULL,
+};
+
+static int OpenWindow(vout_window_t *wnd)
+{
+    wnd->type = VOUT_WINDOW_TYPE_DUMMY;
+    wnd->ops = &wnd_ops;
+    return VLC_SUCCESS;
+}
+
+/**
+ * Dummy OpenGL provider
+ */
+
+static int OpenGLMakeCurrent(vlc_gl_t *gl)
+{
+    VLC_UNUSED(gl);
+    return VLC_SUCCESS;
+}
+
+static void OpenGLReleaseCurrent(vlc_gl_t *gl)
+{
+    (void)gl;
+}
+
+static void OpenGLSwap(vlc_gl_t *gl)
+{
+    (void)gl;
+    swapped = true;
+}
+
+static picture_t *OpenGLSwapOffscreen(vlc_gl_t *gl)
+{
+    (void)gl;
+    swapped_offscreen = true;
+    return NULL;
+}
+
+static void *OpenGLGetSymbol(vlc_gl_t *gl, const char *procname)
+{
+    (void)gl; (void)procname;
+    if (strcmp(procname, "dummy") == 0)
+        return &dummy;
+    return NULL;
+}
+
+static void OpenGLClose(vlc_gl_t *gl)
+{
+    (void)gl;
+}
+
+static int
+OpenOpenGLCommon(
+        vlc_gl_t *gl, unsigned width, unsigned height,
+        bool offscreen, enum vlc_gl_api_type api_type)
+{
+    (void)width; (void)height;
+    assert(gl->api_type == api_type);
+
+    static const struct vlc_gl_operations onscreen_ops =
+    {
+        .make_current = OpenGLMakeCurrent,
+        .release_current = OpenGLReleaseCurrent,
+        .resize = NULL,
+        .get_proc_address = OpenGLGetSymbol,
+        .swap = OpenGLSwap,
+        .close = OpenGLClose,
+    };
+
+    static const struct vlc_gl_operations offscreen_ops =
+    {
+        .make_current = OpenGLMakeCurrent,
+        .release_current = OpenGLReleaseCurrent,
+        .resize = NULL,
+        .get_proc_address = OpenGLGetSymbol,
+        .swap_offscreen = OpenGLSwapOffscreen,
+        .close = OpenGLClose,
+    };
+
+    gl->ops = offscreen ? &offscreen_ops : &onscreen_ops;
+    return VLC_SUCCESS;
+}
+
+static int
+OpenOpenGL(vlc_gl_t *gl, unsigned width, unsigned height)
+    { return OpenOpenGLCommon(gl, width, height, false, VLC_OPENGL); };
+
+static int
+OpenOpenGLES(vlc_gl_t *gl, unsigned width, unsigned height)
+    { return OpenOpenGLCommon(gl, width, height, false, VLC_OPENGL_ES2); };
+
+static int
+OpenOpenGLOffscreen(vlc_gl_t *gl, unsigned width, unsigned height)
+    { return OpenOpenGLCommon(gl, width, height, true, VLC_OPENGL); };
+
+static int
+OpenOpenGLESOffscreen(vlc_gl_t *gl, unsigned width, unsigned height)
+    { return OpenOpenGLCommon(gl, width, height, true, VLC_OPENGL_ES2); };
+
+/* Helper typedef for vlc_static_modules */
+typedef int (*vlc_plugin_cb)(vlc_set_cb, void*);
+
+/**
+ * Inject the mocked modules as a static plugin:
+ *  - decoder device for generating video context and testing release
+ *  - opengl offscreen for generating video context and using decoder device
+ **/
+vlc_module_begin()
+    set_callback(OpenDecoderDevice)
+    set_capability("decoder device", 1000)
+    add_shortcut("test_offscreen")
+
+    add_submodule()
+        set_callback(OpenWindow)
+        set_capability("vout window", 1)
+
+    add_submodule()
+        set_callback(OpenOpenGL)
+        set_capability("opengl", 1)
+
+    add_submodule()
+        set_callback(OpenOpenGLES)
+        set_capability("opengl es2", 1)
+
+    add_submodule()
+        set_callback(OpenOpenGLOffscreen)
+        set_capability("opengl offscreen", 1)
+
+    add_submodule()
+        set_callback(OpenOpenGLESOffscreen)
+        set_capability("opengl es2 offscreen", 1)
+vlc_module_end()
+
+VLC_EXPORT vlc_plugin_cb
+vlc_static_modules[] = { vlc_entry__test_offscreen_mock, NULL };
+
+static void test_opengl_offscreen(vlc_object_t *root, enum vlc_gl_api_type api_type)
+{
+    struct vlc_decoder_device *device =
+        vlc_decoder_device_Create(root, NULL);
+    assert(device != NULL);
+
+    vlc_gl_t *gl = vlc_gl_CreateOffscreen(
+            root, device, 800, 600, api_type, MODULE_STRING);
+    assert(gl != NULL);
+    vlc_decoder_device_Release(device);
+
+    assert(vlc_gl_MakeCurrent(gl) == VLC_SUCCESS);
+    assert(vlc_gl_GetProcAddress(gl, "dummy") == &dummy);
+    vlc_gl_ReleaseCurrent(gl);
+
+    swapped_offscreen = false;
+    vlc_gl_SwapOffscreen(gl);
+    assert(swapped_offscreen == true);
+
+    vlc_gl_Delete(gl);
+}
+
+static void test_opengl(vlc_object_t *root, enum vlc_gl_api_type api_type)
+{
+    const vout_window_cfg_t wnd_cfg = { .width = 800, .height = 600, };
+    const vout_window_owner_t owner = { .sys = NULL };
+    vout_window_t *wnd = vout_window_New(root, MODULE_STRING, &owner, &wnd_cfg);
+    assert(wnd != NULL && wnd->ops == &wnd_ops);
+
+    const vout_display_cfg_t cfg = {
+        .window = wnd,
+        .display.width = wnd_cfg.width,
+        .display.height = wnd_cfg.height,
+    };
+    vlc_gl_t *gl = vlc_gl_Create(&cfg, api_type, MODULE_STRING);
+    assert(gl != NULL);
+
+    assert(vlc_gl_MakeCurrent(gl) == VLC_SUCCESS);
+    assert(vlc_gl_GetProcAddress(gl, "dummy") == &dummy);
+    vlc_gl_ReleaseCurrent(gl);
+
+    swapped = false;
+    vlc_gl_Swap(gl);
+    assert(swapped == true);
+
+    vlc_gl_Delete(gl);
+    vout_window_Delete(wnd);
+}
+
+int main( int argc, char **argv )
+{
+    (void)argc; (void)argv;
+    test_init();
+
+    const char * const vlc_argv[] = {
+        "-vvv", "--aout=dummy", "--text-renderer=dummy",
+    };
+
+    libvlc_instance_t *vlc = libvlc_new(ARRAY_SIZE(vlc_argv), vlc_argv);
+    vlc_object_t *root = &vlc->p_libvlc_int->obj;
+
+    test_opengl(root, VLC_OPENGL);
+    test_opengl(root, VLC_OPENGL_ES2);
+    test_opengl_offscreen(root, VLC_OPENGL);
+    test_opengl_offscreen(root, VLC_OPENGL_ES2);
+
+    libvlc_release(vlc);
+    return 0;
+}



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/dbf82a4d8c0a0c583f52292144918ee33fd239a7...3a44de136b28ef2bef25afd0005a1a5f9bd622d8

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/dbf82a4d8c0a0c583f52292144918ee33fd239a7...3a44de136b28ef2bef25afd0005a1a5f9bd622d8
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list