Tidying up prefetch function.
This commit is contained in:
parent
e88466ad4d
commit
38b8764129
@ -340,6 +340,7 @@ namespace PolyVox
|
|||||||
template <typename VoxelType>
|
template <typename VoxelType>
|
||||||
void LargeVolume<VoxelType>::prefetch(Region regPrefetch)
|
void LargeVolume<VoxelType>::prefetch(Region regPrefetch)
|
||||||
{
|
{
|
||||||
|
// Convert the start and end positions into block space coordinates
|
||||||
Vector3DInt32 v3dStart;
|
Vector3DInt32 v3dStart;
|
||||||
for(int i = 0; i < 3; i++)
|
for(int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
@ -352,46 +353,21 @@ namespace PolyVox
|
|||||||
v3dEnd.setElement(i, regPrefetch.getUpperCorner().getElement(i) >> m_uBlockSideLengthPower);
|
v3dEnd.setElement(i, regPrefetch.getUpperCorner().getElement(i) >> m_uBlockSideLengthPower);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3DInt32 v3dSize = v3dEnd - v3dStart + Vector3DInt32(1,1,1);
|
Region region(v3dStart, v3dEnd);
|
||||||
uint32_t numblocks = static_cast<uint32_t>(v3dSize.getX() * v3dSize.getY() * v3dSize.getZ());
|
uint32_t uNoOfBlocks = static_cast<uint32_t>(region.getWidthInVoxels() * region.getHeightInVoxels() * region.getDepthInVoxels());
|
||||||
|
POLYVOX_LOG_WARNING_IF(uNoOfBlocks > m_uMaxNumberOfUncompressedBlocks, "Attempting to prefetch more than the maximum number of blocks.");
|
||||||
|
uNoOfBlocks = (std::min)(uNoOfBlocks, m_uMaxNumberOfUncompressedBlocks);
|
||||||
|
|
||||||
// FIXME - reinstate some logic to handle when the prefetched region is too large.
|
|
||||||
|
|
||||||
/*if(numblocks > m_uMaxNumberOfBlocksInMemory)
|
|
||||||
{
|
|
||||||
// cannot support the amount of blocks... so only load the maximum possible
|
|
||||||
numblocks = m_uMaxNumberOfBlocksInMemory;
|
|
||||||
}*/
|
|
||||||
for(int32_t x = v3dStart.getX(); x <= v3dEnd.getX(); x++)
|
for(int32_t x = v3dStart.getX(); x <= v3dEnd.getX(); x++)
|
||||||
{
|
{
|
||||||
for(int32_t y = v3dStart.getY(); y <= v3dEnd.getY(); y++)
|
for(int32_t y = v3dStart.getY(); y <= v3dEnd.getY(); y++)
|
||||||
{
|
{
|
||||||
for(int32_t z = v3dStart.getZ(); z <= v3dEnd.getZ(); z++)
|
for(int32_t z = v3dStart.getZ(); z <= v3dEnd.getZ(); z++)
|
||||||
{
|
{
|
||||||
Vector3DInt32 pos(x,y,z);
|
|
||||||
/*typename CompressedBlockMap::iterator itBlock = m_pRecentlyUsedBlocks.find(pos);
|
|
||||||
|
|
||||||
if(itBlock != m_pRecentlyUsedBlocks.end())
|
|
||||||
{
|
|
||||||
// If the block is already loaded then we don't load it again. This means it does not get uncompressed,
|
|
||||||
// whereas if we were to call getUncompressedBlock() regardless then it would also get uncompressed.
|
|
||||||
// This might be nice, but on the prefetch region could be bigger than the uncompressed cache size.
|
|
||||||
// This would limit the amount of prefetching we could do.
|
|
||||||
continue;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if(numblocks == 0)
|
|
||||||
{
|
|
||||||
// Loading any more blocks would attempt to overflow the memory and therefore erase blocks
|
|
||||||
// we loaded in the beginning. This wouldn't cause logic problems but would be wasteful.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// load a block
|
|
||||||
numblocks--;
|
|
||||||
getUncompressedBlock(x,y,z);
|
getUncompressedBlock(x,y,z);
|
||||||
} // for z
|
}
|
||||||
} // for y
|
}
|
||||||
} // for x
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
Loading…
x
Reference in New Issue
Block a user