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