]> git.sesse.net Git - mlt/commitdiff
Add "close glsl" event to glsl.manager service.
authorDan Dennedy <dan@dennedy.org>
Sat, 24 Aug 2013 18:33:04 +0000 (11:33 -0700)
committerDan Dennedy <dan@dennedy.org>
Sat, 24 Aug 2013 18:33:04 +0000 (11:33 -0700)
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.

src/modules/opengl/filter_glsl_manager.cpp
src/modules/opengl/glsl_manager.h

index ef6eca45e9bf4be340adf9d2b4819f572a1f3a90..2370c58a9ae1df9d30d94be223e5b358e4aec492 100644 (file)
@@ -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 );
index a72820a826f36e29ecb537f9b71145fb0dbf9a7f..56fc70d50ffc4e2dd35689939fe9600c2cb93999 100644 (file)
@@ -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