1b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk/*
265c80f824711f084c4ece9204f543a7809534294Jason Sams * Copyright (C) 2008-2012 The Android Open Source Project
3b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk *
4b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * you may not use this file except in compliance with the License.
6b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * You may obtain a copy of the License at
7b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk *
8b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk *
10b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * See the License for the specific language governing permissions and
14b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * limitations under the License.
15b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk */
16b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
17b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukpackage android.renderscript;
18b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
19b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
20b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukimport android.graphics.Matrix;
21b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukimport android.util.Log;
22b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
23b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
249c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
25a90842283e322b1210e2bea5850b05177e3d87afTim Murray * @hide
2665c80f824711f084c4ece9204f543a7809534294Jason Sams * @deprecated in API 16
27df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * ProgramVertexFixedFunction is a helper class that provides a
28df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * simple way to create a fixed function emulation vertex shader
29df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * without writing any GLSL code.
30b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk *
31b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk **/
32b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukpublic class ProgramVertexFixedFunction extends ProgramVertex {
33b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
34b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    ProgramVertexFixedFunction(int id, RenderScript rs) {
35b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        super(id, rs);
36b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    }
37b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
389c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
3965c80f824711f084c4ece9204f543a7809534294Jason Sams     * @deprecated in API 16
40df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk     * Binds the constant buffer containing fixed function emulation
41df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk     * matrices
42df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk     *
43df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk     * @param va allocation containing fixed function matrices
44df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk     */
45b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public void bindConstants(Constants va) {
46b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        mRS.validate();
47b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        bindConstants(va.getAllocation(), 0);
48b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    }
49b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
50b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    static class InternalBuilder extends BaseProgramBuilder {
5165c80f824711f084c4ece9204f543a7809534294Jason Sams        /**
5265c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
5365c80f824711f084c4ece9204f543a7809534294Jason Sams         */
54b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public InternalBuilder(RenderScript rs) {
55b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            super(rs);
56b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
57b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
5865c80f824711f084c4ece9204f543a7809534294Jason Sams        /**
5965c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
6065c80f824711f084c4ece9204f543a7809534294Jason Sams         */
61b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public InternalBuilder addInput(Element e) throws IllegalStateException {
62b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            // Should check for consistant and non-conflicting names...
63b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            if(mInputCount >= MAX_INPUT) {
64b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                throw new RSIllegalArgumentException("Max input count exceeded.");
65b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            }
66b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            if (e.isComplex()) {
67b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                throw new RSIllegalArgumentException("Complex elements not allowed.");
68b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            }
69b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mInputs[mInputCount++] = e;
70b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
71b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
72b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
739c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
7465c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
75df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         * Creates ProgramVertexFixedFunction from the current state of
76df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         * the builder
77df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         *
78df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         * @return  ProgramVertexFixedFunction
79df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         */
80b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public ProgramVertexFixedFunction create() {
81b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mRS.validate();
82b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
832123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            String[] texNames = new String[mTextureCount];
84b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            int idx = 0;
85b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
86b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            for (int i=0; i < mInputCount; i++) {
87b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                tmp[idx++] = ProgramParam.INPUT.mID;
88e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                tmp[idx++] = mInputs[i].getID(mRS);
89b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            }
90b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            for (int i=0; i < mOutputCount; i++) {
91b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                tmp[idx++] = ProgramParam.OUTPUT.mID;
92e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                tmp[idx++] = mOutputs[i].getID(mRS);
93b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            }
94b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            for (int i=0; i < mConstantCount; i++) {
95b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                tmp[idx++] = ProgramParam.CONSTANT.mID;
96e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams                tmp[idx++] = mConstants[i].getID(mRS);
97b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            }
98b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            for (int i=0; i < mTextureCount; i++) {
99b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID;
100b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                tmp[idx++] = mTextureTypes[i].mID;
1012123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk                texNames[i] = mTextureNames[i];
102b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            }
103b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
1042123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk            int id = mRS.nProgramVertexCreate(mShader, texNames, tmp);
105b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            ProgramVertexFixedFunction pv = new ProgramVertexFixedFunction(id, mRS);
106b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            initProgram(pv);
107b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return pv;
108b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
109b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    }
110b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
11165c80f824711f084c4ece9204f543a7809534294Jason Sams    /**
11265c80f824711f084c4ece9204f543a7809534294Jason Sams     * @deprecated in API 16
11365c80f824711f084c4ece9204f543a7809534294Jason Sams     */
114b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public static class Builder {
115b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        boolean mTextureMatrixEnable;
116b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        String mShader;
117b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        RenderScript mRS;
118b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
1199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
12065c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
121df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         * Creates a builder for fixed function vertex program
122df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         *
123f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk         * @param rs Context to which the program will belong.
124df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         */
125b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder(RenderScript rs) {
126b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mRS = rs;
127b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
128b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
1299c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
13065c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
131df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         * Specifies whether texture matrix calculations are to be added
132df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         * to the shader
133df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         *
134df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         */
135b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Builder setTextureMatrixEnable(boolean enable) {
136b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mTextureMatrixEnable = enable;
137b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return this;
138b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
139b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        static Type getConstantInputType(RenderScript rs) {
140b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            Element.Builder b = new Element.Builder(rs);
141b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.add(Element.MATRIX4X4(rs), "MV");
142b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.add(Element.MATRIX4X4(rs), "P");
143b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.add(Element.MATRIX4X4(rs), "TexMatrix");
144b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.add(Element.MATRIX4X4(rs), "MVP");
145b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
146b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            Type.Builder typeBuilder = new Type.Builder(rs, b.create());
147b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            typeBuilder.setX(1);
148b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return typeBuilder.create();
149b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
150b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
151b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        private void buildShaderString() {
152b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
153b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mShader  = "//rs_shader_internal\n";
154b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mShader += "varying vec4 varColor;\n";
155b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mShader += "varying vec2 varTex0;\n";
156b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
157b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mShader += "void main() {\n";
158b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mShader += "  gl_Position = UNI_MVP * ATTRIB_position;\n";
159b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mShader += "  gl_PointSize = 1.0;\n";
160b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
161b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mShader += "  varColor = ATTRIB_color;\n";
162b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            if (mTextureMatrixEnable) {
163b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                mShader += "  varTex0 = (UNI_TexMatrix * vec4(ATTRIB_texture0, 0.0, 1.0)).xy;\n";
164b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            } else {
165b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                mShader += "  varTex0 = ATTRIB_texture0;\n";
166b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            }
167b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mShader += "}\n";
168b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
169b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
1709c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
17165c80f824711f084c4ece9204f543a7809534294Jason Sams         * @deprecated in API 16
172df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         * Creates ProgramVertexFixedFunction from the current state of
173df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         * the builder
174df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         *
175df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         * @return Fixed function emulation ProgramVertex
176df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk         */
177b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public ProgramVertexFixedFunction create() {
178b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            buildShaderString();
179b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
180b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            InternalBuilder sb = new InternalBuilder(mRS);
181b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            sb.setShader(mShader);
182b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            sb.addConstant(getConstantInputType(mRS));
183b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
184b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            Element.Builder b = new Element.Builder(mRS);
185b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.add(Element.F32_4(mRS), "position");
186b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.add(Element.F32_4(mRS), "color");
187b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.add(Element.F32_3(mRS), "normal");
188b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.add(Element.F32_2(mRS), "texture0");
189b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            sb.addInput(b.create());
190b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
191b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return sb.create();
192b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
193b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    }
194b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
1959c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
19665c80f824711f084c4ece9204f543a7809534294Jason Sams     * @deprecated in API 16
197df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk     * Helper class to store modelview, projection and texture
198df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk     * matrices for ProgramVertexFixedFunction
199df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk     *
200df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk     */
201b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    public static class Constants {
202b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        static final int MODELVIEW_OFFSET = 0;
203b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        static final int PROJECTION_OFFSET = 16;
204b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        static final int TEXTURE_OFFSET = 32;
205b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
206b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        Matrix4f mModel;
207b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        Matrix4f mProjection;
208b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        Matrix4f mTexture;
209b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
210b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        Allocation mAlloc;
211b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        Allocation getAllocation() {
212b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            return mAlloc;
213b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
214b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        private FieldPacker mIOBuffer;
215b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2169c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
21765c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
218f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * Creates a buffer to store fixed function emulation matrices
219df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
220f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk        * @param rs Context to which the allocation will belong.
221df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        **/
222b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public Constants(RenderScript rs) {
223b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            Type constInputType = ProgramVertexFixedFunction.Builder.getConstantInputType(rs);
224b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mAlloc = Allocation.createTyped(rs, constInputType);
225918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk            int bufferSize = constInputType.getElement().getBytesSize()*
226b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                             constInputType.getCount();
227b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mIOBuffer = new FieldPacker(bufferSize);
228b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mModel = new Matrix4f();
229b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mProjection = new Matrix4f();
230b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mTexture = new Matrix4f();
231b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            setModelview(new Matrix4f());
232b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            setProjection(new Matrix4f());
233b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            setTexture(new Matrix4f());
234b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
235b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2369c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
23765c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
238df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Forces deallocation of memory backing the contant matrices.
239df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Normally, this is unnecessary and will be garbage collected
240df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
241df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        */
242b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void destroy() {
243b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mAlloc.destroy();
244b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mAlloc = null;
245b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
246b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
247b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        private void addToBuffer(int offset, Matrix4f m) {
248b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mIOBuffer.reset(offset);
249b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            for(int i = 0; i < 16; i ++) {
250b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                mIOBuffer.addF32(m.mMat[i]);
251b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            }
252b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams            mAlloc.setFromFieldPacker(0, mIOBuffer);
253b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
254b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2559c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
25665c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
257df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Sets the modelview matrix in the fixed function matrix buffer
258df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
259df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param m modelview matrix
260df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        */
261b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setModelview(Matrix4f m) {
262b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mModel.load(m);
263b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            addToBuffer(MODELVIEW_OFFSET*4, m);
264b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
265b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2669c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
26765c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
268df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Sets the projection matrix in the fixed function matrix buffer
269df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
270df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param m projection matrix
271df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        */
272b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setProjection(Matrix4f m) {
273b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mProjection.load(m);
274b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            addToBuffer(PROJECTION_OFFSET*4, m);
275b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
276b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk
2779c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines        /**
27865c80f824711f084c4ece9204f543a7809534294Jason Sams        * @deprecated in API 16
279df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Sets the texture matrix in the fixed function matrix buffer.
280df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * Texture matrix must be enabled in the
281df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * ProgramVertexFixedFunction builder for the shader to utilize
282df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * it.
283df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        *
284df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        * @param m modelview matrix
285df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk        */
286b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setTexture(Matrix4f m) {
287b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            mTexture.load(m);
288b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            addToBuffer(TEXTURE_OFFSET*4, m);
289b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        }
290b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    }
291b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk}
292