forked from organicmaps/organicmaps
lazy allocation of Storage's to improve resource usage.
This commit is contained in:
parent
c788de35e5
commit
1a9172ea52
2 changed files with 53 additions and 19 deletions
|
@ -70,6 +70,21 @@ namespace yg
|
|||
}
|
||||
}
|
||||
|
||||
void GeometryBatcher::GeometryPipeline::checkStorage(shared_ptr<ResourceManager> const & resourceManager, bool isDynamic) const
|
||||
{
|
||||
if (!m_hasStorage)
|
||||
{
|
||||
m_storage = isDynamic ? resourceManager->reserveStorage() : resourceManager->reserveSmallStorage();
|
||||
|
||||
m_maxVertices = m_storage.m_vertices->size() / sizeof(Vertex);
|
||||
m_maxIndices = m_storage.m_indices->size() / sizeof(unsigned short);
|
||||
|
||||
m_vertices = (Vertex*)m_storage.m_vertices->lock();
|
||||
m_indices = (unsigned short *)m_storage.m_indices->lock();
|
||||
m_hasStorage = true;
|
||||
}
|
||||
}
|
||||
|
||||
void GeometryBatcher::setSkin(shared_ptr<Skin> skin)
|
||||
{
|
||||
m_skin = skin;
|
||||
|
@ -87,13 +102,13 @@ namespace yg
|
|||
m_pipelines[i].m_currentVertex = 0;
|
||||
m_pipelines[i].m_currentIndex = 0;
|
||||
|
||||
m_pipelines[i].m_storage = m_skin->pages()[i]->isDynamic() ? resourceManager()->reserveStorage() : resourceManager()->reserveSmallStorage();
|
||||
m_pipelines[i].m_hasStorage = false;
|
||||
|
||||
m_pipelines[i].m_maxVertices = m_pipelines[i].m_storage.m_vertices->size() / sizeof(Vertex);
|
||||
m_pipelines[i].m_maxIndices = m_pipelines[i].m_storage.m_indices->size() / sizeof(unsigned short);
|
||||
m_pipelines[i].m_maxVertices = 0;
|
||||
m_pipelines[i].m_maxIndices = 0;
|
||||
|
||||
m_pipelines[i].m_vertices = (Vertex*)m_pipelines[i].m_storage.m_vertices->lock();
|
||||
m_pipelines[i].m_indices = (unsigned short *)m_pipelines[i].m_storage.m_indices->lock();
|
||||
m_pipelines[i].m_vertices = 0;
|
||||
m_pipelines[i].m_indices = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -148,17 +163,22 @@ namespace yg
|
|||
|
||||
bool GeometryBatcher::hasRoom(size_t verticesCount, size_t indicesCount, int pageID) const
|
||||
{
|
||||
m_pipelines[pageID].checkStorage(resourceManager(), skin()->pages()[pageID]->isDynamic());
|
||||
|
||||
return ((m_pipelines[pageID].m_currentVertex + verticesCount <= m_pipelines[pageID].m_maxVertices)
|
||||
&& (m_pipelines[pageID].m_currentIndex + indicesCount <= m_pipelines[pageID].m_maxIndices));
|
||||
}
|
||||
|
||||
size_t GeometryBatcher::verticesLeft(int pageID)
|
||||
{
|
||||
m_pipelines[pageID].checkStorage(resourceManager(), skin()->pages()[pageID]->isDynamic());
|
||||
|
||||
return m_pipelines[pageID].m_maxVertices - m_pipelines[pageID].m_currentVertex;
|
||||
}
|
||||
|
||||
size_t GeometryBatcher::indicesLeft(int pageID)
|
||||
{
|
||||
m_pipelines[pageID].checkStorage(resourceManager(), skin()->pages()[pageID]->isDynamic());
|
||||
return m_pipelines[pageID].m_maxIndices - m_pipelines[pageID].m_currentIndex;
|
||||
}
|
||||
|
||||
|
@ -201,12 +221,14 @@ namespace yg
|
|||
resourceManager()->freeStorage(pipeline.m_storage);
|
||||
else
|
||||
resourceManager()->freeSmallStorage(pipeline.m_storage);
|
||||
pipeline.m_storage = skinPage->isDynamic() ? resourceManager()->reserveStorage() : resourceManager()->reserveSmallStorage();
|
||||
pipeline.m_maxVertices = pipeline.m_storage.m_vertices->size() / sizeof(Vertex);
|
||||
pipeline.m_maxIndices = pipeline.m_storage.m_indices->size() / sizeof(unsigned short);
|
||||
|
||||
pipeline.m_vertices = (Vertex*)pipeline.m_storage.m_vertices->lock();
|
||||
pipeline.m_indices = (unsigned short*)pipeline.m_storage.m_indices->lock();
|
||||
pipeline.m_hasStorage = false;
|
||||
pipeline.m_storage = Storage();
|
||||
pipeline.m_maxIndices = 0;
|
||||
pipeline.m_maxVertices = 0;
|
||||
pipeline.m_vertices = 0;
|
||||
pipeline.m_indices = 0;
|
||||
|
||||
}
|
||||
|
||||
reset(i - 1);
|
||||
|
@ -217,12 +239,8 @@ namespace yg
|
|||
|
||||
void GeometryBatcher::switchTextures(int pageID)
|
||||
{
|
||||
// if (m_pipelines[pageID].m_currentIndex > 0)
|
||||
// {
|
||||
// LOG(LINFO, ("Improving Parallelism ;)"));
|
||||
m_skin->pages()[pageID]->freeTexture();
|
||||
m_skin->pages()[pageID]->reserveTexture();
|
||||
// }
|
||||
}
|
||||
|
||||
void GeometryBatcher::drawTexturedPolygon(
|
||||
|
@ -236,6 +254,8 @@ namespace yg
|
|||
if (!hasRoom(4, 6, pageID))
|
||||
flush(pageID);
|
||||
|
||||
m_pipelines[pageID].checkStorage(resourceManager(), skin()->pages()[pageID]->isDynamic());
|
||||
|
||||
float texMinX = tx0;
|
||||
float texMaxX = tx1;
|
||||
float texMinY = ty0;
|
||||
|
@ -289,6 +309,8 @@ namespace yg
|
|||
if (!hasRoom(size, (size - 2) * 3, pageID))
|
||||
flush(pageID);
|
||||
|
||||
m_pipelines[pageID].checkStorage(resourceManager(), skin()->pages()[pageID]->isDynamic());
|
||||
|
||||
ASSERT(size > 2, ());
|
||||
|
||||
size_t vOffset = m_pipelines[pageID].m_currentVertex;
|
||||
|
@ -337,6 +359,8 @@ namespace yg
|
|||
if (!hasRoom(size, (size - 2) * 3, pageID))
|
||||
flush(pageID);
|
||||
|
||||
m_pipelines[pageID].checkStorage(resourceManager(), skin()->pages()[pageID]->isDynamic());
|
||||
|
||||
ASSERT(size > 2, ());
|
||||
|
||||
size_t vOffset = m_pipelines[pageID].m_currentVertex;
|
||||
|
@ -381,6 +405,8 @@ namespace yg
|
|||
if (!hasRoom(size, size, pageID))
|
||||
flush(pageID);
|
||||
|
||||
m_pipelines[pageID].checkStorage(resourceManager(), skin()->pages()[pageID]->isDynamic());
|
||||
|
||||
ASSERT(size > 2, ());
|
||||
|
||||
size_t vOffset = m_pipelines[pageID].m_currentVertex;
|
||||
|
@ -416,6 +442,8 @@ namespace yg
|
|||
if (!hasRoom(size, size, pageID))
|
||||
flush(pageID);
|
||||
|
||||
m_pipelines[pageID].checkStorage(resourceManager(), skin()->pages()[pageID]->isDynamic());
|
||||
|
||||
ASSERT(size > 2, ());
|
||||
|
||||
size_t vOffset = m_pipelines[pageID].m_currentVertex;
|
||||
|
|
|
@ -62,16 +62,22 @@ namespace yg
|
|||
size_t m_currentVertex;
|
||||
size_t m_currentIndex;
|
||||
|
||||
size_t m_maxVertices;
|
||||
size_t m_maxIndices;
|
||||
/// made mutable to implement lazy reservation of m_storage
|
||||
/// @{
|
||||
mutable size_t m_maxVertices;
|
||||
mutable size_t m_maxIndices;
|
||||
|
||||
Storage m_storage;
|
||||
mutable bool m_hasStorage;
|
||||
mutable Storage m_storage;
|
||||
|
||||
Vertex * m_vertices;
|
||||
unsigned short * m_indices;
|
||||
mutable Vertex * m_vertices;
|
||||
mutable unsigned short * m_indices;
|
||||
/// @}
|
||||
|
||||
size_t verticesLeft();
|
||||
size_t indicesLeft();
|
||||
|
||||
void checkStorage(shared_ptr<ResourceManager> const & resourceManager, bool isDynamic) const;
|
||||
};
|
||||
|
||||
vector<GeometryPipeline> m_pipelines;
|
||||
|
|
Loading…
Add table
Reference in a new issue