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 getStateBasedIDCount()51 uint32_t getStateBasedIDCount() const { return mStateBasedShaders.size(); } getStateBasedID(uint32_t index)52 uint32_t getStateBasedID(uint32_t index) const { 53 return mStateBasedShaders.at(index)->mShaderID; 54 } 55 getAttribCount()56 uint32_t getAttribCount() const {return mAttribCount;} getUniformCount()57 uint32_t getUniformCount() const {return mUniformCount;} getAttribName(uint32_t i)58 const std::string & getAttribName(uint32_t i) const {return mAttribNames[i];} getUniformName(uint32_t i)59 const std::string & getUniformName(uint32_t i) const {return mUniformNames[i];} getUniformArraySize(uint32_t i)60 uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];} 61 62 std::string getGLSLInputString() const; 63 isValid()64 bool isValid() const {return mIsValid;} forceDirty()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: StateBasedKey(uint32_t texCount)74 explicit StateBasedKey(uint32_t texCount) : mShaderID(0) { 75 mTextureTargets = new uint32_t[texCount]; 76 } ~StateBasedKey()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