egl_cache.h revision 98c6383580f94bb7ff9cc9a7cc24d8b8519e484a
1aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis/*
2aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** Copyright 2011, The Android Open Source Project
3aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis **
4aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** Licensed under the Apache License, Version 2.0 (the "License");
5aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** you may not use this file except in compliance with the License.
6aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** You may obtain a copy of the License at
7aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis **
8aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis **     http://www.apache.org/licenses/LICENSE-2.0
9aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis **
10aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** Unless required by applicable law or agreed to in writing, software
11aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** distributed under the License is distributed on an "AS IS" BASIS,
12aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** See the License for the specific language governing permissions and
14aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis ** limitations under the License.
15aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis */
16aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
17766010858ea7696d64f1b559413670bdd8627595Jamie Gennis#ifndef ANDROID_EGL_CACHE_H
18766010858ea7696d64f1b559413670bdd8627595Jamie Gennis#define ANDROID_EGL_CACHE_H
19766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
20766010858ea7696d64f1b559413670bdd8627595Jamie Gennis#include <EGL/egl.h>
21766010858ea7696d64f1b559413670bdd8627595Jamie Gennis#include <EGL/eglext.h>
22766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
23766010858ea7696d64f1b559413670bdd8627595Jamie Gennis#include <utils/BlobCache.h>
2498c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis#include <utils/String8.h>
25766010858ea7696d64f1b559413670bdd8627595Jamie Gennis#include <utils/StrongPointer.h>
26766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
27aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// ----------------------------------------------------------------------------
28aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennisnamespace android {
29aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// ----------------------------------------------------------------------------
30aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
31aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennisclass egl_display_t;
32aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
3398c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennisclass EGLAPI egl_cache_t {
34aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennispublic:
35aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
36766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // get returns a pointer to the singleton egl_cache_t object.  This
37766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // singleton object will never be destroyed.
38aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis    static egl_cache_t* get();
39aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
40766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // initialize puts the egl_cache_t into an initialized state, such that it
41766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // is able to insert and retrieve entries from the cache.  This should be
42766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // called when EGL is initialized.  When not in the initialized state the
43766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // getBlob and setBlob methods will return without performing any cache
44766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // operations.
45aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis    void initialize(egl_display_t* display);
46766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
47766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // terminate puts the egl_cache_t back into the uninitialized state.  When
48766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // in this state the getBlob and setBlob methods will return without
49766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // performing any cache operations.
50766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    void terminate();
51766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
52766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // setBlob attempts to insert a new key/value blob pair into the cache.
53766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // This will be called by the hardware vendor's EGL implementation via the
54766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // EGL_ANDROID_blob_cache extension.
55766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    void setBlob(const void* key, EGLsizei keySize, const void* value,
56766010858ea7696d64f1b559413670bdd8627595Jamie Gennis        EGLsizei valueSize);
57766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
58766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // getBlob attempts to retrieve the value blob associated with a given key
59766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // blob from cache.  This will be called by the hardware vendor's EGL
60766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // implementation via the EGL_ANDROID_blob_cache extension.
61766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    EGLsizei getBlob(const void* key, EGLsizei keySize, void* value,
62766010858ea7696d64f1b559413670bdd8627595Jamie Gennis        EGLsizei valueSize);
63766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
6498c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    // setCacheFilename sets the name of the file that should be used to store
6598c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    // cache contents from one program invocation to another.
6698c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    void setCacheFilename(const char* filename);
6798c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis
68766010858ea7696d64f1b559413670bdd8627595Jamie Gennisprivate:
69766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // Creation and (the lack of) destruction is handled internally.
70766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    egl_cache_t();
71766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    ~egl_cache_t();
72766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
73766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // Copying is disallowed.
74766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    egl_cache_t(const egl_cache_t&); // not implemented
75766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    void operator=(const egl_cache_t&); // not implemented
76766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
77766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // getBlobCacheLocked returns the BlobCache object being used to store the
78766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // key/value blob pairs.  If the BlobCache object has not yet been created,
79766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // this will do so, loading the serialized cache contents from disk if
80766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // possible.
81766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    sp<BlobCache> getBlobCacheLocked();
82766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
83766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // saveBlobCache attempts to save the current contents of mBlobCache to
84766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // disk.
85766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    void saveBlobCacheLocked();
86766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
87766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // loadBlobCache attempts to load the saved cache contents from disk into
88766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // mBlobCache.
89766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    void loadBlobCacheLocked();
90766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
91766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // mInitialized indicates whether the egl_cache_t is in the initialized
92766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // state.  It is initialized to false at construction time, and gets set to
93766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // true when initialize is called.  It is set back to false when terminate
94766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // is called.  When in this state, the cache behaves as normal.  When not,
95766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // the getBlob and setBlob methods will return without performing any cache
96766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // operations.
97766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    bool mInitialized;
98766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
99766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // mBlobCache is the cache in which the key/value blob pairs are stored.  It
100766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // is initially NULL, and will be initialized by getBlobCacheLocked the
101766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // first time it's needed.
102766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    sp<BlobCache> mBlobCache;
103766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
10498c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    // mFilename is the name of the file for storing cache contents in between
10598c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    // program invocations.  It is initialized to an empty string at
10698c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    // construction time, and can be set with the setCacheFilename method.  An
10798c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    // empty string indicates that the cache should not be saved to or restored
10898c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    // from disk.
10998c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    String8 mFilename;
11098c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis
111766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // mMutex is the mutex used to prevent concurrent access to the member
112766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    // variables. It must be locked whenever the member variables are accessed.
113766010858ea7696d64f1b559413670bdd8627595Jamie Gennis    mutable Mutex mMutex;
11498c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis
11598c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    // sCache is the singleton egl_cache_t object.
11698c6383580f94bb7ff9cc9a7cc24d8b8519e484aJamie Gennis    static egl_cache_t sCache;
117aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis};
118aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis
119aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// ----------------------------------------------------------------------------
120aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis}; // namespace android
121aca51c06f38155f1435fbc6944d7fc0a9bf1e4e9Jamie Gennis// ----------------------------------------------------------------------------
122766010858ea7696d64f1b559413670bdd8627595Jamie Gennis
123766010858ea7696d64f1b559413670bdd8627595Jamie Gennis#endif // ANDROID_EGL_CACHE_H
124