diff --git a/app/render/plugin/pluginrenderer.cpp b/app/render/plugin/pluginrenderer.cpp index cb9b96bde..6bf41f166 100644 --- a/app/render/plugin/pluginrenderer.cpp +++ b/app/render/plugin/pluginrenderer.cpp @@ -1493,7 +1493,11 @@ void olive::plugin::PluginRenderer::RenderPlugin(TexturePtr src, olive::plugin:: // failure and would otherwise crash the render thread. bool ok = false; try { - ok = instance->getClipPreferences(); + if (instance->areClipPrefsDirty()) { + ok = instance->getClipPreferences(); + } else { + ok = true; + } } catch (const OFX::Host::Property::Exception &e) { qWarning().noquote() << "OFX getClipPreferences threw exception for plugin=" << PluginIdForInstance(instance) @@ -1658,6 +1662,10 @@ void olive::plugin::PluginRenderer::RenderPlugin(TexturePtr src, olive::plugin:: return; } + // Inject current parameter values into the OFX instance before rendering. + // Parameters are bound to PluginNode inputs, so they change every frame. + ApplyParamOverrides(*instance, job.GetValues(), frame); + // render a frame const char *render_field = GetRenderFieldForParams(output_params); stat = instance->renderAction(frame, render_field, renderWindow, renderScale, diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 28265f803..a628dd9dc 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -628,15 +628,24 @@ TexturePtr RenderProcessor::ProcessPluginJob(TexturePtr texture, return destination; } - if (!plugin_renderer_) { - auto *gl = dynamic_cast(render_ctx_); - if (!gl || !gl->context()) { - return destination; + plugin::PluginRenderer *plugin_renderer = nullptr; + { + thread_local static std::shared_ptr + cached_plugin_renderer; + if (!cached_plugin_renderer) { + auto *gl = dynamic_cast(render_ctx_); + if (gl && gl->context()) { + cached_plugin_renderer = + std::make_shared(); + cached_plugin_renderer->Init(gl->context()); + cached_plugin_renderer->PostInit(); + } } + plugin_renderer = cached_plugin_renderer.get(); + } - plugin_renderer_ = std::make_unique(); - plugin_renderer_->Init(gl->context()); - plugin_renderer_->PostInit(); + if (!plugin_renderer) { + return destination; } NodeValueRow &values = plugin_job->GetValues(); @@ -687,7 +696,7 @@ TexturePtr RenderProcessor::ProcessPluginJob(TexturePtr texture, } } - plugin_renderer_->RenderPlugin( + plugin_renderer->RenderPlugin( src, *plugin_job, destination,