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