blob: 907e3d256334cbb604fabeaf78792a8770a63922 [file] [log] [blame]
Jason Sams326e0dd2009-05-22 14:03:28 -07001/*
2 * Copyright (C) 2009 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
Jason Sams326e0dd2009-05-22 14:03:28 -070017
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -070018#include "rsContext.h"
Jason Sams565ac362009-06-03 16:04:54 -070019
Jason Sams326e0dd2009-05-22 14:03:28 -070020using namespace android;
21using namespace android::renderscript;
22
Jason Sams326e0dd2009-05-22 14:03:28 -070023
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080024Element::Element(Context *rsc) : ObjectBase(rsc) {
Jason Sams4815c0d2009-12-15 12:58:36 -080025 mBits = 0;
Alex Sakhartchouk2d1220c2011-11-15 15:15:21 -080026 mBitsUnpadded = 0;
Chris Wailes44bef6f2014-08-12 13:51:10 -070027 mFields = nullptr;
Jason Sams4815c0d2009-12-15 12:58:36 -080028 mFieldCount = 0;
Jason Samse3929c92010-08-09 18:13:33 -070029 mHasReference = false;
Alex Sakhartchoukb7c8c522011-12-22 13:11:48 -080030 memset(&mHal, 0, sizeof(mHal));
Jason Sams326e0dd2009-05-22 14:03:28 -070031}
32
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080033Element::~Element() {
Alex Sakhartchoukc700e642011-08-16 13:09:46 -070034 clear();
35}
36
Tim Murray49a87772014-07-10 10:00:00 -070037void Element::operator delete(void* ptr) {
38 if (ptr) {
39 Element *e = (Element*) ptr;
40 e->getContext()->mHal.funcs.freeRuntimeMem(ptr);
41 }
42}
43
Alex Sakhartchoukc700e642011-08-16 13:09:46 -070044void Element::preDestroy() const {
Chris Wailes93d6bc82014-07-28 16:54:38 -070045 auto &elements = mRSC->mStateElement.mElements;
46
47 for (auto elIter = elements.begin(), endIter = elements.end();
48 elIter != endIter; elIter++) {
49
50 if (this == *elIter) {
51 elements.erase(elIter);
52 return;
Jason Sams81549542010-02-17 15:38:10 -080053 }
54 }
Jason Sams326e0dd2009-05-22 14:03:28 -070055}
56
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080057void Element::clear() {
Jason Sams48ecf6a2013-07-09 15:35:29 -070058 if (mFields) {
59 for (size_t i = 0; i < mFieldCount; i++) {
60 delete[] mFields[i].name;
61 }
62 delete [] mFields;
63 }
Chris Wailes44bef6f2014-08-12 13:51:10 -070064 mFields = nullptr;
Jason Sams4815c0d2009-12-15 12:58:36 -080065 mFieldCount = 0;
Jason Samse3929c92010-08-09 18:13:33 -070066 mHasReference = false;
Alex Sakhartchouk253325d2011-12-15 09:56:10 -080067
68 delete [] mHal.state.fields;
69 delete [] mHal.state.fieldArraySizes;
70 delete [] mHal.state.fieldNames;
71 delete [] mHal.state.fieldNameLengths;
72 delete [] mHal.state.fieldOffsetBytes;
Jason Sams326e0dd2009-05-22 14:03:28 -070073}
Jason Sams326e0dd2009-05-22 14:03:28 -070074
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080075size_t Element::getSizeBits() const {
Jason Sams4815c0d2009-12-15 12:58:36 -080076 if (!mFieldCount) {
77 return mBits;
78 }
79
Jason Sams326e0dd2009-05-22 14:03:28 -070080 size_t total = 0;
Jason Sams4815c0d2009-12-15 12:58:36 -080081 for (size_t ct=0; ct < mFieldCount; ct++) {
Alex Sakhartchouk39f2ef62010-10-11 12:35:15 -070082 total += mFields[ct].e->mBits * mFields[ct].arraySize;
Jason Sams326e0dd2009-05-22 14:03:28 -070083 }
84 return total;
85}
86
Alex Sakhartchouk2d1220c2011-11-15 15:15:21 -080087size_t Element::getSizeBitsUnpadded() const {
88 if (!mFieldCount) {
89 return mBitsUnpadded;
90 }
91
92 size_t total = 0;
93 for (size_t ct=0; ct < mFieldCount; ct++) {
94 total += mFields[ct].e->mBitsUnpadded * mFields[ct].arraySize;
95 }
96 return total;
97}
98
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -080099void Element::dumpLOGV(const char *prefix) const {
Jason Samse12c1c52009-09-27 17:50:38 -0700100 ObjectBase::dumpLOGV(prefix);
Steve Block65982012011-10-20 11:56:00 +0100101 ALOGV("%s Element: fieldCount: %zu, size bytes: %zu", prefix, mFieldCount, getSizeBytes());
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700102 mComponent.dumpLOGV(prefix);
Jason Sams4815c0d2009-12-15 12:58:36 -0800103 for (uint32_t ct = 0; ct < mFieldCount; ct++) {
Steve Block65982012011-10-20 11:56:00 +0100104 ALOGV("%s Element field index: %u ------------------", prefix, ct);
105 ALOGV("%s name: %s, offsetBits: %u, arraySize: %u",
Jason Sams48ecf6a2013-07-09 15:35:29 -0700106 prefix, mFields[ct].name, mFields[ct].offsetBits, mFields[ct].arraySize);
Alex Sakhartchouk963bb452010-10-13 14:22:02 -0700107 mFields[ct].e->dumpLOGV(prefix);
Jason Samse12c1c52009-09-27 17:50:38 -0700108 }
109}
110
Jason Samse3150cf2012-07-24 18:10:20 -0700111void Element::serialize(Context *rsc, OStream *stream) const {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700112 // Need to identify ourselves
113 stream->addU32((uint32_t)getClassId());
Jason Sams48ecf6a2013-07-09 15:35:29 -0700114 stream->addString(getName());
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700115
116 mComponent.serialize(stream);
117
118 // Now serialize all the fields
119 stream->addU32(mFieldCount);
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800120 for (uint32_t ct = 0; ct < mFieldCount; ct++) {
Jason Sams48ecf6a2013-07-09 15:35:29 -0700121 stream->addString(mFields[ct].name);
Jason Sams46e45542010-09-02 17:35:23 -0700122 stream->addU32(mFields[ct].arraySize);
Jason Samse3150cf2012-07-24 18:10:20 -0700123 mFields[ct].e->serialize(rsc, stream);
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700124 }
125}
126
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800127Element *Element::createFromStream(Context *rsc, IStream *stream) {
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700128 // First make sure we are reading the correct object
Alex Sakhartchoukb825f672010-06-04 10:06:50 -0700129 RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800130 if (classID != RS_A3D_CLASS_ID_ELEMENT) {
Steve Blockaf12ac62012-01-06 19:20:56 +0000131 ALOGE("element loading skipped due to invalid class id\n");
Chris Wailes44bef6f2014-08-12 13:51:10 -0700132 return nullptr;
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700133 }
134
Jason Sams48ecf6a2013-07-09 15:35:29 -0700135 const char *name = stream->loadString();
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700136
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700137 Component component;
138 component.loadFromStream(stream);
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700139
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700140 uint32_t fieldCount = stream->loadU32();
141 if (!fieldCount) {
142 return (Element *)Element::create(rsc,
143 component.getType(),
144 component.getKind(),
145 component.getIsNormalized(),
Jason Sams807fdc42012-07-25 17:55:39 -0700146 component.getVectorSize());
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700147 }
148
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700149 const Element **subElems = new const Element *[fieldCount];
150 const char **subElemNames = new const char *[fieldCount];
151 size_t *subElemNamesLengths = new size_t[fieldCount];
152 uint32_t *arraySizes = new uint32_t[fieldCount];
153
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700154 for (uint32_t ct = 0; ct < fieldCount; ct ++) {
Jason Sams48ecf6a2013-07-09 15:35:29 -0700155 subElemNames[ct] = stream->loadString();
156 subElemNamesLengths[ct] = strlen(subElemNames[ct]);
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700157 arraySizes[ct] = stream->loadU32();
158 subElems[ct] = Element::createFromStream(rsc, stream);
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700159 }
160
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700161 const Element *elem = Element::create(rsc, fieldCount, subElems, subElemNames,
162 subElemNamesLengths, arraySizes);
163 for (uint32_t ct = 0; ct < fieldCount; ct ++) {
164 delete [] subElemNames[ct];
165 subElems[ct]->decUserRef();
166 }
Jason Sams48ecf6a2013-07-09 15:35:29 -0700167 delete[] name;
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700168 delete[] subElems;
169 delete[] subElemNames;
170 delete[] subElemNamesLengths;
171 delete[] arraySizes;
Alex Sakhartchoukfb6b6142010-05-21 12:53:13 -0700172
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700173 return (Element *)elem;
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700174}
Jason Samsd01d9702009-12-23 14:35:29 -0800175
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800176void Element::compute() {
Alex Sakhartchouk253325d2011-12-15 09:56:10 -0800177 mHal.state.dataType = mComponent.getType();
178 mHal.state.dataKind = mComponent.getKind();
179 mHal.state.vectorSize = mComponent.getVectorSize();
180
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800181 if (mFieldCount == 0) {
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800182 mBits = mComponent.getBits();
Alex Sakhartchouk2d1220c2011-11-15 15:15:21 -0800183 mBitsUnpadded = mComponent.getBitsUnpadded();
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800184 mHasReference = mComponent.isReference();
Alex Sakhartchouk253325d2011-12-15 09:56:10 -0800185
186 mHal.state.elementSizeBytes = getSizeBytes();
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800187 return;
188 }
189
Alex Sakhartchoukb7c8c522011-12-22 13:11:48 -0800190 uint32_t noPaddingFieldCount = 0;
191 for (uint32_t ct = 0; ct < mFieldCount; ct ++) {
Jason Sams48ecf6a2013-07-09 15:35:29 -0700192 if (mFields[ct].name[0] != '#') {
Alex Sakhartchoukb7c8c522011-12-22 13:11:48 -0800193 noPaddingFieldCount ++;
194 }
195 }
196
197 mHal.state.fields = new const Element*[noPaddingFieldCount];
198 mHal.state.fieldArraySizes = new uint32_t[noPaddingFieldCount];
199 mHal.state.fieldNames = new const char*[noPaddingFieldCount];
200 mHal.state.fieldNameLengths = new uint32_t[noPaddingFieldCount];
201 mHal.state.fieldOffsetBytes = new uint32_t[noPaddingFieldCount];
202 mHal.state.fieldsCount = noPaddingFieldCount;
Alex Sakhartchouk253325d2011-12-15 09:56:10 -0800203
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800204 size_t bits = 0;
Alex Sakhartchouk2d1220c2011-11-15 15:15:21 -0800205 size_t bitsUnpadded = 0;
Alex Sakhartchoukb7c8c522011-12-22 13:11:48 -0800206 for (size_t ct = 0, ctNoPadding = 0; ct < mFieldCount; ct++) {
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800207 mFields[ct].offsetBits = bits;
Alex Sakhartchouk2d1220c2011-11-15 15:15:21 -0800208 mFields[ct].offsetBitsUnpadded = bitsUnpadded;
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800209 bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize;
Alex Sakhartchouk2d1220c2011-11-15 15:15:21 -0800210 bitsUnpadded += mFields[ct].e->getSizeBitsUnpadded() * mFields[ct].arraySize;
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800211
212 if (mFields[ct].e->mHasReference) {
213 mHasReference = true;
214 }
Alex Sakhartchouk253325d2011-12-15 09:56:10 -0800215
Jason Sams48ecf6a2013-07-09 15:35:29 -0700216 if (mFields[ct].name[0] == '#') {
Alex Sakhartchoukb7c8c522011-12-22 13:11:48 -0800217 continue;
218 }
219
220 mHal.state.fields[ctNoPadding] = mFields[ct].e.get();
221 mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize;
Jason Sams48ecf6a2013-07-09 15:35:29 -0700222 mHal.state.fieldNames[ctNoPadding] = mFields[ct].name;
223 mHal.state.fieldNameLengths[ctNoPadding] = strlen(mFields[ct].name) + 1; // to include 0
Alex Sakhartchoukb7c8c522011-12-22 13:11:48 -0800224 mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3;
225
226 ctNoPadding ++;
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800227 }
228
Alex Sakhartchouk253325d2011-12-15 09:56:10 -0800229 mHal.state.elementSizeBytes = getSizeBytes();
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800230}
231
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700232ObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk,
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800233 bool isNorm, uint32_t vecSize) {
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700234 ObjectBaseRef<const Element> returnRef;
Jason Sams81549542010-02-17 15:38:10 -0800235 // Look for an existing match.
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700236 ObjectBase::asyncLock();
Jason Sams81549542010-02-17 15:38:10 -0800237 for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
238 const Element *ee = rsc->mStateElement.mElements[ct];
239 if (!ee->getFieldCount() &&
240 (ee->getComponent().getType() == dt) &&
241 (ee->getComponent().getKind() == dk) &&
242 (ee->getComponent().getIsNormalized() == isNorm) &&
243 (ee->getComponent().getVectorSize() == vecSize)) {
244 // Match
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700245 returnRef.set(ee);
246 ObjectBase::asyncUnlock();
Jason Sams81549542010-02-17 15:38:10 -0800247 return ee;
248 }
249 }
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700250 ObjectBase::asyncUnlock();
Jason Sams81549542010-02-17 15:38:10 -0800251
Tim Murray665eafe2014-07-01 10:04:48 -0700252 // Element objects must use allocator specified by the driver
253 void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Element), 0);
254 if (!allocMem) {
255 rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Element");
Chris Wailes44bef6f2014-08-12 13:51:10 -0700256 return nullptr;
Tim Murray665eafe2014-07-01 10:04:48 -0700257 }
258
259 Element *e = new (allocMem) Element(rsc);
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700260 returnRef.set(e);
Jason Samsd01d9702009-12-23 14:35:29 -0800261 e->mComponent.set(dt, dk, isNorm, vecSize);
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800262 e->compute();
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700263
Tim Murraye3af53b2014-06-10 09:46:51 -0700264#ifdef RS_FIND_OFFSETS
265 ALOGE("pointer for element: %p", e);
266 ALOGE("pointer for element.drv: %p", &e->mHal.drv);
267#endif
268
269
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700270 ObjectBase::asyncLock();
Chris Wailes93d6bc82014-07-28 16:54:38 -0700271 rsc->mStateElement.mElements.push_back(e);
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700272 ObjectBase::asyncUnlock();
273
274 return returnRef;
Jason Sams4815c0d2009-12-15 12:58:36 -0800275}
276
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700277ObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein,
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800278 const char **nin, const size_t * lengths, const uint32_t *asin) {
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700279
280 ObjectBaseRef<const Element> returnRef;
Jason Sams81549542010-02-17 15:38:10 -0800281 // Look for an existing match.
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700282 ObjectBase::asyncLock();
Jason Sams81549542010-02-17 15:38:10 -0800283 for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
284 const Element *ee = rsc->mStateElement.mElements[ct];
285 if (ee->getFieldCount() == count) {
286 bool match = true;
287 for (uint32_t i=0; i < count; i++) {
Jason Samsf313dc32013-07-09 14:29:39 -0700288 size_t len;
289 uint32_t asize = 1;
290 if (lengths) {
291 len = lengths[i];
292 } else {
293 len = strlen(nin[i]);
294 }
295 if (asin) {
296 asize = asin[i];
297 }
298
Jason Sams81549542010-02-17 15:38:10 -0800299 if ((ee->mFields[i].e.get() != ein[i]) ||
Jason Sams48ecf6a2013-07-09 15:35:29 -0700300 (strlen(ee->mFields[i].name) != len) ||
301 strcmp(ee->mFields[i].name, nin[i]) ||
Jason Samsf313dc32013-07-09 14:29:39 -0700302 (ee->mFields[i].arraySize != asize)) {
Jason Sams81549542010-02-17 15:38:10 -0800303 match = false;
304 break;
305 }
306 }
307 if (match) {
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700308 returnRef.set(ee);
309 ObjectBase::asyncUnlock();
310 return returnRef;
Jason Sams81549542010-02-17 15:38:10 -0800311 }
312 }
313 }
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700314 ObjectBase::asyncUnlock();
Jason Sams81549542010-02-17 15:38:10 -0800315
Tim Murray665eafe2014-07-01 10:04:48 -0700316 // Element objects must use allocator specified by the driver
317 void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Element), 0);
318 if (!allocMem) {
319 rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Element");
Chris Wailes44bef6f2014-08-12 13:51:10 -0700320 return nullptr;
Tim Murray665eafe2014-07-01 10:04:48 -0700321 }
322
323 Element *e = new (allocMem) Element(rsc);
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700324 returnRef.set(e);
Jason Sams4815c0d2009-12-15 12:58:36 -0800325 e->mFields = new ElementField_t [count];
326 e->mFieldCount = count;
Jason Sams4815c0d2009-12-15 12:58:36 -0800327 for (size_t ct=0; ct < count; ct++) {
Jason Samsf313dc32013-07-09 14:29:39 -0700328 size_t len;
329 uint32_t asize = 1;
330 if (lengths) {
331 len = lengths[ct];
332 } else {
333 len = strlen(nin[ct]);
334 }
335 if (asin) {
336 asize = asin[ct];
337 }
338
Jason Sams4815c0d2009-12-15 12:58:36 -0800339 e->mFields[ct].e.set(ein[ct]);
Jason Sams48ecf6a2013-07-09 15:35:29 -0700340 e->mFields[ct].name = rsuCopyString(nin[ct], len);
Jason Samsf313dc32013-07-09 14:29:39 -0700341 e->mFields[ct].arraySize = asize;
Jason Sams4815c0d2009-12-15 12:58:36 -0800342 }
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800343 e->compute();
Jason Sams4815c0d2009-12-15 12:58:36 -0800344
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700345 ObjectBase::asyncLock();
Chris Wailes93d6bc82014-07-28 16:54:38 -0700346 rsc->mStateElement.mElements.push_back(e);
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700347 ObjectBase::asyncUnlock();
Jason Sams4815c0d2009-12-15 12:58:36 -0800348
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700349 return returnRef;
Jason Samsb4d35682010-01-04 16:52:27 -0800350}
Jason Samsd01d9702009-12-23 14:35:29 -0800351
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800352void Element::incRefs(const void *ptr) const {
Jason Samse3929c92010-08-09 18:13:33 -0700353 if (!mFieldCount) {
354 if (mComponent.isReference()) {
355 ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
356 ObjectBase *ob = obp[0];
Jason Sams10e5e572010-08-12 12:44:02 -0700357 if (ob) ob->incSysRef();
Jason Samse3929c92010-08-09 18:13:33 -0700358 }
359 return;
360 }
361
362 const uint8_t *p = static_cast<const uint8_t *>(ptr);
363 for (uint32_t i=0; i < mFieldCount; i++) {
364 if (mFields[i].e->mHasReference) {
Alex Sakhartchouk49464a92011-07-12 13:25:14 -0700365 const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
Jason Sams46e45542010-09-02 17:35:23 -0700366 for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
Alex Sakhartchouk49464a92011-07-12 13:25:14 -0700367 mFields[i].e->incRefs(p2);
368 p2 += mFields[i].e->getSizeBytes();
Jason Sams46e45542010-09-02 17:35:23 -0700369 }
Jason Samse3929c92010-08-09 18:13:33 -0700370 }
371 }
372}
373
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800374void Element::decRefs(const void *ptr) const {
Jason Samse3929c92010-08-09 18:13:33 -0700375 if (!mFieldCount) {
376 if (mComponent.isReference()) {
377 ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
378 ObjectBase *ob = obp[0];
Jason Sams10e5e572010-08-12 12:44:02 -0700379 if (ob) ob->decSysRef();
Jason Samse3929c92010-08-09 18:13:33 -0700380 }
381 return;
382 }
383
384 const uint8_t *p = static_cast<const uint8_t *>(ptr);
385 for (uint32_t i=0; i < mFieldCount; i++) {
386 if (mFields[i].e->mHasReference) {
Alex Sakhartchouk49464a92011-07-12 13:25:14 -0700387 const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
Jason Sams46e45542010-09-02 17:35:23 -0700388 for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
Alex Sakhartchouk49464a92011-07-12 13:25:14 -0700389 mFields[i].e->decRefs(p2);
390 p2 += mFields[i].e->getSizeBytes();
Jason Sams46e45542010-09-02 17:35:23 -0700391 }
Jason Samse3929c92010-08-09 18:13:33 -0700392 }
393 }
394}
Jason Samsd01d9702009-12-23 14:35:29 -0800395
Jason Samsa36c50a2014-06-17 12:06:06 -0700396void Element::callUpdateCacheObject(const Context *rsc, void *dstObj) const {
Chris Wailes44bef6f2014-08-12 13:51:10 -0700397 if (rsc->mHal.funcs.element.updateCachedObject != nullptr) {
Jason Samsa36c50a2014-06-17 12:06:06 -0700398 rsc->mHal.funcs.element.updateCachedObject(rsc, this, (rs_element *)dstObj);
399 } else {
400 *((const void **)dstObj) = this;
401 }
402}
403
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800404ElementState::ElementState() {
Jason Sams326e0dd2009-05-22 14:03:28 -0700405}
406
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800407ElementState::~ElementState() {
Jason Sams81549542010-02-17 15:38:10 -0800408 rsAssert(!mElements.size());
Jason Sams326e0dd2009-05-22 14:03:28 -0700409}
410
411/////////////////////////////////////////
Jason Samse5ffb872009-08-09 17:01:55 -0700412//
Jason Sams326e0dd2009-05-22 14:03:28 -0700413
414namespace android {
415namespace renderscript {
416
Jason Samsd01d9702009-12-23 14:35:29 -0800417RsElement rsi_ElementCreate(Context *rsc,
418 RsDataType dt,
419 RsDataKind dk,
420 bool norm,
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800421 uint32_t vecSize) {
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700422 return (RsElement)Element::create(rsc, dt, dk, norm, vecSize);
Jason Sams326e0dd2009-05-22 14:03:28 -0700423}
424
Jason Sams20087472011-05-06 14:14:30 -0700425
Jason Samsd01d9702009-12-23 14:35:29 -0800426RsElement rsi_ElementCreate2(Context *rsc,
Jason Samsd01d9702009-12-23 14:35:29 -0800427 const RsElement * ein,
Alex Sakhartchouk70b83c12011-04-06 10:57:51 -0700428 size_t ein_length,
Jason Sams20087472011-05-06 14:14:30 -0700429
Jason Samsd01d9702009-12-23 14:35:29 -0800430 const char ** names,
Alex Sakhartchouk70b83c12011-04-06 10:57:51 -0700431 size_t nameLengths_length,
Jason Sams20087472011-05-06 14:14:30 -0700432 const size_t * nameLengths,
433
Alex Sakhartchouk70b83c12011-04-06 10:57:51 -0700434 const uint32_t * arraySizes,
435 size_t arraySizes_length) {
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700436 return (RsElement)Element::create(rsc, ein_length, (const Element **)ein,
437 names, nameLengths, arraySizes);
Jason Samsd01d9702009-12-23 14:35:29 -0800438}
439
Alex Sakhartchoukdc763f32010-10-27 14:10:07 -0700440}
441}
442
Tim Murrayc2ce7072013-07-17 18:38:53 -0700443extern "C" void rsaElementGetNativeData(RsContext con, RsElement elem,
Alex Sakhartchoukc700e642011-08-16 13:09:46 -0700444 uint32_t *elemData, uint32_t elemDataSize) {
Alex Sakhartchouk417e6a42010-07-15 11:33:03 -0700445 rsAssert(elemDataSize == 5);
446 // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
447 Element *e = static_cast<Element *>(elem);
448
449 (*elemData++) = (uint32_t)e->getType();
450 (*elemData++) = (uint32_t)e->getKind();
451 (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
452 (*elemData++) = e->getComponent().getVectorSize();
453 (*elemData++) = e->getFieldCount();
Alex Sakhartchouk417e6a42010-07-15 11:33:03 -0700454}
455
Tim Murrayc2ce7072013-07-17 18:38:53 -0700456extern "C" void rsaElementGetSubElements(RsContext con, RsElement elem, uintptr_t *ids,
Tim Murray099bc262013-03-20 16:54:03 -0700457 const char **names, size_t *arraySizes, uint32_t dataSize) {
Alex Sakhartchouk417e6a42010-07-15 11:33:03 -0700458 Element *e = static_cast<Element *>(elem);
459 rsAssert(e->getFieldCount() == dataSize);
460
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800461 for (uint32_t i = 0; i < dataSize; i ++) {
Jason Samsf0c1df42010-10-26 13:09:17 -0700462 e->getField(i)->incUserRef();
Tim Murray099bc262013-03-20 16:54:03 -0700463 ids[i] = (uintptr_t)e->getField(i);
Alex Sakhartchouk417e6a42010-07-15 11:33:03 -0700464 names[i] = e->getFieldName(i);
Alex Sakhartchouk31aca7d2011-10-18 11:08:31 -0700465 arraySizes[i] = e->getFieldArraySize(i);
Alex Sakhartchouk417e6a42010-07-15 11:33:03 -0700466 }
Alex Sakhartchouk417e6a42010-07-15 11:33:03 -0700467}