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