14a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk/* 24a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 34a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * 44a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 54a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * you may not use this file except in compliance with the License. 64a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * You may obtain a copy of the License at 74a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * 84a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 94a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * 104a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 114a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 124a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * See the License for the specific language governing permissions and 144a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk * limitations under the License. 154a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk */ 164a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 174a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#ifndef ANDROID_RSD_SHADER_H 184a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#define ANDROID_RSD_SHADER_H 194a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 204a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#include <utils/String8.h> 214a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 224a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk// --------------------------------------------------------------------------- 234a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouknamespace android { 244a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouknamespace renderscript { 254a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 264a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass Element; 274a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass Context; 284a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass Program; 294a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 304a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk} 314a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk} 324a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 334a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass RsdShaderCache; 344a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 354a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#define RS_SHADER_ATTR "ATTRIB_" 364a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#define RS_SHADER_UNI "UNI_" 374a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 384a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukclass RsdShader { 394a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukpublic: 404a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 414a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk RsdShader(const android::renderscript::Program *p, uint32_t type, 424a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk const char * shaderText, uint32_t shaderLength); 434a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk virtual ~RsdShader(); 444a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 454a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk bool createShader(); 464a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 474a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t getShaderID() const {return mShaderID;} 484a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 494a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t getAttribCount() const {return mAttribCount;} 504a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t getUniformCount() const {return mUniformCount;} 514a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk const android::String8 & getAttribName(uint32_t i) const {return mAttribNames[i];} 524a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk const android::String8 & getUniformName(uint32_t i) const {return mUniformNames[i];} 534a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];} 544a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 554a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk android::String8 getGLSLInputString() const; 564a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 574a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk bool isValid() const {return mIsValid;} 584a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void forceDirty() const {mDirty = true;} 594a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 604a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk bool loadShader(const android::renderscript::Context *); 614a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void setup(const android::renderscript::Context *, RsdShaderCache *sc); 624a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 634a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchoukprotected: 644a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 654a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk const android::renderscript::Program *mRSProgram; 664a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk bool mIsValid; 674a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 684a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk // Applies to vertex and fragment shaders only 694a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void appendUserConstants(); 704a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void setupUserConstants(const android::renderscript::Context *rsc, RsdShaderCache *sc, bool isFragment); 714a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void initAddUserElement(const android::renderscript::Element *e, android::String8 *names, uint32_t *arrayLengths, uint32_t *count, const char *prefix); 724a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc); 73438505431c253fd891f3deda38033c30268913e8Alex Sakhartchouk void setupSampler(const android::renderscript::Context *rsc, const android::renderscript::Sampler *s, const android::renderscript::Allocation *tex); 744a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 754a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void appendAttributes(); 764a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void appendTextures(); 774a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 784a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void initAttribAndUniformArray(); 794a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 804a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk mutable bool mDirty; 814a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk android::String8 mShader; 824a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk android::String8 mUserShader; 834a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t mShaderID; 844a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t mType; 854a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 864a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t mTextureCount; 87bbc41c034b0b851287c24c3a51a17586d9960026Alex Sakhartchouk uint32_t *mTextureTargets; 884a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t mAttribCount; 894a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t mUniformCount; 904a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk android::String8 *mAttribNames; 914a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk android::String8 *mUniformNames; 924a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk uint32_t *mUniformArraySizes; 934a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 944a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk int32_t mTextureUniformIndexStart; 954a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 964a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void logUniform(const android::renderscript::Element *field, const float *fd, uint32_t arraySize ); 974a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void setUniform(const android::renderscript::Context *rsc, const android::renderscript::Element *field, const float *fd, int32_t slot, uint32_t arraySize ); 984a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void initMemberVars(); 994a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk void init(); 1004a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk}; 1014a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 1024a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk#endif //ANDROID_RSD_SHADER_H 1034a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 1044a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 1054a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 1064a36b45c72b91045db49c54d33fd7a05fc5a7a3dAlex Sakhartchouk 107