| Jamie Gennis | aca51c0 | 2011-11-03 17:42:43 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  ** Copyright 2011, The Android Open Source Project | 
 | 3 |  ** | 
 | 4 |  ** Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 5 |  ** you may not use this file except in compliance with the License. | 
 | 6 |  ** You may obtain a copy of the License at | 
 | 7 |  ** | 
 | 8 |  **     http://www.apache.org/licenses/LICENSE-2.0 | 
 | 9 |  ** | 
 | 10 |  ** Unless required by applicable law or agreed to in writing, software | 
 | 11 |  ** distributed under the License is distributed on an "AS IS" BASIS, | 
 | 12 |  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 13 |  ** See the License for the specific language governing permissions and | 
 | 14 |  ** limitations under the License. | 
 | 15 |  */ | 
 | 16 |  | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 17 | #ifndef ANDROID_EGL_CACHE_H | 
 | 18 | #define ANDROID_EGL_CACHE_H | 
 | 19 |  | 
 | 20 | #include <EGL/egl.h> | 
 | 21 | #include <EGL/eglext.h> | 
 | 22 |  | 
| Stan Iliev | 9e7cd07 | 2017-10-09 15:56:10 -0400 | [diff] [blame] | 23 | #include "FileBlobCache.h" | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 24 |  | 
| Mathias Agopian | b7f9a24 | 2017-03-08 22:29:31 -0800 | [diff] [blame] | 25 | #include <memory> | 
| Mathias Agopian | 6542143 | 2017-03-08 11:49:05 -0800 | [diff] [blame] | 26 | #include <mutex> | 
 | 27 | #include <string> | 
 | 28 |  | 
