rsdShader.h revision 3522f40418fdf877f5a136475dbf75e57a3b7c77
1a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk/* 23522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams * Copyright (C) 2011-2012 The Android Open Source Project 3a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * 4a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 5a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * you may not use this file except in compliance with the License. 6a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * You may obtain a copy of the License at 7a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * 8a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 9a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * 10a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 11a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 12a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * See the License for the specific language governing permissions and 14a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * limitations under the License. 15a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk */ 16a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 17a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#ifndef ANDROID_RSD_SHADER_H 18a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#define ANDROID_RSD_SHADER_H 19a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 20a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include <utils/String8.h> 21a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 22a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk// --------------------------------------------------------------------------- 23a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouknamespace android { 24a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouknamespace renderscript { 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass Element; 27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass Context; 28a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass Program; 29a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 30a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 31a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 32a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 33a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass RsdShaderCache; 34a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 35a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#define RS_SHADER_ATTR "ATTRIB_" 36a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#define RS_SHADER_UNI "UNI_" 37a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass RsdShader { 39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukpublic: 40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader(const android::renderscript::Program *p, uint32_t type, 42748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char * shaderText, uint32_t shaderLength, 43748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const char** textureNames, size_t textureNamesCount, 44748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const size_t *textureNamesLength); 45a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk virtual ~RsdShader(); 46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 47a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool createShader(); 48a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 49a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t getShaderID() const {return mShaderID;} 50a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 51a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t getAttribCount() const {return mAttribCount;} 52a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t getUniformCount() const {return mUniformCount;} 53a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const android::String8 & getAttribName(uint32_t i) const {return mAttribNames[i];} 54a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const android::String8 & getUniformName(uint32_t i) const {return mUniformNames[i];} 55a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];} 56a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 57a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk android::String8 getGLSLInputString() const; 58a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 59a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool isValid() const {return mIsValid;} 60a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void forceDirty() const {mDirty = true;} 61a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 62a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool loadShader(const android::renderscript::Context *); 63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void setup(const android::renderscript::Context *, RsdShaderCache *sc); 64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukprotected: 66a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 67a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const android::renderscript::Program *mRSProgram; 68a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool mIsValid; 69a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk // Applies to vertex and fragment shaders only 71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void appendUserConstants(); 72748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk void setupUserConstants(const android::renderscript::Context *rsc, 73748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk RsdShaderCache *sc, bool isFragment); 74748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk void initAddUserElement(const android::renderscript::Element *e, 75748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk android::String8 *names, uint32_t *arrayLengths, 76748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk uint32_t *count, const char *prefix); 77a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc); 78748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk void setupSampler(const android::renderscript::Context *rsc, 79748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const android::renderscript::Sampler *s, 80748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const android::renderscript::Allocation *tex); 81a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 82a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void appendAttributes(); 83a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void appendTextures(); 84a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 85a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void initAttribAndUniformArray(); 86a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 87a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mutable bool mDirty; 88a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk android::String8 mShader; 89a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk android::String8 mUserShader; 90a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t mShaderID; 91a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t mType; 92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 93a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t mTextureCount; 94ba157304ce99d212403898b055998e6da7a20e9bAlex Sakhartchouk uint32_t *mTextureTargets; 95a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t mAttribCount; 96a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t mUniformCount; 97a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk android::String8 *mAttribNames; 98a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk android::String8 *mUniformNames; 99a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t *mUniformArraySizes; 100a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 1013522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams android::Vector<android::String8> mTextureNames; 1023522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams 103a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk int32_t mTextureUniformIndexStart; 104a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 105748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk void logUniform(const android::renderscript::Element *field, 106748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const float *fd, uint32_t arraySize); 107748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk void setUniform(const android::renderscript::Context *rsc, 108748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const android::renderscript::Element *field, 109748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const float *fd, int32_t slot, uint32_t arraySize ); 110a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void initMemberVars(); 111748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk void init(const char** textureNames, size_t textureNamesCount, 112748eb07e805b93c2bf79340d4937963ab739d17cAlex Sakhartchouk const size_t *textureNamesLength); 113a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk}; 114a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 115a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif //ANDROID_RSD_SHADER_H 116a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 117a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 118a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 119a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 120