1110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams/*
2110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * Copyright (C) 2008 The Android Open Source Project
3110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams *
4110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * you may not use this file except in compliance with the License.
6110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * You may obtain a copy of the License at
7110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams *
8110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams *
10110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * Unless required by applicable law or agreed to in writing, software
11110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * See the License for the specific language governing permissions and
14110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * limitations under the License.
15110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams */
16110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
17110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Samspackage android.renderscript;
18110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
19110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
20110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Samsimport android.util.Config;
21110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Samsimport android.util.Log;
22110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
23110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
24110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams/**
25110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * @hide
26110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams *
27110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams **/
280011bcf57ff711a221a3a4c73f2a79125111647dJason Samspublic class ProgramVertex extends Program {
29110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams    public static final int MAX_LIGHT = 8;
30110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
310011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
32110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams    ProgramVertex(int id, RenderScript rs) {
330011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        super(id, rs);
34110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams    }
35110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
369bee51c42eb8c3daffe7d6fa483edbb1689b94d2Jason Sams    public void bindAllocation(MatrixAllocation va) {
37771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
380011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        bindConstants(va.mAlloc, 0);
39110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams    }
40110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
41110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
42110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams    public static class Builder {
43110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        RenderScript mRS;
44110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        boolean mTextureMatrixEnable;
45110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
46110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        public Builder(RenderScript rs, Element in, Element out) {
47110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mRS = rs;
48110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
49110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
50110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        public void setTextureMatrixEnable(boolean enable) {
51110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mTextureMatrixEnable = enable;
52110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
53110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
540011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        public ProgramVertex create() {
550011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            int id = mRS.nProgramVertexCreate(mTextureMatrixEnable);
560011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            return new ProgramVertex(id, mRS);
5754c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams        }
580011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    }
5954c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams
600011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    public static class ShaderBuilder extends BaseProgramBuilder {
610011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        public ShaderBuilder(RenderScript rs) {
620011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            super(rs);
63110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
64110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
650011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        public ProgramVertex create() {
660011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            mRS.validate();
670011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount +1) * 2];
680011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            int idx = 0;
69110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
700011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            for (int i=0; i < mInputCount; i++) {
710011bcf57ff711a221a3a4c73f2a79125111647dJason Sams                tmp[idx++] = 0;
720011bcf57ff711a221a3a4c73f2a79125111647dJason Sams                tmp[idx++] = mInputs[i].mID;
73110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            }
740011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            for (int i=0; i < mOutputCount; i++) {
750011bcf57ff711a221a3a4c73f2a79125111647dJason Sams                tmp[idx++] = 1;
760011bcf57ff711a221a3a4c73f2a79125111647dJason Sams                tmp[idx++] = mOutputs[i].mID;
77110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            }
780011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            for (int i=0; i < mConstantCount; i++) {
790011bcf57ff711a221a3a4c73f2a79125111647dJason Sams                tmp[idx++] = 2;
800011bcf57ff711a221a3a4c73f2a79125111647dJason Sams                tmp[idx++] = mConstants[i].mID;
810011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            }
827e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            tmp[idx++] = 3;
837e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams            tmp[idx++] = mTextureCount;
84110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
850011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            int id = mRS.nProgramVertexCreate2(mShader, tmp);
860011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            ProgramVertex pv = new ProgramVertex(id, mRS);
870011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            initProgram(pv);
880011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            return pv;
89110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
90110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams    }
91110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
92110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
93110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
94110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams    public static class MatrixAllocation {
95110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        static final int MODELVIEW_OFFSET = 0;
96110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        static final int PROJECTION_OFFSET = 16;
97110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        static final int TEXTURE_OFFSET = 32;
98110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
9925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        Matrix4f mModel;
10025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        Matrix4f mProjection;
10125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        Matrix4f mTexture;
102110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
103110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        public Allocation mAlloc;
104110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
105110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        public MatrixAllocation(RenderScript rs) {
10625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            mModel = new Matrix4f();
10725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            mProjection = new Matrix4f();
10825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            mTexture = new Matrix4f();
109110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
110718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mAlloc = Allocation.createSized(rs, Element.createUser(rs, Element.DataType.FLOAT_32), 48);
111110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.subData1D(MODELVIEW_OFFSET, 16, mModel.mMat);
112110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
113110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.subData1D(TEXTURE_OFFSET, 16, mTexture.mMat);
114110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
115110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
116110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        public void destroy() {
117110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.destroy();
118110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc = null;
119110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
120110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
12125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        public void loadModelview(Matrix4f m) {
122110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mModel = m;
123110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.subData1D(MODELVIEW_OFFSET, 16, m.mMat);
124110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
125110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
12625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        public void loadProjection(Matrix4f m) {
127110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mProjection = m;
128110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.subData1D(PROJECTION_OFFSET, 16, m.mMat);
129110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
130110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
13125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams        public void loadTexture(Matrix4f m) {
132110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mTexture = m;
133110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.subData1D(TEXTURE_OFFSET, 16, m.mMat);
134110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
135110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
136110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        public void setupOrthoWindow(int w, int h) {
137110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mProjection.loadOrtho(0,w, h,0, -1,1);
138110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
139110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
140110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
141110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        public void setupOrthoNormalized(int w, int h) {
142110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            // range -1,1 in the narrow axis.
143110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            if(w > h) {
144110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams                float aspect = ((float)w) / h;
145110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams                mProjection.loadOrtho(-aspect,aspect,  -1,1,  -1,1);
146110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            } else {
147110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams                float aspect = ((float)h) / w;
148110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams                mProjection.loadOrtho(-1,1, -aspect,aspect,  -1,1);
149110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            }
150110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
151110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
152110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
153110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        public void setupProjectionNormalized(int w, int h) {
154110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            // range -1,1 in the narrow axis at z = 0.
15525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            Matrix4f m1 = new Matrix4f();
15625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams            Matrix4f m2 = new Matrix4f();
157110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
158110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            if(w > h) {
159110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams                float aspect = ((float)w) / h;
160110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams                m1.loadFrustum(-aspect,aspect,  -1,1,  1,100);
161110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            } else {
162110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams                float aspect = ((float)h) / w;
163110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams                m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
164110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            }
165110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
166110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            m2.loadRotate(180, 0, 1, 0);
167110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            m1.loadMultiply(m1, m2);
168110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
169110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            m2.loadScale(-2, 2, 1);
170110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            m1.loadMultiply(m1, m2);
171110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
172110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            m2.loadTranslate(0, 0, 2);
173110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            m1.loadMultiply(m1, m2);
174110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
175110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mProjection = m1;
176110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams            mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
177110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams        }
178110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
179110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams    }
180110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
181110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams}
182110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams
183