blob: 579d3bb507e8b48a532528f63e3380498472f610 [file] [log] [blame]
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -08001/*
Jason Sams65c80f82012-05-08 17:30:26 -07002 * Copyright (C) 2008-2012 The Android Open Source Project
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -08003 *
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
Austin Wanga63a2c02019-12-19 06:38:19 +000019import android.annotation.UnsupportedAppUsage;
Mathew Inwood15324472018-08-06 11:18:49 +010020
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080021
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070022/**
Tim Murraya9084222013-04-05 22:06:43 +000023 * @hide
Jason Sams65c80f82012-05-08 17:30:26 -070024 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -080025 * ProgramVertexFixedFunction is a helper class that provides a
26 * simple way to create a fixed function emulation vertex shader
27 * without writing any GLSL code.
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080028 *
29 **/
30public class ProgramVertexFixedFunction extends ProgramVertex {
31
Tim Murray460a0492013-11-19 12:45:54 -080032 ProgramVertexFixedFunction(long id, RenderScript rs) {
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080033 super(id, rs);
34 }
35
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070036 /**
Jason Sams65c80f82012-05-08 17:30:26 -070037 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -080038 * Binds the constant buffer containing fixed function emulation
39 * matrices
40 *
41 * @param va allocation containing fixed function matrices
42 */
Mathew Inwood15324472018-08-06 11:18:49 +010043 @UnsupportedAppUsage
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080044 public void bindConstants(Constants va) {
45 mRS.validate();
46 bindConstants(va.getAllocation(), 0);
47 }
48
49 static class InternalBuilder extends BaseProgramBuilder {
Jason Sams65c80f82012-05-08 17:30:26 -070050 /**
51 * @deprecated in API 16
52 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080053 public InternalBuilder(RenderScript rs) {
54 super(rs);
55 }
56
Jason Sams65c80f82012-05-08 17:30:26 -070057 /**
58 * @deprecated in API 16
59 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080060 public InternalBuilder addInput(Element e) throws IllegalStateException {
61 // Should check for consistant and non-conflicting names...
62 if(mInputCount >= MAX_INPUT) {
63 throw new RSIllegalArgumentException("Max input count exceeded.");
64 }
65 if (e.isComplex()) {
66 throw new RSIllegalArgumentException("Complex elements not allowed.");
67 }
68 mInputs[mInputCount++] = e;
69 return this;
70 }
71
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070072 /**
Jason Sams65c80f82012-05-08 17:30:26 -070073 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -080074 * Creates ProgramVertexFixedFunction from the current state of
75 * the builder
76 *
77 * @return ProgramVertexFixedFunction
78 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080079 public ProgramVertexFixedFunction create() {
80 mRS.validate();
Ashok Bhat98071552014-02-12 09:54:43 +000081 long[] tmp = new long[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2];
Alex Sakhartchouk2123b462012-02-15 16:21:46 -080082 String[] texNames = new String[mTextureCount];
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080083 int idx = 0;
84
85 for (int i=0; i < mInputCount; i++) {
86 tmp[idx++] = ProgramParam.INPUT.mID;
Ashok Bhat98071552014-02-12 09:54:43 +000087 tmp[idx++] = mInputs[i].getID(mRS);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080088 }
89 for (int i=0; i < mOutputCount; i++) {
90 tmp[idx++] = ProgramParam.OUTPUT.mID;
Ashok Bhat98071552014-02-12 09:54:43 +000091 tmp[idx++] = mOutputs[i].getID(mRS);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080092 }
93 for (int i=0; i < mConstantCount; i++) {
94 tmp[idx++] = ProgramParam.CONSTANT.mID;
Ashok Bhat98071552014-02-12 09:54:43 +000095 tmp[idx++] = mConstants[i].getID(mRS);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -080096 }
97 for (int i=0; i < mTextureCount; i++) {
98 tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID;
Ashok Bhat98071552014-02-12 09:54:43 +000099 tmp[idx++] = mTextureTypes[i].mID;
Alex Sakhartchouk2123b462012-02-15 16:21:46 -0800100 texNames[i] = mTextureNames[i];
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800101 }
102
Tim Murray460a0492013-11-19 12:45:54 -0800103 long id = mRS.nProgramVertexCreate(mShader, texNames, tmp);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800104 ProgramVertexFixedFunction pv = new ProgramVertexFixedFunction(id, mRS);
105 initProgram(pv);
106 return pv;
107 }
108 }
109
Jason Sams65c80f82012-05-08 17:30:26 -0700110 /**
111 * @deprecated in API 16
112 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800113 public static class Builder {
114 boolean mTextureMatrixEnable;
115 String mShader;
116 RenderScript mRS;
117
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700118 /**
Jason Sams65c80f82012-05-08 17:30:26 -0700119 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800120 * Creates a builder for fixed function vertex program
121 *
Alex Sakhartchoukf5c876e2011-01-13 14:53:43 -0800122 * @param rs Context to which the program will belong.
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800123 */
Mathew Inwood15324472018-08-06 11:18:49 +0100124 @UnsupportedAppUsage
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800125 public Builder(RenderScript rs) {
126 mRS = rs;
127 }
128
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700129 /**
Jason Sams65c80f82012-05-08 17:30:26 -0700130 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800131 * Specifies whether texture matrix calculations are to be added
132 * to the shader
133 *
134 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800135 public Builder setTextureMatrixEnable(boolean enable) {
136 mTextureMatrixEnable = enable;
137 return this;
138 }
139 static Type getConstantInputType(RenderScript rs) {
140 Element.Builder b = new Element.Builder(rs);
141 b.add(Element.MATRIX4X4(rs), "MV");
142 b.add(Element.MATRIX4X4(rs), "P");
143 b.add(Element.MATRIX4X4(rs), "TexMatrix");
144 b.add(Element.MATRIX4X4(rs), "MVP");
145
146 Type.Builder typeBuilder = new Type.Builder(rs, b.create());
147 typeBuilder.setX(1);
148 return typeBuilder.create();
149 }
150
151 private void buildShaderString() {
152
153 mShader = "//rs_shader_internal\n";
154 mShader += "varying vec4 varColor;\n";
155 mShader += "varying vec2 varTex0;\n";
156
157 mShader += "void main() {\n";
158 mShader += " gl_Position = UNI_MVP * ATTRIB_position;\n";
159 mShader += " gl_PointSize = 1.0;\n";
160
161 mShader += " varColor = ATTRIB_color;\n";
162 if (mTextureMatrixEnable) {
163 mShader += " varTex0 = (UNI_TexMatrix * vec4(ATTRIB_texture0, 0.0, 1.0)).xy;\n";
164 } else {
165 mShader += " varTex0 = ATTRIB_texture0;\n";
166 }
167 mShader += "}\n";
168 }
169
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700170 /**
Jason Sams65c80f82012-05-08 17:30:26 -0700171 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800172 * Creates ProgramVertexFixedFunction from the current state of
173 * the builder
174 *
175 * @return Fixed function emulation ProgramVertex
176 */
Mathew Inwood15324472018-08-06 11:18:49 +0100177 @UnsupportedAppUsage
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800178 public ProgramVertexFixedFunction create() {
179 buildShaderString();
180
181 InternalBuilder sb = new InternalBuilder(mRS);
182 sb.setShader(mShader);
183 sb.addConstant(getConstantInputType(mRS));
184
185 Element.Builder b = new Element.Builder(mRS);
186 b.add(Element.F32_4(mRS), "position");
187 b.add(Element.F32_4(mRS), "color");
188 b.add(Element.F32_3(mRS), "normal");
189 b.add(Element.F32_2(mRS), "texture0");
190 sb.addInput(b.create());
191
192 return sb.create();
193 }
194 }
195
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700196 /**
Jason Sams65c80f82012-05-08 17:30:26 -0700197 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800198 * Helper class to store modelview, projection and texture
199 * matrices for ProgramVertexFixedFunction
200 *
201 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800202 public static class Constants {
203 static final int MODELVIEW_OFFSET = 0;
204 static final int PROJECTION_OFFSET = 16;
205 static final int TEXTURE_OFFSET = 32;
206
207 Matrix4f mModel;
208 Matrix4f mProjection;
209 Matrix4f mTexture;
210
211 Allocation mAlloc;
212 Allocation getAllocation() {
213 return mAlloc;
214 }
215 private FieldPacker mIOBuffer;
216
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700217 /**
Jason Sams65c80f82012-05-08 17:30:26 -0700218 * @deprecated in API 16
Alex Sakhartchoukf5c876e2011-01-13 14:53:43 -0800219 * Creates a buffer to store fixed function emulation matrices
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800220 *
Alex Sakhartchoukf5c876e2011-01-13 14:53:43 -0800221 * @param rs Context to which the allocation will belong.
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800222 **/
Mathew Inwood15324472018-08-06 11:18:49 +0100223 @UnsupportedAppUsage
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800224 public Constants(RenderScript rs) {
225 Type constInputType = ProgramVertexFixedFunction.Builder.getConstantInputType(rs);
226 mAlloc = Allocation.createTyped(rs, constInputType);
Alex Sakhartchouk918e8402012-04-11 14:04:23 -0700227 int bufferSize = constInputType.getElement().getBytesSize()*
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800228 constInputType.getCount();
229 mIOBuffer = new FieldPacker(bufferSize);
230 mModel = new Matrix4f();
231 mProjection = new Matrix4f();
232 mTexture = new Matrix4f();
233 setModelview(new Matrix4f());
234 setProjection(new Matrix4f());
235 setTexture(new Matrix4f());
236 }
237
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700238 /**
Jason Sams65c80f82012-05-08 17:30:26 -0700239 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800240 * Forces deallocation of memory backing the contant matrices.
241 * Normally, this is unnecessary and will be garbage collected
242 *
243 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800244 public void destroy() {
245 mAlloc.destroy();
246 mAlloc = null;
247 }
248
249 private void addToBuffer(int offset, Matrix4f m) {
250 mIOBuffer.reset(offset);
251 for(int i = 0; i < 16; i ++) {
252 mIOBuffer.addF32(m.mMat[i]);
253 }
Stephen Hinesfa1275a2014-06-17 17:25:04 -0700254 // Reset the buffer back to the end, since we want to flush all of
255 // the contents back (and not just what we wrote now).
256 mIOBuffer.reset(mIOBuffer.getData().length);
Jason Samsb97b2512011-01-16 15:04:08 -0800257 mAlloc.setFromFieldPacker(0, mIOBuffer);
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800258 }
259
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700260 /**
Jason Sams65c80f82012-05-08 17:30:26 -0700261 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800262 * Sets the modelview matrix in the fixed function matrix buffer
263 *
264 * @param m modelview matrix
265 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800266 public void setModelview(Matrix4f m) {
267 mModel.load(m);
268 addToBuffer(MODELVIEW_OFFSET*4, m);
269 }
270
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700271 /**
Jason Sams65c80f82012-05-08 17:30:26 -0700272 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800273 * Sets the projection matrix in the fixed function matrix buffer
274 *
275 * @param m projection matrix
276 */
Mathew Inwood15324472018-08-06 11:18:49 +0100277 @UnsupportedAppUsage
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800278 public void setProjection(Matrix4f m) {
279 mProjection.load(m);
280 addToBuffer(PROJECTION_OFFSET*4, m);
281 }
282
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700283 /**
Jason Sams65c80f82012-05-08 17:30:26 -0700284 * @deprecated in API 16
Alex Sakhartchoukdf272022011-01-09 11:34:03 -0800285 * Sets the texture matrix in the fixed function matrix buffer.
286 * Texture matrix must be enabled in the
287 * ProgramVertexFixedFunction builder for the shader to utilize
288 * it.
289 *
290 * @param m modelview matrix
291 */
Alex Sakhartchoukb4d7bb62010-12-21 14:42:26 -0800292 public void setTexture(Matrix4f m) {
293 mTexture.load(m);
294 addToBuffer(TEXTURE_OFFSET*4, m);
295 }
296 }
297}