1*e1eccf28SAndroid Build Coastguard Worker /* 2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2011-2012 The Android Open Source Project 3*e1eccf28SAndroid Build Coastguard Worker * 4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*e1eccf28SAndroid Build Coastguard Worker * 8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*e1eccf28SAndroid Build Coastguard Worker * 10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License. 15*e1eccf28SAndroid Build Coastguard Worker */ 16*e1eccf28SAndroid Build Coastguard Worker 17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RSD_SHADER_H 18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RSD_SHADER_H 19*e1eccf28SAndroid Build Coastguard Worker 20*e1eccf28SAndroid Build Coastguard Worker #include <string> 21*e1eccf28SAndroid Build Coastguard Worker #include <vector> 22*e1eccf28SAndroid Build Coastguard Worker 23*e1eccf28SAndroid Build Coastguard Worker // --------------------------------------------------------------------------- 24*e1eccf28SAndroid Build Coastguard Worker namespace android { 25*e1eccf28SAndroid Build Coastguard Worker namespace renderscript { 26*e1eccf28SAndroid Build Coastguard Worker 27*e1eccf28SAndroid Build Coastguard Worker class Element; 28*e1eccf28SAndroid Build Coastguard Worker class Context; 29*e1eccf28SAndroid Build Coastguard Worker class Program; 30*e1eccf28SAndroid Build Coastguard Worker 31*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript 32*e1eccf28SAndroid Build Coastguard Worker } // namespace android 33*e1eccf28SAndroid Build Coastguard Worker 34*e1eccf28SAndroid Build Coastguard Worker class RsdShaderCache; 35*e1eccf28SAndroid Build Coastguard Worker 36*e1eccf28SAndroid Build Coastguard Worker #define RS_SHADER_ATTR "ATTRIB_" 37*e1eccf28SAndroid Build Coastguard Worker #define RS_SHADER_UNI "UNI_" 38*e1eccf28SAndroid Build Coastguard Worker 39*e1eccf28SAndroid Build Coastguard Worker class RsdShader { 40*e1eccf28SAndroid Build Coastguard Worker public: 41*e1eccf28SAndroid Build Coastguard Worker 42*e1eccf28SAndroid Build Coastguard Worker RsdShader(const android::renderscript::Program *p, uint32_t type, 43*e1eccf28SAndroid Build Coastguard Worker const char * shaderText, size_t shaderLength, 44*e1eccf28SAndroid Build Coastguard Worker const char** textureNames, size_t textureNamesCount, 45*e1eccf28SAndroid Build Coastguard Worker const size_t *textureNamesLength); 46*e1eccf28SAndroid Build Coastguard Worker virtual ~RsdShader(); 47*e1eccf28SAndroid Build Coastguard Worker 48*e1eccf28SAndroid Build Coastguard Worker uint32_t getStateBasedShaderID(const android::renderscript::Context *); 49*e1eccf28SAndroid Build Coastguard Worker 50*e1eccf28SAndroid Build Coastguard Worker // Add ability to get all ID's to clean up the cached program objects getStateBasedIDCount()51*e1eccf28SAndroid Build Coastguard Worker uint32_t getStateBasedIDCount() const { return mStateBasedShaders.size(); } getStateBasedID(uint32_t index)52*e1eccf28SAndroid Build Coastguard Worker uint32_t getStateBasedID(uint32_t index) const { 53*e1eccf28SAndroid Build Coastguard Worker return mStateBasedShaders.at(index)->mShaderID; 54*e1eccf28SAndroid Build Coastguard Worker } 55*e1eccf28SAndroid Build Coastguard Worker getAttribCount()56*e1eccf28SAndroid Build Coastguard Worker uint32_t getAttribCount() const {return mAttribCount;} getUniformCount()57*e1eccf28SAndroid Build Coastguard Worker uint32_t getUniformCount() const {return mUniformCount;} getAttribName(uint32_t i)58*e1eccf28SAndroid Build Coastguard Worker const std::string & getAttribName(uint32_t i) const {return mAttribNames[i];} getUniformName(uint32_t i)59*e1eccf28SAndroid Build Coastguard Worker const std::string & getUniformName(uint32_t i) const {return mUniformNames[i];} getUniformArraySize(uint32_t i)60*e1eccf28SAndroid Build Coastguard Worker uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];} 61*e1eccf28SAndroid Build Coastguard Worker 62*e1eccf28SAndroid Build Coastguard Worker std::string getGLSLInputString() const; 63*e1eccf28SAndroid Build Coastguard Worker isValid()64*e1eccf28SAndroid Build Coastguard Worker bool isValid() const {return mIsValid;} forceDirty()65*e1eccf28SAndroid Build Coastguard Worker void forceDirty() const {mDirty = true;} 66*e1eccf28SAndroid Build Coastguard Worker 67*e1eccf28SAndroid Build Coastguard Worker bool loadShader(const android::renderscript::Context *); 68*e1eccf28SAndroid Build Coastguard Worker void setup(const android::renderscript::Context *, RsdShaderCache *sc); 69*e1eccf28SAndroid Build Coastguard Worker 70*e1eccf28SAndroid Build Coastguard Worker protected: 71*e1eccf28SAndroid Build Coastguard Worker 72*e1eccf28SAndroid Build Coastguard Worker class StateBasedKey { 73*e1eccf28SAndroid Build Coastguard Worker public: StateBasedKey(uint32_t texCount)74*e1eccf28SAndroid Build Coastguard Worker explicit StateBasedKey(uint32_t texCount) : mShaderID(0) { 75*e1eccf28SAndroid Build Coastguard Worker mTextureTargets = new uint32_t[texCount]; 76*e1eccf28SAndroid Build Coastguard Worker } ~StateBasedKey()77*e1eccf28SAndroid Build Coastguard Worker ~StateBasedKey() { 78*e1eccf28SAndroid Build Coastguard Worker delete[] mTextureTargets; 79*e1eccf28SAndroid Build Coastguard Worker } 80*e1eccf28SAndroid Build Coastguard Worker uint32_t mShaderID; 81*e1eccf28SAndroid Build Coastguard Worker uint32_t *mTextureTargets; 82*e1eccf28SAndroid Build Coastguard Worker }; 83*e1eccf28SAndroid Build Coastguard Worker 84*e1eccf28SAndroid Build Coastguard Worker bool createShader(); 85*e1eccf28SAndroid Build Coastguard Worker StateBasedKey *getExistingState(); 86*e1eccf28SAndroid Build Coastguard Worker 87*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Program *mRSProgram; 88*e1eccf28SAndroid Build Coastguard Worker bool mIsValid; 89*e1eccf28SAndroid Build Coastguard Worker 90*e1eccf28SAndroid Build Coastguard Worker // Applies to vertex and fragment shaders only 91*e1eccf28SAndroid Build Coastguard Worker void appendUserConstants(); 92*e1eccf28SAndroid Build Coastguard Worker void setupUserConstants(const android::renderscript::Context *rsc, 93*e1eccf28SAndroid Build Coastguard Worker RsdShaderCache *sc, bool isFragment); 94*e1eccf28SAndroid Build Coastguard Worker void initAddUserElement(const android::renderscript::Element *e, 95*e1eccf28SAndroid Build Coastguard Worker std::string *names, uint32_t *arrayLengths, 96*e1eccf28SAndroid Build Coastguard Worker uint32_t *count, const char *prefix); 97*e1eccf28SAndroid Build Coastguard Worker void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc); 98*e1eccf28SAndroid Build Coastguard Worker void setupSampler(const android::renderscript::Context *rsc, 99*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Sampler *s, 100*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Allocation *tex); 101*e1eccf28SAndroid Build Coastguard Worker 102*e1eccf28SAndroid Build Coastguard Worker void appendAttributes(); 103*e1eccf28SAndroid Build Coastguard Worker void appendTextures(); 104*e1eccf28SAndroid Build Coastguard Worker 105*e1eccf28SAndroid Build Coastguard Worker void initAttribAndUniformArray(); 106*e1eccf28SAndroid Build Coastguard Worker 107*e1eccf28SAndroid Build Coastguard Worker mutable bool mDirty; 108*e1eccf28SAndroid Build Coastguard Worker std::string mShader; 109*e1eccf28SAndroid Build Coastguard Worker std::string mUserShader; 110*e1eccf28SAndroid Build Coastguard Worker uint32_t mType; 111*e1eccf28SAndroid Build Coastguard Worker 112*e1eccf28SAndroid Build Coastguard Worker uint32_t mTextureCount; 113*e1eccf28SAndroid Build Coastguard Worker StateBasedKey *mCurrentState; 114*e1eccf28SAndroid Build Coastguard Worker uint32_t mAttribCount; 115*e1eccf28SAndroid Build Coastguard Worker uint32_t mUniformCount; 116*e1eccf28SAndroid Build Coastguard Worker std::string *mAttribNames; 117*e1eccf28SAndroid Build Coastguard Worker std::string *mUniformNames; 118*e1eccf28SAndroid Build Coastguard Worker uint32_t *mUniformArraySizes; 119*e1eccf28SAndroid Build Coastguard Worker 120*e1eccf28SAndroid Build Coastguard Worker std::vector<std::string> mTextureNames; 121*e1eccf28SAndroid Build Coastguard Worker 122*e1eccf28SAndroid Build Coastguard Worker std::vector<StateBasedKey*> mStateBasedShaders; 123*e1eccf28SAndroid Build Coastguard Worker 124*e1eccf28SAndroid Build Coastguard Worker int32_t mTextureUniformIndexStart; 125*e1eccf28SAndroid Build Coastguard Worker 126*e1eccf28SAndroid Build Coastguard Worker void logUniform(const android::renderscript::Element *field, 127*e1eccf28SAndroid Build Coastguard Worker const float *fd, uint32_t arraySize); 128*e1eccf28SAndroid Build Coastguard Worker void setUniform(const android::renderscript::Context *rsc, 129*e1eccf28SAndroid Build Coastguard Worker const android::renderscript::Element *field, 130*e1eccf28SAndroid Build Coastguard Worker const float *fd, int32_t slot, uint32_t arraySize ); 131*e1eccf28SAndroid Build Coastguard Worker void initMemberVars(); 132*e1eccf28SAndroid Build Coastguard Worker void init(const char** textureNames, size_t textureNamesCount, 133*e1eccf28SAndroid Build Coastguard Worker const size_t *textureNamesLength); 134*e1eccf28SAndroid Build Coastguard Worker }; 135*e1eccf28SAndroid Build Coastguard Worker 136*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_RSD_SHADER_H 137*e1eccf28SAndroid Build Coastguard Worker 138*e1eccf28SAndroid Build Coastguard Worker 139*e1eccf28SAndroid Build Coastguard Worker 140*e1eccf28SAndroid Build Coastguard Worker 141