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