rsProgram.h revision e7ae69f4a70f1813cf8086ebd9714192c635300a
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#ifndef ANDROID_RS_PROGRAM_H 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define ANDROID_RS_PROGRAM_H 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsObjectBase.h" 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsElement.h" 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// --------------------------------------------------------------------------- 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 26c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsclass ShaderCache; 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 28e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk#define RS_SHADER_INTERNAL "//rs_shader_internal\n" 29e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsclass Program : public ObjectBase 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic: 33c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams const static uint32_t MAX_ATTRIBS = 8; 34c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams const static uint32_t MAX_UNIFORMS = 16; 357dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams const static uint32_t MAX_TEXTURE = 2; 36c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Program(Context *); 384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Program(Context *, const char * shaderText, uint32_t shaderLength, 394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams const uint32_t * params, uint32_t paramLength); 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams virtual ~Program(); 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 429ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams void bindAllocation(Allocation *, uint32_t slot); 43c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams virtual void createShader(); 44c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 45e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk bool isUserProgram() const {return !mIsInternal;} 46433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams 477dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams void bindTexture(uint32_t slot, Allocation *); 487dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams void bindSampler(uint32_t slot, Sampler *); 497dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams 50c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t getShaderID() const {return mShaderID;} 51f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams void setShader(const char *, uint32_t len); 52c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 53c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t getAttribCount() const {return mAttribCount;} 54c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t getUniformCount() const {return mUniformCount;} 55c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams const String8 & getAttribName(uint32_t i) const {return mAttribNames[i];} 56c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams const String8 & getUniformName(uint32_t i) const {return mUniformNames[i];} 57cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams 58b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams String8 getGLSLInputString() const; 59b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams String8 getGLSLOutputString() const; 60b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams String8 getGLSLConstantString() const; 61b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 62a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams bool isValid() const {return mIsValid;} 63a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsprotected: 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // Components not listed in "in" will be passed though 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // unless overwritten by components in out. 674815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ObjectBaseRef<Element> *mInputElements; 684815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ObjectBaseRef<Element> *mOutputElements; 694815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams ObjectBaseRef<Type> *mConstantTypes; 704815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t mInputCount; 714815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t mOutputCount; 724815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams uint32_t mConstantCount; 73a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams bool mIsValid; 74e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk bool mIsInternal; 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 766e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk // Applies to vertex and fragment shaders only 776e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk void appendUserConstants(); 786e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk void setupUserConstants(ShaderCache *sc, bool isFragment); 796e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk void initAddUserElement(const Element *e, String8 *names, uint32_t *count, const char *prefix); 806e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk 819ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams ObjectBaseRef<Allocation> mConstants[MAX_UNIFORMS]; 82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 83cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams mutable bool mDirty; 84c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams String8 mShader; 85f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams String8 mUserShader; 86c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t mShaderID; 87c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 88f2e4fa215c420cf0f8d226e9a59acb1f312e5e40Jason Sams uint32_t mTextureCount; 89c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t mAttribCount; 90c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t mUniformCount; 91c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams String8 mAttribNames[MAX_ATTRIBS]; 92c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams String8 mUniformNames[MAX_UNIFORMS]; 93c2f94902d454ac724c4d7b5246373ca0ff2c99d1Jason Sams 947dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams // The difference between Textures and Constants is how they are accessed 957dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams // Texture lookups go though a sampler which in effect converts normalized 967dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams // coordinates into type specific. Multiple samples may also be taken 977dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams // and filtered. 987dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams // 997dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams // Constants are strictly accessed by programetic loads. 1007dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams ObjectBaseRef<Allocation> mTextures[MAX_TEXTURE]; 1017dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams ObjectBaseRef<Sampler> mSamplers[MAX_TEXTURE]; 1027dad9c30a59c99b57269e1b498807b6f034d56e9Jason Sams 103cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams bool loadShader(Context *, uint32_t type); 104c2f94902d454ac724c4d7b5246373ca0ff2c99d1Jason Sams 105c2f94902d454ac724c4d7b5246373ca0ff2c99d1Jason Samspublic: 1065c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams void forceDirty() const {mDirty = true;} 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}; 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif 114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 117