From: Dan Dennedy Date: Sat, 24 Aug 2013 18:33:04 +0000 (-0700) Subject: Add "close glsl" event to glsl.manager service. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=75d9ca74cbde0078b05343a8aac79a32236caa10;p=mlt Add "close glsl" event to glsl.manager service. Qt 5 apps (and possibly others) must use this because the OpenGL context for rendering needs to be created and destroyed on the thread on which it is actually used. This should be fired on the glsl.manager filter instance inside of a consumer-thread-stopped mlt_event listener. --- diff --git a/src/modules/opengl/filter_glsl_manager.cpp b/src/modules/opengl/filter_glsl_manager.cpp index ef6eca45..2370c58a 100644 --- a/src/modules/opengl/filter_glsl_manager.cpp +++ b/src/modules/opengl/filter_glsl_manager.cpp @@ -41,6 +41,7 @@ GlslManager::GlslManager() : Mlt::Filter( mlt_filter_new() ) , pbo(0) , initEvent(0) + , closeEvent(0) { mlt_filter filter = get_filter(); if ( filter ) { @@ -50,19 +51,18 @@ GlslManager::GlslManager() (mlt_destructor) deleteManager, NULL); mlt_events_register( get_properties(), "init glsl", NULL ); + mlt_events_register( get_properties(), "close glsl", NULL ); initEvent = listen("init glsl", this, (mlt_listener) GlslManager::onInit); + closeEvent = listen("close glsl", this, (mlt_listener) GlslManager::onClose); } } GlslManager::~GlslManager() { mlt_log_debug(get_service(), "%s\n", __FUNCTION__); - while (fbo_list.peek_back()) - delete (glsl_fbo) fbo_list.pop_back(); - while (texture_list.peek_back()) - delete (glsl_texture) texture_list.pop_back(); - delete pbo; + cleanupContext(); delete initEvent; + delete closeEvent; } GlslManager* GlslManager::get_instance() @@ -171,6 +171,25 @@ glsl_pbo GlslManager::get_pbo(int size) return pbo; } +void GlslManager::cleanupContext() +{ + while (fbo_list.peek_back()) { + glsl_fbo fbo = (glsl_fbo) fbo_list.pop_back(); + glDeleteFramebuffers(1, &fbo->fbo); + delete fbo; + } + while (texture_list.peek_back()) { + glsl_texture texture = (glsl_texture) texture_list.pop_back(); + glDeleteTextures(1, &texture->texture); + delete texture; + } + if (pbo) { + glDeleteBuffers(1, &pbo->pbo); + delete pbo; + pbo = 0; + } +} + void GlslManager::onInit( mlt_properties owner, GlslManager* filter ) { mlt_log_debug( filter->get_service(), "%s\n", __FUNCTION__ ); @@ -185,6 +204,11 @@ void GlslManager::onInit( mlt_properties owner, GlslManager* filter ) filter->set( "glsl_supported", movit_initialized ); } +void GlslManager::onClose( mlt_properties owner, GlslManager *filter ) +{ + filter->cleanupContext(); +} + void GlslManager::onServiceChanged( mlt_properties owner, mlt_service aservice ) { Mlt::Service service( aservice ); diff --git a/src/modules/opengl/glsl_manager.h b/src/modules/opengl/glsl_manager.h index a72820a8..56fc70d5 100644 --- a/src/modules/opengl/glsl_manager.h +++ b/src/modules/opengl/glsl_manager.h @@ -79,6 +79,7 @@ public: glsl_texture get_texture(int width, int height, GLint internal_format); static void release_texture(glsl_texture); glsl_pbo get_pbo(int size); + void cleanupContext(); Properties effect_list( Mlt::Service &service ); static bool init_chain(mlt_service); @@ -94,12 +95,14 @@ public: private: static void onInit( mlt_properties owner, GlslManager* filter ); + static void onClose( mlt_properties owner, GlslManager* filter ); static void onServiceChanged( mlt_properties owner, mlt_service service ); static void onPropertyChanged( mlt_properties owner, mlt_service service, const char* property ); Mlt::Deque fbo_list; Mlt::Deque texture_list; glsl_pbo pbo; Mlt::Event* initEvent; + Mlt::Event* closeEvent; }; #endif // GLSL_MANAGER_H