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