#ifndef TextureManager_h
#define TextureManager_h
#include "GraphicsContext3D.h"
#include "IntRect.h"
#include "IntSize.h"
#include <wtf/FastAllocBase.h>
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/ListHashSet.h>
#include <wtf/Vector.h>
namespace WebCore {
class ManagedTexture;
typedef int TextureToken;
class TextureAllocator {
public:
virtual unsigned createTexture(const IntSize&, GC3Denum format) = 0;
virtual void deleteTexture(unsigned texture, const IntSize&, GC3Denum) = 0;
protected:
virtual ~TextureAllocator() { }
};
class TextureManager {
WTF_MAKE_NONCOPYABLE(TextureManager);
public:
static PassOwnPtr<TextureManager> create(size_t maxMemoryLimitBytes, size_t preferredMemoryLimitBytes, int maxTextureSize)
{
return adoptPtr(new TextureManager(maxMemoryLimitBytes, preferredMemoryLimitBytes, maxTextureSize));
}
~TextureManager();
static size_t highLimitBytes(const IntSize& viewportSize);
static size_t reclaimLimitBytes(const IntSize& viewportSize);
static size_t memoryUseBytes(const IntSize&, GC3Denum format);
void setMemoryAllocationLimitBytes(size_t);
void setMaxMemoryLimitBytes(size_t);
size_t maxMemoryLimitBytes() { return m_maxMemoryLimitBytes; }
void setPreferredMemoryLimitBytes(size_t);
size_t preferredMemoryLimitBytes() { return m_preferredMemoryLimitBytes; }
void registerTexture(ManagedTexture*);
void unregisterTexture(ManagedTexture*);
TextureToken getToken();
void releaseToken(TextureToken);
bool hasTexture(TextureToken);
bool requestTexture(TextureToken, IntSize, GC3Denum textureFormat);
void protectTexture(TextureToken);
void unprotectTexture(TextureToken);
void unprotectAllTextures();
bool isProtected(TextureToken);
unsigned allocateTexture(TextureAllocator*, TextureToken);
void deleteEvictedTextures(TextureAllocator*);
void evictAndDeleteAllTextures(TextureAllocator*);
void reduceMemoryToLimit(size_t);
size_t currentMemoryUseBytes() const { return m_memoryUseBytes; }
private:
TextureManager(size_t maxMemoryLimitBytes, size_t preferredMemoryLimitBytes, int maxTextureSize);
struct TextureInfo {
IntSize size;
GC3Denum format;
unsigned textureId;
bool isProtected;
#ifndef NDEBUG
TextureAllocator* allocator;
#endif
};
void addTexture(TextureToken, TextureInfo);
void removeTexture(TextureToken, TextureInfo);
void evictTexture(TextureToken, TextureInfo);
HashSet<ManagedTexture*> m_registeredTextures;
typedef HashMap<TextureToken, TextureInfo> TextureMap;
TextureMap m_textures;
ListHashSet<TextureToken> m_textureLRUSet;
size_t m_maxMemoryLimitBytes;
size_t m_preferredMemoryLimitBytes;
size_t m_memoryUseBytes;
int m_maxTextureSize;
TextureToken m_nextToken;
struct EvictionEntry {
unsigned textureId;
IntSize size;
GC3Denum format;
#ifndef NDEBUG
TextureAllocator* allocator;
#endif
};
Vector<EvictionEntry> m_evictedTextures;
};
}
#endif