1c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams/* 23522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams * Copyright (C) 2011-2012 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 17a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#ifndef ANDROID_RSD_SHADER_CACHE_H 18a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#define ANDROID_RSD_SHADER_CACHE_H 19c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 20c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsnamespace android { 21c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsnamespace renderscript { 22c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 23a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass Context; 24a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 28b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni 29b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni#if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB) 30b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni#include <utils/String8.h> 31b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni#include <utils/Vector.h> 32b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni#else 330b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include "rsUtils.h" 340b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 35a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass RsdShader; 36a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 37a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk// --------------------------------------------------------------------------- 38c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 39c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams// An element is a group of Components that occupies one cell in a structure. 40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass RsdShaderCache { 41c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samspublic: 42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShaderCache(); 43a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk virtual ~RsdShaderCache(); 44a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 45a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void setActiveVertex(RsdShader *pv) { 46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mVertexDirty = true; 47a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mVertex = pv; 48a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 49c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 50a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void setActiveFragment(RsdShader *pf) { 51a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mFragmentDirty = true; 52a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mFragment = pf; 53a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 54a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 55a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool setup(const android::renderscript::Context *rsc); 56c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 576d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk void cleanupVertex(RsdShader *s); 586d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk void cleanupFragment(RsdShader *s); 59c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 60c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams void cleanupAll(); 61c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 62b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni int32_t vtxAttribSlot(const android::String8 &attrName) const; 6354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->vtxUniforms[a].slot;} 6454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t vtxUniformSize(uint32_t a) const {return mCurrent->vtxUniforms[a].arraySize;} 6554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t fragUniformSlot(uint32_t a) const {return mCurrent->fragUniforms[a].slot;} 6654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t fragUniformSize(uint32_t a) const {return mCurrent->fragUniforms[a].arraySize;} 67c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 68c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsprotected: 69a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool link(const android::renderscript::Context *rsc); 70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool mFragmentDirty; 71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool mVertexDirty; 72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *mVertex; 73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *mFragment; 74a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 7554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct UniformQueryData { 7654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk char *name; 7754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t nameLength; 7854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t writtenLength; 7954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t arraySize; 8054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t type; 8154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformQueryData(uint32_t maxName) { 8244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes name = nullptr; 8354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk nameLength = maxName; 84afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (nameLength > 0 ) { 8554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk name = new char[nameLength]; 8654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 8754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 8854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ~UniformQueryData() { 8944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (name != nullptr) { 9054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] name; 9144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes name = nullptr; 9254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 9554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct UniformData { 9654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t slot; 9754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t arraySize; 9854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 9954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct AttrData { 10054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t slot; 10154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const char* name; 10254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 10354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct ProgramEntry { 10454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ProgramEntry(uint32_t numVtxAttr, uint32_t numVtxUnis, 10554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t numFragUnis) : vtx(0), frag(0), program(0), vtxAttrCount(0), 106ebf4a148cda98359129c04b96ed755a7d8c98b37Stephen Hines vtxAttrs(0), vtxUniforms(0), fragUniforms(0), 107ebf4a148cda98359129c04b96ed755a7d8c98b37Stephen Hines fragUniformIsSTO(0) { 10854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxAttrCount = numVtxAttr; 109afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numVtxAttr) { 11054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxAttrs = new AttrData[numVtxAttr]; 11154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 112afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numVtxUnis) { 11354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxUniforms = new UniformData[numVtxUnis]; 11454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 115afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numFragUnis) { 11654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk fragUniforms = new UniformData[numFragUnis]; 117cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams fragUniformIsSTO = new bool[numFragUnis]; 11854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 11954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 12054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ~ProgramEntry() { 121afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vtxAttrs) { 12254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] vtxAttrs; 12344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes vtxAttrs = nullptr; 12454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 125afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vtxUniforms) { 12654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] vtxUniforms; 12744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes vtxUniforms = nullptr; 12854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 129afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (fragUniforms) { 13054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] fragUniforms; 13144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes fragUniforms = nullptr; 13254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 133cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams if (fragUniformIsSTO) { 134cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams delete[] fragUniformIsSTO; 13544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes fragUniformIsSTO = nullptr; 136cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams } 13754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 138c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t vtx; 139c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t frag; 140c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t program; 141886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk uint32_t vtxAttrCount; 14254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk AttrData *vtxAttrs; 14354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *vtxUniforms; 14454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *fragUniforms; 145cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams bool *fragUniformIsSTO; 14654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 147b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni android::Vector<ProgramEntry*> mEntries; 14854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ProgramEntry *mCurrent; 14954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 150a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool hasArrayUniforms(RsdShader *vtx, RsdShader *frag); 151a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void populateUniformData(RsdShader *prog, uint32_t linkedID, UniformData *data); 152a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void updateUniformArrayData(const android::renderscript::Context *rsc, 153a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *prog, uint32_t linkedID, 15454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *data, const char* logTag, 15554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformQueryData **uniformList, uint32_t uniListSize); 156c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}; 157c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 158c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif //ANDROID_RSD_SHADER_CACHE_H 160b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni 161b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni 162b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni 163b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni 164