summaryrefslogtreecommitdiff
path: root/Source/WebCore/platform/graphics/blackberry/TextureCacheCompositingThread.h
blob: ccda324b0a0a92fd5b282b389030fdf111f38681 (plain)
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