Home | History | Annotate | Download | only in driver
      1 /*
      2  * Copyright (C) 2011-2012 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 
     17 #ifndef ANDROID_RSD_SHADER_H
     18 #define ANDROID_RSD_SHADER_H
     19 
     20 #include <string>
     21 #include <vector>
     22 
     23 // ---------------------------------------------------------------------------
     24 namespace android {
     25 namespace renderscript {
     26 
     27 class Element;
     28 class Context;
     29 class Program;
     30 
     31 } // namespace renderscript
     32 } // namespace android
     33 
     34 class RsdShaderCache;
     35 
     36 #define RS_SHADER_ATTR "ATTRIB_"
     37 #define RS_SHADER_UNI "UNI_"
     38 
     39 class RsdShader {
     40 public:
     41 
     42     RsdShader(const android::renderscript::Program *p, uint32_t type,
     43               const char * shaderText, size_t shaderLength,
     44               const char** textureNames, size_t textureNamesCount,
     45               const size_t *textureNamesLength);
     46     virtual ~RsdShader();
     47 
     48     uint32_t getStateBasedShaderID(const android::renderscript::Context *);
     49 
     50     // Add ability to get all ID's to clean up the cached program objects
     51     uint32_t getStateBasedIDCount() const { return mStateBasedShaders.size(); }
     52     uint32_t getStateBasedID(uint32_t index) const {
     53         return mStateBasedShaders.at(index)->mShaderID;
     54     }
     55 
     56     uint32_t getAttribCount() const {return mAttribCount;}
     57     uint32_t getUniformCount() const {return mUniformCount;}
     58     const std::string & getAttribName(uint32_t i) const {return mAttribNames[i];}
     59     const std::string & getUniformName(uint32_t i) const {return mUniformNames[i];}
     60     uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];}
     61 
     62     std::string getGLSLInputString() const;
     63 
     64     bool isValid() const {return mIsValid;}
     65     void forceDirty() const {mDirty = true;}
     66 
     67     bool loadShader(const android::renderscript::Context *);
     68     void setup(const android::renderscript::Context *, RsdShaderCache *sc);
     69 
     70 protected:
     71 
     72     class StateBasedKey {
     73     public:
     74         explicit StateBasedKey(uint32_t texCount) : mShaderID(0) {
     75             mTextureTargets = new uint32_t[texCount];
     76         }
     77         ~StateBasedKey() {
     78             delete[] mTextureTargets;
     79         }
     80         uint32_t mShaderID;
     81         uint32_t *mTextureTargets;
     82     };
     83 
     84     bool createShader();
     85     StateBasedKey *getExistingState();
     86 
     87     const android::renderscript::Program *mRSProgram;
     88     bool mIsValid;
     89 
     90     // Applies to vertex and fragment shaders only
     91     void appendUserConstants();
     92     void setupUserConstants(const android::renderscript::Context *rsc,
     93                             RsdShaderCache *sc, bool isFragment);
     94     void initAddUserElement(const android::renderscript::Element *e,
     95                             std::string *names, uint32_t *arrayLengths,
     96                             uint32_t *count, const char *prefix);
     97     void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc);
     98     void setupSampler(const android::renderscript::Context *rsc,
     99                       const android::renderscript::Sampler *s,
    100                       const android::renderscript::Allocation *tex);
    101 
    102     void appendAttributes();
    103     void appendTextures();
    104 
    105     void initAttribAndUniformArray();
    106 
    107     mutable bool mDirty;
    108     std::string mShader;
    109     std::string mUserShader;
    110     uint32_t mType;
    111 
    112     uint32_t mTextureCount;
    113     StateBasedKey *mCurrentState;
    114     uint32_t mAttribCount;
    115     uint32_t mUniformCount;
    116     std::string *mAttribNames;
    117     std::string *mUniformNames;
    118     uint32_t *mUniformArraySizes;
    119 
    120     std::vector<std::string> mTextureNames;
    121 
    122     std::vector<StateBasedKey*> mStateBasedShaders;
    123 
    124     int32_t mTextureUniformIndexStart;
    125 
    126     void logUniform(const android::renderscript::Element *field,
    127                     const float *fd, uint32_t arraySize);
    128     void setUniform(const android::renderscript::Context *rsc,
    129                     const android::renderscript::Element *field,
    130                     const float *fd, int32_t slot, uint32_t arraySize );
    131     void initMemberVars();
    132     void init(const char** textureNames, size_t textureNamesCount,
    133               const size_t *textureNamesLength);
    134 };
    135 
    136 #endif //ANDROID_RSD_SHADER_H
    137 
    138 
    139 
    140 
    141