, pbo(0)
, initEvent(0)
, closeEvent(0)
+ , prev_sync(NULL)
{
mlt_filter filter = get_filter();
if ( filter ) {
// delete (glsl_texture) texture_list.pop_back();
delete initEvent;
delete closeEvent;
+ if (prev_sync != NULL) {
+ glDeleteSync( prev_sync );
+ }
}
GlslManager* GlslManager::get_instance()
texture->used = 0;
}
+void GlslManager::delete_sync(GLsync sync)
+{
+ glDeleteSync(sync);
+}
+
glsl_pbo GlslManager::get_pbo(int size)
{
lock();
mlt_properties_set_int( MLT_SERVICE_PROPERTIES(service), "_movit finalized", 0 );
}
-Effect* GlslManager::get_effect( mlt_filter filter, mlt_frame frame )
+Effect* GlslManager::get_effect( mlt_service service, mlt_frame frame )
{
Mlt::Producer producer( mlt_producer_cut_parent( mlt_frame_get_original_producer( frame ) ) );
- char *unique_id = mlt_properties_get( MLT_FILTER_PROPERTIES(filter), "_unique_id" );
+ char *unique_id = mlt_properties_get( MLT_SERVICE_PROPERTIES(service), "_unique_id" );
return (Effect*) GlslManager::get_instance()->effect_list( producer ).get_data( unique_id );
}
-Effect* GlslManager::add_effect( mlt_filter filter, mlt_frame frame, Effect* effect )
+Effect* GlslManager::add_effect( mlt_service service, mlt_frame frame, Effect* effect )
{
Mlt::Producer producer( mlt_producer_cut_parent( mlt_frame_get_original_producer( frame ) ) );
EffectChain* chain = (EffectChain*) producer.get_data( "movit chain" );
chain->add_effect( effect );
- char *unique_id = mlt_properties_get( MLT_FILTER_PROPERTIES(filter), "_unique_id" );
+ char *unique_id = mlt_properties_get( MLT_SERVICE_PROPERTIES(service), "_unique_id" );
GlslManager::get_instance()->effect_list( producer ).set( unique_id, effect, 0 );
return effect;
}
-Effect* GlslManager::add_effect( mlt_filter filter, mlt_frame frame, Effect* effect, Effect* input_b )
+Effect* GlslManager::add_effect( mlt_service service, mlt_frame frame, Effect* effect, Effect* input_b )
{
Mlt::Producer producer( mlt_producer_cut_parent( mlt_frame_get_original_producer( frame ) ) );
EffectChain* chain = (EffectChain*) producer.get_data( "movit chain" );
chain->add_effect( effect, chain->last_added_effect(),
input_b? input_b : chain->last_added_effect() );
- char *unique_id = mlt_properties_get( MLT_FILTER_PROPERTIES(filter), "_unique_id" );
+ char *unique_id = mlt_properties_get( MLT_SERVICE_PROPERTIES(service), "_unique_id" );
GlslManager::get_instance()->effect_list( producer ).set( unique_id, effect, 0 );
return effect;
}
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
check_error();
+ // Make sure we never have more than one frame pending at any time.
+ // This ensures we do not swamp the GPU with so much work
+ // that we cannot actually display the frames we generate.
+ if (prev_sync != NULL) {
+ glFlush();
+ glClientWaitSync( prev_sync, 0, GL_TIMEOUT_IGNORED );
+ glDeleteSync( prev_sync );
+ }
render_fbo( service, chain, fbo->fbo, width, height );
+ prev_sync = glFenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0 );
+ GLsync sync = glFenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0 );
- glFinish();
check_error();
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
check_error();
mlt_frame_set_image( frame, *image, 0, NULL );
mlt_properties_set_data( MLT_FRAME_PROPERTIES(frame), "movit.convert.texture", texture, 0,
(mlt_destructor) GlslManager::release_texture, NULL );
+ mlt_properties_set_data( MLT_FRAME_PROPERTIES(frame), "movit.convert.fence", sync, 0,
+ (mlt_destructor) GlslManager::delete_sync, NULL );
return 0;
}