summaryrefslogtreecommitdiffstats
path: root/cc/ThrottledTextureUploader.h
blob: 0b5acc493a256d222c5997adb5c2f83cd040749a (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
// Copyright 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ThrottledTextureUploader_h
#define ThrottledTextureUploader_h

#include "TextureUploader.h"

#include <deque>
#include <wtf/Deque.h>

namespace WebKit {
class WebGraphicsContext3D;
}

namespace cc {

class ThrottledTextureUploader : public TextureUploader {
    WTF_MAKE_NONCOPYABLE(ThrottledTextureUploader);
public:
    static PassOwnPtr<ThrottledTextureUploader> create(WebKit::WebGraphicsContext3D* context)
    {
        return adoptPtr(new ThrottledTextureUploader(context));
    }
    static PassOwnPtr<ThrottledTextureUploader> create(WebKit::WebGraphicsContext3D* context, size_t pendingUploadLimit)
    {
        return adoptPtr(new ThrottledTextureUploader(context, pendingUploadLimit));
    }
    virtual ~ThrottledTextureUploader();

    virtual bool isBusy() OVERRIDE;
    virtual double estimatedTexturesPerSecond() OVERRIDE;
    virtual void beginUploads() OVERRIDE;
    virtual void endUploads() OVERRIDE;
    virtual void uploadTexture(CCResourceProvider*, Parameters) OVERRIDE;

private:
    class Query {
    public:
        static PassOwnPtr<Query> create(WebKit::WebGraphicsContext3D* context) { return adoptPtr(new Query(context)); }

        virtual ~Query();

        void begin();
        void end(double texturesUploaded);
        bool isPending();
        void wait();
        unsigned value();
        double texturesUploaded();

    private:
        explicit Query(WebKit::WebGraphicsContext3D*);

        WebKit::WebGraphicsContext3D* m_context;
        unsigned m_queryId;
        unsigned m_value;
        bool m_hasValue;
        double m_texturesUploaded;
    };

    ThrottledTextureUploader(WebKit::WebGraphicsContext3D*);
    ThrottledTextureUploader(WebKit::WebGraphicsContext3D*, size_t pendingUploadLimit);

    void processQueries();

    WebKit::WebGraphicsContext3D* m_context;
    size_t m_maxPendingQueries;
    Deque<OwnPtr<Query> > m_pendingQueries;
    Deque<OwnPtr<Query> > m_availableQueries;
    std::deque<double> m_texturesPerSecondHistory;
    double m_texturesUploaded;
};

}

#endif