198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/* 298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2012 The Android Open Source Project 398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License. 698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at 798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software 1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and 1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License. 1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript; 1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.reflect.Method; 20ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsimport java.util.ArrayList; 2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/** 237d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * ScriptGroup creates a group of kernels that are executed 247d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * together with one execution call as if they were a single kernel. 257d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * The kernels may be connected internally or to an external allocation. 267d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * The intermediate results for internal connections are not observable 277d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * after the execution of the script. 28ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * <p> 297d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * External connections are grouped into inputs and outputs. 30ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * All outputs are produced by a script kernel and placed into a 317d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * user-supplied allocation. Inputs provide the input of a kernel. 327d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Inputs bound to script globals are set directly upon the script. 331b370e358d16cc3b50b169511d6b387db09f972dJason Sams * <p> 341b370e358d16cc3b50b169511d6b387db09f972dJason Sams * A ScriptGroup must contain at least one kernel. A ScriptGroup 351b370e358d16cc3b50b169511d6b387db09f972dJason Sams * must contain only a single directed acyclic graph (DAG) of 361b370e358d16cc3b50b169511d6b387db09f972dJason Sams * script kernels and connections. Attempting to create a 371b370e358d16cc3b50b169511d6b387db09f972dJason Sams * ScriptGroup with multiple DAGs or attempting to create 381b370e358d16cc3b50b169511d6b387db09f972dJason Sams * a cycle within a ScriptGroup will throw an exception. 397d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * <p> 407d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Currently, all kernels in a ScriptGroup must be from separate 417d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Script objects. Attempting to use multiple kernels from the same 4260c5b31f4448410221de043873b94797732afa66Stephen Hines * Script object will result in an 4360c5b31f4448410221de043873b94797732afa66Stephen Hines * {@link android.support.v8.renderscript.RSInvalidStateException}. 44ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/ 46ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murraypublic class ScriptGroup extends BaseObj { 4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams IO mOutputs[]; 4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams IO mInputs[]; 4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams static class IO { 51ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Script.KernelID mKID; 5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Allocation mAllocation; 5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 54ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams IO(Script.KernelID s) { 55ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mKID = s; 5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 59ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams static class ConnectLine { 60ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ConnectLine(Type t, Script.KernelID from, Script.KernelID to) { 61ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mFrom = from; 62ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mToK = to; 6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mAllocationType = t; 6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 66ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ConnectLine(Type t, Script.KernelID from, Script.FieldID to) { 67ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mFrom = from; 68ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mToF = to; 69ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mAllocationType = t; 7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 71ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 72ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Script.FieldID mToF; 73ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Script.KernelID mToK; 74ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Script.KernelID mFrom; 75ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Type mAllocationType; 7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams static class Node { 7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Script mScript; 80ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ArrayList<Script.KernelID> mKernels = new ArrayList<Script.KernelID>(); 81ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ArrayList<ConnectLine> mInputs = new ArrayList<ConnectLine>(); 82ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ArrayList<ConnectLine> mOutputs = new ArrayList<ConnectLine>(); 831b370e358d16cc3b50b169511d6b387db09f972dJason Sams int dagNumber; 8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Node mNext; 8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Node(Script s) { 8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mScript = s; 8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams ScriptGroup(int id, RenderScript rs) { 9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams super(id, rs); 9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 97ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 98ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Sets an input of the ScriptGroup. This specifies an 997d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Allocation to be used for kernels that require an input 1007d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Allocation provided from outside of the ScriptGroup. 101ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 102ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param s The ID of the kernel where the allocation should be 103ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * connected. 104ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param a The allocation to connect. 105ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 106ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setInput(Script.KernelID s, Allocation a) { 10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams for (int ct=0; ct < mInputs.length; ct++) { 108ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (mInputs[ct].mKID == s) { 10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mInputs[ct].mAllocation = a; 110ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mRS.nScriptGroupSetInput(getID(mRS), s.getID(mRS), mRS.safeID(a)); 11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return; 11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSIllegalArgumentException("Script not found"); 11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 117ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 118ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Sets an output of the ScriptGroup. This specifies an 1197d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Allocation to be used for the kernels that require an output 1207d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Allocation visible after the ScriptGroup is executed. 121ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 122ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param s The ID of the kernel where the allocation should be 123ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * connected. 124ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param a The allocation to connect. 125ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 126ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setOutput(Script.KernelID s, Allocation a) { 12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams for (int ct=0; ct < mOutputs.length; ct++) { 128ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (mOutputs[ct].mKID == s) { 12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mOutputs[ct].mAllocation = a; 130ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mRS.nScriptGroupSetOutput(getID(mRS), s.getID(mRS), mRS.safeID(a)); 13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return; 13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSIllegalArgumentException("Script not found"); 13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 137ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 138ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Execute the ScriptGroup. This will run all the kernels in 1397d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * the ScriptGroup. No internal connection results will be visible 1407d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * after execution of the ScriptGroup. 141ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public void execute() { 143ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mRS.nScriptGroupExecute(getID(mRS)); 14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 147ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 1487d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Helper class to build a ScriptGroup. A ScriptGroup is 1497d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * created in two steps. 1507d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * <p> 1517d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * First, all kernels to be used by the ScriptGroup should be added. 152ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * <p> 1537d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Second, add connections between kernels. There are two types 1547d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * of connections: kernel to kernel and kernel to field. 1557d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Kernel to kernel allows a kernel's output to be passed to 1567d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * another kernel as input. Kernel to field allows the output of 1577d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * one kernel to be bound as a script global. Kernel to kernel is 1587d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * higher performance and should be used where possible. 159ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * <p> 1607d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * A ScriptGroup must contain a single directed acyclic graph (DAG); it 1617d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * cannot contain cycles. Currently, all kernels used in a ScriptGroup 1627d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * must come from different Script objects. Additionally, all kernels 1637d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * in a ScriptGroup must have at least one input, output, or internal 1647d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * connection. 165ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * <p> 1667d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Once all connections are made, a call to {@link #create} will 167ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * return the ScriptGroup object. 168ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 169ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 170ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public static final class Builder { 171ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private RenderScript mRS; 172ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private ArrayList<Node> mNodes = new ArrayList<Node>(); 173ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private ArrayList<ConnectLine> mLines = new ArrayList<ConnectLine>(); 174ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private int mKernelCount; 175ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 176ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray private ScriptGroupThunker.Builder mT; 177ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 178ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 1797d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Create a Builder for generating a ScriptGroup. 180ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 181ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 1827d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * @param rs The RenderScript context. 183ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 18498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public Builder(RenderScript rs) { 185ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (rs.isNative) { 186ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mT = new ScriptGroupThunker.Builder(rs); 187ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 18898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mRS = rs; 18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 1911b370e358d16cc3b50b169511d6b387db09f972dJason Sams // do a DFS from original node, looking for original node 1921b370e358d16cc3b50b169511d6b387db09f972dJason Sams // any cycle that could be created must contain original node 1931b370e358d16cc3b50b169511d6b387db09f972dJason Sams private void validateCycle(Node target, Node original) { 1941b370e358d16cc3b50b169511d6b387db09f972dJason Sams for (int ct = 0; ct < target.mOutputs.size(); ct++) { 1951b370e358d16cc3b50b169511d6b387db09f972dJason Sams final ConnectLine cl = target.mOutputs.get(ct); 196ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (cl.mToK != null) { 197ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node tn = findNode(cl.mToK.mScript); 1981b370e358d16cc3b50b169511d6b387db09f972dJason Sams if (tn.equals(original)) { 199ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSInvalidStateException("Loops in group not allowed."); 200ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 2011b370e358d16cc3b50b169511d6b387db09f972dJason Sams validateCycle(tn, original); 202ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 203ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (cl.mToF != null) { 204ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node tn = findNode(cl.mToF.mScript); 2051b370e358d16cc3b50b169511d6b387db09f972dJason Sams if (tn.equals(original)) { 20698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSInvalidStateException("Loops in group not allowed."); 20798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 2081b370e358d16cc3b50b169511d6b387db09f972dJason Sams validateCycle(tn, original); 20998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 21098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 21198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 21298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 2131b370e358d16cc3b50b169511d6b387db09f972dJason Sams private void mergeDAGs(int valueUsed, int valueKilled) { 214ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct=0; ct < mNodes.size(); ct++) { 2151b370e358d16cc3b50b169511d6b387db09f972dJason Sams if (mNodes.get(ct).dagNumber == valueKilled) 2161b370e358d16cc3b50b169511d6b387db09f972dJason Sams mNodes.get(ct).dagNumber = valueUsed; 2171b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 2181b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 2191b370e358d16cc3b50b169511d6b387db09f972dJason Sams 2201b370e358d16cc3b50b169511d6b387db09f972dJason Sams private void validateDAGRecurse(Node n, int dagNumber) { 2211b370e358d16cc3b50b169511d6b387db09f972dJason Sams // combine DAGs if this node has been seen already 2221b370e358d16cc3b50b169511d6b387db09f972dJason Sams if (n.dagNumber != 0 && n.dagNumber != dagNumber) { 2231b370e358d16cc3b50b169511d6b387db09f972dJason Sams mergeDAGs(n.dagNumber, dagNumber); 2241b370e358d16cc3b50b169511d6b387db09f972dJason Sams return; 2251b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 2261b370e358d16cc3b50b169511d6b387db09f972dJason Sams 2271b370e358d16cc3b50b169511d6b387db09f972dJason Sams n.dagNumber = dagNumber; 2281b370e358d16cc3b50b169511d6b387db09f972dJason Sams for (int ct=0; ct < n.mOutputs.size(); ct++) { 2291b370e358d16cc3b50b169511d6b387db09f972dJason Sams final ConnectLine cl = n.mOutputs.get(ct); 2301b370e358d16cc3b50b169511d6b387db09f972dJason Sams if (cl.mToK != null) { 2311b370e358d16cc3b50b169511d6b387db09f972dJason Sams Node tn = findNode(cl.mToK.mScript); 2321b370e358d16cc3b50b169511d6b387db09f972dJason Sams validateDAGRecurse(tn, dagNumber); 2331b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 2341b370e358d16cc3b50b169511d6b387db09f972dJason Sams if (cl.mToF != null) { 2351b370e358d16cc3b50b169511d6b387db09f972dJason Sams Node tn = findNode(cl.mToF.mScript); 2361b370e358d16cc3b50b169511d6b387db09f972dJason Sams validateDAGRecurse(tn, dagNumber); 237ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 2381b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 2391b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 2401b370e358d16cc3b50b169511d6b387db09f972dJason Sams 2411b370e358d16cc3b50b169511d6b387db09f972dJason Sams private void validateDAG() { 2421b370e358d16cc3b50b169511d6b387db09f972dJason Sams for (int ct=0; ct < mNodes.size(); ct++) { 243ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node n = mNodes.get(ct); 244ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (n.mInputs.size() == 0) { 2451b370e358d16cc3b50b169511d6b387db09f972dJason Sams if (n.mOutputs.size() == 0 && mNodes.size() > 1) { 2461b370e358d16cc3b50b169511d6b387db09f972dJason Sams throw new RSInvalidStateException("Groups cannot contain unconnected scripts"); 2471b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 2481b370e358d16cc3b50b169511d6b387db09f972dJason Sams validateDAGRecurse(n, ct+1); 2491b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 2501b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 2511b370e358d16cc3b50b169511d6b387db09f972dJason Sams int dagNumber = mNodes.get(0).dagNumber; 2521b370e358d16cc3b50b169511d6b387db09f972dJason Sams for (int ct=0; ct < mNodes.size(); ct++) { 2531b370e358d16cc3b50b169511d6b387db09f972dJason Sams if (mNodes.get(ct).dagNumber != dagNumber) { 2541b370e358d16cc3b50b169511d6b387db09f972dJason Sams throw new RSInvalidStateException("Multiple DAGs in group not allowed."); 25598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 25698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 25798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 25898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 259ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private Node findNode(Script s) { 260ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct=0; ct < mNodes.size(); ct++) { 261ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (s == mNodes.get(ct).mScript) { 262ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams return mNodes.get(ct); 26398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 26498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 26598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return null; 26698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 26798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 268ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private Node findNode(Script.KernelID k) { 269ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct=0; ct < mNodes.size(); ct++) { 270ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node n = mNodes.get(ct); 271ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct2=0; ct2 < n.mKernels.size(); ct2++) { 272ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (k == n.mKernels.get(ct2)) { 273ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams return n; 27498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 27598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 27698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 277ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams return null; 278ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 279ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 280ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 281ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Adds a Kernel to the group. 282ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 283ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 284ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param k The kernel to add. 285ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 286ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @return Builder Returns this. 287ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 288ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public Builder addKernel(Script.KernelID k) { 289ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (mT != null) { 290ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mT.addKernel(k); 291ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return this; 292ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 293ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 294ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (mLines.size() != 0) { 295ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSInvalidStateException( 296ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams "Kernels may not be added once connections exist."); 297ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 298ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 299ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams //android.util.Log.v("RSR", "addKernel 1 k=" + k); 300ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (findNode(k) != null) { 301ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams return this; 302ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 303ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams //android.util.Log.v("RSR", "addKernel 2 "); 304ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mKernelCount++; 305ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node n = findNode(k.mScript); 306ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (n == null) { 307ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams //android.util.Log.v("RSR", "addKernel 3 "); 308ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams n = new Node(k.mScript); 309ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mNodes.add(n); 310ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 311ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams n.mKernels.add(k); 312ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams return this; 313ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 314ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 315ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 316ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Adds a connection to the group. 317ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 318ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 319ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param t The type of the connection. This is used to 320ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * determine the kernel launch sizes on the source side 321ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * of this connection. 322ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param from The source for the connection. 323ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param to The destination of the connection. 324ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 325ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @return Builder Returns this 326ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 327ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public Builder addConnection(Type t, Script.KernelID from, Script.FieldID to) { 328ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams //android.util.Log.v("RSR", "addConnection " + t +", " + from + ", " + to); 329ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 330ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (mT != null) { 331ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mT.addConnection(t, from, to); 332ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return this; 333ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 334ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 335ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node nf = findNode(from); 336ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (nf == null) { 3371b370e358d16cc3b50b169511d6b387db09f972dJason Sams throw new RSInvalidStateException("From script not found."); 338ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 339ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 340ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node nt = findNode(to.mScript); 341ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (nt == null) { 342ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSInvalidStateException("To script not found."); 34398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 344ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 345ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ConnectLine cl = new ConnectLine(t, from, to); 346ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mLines.add(new ConnectLine(t, from, to)); 347ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 348ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams nf.mOutputs.add(cl); 349ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams nt.mInputs.add(cl); 35098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 3511b370e358d16cc3b50b169511d6b387db09f972dJason Sams validateCycle(nf, nf); 35298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return this; 35398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 35498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 355ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 356ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Adds a connection to the group. 357ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 358ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 359ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param t The type of the connection. This is used to 360ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * determine the kernel launch sizes for both sides of 361ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * this connection. 362ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param from The source for the connection. 363ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param to The destination of the connection. 364ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 365ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @return Builder Returns this 366ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 367ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public Builder addConnection(Type t, Script.KernelID from, Script.KernelID to) { 368ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams //android.util.Log.v("RSR", "addConnection " + t +", " + from + ", " + to); 369ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 370ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (mT != null) { 371ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mT.addConnection(t, from, to); 372ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return this; 373ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 374ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 375ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node nf = findNode(from); 376ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (nf == null) { 3771b370e358d16cc3b50b169511d6b387db09f972dJason Sams throw new RSInvalidStateException("From script not found."); 378ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 379ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 380ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node nt = findNode(to); 381ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (nt == null) { 382ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSInvalidStateException("To script not found."); 383ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 384ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 385ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ConnectLine cl = new ConnectLine(t, from, to); 386ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mLines.add(new ConnectLine(t, from, to)); 387ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 388ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams nf.mOutputs.add(cl); 389ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams nt.mInputs.add(cl); 390ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 3911b370e358d16cc3b50b169511d6b387db09f972dJason Sams validateCycle(nf, nf); 392ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams return this; 393ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 394ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 395ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 396ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 397ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 398ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Creates the Script group. 399ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 400ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 401ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @return ScriptGroup The new ScriptGroup 402ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 40398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public ScriptGroup create() { 4041b370e358d16cc3b50b169511d6b387db09f972dJason Sams 405ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (mT != null) { 406ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return mT.create(); 407ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 408ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 4091b370e358d16cc3b50b169511d6b387db09f972dJason Sams if (mNodes.size() == 0) { 4101b370e358d16cc3b50b169511d6b387db09f972dJason Sams throw new RSInvalidStateException("Empty script groups are not allowed"); 4111b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 4121b370e358d16cc3b50b169511d6b387db09f972dJason Sams 4131b370e358d16cc3b50b169511d6b387db09f972dJason Sams // reset DAG numbers in case we're building a second group 4141b370e358d16cc3b50b169511d6b387db09f972dJason Sams for (int ct=0; ct < mNodes.size(); ct++) { 4151b370e358d16cc3b50b169511d6b387db09f972dJason Sams mNodes.get(ct).dagNumber = 0; 4161b370e358d16cc3b50b169511d6b387db09f972dJason Sams } 4171b370e358d16cc3b50b169511d6b387db09f972dJason Sams validateDAG(); 4181b370e358d16cc3b50b169511d6b387db09f972dJason Sams 419ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ArrayList<IO> inputs = new ArrayList<IO>(); 420ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ArrayList<IO> outputs = new ArrayList<IO>(); 421ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 422ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams int[] kernels = new int[mKernelCount]; 423ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams int idx = 0; 424ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct=0; ct < mNodes.size(); ct++) { 425ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams Node n = mNodes.get(ct); 426ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct2=0; ct2 < n.mKernels.size(); ct2++) { 427ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams final Script.KernelID kid = n.mKernels.get(ct2); 428ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams kernels[idx++] = kid.getID(mRS); 429ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 430ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams boolean hasInput = false; 431ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams boolean hasOutput = false; 432ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct3=0; ct3 < n.mInputs.size(); ct3++) { 433ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (n.mInputs.get(ct3).mToK == kid) { 434ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams hasInput = true; 435ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 436ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 437ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct3=0; ct3 < n.mOutputs.size(); ct3++) { 438ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (n.mOutputs.get(ct3).mFrom == kid) { 439ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams hasOutput = true; 440ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 441ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 442ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (!hasInput) { 443ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams inputs.add(new IO(kid)); 444ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 445ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (!hasOutput) { 446ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams outputs.add(new IO(kid)); 447ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 44898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 449ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 450ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 451ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (idx != mKernelCount) { 452ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSRuntimeException("Count mismatch, should not happen."); 453ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 454ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 455ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams int[] src = new int[mLines.size()]; 456ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams int[] dstk = new int[mLines.size()]; 457ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams int[] dstf = new int[mLines.size()]; 458ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams int[] types = new int[mLines.size()]; 459ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 460ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct=0; ct < mLines.size(); ct++) { 461ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ConnectLine cl = mLines.get(ct); 462ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams src[ct] = cl.mFrom.getID(mRS); 463ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (cl.mToK != null) { 464ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams dstk[ct] = cl.mToK.getID(mRS); 465ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 466ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (cl.mToF != null) { 467ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams dstf[ct] = cl.mToF.getID(mRS); 468ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 469ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams types[ct] = cl.mAllocationType.getID(mRS); 470ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 471ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 472ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams int id = mRS.nScriptGroupCreate(kernels, src, dstk, dstf, types); 473ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (id == 0) { 474ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSRuntimeException("Object creation error, should not happen."); 475ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 476ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 477ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams ScriptGroup sg = new ScriptGroup(id, mRS); 478ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams sg.mOutputs = new IO[outputs.size()]; 479ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct=0; ct < outputs.size(); ct++) { 480ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams sg.mOutputs[ct] = outputs.get(ct); 481ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 482ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 483ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams sg.mInputs = new IO[inputs.size()]; 484ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams for (int ct=0; ct < inputs.size(); ct++) { 485ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams sg.mInputs[ct] = inputs.get(ct); 486ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 48798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 48898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return sg; 48998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 49098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 49198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 49298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 49398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 49498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams} 49598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 49698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 497