rsElement.cpp revision 46e45548dc80e801139c9ccc2f2aa927e7f35027
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++) { 6846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams 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]; 141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (!ee->getFieldCount() ) { 143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 144fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if((ee->getComponent().getType() == elem->getComponent().getType()) && 145fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk (ee->getComponent().getKind() == elem->getComponent().getKind()) && 146fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk (ee->getComponent().getIsNormalized() == elem->getComponent().getIsNormalized()) && 147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk (ee->getComponent().getVectorSize() == elem->getComponent().getVectorSize())) { 148fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Match 149fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete elem; 150fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk ee->incUserRef(); 151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return ee; 152fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 154fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } else if (ee->getFieldCount() == elem->mFieldCount) { 155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk bool match = true; 157fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t i=0; i < elem->mFieldCount; i++) { 158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if ((ee->mFields[i].e.get() != elem->mFields[i].e.get()) || 159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk (ee->mFields[i].name.length() != elem->mFields[i].name.length()) || 16046e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].name != elem->mFields[i].name) || 16146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].arraySize != elem->mFields[i].arraySize)) { 162fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk match = false; 163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk break; 164fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (match) { 167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete elem; 168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk ee->incUserRef(); 169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return ee; 170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk rsc->mStateElement.mElements.push(elem); 176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return elem; 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 179d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 1808154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk, 181d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool isNorm, uint32_t vecSize) 1824815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 1838154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 1848154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 1858154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 1868154954868694e1f233d87d4933a474518b1cb81Jason Sams if (!ee->getFieldCount() && 1878154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getType() == dt) && 1888154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getKind() == dk) && 1898154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getIsNormalized() == isNorm) && 1908154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getVectorSize() == vecSize)) { 1918154954868694e1f233d87d4933a474518b1cb81Jason Sams // Match 1928154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 1938154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 1948154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1958154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1968154954868694e1f233d87d4933a474518b1cb81Jason Sams 1974815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 198d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mComponent.set(dt, dk, isNorm, vecSize); 199d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mBits = e->mComponent.getBits(); 200e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->mHasReference = e->mComponent.isReference(); 2018154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 2024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 2034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2044815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 2058154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein, 20646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const char **nin, const size_t * lengths, const uint32_t *asin) 2074815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 2088154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 2098154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 2108154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 2118154954868694e1f233d87d4933a474518b1cb81Jason Sams if (ee->getFieldCount() == count) { 2128154954868694e1f233d87d4933a474518b1cb81Jason Sams bool match = true; 2138154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t i=0; i < count; i++) { 2148154954868694e1f233d87d4933a474518b1cb81Jason Sams if ((ee->mFields[i].e.get() != ein[i]) || 2158154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->mFields[i].name.length() != lengths[i]) || 21646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].name != nin[i]) || 21746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].arraySize != asin[i])) { 2188154954868694e1f233d87d4933a474518b1cb81Jason Sams match = false; 2198154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 2208154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2218154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2228154954868694e1f233d87d4933a474518b1cb81Jason Sams if (match) { 2238154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 2248154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 2258154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2268154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2278154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2288154954868694e1f233d87d4933a474518b1cb81Jason Sams 2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 2304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields = new ElementField_t [count]; 2314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFieldCount = count; 232e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams size_t bits = 0; 2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < count; ct++) { 2344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].e.set(ein[ct]); 2354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].name.setTo(nin[ct], lengths[ct]); 236e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->mFields[ct].offsetBits = bits; 23746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams e->mFields[ct].arraySize = asin[ct]; 238e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bits += ein[ct]->getSizeBits(); 239e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 240e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (ein[ct]->mHasReference) { 241e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->mHasReference = true; 242e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 2434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 2444815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 2458154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 2464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 2474815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2484815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 249b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const 250b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{ 251b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams String8 s; 252b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 253b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(" "); 254b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 255b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 256b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams if (!mFieldCount) { 257b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams // Basic component. 258b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(mComponent.getGLSLType()); 259b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } else { 260b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(0); 261b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append("struct "); 262b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append(getCStructBody(indent)); 263b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 264b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 265b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams return s; 266b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams} 267d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 268e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::incRefs(const void *ptr) const 269e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{ 270e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 272e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 273e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 27410e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->incSysRef(); 275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 276e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 277e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 278e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 279e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 280e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 281e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 28246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p = &p[mFields[i].offsetBits >> 3]; 28346e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 28446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams mFields[i].e->incRefs(p); 28546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p += mFields[i].e->getSizeBytes(); 28646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 287e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 288e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 289e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 290e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 291e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::decRefs(const void *ptr) const 292e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{ 293e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 294e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 295e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 296e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 29710e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->decSysRef(); 298e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 299e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 300e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 301e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 302e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 303e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 304e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 30546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p = &p[mFields[i].offsetBits >> 3]; 30646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 30746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams mFields[i].e->decRefs(p); 30846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p += mFields[i].e->getSizeBytes(); 30946e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 310e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 311e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 312e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 313d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 3144815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 315326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState() 316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 319326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState() 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 3218154954868694e1f233d87d4933a474518b1cb81Jason Sams rsAssert(!mElements.size()); 322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3244815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 326e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 328326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 329326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 331d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc, 332d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType dt, 333d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind dk, 334d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool norm, 335d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams uint32_t vecSize) 336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 337d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); 3388154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *e = Element::create(rsc, dt, dk, norm, vecSize); 339d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 3408154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 341d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 3424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 343d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc, 344d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams size_t count, 345d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const RsElement * ein, 346d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char ** names, 34746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const size_t * nameLengths, 34846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const uint32_t * arraySizes) 349d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 350d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate2 %i", count); 35146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths, arraySizes); 352d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 3538154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 356417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetNativeData(Context *rsc, RsElement elem, uint32_t *elemData, uint32_t elemDataSize) 357417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{ 358417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(elemDataSize == 5); 359417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements 360417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 361417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 362417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getType(); 363417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getKind(); 364417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0; 365417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getVectorSize(); 366417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getFieldCount(); 367417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 368417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 369417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 370417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetSubElements(Context *rsc, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize) 371417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{ 372417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 373417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(e->getFieldCount() == dataSize); 374417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 375417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk for(uint32_t i = 0; i < dataSize; i ++) { 376417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk ids[i] = (uint32_t)e->getField(i); 377417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk names[i] = e->getFieldName(i); 378417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk } 379417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 380417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 381417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 385