ProgramFragment.java revision 68afd01ec9fd37774d8291192952a25e5605b6fb
122534176fb5c1257130ef4ee589739ca42766a32Jason Sams/*
222534176fb5c1257130ef4ee589739ca42766a32Jason Sams * Copyright (C) 2008 The Android Open Source Project
322534176fb5c1257130ef4ee589739ca42766a32Jason Sams *
422534176fb5c1257130ef4ee589739ca42766a32Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
522534176fb5c1257130ef4ee589739ca42766a32Jason Sams * you may not use this file except in compliance with the License.
622534176fb5c1257130ef4ee589739ca42766a32Jason Sams * You may obtain a copy of the License at
722534176fb5c1257130ef4ee589739ca42766a32Jason Sams *
822534176fb5c1257130ef4ee589739ca42766a32Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
922534176fb5c1257130ef4ee589739ca42766a32Jason Sams *
1022534176fb5c1257130ef4ee589739ca42766a32Jason Sams * Unless required by applicable law or agreed to in writing, software
1122534176fb5c1257130ef4ee589739ca42766a32Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1222534176fb5c1257130ef4ee589739ca42766a32Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1322534176fb5c1257130ef4ee589739ca42766a32Jason Sams * See the License for the specific language governing permissions and
1422534176fb5c1257130ef4ee589739ca42766a32Jason Sams * limitations under the License.
1522534176fb5c1257130ef4ee589739ca42766a32Jason Sams */
1622534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1722534176fb5c1257130ef4ee589739ca42766a32Jason Samspackage android.renderscript;
1822534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1922534176fb5c1257130ef4ee589739ca42766a32Jason Sams
2022534176fb5c1257130ef4ee589739ca42766a32Jason Samsimport android.util.Config;
2122534176fb5c1257130ef4ee589739ca42766a32Jason Samsimport android.util.Log;
2222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
2322534176fb5c1257130ef4ee589739ca42766a32Jason Sams
2422534176fb5c1257130ef4ee589739ca42766a32Jason Sams/**
2522534176fb5c1257130ef4ee589739ca42766a32Jason Sams * @hide
2622534176fb5c1257130ef4ee589739ca42766a32Jason Sams *
2722534176fb5c1257130ef4ee589739ca42766a32Jason Sams **/
287e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Samspublic class ProgramFragment extends Program {
2922534176fb5c1257130ef4ee589739ca42766a32Jason Sams    ProgramFragment(int id, RenderScript rs) {
307e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams        super(id, rs);
3122534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
3222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
337e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    public static class ShaderBuilder extends BaseProgramBuilder {
347e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams        public ShaderBuilder(RenderScript rs) {
357e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            super(rs);
367e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams        }
377e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
387e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams        public ProgramFragment create() {
397e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            mRS.validate();
407e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + 1) * 2];
417e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            int idx = 0;
427e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
437e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            for (int i=0; i < mInputCount; i++) {
447e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams                tmp[idx++] = 0;
457e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams                tmp[idx++] = mInputs[i].mID;
467e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            }
477e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            for (int i=0; i < mOutputCount; i++) {
487e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams                tmp[idx++] = 1;
497e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams                tmp[idx++] = mOutputs[i].mID;
507e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            }
517e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            for (int i=0; i < mConstantCount; i++) {
527e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams                tmp[idx++] = 2;
537e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams                tmp[idx++] = mConstants[i].mID;
547e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            }
557e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            tmp[idx++] = 3;
567e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            tmp[idx++] = mTextureCount;
577e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams
587e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            int id = mRS.nProgramFragmentCreate2(mShader, tmp);
597e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            ProgramFragment pf = new ProgramFragment(id, mRS);
607e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            initProgram(pf);
617e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            return pf;
627e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams        }
637e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    }
6422534176fb5c1257130ef4ee589739ca42766a32Jason Sams
6522534176fb5c1257130ef4ee589739ca42766a32Jason Sams    public static class Builder {
6668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams        public static final int MAX_TEXTURE = 2;
6722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        RenderScript mRS;
6825ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams        boolean mPointSpriteEnable;
6922534176fb5c1257130ef4ee589739ca42766a32Jason Sams
7068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams        public enum EnvMode {
7168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            REPLACE (1),
7268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            MODULATE (2),
7368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            DECAL (3);
7422534176fb5c1257130ef4ee589739ca42766a32Jason Sams
7568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            int mID;
7668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            EnvMode(int id) {
7768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams                mID = id;
7822534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
7922534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
8022534176fb5c1257130ef4ee589739ca42766a32Jason Sams
8168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams        public enum Format {
8268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            ALPHA (1),
8368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            LUMINANCE_ALPHA (2),
8468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            RGB (3),
8568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            RGBA (4);
8654c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
8768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            int mID;
8868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            Format(int id) {
8968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams                mID = id;
9022534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
9122534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
9222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
9368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams        private class Slot {
9468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            EnvMode env;
9568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            Format format;
9668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            Slot(EnvMode _env, Format _fmt) {
9768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams                env = _env;
9868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams                format = _fmt;
9922534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
10068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams        }
10168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams        Slot[] mSlots;
10222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
10368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams        public Builder(RenderScript rs) {
10468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            mRS = rs;
10568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            mSlots = new Slot[MAX_TEXTURE];
10668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            mPointSpriteEnable = false;
10722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
10822534176fb5c1257130ef4ee589739ca42766a32Jason Sams
10968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams        public void setTexture(EnvMode env, Format fmt, int slot)
11022534176fb5c1257130ef4ee589739ca42766a32Jason Sams            throws IllegalArgumentException {
11168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            if((slot < 0) || (slot >= MAX_TEXTURE)) {
11268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams                throw new IllegalArgumentException("MAX_TEXTURE exceeded.");
11322534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
11468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            mSlots[slot] = new Slot(env, fmt);
11522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
11622534176fb5c1257130ef4ee589739ca42766a32Jason Sams
11725ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams        public void setPointSpriteTexCoordinateReplacement(boolean enable) {
11825ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams            mPointSpriteEnable = enable;
11925ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams        }
12022534176fb5c1257130ef4ee589739ca42766a32Jason Sams
12122534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public ProgramFragment create() {
122771bebb94054d06f97284379c93a2620613513c3Jason Sams            mRS.validate();
12368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            int[] tmp = new int[MAX_TEXTURE * 2 + 1];
12468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            if (mSlots[0] != null) {
12568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams                tmp[0] = mSlots[0].env.mID;
12668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams                tmp[1] = mSlots[0].format.mID;
12768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            }
12868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            if (mSlots[1] != null) {
12968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams                tmp[2] = mSlots[1].env.mID;
13068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams                tmp[3] = mSlots[1].format.mID;
13168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            }
13268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            tmp[4] = mPointSpriteEnable ? 1 : 0;
13368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            int id = mRS.nProgramFragmentCreate(tmp);
13468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            ProgramFragment pf = new ProgramFragment(id, mRS);
13568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            pf.mTextureCount = MAX_TEXTURE;
13668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams            return pf;
13722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
13822534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
13922534176fb5c1257130ef4ee589739ca42766a32Jason Sams}
14022534176fb5c1257130ef4ee589739ca42766a32Jason Sams
14122534176fb5c1257130ef4ee589739ca42766a32Jason Sams
14222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
143