[vlc-commits] [Git][videolan/vlc][master] 3 commits: opengl: importer: release interop allocated textures using interop function
Steve Lhomme (@robUx4)
gitlab at videolan.org
Wed Jan 10 19:52:28 UTC 2024
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
3c98b62c by Pierre Lamot at 2024-01-10T19:21:55+00:00
opengl: importer: release interop allocated textures using interop function
- - - - -
e0a1e902 by Pierre Lamot at 2024-01-10T19:21:55+00:00
opengl: interop: add texture deallocate callback
some interop may require resources to be cleanup before the texture is released
- - - - -
580f0b44 by Pierre Lamot at 2024-01-10T19:21:55+00:00
interop_dxva2: fix crash with AMD driver
Texture "object" can't be accessed after the texture has been deleted
- - - - -
4 changed files:
- include/vlc_opengl_interop.h
- modules/video_output/opengl/importer.c
- modules/video_output/opengl/interop.c
- modules/video_output/opengl/interop_dxva2.c
Changes:
=====================================
include/vlc_opengl_interop.h
=====================================
@@ -47,6 +47,16 @@ struct vlc_gl_interop_ops {
uint32_t textures[], const int32_t tex_width[],
const int32_t tex_height[]);
+ /**
+ * Callback to deallocate data for bound texture
+ *
+ * This function pointer can be NULL. it will be called before calling glDeleteTextures
+ *
+ * \param interop the OpenGL interop
+ * \param textures array of textures to bind (one per plane)
+ */
+ void (*deallocate_textures)(const struct vlc_gl_interop *interop, uint32_t textures[]);
+
/**
* Callback to update a picture
*
=====================================
modules/video_output/opengl/importer.c
=====================================
@@ -274,9 +274,7 @@ vlc_gl_importer_Delete(struct vlc_gl_importer *importer)
if (interop && !interop->handle_texs_gen)
{
- void (*DeleteTextures)(uint32_t, uint32_t*) =
- vlc_gl_GetProcAddress(interop->gl, "glDeleteTextures");
- (*DeleteTextures)(interop->tex_count, importer->pic.textures);
+ vlc_gl_interop_DeleteTextures(interop, importer->pic.textures);
}
free(importer);
=====================================
modules/video_output/opengl/interop.c
=====================================
@@ -98,6 +98,8 @@ vlc_gl_interop_DeleteTextures(const struct vlc_gl_interop *interop,
{
struct vlc_gl_interop_private *priv =
container_of(interop, struct vlc_gl_interop_private, interop);
+ if (interop->ops->deallocate_textures != NULL)
+ interop->ops->deallocate_textures(interop, textures);
priv->gl.DeleteTextures(interop->tex_count, textures);
memset(textures, 0, interop->tex_count * sizeof(GLuint));
}
=====================================
modules/video_output/opengl/interop_dxva2.c
=====================================
@@ -180,6 +180,19 @@ GLConvAllocateTextures(const struct vlc_gl_interop *interop, uint32_t textures[]
return VLC_SUCCESS;
}
+static void
+GLConvDeallocateTextures(const struct vlc_gl_interop *interop, uint32_t textures[])
+{
+ struct glpriv *priv = interop->priv;
+
+ if (priv->gl_handle_d3d && priv->gl_render)
+ {
+ priv->vt.DXUnlockObjectsNV(priv->gl_handle_d3d, 1, &priv->gl_render);
+ priv->vt.DXUnregisterObjectNV(priv->gl_handle_d3d, priv->gl_render);
+ priv->gl_render = NULL;
+ }
+}
+
static void
GLConvClose(struct vlc_gl_interop *interop)
{
@@ -187,12 +200,6 @@ GLConvClose(struct vlc_gl_interop *interop)
if (priv->gl_handle_d3d)
{
- if (priv->gl_render)
- {
- priv->vt.DXUnlockObjectsNV(priv->gl_handle_d3d, 1, &priv->gl_render);
- priv->vt.DXUnregisterObjectNV(priv->gl_handle_d3d, priv->gl_render);
- }
-
priv->vt.DXCloseDeviceNV(priv->gl_handle_d3d);
}
if (priv->processor.proc)
@@ -516,6 +523,7 @@ GLConvOpen(struct vlc_gl_interop *interop)
static const struct vlc_gl_interop_ops ops = {
.allocate_textures = GLConvAllocateTextures,
+ .deallocate_textures = GLConvDeallocateTextures,
.update_textures = GLConvUpdate,
.close = GLConvClose,
};
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/03507dbd8ffff9fef4dd9e25988adcff6804d88e...580f0b44836672ebae54163d5db0fbf97ec4891a
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/03507dbd8ffff9fef4dd9e25988adcff6804d88e...580f0b44836672ebae54163d5db0fbf97ec4891a
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