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