1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/*
* Copyright (C) 2011, 2012, 2013 Research In Motion Limited. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef TextureCacheCompositingThread_h
#define TextureCacheCompositingThread_h
#if USE(ACCELERATED_COMPOSITING)
#include "Color.h"
#include "LayerTexture.h"
#include "LayerTileIndex.h"
#include <BlackBerryPlatformGraphics.h>
#include <wtf/HashMap.h>
#include <wtf/ListHashSet.h>
#include <wtf/Noncopyable.h>
#include <wtf/PassRefPtr.h>
#include <wtf/RefPtr.h>
#include <wtf/Vector.h>
namespace WebCore {
class IntRect;
// A LRU cache for OpenGL textures.
class TextureCacheCompositingThread {
WTF_MAKE_NONCOPYABLE(TextureCacheCompositingThread);
WTF_MAKE_FAST_ALLOCATED;
public:
friend TextureCacheCompositingThread* textureCacheCompositingThread();
// Creates a new texture managed by this cache.
PassRefPtr<LayerTexture> createTexture()
{
return LayerTexture::create();
}
// Retrieve a texture from the cache.
PassRefPtr<LayerTexture> textureForContents(BlackBerry::Platform::Graphics::Buffer*);
PassRefPtr<LayerTexture> textureForColor(const Color&);
// Update contents of an existing texture, or create a new one if texture is 0.
PassRefPtr<LayerTexture> updateContents(const RefPtr<LayerTexture>&, BlackBerry::Platform::Graphics::Buffer*);
size_t memoryUsage() const { return m_memoryUsage; }
size_t memoryLimit() const { return m_memoryLimit; }
void setMemoryLimit(size_t limit) { m_memoryLimit = limit; }
// Evict unprotected textures until we reach the limit provided.
void prune(size_t limit);
void prune() { prune(memoryLimit()); }
// Evict all textures from the cache.
void clear();
// Update the LRU list.
void textureAccessed(LayerTexture*);
// Deleting destroyed textures is provided as a separate method, because
// there might not be an OpenGL context current when the texture destructor
// was called. Calling this makes sure to free any such textures.
void collectGarbage();
void textureDestroyed(LayerTexture*);
void textureResized(LayerTexture*, const IntSize& oldSize);
void textureSizeInBytesChanged(LayerTexture*, int delta);
// Undo the effects of eviction, if possible.
bool install(LayerTexture*, const IntSize& textureSize = IntSize(0, 0), BlackBerry::Platform::Graphics::BufferType = BlackBerry::Platform::Graphics::BackedWhenNecessary);
bool resizeTexture(LayerTexture*, const IntSize& newSize, BlackBerry::Platform::Graphics::BufferType = BlackBerry::Platform::Graphics::BackedWhenNecessary);
private:
struct ZombieTexture {
explicit ZombieTexture(LayerTexture* texture)
: buffer(texture->buffer())
, size(texture->size())
, sizeInBytes(texture->sizeInBytes())
{
}
BlackBerry::Platform::Graphics::Buffer* buffer;
IntSize size;
size_t sizeInBytes;
};
typedef ListHashSet<LayerTexture* > TextureSet;
typedef HashMap<TileIndex, RefPtr<LayerTexture> > TextureMap;
typedef Vector<ZombieTexture> Garbage;
TextureCacheCompositingThread();
~TextureCacheCompositingThread();
BlackBerry::Platform::Graphics::Buffer* createBuffer(const IntSize& textureSize, BlackBerry::Platform::Graphics::BufferType);
void incMemoryUsage(int delta) { setMemoryUsage(memoryUsage() + delta); }
void decMemoryUsage(int delta) { setMemoryUsage(memoryUsage() - delta); }
void setMemoryUsage(size_t);
void evict(const TextureSet::iterator&);
// LRU set of weak pointers to textures.
TextureSet m_textures;
size_t m_memoryUsage;
size_t m_memoryLimit;
struct ColorHash {
static unsigned hash(const Color& key) { return WTF::intHash(key.rgb()); }
static bool equal(const Color& a, const Color& b) { return a == b; }
static const bool safeToCompareToEmptyOrDeleted = true;
};
struct ColorHashTraits : WTF::GenericHashTraits<Color> {
static const bool emptyValueIsZero = true;
// The deleted value is an invalid color with an RGB value of 0xFFFFFFFF.
// Such values do not naturally occur as colors.
// And empty value is an invalid color with an RGB value of 0x0.
static void constructDeletedValue(Color& slot) { new (&slot) Color(); *reinterpret_cast<RGBA32*>(&slot) = Color::white; }
static bool isDeletedValue(const Color& value) { return !value.isValid() && value.rgb() == Color::white; }
};
typedef HashMap<Color, RefPtr<LayerTexture>, ColorHash, ColorHashTraits> ColorTextureMap;
ColorTextureMap m_colors;
Garbage m_garbage;
};
TextureCacheCompositingThread* textureCacheCompositingThread();
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)
#endif // TextureCacheCompositingThread_h
|