| /* |
| * Copyright (C) 2011-2012 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 ANDROID_RSD_SHADER_H |
| #define ANDROID_RSD_SHADER_H |
| |
| #include <string> |
| |
| // --------------------------------------------------------------------------- |
| namespace android { |
| namespace renderscript { |
| |
| class Element; |
| class Context; |
| class Program; |
| |
| } |
| } |
| |
| class RsdShaderCache; |
| |
| #define RS_SHADER_ATTR "ATTRIB_" |
| #define RS_SHADER_UNI "UNI_" |
| |
| class RsdShader { |
| public: |
| |
| RsdShader(const android::renderscript::Program *p, uint32_t type, |
| const char * shaderText, size_t shaderLength, |
| const char** textureNames, size_t textureNamesCount, |
| const size_t *textureNamesLength); |
| virtual ~RsdShader(); |
| |
| uint32_t getStateBasedShaderID(const android::renderscript::Context *); |
| |
| // Add ability to get all ID's to clean up the cached program objects |
| uint32_t getStateBasedIDCount() const { return mStateBasedShaders.size(); } |
| uint32_t getStateBasedID(uint32_t index) const { |
| return mStateBasedShaders[index]->mShaderID; |
| } |
| |
| uint32_t getAttribCount() const {return mAttribCount;} |
| uint32_t getUniformCount() const {return mUniformCount;} |
| const std::string & getAttribName(uint32_t i) const {return mAttribNames[i];} |
| const std::string & getUniformName(uint32_t i) const {return mUniformNames[i];} |
| uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];} |
| |
| std::string getGLSLInputString() const; |
| |
| bool isValid() const {return mIsValid;} |
| void forceDirty() const {mDirty = true;} |
| |
| bool loadShader(const android::renderscript::Context *); |
| void setup(const android::renderscript::Context *, RsdShaderCache *sc); |
| |
| protected: |
| |
| class StateBasedKey { |
| public: |
| StateBasedKey(uint32_t texCount) : mShaderID(0) { |
| mTextureTargets = new uint32_t[texCount]; |
| } |
| ~StateBasedKey() { |
| delete[] mTextureTargets; |
| } |
| uint32_t mShaderID; |
| uint32_t *mTextureTargets; |
| }; |
| |
| bool createShader(); |
| StateBasedKey *getExistingState(); |
| |
| const android::renderscript::Program *mRSProgram; |
| bool mIsValid; |
| |
| // Applies to vertex and fragment shaders only |
| void appendUserConstants(); |
| void setupUserConstants(const android::renderscript::Context *rsc, |
| RsdShaderCache *sc, bool isFragment); |
| void initAddUserElement(const android::renderscript::Element *e, |
| std::string *names, uint32_t *arrayLengths, |
| uint32_t *count, const char *prefix); |
| void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc); |
| void setupSampler(const android::renderscript::Context *rsc, |
| const android::renderscript::Sampler *s, |
| const android::renderscript::Allocation *tex); |
| |
| void appendAttributes(); |
| void appendTextures(); |
| |
| void initAttribAndUniformArray(); |
| |
| mutable bool mDirty; |
| std::string mShader; |
| std::string mUserShader; |
| uint32_t mType; |
| |
| uint32_t mTextureCount; |
| StateBasedKey *mCurrentState; |
| uint32_t mAttribCount; |
| uint32_t mUniformCount; |
| std::string *mAttribNames; |
| std::string *mUniformNames; |
| uint32_t *mUniformArraySizes; |
| |
| std::vector<std::string> mTextureNames; |
| |
| std::vector<StateBasedKey*> mStateBasedShaders; |
| |
| int32_t mTextureUniformIndexStart; |
| |
| void logUniform(const android::renderscript::Element *field, |
| const float *fd, uint32_t arraySize); |
| void setUniform(const android::renderscript::Context *rsc, |
| const android::renderscript::Element *field, |
| const float *fd, int32_t slot, uint32_t arraySize ); |
| void initMemberVars(); |
| void init(const char** textureNames, size_t textureNamesCount, |
| const size_t *textureNamesLength); |
| }; |
| |
| #endif //ANDROID_RSD_SHADER_H |