Program.java revision 288c8711a64893acb3f4a31caf69153be9809d17
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) { 410011bcf57ff711a221a3a4c73f2a79125111647dJason Sams super(rs); 420011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mID = id; 430011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 440011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 450011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public void bindConstants(Allocation a, int slot) { 460011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mRS.nProgramBindConstants(mID, slot, a.mID); 470011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 480011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 4968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public void bindTexture(Allocation va, int slot) 5068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throws IllegalArgumentException { 5168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.validate(); 5268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams if((slot < 0) || (slot >= mTextureCount)) { 5368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throw new IllegalArgumentException("Slot ID out of range."); 5468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 5568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 5668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.nProgramBindTexture(mID, slot, va.mID); 5768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 5868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 5968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public void bindSampler(Sampler vs, int slot) 6068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throws IllegalArgumentException { 6168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.validate(); 6268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams if((slot < 0) || (slot >= mTextureCount)) { 6368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throw new IllegalArgumentException("Slot ID out of range."); 6468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 6568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 6668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS.nProgramBindSampler(mID, slot, vs.mID); 6768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 6868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 6968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams 700011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static class BaseProgramBuilder { 710011bcf57ff711a221a3a4c73f2a79125111647dJason Sams RenderScript mRS; 720011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mInputs[]; 730011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Element mOutputs[]; 740011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Type mConstants[]; 750011bcf57ff711a221a3a4c73f2a79125111647dJason Sams Type mTextures[]; 760011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mInputCount; 770011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mOutputCount; 780011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mConstantCount; 790011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int mTextureCount; 800011bcf57ff711a221a3a4c73f2a79125111647dJason Sams String mShader; 810011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 820011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 830011bcf57ff711a221a3a4c73f2a79125111647dJason Sams protected BaseProgramBuilder(RenderScript rs) { 840011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mRS = rs; 850011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mInputs = new Element[MAX_INPUT]; 860011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mOutputs = new Element[MAX_OUTPUT]; 870011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mConstants = new Type[MAX_CONSTANT]; 880011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mInputCount = 0; 890011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mOutputCount = 0; 900011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mConstantCount = 0; 917e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams mTextureCount = 0; 920011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 930011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 94288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma public BaseProgramBuilder setShader(String s) { 950011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mShader = s; 96288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma return this; 970011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 980011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 990011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public void addInput(Element e) throws IllegalStateException { 1000011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1010011bcf57ff711a221a3a4c73f2a79125111647dJason Sams if(mInputCount >= MAX_INPUT) { 1020011bcf57ff711a221a3a4c73f2a79125111647dJason Sams throw new IllegalArgumentException("Max input count exceeded."); 1030011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1040011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mInputs[mInputCount++] = e; 1050011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1060011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1070011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public void addOutput(Element e) throws IllegalStateException { 1080011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1090011bcf57ff711a221a3a4c73f2a79125111647dJason Sams if(mOutputCount >= MAX_OUTPUT) { 1100011bcf57ff711a221a3a4c73f2a79125111647dJason Sams throw new IllegalArgumentException("Max output count exceeded."); 1110011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1120011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mOutputs[mOutputCount++] = e; 1130011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1140011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 115ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams public int addConstant(Type t) throws IllegalStateException { 1160011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1170011bcf57ff711a221a3a4c73f2a79125111647dJason Sams if(mConstantCount >= MAX_CONSTANT) { 1180011bcf57ff711a221a3a4c73f2a79125111647dJason Sams throw new IllegalArgumentException("Max input count exceeded."); 1190011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 120ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams mConstants[mConstantCount] = t; 121ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams return mConstantCount++; 1220011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1230011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 124288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma public BaseProgramBuilder setTextureCount(int count) throws IllegalArgumentException { 1250011bcf57ff711a221a3a4c73f2a79125111647dJason Sams // Should check for consistant and non-conflicting names... 1267e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams if(count >= MAX_CONSTANT) { 1277e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams throw new IllegalArgumentException("Max texture count exceeded."); 1280011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1297e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams mTextureCount = count; 130288c8711a64893acb3f4a31caf69153be9809d17Jim Shuma return this; 1310011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1320011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1330011bcf57ff711a221a3a4c73f2a79125111647dJason Sams protected void initProgram(Program p) { 1340011bcf57ff711a221a3a4c73f2a79125111647dJason Sams p.mInputs = new Element[mInputCount]; 1350011bcf57ff711a221a3a4c73f2a79125111647dJason Sams System.arraycopy(mInputs, 0, p.mInputs, 0, mInputCount); 1360011bcf57ff711a221a3a4c73f2a79125111647dJason Sams p.mOutputs = new Element[mOutputCount]; 1370011bcf57ff711a221a3a4c73f2a79125111647dJason Sams System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount); 1380011bcf57ff711a221a3a4c73f2a79125111647dJason Sams p.mConstants = new Type[mConstantCount]; 1390011bcf57ff711a221a3a4c73f2a79125111647dJason Sams System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount); 1407e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams p.mTextureCount = mTextureCount; 1410011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1420011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 1430011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1440011bcf57ff711a221a3a4c73f2a79125111647dJason Sams} 1450011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 1460011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 147