[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