| Jamie Gennis | aca51c0 | 2011-11-03 17:42:43 -0700 | [diff] [blame] | 29 | // ---------------------------------------------------------------------------- | 
 | 30 | namespace android { | 
 | 31 | // ---------------------------------------------------------------------------- | 
 | 32 |  | 
 | 33 | class egl_display_t; | 
 | 34 |  | 
| Jamie Gennis | 98c6383 | 2011-11-07 17:03:54 -0800 | [diff] [blame] | 35 | class EGLAPI egl_cache_t { | 
| Jamie Gennis | aca51c0 | 2011-11-03 17:42:43 -0700 | [diff] [blame] | 36 | public: | 
 | 37 |  | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 38 |     // get returns a pointer to the singleton egl_cache_t object.  This | 
 | 39 |     // singleton object will never be destroyed. | 
| Jamie Gennis | aca51c0 | 2011-11-03 17:42:43 -0700 | [diff] [blame] | 40 |     static egl_cache_t* get(); | 
 | 41 |  | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 42 |     // initialize puts the egl_cache_t into an initialized state, such that it | 
 | 43 |     // is able to insert and retrieve entries from the cache.  This should be | 
 | 44 |     // called when EGL is initialized.  When not in the initialized state the | 
 | 45 |     // getBlob and setBlob methods will return without performing any cache | 
 | 46 |     // operations. | 
| Jamie Gennis | aca51c0 | 2011-11-03 17:42:43 -0700 | [diff] [blame] | 47 |     void initialize(egl_display_t* display); | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 48 |  | 
 | 49 |     // terminate puts the egl_cache_t back into the uninitialized state.  When | 
 | 50 |     // in this state the getBlob and setBlob methods will return without | 
 | 51 |     // performing any cache operations. | 
 | 52 |     void terminate(); | 
 | 53 |  | 
 | 54 |     // setBlob attempts to insert a new key/value blob pair into the cache. | 
 | 55 |     // This will be called by the hardware vendor's EGL implementation via the | 
 | 56 |     // EGL_ANDROID_blob_cache extension. | 
| Jamie Gennis | c42fcf0 | 2011-11-09 15:35:34 -0800 | [diff] [blame] | 57 |     void setBlob(const void* key, EGLsizeiANDROID keySize, const void* value, | 
 | 58 |         EGLsizeiANDROID valueSize); | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 59 |  | 
 | 60 |     // getBlob attempts to retrieve the value blob associated with a given key | 
 | 61 |     // blob from cache.  This will be called by the hardware vendor's EGL | 
 | 62 |     // implementation via the EGL_ANDROID_blob_cache extension. | 
| Jamie Gennis | c42fcf0 | 2011-11-09 15:35:34 -0800 | [diff] [blame] | 63 |     EGLsizeiANDROID getBlob(const void* key, EGLsizeiANDROID keySize, | 
 | 64 |         void* value, EGLsizeiANDROID valueSize); | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 65 |  | 
| Jamie Gennis | 98c6383 | 2011-11-07 17:03:54 -0800 | [diff] [blame] | 66 |     // setCacheFilename sets the name of the file that should be used to store | 
 | 67 |     // cache contents from one program invocation to another. | 
 | 68 |     void setCacheFilename(const char* filename); | 
 | 69 |  | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 70 | private: | 
 | 71 |     // Creation and (the lack of) destruction is handled internally. | 
 | 72 |     egl_cache_t(); | 
 | 73 |     ~egl_cache_t(); | 
 | 74 |  | 
 | 75 |     // Copying is disallowed. | 
 | 76 |     egl_cache_t(const egl_cache_t&); // not implemented | 
 | 77 |     void operator=(const egl_cache_t&); // not implemented | 
 | 78 |  | 
 | 79 |     // getBlobCacheLocked returns the BlobCache object being used to store the | 
 | 80 |     // key/value blob pairs.  If the BlobCache object has not yet been created, | 
 | 81 |     // this will do so, loading the serialized cache contents from disk if | 
 | 82 |     // possible. | 
| Mathias Agopian | b7f9a24 | 2017-03-08 22:29:31 -0800 | [diff] [blame] | 83 |     BlobCache* getBlobCacheLocked(); | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 84 |  | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 85 |     // mInitialized indicates whether the egl_cache_t is in the initialized | 
 | 86 |     // state.  It is initialized to false at construction time, and gets set to | 
 | 87 |     // true when initialize is called.  It is set back to false when terminate | 
 | 88 |     // is called.  When in this state, the cache behaves as normal.  When not, | 
 | 89 |     // the getBlob and setBlob methods will return without performing any cache | 
 | 90 |     // operations. | 
 | 91 |     bool mInitialized; | 
 | 92 |  | 
 | 93 |     // mBlobCache is the cache in which the key/value blob pairs are stored.  It | 
 | 94 |     // is initially NULL, and will be initialized by getBlobCacheLocked the | 
 | 95 |     // first time it's needed. | 
| Stan Iliev | 9e7cd07 | 2017-10-09 15:56:10 -0400 | [diff] [blame] | 96 |     std::unique_ptr<FileBlobCache> mBlobCache; | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 97 |  | 
| Jamie Gennis | 98c6383 | 2011-11-07 17:03:54 -0800 | [diff] [blame] | 98 |     // mFilename is the name of the file for storing cache contents in between | 
 | 99 |     // program invocations.  It is initialized to an empty string at | 
 | 100 |     // construction time, and can be set with the setCacheFilename method.  An | 
 | 101 |     // empty string indicates that the cache should not be saved to or restored | 
 | 102 |     // from disk. | 
| Mathias Agopian | 6542143 | 2017-03-08 11:49:05 -0800 | [diff] [blame] | 103 |     std::string mFilename; | 
| Jamie Gennis | 98c6383 | 2011-11-07 17:03:54 -0800 | [diff] [blame] | 104 |  | 
| Jamie Gennis | 99c3d70 | 2011-11-08 17:59:36 -0800 | [diff] [blame] | 105 |     // mSavePending indicates whether or not a deferred save operation is | 
 | 106 |     // pending.  Each time a key/value pair is inserted into the cache via | 
 | 107 |     // setBlob, a deferred save is initiated if one is not already pending. | 
 | 108 |     // This will wait some amount of time and then trigger a save of the cache | 
 | 109 |     // contents to disk. | 
 | 110 |     bool mSavePending; | 
 | 111 |  | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 112 |     // mMutex is the mutex used to prevent concurrent access to the member | 
 | 113 |     // variables. It must be locked whenever the member variables are accessed. | 
| Mathias Agopian | 6542143 | 2017-03-08 11:49:05 -0800 | [diff] [blame] | 114 |     mutable std::mutex mMutex; | 
| Jamie Gennis | 98c6383 | 2011-11-07 17:03:54 -0800 | [diff] [blame] | 115 |  | 
 | 116 |     // sCache is the singleton egl_cache_t object. | 
 | 117 |     static egl_cache_t sCache; | 
| Jamie Gennis | aca51c0 | 2011-11-03 17:42:43 -0700 | [diff] [blame] | 118 | }; | 
 | 119 |  | 
 | 120 | // ---------------------------------------------------------------------------- | 
 | 121 | }; // namespace android | 
 | 122 | // ---------------------------------------------------------------------------- | 
| Jamie Gennis | 7660108 | 2011-11-06 14:14:33 -0800 | [diff] [blame] | 123 |  | 
 | 124 | #endif // ANDROID_EGL_CACHE_H |