[vlc-devel] [PATCH 04/41] opengl: move fields from interop to gl_api
Romain Vimont
rom1v at videolabs.io
Fri Feb 7 17:41:50 CET 2020
The fields is_gles and glexts (extensions) are not specific to interop,
and may be useful without an interop instance.
---
modules/video_output/opengl/fragment_shaders.c | 2 +-
modules/video_output/opengl/gl_api.c | 15 +++++++++++++++
modules/video_output/opengl/gl_api.h | 7 +++++++
modules/video_output/opengl/interop.c | 9 +--------
modules/video_output/opengl/interop.h | 6 ------
modules/video_output/opengl/interop_sw.c | 7 ++++---
modules/video_output/opengl/interop_vaapi.c | 3 ++-
modules/video_output/opengl/interop_vdpau.c | 3 ++-
8 files changed, 32 insertions(+), 20 deletions(-)
diff --git a/modules/video_output/opengl/fragment_shaders.c b/modules/video_output/opengl/fragment_shaders.c
index dfc4f51d1e..85281a2940 100644
--- a/modules/video_output/opengl/fragment_shaders.c
+++ b/modules/video_output/opengl/fragment_shaders.c
@@ -376,7 +376,7 @@ opengl_init_swizzle(const struct vlc_gl_interop *interop,
const vlc_chroma_description_t *desc)
{
GLint oneplane_texfmt;
- if (vlc_gl_StrHasToken(interop->glexts, "GL_ARB_texture_rg"))
+ if (vlc_gl_StrHasToken(interop->api->extensions, "GL_ARB_texture_rg"))
oneplane_texfmt = GL_RED;
else
oneplane_texfmt = GL_LUMINANCE;
diff --git a/modules/video_output/opengl/gl_api.c b/modules/video_output/opengl/gl_api.c
index 1673d2c90f..7caec86406 100644
--- a/modules/video_output/opengl/gl_api.c
+++ b/modules/video_output/opengl/gl_api.c
@@ -24,6 +24,7 @@
#include "gl_api.h"
+#include <assert.h>
#include <vlc_common.h>
#include <vlc_opengl.h>
@@ -130,5 +131,19 @@ vlc_gl_api_Init(struct vlc_gl_api *api, vlc_gl_t *gl)
GL_ASSERT_NOERROR();
+ api->extensions = (const char *) api->vt.GetString(GL_EXTENSIONS);
+ assert(api->extensions);
+ if (!api->extensions)
+ {
+ msg_Err(gl, "glGetString returned NULL");
+ return VLC_EGENERIC;
+ }
+
+#ifdef USE_OPENGL_ES2
+ api->is_gles = true;
+#else
+ api->is_gles = false;
+#endif
+
return VLC_SUCCESS;
}
diff --git a/modules/video_output/opengl/gl_api.h b/modules/video_output/opengl/gl_api.h
index 16ea07a93d..e618d8d488 100644
--- a/modules/video_output/opengl/gl_api.h
+++ b/modules/video_output/opengl/gl_api.h
@@ -25,6 +25,7 @@
# include "config.h"
#endif
+#include <stdbool.h>
#include <vlc_common.h>
#include <vlc_opengl.h>
@@ -32,6 +33,12 @@
struct vlc_gl_api {
opengl_vtable_t vt;
+
+ /* True if the current API is OpenGL ES, set by the caller */
+ bool is_gles;
+
+ /* Available gl extensions (from GL_EXTENSIONS) */
+ const char *extensions;
};
int
diff --git a/modules/video_output/opengl/interop.c b/modules/video_output/opengl/interop.c
index 69d73f8f9a..1619b1880b 100644
--- a/modules/video_output/opengl/interop.c
+++ b/modules/video_output/opengl/interop.c
@@ -46,15 +46,8 @@ vlc_gl_interop_New(struct vlc_gl_t *gl, const struct vlc_gl_api *api,
if (!interop)
return NULL;
-#ifdef USE_OPENGL_ES2
- interop->is_gles = true;
-#else
- interop->is_gles = false;
-#endif
-
interop->init = opengl_interop_init_impl;
interop->ops = NULL;
- interop->glexts = glexts;
interop->fmt = *fmt;
/* this is the only allocated field, and we don't need it */
interop->fmt.p_palette = NULL;
@@ -211,7 +204,7 @@ interop_yuv_base_init(struct vlc_gl_interop *interop, GLenum tex_target,
GLint oneplane_texfmt, oneplane16_texfmt,
twoplanes_texfmt, twoplanes16_texfmt;
- if (vlc_gl_StrHasToken(interop->glexts, "GL_ARB_texture_rg"))
+ if (vlc_gl_StrHasToken(interop->api->extensions, "GL_ARB_texture_rg"))
{
oneplane_texfmt = GL_RED;
oneplane16_texfmt = GL_R16;
diff --git a/modules/video_output/opengl/interop.h b/modules/video_output/opengl/interop.h
index 96b34de970..4288da3f25 100644
--- a/modules/video_output/opengl/interop.h
+++ b/modules/video_output/opengl/interop.h
@@ -113,12 +113,6 @@ struct vlc_gl_interop {
const opengl_vtable_t *vt; /* for convenience, same as &api->vt */
GLenum tex_target;
- /* True if the current API is OpenGL ES, set by the caller */
- bool is_gles;
-
- /* Available gl extensions (from GL_EXTENSIONS) */
- const char *glexts;
-
/* Can only be changed from the module open function */
video_format_t fmt;
diff --git a/modules/video_output/opengl/interop_sw.c b/modules/video_output/opengl/interop_sw.c
index 481ebd027e..b872f511eb 100644
--- a/modules/video_output/opengl/interop_sw.c
+++ b/modules/video_output/opengl/interop_sw.c
@@ -27,6 +27,7 @@
#include <stdlib.h>
#include <vlc_common.h>
+#include "gl_api.h"
#include "internal.h"
#define PBO_DISPLAY_COUNT 2 /* Double buffering */
@@ -363,7 +364,7 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
/* OpenGL or OpenGL ES2 with GL_EXT_unpack_subimage ext */
priv->has_unpack_subimage =
- !interop->is_gles || vlc_gl_StrHasToken(interop->glexts, "GL_EXT_unpack_subimage");
+ !interop->api->is_gles || vlc_gl_StrHasToken(interop->api->extensions, "GL_EXT_unpack_subimage");
if (allow_dr && priv->has_unpack_subimage)
{
@@ -372,8 +373,8 @@ opengl_interop_generic_init(struct vlc_gl_interop *interop, bool allow_dr)
const bool glver_ok = strverscmp((const char *)ogl_version, "3.0") >= 0;
const bool has_pbo = glver_ok &&
- (vlc_gl_StrHasToken(interop->glexts, "GL_ARB_pixel_buffer_object") ||
- vlc_gl_StrHasToken(interop->glexts, "GL_EXT_pixel_buffer_object"));
+ (vlc_gl_StrHasToken(interop->api->extensions, "GL_ARB_pixel_buffer_object") ||
+ vlc_gl_StrHasToken(interop->api->extensions, "GL_EXT_pixel_buffer_object"));
const bool supports_pbo = has_pbo && interop->vt->BufferData
&& interop->vt->BufferSubData;
diff --git a/modules/video_output/opengl/interop_vaapi.c b/modules/video_output/opengl/interop_vaapi.c
index b11251135f..27d9e0ec2d 100644
--- a/modules/video_output/opengl/interop_vaapi.c
+++ b/modules/video_output/opengl/interop_vaapi.c
@@ -33,6 +33,7 @@
#include <vlc_codec.h>
#include <vlc_plugin.h>
+#include "gl_api.h"
#include "interop.h"
#include "../../hw/vaapi/vlc_vaapi.h"
@@ -353,7 +354,7 @@ Open(vlc_object_t *obj)
return VLC_EGENERIC;
}
- if (!vlc_gl_StrHasToken(interop->glexts, "GL_OES_EGL_image"))
+ if (!vlc_gl_StrHasToken(interop->api->extensions, "GL_OES_EGL_image"))
{
vlc_decoder_device_Release(dec_device);
return VLC_EGENERIC;
diff --git a/modules/video_output/opengl/interop_vdpau.c b/modules/video_output/opengl/interop_vdpau.c
index 6625f995a3..35f6222351 100644
--- a/modules/video_output/opengl/interop_vdpau.c
+++ b/modules/video_output/opengl/interop_vdpau.c
@@ -35,6 +35,7 @@
#include <vlc_codec.h>
#include <vlc_plugin.h>
+#include "gl_api.h"
#include "../../hw/vdpau/vlc_vdpau.h"
#include "internal.h"
#include "interop.h"
@@ -124,7 +125,7 @@ Open(vlc_object_t *obj)
|| (interop->fmt.i_chroma != VLC_CODEC_VDPAU_VIDEO_420
&& interop->fmt.i_chroma != VLC_CODEC_VDPAU_VIDEO_422
&& interop->fmt.i_chroma != VLC_CODEC_VDPAU_VIDEO_444)
- || !vlc_gl_StrHasToken(interop->glexts, "GL_NV_vdpau_interop")
+ || !vlc_gl_StrHasToken(interop->api->extensions, "GL_NV_vdpau_interop")
|| interop->gl->surface->type != VOUT_WINDOW_TYPE_XID)
{
vlc_decoder_device_Release(dec_device);
--
2.25.0
More information about the vlc-devel
mailing list