File: TextureCacheCompositingThread.h

package info (click to toggle)
qtwebkit 2.3.4.dfsg-9.1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 290,564 kB
  • ctags: 273,642
  • sloc: cpp: 1,417,509; python: 85,048; ansic: 39,357; perl: 38,862; ruby: 10,313; objc: 9,505; xml: 8,679; asm: 3,864; yacc: 2,458; sh: 1,237; lex: 813; makefile: 592; java: 228; php: 79
file content (145 lines) | stat: -rw-r--r-- 5,176 bytes parent folder | download | duplicates (3)
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
145
/*
 * Copyright (C) 2011, 2012 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 "LayerTileIndex.h"
#include "Texture.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<Texture> createTexture()
    {
        return Texture::create();
    }

    // Retrieve a texture from the cache.
    PassRefPtr<Texture> textureForTiledContents(const SkBitmap& contents, const IntRect& tileRect, const TileIndex&, bool isOpaque);
    PassRefPtr<Texture> textureForColor(const Color&);

    // Update contents of an existing texture, or create a new one if texture is 0.
    PassRefPtr<Texture> updateContents(const RefPtr<Texture>&, const SkBitmap& contents, const IntRect& dirtyRect, const IntRect& tileRect, bool isOpaque);

    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(Texture*);

    // 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(Texture*);
    void textureResized(Texture*, const IntSize& oldSize);

    // Undo the effects of eviction, if possible.
    bool install(Texture*);

private:
    struct ZombieTexture {
        explicit ZombieTexture(Texture* texture)
            : id(texture->textureId())
            , size(texture->size())
        {
        }

        unsigned id;
        IntSize size;
    };
    typedef ListHashSet<Texture* > TextureSet;
    typedef std::pair<uint32_t, size_t> ContentsKey;
    typedef HashMap<TileIndex, RefPtr<Texture> > TextureMap;
    typedef Vector<ZombieTexture> Garbage;

    TextureCacheCompositingThread();
    ~TextureCacheCompositingThread();

    unsigned allocateTextureId();
    void freeTextureId(unsigned id);

    void incMemoryUsage(int delta) { setMemoryUsage(memoryUsage() + delta); }
    void decMemoryUsage(int delta) { setMemoryUsage(memoryUsage() - delta); }
    void setMemoryUsage(size_t);

    ContentsKey key(const SkBitmap& contents);

    void evict(const TextureSet::iterator&);

    // LRU set of weak pointers to textures.
    TextureSet m_textures;
    size_t m_memoryUsage;
    size_t m_memoryLimit;

    // Map of refCounted pointers to textures.
    HashMap<ContentsKey, TextureMap> m_cache;
    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<Texture>, ColorHash, ColorHashTraits> ColorTextureMap;
    ColorTextureMap m_colors;
    Garbage m_garbage;
};

TextureCacheCompositingThread* textureCacheCompositingThread();

} // namespace WebCore

#endif // USE(ACCELERATED_COMPOSITING)

#endif // TextureCacheCompositingThread_h