• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_RSD_SHADER_CACHE_H
18 #define ANDROID_RSD_SHADER_CACHE_H
19 
20 namespace android {
21 namespace renderscript {
22 
23 class Context;
24 
25 }
26 }
27 
28 #include <utils/String8.h>
29 #include <utils/Vector.h>
30 class RsdShader;
31 
32 // ---------------------------------------------------------------------------
33 
34 // An element is a group of Components that occupies one cell in a structure.
35 class RsdShaderCache {
36 public:
37     RsdShaderCache();
38     virtual ~RsdShaderCache();
39 
setActiveVertex(RsdShader * pv)40     void setActiveVertex(RsdShader *pv) {
41         mVertexDirty = true;
42         mVertex = pv;
43     }
44 
setActiveFragment(RsdShader * pf)45     void setActiveFragment(RsdShader *pf) {
46         mFragmentDirty = true;
47         mFragment = pf;
48     }
49 
50     bool setup(const android::renderscript::Context *rsc);
51 
52     void cleanupVertex(uint32_t id);
53     void cleanupFragment(uint32_t id);
54 
55     void cleanupAll();
56 
57     int32_t vtxAttribSlot(const android::String8 &attrName) const;
vtxUniformSlot(uint32_t a)58     int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->vtxUniforms[a].slot;}
vtxUniformSize(uint32_t a)59     uint32_t vtxUniformSize(uint32_t a) const {return mCurrent->vtxUniforms[a].arraySize;}
fragUniformSlot(uint32_t a)60     int32_t fragUniformSlot(uint32_t a) const {return mCurrent->fragUniforms[a].slot;}
fragUniformSize(uint32_t a)61     uint32_t fragUniformSize(uint32_t a) const {return mCurrent->fragUniforms[a].arraySize;}
62 
63 protected:
64     bool link(const android::renderscript::Context *rsc);
65     bool mFragmentDirty;
66     bool mVertexDirty;
67     RsdShader *mVertex;
68     RsdShader *mFragment;
69 
70     struct UniformQueryData {
71         char *name;
72         uint32_t nameLength;
73         int32_t writtenLength;
74         int32_t arraySize;
75         uint32_t type;
UniformQueryDataUniformQueryData76         UniformQueryData(uint32_t maxName) {
77             name = NULL;
78             nameLength = maxName;
79             if (nameLength > 0 ) {
80                 name = new char[nameLength];
81             }
82         }
~UniformQueryDataUniformQueryData83         ~UniformQueryData() {
84             if (name != NULL) {
85                 delete[] name;
86                 name = NULL;
87             }
88         }
89     };
90     struct UniformData {
91         int32_t slot;
92         uint32_t arraySize;
93     };
94     struct AttrData {
95         int32_t slot;
96         const char* name;
97     };
98     struct ProgramEntry {
ProgramEntryProgramEntry99         ProgramEntry(uint32_t numVtxAttr, uint32_t numVtxUnis,
100                      uint32_t numFragUnis) : vtx(0), frag(0), program(0), vtxAttrCount(0),
101                                              vtxAttrs(0), vtxUniforms(0), fragUniforms(0) {
102             vtxAttrCount = numVtxAttr;
103             if (numVtxAttr) {
104                 vtxAttrs = new AttrData[numVtxAttr];
105             }
106             if (numVtxUnis) {
107                 vtxUniforms = new UniformData[numVtxUnis];
108             }
109             if (numFragUnis) {
110                 fragUniforms = new UniformData[numFragUnis];
111             }
112         }
~ProgramEntryProgramEntry113         ~ProgramEntry() {
114             if (vtxAttrs) {
115                 delete[] vtxAttrs;
116                 vtxAttrs = NULL;
117             }
118             if (vtxUniforms) {
119                 delete[] vtxUniforms;
120                 vtxUniforms = NULL;
121             }
122             if (fragUniforms) {
123                 delete[] fragUniforms;
124                 fragUniforms = NULL;
125             }
126         }
127         uint32_t vtx;
128         uint32_t frag;
129         uint32_t program;
130         uint32_t vtxAttrCount;
131         AttrData *vtxAttrs;
132         UniformData *vtxUniforms;
133         UniformData *fragUniforms;
134     };
135     android::Vector<ProgramEntry*> mEntries;
136     ProgramEntry *mCurrent;
137 
138     bool hasArrayUniforms(RsdShader *vtx, RsdShader *frag);
139     void populateUniformData(RsdShader *prog, uint32_t linkedID, UniformData *data);
140     void updateUniformArrayData(const android::renderscript::Context *rsc,
141                                 RsdShader *prog, uint32_t linkedID,
142                                 UniformData *data, const char* logTag,
143                                 UniformQueryData **uniformList, uint32_t uniListSize);
144 };
145 
146 
147 #endif //ANDROID_RSD_SHADER_CACHE_H
148 
149 
150 
151 
152