| /* | 
 |  * Copyright 2013 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | #ifndef SF_RENDER_ENGINE_PROGRAMCACHE_H | 
 | #define SF_RENDER_ENGINE_PROGRAMCACHE_H | 
 |  | 
 | #include <GLES2/gl2.h> | 
 |  | 
 | #include <utils/Singleton.h> | 
 | #include <utils/KeyedVector.h> | 
 | #include <utils/TypeHelpers.h> | 
 |  | 
 | #include "Description.h" | 
 |  | 
 | namespace android { | 
 |  | 
 | class Description; | 
 | class Program; | 
 | class String8; | 
 |  | 
 | /* | 
 |  * This class generates GLSL programs suitable to handle a given | 
 |  * Description. It's responsible for figuring out what to | 
 |  * generate from a Description. | 
 |  * It also maintains a cache of these Programs. | 
 |  */ | 
 | class ProgramCache : public Singleton<ProgramCache> { | 
 | public: | 
 |     /* | 
 |      * Key is used to retrieve a Program in the cache. | 
 |      * A Key is generated from a Description. | 
 |      */ | 
 |     class Key { | 
 |         friend class ProgramCache; | 
 |         typedef uint32_t key_t; | 
 |         key_t mKey; | 
 |     public: | 
 |         enum { | 
 |             BLEND_PREMULT           =       0x00000001, | 
 |             BLEND_NORMAL            =       0x00000000, | 
 |             BLEND_MASK              =       0x00000001, | 
 |  | 
 |             OPACITY_OPAQUE          =       0x00000002, | 
 |             OPACITY_TRANSLUCENT     =       0x00000000, | 
 |             OPACITY_MASK            =       0x00000002, | 
 |  | 
 |             PLANE_ALPHA_LT_ONE      =       0x00000004, | 
 |             PLANE_ALPHA_EQ_ONE      =       0x00000000, | 
 |             PLANE_ALPHA_MASK        =       0x00000004, | 
 |  | 
 |             TEXTURE_OFF             =       0x00000000, | 
 |             TEXTURE_EXT             =       0x00000008, | 
 |             TEXTURE_2D              =       0x00000010, | 
 |             TEXTURE_MASK            =       0x00000018, | 
 |  | 
 |             COLOR_MATRIX_OFF        =       0x00000000, | 
 |             COLOR_MATRIX_ON         =       0x00000020, | 
 |             COLOR_MATRIX_MASK       =       0x00000020, | 
 |         }; | 
 |  | 
 |         inline Key() : mKey(0) { } | 
 |         inline Key(const Key& rhs) : mKey(rhs.mKey) { } | 
 |  | 
 |         inline Key& set(key_t mask, key_t value) { | 
 |             mKey = (mKey & ~mask) | value; | 
 |             return *this; | 
 |         } | 
 |  | 
 |         inline bool isTexturing() const { | 
 |             return (mKey & TEXTURE_MASK) != TEXTURE_OFF; | 
 |         } | 
 |         inline int getTextureTarget() const { | 
 |             return (mKey & TEXTURE_MASK); | 
 |         } | 
 |         inline bool isPremultiplied() const { | 
 |             return (mKey & BLEND_MASK) == BLEND_PREMULT; | 
 |         } | 
 |         inline bool isOpaque() const { | 
 |             return (mKey & OPACITY_MASK) == OPACITY_OPAQUE; | 
 |         } | 
 |         inline bool hasPlaneAlpha() const { | 
 |             return (mKey & PLANE_ALPHA_MASK) == PLANE_ALPHA_LT_ONE; | 
 |         } | 
 |         inline bool hasColorMatrix() const { | 
 |             return (mKey & COLOR_MATRIX_MASK) == COLOR_MATRIX_ON; | 
 |         } | 
 |  | 
 |         // this is the definition of a friend function -- not a method of class Needs | 
 |         friend inline int strictly_order_type(const Key& lhs, const Key& rhs) { | 
 |             return  (lhs.mKey < rhs.mKey) ? 1 : 0; | 
 |         } | 
 |     }; | 
 |  | 
 |     ProgramCache(); | 
 |     ~ProgramCache(); | 
 |  | 
 |     // useProgram lookup a suitable program in the cache or generates one | 
 |     // if none can be found. | 
 |     void useProgram(const Description& description); | 
 |  | 
 | private: | 
 |     // Generate shaders to populate the cache | 
 |     void primeCache(); | 
 |     // compute a cache Key from a Description | 
 |     static Key computeKey(const Description& description); | 
 |     // generates a program from the Key | 
 |     static Program* generateProgram(const Key& needs); | 
 |     // generates the vertex shader from the Key | 
 |     static String8 generateVertexShader(const Key& needs); | 
 |     // generates the fragment shader from the Key | 
 |     static String8 generateFragmentShader(const Key& needs); | 
 |  | 
 |     // Key/Value map used for caching Programs. Currently the cache | 
 |     // is never shrunk. | 
 |     DefaultKeyedVector<Key, Program*> mCache; | 
 | }; | 
 |  | 
 |  | 
 | ANDROID_BASIC_TYPES_TRAITS(ProgramCache::Key) | 
 |  | 
 | } /* namespace android */ | 
 |  | 
 | #endif /* SF_RENDER_ENGINE_PROGRAMCACHE_H */ |