render one frame per thread for increased parallelism
If the nodes are now stateless, there's nothing stopping the renderer from rendering multiple frames at once. Earlier since the nodes held some of their input/output data (and that data could change per frame), it was not possible to render multiple frames at once without conflicts. Now that the node state is held in render threads, they can do whatever they want at any time.
This commit is contained in:
@@ -4,17 +4,16 @@
|
||||
|
||||
#include "node/block/block.h"
|
||||
|
||||
RenderWorker::RenderWorker(DecoderCache *decoder_cache, QObject *parent) :
|
||||
RenderWorker::RenderWorker(QObject *parent) :
|
||||
QObject(parent),
|
||||
working_(0),
|
||||
started_(false),
|
||||
decoder_cache_(decoder_cache)
|
||||
started_(false)
|
||||
{
|
||||
}
|
||||
|
||||
bool RenderWorker::IsAvailable()
|
||||
{
|
||||
return (working_ == 0);
|
||||
return !working_;
|
||||
}
|
||||
|
||||
bool RenderWorker::Init()
|
||||
@@ -34,6 +33,8 @@ void RenderWorker::Close()
|
||||
{
|
||||
CloseInternal();
|
||||
|
||||
decoder_cache_.Clear();
|
||||
|
||||
started_ = false;
|
||||
}
|
||||
|
||||
@@ -70,11 +71,6 @@ NodeValueTable RenderWorker::RenderAsSibling(NodeDependency dep)
|
||||
return value;
|
||||
}
|
||||
|
||||
DecoderCache *RenderWorker::decoder_cache()
|
||||
{
|
||||
return decoder_cache_;
|
||||
}
|
||||
|
||||
NodeValueTable RenderWorker::RenderInternal(const NodeDependency &path)
|
||||
{
|
||||
return RenderAsSibling(path);
|
||||
@@ -101,13 +97,13 @@ StreamPtr RenderWorker::ResolveStreamFromInput(NodeInput *input)
|
||||
DecoderPtr RenderWorker::ResolveDecoderFromInput(StreamPtr stream)
|
||||
{
|
||||
// Access a map of Node inputs and decoder instances and retrieve a frame!
|
||||
DecoderPtr decoder = decoder_cache()->Get(stream.get());
|
||||
DecoderPtr decoder = decoder_cache_.Get(stream.get());
|
||||
|
||||
if (decoder == nullptr && stream != nullptr) {
|
||||
// Create a new Decoder here
|
||||
DecoderPtr decoder = Decoder::CreateFromID(stream->footage()->decoder());
|
||||
decoder = Decoder::CreateFromID(stream->footage()->decoder());
|
||||
decoder->set_stream(stream);
|
||||
decoder_cache()->Add(stream.get(), decoder);
|
||||
decoder_cache_.Add(stream.get(), decoder);
|
||||
}
|
||||
|
||||
return decoder;
|
||||
|
||||
Reference in New Issue
Block a user