1dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams/*
2dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * Copyright (C) 2012 The Android Open Source Project
3dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams *
4dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * you may not use this file except in compliance with the License.
6dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * You may obtain a copy of the License at
7dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams *
8dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams *
10dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * Unless required by applicable law or agreed to in writing, software
11dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * See the License for the specific language governing permissions and
14dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams * limitations under the License.
15dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams */
16dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
17dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#ifndef ANDROID_RS_SCRIPT_GROUP_H
18dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#define ANDROID_RS_SCRIPT_GROUP_H
19dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
201ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "rsScriptGroupBase.h"
21dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
221ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include <vector>
23dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
24dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams// ---------------------------------------------------------------------------
25dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsnamespace android {
26dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsnamespace renderscript {
27dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
281ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Allocation;
291ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Context;
30dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ProgramVertex;
31dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ProgramFragment;
32dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ProgramRaster;
33dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ProgramStore;
341ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Script;
351ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass ScriptFieldID;
361ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass ScriptKernelID;
371ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Type;
38dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
391ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass ScriptGroup : public ScriptGroupBase {
40dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samspublic:
411ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni    virtual SG_API_Version getApiVersion() const { return SG_V1; }
421ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni    virtual void execute(Context *rsc);
431ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
44b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    Vector<ObjectBaseRef<ScriptKernelID> > mKernels;
45dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
46dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    class Link {
47dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    public:
48dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<const ScriptKernelID> mSource;
49dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<const ScriptKernelID> mDstKernel;
50dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<const ScriptFieldID> mDstField;
51dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<const Type> mType;
52dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<Allocation> mAlloc;
53dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        Link();
54dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ~Link();
55dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    };
56dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
57dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    class Node {
58dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    public:
59dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        Node(Script *);
60dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
61b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni        Vector<const ScriptKernelID *> mKernels;
62b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni        Vector<Link *> mOutputs;
63b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni        Vector<Link *> mInputs;
64dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        bool mSeen;
65dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        int mOrder;
66dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        Script *mScript;
67dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    };
68dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
69dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    class IO {
70dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    public:
71dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        IO(const ScriptKernelID *);
72dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
73dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        const ScriptKernelID *mKernel;
74dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<Allocation> mAlloc;
75dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    };
76dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
77b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    Vector<Link *> mLinks;
78b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    Vector<Node *> mNodes;
79b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    Vector<IO *> mInputs;
80b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni    Vector<IO *> mOutputs;
81dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
82dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    static ScriptGroup * create(Context *rsc,
83dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                           ScriptKernelID ** kernels, size_t kernelsSize,
84dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                           ScriptKernelID ** src, size_t srcSize,
85dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                           ScriptKernelID ** dstK, size_t dstKSize,
86dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                           ScriptFieldID ** dstF, size_t dstFSize,
87dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                           const Type ** type, size_t typeSize);
88dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
89dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    void setInput(Context *rsc, ScriptKernelID *kid, Allocation *a);
90dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    void setOutput(Context *rsc, ScriptKernelID *kid, Allocation *a);
91dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
92dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsprotected:
93dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    virtual ~ScriptGroup();
94dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    bool mInitialized;
95dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
96dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
97dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsprivate:
98dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    bool calcOrderRecurse(Node *n, int depth);
99dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    bool calcOrder();
100dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Node * findNode(Script *s) const;
1015f6f16fe612e1c30732becc66205500994889ac9Yang Ni    // Check if input/output Allocations are correctly set for a ScriptGroup.
1025f6f16fe612e1c30732becc66205500994889ac9Yang Ni    // Send any error back to the client (app). Called before the ScriptGroup
1035f6f16fe612e1c30732becc66205500994889ac9Yang Ni    // executes. Skips the exeuction if validation fails.
1045f6f16fe612e1c30732becc66205500994889ac9Yang Ni    bool validateInputAndOutput(Context *);
105dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
106dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    ScriptGroup(Context *);
107dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams};
108dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
109dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
110dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
111dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
112dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#endif
113b8353c5943f4038fd7f08db3d958390ce9418798Yang Ni
114