xref: /aosp_15_r20/frameworks/rs/driver/rsdShader.h (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker  * Copyright (C) 2011-2012 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker  *
4*e1eccf28SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker  *
8*e1eccf28SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker  *
10*e1eccf28SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker  * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker  */
16*e1eccf28SAndroid Build Coastguard Worker 
17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RSD_SHADER_H
18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RSD_SHADER_H
19*e1eccf28SAndroid Build Coastguard Worker 
20*e1eccf28SAndroid Build Coastguard Worker #include <string>
21*e1eccf28SAndroid Build Coastguard Worker #include <vector>
22*e1eccf28SAndroid Build Coastguard Worker 
23*e1eccf28SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
24*e1eccf28SAndroid Build Coastguard Worker namespace android {
25*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
26*e1eccf28SAndroid Build Coastguard Worker 
27*e1eccf28SAndroid Build Coastguard Worker class Element;
28*e1eccf28SAndroid Build Coastguard Worker class Context;
29*e1eccf28SAndroid Build Coastguard Worker class Program;
30*e1eccf28SAndroid Build Coastguard Worker 
31*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
32*e1eccf28SAndroid Build Coastguard Worker } // namespace android
33*e1eccf28SAndroid Build Coastguard Worker 
34*e1eccf28SAndroid Build Coastguard Worker class RsdShaderCache;
35*e1eccf28SAndroid Build Coastguard Worker 
36*e1eccf28SAndroid Build Coastguard Worker #define RS_SHADER_ATTR "ATTRIB_"
37*e1eccf28SAndroid Build Coastguard Worker #define RS_SHADER_UNI "UNI_"
38*e1eccf28SAndroid Build Coastguard Worker 
39*e1eccf28SAndroid Build Coastguard Worker class RsdShader {
40*e1eccf28SAndroid Build Coastguard Worker public:
41*e1eccf28SAndroid Build Coastguard Worker 
42*e1eccf28SAndroid Build Coastguard Worker     RsdShader(const android::renderscript::Program *p, uint32_t type,
43*e1eccf28SAndroid Build Coastguard Worker               const char * shaderText, size_t shaderLength,
44*e1eccf28SAndroid Build Coastguard Worker               const char** textureNames, size_t textureNamesCount,
45*e1eccf28SAndroid Build Coastguard Worker               const size_t *textureNamesLength);
46*e1eccf28SAndroid Build Coastguard Worker     virtual ~RsdShader();
47*e1eccf28SAndroid Build Coastguard Worker 
48*e1eccf28SAndroid Build Coastguard Worker     uint32_t getStateBasedShaderID(const android::renderscript::Context *);
49*e1eccf28SAndroid Build Coastguard Worker 
50*e1eccf28SAndroid Build Coastguard Worker     // Add ability to get all ID's to clean up the cached program objects
getStateBasedIDCount()51*e1eccf28SAndroid Build Coastguard Worker     uint32_t getStateBasedIDCount() const { return mStateBasedShaders.size(); }
getStateBasedID(uint32_t index)52*e1eccf28SAndroid Build Coastguard Worker     uint32_t getStateBasedID(uint32_t index) const {
53*e1eccf28SAndroid Build Coastguard Worker         return mStateBasedShaders.at(index)->mShaderID;
54*e1eccf28SAndroid Build Coastguard Worker     }
55*e1eccf28SAndroid Build Coastguard Worker 
getAttribCount()56*e1eccf28SAndroid Build Coastguard Worker     uint32_t getAttribCount() const {return mAttribCount;}
getUniformCount()57*e1eccf28SAndroid Build Coastguard Worker     uint32_t getUniformCount() const {return mUniformCount;}
getAttribName(uint32_t i)58*e1eccf28SAndroid Build Coastguard Worker     const std::string & getAttribName(uint32_t i) const {return mAttribNames[i];}
getUniformName(uint32_t i)59*e1eccf28SAndroid Build Coastguard Worker     const std::string & getUniformName(uint32_t i) const {return mUniformNames[i];}
getUniformArraySize(uint32_t i)60*e1eccf28SAndroid Build Coastguard Worker     uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];}
61*e1eccf28SAndroid Build Coastguard Worker 
62*e1eccf28SAndroid Build Coastguard Worker     std::string getGLSLInputString() const;
63*e1eccf28SAndroid Build Coastguard Worker 
isValid()64*e1eccf28SAndroid Build Coastguard Worker     bool isValid() const {return mIsValid;}
forceDirty()65*e1eccf28SAndroid Build Coastguard Worker     void forceDirty() const {mDirty = true;}
66*e1eccf28SAndroid Build Coastguard Worker 
67*e1eccf28SAndroid Build Coastguard Worker     bool loadShader(const android::renderscript::Context *);
68*e1eccf28SAndroid Build Coastguard Worker     void setup(const android::renderscript::Context *, RsdShaderCache *sc);
69*e1eccf28SAndroid Build Coastguard Worker 
70*e1eccf28SAndroid Build Coastguard Worker protected:
71*e1eccf28SAndroid Build Coastguard Worker 
72*e1eccf28SAndroid Build Coastguard Worker     class StateBasedKey {
73*e1eccf28SAndroid Build Coastguard Worker     public:
StateBasedKey(uint32_t texCount)74*e1eccf28SAndroid Build Coastguard Worker         explicit StateBasedKey(uint32_t texCount) : mShaderID(0) {
75*e1eccf28SAndroid Build Coastguard Worker             mTextureTargets = new uint32_t[texCount];
76*e1eccf28SAndroid Build Coastguard Worker         }
~StateBasedKey()77*e1eccf28SAndroid Build Coastguard Worker         ~StateBasedKey() {
78*e1eccf28SAndroid Build Coastguard Worker             delete[] mTextureTargets;
79*e1eccf28SAndroid Build Coastguard Worker         }
80*e1eccf28SAndroid Build Coastguard Worker         uint32_t mShaderID;
81*e1eccf28SAndroid Build Coastguard Worker         uint32_t *mTextureTargets;
82*e1eccf28SAndroid Build Coastguard Worker     };
83*e1eccf28SAndroid Build Coastguard Worker 
84*e1eccf28SAndroid Build Coastguard Worker     bool createShader();
85*e1eccf28SAndroid Build Coastguard Worker     StateBasedKey *getExistingState();
86*e1eccf28SAndroid Build Coastguard Worker 
87*e1eccf28SAndroid Build Coastguard Worker     const android::renderscript::Program *mRSProgram;
88*e1eccf28SAndroid Build Coastguard Worker     bool mIsValid;
89*e1eccf28SAndroid Build Coastguard Worker 
90*e1eccf28SAndroid Build Coastguard Worker     // Applies to vertex and fragment shaders only
91*e1eccf28SAndroid Build Coastguard Worker     void appendUserConstants();
92*e1eccf28SAndroid Build Coastguard Worker     void setupUserConstants(const android::renderscript::Context *rsc,
93*e1eccf28SAndroid Build Coastguard Worker                             RsdShaderCache *sc, bool isFragment);
94*e1eccf28SAndroid Build Coastguard Worker     void initAddUserElement(const android::renderscript::Element *e,
95*e1eccf28SAndroid Build Coastguard Worker                             std::string *names, uint32_t *arrayLengths,
96*e1eccf28SAndroid Build Coastguard Worker                             uint32_t *count, const char *prefix);
97*e1eccf28SAndroid Build Coastguard Worker     void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc);
98*e1eccf28SAndroid Build Coastguard Worker     void setupSampler(const android::renderscript::Context *rsc,
99*e1eccf28SAndroid Build Coastguard Worker                       const android::renderscript::Sampler *s,
100*e1eccf28SAndroid Build Coastguard Worker                       const android::renderscript::Allocation *tex);
101*e1eccf28SAndroid Build Coastguard Worker 
102*e1eccf28SAndroid Build Coastguard Worker     void appendAttributes();
103*e1eccf28SAndroid Build Coastguard Worker     void appendTextures();
104*e1eccf28SAndroid Build Coastguard Worker 
105*e1eccf28SAndroid Build Coastguard Worker     void initAttribAndUniformArray();
106*e1eccf28SAndroid Build Coastguard Worker 
107*e1eccf28SAndroid Build Coastguard Worker     mutable bool mDirty;
108*e1eccf28SAndroid Build Coastguard Worker     std::string mShader;
109*e1eccf28SAndroid Build Coastguard Worker     std::string mUserShader;
110*e1eccf28SAndroid Build Coastguard Worker     uint32_t mType;
111*e1eccf28SAndroid Build Coastguard Worker 
112*e1eccf28SAndroid Build Coastguard Worker     uint32_t mTextureCount;
113*e1eccf28SAndroid Build Coastguard Worker     StateBasedKey *mCurrentState;
114*e1eccf28SAndroid Build Coastguard Worker     uint32_t mAttribCount;
115*e1eccf28SAndroid Build Coastguard Worker     uint32_t mUniformCount;
116*e1eccf28SAndroid Build Coastguard Worker     std::string *mAttribNames;
117*e1eccf28SAndroid Build Coastguard Worker     std::string *mUniformNames;
118*e1eccf28SAndroid Build Coastguard Worker     uint32_t *mUniformArraySizes;
119*e1eccf28SAndroid Build Coastguard Worker 
120*e1eccf28SAndroid Build Coastguard Worker     std::vector<std::string> mTextureNames;
121*e1eccf28SAndroid Build Coastguard Worker 
122*e1eccf28SAndroid Build Coastguard Worker     std::vector<StateBasedKey*> mStateBasedShaders;
123*e1eccf28SAndroid Build Coastguard Worker 
124*e1eccf28SAndroid Build Coastguard Worker     int32_t mTextureUniformIndexStart;
125*e1eccf28SAndroid Build Coastguard Worker 
126*e1eccf28SAndroid Build Coastguard Worker     void logUniform(const android::renderscript::Element *field,
127*e1eccf28SAndroid Build Coastguard Worker                     const float *fd, uint32_t arraySize);
128*e1eccf28SAndroid Build Coastguard Worker     void setUniform(const android::renderscript::Context *rsc,
129*e1eccf28SAndroid Build Coastguard Worker                     const android::renderscript::Element *field,
130*e1eccf28SAndroid Build Coastguard Worker                     const float *fd, int32_t slot, uint32_t arraySize );
131*e1eccf28SAndroid Build Coastguard Worker     void initMemberVars();
132*e1eccf28SAndroid Build Coastguard Worker     void init(const char** textureNames, size_t textureNamesCount,
133*e1eccf28SAndroid Build Coastguard Worker               const size_t *textureNamesLength);
134*e1eccf28SAndroid Build Coastguard Worker };
135*e1eccf28SAndroid Build Coastguard Worker 
136*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_RSD_SHADER_H
137*e1eccf28SAndroid Build Coastguard Worker 
138*e1eccf28SAndroid Build Coastguard Worker 
139*e1eccf28SAndroid Build Coastguard Worker 
140*e1eccf28SAndroid Build Coastguard Worker 
141