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