diff options
Diffstat (limited to 'libs/rs/rsShaderCache.h')
-rw-r--r-- | libs/rs/rsShaderCache.h | 97 |
1 files changed, 76 insertions, 21 deletions
diff --git a/libs/rs/rsShaderCache.h b/libs/rs/rsShaderCache.h index df99ccc..3540366 100644 --- a/libs/rs/rsShaderCache.h +++ b/libs/rs/rsShaderCache.h @@ -27,8 +27,7 @@ namespace renderscript { // An element is a group of Components that occupies one cell in a structure. -class ShaderCache -{ +class ShaderCache { public: ShaderCache(); virtual ~ShaderCache(); @@ -40,30 +39,86 @@ public: void cleanupAll(); - int32_t vtxAttribSlot(uint32_t a) const {return mCurrent->mVtxAttribSlots[a];} - int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->mVtxUniformSlots[a];} - int32_t fragAttribSlot(uint32_t a) const {return mCurrent->mFragAttribSlots[a];} - int32_t fragUniformSlot(uint32_t a) const {return mCurrent->mFragUniformSlots[a];} - bool isUserVertexProgram() const {return mCurrent->mUserVertexProgram;} + int32_t vtxAttribSlot(const String8 &attrName) const; + int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->vtxUniforms[a].slot;} + uint32_t vtxUniformSize(uint32_t a) const {return mCurrent->vtxUniforms[a].arraySize;} + int32_t fragUniformSlot(uint32_t a) const {return mCurrent->fragUniforms[a].slot;} + uint32_t fragUniformSize(uint32_t a) const {return mCurrent->fragUniforms[a].arraySize;} protected: - typedef struct { + struct UniformQueryData { + char *name; + uint32_t nameLength; + int32_t writtenLength; + int32_t arraySize; + uint32_t type; + UniformQueryData(uint32_t maxName) { + name = NULL; + nameLength = maxName; + if (nameLength > 0 ) { + name = new char[nameLength]; + } + } + ~UniformQueryData() { + if (name != NULL) { + delete[] name; + name = NULL; + } + } + }; + struct UniformData { + int32_t slot; + uint32_t arraySize; + }; + struct AttrData { + int32_t slot; + const char* name; + }; + struct ProgramEntry { + ProgramEntry(uint32_t numVtxAttr, uint32_t numVtxUnis, + uint32_t numFragUnis) : vtx(0), frag(0), program(0), vtxAttrCount(0), + vtxAttrs(0), vtxUniforms(0), fragUniforms(0) { + vtxAttrCount = numVtxAttr; + if (numVtxAttr) { + vtxAttrs = new AttrData[numVtxAttr]; + } + if (numVtxUnis) { + vtxUniforms = new UniformData[numVtxUnis]; + } + if (numFragUnis) { + fragUniforms = new UniformData[numFragUnis]; + } + } + ~ProgramEntry() { + if (vtxAttrs) { + delete[] vtxAttrs; + vtxAttrs = NULL; + } + if (vtxUniforms) { + delete[] vtxUniforms; + vtxUniforms = NULL; + } + if (fragUniforms) { + delete[] fragUniforms; + fragUniforms = NULL; + } + } uint32_t vtx; uint32_t frag; uint32_t program; - int32_t mVtxAttribSlots[Program::MAX_ATTRIBS]; - int32_t mVtxUniformSlots[Program::MAX_UNIFORMS]; - int32_t mFragAttribSlots[Program::MAX_ATTRIBS]; - int32_t mFragUniformSlots[Program::MAX_UNIFORMS]; - bool mUserVertexProgram; - bool mIsValid; - } entry_t; - entry_t *mEntries; - entry_t *mCurrent; - - uint32_t mEntryCount; - uint32_t mEntryAllocationCount; - + uint32_t vtxAttrCount; + AttrData *vtxAttrs; + UniformData *vtxUniforms; + UniformData *fragUniforms; + }; + Vector<ProgramEntry*> mEntries; + ProgramEntry *mCurrent; + + bool hasArrayUniforms(ProgramVertex *vtx, ProgramFragment *frag); + void populateUniformData(Program *prog, uint32_t linkedID, UniformData *data); + void updateUniformArrayData(Context *rsc, Program *prog, uint32_t linkedID, + UniformData *data, const char* logTag, + UniformQueryData **uniformList, uint32_t uniListSize); }; |