blob: 576a84d03c4b7bac6caea282e08efa3f27283fc0 [file] [log] [blame]
Jason Sams25430d02010-02-02 15:26:40 -08001/*
Jason Sams5b08a2d2013-02-08 11:22:17 -08002 * Copyright (C) 2013 The Android Open Source Project
Jason Sams25430d02010-02-02 15:26:40 -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
Tim Murray7c4caad2013-04-10 16:21:40 -070019import android.util.Log;
20import java.util.BitSet;
Jason Sams25430d02010-02-02 15:26:40 -080021
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070022/**
Robert Ly11518ac2011-02-09 13:57:06 -080023 * Utility class for packing arguments and structures from Android system objects to
Tim Murrayc11e25c2013-04-09 11:01:01 -070024 * RenderScript objects.
Jason Sams42d6c9e2010-02-02 15:45:58 -080025 *
Jason Samsf64cca92013-04-19 12:56:37 -070026 * This class is only intended to be used to support the
27 * reflected code generated by the RS tool chain. It should not
28 * be called directly.
29 *
Jason Sams42d6c9e2010-02-02 15:45:58 -080030 **/
Jason Sams25430d02010-02-02 15:26:40 -080031public class FieldPacker {
32 public FieldPacker(int len) {
33 mPos = 0;
Stephen Hinese27832a2011-06-02 19:36:41 -070034 mLen = len;
Jason Sams25430d02010-02-02 15:26:40 -080035 mData = new byte[len];
Tim Murray7c4caad2013-04-10 16:21:40 -070036 mAlignment = new BitSet();
Jason Sams25430d02010-02-02 15:26:40 -080037 }
38
Jason Sams5b08a2d2013-02-08 11:22:17 -080039 public FieldPacker(byte[] data) {
40 mPos = 0;
41 mLen = data.length;
42 mData = data;
Tim Murray7c4caad2013-04-10 16:21:40 -070043 mAlignment = new BitSet();
Jason Sams5b08a2d2013-02-08 11:22:17 -080044 }
45
Jason Sams25430d02010-02-02 15:26:40 -080046 public void align(int v) {
Stephen Hinese27832a2011-06-02 19:36:41 -070047 if ((v <= 0) || ((v & (v - 1)) != 0)) {
48 throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
49 }
50
Jason Sams25430d02010-02-02 15:26:40 -080051 while ((mPos & (v - 1)) != 0) {
Tim Murray7c4caad2013-04-10 16:21:40 -070052 mAlignment.flip(mPos);
Jason Sams25430d02010-02-02 15:26:40 -080053 mData[mPos++] = 0;
54 }
55 }
56
Tim Murray7c4caad2013-04-10 16:21:40 -070057 public void subalign(int v) {
58 if ((v & (v - 1)) != 0) {
59 throw new RSIllegalArgumentException("argument must be a non-negative non-zero power of 2: " + v);
60 }
61
62 while ((mPos & (v - 1)) != 0) {
63 mPos--;
64 }
65
66 if (mPos > 0) {
67 while (mAlignment.get(mPos - 1) == true) {
68 mPos--;
69 mAlignment.flip(mPos);
70 }
71 }
72
73 }
74
Jason Samsa70f4162010-03-26 15:33:42 -070075 public void reset() {
Jason Sams25430d02010-02-02 15:26:40 -080076 mPos = 0;
77 }
Jason Samsa70f4162010-03-26 15:33:42 -070078 public void reset(int i) {
Stephen Hinese27832a2011-06-02 19:36:41 -070079 if ((i < 0) || (i >= mLen)) {
80 throw new RSIllegalArgumentException("out of range argument: " + i);
81 }
Jason Samsa70f4162010-03-26 15:33:42 -070082 mPos = i;
83 }
Jason Sams25430d02010-02-02 15:26:40 -080084
Jason Sams020bb7b2010-06-17 15:55:00 -070085 public void skip(int i) {
Stephen Hinese27832a2011-06-02 19:36:41 -070086 int res = mPos + i;
Shih-wei Liao6e667252011-06-05 00:51:54 -070087 if ((res < 0) || (res > mLen)) {
Stephen Hinese27832a2011-06-02 19:36:41 -070088 throw new RSIllegalArgumentException("out of range argument: " + i);
89 }
90 mPos = res;
Jason Sams020bb7b2010-06-17 15:55:00 -070091 }
92
Jason Samsa70f4162010-03-26 15:33:42 -070093 public void addI8(byte v) {
Jason Sams25430d02010-02-02 15:26:40 -080094 mData[mPos++] = v;
95 }
96
Tim Murray7c4caad2013-04-10 16:21:40 -070097 public byte subI8() {
98 subalign(1);
99 return mData[--mPos];
100 }
101
Jason Samsa70f4162010-03-26 15:33:42 -0700102 public void addI16(short v) {
Jason Sams25430d02010-02-02 15:26:40 -0800103 align(2);
104 mData[mPos++] = (byte)(v & 0xff);
105 mData[mPos++] = (byte)(v >> 8);
106 }
107
Tim Murray7c4caad2013-04-10 16:21:40 -0700108 public short subI16() {
109 subalign(2);
110 short v = 0;
111 v = (short)((mData[--mPos] & 0xff) << 8);
112 v = (short)(v | (short)(mData[--mPos] & 0xff));
113 return v;
114 }
115
116
Jason Samsa70f4162010-03-26 15:33:42 -0700117 public void addI32(int v) {
Jason Sams25430d02010-02-02 15:26:40 -0800118 align(4);
119 mData[mPos++] = (byte)(v & 0xff);
120 mData[mPos++] = (byte)((v >> 8) & 0xff);
121 mData[mPos++] = (byte)((v >> 16) & 0xff);
122 mData[mPos++] = (byte)((v >> 24) & 0xff);
123 }
124
Tim Murray7c4caad2013-04-10 16:21:40 -0700125 public int subI32() {
126 subalign(4);
127 int v = 0;
128 v = ((mData[--mPos] & 0xff) << 24);
129 v = v | ((mData[--mPos] & 0xff) << 16);
130 v = v | ((mData[--mPos] & 0xff) << 8);
131 v = v | ((mData[--mPos] & 0xff));
132 return v;
133 }
134
135
Jason Samsa70f4162010-03-26 15:33:42 -0700136 public void addI64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -0800137 align(8);
138 mData[mPos++] = (byte)(v & 0xff);
139 mData[mPos++] = (byte)((v >> 8) & 0xff);
140 mData[mPos++] = (byte)((v >> 16) & 0xff);
141 mData[mPos++] = (byte)((v >> 24) & 0xff);
142 mData[mPos++] = (byte)((v >> 32) & 0xff);
143 mData[mPos++] = (byte)((v >> 40) & 0xff);
144 mData[mPos++] = (byte)((v >> 48) & 0xff);
145 mData[mPos++] = (byte)((v >> 56) & 0xff);
146 }
147
Tim Murray7c4caad2013-04-10 16:21:40 -0700148 public long subI64() {
149 subalign(8);
150 long v = 0;
151 byte x = 0;
152 x = ((mData[--mPos]));
153 v = (long)(v | (((long)x) & 0xff) << 56l);
154 x = ((mData[--mPos]));
155 v = (long)(v | (((long)x) & 0xff) << 48l);
156 x = ((mData[--mPos]));
157 v = (long)(v | (((long)x) & 0xff) << 40l);
158 x = ((mData[--mPos]));
159 v = (long)(v | (((long)x) & 0xff) << 32l);
160 x = ((mData[--mPos]));
161 v = (long)(v | (((long)x) & 0xff) << 24l);
162 x = ((mData[--mPos]));
163 v = (long)(v | (((long)x) & 0xff) << 16l);
164 x = ((mData[--mPos]));
165 v = (long)(v | (((long)x) & 0xff) << 8l);
166 x = ((mData[--mPos]));
167 v = (long)(v | (((long)x) & 0xff));
168 return v;
169 }
170
Jason Samsa70f4162010-03-26 15:33:42 -0700171 public void addU8(short v) {
Jason Sams25430d02010-02-02 15:26:40 -0800172 if ((v < 0) || (v > 0xff)) {
Jason Samsee734982010-08-12 12:44:02 -0700173 android.util.Log.e("rs", "FieldPacker.addU8( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800174 throw new IllegalArgumentException("Saving value out of range for type");
175 }
176 mData[mPos++] = (byte)v;
177 }
178
Jason Samsa70f4162010-03-26 15:33:42 -0700179 public void addU16(int v) {
Jason Sams25430d02010-02-02 15:26:40 -0800180 if ((v < 0) || (v > 0xffff)) {
Jason Samsee734982010-08-12 12:44:02 -0700181 android.util.Log.e("rs", "FieldPacker.addU16( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800182 throw new IllegalArgumentException("Saving value out of range for type");
183 }
184 align(2);
185 mData[mPos++] = (byte)(v & 0xff);
186 mData[mPos++] = (byte)(v >> 8);
187 }
188
Jason Samsa70f4162010-03-26 15:33:42 -0700189 public void addU32(long v) {
Jason Samsee734982010-08-12 12:44:02 -0700190 if ((v < 0) || (v > 0xffffffffL)) {
191 android.util.Log.e("rs", "FieldPacker.addU32( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800192 throw new IllegalArgumentException("Saving value out of range for type");
193 }
194 align(4);
195 mData[mPos++] = (byte)(v & 0xff);
196 mData[mPos++] = (byte)((v >> 8) & 0xff);
197 mData[mPos++] = (byte)((v >> 16) & 0xff);
198 mData[mPos++] = (byte)((v >> 24) & 0xff);
199 }
200
Jason Samsa70f4162010-03-26 15:33:42 -0700201 public void addU64(long v) {
Jason Sams25430d02010-02-02 15:26:40 -0800202 if (v < 0) {
Jason Samsee734982010-08-12 12:44:02 -0700203 android.util.Log.e("rs", "FieldPacker.addU64( " + v + " )");
Jason Sams25430d02010-02-02 15:26:40 -0800204 throw new IllegalArgumentException("Saving value out of range for type");
205 }
206 align(8);
207 mData[mPos++] = (byte)(v & 0xff);
208 mData[mPos++] = (byte)((v >> 8) & 0xff);
209 mData[mPos++] = (byte)((v >> 16) & 0xff);
210 mData[mPos++] = (byte)((v >> 24) & 0xff);
211 mData[mPos++] = (byte)((v >> 32) & 0xff);
212 mData[mPos++] = (byte)((v >> 40) & 0xff);
213 mData[mPos++] = (byte)((v >> 48) & 0xff);
214 mData[mPos++] = (byte)((v >> 56) & 0xff);
215 }
216
Jason Samsa70f4162010-03-26 15:33:42 -0700217 public void addF32(float v) {
Jason Sams25430d02010-02-02 15:26:40 -0800218 addI32(Float.floatToRawIntBits(v));
219 }
220
Tim Murray7c4caad2013-04-10 16:21:40 -0700221 public float subF32() {
222 return Float.intBitsToFloat(subI32());
223 }
224
Stephen Hines02f417052010-09-30 15:19:22 -0700225 public void addF64(double v) {
Jason Sams25430d02010-02-02 15:26:40 -0800226 addI64(Double.doubleToRawLongBits(v));
227 }
228
Tim Murray7c4caad2013-04-10 16:21:40 -0700229 public double subF64() {
230 return Double.longBitsToDouble(subI64());
231 }
232
Jason Samsa70f4162010-03-26 15:33:42 -0700233 public void addObj(BaseObj obj) {
234 if (obj != null) {
Tim Murrayf0c62b22014-05-16 11:47:26 -0700235 if (RenderScript.sPointerSize == 8) {
236 addI64(obj.getID(null));
Tim Murray4154bbd2014-06-12 14:17:53 -0700237 addI64(0);
238 addI64(0);
239 addI64(0);
Tim Murrayf0c62b22014-05-16 11:47:26 -0700240 }
241 else {
242 addI32((int)obj.getID(null));
243 }
Jason Samsa70f4162010-03-26 15:33:42 -0700244 } else {
Tim Murrayf0c62b22014-05-16 11:47:26 -0700245 if (RenderScript.sPointerSize == 8) {
246 addI64(0);
Tim Murray4154bbd2014-06-12 14:17:53 -0700247 addI64(0);
248 addI64(0);
249 addI64(0);
Tim Murrayf0c62b22014-05-16 11:47:26 -0700250 } else {
251 addI32(0);
252 }
Jason Samsa70f4162010-03-26 15:33:42 -0700253 }
254 }
255
256 public void addF32(Float2 v) {
257 addF32(v.x);
258 addF32(v.y);
259 }
260 public void addF32(Float3 v) {
261 addF32(v.x);
262 addF32(v.y);
263 addF32(v.z);
264 }
265 public void addF32(Float4 v) {
266 addF32(v.x);
267 addF32(v.y);
268 addF32(v.z);
269 addF32(v.w);
270 }
271
Stephen Hines79ad3f22011-06-20 17:27:09 -0700272 public void addF64(Double2 v) {
273 addF64(v.x);
274 addF64(v.y);
275 }
276 public void addF64(Double3 v) {
277 addF64(v.x);
278 addF64(v.y);
279 addF64(v.z);
280 }
281 public void addF64(Double4 v) {
282 addF64(v.x);
283 addF64(v.y);
284 addF64(v.z);
285 addF64(v.w);
286 }
287
Jason Samsa70f4162010-03-26 15:33:42 -0700288 public void addI8(Byte2 v) {
289 addI8(v.x);
290 addI8(v.y);
291 }
292 public void addI8(Byte3 v) {
293 addI8(v.x);
294 addI8(v.y);
295 addI8(v.z);
296 }
297 public void addI8(Byte4 v) {
298 addI8(v.x);
299 addI8(v.y);
300 addI8(v.z);
301 addI8(v.w);
302 }
303
304 public void addU8(Short2 v) {
305 addU8(v.x);
306 addU8(v.y);
307 }
308 public void addU8(Short3 v) {
309 addU8(v.x);
310 addU8(v.y);
311 addU8(v.z);
312 }
313 public void addU8(Short4 v) {
314 addU8(v.x);
315 addU8(v.y);
316 addU8(v.z);
317 addU8(v.w);
318 }
319
320 public void addI16(Short2 v) {
321 addI16(v.x);
322 addI16(v.y);
323 }
324 public void addI16(Short3 v) {
325 addI16(v.x);
326 addI16(v.y);
327 addI16(v.z);
328 }
329 public void addI16(Short4 v) {
330 addI16(v.x);
331 addI16(v.y);
332 addI16(v.z);
333 addI16(v.w);
334 }
335
336 public void addU16(Int2 v) {
337 addU16(v.x);
338 addU16(v.y);
339 }
340 public void addU16(Int3 v) {
341 addU16(v.x);
342 addU16(v.y);
343 addU16(v.z);
344 }
345 public void addU16(Int4 v) {
346 addU16(v.x);
347 addU16(v.y);
348 addU16(v.z);
349 addU16(v.w);
350 }
351
352 public void addI32(Int2 v) {
353 addI32(v.x);
354 addI32(v.y);
355 }
356 public void addI32(Int3 v) {
357 addI32(v.x);
358 addI32(v.y);
359 addI32(v.z);
360 }
361 public void addI32(Int4 v) {
362 addI32(v.x);
363 addI32(v.y);
364 addI32(v.z);
365 addI32(v.w);
366 }
367
Stephen Hinese9f5c182011-01-20 18:17:25 -0800368 public void addU32(Long2 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700369 addU32(v.x);
370 addU32(v.y);
371 }
Stephen Hinese9f5c182011-01-20 18:17:25 -0800372 public void addU32(Long3 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700373 addU32(v.x);
374 addU32(v.y);
375 addU32(v.z);
376 }
Stephen Hinese9f5c182011-01-20 18:17:25 -0800377 public void addU32(Long4 v) {
Jason Samsa70f4162010-03-26 15:33:42 -0700378 addU32(v.x);
379 addU32(v.y);
380 addU32(v.z);
381 addU32(v.w);
382 }
383
Stephen Hines79ad3f22011-06-20 17:27:09 -0700384 public void addI64(Long2 v) {
385 addI64(v.x);
386 addI64(v.y);
387 }
388 public void addI64(Long3 v) {
389 addI64(v.x);
390 addI64(v.y);
391 addI64(v.z);
392 }
393 public void addI64(Long4 v) {
394 addI64(v.x);
395 addI64(v.y);
396 addI64(v.z);
397 addI64(v.w);
398 }
399
400 public void addU64(Long2 v) {
401 addU64(v.x);
402 addU64(v.y);
403 }
404 public void addU64(Long3 v) {
405 addU64(v.x);
406 addU64(v.y);
407 addU64(v.z);
408 }
409 public void addU64(Long4 v) {
410 addU64(v.x);
411 addU64(v.y);
412 addU64(v.z);
413 addU64(v.w);
414 }
415
Tim Murray7c4caad2013-04-10 16:21:40 -0700416
417 public Float2 subFloat2() {
418 Float2 v = new Float2();
419 v.y = subF32();
420 v.x = subF32();
421 return v;
422 }
423 public Float3 subFloat3() {
424 Float3 v = new Float3();
425 v.z = subF32();
426 v.y = subF32();
427 v.x = subF32();
428 return v;
429 }
430 public Float4 subFloat4() {
431 Float4 v = new Float4();
432 v.w = subF32();
433 v.z = subF32();
434 v.y = subF32();
435 v.x = subF32();
436 return v;
437 }
438
439 public Double2 subDouble2() {
440 Double2 v = new Double2();
441 v.y = subF64();
442 v.x = subF64();
443 return v;
444 }
445 public Double3 subDouble3() {
446 Double3 v = new Double3();
447 v.z = subF64();
448 v.y = subF64();
449 v.x = subF64();
450 return v;
451 }
452 public Double4 subDouble4() {
453 Double4 v = new Double4();
454 v.w = subF64();
455 v.z = subF64();
456 v.y = subF64();
457 v.x = subF64();
458 return v;
459 }
460
461 public Byte2 subByte2() {
462 Byte2 v = new Byte2();
463 v.y = subI8();
464 v.x = subI8();
465 return v;
466 }
467 public Byte3 subByte3() {
468 Byte3 v = new Byte3();
469 v.z = subI8();
470 v.y = subI8();
471 v.x = subI8();
472 return v;
473 }
474 public Byte4 subByte4() {
475 Byte4 v = new Byte4();
476 v.w = subI8();
477 v.z = subI8();
478 v.y = subI8();
479 v.x = subI8();
480 return v;
481 }
482
483 public Short2 subShort2() {
484 Short2 v = new Short2();
485 v.y = subI16();
486 v.x = subI16();
487 return v;
488 }
489 public Short3 subShort3() {
490 Short3 v = new Short3();
491 v.z = subI16();
492 v.y = subI16();
493 v.x = subI16();
494 return v;
495 }
496 public Short4 subShort4() {
497 Short4 v = new Short4();
498 v.w = subI16();
499 v.z = subI16();
500 v.y = subI16();
501 v.x = subI16();
502 return v;
503 }
504
505 public Int2 subInt2() {
506 Int2 v = new Int2();
507 v.y = subI32();
508 v.x = subI32();
509 return v;
510 }
511 public Int3 subInt3() {
512 Int3 v = new Int3();
513 v.z = subI32();
514 v.y = subI32();
515 v.x = subI32();
516 return v;
517 }
518 public Int4 subInt4() {
519 Int4 v = new Int4();
520 v.w = subI32();
521 v.z = subI32();
522 v.y = subI32();
523 v.x = subI32();
524 return v;
525 }
526
527 public Long2 subLong2() {
528 Long2 v = new Long2();
529 v.y = subI64();
530 v.x = subI64();
531 return v;
532 }
533 public Long3 subLong3() {
534 Long3 v = new Long3();
535 v.z = subI64();
536 v.y = subI64();
537 v.x = subI64();
538 return v;
539 }
540 public Long4 subLong4() {
541 Long4 v = new Long4();
542 v.w = subI64();
543 v.z = subI64();
544 v.y = subI64();
545 v.x = subI64();
546 return v;
547 }
548
549
550
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800551 public void addMatrix(Matrix4f v) {
552 for (int i=0; i < v.mMat.length; i++) {
553 addF32(v.mMat[i]);
554 }
555 }
556
Tim Murray7c4caad2013-04-10 16:21:40 -0700557 public Matrix4f subMatrix4f() {
558 Matrix4f v = new Matrix4f();
559 for (int i = v.mMat.length - 1; i >= 0; i--) {
560 v.mMat[i] = subF32();
561 }
562 return v;
563 }
564
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800565 public void addMatrix(Matrix3f v) {
566 for (int i=0; i < v.mMat.length; i++) {
567 addF32(v.mMat[i]);
568 }
569 }
570
Tim Murray7c4caad2013-04-10 16:21:40 -0700571 public Matrix3f subMatrix3f() {
572 Matrix3f v = new Matrix3f();
573 for (int i = v.mMat.length - 1; i >= 0; i--) {
574 v.mMat[i] = subF32();
575 }
576 return v;
577 }
578
Alex Sakhartchouke27cdee2010-12-17 11:41:08 -0800579 public void addMatrix(Matrix2f v) {
580 for (int i=0; i < v.mMat.length; i++) {
581 addF32(v.mMat[i]);
582 }
583 }
584
Tim Murray7c4caad2013-04-10 16:21:40 -0700585 public Matrix2f subMatrix2f() {
586 Matrix2f v = new Matrix2f();
587 for (int i = v.mMat.length - 1; i >= 0; i--) {
588 v.mMat[i] = subF32();
589 }
590 return v;
591 }
592
Jason Samsfae3f6b2010-06-24 13:54:11 -0700593 public void addBoolean(boolean v) {
Jason Sams9e2b0c52010-06-21 18:30:02 -0700594 addI8((byte)(v ? 1 : 0));
Jason Samsf110d4b2010-06-21 17:42:41 -0700595 }
596
Tim Murray7c4caad2013-04-10 16:21:40 -0700597 public boolean subBoolean() {
598 byte v = subI8();
599 if (v == 1) {
600 return true;
601 }
602 return false;
603 }
604
Jason Samsa70f4162010-03-26 15:33:42 -0700605 public final byte[] getData() {
Jason Sams25430d02010-02-02 15:26:40 -0800606 return mData;
607 }
608
609 private final byte mData[];
610 private int mPos;
Stephen Hinese27832a2011-06-02 19:36:41 -0700611 private int mLen;
Tim Murray7c4caad2013-04-10 16:21:40 -0700612 private BitSet mAlignment;
Jason Sams25430d02010-02-02 15:26:40 -0800613
614}
615
616