You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.4 KiB
140 lines
4.4 KiB
/* |
|
* 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> |
|
#include <vector> |
|
|
|
// --------------------------------------------------------------------------- |
|
namespace android { |
|
namespace renderscript { |
|
|
|
class Element; |
|
class Context; |
|
class Program; |
|
|
|
} // namespace renderscript |
|
} // namespace android |
|
|
|
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.at(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: |
|
explicit 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 |
|
|
|
|
|
|
|
|
|
|