blob: a3818163fe949a5bb65fadb04de43cd3178bb87a [file] [log] [blame]
Tim Murray84bf2b82012-10-31 16:03:16 -07001/*
2 * Copyright (C) 2012 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
17#ifndef ANDROID_RSCPPSTRUCTS_H
18#define ANDROID_RSCPPSTRUCTS_H
19
20#include <utils/String8.h>
21#include <utils/Vector.h>
22#include "utils/RefBase.h"
23
24#include <rs.h>
25
26namespace android {
Tim Murray9eb7f4b2012-11-16 14:02:18 -080027namespace RSC {
Tim Murray84bf2b82012-10-31 16:03:16 -070028
29typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText);
30typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen);
31
32class RS;
33class BaseObj;
34class Element;
35class Type;
36class Allocation;
37class Script;
38class ScriptC;
39
40class RS : public android::LightRefBase<RS> {
41
42 public:
43 RS();
44 virtual ~RS();
45
Tim Murray4d252d62012-11-29 14:37:59 -080046 bool init(bool forceCpu = false, bool synchronous = false);
Tim Murray84bf2b82012-10-31 16:03:16 -070047
48 void setErrorHandler(ErrorHandlerFunc_t func);
49 ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; }
50
51 void setMessageHandler(MessageHandlerFunc_t func);
52 MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; }
53
54 void throwError(const char *err) const;
55
56 RsContext getContext() { return mContext; }
57
Tim Murraybaca6c32012-11-14 16:51:46 -080058 void finish();
59
Tim Murray84bf2b82012-10-31 16:03:16 -070060 private:
Tim Murray4d252d62012-11-29 14:37:59 -080061 bool init(int targetApi, bool forceCpu, bool synchronous);
Tim Murray84bf2b82012-10-31 16:03:16 -070062 static void * threadProc(void *);
63
64 static bool gInitialized;
65 static pthread_mutex_t gInitMutex;
66
67 pthread_t mMessageThreadId;
68 pid_t mNativeMessageThreadId;
69 bool mMessageRun;
70
71 RsDevice mDev;
72 RsContext mContext;
73
74 ErrorHandlerFunc_t mErrorFunc;
75 MessageHandlerFunc_t mMessageFunc;
76
77 struct {
78 Element *U8;
79 Element *I8;
80 Element *U16;
81 Element *I16;
82 Element *U32;
83 Element *I32;
84 Element *U64;
85 Element *I64;
86 Element *F32;
87 Element *F64;
88 Element *BOOLEAN;
89
90 Element *ELEMENT;
91 Element *TYPE;
92 Element *ALLOCATION;
93 Element *SAMPLER;
94 Element *SCRIPT;
95 Element *MESH;
96 Element *PROGRAM_FRAGMENT;
97 Element *PROGRAM_VERTEX;
98 Element *PROGRAM_RASTER;
99 Element *PROGRAM_STORE;
100
101 Element *A_8;
102 Element *RGB_565;
103 Element *RGB_888;
104 Element *RGBA_5551;
105 Element *RGBA_4444;
106 Element *RGBA_8888;
107
108 Element *FLOAT_2;
109 Element *FLOAT_3;
110 Element *FLOAT_4;
111
112 Element *DOUBLE_2;
113 Element *DOUBLE_3;
114 Element *DOUBLE_4;
115
116 Element *UCHAR_2;
117 Element *UCHAR_3;
118 Element *UCHAR_4;
119
120 Element *CHAR_2;
121 Element *CHAR_3;
122 Element *CHAR_4;
123
124 Element *USHORT_2;
125 Element *USHORT_3;
126 Element *USHORT_4;
127
128 Element *SHORT_2;
129 Element *SHORT_3;
130 Element *SHORT_4;
131
132 Element *UINT_2;
133 Element *UINT_3;
134 Element *UINT_4;
135
136 Element *INT_2;
137 Element *INT_3;
138 Element *INT_4;
139
140 Element *ULONG_2;
141 Element *ULONG_3;
142 Element *ULONG_4;
143
144 Element *LONG_2;
145 Element *LONG_3;
146 Element *LONG_4;
147
148 Element *MATRIX_4X4;
149 Element *MATRIX_3X3;
150 Element *MATRIX_2X2;
151 } mElements;
152
153};
154
155class BaseObj : public android::LightRefBase<BaseObj> {
156protected:
157 void *mID;
158 sp<RS> mRS;
159 String8 mName;
160
161 BaseObj(void *id, sp<RS> rs);
162 void checkValid();
163
164 static void * getObjID(sp<const BaseObj> o);
165
166public:
167
168 void * getID() const;
169 virtual ~BaseObj();
170 virtual void updateFromNative();
171 virtual bool equals(const BaseObj *obj);
172};
173
174
175class Allocation : public BaseObj {
176protected:
177 android::sp<const Type> mType;
178 uint32_t mUsage;
179 android::sp<Allocation> mAdaptedAllocation;
180
181 bool mConstrainedLOD;
182 bool mConstrainedFace;
183 bool mConstrainedY;
184 bool mConstrainedZ;
185 bool mReadAllowed;
186 bool mWriteAllowed;
187 uint32_t mSelectedY;
188 uint32_t mSelectedZ;
189 uint32_t mSelectedLOD;
190 RsAllocationCubemapFace mSelectedFace;
191
192 uint32_t mCurrentDimX;
193 uint32_t mCurrentDimY;
194 uint32_t mCurrentDimZ;
195 uint32_t mCurrentCount;
196
197 void * getIDSafe() const;
198 void updateCacheInfo(sp<const Type> t);
199
200 Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage);
201
202 void validateIsInt32();
203 void validateIsInt16();
204 void validateIsInt8();
205 void validateIsFloat32();
206 void validateIsObject();
207
208 virtual void updateFromNative();
209
210 void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h);
211
212public:
213 android::sp<const Type> getType() {
214 return mType;
215 }
216
217 void syncAll(RsAllocationUsageType srcLocation);
218 void ioSendOutput();
219 void ioGetInput();
220
221 void generateMipmaps();
Tim Murray509ea5c2012-11-13 11:56:40 -0800222
Tim Murray0b93e302012-11-15 14:56:54 -0800223 void copy1DRangeFrom(uint32_t off, size_t count, const void *data);
Tim Murraya4cbc2b2012-11-14 17:18:08 -0800224 void copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data, uint32_t dataOff);
Tim Murray84bf2b82012-10-31 16:03:16 -0700225
Tim Murray0b93e302012-11-15 14:56:54 -0800226 void copy1DRangeTo(uint32_t off, size_t count, void *data);
227
228 void copy1DFrom(const void* data);
229 void copy1DTo(void* data);
Tim Murraya4cbc2b2012-11-14 17:18:08 -0800230
Tim Murray84bf2b82012-10-31 16:03:16 -0700231 void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
Tim Murray0b93e302012-11-15 14:56:54 -0800232 const void *data);
Tim Murray7b3e3092012-11-16 13:32:24 -0800233
234 void copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
235 void *data);
236
Tim Murray0b93e302012-11-15 14:56:54 -0800237 void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
238 sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff);
Tim Murray84bf2b82012-10-31 16:03:16 -0700239
Tim Murray358747a2012-11-26 13:52:04 -0800240 void copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
241 const void *data, size_t stride);
242 void copy2DStridedFrom(const void *data, size_t stride);
243
244 void copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
245 void *data, size_t stride);
246 void copy2DStridedTo(void *data, size_t stride);
247
Tim Murray84bf2b82012-10-31 16:03:16 -0700248 void resize(int dimX);
249 void resize(int dimX, int dimY);
250
251 static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
252 RsAllocationMipmapControl mips, uint32_t usage);
253 static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
254 RsAllocationMipmapControl mips, uint32_t usage, void * pointer);
255
256 static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
257 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
258 static sp<Allocation> createSized(sp<RS> rs, sp<const Element> e, size_t count,
259 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
Tim Murray684726c2012-11-14 11:57:42 -0800260 static sp<Allocation> createSized2D(sp<RS> rs, sp<const Element> e,
261 size_t x, size_t y,
262 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
263
Tim Murray84bf2b82012-10-31 16:03:16 -0700264
265};
266
267class Element : public BaseObj {
268public:
269 bool isComplex();
270 size_t getSubElementCount() {
271 return mVisibleElementMap.size();
272 }
273
274 sp<const Element> getSubElement(uint32_t index);
275 const char * getSubElementName(uint32_t index);
276 size_t getSubElementArraySize(uint32_t index);
277 uint32_t getSubElementOffsetBytes(uint32_t index);
278 RsDataType getDataType() const {
279 return mType;
280 }
281
282 RsDataKind getDataKind() const {
283 return mKind;
284 }
285
286 size_t getSizeBytes() const {
287 return mSizeBytes;
288 }
289
290 static sp<const Element> BOOLEAN(sp<RS> rs);
291 static sp<const Element> U8(sp<RS> rs);
292 static sp<const Element> I8(sp<RS> rs);
293 static sp<const Element> U16(sp<RS> rs);
294 static sp<const Element> I16(sp<RS> rs);
295 static sp<const Element> U32(sp<RS> rs);
296 static sp<const Element> I32(sp<RS> rs);
297 static sp<const Element> U64(sp<RS> rs);
298 static sp<const Element> I64(sp<RS> rs);
299 static sp<const Element> F32(sp<RS> rs);
300 static sp<const Element> F64(sp<RS> rs);
301 static sp<const Element> ELEMENT(sp<RS> rs);
302 static sp<const Element> TYPE(sp<RS> rs);
303 static sp<const Element> ALLOCATION(sp<RS> rs);
304 static sp<const Element> SAMPLER(sp<RS> rs);
305 static sp<const Element> SCRIPT(sp<RS> rs);
306 static sp<const Element> MESH(sp<RS> rs);
307 static sp<const Element> PROGRAM_FRAGMENT(sp<RS> rs);
308 static sp<const Element> PROGRAM_VERTEX(sp<RS> rs);
309 static sp<const Element> PROGRAM_RASTER(sp<RS> rs);
310 static sp<const Element> PROGRAM_STORE(sp<RS> rs);
311
312 static sp<const Element> A_8(sp<RS> rs);
313 static sp<const Element> RGB_565(sp<RS> rs);
314 static sp<const Element> RGB_888(sp<RS> rs);
315 static sp<const Element> RGBA_5551(sp<RS> rs);
316 static sp<const Element> RGBA_4444(sp<RS> rs);
317 static sp<const Element> RGBA_8888(sp<RS> rs);
318
319 static sp<const Element> F32_2(sp<RS> rs);
320 static sp<const Element> F32_3(sp<RS> rs);
321 static sp<const Element> F32_4(sp<RS> rs);
322 static sp<const Element> F64_2(sp<RS> rs);
323 static sp<const Element> F64_3(sp<RS> rs);
324 static sp<const Element> F64_4(sp<RS> rs);
325 static sp<const Element> U8_2(sp<RS> rs);
326 static sp<const Element> U8_3(sp<RS> rs);
327 static sp<const Element> U8_4(sp<RS> rs);
328 static sp<const Element> I8_2(sp<RS> rs);
329 static sp<const Element> I8_3(sp<RS> rs);
330 static sp<const Element> I8_4(sp<RS> rs);
331 static sp<const Element> U16_2(sp<RS> rs);
332 static sp<const Element> U16_3(sp<RS> rs);
333 static sp<const Element> U16_4(sp<RS> rs);
334 static sp<const Element> I16_2(sp<RS> rs);
335 static sp<const Element> I16_3(sp<RS> rs);
336 static sp<const Element> I16_4(sp<RS> rs);
337 static sp<const Element> U32_2(sp<RS> rs);
338 static sp<const Element> U32_3(sp<RS> rs);
339 static sp<const Element> U32_4(sp<RS> rs);
340 static sp<const Element> I32_2(sp<RS> rs);
341 static sp<const Element> I32_3(sp<RS> rs);
342 static sp<const Element> I32_4(sp<RS> rs);
343 static sp<const Element> U64_2(sp<RS> rs);
344 static sp<const Element> U64_3(sp<RS> rs);
345 static sp<const Element> U64_4(sp<RS> rs);
346 static sp<const Element> I64_2(sp<RS> rs);
347 static sp<const Element> I64_3(sp<RS> rs);
348 static sp<const Element> I64_4(sp<RS> rs);
349 static sp<const Element> MATRIX_4X4(sp<RS> rs);
350 static sp<const Element> MATRIX_3X3(sp<RS> rs);
351 static sp<const Element> MATRIX_2X2(sp<RS> rs);
352
353 Element(void *id, sp<RS> rs,
354 android::Vector<sp<Element> > &elements,
355 android::Vector<android::String8> &elementNames,
356 android::Vector<uint32_t> &arraySizes);
357 Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
358 Element(sp<RS> rs);
359 virtual ~Element();
360
361 void updateFromNative();
362 static sp<const Element> createUser(sp<RS> rs, RsDataType dt);
363 static sp<const Element> createVector(sp<RS> rs, RsDataType dt, uint32_t size);
364 static sp<const Element> createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk);
365 bool isCompatible(sp<const Element>e);
366
367 class Builder {
368 private:
369 sp<RS> mRS;
370 android::Vector<sp<Element> > mElements;
371 android::Vector<android::String8> mElementNames;
372 android::Vector<uint32_t> mArraySizes;
373 bool mSkipPadding;
374
375 public:
376 Builder(sp<RS> rs);
377 ~Builder();
378 void add(sp<Element>, android::String8 &name, uint32_t arraySize = 1);
379 sp<const Element> create();
380 };
381
382private:
383 void updateVisibleSubElements();
384
385 android::Vector<sp</*const*/ Element> > mElements;
386 android::Vector<android::String8> mElementNames;
387 android::Vector<uint32_t> mArraySizes;
388 android::Vector<uint32_t> mVisibleElementMap;
389 android::Vector<uint32_t> mOffsetInBytes;
390
391 RsDataType mType;
392 RsDataKind mKind;
393 bool mNormalized;
394 size_t mSizeBytes;
395 size_t mVectorSize;
396};
397
Stephen Hines2c7206e2012-11-14 19:47:01 -0800398class FieldPacker {
399protected:
400 unsigned char* mData;
401 size_t mPos;
402 size_t mLen;
403
404public:
405 FieldPacker(size_t len)
406 : mPos(0),
407 mLen(len) {
408 mData = new unsigned char[len];
409 }
410
411 virtual ~FieldPacker() {
412 delete [] mData;
413 }
414
415 void align(size_t v) {
416 if ((v & (v - 1)) != 0) {
417 ALOGE("Non-power-of-two alignment: %zu", v);
418 return;
419 }
420
421 while ((mPos & (v - 1)) != 0) {
422 mData[mPos++] = 0;
423 }
424 }
425
426 void reset() {
427 mPos = 0;
428 }
429
430 void reset(size_t i) {
431 if (i >= mLen) {
432 ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen);
433 return;
434 }
435 mPos = i;
436 }
437
438 void skip(size_t i) {
439 size_t res = mPos + i;
440 if (res > mLen) {
441 ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen);
442 return;
443 }
444 mPos = res;
445 }
446
447 void* getData() const {
448 return mData;
449 }
450
451 size_t getLength() const {
452 return mLen;
453 }
454
455 template <typename T>
456 void add(T t) {
457 align(sizeof(t));
458 if (mPos + sizeof(t) <= mLen) {
459 memcpy(&mData[mPos], &t, sizeof(t));
460 mPos += sizeof(t);
461 }
462 }
463};
464
Tim Murray84bf2b82012-10-31 16:03:16 -0700465class Type : public BaseObj {
466protected:
467 friend class Allocation;
468
469 uint32_t mDimX;
470 uint32_t mDimY;
471 uint32_t mDimZ;
472 bool mDimMipmaps;
473 bool mDimFaces;
474 size_t mElementCount;
475 sp<const Element> mElement;
476
477 void calcElementCount();
478 virtual void updateFromNative();
479
480public:
481
482 sp<const Element> getElement() const {
483 return mElement;
484 }
485
486 uint32_t getX() const {
487 return mDimX;
488 }
489
490 uint32_t getY() const {
491 return mDimY;
492 }
493
494 uint32_t getZ() const {
495 return mDimZ;
496 }
497
498 bool hasMipmaps() const {
499 return mDimMipmaps;
500 }
501
502 bool hasFaces() const {
503 return mDimFaces;
504 }
505
506 size_t getCount() const {
507 return mElementCount;
508 }
509
510 size_t getSizeBytes() const {
511 return mElementCount * mElement->getSizeBytes();
512 }
513
514 Type(void *id, sp<RS> rs);
515
516
517 class Builder {
518 protected:
519 sp<RS> mRS;
520 uint32_t mDimX;
521 uint32_t mDimY;
522 uint32_t mDimZ;
523 bool mDimMipmaps;
524 bool mDimFaces;
525 sp<const Element> mElement;
526
527 public:
528 Builder(sp<RS> rs, sp<const Element> e);
529
530 void setX(uint32_t value);
531 void setY(int value);
532 void setMipmaps(bool value);
533 void setFaces(bool value);
534 sp<const Type> create();
535 };
536
537};
538
539class Script : public BaseObj {
540private:
541
542protected:
543 Script(void *id, sp<RS> rs);
544 void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out,
545 const void *v, size_t) const;
546 void bindAllocation(sp<Allocation> va, uint32_t slot) const;
547 void setVar(uint32_t index, const void *, size_t len) const;
548 void setVar(uint32_t index, sp<const BaseObj> o) const;
549 void invoke(uint32_t slot, const void *v, size_t len) const;
550
551
552 void invoke(uint32_t slot) const {
553 invoke(slot, NULL, 0);
554 }
555 void setVar(uint32_t index, float v) const {
556 setVar(index, &v, sizeof(v));
557 }
558 void setVar(uint32_t index, double v) const {
559 setVar(index, &v, sizeof(v));
560 }
561 void setVar(uint32_t index, int32_t v) const {
562 setVar(index, &v, sizeof(v));
563 }
564 void setVar(uint32_t index, int64_t v) const {
565 setVar(index, &v, sizeof(v));
566 }
567 void setVar(uint32_t index, bool v) const {
568 setVar(index, &v, sizeof(v));
569 }
570
571public:
572 class FieldBase {
573 protected:
574 sp<const Element> mElement;
575 sp<Allocation> mAllocation;
576
577 void init(sp<RS> rs, uint32_t dimx, uint32_t usages = 0);
578
579 public:
580 sp<const Element> getElement() {
581 return mElement;
582 }
583
584 sp<const Type> getType() {
585 return mAllocation->getType();
586 }
587
588 sp<const Allocation> getAllocation() {
589 return mAllocation;
590 }
591
592 //void updateAllocation();
593 };
594};
595
596class ScriptC : public Script {
597protected:
598 ScriptC(sp<RS> rs,
599 const void *codeTxt, size_t codeLength,
600 const char *cachedName, size_t cachedNameLength,
601 const char *cacheDir, size_t cacheDirLength);
602
603};
604
Tim Murray7f0d5682012-11-08 16:35:24 -0800605class ScriptIntrinsic : public Script {
606 protected:
Tim Murray3cd44af2012-11-14 11:25:27 -0800607 ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e);
Tim Murray7f0d5682012-11-08 16:35:24 -0800608};
609
610class ScriptIntrinsicBlend : public ScriptIntrinsic {
611 public:
Tim Murray3cd44af2012-11-14 11:25:27 -0800612 ScriptIntrinsicBlend(sp<RS> rs, sp <const Element> e);
Tim Murray7f0d5682012-11-08 16:35:24 -0800613 void blendClear(sp<Allocation> in, sp<Allocation> out);
614 void blendSrc(sp<Allocation> in, sp<Allocation> out);
615 void blendDst(sp<Allocation> in, sp<Allocation> out);
616 void blendSrcOver(sp<Allocation> in, sp<Allocation> out);
617 void blendDstOver(sp<Allocation> in, sp<Allocation> out);
618 void blendSrcIn(sp<Allocation> in, sp<Allocation> out);
619 void blendDstIn(sp<Allocation> in, sp<Allocation> out);
620 void blendSrcOut(sp<Allocation> in, sp<Allocation> out);
621 void blendDstOut(sp<Allocation> in, sp<Allocation> out);
622 void blendSrcAtop(sp<Allocation> in, sp<Allocation> out);
623 void blendDstAtop(sp<Allocation> in, sp<Allocation> out);
624 void blendXor(sp<Allocation> in, sp<Allocation> out);
625 void blendMultiply(sp<Allocation> in, sp<Allocation> out);
626 void blendAdd(sp<Allocation> in, sp<Allocation> out);
627 void blendSubtract(sp<Allocation> in, sp<Allocation> out);
628};
Tim Murray84bf2b82012-10-31 16:03:16 -0700629
Tim Murray8f1e60c2012-11-13 12:25:11 -0800630class ScriptIntrinsicBlur : public ScriptIntrinsic {
631 public:
Tim Murray3cd44af2012-11-14 11:25:27 -0800632 ScriptIntrinsicBlur(sp<RS> rs, sp <const Element> e);
Tim Murray8f1e60c2012-11-13 12:25:11 -0800633 void blur(sp<Allocation> in, sp<Allocation> out);
634 void setRadius(float radius);
635};
636
Tim Murray84bf2b82012-10-31 16:03:16 -0700637}
Tim Murray7f0d5682012-11-08 16:35:24 -0800638
Tim Murray84bf2b82012-10-31 16:03:16 -0700639}
640
641#endif