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
20dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsAllocation.h"
21dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsScript.h"
22dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
23dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
24dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams// ---------------------------------------------------------------------------
25dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsnamespace android {
26dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsnamespace renderscript {
27dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
28dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ProgramVertex;
29dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ProgramFragment;
30dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ProgramRaster;
31dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ProgramStore;
32dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
33dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsclass ScriptGroup : public ObjectBase {
34dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samspublic:
35dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Vector<ObjectBaseRef<ScriptKernelID> > mKernels;
36dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
37dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    class Link {
38dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    public:
39dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<const ScriptKernelID> mSource;
40dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<const ScriptKernelID> mDstKernel;
41dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<const ScriptFieldID> mDstField;
42dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<const Type> mType;
43dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<Allocation> mAlloc;
44dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        Link();
45dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ~Link();
46dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    };
47dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
48dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    class Node {
49dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    public:
50dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        Node(Script *);
51dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
52dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        Vector<const ScriptKernelID *> mKernels;
53dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        Vector<Link *> mOutputs;
54dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        Vector<Link *> mInputs;
55dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        bool mSeen;
56dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        int mOrder;
57dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        Script *mScript;
58dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    };
59dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
60dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    class IO {
61dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    public:
62dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        IO(const ScriptKernelID *);
63dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
64dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        const ScriptKernelID *mKernel;
65dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        ObjectBaseRef<Allocation> mAlloc;
66dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    };
67dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
68dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Vector<Link *> mLinks;
69dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Vector<Node *> mNodes;
70dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Vector<IO *> mInputs;
71dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Vector<IO *> mOutputs;
72dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
73dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    struct Hal {
74dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        void * drv;
75dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
76dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        struct DriverInfo {
77dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        };
78dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        DriverInfo info;
79dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    };
80dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Hal mHal;
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    virtual void serialize(Context *rsc, OStream *stream) const;
90dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    virtual RsA3DClassID getClassId() const;
91dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
92dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    void execute(Context *rsc);
93dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    void setInput(Context *rsc, ScriptKernelID *kid, Allocation *a);
94dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    void setOutput(Context *rsc, ScriptKernelID *kid, Allocation *a);
95dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
96dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
97dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsprotected:
98dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    virtual ~ScriptGroup();
99dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    bool mInitialized;
100dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
101dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
102dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsprivate:
103dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    bool calcOrderRecurse(Node *n, int depth);
104dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    bool calcOrder();
105dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Node * findNode(Script *s) const;
10699192979b3ef356998a438f5bd2e45fede6b457fYang Ni    // Check if input/output Allocations are correctly set for a ScriptGroup.
10799192979b3ef356998a438f5bd2e45fede6b457fYang Ni    // Send any error back to the client (app). Called before the ScriptGroup
10899192979b3ef356998a438f5bd2e45fede6b457fYang Ni    // executes. Skips the exeuction if validation fails.
10999192979b3ef356998a438f5bd2e45fede6b457fYang Ni    bool validateInputAndOutput(Context *);
110dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
111dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    ScriptGroup(Context *);
112dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams};
113dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
114dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
115dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
116dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
117dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#endif
118dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
119