summaryrefslogtreecommitdiffstats
path: root/libs/rs/driver/rsdShader.h
blob: 2680b3ef99c24caccff33a4c3e1d802aca0a826d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * 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 <utils/String8.h>

// ---------------------------------------------------------------------------
namespace android {
namespace renderscript {

class Element;
class Context;
class Program;

}
}

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, uint32_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.itemAt(index)->mShaderID;
    }

    uint32_t getAttribCount() const {return mAttribCount;}
    uint32_t getUniformCount() const {return mUniformCount;}
    const android::String8 & getAttribName(uint32_t i) const {return mAttribNames[i];}
    const android::String8 & getUniformName(uint32_t i) const {return mUniformNames[i];}
    uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];}

    android::String8 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:
        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,
                            android::String8 *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;
    android::String8 mShader;
    android::String8 mUserShader;
    uint32_t mType;

    uint32_t mTextureCount;
    StateBasedKey *mCurrentState;
    uint32_t mAttribCount;
    uint32_t mUniformCount;
    android::String8 *mAttribNames;
    android::String8 *mUniformNames;
    uint32_t *mUniformArraySizes;

    android::Vector<android::String8> mTextureNames;

    android::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