xref: /aosp_15_r20/frameworks/rs/driver/rsdShaderCache.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_CACHE_H
18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RSD_SHADER_CACHE_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 namespace android {
24*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
25*e1eccf28SAndroid Build Coastguard Worker 
26*e1eccf28SAndroid Build Coastguard Worker class Context;
27*e1eccf28SAndroid Build Coastguard Worker 
28*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
29*e1eccf28SAndroid Build Coastguard Worker } // namespace android
30*e1eccf28SAndroid Build Coastguard Worker 
31*e1eccf28SAndroid Build Coastguard Worker class RsdShader;
32*e1eccf28SAndroid Build Coastguard Worker 
33*e1eccf28SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
34*e1eccf28SAndroid Build Coastguard Worker 
35*e1eccf28SAndroid Build Coastguard Worker // An element is a group of Components that occupies one cell in a structure.
36*e1eccf28SAndroid Build Coastguard Worker class RsdShaderCache {
37*e1eccf28SAndroid Build Coastguard Worker public:
38*e1eccf28SAndroid Build Coastguard Worker     RsdShaderCache();
39*e1eccf28SAndroid Build Coastguard Worker     virtual ~RsdShaderCache();
40*e1eccf28SAndroid Build Coastguard Worker 
setActiveVertex(RsdShader * pv)41*e1eccf28SAndroid Build Coastguard Worker     void setActiveVertex(RsdShader *pv) {
42*e1eccf28SAndroid Build Coastguard Worker         mVertexDirty = true;
43*e1eccf28SAndroid Build Coastguard Worker         mVertex = pv;
44*e1eccf28SAndroid Build Coastguard Worker     }
45*e1eccf28SAndroid Build Coastguard Worker 
setActiveFragment(RsdShader * pf)46*e1eccf28SAndroid Build Coastguard Worker     void setActiveFragment(RsdShader *pf) {
47*e1eccf28SAndroid Build Coastguard Worker         mFragmentDirty = true;
48*e1eccf28SAndroid Build Coastguard Worker         mFragment = pf;
49*e1eccf28SAndroid Build Coastguard Worker     }
50*e1eccf28SAndroid Build Coastguard Worker 
51*e1eccf28SAndroid Build Coastguard Worker     bool setup(const android::renderscript::Context *rsc);
52*e1eccf28SAndroid Build Coastguard Worker 
53*e1eccf28SAndroid Build Coastguard Worker     void cleanupVertex(RsdShader *s);
54*e1eccf28SAndroid Build Coastguard Worker     void cleanupFragment(RsdShader *s);
55*e1eccf28SAndroid Build Coastguard Worker 
56*e1eccf28SAndroid Build Coastguard Worker     void cleanupAll();
57*e1eccf28SAndroid Build Coastguard Worker 
58*e1eccf28SAndroid Build Coastguard Worker     int32_t vtxAttribSlot(const std::string &attrName) const;
vtxUniformSlot(uint32_t a)59*e1eccf28SAndroid Build Coastguard Worker     int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->vtxUniforms[a].slot;}
vtxUniformSize(uint32_t a)60*e1eccf28SAndroid Build Coastguard Worker     uint32_t vtxUniformSize(uint32_t a) const {return mCurrent->vtxUniforms[a].arraySize;}
fragUniformSlot(uint32_t a)61*e1eccf28SAndroid Build Coastguard Worker     int32_t fragUniformSlot(uint32_t a) const {return mCurrent->fragUniforms[a].slot;}
fragUniformSize(uint32_t a)62*e1eccf28SAndroid Build Coastguard Worker     uint32_t fragUniformSize(uint32_t a) const {return mCurrent->fragUniforms[a].arraySize;}
63*e1eccf28SAndroid Build Coastguard Worker 
64*e1eccf28SAndroid Build Coastguard Worker protected:
65*e1eccf28SAndroid Build Coastguard Worker     bool link(const android::renderscript::Context *rsc);
66*e1eccf28SAndroid Build Coastguard Worker     bool mFragmentDirty;
67*e1eccf28SAndroid Build Coastguard Worker     bool mVertexDirty;
68*e1eccf28SAndroid Build Coastguard Worker     RsdShader *mVertex;
69*e1eccf28SAndroid Build Coastguard Worker     RsdShader *mFragment;
70*e1eccf28SAndroid Build Coastguard Worker 
71*e1eccf28SAndroid Build Coastguard Worker     struct UniformQueryData {
72*e1eccf28SAndroid Build Coastguard Worker         char *name;
73*e1eccf28SAndroid Build Coastguard Worker         uint32_t nameLength;
74*e1eccf28SAndroid Build Coastguard Worker         int32_t writtenLength;
75*e1eccf28SAndroid Build Coastguard Worker         int32_t arraySize;
76*e1eccf28SAndroid Build Coastguard Worker         uint32_t type;
UniformQueryDataUniformQueryData77*e1eccf28SAndroid Build Coastguard Worker         explicit UniformQueryData(uint32_t maxName) {
78*e1eccf28SAndroid Build Coastguard Worker             name = nullptr;
79*e1eccf28SAndroid Build Coastguard Worker             nameLength = maxName;
80*e1eccf28SAndroid Build Coastguard Worker             if (nameLength > 0 ) {
81*e1eccf28SAndroid Build Coastguard Worker                 name = new char[nameLength];
82*e1eccf28SAndroid Build Coastguard Worker             }
83*e1eccf28SAndroid Build Coastguard Worker         }
~UniformQueryDataUniformQueryData84*e1eccf28SAndroid Build Coastguard Worker         ~UniformQueryData() {
85*e1eccf28SAndroid Build Coastguard Worker             if (name != nullptr) {
86*e1eccf28SAndroid Build Coastguard Worker                 delete[] name;
87*e1eccf28SAndroid Build Coastguard Worker                 name = nullptr;
88*e1eccf28SAndroid Build Coastguard Worker             }
89*e1eccf28SAndroid Build Coastguard Worker         }
90*e1eccf28SAndroid Build Coastguard Worker     };
91*e1eccf28SAndroid Build Coastguard Worker     struct UniformData {
92*e1eccf28SAndroid Build Coastguard Worker         int32_t slot;
93*e1eccf28SAndroid Build Coastguard Worker         uint32_t arraySize;
94*e1eccf28SAndroid Build Coastguard Worker     };
95*e1eccf28SAndroid Build Coastguard Worker     struct AttrData {
96*e1eccf28SAndroid Build Coastguard Worker         int32_t slot;
97*e1eccf28SAndroid Build Coastguard Worker         const char* name;
98*e1eccf28SAndroid Build Coastguard Worker     };
99*e1eccf28SAndroid Build Coastguard Worker     struct ProgramEntry {
ProgramEntryProgramEntry100*e1eccf28SAndroid Build Coastguard Worker         ProgramEntry(uint32_t numVtxAttr, uint32_t numVtxUnis,
101*e1eccf28SAndroid Build Coastguard Worker                      uint32_t numFragUnis) : vtx(0), frag(0), program(0), vtxAttrCount(0),
102*e1eccf28SAndroid Build Coastguard Worker                                              vtxAttrs(0), vtxUniforms(0), fragUniforms(0),
103*e1eccf28SAndroid Build Coastguard Worker                                              fragUniformIsSTO(0) {
104*e1eccf28SAndroid Build Coastguard Worker             vtxAttrCount = numVtxAttr;
105*e1eccf28SAndroid Build Coastguard Worker             if (numVtxAttr) {
106*e1eccf28SAndroid Build Coastguard Worker                 vtxAttrs = new AttrData[numVtxAttr];
107*e1eccf28SAndroid Build Coastguard Worker             }
108*e1eccf28SAndroid Build Coastguard Worker             if (numVtxUnis) {
109*e1eccf28SAndroid Build Coastguard Worker                 vtxUniforms = new UniformData[numVtxUnis];
110*e1eccf28SAndroid Build Coastguard Worker             }
111*e1eccf28SAndroid Build Coastguard Worker             if (numFragUnis) {
112*e1eccf28SAndroid Build Coastguard Worker                 fragUniforms = new UniformData[numFragUnis];
113*e1eccf28SAndroid Build Coastguard Worker                 fragUniformIsSTO = new bool[numFragUnis];
114*e1eccf28SAndroid Build Coastguard Worker             }
115*e1eccf28SAndroid Build Coastguard Worker         }
~ProgramEntryProgramEntry116*e1eccf28SAndroid Build Coastguard Worker         ~ProgramEntry() {
117*e1eccf28SAndroid Build Coastguard Worker             if (vtxAttrs) {
118*e1eccf28SAndroid Build Coastguard Worker                 delete[] vtxAttrs;
119*e1eccf28SAndroid Build Coastguard Worker                 vtxAttrs = nullptr;
120*e1eccf28SAndroid Build Coastguard Worker             }
121*e1eccf28SAndroid Build Coastguard Worker             if (vtxUniforms) {
122*e1eccf28SAndroid Build Coastguard Worker                 delete[] vtxUniforms;
123*e1eccf28SAndroid Build Coastguard Worker                 vtxUniforms = nullptr;
124*e1eccf28SAndroid Build Coastguard Worker             }
125*e1eccf28SAndroid Build Coastguard Worker             if (fragUniforms) {
126*e1eccf28SAndroid Build Coastguard Worker                 delete[] fragUniforms;
127*e1eccf28SAndroid Build Coastguard Worker                 fragUniforms = nullptr;
128*e1eccf28SAndroid Build Coastguard Worker             }
129*e1eccf28SAndroid Build Coastguard Worker             if (fragUniformIsSTO) {
130*e1eccf28SAndroid Build Coastguard Worker                 delete[] fragUniformIsSTO;
131*e1eccf28SAndroid Build Coastguard Worker                 fragUniformIsSTO = nullptr;
132*e1eccf28SAndroid Build Coastguard Worker             }
133*e1eccf28SAndroid Build Coastguard Worker         }
134*e1eccf28SAndroid Build Coastguard Worker         uint32_t vtx;
135*e1eccf28SAndroid Build Coastguard Worker         uint32_t frag;
136*e1eccf28SAndroid Build Coastguard Worker         uint32_t program;
137*e1eccf28SAndroid Build Coastguard Worker         uint32_t vtxAttrCount;
138*e1eccf28SAndroid Build Coastguard Worker         AttrData *vtxAttrs;
139*e1eccf28SAndroid Build Coastguard Worker         UniformData *vtxUniforms;
140*e1eccf28SAndroid Build Coastguard Worker         UniformData *fragUniforms;
141*e1eccf28SAndroid Build Coastguard Worker         bool *fragUniformIsSTO;
142*e1eccf28SAndroid Build Coastguard Worker     };
143*e1eccf28SAndroid Build Coastguard Worker     std::vector<ProgramEntry*> mEntries;
144*e1eccf28SAndroid Build Coastguard Worker     ProgramEntry *mCurrent;
145*e1eccf28SAndroid Build Coastguard Worker 
146*e1eccf28SAndroid Build Coastguard Worker     bool hasArrayUniforms(RsdShader *vtx, RsdShader *frag);
147*e1eccf28SAndroid Build Coastguard Worker     void populateUniformData(RsdShader *prog, uint32_t linkedID, UniformData *data);
148*e1eccf28SAndroid Build Coastguard Worker     void updateUniformArrayData(const android::renderscript::Context *rsc,
149*e1eccf28SAndroid Build Coastguard Worker                                 RsdShader *prog, uint32_t linkedID,
150*e1eccf28SAndroid Build Coastguard Worker                                 UniformData *data, const char* logTag,
151*e1eccf28SAndroid Build Coastguard Worker                                 UniformQueryData **uniformList, uint32_t uniListSize);
152*e1eccf28SAndroid Build Coastguard Worker };
153*e1eccf28SAndroid Build Coastguard Worker 
154*e1eccf28SAndroid Build Coastguard Worker 
155*e1eccf28SAndroid Build Coastguard Worker #endif //ANDROID_RSD_SHADER_CACHE_H
156*e1eccf28SAndroid Build Coastguard Worker 
157*e1eccf28SAndroid Build Coastguard Worker 
158*e1eccf28SAndroid Build Coastguard Worker 
159*e1eccf28SAndroid Build Coastguard Worker 
160