rsElement.cpp revision 39f2ef6fed00a99c5c389e12c4597884027d4858
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 19fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContext.h" 20565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams#include <GLES/gl.h> 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h> 24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 25565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 30e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsElement::Element(Context *rsc) : ObjectBase(rsc) 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 324815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mBits = 0; 33f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 34f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFields = NULL; 364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 37e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mHasReference = false; 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 41326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element() 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 438154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) { 448154954868694e1f233d87d4933a474518b1cb81Jason Sams if (mRSC->mStateElement.mElements[ct] == this) { 458154954868694e1f233d87d4933a474518b1cb81Jason Sams mRSC->mStateElement.mElements.removeAt(ct); 468154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 478154954868694e1f233d87d4933a474518b1cb81Jason Sams } 488154954868694e1f233d87d4933a474518b1cb81Jason Sams } 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear() 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams delete [] mFields; 554815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFields = NULL; 564815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 57e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mHasReference = false; 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 624815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (!mFieldCount) { 634815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return mBits; 644815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t total = 0; 674815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < mFieldCount; ct++) { 6839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk total += mFields[ct].e->mBits * mFields[ct].arraySize; 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return total; 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 73e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Element::dumpLOGV(const char *prefix) const 74e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{ 75e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams ObjectBase::dumpLOGV(prefix); 764815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams LOGV("%s Element: components %i, size %i", prefix, mFieldCount, mBits); 774815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (uint32_t ct = 0; ct < mFieldCount; ct++) { 78e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams char buf[1024]; 79e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams sprintf(buf, "%s component %i: ", prefix, ct); 804815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams //mComponents[ct]->dumpLOGV(buf); 81e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams } 82e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams} 83e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 84fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid Element::serialize(OStream *stream) const 85fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 86fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 87fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 88fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 89fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 91fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 92fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mComponent.serialize(stream); 93fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 94fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now serialize all the fields 95fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mFieldCount); 96fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t ct = 0; ct < mFieldCount; ct++) { 97fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&mFields[ct].name); 9846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams stream->addU32(mFields[ct].arraySize); 99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mFields[ct].e->serialize(stream); 100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 103fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukElement *Element::createFromStream(Context *rsc, IStream *stream) 104fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 105fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 107b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if(classID != RS_A3D_CLASS_ID_ELEMENT) { 108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("element loading skipped due to invalid class id\n"); 109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *elem = new Element(rsc); 116fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mComponent.loadFromStream(stream); 117fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mBits = elem->mComponent.getBits(); 118e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk elem->mHasReference = elem->mComponent.isReference(); 119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mFieldCount = stream->loadU32(); 121fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(elem->mFieldCount) { 122e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t offset = 0; 123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mFields = new ElementField_t [elem->mFieldCount]; 124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) { 125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&elem->mFields[ct].name); 12646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams elem->mFields[ct].arraySize = stream->loadU32(); 127fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *fieldElem = Element::createFromStream(rsc, stream); 128fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mFields[ct].e.set(fieldElem); 129e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams elem->mFields[ct].offsetBits = offset; 130e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams offset += fieldElem->getSizeBits(); 131e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk // Check if our sub-elements have references 132e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk if(fieldElem->mHasReference) { 133e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk elem->mHasReference = true; 134e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk } 135fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 136fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 137fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 138fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // We need to check if this already exists 139fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 140fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *ee = rsc->mStateElement.mElements[ct]; 141383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(ee->isEqual(elem)) { 142383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk delete elem; 143383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk ee->incUserRef(); 144383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return ee; 145fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 146fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 148fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk rsc->mStateElement.mElements.push(elem); 149fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return elem; 150fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 152383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukbool Element::isEqual(const Element *other) const { 153383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(other == NULL) { 154383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 155383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 156383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if (!other->getFieldCount() && !mFieldCount) { 157383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if((other->getType() == getType()) && 158383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->getKind() == getKind()) && 159383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->getComponent().getIsNormalized() == getComponent().getIsNormalized()) && 160383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->getComponent().getVectorSize() == getComponent().getVectorSize())) { 161383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return true; 162383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 163383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 164383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 165383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if (other->getFieldCount() == mFieldCount) { 166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk for (uint32_t i=0; i < mFieldCount; i++) { 167383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if ((!other->mFields[i].e->isEqual(mFields[i].e.get())) || 168383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->mFields[i].name.length() != mFields[i].name.length()) || 169383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->mFields[i].name != mFields[i].name) || 170383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->mFields[i].arraySize != mFields[i].arraySize)) { 171383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 172383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 173383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 174383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return true; 175383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 176383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 177383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk} 178d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 1798154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk, 180d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool isNorm, uint32_t vecSize) 1814815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 1828154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 1838154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 1848154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 1858154954868694e1f233d87d4933a474518b1cb81Jason Sams if (!ee->getFieldCount() && 1868154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getType() == dt) && 1878154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getKind() == dk) && 1888154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getIsNormalized() == isNorm) && 1898154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getVectorSize() == vecSize)) { 1908154954868694e1f233d87d4933a474518b1cb81Jason Sams // Match 1918154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 1928154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 1938154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1948154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1958154954868694e1f233d87d4933a474518b1cb81Jason Sams 1964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 197d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mComponent.set(dt, dk, isNorm, vecSize); 198d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mBits = e->mComponent.getBits(); 199e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->mHasReference = e->mComponent.isReference(); 2008154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 2014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 2024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 2048154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein, 20546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const char **nin, const size_t * lengths, const uint32_t *asin) 2064815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 2078154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 2088154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 2098154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 2108154954868694e1f233d87d4933a474518b1cb81Jason Sams if (ee->getFieldCount() == count) { 2118154954868694e1f233d87d4933a474518b1cb81Jason Sams bool match = true; 2128154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t i=0; i < count; i++) { 2138154954868694e1f233d87d4933a474518b1cb81Jason Sams if ((ee->mFields[i].e.get() != ein[i]) || 2148154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->mFields[i].name.length() != lengths[i]) || 21546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].name != nin[i]) || 21646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].arraySize != asin[i])) { 2178154954868694e1f233d87d4933a474518b1cb81Jason Sams match = false; 2188154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 2198154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2208154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2218154954868694e1f233d87d4933a474518b1cb81Jason Sams if (match) { 2228154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 2238154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 2248154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2258154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2268154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2278154954868694e1f233d87d4933a474518b1cb81Jason Sams 2284815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields = new ElementField_t [count]; 2304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFieldCount = count; 231e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams size_t bits = 0; 2324815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < count; ct++) { 2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].e.set(ein[ct]); 2344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].name.setTo(nin[ct], lengths[ct]); 235e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->mFields[ct].offsetBits = bits; 23646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams e->mFields[ct].arraySize = asin[ct]; 237e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bits += ein[ct]->getSizeBits(); 238e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 239e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (ein[ct]->mHasReference) { 240e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->mHasReference = true; 241e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 2424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 2434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 2448154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 2454815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 2464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2474815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 248b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const 249b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{ 250b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams String8 s; 251b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 252b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(" "); 253b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 254b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 255b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams if (!mFieldCount) { 256b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams // Basic component. 257b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(mComponent.getGLSLType()); 258b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } else { 259b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(0); 260b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append("struct "); 261b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append(getCStructBody(indent)); 262b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 263b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 264b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams return s; 265b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams} 266d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 267e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::incRefs(const void *ptr) const 268e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{ 269e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 270e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 272e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 27310e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->incSysRef(); 274e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 276e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 277e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 278e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 279e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 280e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 28146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p = &p[mFields[i].offsetBits >> 3]; 28246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 28346e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams mFields[i].e->incRefs(p); 28446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p += mFields[i].e->getSizeBytes(); 28546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 286e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 287e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 288e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 289e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 290e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::decRefs(const void *ptr) const 291e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{ 292e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 293e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 294e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 295e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 29610e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->decSysRef(); 297e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 298e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 299e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 300e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 301e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 302e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 303e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 30446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p = &p[mFields[i].offsetBits >> 3]; 30546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 30646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams mFields[i].e->decRefs(p); 30746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p += mFields[i].e->getSizeBytes(); 30846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 309e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 310e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 311e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 312d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 3134815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 314326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState() 315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 316e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const uint32_t initialCapacity = 32; 317e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderElements.setCapacity(initialCapacity); 318e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameStrings.setCapacity(initialCapacity); 319e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameLengths.setCapacity(initialCapacity); 320e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderArrays.setCapacity(initialCapacity); 321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 323326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState() 324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 3258154954868694e1f233d87d4933a474518b1cb81Jason Sams rsAssert(!mElements.size()); 326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 328e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukvoid ElementState::elementBuilderBegin() { 329e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderElements.clear(); 330e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameStrings.clear(); 331e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameLengths.clear(); 332e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderArrays.clear(); 333e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk} 334e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 335e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukvoid ElementState::elementBuilderAdd(const Element *e, const char *nameStr, uint32_t arraySize) { 336e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderElements.push(e); 337e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameStrings.push(nameStr); 338e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameLengths.push(strlen(nameStr)); 339e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderArrays.push(arraySize); 340e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 341e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk} 342e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 343e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukconst Element *ElementState::elementBuilderCreate(Context *rsc) { 344e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return Element::create(rsc, mBuilderElements.size(), 345e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk &(mBuilderElements.editArray()[0]), 346e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk &(mBuilderNameStrings.editArray()[0]), 347e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameLengths.editArray(), 348e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderArrays.editArray()); 349e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk} 350e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 3514815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 353e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 355326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 356326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 358d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc, 359d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType dt, 360d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind dk, 361d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool norm, 362d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams uint32_t vecSize) 363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 364d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); 3658154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *e = Element::create(rsc, dt, dk, norm, vecSize); 366d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 3678154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 368d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 3694815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 370d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc, 371d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams size_t count, 372d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const RsElement * ein, 373d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char ** names, 37446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const size_t * nameLengths, 37546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const uint32_t * arraySizes) 376d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 377d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate2 %i", count); 37846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths, arraySizes); 379d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 3808154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 381326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 383417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetNativeData(Context *rsc, RsElement elem, uint32_t *elemData, uint32_t elemDataSize) 384417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{ 385417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(elemDataSize == 5); 386417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements 387417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 388417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 389417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getType(); 390417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getKind(); 391417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0; 392417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getVectorSize(); 393417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getFieldCount(); 394417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 395417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 396417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 397417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetSubElements(Context *rsc, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize) 398417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{ 399417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 400417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(e->getFieldCount() == dataSize); 401417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 402417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk for(uint32_t i = 0; i < dataSize; i ++) { 403417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk ids[i] = (uint32_t)e->getField(i); 404417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk names[i] = e->getFieldName(i); 405417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk } 406417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 407417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 408417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 410326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 412