BitmapTexturePool.cpp [plain text]
#include "config.h"
#include "BitmapTexturePool.h"
#if USE(TEXTURE_MAPPER_GL)
#include "BitmapTextureGL.h"
#include "GLContext.h"
#endif
namespace WebCore {
const double s_releaseUnusedSecondsTolerance = 3;
const double s_releaseUnusedTexturesTimerInterval = 0.5;
BitmapTexturePool::BitmapTexturePool()
: m_releaseUnusedTexturesTimer(*this, &BitmapTexturePool::releaseUnusedTexturesTimerFired)
{
}
#if USE(TEXTURE_MAPPER_GL)
BitmapTexturePool::BitmapTexturePool(PassRefPtr<GraphicsContext3D> context)
: m_context3D(context)
, m_releaseUnusedTexturesTimer(*this, &BitmapTexturePool::releaseUnusedTexturesTimerFired)
{
}
#endif
void BitmapTexturePool::scheduleReleaseUnusedTextures()
{
if (m_releaseUnusedTexturesTimer.isActive())
m_releaseUnusedTexturesTimer.stop();
m_releaseUnusedTexturesTimer.startOneShot(s_releaseUnusedTexturesTimerInterval);
}
void BitmapTexturePool::releaseUnusedTexturesTimerFired()
{
if (m_textures.isEmpty())
return;
std::sort(m_textures.begin(), m_textures.end(), BitmapTexturePoolEntry::compareTimeLastUsed);
double minUsedTime = monotonicallyIncreasingTime() - s_releaseUnusedSecondsTolerance;
for (size_t i = 0; i < m_textures.size(); ++i) {
if (m_textures[i].m_timeLastUsed < minUsedTime) {
m_textures.remove(i, m_textures.size() - i);
break;
}
}
}
PassRefPtr<BitmapTexture> BitmapTexturePool::acquireTexture(const IntSize& size)
{
BitmapTexturePoolEntry* selectedEntry = 0;
for (auto& entry : m_textures) {
if (entry.m_texture->refCount() > 1)
continue;
if (entry.m_texture->canReuseWith(size)) {
selectedEntry = &entry;
break;
}
}
if (!selectedEntry) {
m_textures.append(BitmapTexturePoolEntry(createTexture()));
selectedEntry = &m_textures.last();
}
scheduleReleaseUnusedTextures();
selectedEntry->markUsed();
return selectedEntry->m_texture;
}
PassRefPtr<BitmapTexture> BitmapTexturePool::createTexture()
{
#if USE(TEXTURE_MAPPER_GL)
BitmapTextureGL* texture = new BitmapTextureGL(m_context3D);
return adoptRef(texture);
#endif
}
}