2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
|
|
|
|
// TnzCore includes
|
|
|
|
#include "tsmartpointer.h"
|
|
|
|
|
|
|
|
// tcg includes
|
|
|
|
#include "tcg/tcg_list.h"
|
|
|
|
|
|
|
|
#include "tgldisplaylistsmanager.h"
|
|
|
|
|
|
|
|
//***********************************************************************************************
|
|
|
|
// Local namespace - declarations
|
|
|
|
//***********************************************************************************************
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
namespace {
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
struct ProxyReference {
|
2016-06-15 18:43:10 +12:00
|
|
|
TGLDisplayListsProxy *m_proxy;
|
|
|
|
int m_refCount;
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
ProxyReference(TGLDisplayListsProxy *proxy) : m_proxy(proxy), m_refCount() {}
|
2016-03-19 06:57:51 +13:00
|
|
|
};
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
} // namespace
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
//***********************************************************************************************
|
|
|
|
// Local namespace - globals
|
|
|
|
//***********************************************************************************************
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
namespace {
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
tcg::list<ProxyReference> m_proxies;
|
|
|
|
std::map<TGlContext, int> m_proxyIdsByContext;
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
} // namespace
|
2016-03-19 06:57:51 +13:00
|
|
|
|
|
|
|
//***********************************************************************************************
|
|
|
|
// TGLDisplayListsManager implementation
|
|
|
|
//***********************************************************************************************
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TGLDisplayListsManager *TGLDisplayListsManager::instance() {
|
|
|
|
static TGLDisplayListsManager theInstance;
|
|
|
|
return &theInstance;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
int TGLDisplayListsManager::storeProxy(TGLDisplayListsProxy *proxy) {
|
|
|
|
return m_proxies.push_back(ProxyReference(proxy));
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void TGLDisplayListsManager::attachContext(int dlSpaceId, TGlContext context) {
|
|
|
|
m_proxyIdsByContext.insert(std::make_pair(context, dlSpaceId));
|
|
|
|
++m_proxies[dlSpaceId].m_refCount;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
void TGLDisplayListsManager::releaseContext(TGlContext context) {
|
|
|
|
std::map<TGlContext, int>::iterator it = m_proxyIdsByContext.find(context);
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
assert(it != m_proxyIdsByContext.end());
|
|
|
|
if (it == m_proxyIdsByContext.end()) return;
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
int dlSpaceId = it->second;
|
|
|
|
if (--m_proxies[dlSpaceId].m_refCount <= 0) {
|
|
|
|
// Notify observers first
|
|
|
|
observers_container::const_iterator ot, oEnd = observers().end();
|
|
|
|
for (ot = observers().begin(); ot != oEnd; ++ot)
|
|
|
|
static_cast<Observer *>(*ot)->onDisplayListDestroyed(dlSpaceId);
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
// Then, destroy stuff
|
|
|
|
delete m_proxies[dlSpaceId].m_proxy;
|
|
|
|
m_proxies.erase(dlSpaceId);
|
|
|
|
}
|
2016-03-19 06:57:51 +13:00
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
m_proxyIdsByContext.erase(it);
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
int TGLDisplayListsManager::displayListsSpaceId(TGlContext context) {
|
|
|
|
std::map<TGlContext, int>::iterator it = m_proxyIdsByContext.find(context);
|
|
|
|
return (it == m_proxyIdsByContext.end()) ? -1 : it->second;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
|
2016-06-15 18:43:10 +12:00
|
|
|
TGLDisplayListsProxy *TGLDisplayListsManager::dlProxy(int dlSpaceId) {
|
|
|
|
return m_proxies[dlSpaceId].m_proxy;
|
2016-03-19 06:57:51 +13:00
|
|
|
}
|