rsdShaderCache.h revision 44bef6fba6244292b751387f3d6c31cca96c28ad
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 2093d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes#include <string> 2193d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes#include <vector> 2293d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes 23c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsnamespace android { 24c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsnamespace renderscript { 25c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass Context; 27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 28a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 29a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 30a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 316847e73314e13aa02231268cca245a81eb0539caChris Wailes#if defined(RS_SERVER) || defined(RS_COMPATIBILITY_LIB) 320b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include "rsUtils.h" 330b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 34a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass RsdShader; 35a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 36a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk// --------------------------------------------------------------------------- 37c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 38c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams// An element is a group of Components that occupies one cell in a structure. 39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukclass RsdShaderCache { 40c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samspublic: 41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShaderCache(); 42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk virtual ~RsdShaderCache(); 43a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 44a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void setActiveVertex(RsdShader *pv) { 45a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mVertexDirty = true; 46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mVertex = pv; 47a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 48c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 49a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void setActiveFragment(RsdShader *pf) { 50a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mFragmentDirty = true; 51a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mFragment = pf; 52a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 53a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 54a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool setup(const android::renderscript::Context *rsc); 55c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 566d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk void cleanupVertex(RsdShader *s); 576d6e114f8bea8db08bf1decb673d3eb9a8f258aeAlex Sakhartchouk void cleanupFragment(RsdShader *s); 58c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 59c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams void cleanupAll(); 60c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 6193d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes int32_t vtxAttribSlot(const std::string &attrName) const; 6254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->vtxUniforms[a].slot;} 6354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t vtxUniformSize(uint32_t a) const {return mCurrent->vtxUniforms[a].arraySize;} 6454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t fragUniformSlot(uint32_t a) const {return mCurrent->fragUniforms[a].slot;} 6554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t fragUniformSize(uint32_t a) const {return mCurrent->fragUniforms[a].arraySize;} 66c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 67c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsprotected: 68a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool link(const android::renderscript::Context *rsc); 69a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool mFragmentDirty; 70a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool mVertexDirty; 71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *mVertex; 72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *mFragment; 73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 7454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct UniformQueryData { 7554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk char *name; 7654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t nameLength; 7754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t writtenLength; 7854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t arraySize; 7954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t type; 8054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformQueryData(uint32_t maxName) { 8144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes name = nullptr; 8254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk nameLength = maxName; 83afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (nameLength > 0 ) { 8454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk name = new char[nameLength]; 8554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 8654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 8754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ~UniformQueryData() { 8844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (name != nullptr) { 8954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] name; 9044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes name = nullptr; 9154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 9454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct UniformData { 9554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t slot; 9654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t arraySize; 9754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 9854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct AttrData { 9954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk int32_t slot; 10054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const char* name; 10154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 10254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk struct ProgramEntry { 10354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ProgramEntry(uint32_t numVtxAttr, uint32_t numVtxUnis, 10454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t numFragUnis) : vtx(0), frag(0), program(0), vtxAttrCount(0), 105ebf4a148cda98359129c04b96ed755a7d8c98b37Stephen Hines vtxAttrs(0), vtxUniforms(0), fragUniforms(0), 106ebf4a148cda98359129c04b96ed755a7d8c98b37Stephen Hines fragUniformIsSTO(0) { 10754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxAttrCount = numVtxAttr; 108afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numVtxAttr) { 10954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxAttrs = new AttrData[numVtxAttr]; 11054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 111afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numVtxUnis) { 11254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk vtxUniforms = new UniformData[numVtxUnis]; 11354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 114afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (numFragUnis) { 11554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk fragUniforms = new UniformData[numFragUnis]; 116cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams fragUniformIsSTO = new bool[numFragUnis]; 11754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 11854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 11954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ~ProgramEntry() { 120afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vtxAttrs) { 12154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] vtxAttrs; 12244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes vtxAttrs = nullptr; 12354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 124afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (vtxUniforms) { 12554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] vtxUniforms; 12644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes vtxUniforms = nullptr; 12754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 128afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (fragUniforms) { 12954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] fragUniforms; 13044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes fragUniforms = nullptr; 13154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 132cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams if (fragUniformIsSTO) { 133cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams delete[] fragUniformIsSTO; 13444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes fragUniformIsSTO = nullptr; 135cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams } 13654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 137c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t vtx; 138c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t frag; 139c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t program; 140886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk uint32_t vtxAttrCount; 14154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk AttrData *vtxAttrs; 14254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *vtxUniforms; 14354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *fragUniforms; 144cf27eb46f97cff087ebfc5b81fe998eabe0569cfJason Sams bool *fragUniformIsSTO; 14554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk }; 14693d6bc872b7d9fba63abfa7513d56b38d9c3d371Chris Wailes std::vector<ProgramEntry*> mEntries; 14754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk ProgramEntry *mCurrent; 14854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 149a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk bool hasArrayUniforms(RsdShader *vtx, RsdShader *frag); 150a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void populateUniformData(RsdShader *prog, uint32_t linkedID, UniformData *data); 151a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk void updateUniformArrayData(const android::renderscript::Context *rsc, 152a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsdShader *prog, uint32_t linkedID, 15354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformData *data, const char* logTag, 15454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk UniformQueryData **uniformList, uint32_t uniListSize); 155c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}; 156c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 157c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 158a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif //ANDROID_RSD_SHADER_CACHE_H 159