1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.renderscript;
18
19
20import android.util.Config;
21import android.util.Log;
22
23
24/**
25 * @hide
26 *
27 **/
28public class ProgramFragment extends BaseObj {
29    public static final int MAX_SLOT = 2;
30
31    public enum EnvMode {
32        REPLACE (0),
33        MODULATE (1),
34        DECAL (2);
35
36        int mID;
37        EnvMode(int id) {
38            mID = id;
39        }
40    }
41
42
43    ProgramFragment(int id, RenderScript rs) {
44        super(rs);
45        mID = id;
46    }
47
48    public void bindTexture(Allocation va, int slot)
49        throws IllegalArgumentException {
50        mRS.validate();
51        if((slot < 0) || (slot >= MAX_SLOT)) {
52            throw new IllegalArgumentException("Slot ID out of range.");
53        }
54
55        mRS.nProgramFragmentBindTexture(mID, slot, va.mID);
56    }
57
58    public void bindSampler(Sampler vs, int slot)
59        throws IllegalArgumentException {
60        mRS.validate();
61        if((slot < 0) || (slot >= MAX_SLOT)) {
62            throw new IllegalArgumentException("Slot ID out of range.");
63        }
64
65        mRS.nProgramFragmentBindSampler(mID, slot, vs.mID);
66    }
67
68
69    public static class Builder {
70        RenderScript mRS;
71        Element mIn;
72        Element mOut;
73        boolean mPointSpriteEnable;
74
75        private class Slot {
76            Type mType;
77            EnvMode mEnv;
78            boolean mTexEnable;
79
80            Slot() {
81                mTexEnable = false;
82            }
83        }
84        Slot[] mSlots;
85
86        public Builder(RenderScript rs, Element in, Element out) {
87            mRS = rs;
88            mIn = in;
89            mOut = out;
90            mSlots = new Slot[MAX_SLOT];
91            mPointSpriteEnable = false;
92            for(int ct=0; ct < MAX_SLOT; ct++) {
93                mSlots[ct] = new Slot();
94            }
95        }
96
97        public void setType(int slot, Type t)
98            throws IllegalArgumentException {
99            if((slot < 0) || (slot >= MAX_SLOT)) {
100                throw new IllegalArgumentException("Slot ID out of range.");
101            }
102
103            mSlots[slot].mType = t;
104        }
105
106        public void setTexEnable(boolean enable, int slot)
107            throws IllegalArgumentException {
108            if((slot < 0) || (slot >= MAX_SLOT)) {
109                throw new IllegalArgumentException("Slot ID out of range.");
110            }
111
112            mSlots[slot].mTexEnable = enable;
113        }
114
115        public void setTexEnvMode(EnvMode env, int slot)
116            throws IllegalArgumentException {
117            if((slot < 0) || (slot >= MAX_SLOT)) {
118                throw new IllegalArgumentException("Slot ID out of range.");
119            }
120
121            mSlots[slot].mEnv = env;
122        }
123
124        public void setPointSpriteTexCoordinateReplacement(boolean enable) {
125            mPointSpriteEnable = enable;
126        }
127
128        static synchronized ProgramFragment internalCreate(RenderScript rs, Builder b) {
129            int inID = 0;
130            int outID = 0;
131            if (b.mIn != null) {
132                inID = b.mIn.mID;
133            }
134            if (b.mOut != null) {
135                outID = b.mOut.mID;
136            }
137            rs.nProgramFragmentBegin(inID, outID, b.mPointSpriteEnable);
138            for(int ct=0; ct < MAX_SLOT; ct++) {
139                if(b.mSlots[ct].mTexEnable) {
140                    Slot s = b.mSlots[ct];
141                    int typeID = 0;
142                    if(s.mType != null) {
143                        typeID = s.mType.mID;
144                    }
145                    rs.nProgramFragmentSetSlot(ct, true, s.mEnv.mID, typeID);
146                }
147            }
148
149            int id = rs.nProgramFragmentCreate();
150            return new ProgramFragment(id, rs);
151        }
152
153        public ProgramFragment create() {
154            mRS.validate();
155            return internalCreate(mRS, this);
156        }
157    }
158}
159
160
161
162