1ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams/*
2ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Copyright (C) 2012 The Android Open Source Project
3ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams *
4ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * you may not use this file except in compliance with the License.
6ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * You may obtain a copy of the License at
7ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams *
8ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams *
10ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Unless required by applicable law or agreed to in writing, software
11ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * See the License for the specific language governing permissions and
14ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * limitations under the License.
15ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */
16ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
17ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#ifndef ANDROID_RS_SCRIPT_GROUP_H
18ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#define ANDROID_RS_SCRIPT_GROUP_H
19ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
20ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include "rsAllocation.h"
21ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#include "rsScript.h"
22ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
23ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
24ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams// ---------------------------------------------------------------------------
25ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsnamespace android {
26ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsnamespace renderscript {
27ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
28ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsclass ProgramVertex;
29ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsclass ProgramFragment;
30ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsclass ProgramRaster;
31ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsclass ProgramStore;
32ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
33ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsclass ScriptGroup : public ObjectBase {
34ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samspublic:
35ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Vector<ObjectBaseRef<ScriptKernelID> > mKernels;
36ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
37ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    class Link {
38ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    public:
39ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        ObjectBaseRef<const ScriptKernelID> mSource;
40ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        ObjectBaseRef<const ScriptKernelID> mDstKernel;
41ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        ObjectBaseRef<const ScriptFieldID> mDstField;
42ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        ObjectBaseRef<const Type> mType;
43ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        ObjectBaseRef<Allocation> mAlloc;
44ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        Link();
45ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        ~Link();
46ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    };
47ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
48ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    class Node {
49ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    public:
50ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        Node(Script *);
51ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
52ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        Vector<const ScriptKernelID *> mKernels;
53ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        Vector<Link *> mOutputs;
54ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        Vector<Link *> mInputs;
55ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        bool mSeen;
56ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        int mOrder;
57ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        Script *mScript;
58ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    };
59ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
60ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    class IO {
61ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    public:
62ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        IO(const ScriptKernelID *);
63ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
64ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        const ScriptKernelID *mKernel;
65ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        ObjectBaseRef<Allocation> mAlloc;
66ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    };
67ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
68ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Vector<Link *> mLinks;
69ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Vector<Node *> mNodes;
70ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Vector<IO *> mInputs;
71ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Vector<IO *> mOutputs;
72ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
73ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    struct Hal {
74ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        void * drv;
75ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
76ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        struct DriverInfo {
77ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        };
78ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        DriverInfo info;
79ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    };
80ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Hal mHal;
81ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
82ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    static ScriptGroup * create(Context *rsc,
83ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                           ScriptKernelID ** kernels, size_t kernelsSize,
84ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                           ScriptKernelID ** src, size_t srcSize,
85ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                           ScriptKernelID ** dstK, size_t dstKSize,
86ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                           ScriptFieldID ** dstF, size_t dstFSize,
87ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams                           const Type ** type, size_t typeSize);
88ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
89ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    virtual void serialize(Context *rsc, OStream *stream) const;
90ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    virtual RsA3DClassID getClassId() const;
91ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
92ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    void execute(Context *rsc);
93ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    void setInput(Context *rsc, ScriptKernelID *kid, Allocation *a);
94ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    void setOutput(Context *rsc, ScriptKernelID *kid, Allocation *a);
95ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
96ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
97ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsprotected:
98ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    virtual ~ScriptGroup();
99ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    bool mInitialized;
100ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
101ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
102ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsprivate:
103ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    bool calcOrderRecurse(Node *n, int depth);
104ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    bool calcOrder();
105ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    Node * findNode(Script *s) const;
106ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
107ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    ScriptGroup(Context *);
108ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams};
109ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
110ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
111ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams}
112ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams}
113ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams#endif
114ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
115