tahoma2d/toonz/sources/common/tfx/trenderresourcemanager.cpp

249 lines
8.8 KiB
C++
Raw Normal View History

2016-03-19 06:57:51 +13:00
#include "trenderresourcemanager.h"
#include "trenderer.h"
//***********************************************************************************************
// Resource managers builder for instance-scoped resource managers
//***********************************************************************************************
/*
2016-06-15 18:43:10 +12:00
This manager class is used to create and destroy instance-scope managers through
the
renderStart/renderEnd notifications. Observe that this involves maintenance of a
container
2016-03-19 06:57:51 +13:00
structure of the active renderIds against resource managers.
*/
class RenderInstanceManagersBuilder final : public TRenderResourceManager {
2016-06-15 18:43:10 +12:00
T_RENDER_RESOURCE_MANAGER
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
typedef std::vector<TRenderResourceManager *> ManagersVector;
std::map<unsigned long, ManagersVector> m_managersMap;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
RenderInstanceManagersBuilder() {}
~RenderInstanceManagersBuilder() {}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
static RenderInstanceManagersBuilder *instance();
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
TRenderResourceManager *getManager(unsigned long renderId,
unsigned int idx) const;
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void onRenderInstanceStart(unsigned long id) override;
void onRenderInstanceEnd(unsigned long id) override;
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
bool renderHasOwnership() override { return false; }
2016-03-19 06:57:51 +13:00
};
//===============================================================================================
class RenderInstanceManagersBuilderGenerator final
2016-06-15 18:43:10 +12:00
: public TRenderResourceManagerGenerator {
2016-03-19 06:57:51 +13:00
public:
2016-06-19 20:06:29 +12:00
TRenderResourceManager *operator()(void) override {
2016-06-15 18:43:10 +12:00
return RenderInstanceManagersBuilder::instance();
}
2016-03-19 06:57:51 +13:00
};
2016-06-15 18:43:10 +12:00
MANAGER_FILESCOPE_DECLARATION(RenderInstanceManagersBuilder,
RenderInstanceManagersBuilderGenerator);
2016-03-19 06:57:51 +13:00
//***********************************************************************************************
// Stub managers and generators
//***********************************************************************************************
/*
2016-06-15 18:43:10 +12:00
These manager-generator stubs are substitutes used to maintain dependency order
about managers
which have render instance scope. They retrieve ordered event calls that are
passed to the
2016-03-19 06:57:51 +13:00
dedicated instanceScope handler.
*/
class InstanceResourceManagerStub final : public TRenderResourceManager {
2016-06-15 18:43:10 +12:00
TRenderResourceManagerGenerator *m_generator;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
InstanceResourceManagerStub(TRenderResourceManagerGenerator *generator)
: m_generator(generator) {}
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void onRenderInstanceStart(unsigned long id) override;
void onRenderInstanceEnd(unsigned long id) override;
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void onRenderFrameStart(double f) override;
void onRenderFrameEnd(double f) override;
2016-03-19 06:57:51 +13:00
2016-06-19 20:06:29 +12:00
void onRenderStatusStart(int renderStatus) override;
void onRenderStatusEnd(int renderStatus) override;
2016-03-19 06:57:51 +13:00
};
//===============================================================================================
class StubGenerator final : public TRenderResourceManagerGenerator {
2016-06-15 18:43:10 +12:00
TRenderResourceManagerGenerator *m_generator;
2016-03-19 06:57:51 +13:00
public:
2016-06-15 18:43:10 +12:00
StubGenerator(TRenderResourceManagerGenerator *generator)
: m_generator(generator) {}
2016-06-19 20:06:29 +12:00
TRenderResourceManager *operator()() override {
2016-06-15 18:43:10 +12:00
return new InstanceResourceManagerStub(m_generator);
}
2016-03-19 06:57:51 +13:00
};
//***********************************************************************************************
// TRenderResourceManagerGenerator methods
//***********************************************************************************************
2016-06-15 18:43:10 +12:00
std::vector<TRenderResourceManagerGenerator *>
&TRenderResourceManagerGenerator::generators() {
static std::vector<TRenderResourceManagerGenerator *> generatorsInstance;
return generatorsInstance;
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
std::vector<TRenderResourceManagerGenerator *>
&TRenderResourceManagerGenerator::generators(bool instanceScope) {
static std::vector<TRenderResourceManagerGenerator *> generatorsInstance;
static std::vector<TRenderResourceManagerGenerator *> generatorsRenderer;
return instanceScope ? generatorsInstance : generatorsRenderer;
2016-03-19 06:57:51 +13:00
}
//===============================================================================================
2016-06-15 18:43:10 +12:00
TRenderResourceManagerGenerator::TRenderResourceManagerGenerator(
bool renderInstanceScope)
: m_instanceScope(renderInstanceScope) {
// In case this has a renderInstanceScope, build a stub generator
if (renderInstanceScope) {
RenderInstanceManagersBuilder::gen(); // Stubs depend on this manager
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
static std::vector<TRenderResourceManagerGenerator *> stubGenerators;
stubGenerators.push_back(new StubGenerator(this));
}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
generators().push_back(this);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
std::vector<TRenderResourceManagerGenerator *> &scopeGenerators =
generators(renderInstanceScope);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
scopeGenerators.push_back(this);
m_managerIndex = scopeGenerators.size() - 1;
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
TRenderResourceManager *TRenderResourceManagerGenerator::getManager(
const TRenderer &renderer) const {
return m_instanceScope ? 0 : renderer.getManager(m_managerIndex);
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
TRenderResourceManager *TRenderResourceManagerGenerator::getManager(
unsigned long renderId) const {
return m_instanceScope
? RenderInstanceManagersBuilder::instance()->getManager(
renderId, m_managerIndex)
: 0;
2016-03-19 06:57:51 +13:00
}
//***********************************************************************************************
// "Instance-scoped Managers" - Management methods
//***********************************************************************************************
2016-06-15 18:43:10 +12:00
RenderInstanceManagersBuilder *RenderInstanceManagersBuilder::instance() {
static RenderInstanceManagersBuilder theInstance;
return &theInstance;
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
inline TRenderResourceManager *RenderInstanceManagersBuilder::getManager(
unsigned long renderId, unsigned int idx) const {
std::map<unsigned long, ManagersVector>::const_iterator it =
m_managersMap.find(renderId);
return it == m_managersMap.end() ? 0 : it->second[idx];
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void RenderInstanceManagersBuilder::onRenderInstanceStart(unsigned long id) {
// Build the instance managers
std::map<unsigned long, ManagersVector>::iterator it =
m_managersMap.insert(std::make_pair(id, ManagersVector())).first;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
std::vector<TRenderResourceManagerGenerator *> &instanceScopeGenerators =
TRenderResourceManagerGenerator::generators(true);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
unsigned int i;
for (i = 0; i < instanceScopeGenerators.size(); ++i)
it->second.push_back((*instanceScopeGenerators[i])());
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void RenderInstanceManagersBuilder::onRenderInstanceEnd(unsigned long id) {
// Delete the instance managers
std::map<unsigned long, ManagersVector>::iterator it = m_managersMap.find(id);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
assert(it != m_managersMap.end());
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
unsigned int i;
for (i = 0; i < it->second.size(); ++i) {
if (it->second[i]->renderHasOwnership()) delete it->second[i];
}
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
m_managersMap.erase(it);
2016-03-19 06:57:51 +13:00
}
//===============================================================================================
2016-06-15 18:43:10 +12:00
void InstanceResourceManagerStub::onRenderInstanceStart(unsigned long id) {
RenderInstanceManagersBuilder::instance()
->getManager(id, m_generator->getGeneratorIndex())
->onRenderInstanceStart(id);
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void InstanceResourceManagerStub::onRenderInstanceEnd(unsigned long id) {
RenderInstanceManagersBuilder::instance()
->getManager(id, m_generator->getGeneratorIndex())
->onRenderInstanceEnd(id);
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void InstanceResourceManagerStub::onRenderFrameStart(double f) {
RenderInstanceManagersBuilder::instance()
->getManager(TRenderer::renderId(), m_generator->getGeneratorIndex())
->onRenderFrameStart(f);
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void InstanceResourceManagerStub::onRenderFrameEnd(double f) {
RenderInstanceManagersBuilder::instance()
->getManager(TRenderer::renderId(), m_generator->getGeneratorIndex())
->onRenderFrameEnd(f);
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void InstanceResourceManagerStub::onRenderStatusStart(int renderStatus) {
RenderInstanceManagersBuilder::instance()
->getManager(TRenderer::renderId(), m_generator->getGeneratorIndex())
->onRenderStatusStart(renderStatus);
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void InstanceResourceManagerStub::onRenderStatusEnd(int renderStatus) {
RenderInstanceManagersBuilder::instance()
->getManager(TRenderer::renderId(), m_generator->getGeneratorIndex())
->onRenderStatusEnd(renderStatus);
2016-03-19 06:57:51 +13:00
}