Program.java revision 0de9444aa6c25d2c586e8204a6168d10e67376e0
10011bcf57ff711a221a3a4c73f2a79125111647dJason Sams/* 20011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * Copyright (C) 2008 The Android Open Source Project 30011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * 40011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 50011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * you may not use this file except in compliance with the License. 60011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * You may obtain a copy of the License at 70011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * 80011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * http://www.apache.org/licenses/LICENSE-2.0 90011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * 100011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * Unless required by applicable law or agreed to in writing, software 110011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 120011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * See the License for the specific language governing permissions and 140011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * limitations under the License. 150011bcf57ff711a221a3a4c73f2a79125111647dJason Sams */ 160011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 170011bcf57ff711a221a3a4c73f2a79125111647dJason Samspackage android.renderscript; 180011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 190011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 200011bcf57ff711a221a3a4c73f2a79125111647dJason Samsimport android.util.Config; 210011bcf57ff711a221a3a4c73f2a79125111647dJason Samsimport android.util.Log; 220011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 230011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 240011bcf57ff711a221a3a4c73f2a79125111647dJason Sams/** 250011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * @hide 260011bcf57ff711a221a3a4c73f2a79125111647dJason Sams * 270011bcf57ff711a221a3a4c73f2a79125111647dJason Sams **/ 280011bcf57ff711a221a3a4c73f2a79125111647dJason Samspublic class Program extends BaseObj { 290011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static final int MAX_INPUT = 8; 300011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static final int MAX_OUTPUT = 8; 310011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static final int MAX_CONSTANT = 8; 327e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams public static final int MAX_TEXTURE = 8; 330011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 340011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mInputs[]; 350011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mOutputs[]; 360011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Type mConstants[]; 377e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams int mTextureCount; 380011bcf57ff711a221a3a4c73f2a79125111647dJason Sams String mShader; 390011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 400011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Program(int id, RenderScript rs) { 410de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 420011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 430011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 440011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public void bindConstants(Allocation a, int slot) { 450011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mRS.nProgramBindConstants(mID, slot, a.mID); 460011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 470011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 4868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public void bindTexture(Allocation va, int slot) 4968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throws IllegalArgumentException { 5068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.validate(); 5168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams if((slot < 0) || (slot >= mTextureCount)) { 5268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throw new IllegalArgumentException("Slot ID out of range."); 5368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 5468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 5568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.nProgramBindTexture(mID, slot, va.mID); 5668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 5768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 5868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public void bindSampler(Sampler vs, int slot) 5968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throws IllegalArgumentException { 6068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.validate(); 6168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams if((slot < 0) || (slot >= mTextureCount)) { 6268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throw new IllegalArgumentException("Slot ID out of range."); 6368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 6468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 6568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.nProgramBindSampler(mID, slot, vs.mID); 6668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 6768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 6868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 690011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static class BaseProgramBuilder { 700011bcf57ff711a221a3a4c73f2a79125111647dJason Sams RenderScript mRS; 710011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mInputs[]; 720011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mOutputs[]; 730011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Type mConstants[]; 740011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Type mTextures[]; 750011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mInputCount; 760011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mOutputCount; 770011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mConstantCount; 780011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mTextureCount; 790011bcf57ff711a221a3a4c73f2a79125111647dJason Sams String mShader; 800011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 810011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 820011bcf57ff711a221a3a4c73f2a79125111647dJason Sams protected BaseProgramBuilder(RenderScript rs) { 830011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mRS = rs; 840011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mInputs = new Element[MAX_INPUT]; 850011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mOutputs = new Element[MAX_OUTPUT]; 860011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mConstants = new Type[MAX_CONSTANT]; 870011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mInputCount = 0; 880011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mOutputCount = 0; 890011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mConstantCount = 0; 907e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams mTextureCount = 0; 910011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 920011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 93288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma public BaseProgramBuilder setShader(String s) { 940011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mShader = s; 95288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma return this; 960011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 970011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 980011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public void addInput(Element e) throws IllegalStateException { 990011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1000011bcf57ff711a221a3a4c73f2a79125111647dJason Sams if(mInputCount >= MAX_INPUT) { 1010011bcf57ff711a221a3a4c73f2a79125111647dJason Sams throw new IllegalArgumentException("Max input count exceeded."); 1020011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1030011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mInputs[mInputCount++] = e; 1040011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1050011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1060011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public void addOutput(Element e) throws IllegalStateException { 1070011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1080011bcf57ff711a221a3a4c73f2a79125111647dJason Sams if(mOutputCount >= MAX_OUTPUT) { 1090011bcf57ff711a221a3a4c73f2a79125111647dJason Sams throw new IllegalArgumentException("Max output count exceeded."); 1100011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1110011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mOutputs[mOutputCount++] = e; 1120011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1130011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 114ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams public int addConstant(Type t) throws IllegalStateException { 1150011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1160011bcf57ff711a221a3a4c73f2a79125111647dJason Sams if(mConstantCount >= MAX_CONSTANT) { 1170011bcf57ff711a221a3a4c73f2a79125111647dJason Sams throw new IllegalArgumentException("Max input count exceeded."); 1180011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 119ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams mConstants[mConstantCount] = t; 120ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams return mConstantCount++; 1210011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1220011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 123288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma public BaseProgramBuilder setTextureCount(int count) throws IllegalArgumentException { 1240011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1257e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams if(count >= MAX_CONSTANT) { 1267e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams throw new IllegalArgumentException("Max texture count exceeded."); 1270011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1287e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams mTextureCount = count; 129288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma return this; 1300011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1310011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1320011bcf57ff711a221a3a4c73f2a79125111647dJason Sams protected void initProgram(Program p) { 1330011bcf57ff711a221a3a4c73f2a79125111647dJason Sams p.mInputs = new Element[mInputCount]; 1340011bcf57ff711a221a3a4c73f2a79125111647dJason Sams System.arraycopy(mInputs, 0, p.mInputs, 0, mInputCount); 1350011bcf57ff711a221a3a4c73f2a79125111647dJason Sams p.mOutputs = new Element[mOutputCount]; 1360011bcf57ff711a221a3a4c73f2a79125111647dJason Sams System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount); 1370011bcf57ff711a221a3a4c73f2a79125111647dJason Sams p.mConstants = new Type[mConstantCount]; 1380011bcf57ff711a221a3a4c73f2a79125111647dJason Sams System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount); 1397e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams p.mTextureCount = mTextureCount; 1400011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1410011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1420011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1430011bcf57ff711a221a3a4c73f2a79125111647dJason Sams} 1440011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1450011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 146