rsdShaderCache.h revision afb743aca56c18beb7ab924e75cb6e070ef3e55a
1c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/* 2c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Copyright (C) 2009 The Android Open Source Project 3c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * 4c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * you may not use this file except in compliance with the License. 6c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * You may obtain a copy of the License at 7c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * 8c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * 10c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Unless required by applicable law or agreed to in writing, software 11c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * See the License for the specific language governing permissions and 14c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * limitations under the License. 15c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams */ 16c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 17c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#ifndef ANDROID_SHADER_CACHE_H 18c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#define ANDROID_SHADER_CACHE_H 19c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 20c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 21c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include "rsObjectBase.h" 22c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include "rsVertexArray.h" 23c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 24c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams// --------------------------------------------------------------------------- 25c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsnamespace android { 26c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsnamespace renderscript { 27c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 28c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 29c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams// An element is a group of Components that occupies one cell in a structure. 30afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass ShaderCache { 31c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samspublic: 32c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams ShaderCache(); 33c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams virtual ~ShaderCache(); 34c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 35cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams bool lookup(Context *rsc, ProgramVertex *, ProgramFragment *); 36c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 37c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams void cleanupVertex(uint32_t id); 38c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams void cleanupFragment(uint32_t id); 39c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 40c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams void cleanupAll(); 41c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 42886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk int32_t vtxAttribSlot(const String8 &attrName) const; 4354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->vtxUniforms[a].slot;} 4454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t vtxUniformSize(uint32_t a) const {return mCurrent->vtxUniforms[a].arraySize;} 4554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t fragUniformSlot(uint32_t a) const {return mCurrent->fragUniforms[a].slot;} 4654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t fragUniformSize(uint32_t a) const {return mCurrent->fragUniforms[a].arraySize;} 47c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 48c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsprotected: 4954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct UniformQueryData { 5054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk char *name; 5154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t nameLength; 5254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t writtenLength; 5354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t arraySize; 5454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t type; 5554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformQueryData(uint32_t maxName) { 5654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk name = NULL; 5754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk nameLength = maxName; 58afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (nameLength > 0 ) { 5954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk name = new char[nameLength]; 6054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ~UniformQueryData() { 63afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (name != NULL) { 6454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] name; 6554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk name = NULL; 6654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 6954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct UniformData { 7054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t slot; 7154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t arraySize; 7254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 7354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct AttrData { 7454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t slot; 7554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const char* name; 7654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 7754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct ProgramEntry { 7854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ProgramEntry(uint32_t numVtxAttr, uint32_t numVtxUnis, 7954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t numFragUnis) : vtx(0), frag(0), program(0), vtxAttrCount(0), 8054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxAttrs(0), vtxUniforms(0), fragUniforms(0) { 8154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxAttrCount = numVtxAttr; 82afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numVtxAttr) { 8354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxAttrs = new AttrData[numVtxAttr]; 8454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 85afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numVtxUnis) { 8654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxUniforms = new UniformData[numVtxUnis]; 8754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 88afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numFragUnis) { 8954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk fragUniforms = new UniformData[numFragUnis]; 9054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ~ProgramEntry() { 93afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vtxAttrs) { 9454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] vtxAttrs; 9554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxAttrs = NULL; 9654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 97afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vtxUniforms) { 9854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] vtxUniforms; 9954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxUniforms = NULL; 10054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 101afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (fragUniforms) { 10254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] fragUniforms; 10354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk fragUniforms = NULL; 10454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 10554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 106c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t vtx; 107c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t frag; 108c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t program; 109886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk uint32_t vtxAttrCount; 11054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk AttrData *vtxAttrs; 11154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *vtxUniforms; 11254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *fragUniforms; 11354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 11454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk Vector<ProgramEntry*> mEntries; 11554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ProgramEntry *mCurrent; 11654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 11754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk bool hasArrayUniforms(ProgramVertex *vtx, ProgramFragment *frag); 11854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk void populateUniformData(Program *prog, uint32_t linkedID, UniformData *data); 11954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk void updateUniformArrayData(Context *rsc, Program *prog, uint32_t linkedID, 12054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *data, const char* logTag, 12154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformQueryData **uniformList, uint32_t uniListSize); 122c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}; 123c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 124c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 126c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams} 128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#endif //ANDROID_SHADER_CACHE_H 129c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 130c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 131c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 132c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 133