rsElement.cpp revision 10e5e570bab66a6cd543c857b26c576795eb240f
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++) { 684815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams total += mFields[ct].e->mBits; 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); 98fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mFields[ct].e->serialize(stream); 99fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 100fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 101fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 102fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukElement *Element::createFromStream(Context *rsc, IStream *stream) 103fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 104fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 105b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if(classID != RS_A3D_CLASS_ID_ELEMENT) { 107fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("element loading skipped due to invalid class id\n"); 108fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 109fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 110fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 111fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 112fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 113fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 114fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *elem = new Element(rsc); 115fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mComponent.loadFromStream(stream); 116fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mBits = elem->mComponent.getBits(); 117e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk elem->mHasReference = elem->mComponent.isReference(); 118fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mFieldCount = stream->loadU32(); 120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(elem->mFieldCount) { 121e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t offset = 0; 122fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mFields = new ElementField_t [elem->mFieldCount]; 123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) { 124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&elem->mFields[ct].name); 125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *fieldElem = Element::createFromStream(rsc, stream); 126fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mFields[ct].e.set(fieldElem); 127e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams elem->mFields[ct].offsetBits = offset; 128e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams offset += fieldElem->getSizeBits(); 129e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk // Check if our sub-elements have references 130e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk if(fieldElem->mHasReference) { 131e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk elem->mHasReference = true; 132e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk } 133fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 134fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 135fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 136fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // We need to check if this already exists 137fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 138fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *ee = rsc->mStateElement.mElements[ct]; 139fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 140fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (!ee->getFieldCount() ) { 141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if((ee->getComponent().getType() == elem->getComponent().getType()) && 143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk (ee->getComponent().getKind() == elem->getComponent().getKind()) && 144fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk (ee->getComponent().getIsNormalized() == elem->getComponent().getIsNormalized()) && 145fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk (ee->getComponent().getVectorSize() == elem->getComponent().getVectorSize())) { 146fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Match 147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete elem; 148fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk ee->incUserRef(); 149fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return ee; 150fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 152fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } else if (ee->getFieldCount() == elem->mFieldCount) { 153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 154fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk bool match = true; 155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t i=0; i < elem->mFieldCount; i++) { 156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if ((ee->mFields[i].e.get() != elem->mFields[i].e.get()) || 157fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk (ee->mFields[i].name.length() != elem->mFields[i].name.length()) || 158fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk (ee->mFields[i].name != elem->mFields[i].name)) { 159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk match = false; 160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk break; 161fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 162fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (match) { 164fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete elem; 165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk ee->incUserRef(); 166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return ee; 167fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 168fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 169fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk rsc->mStateElement.mElements.push(elem); 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return elem; 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 176d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 1778154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk, 178d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool isNorm, uint32_t vecSize) 1794815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 1808154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 1818154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 1828154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 1838154954868694e1f233d87d4933a474518b1cb81Jason Sams if (!ee->getFieldCount() && 1848154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getType() == dt) && 1858154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getKind() == dk) && 1868154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getIsNormalized() == isNorm) && 1878154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getVectorSize() == vecSize)) { 1888154954868694e1f233d87d4933a474518b1cb81Jason Sams // Match 1898154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 1908154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 1918154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1928154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1938154954868694e1f233d87d4933a474518b1cb81Jason Sams 1944815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 195d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mComponent.set(dt, dk, isNorm, vecSize); 196d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mBits = e->mComponent.getBits(); 197e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->mHasReference = e->mComponent.isReference(); 1988154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 1994815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 2004815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 2028154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein, 203d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char **nin, const size_t * lengths) 2044815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 2058154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 2068154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 2078154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 2088154954868694e1f233d87d4933a474518b1cb81Jason Sams if (ee->getFieldCount() == count) { 2098154954868694e1f233d87d4933a474518b1cb81Jason Sams bool match = true; 2108154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t i=0; i < count; i++) { 2118154954868694e1f233d87d4933a474518b1cb81Jason Sams if ((ee->mFields[i].e.get() != ein[i]) || 2128154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->mFields[i].name.length() != lengths[i]) || 2138154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->mFields[i].name != nin[i])) { 2148154954868694e1f233d87d4933a474518b1cb81Jason Sams match = false; 2158154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 2168154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2178154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2188154954868694e1f233d87d4933a474518b1cb81Jason Sams if (match) { 2198154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 2208154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 2218154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2228154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2238154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2248154954868694e1f233d87d4933a474518b1cb81Jason Sams 2254815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 2264815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields = new ElementField_t [count]; 2274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFieldCount = count; 228e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams size_t bits = 0; 2294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < count; ct++) { 2304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].e.set(ein[ct]); 2314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].name.setTo(nin[ct], lengths[ct]); 232e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->mFields[ct].offsetBits = bits; 233e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams bits += ein[ct]->getSizeBits(); 234e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 235e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (ein[ct]->mHasReference) { 236e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->mHasReference = true; 237e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 2384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 2394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 2408154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 2414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 2424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 244b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const 245b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{ 246b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams String8 s; 247b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 248b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(" "); 249b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 250b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 251b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams if (!mFieldCount) { 252b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams // Basic component. 253b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(mComponent.getGLSLType()); 254b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } else { 255b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(0); 256b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append("struct "); 257b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append(getCStructBody(indent)); 258b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 259b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 260b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams return s; 261b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams} 262d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 263e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::incRefs(const void *ptr) const 264e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{ 265e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 266e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 267e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 268e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 26910e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->incSysRef(); 270e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 272e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 273e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 274e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 276e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 277e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mFields[i].e->incRefs(&p[mFields[i].offsetBits >> 3]); 278e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 279e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 280e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 281e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 282e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::decRefs(const void *ptr) const 283e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{ 284e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 285e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 286e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 287e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 28810e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->decSysRef(); 289e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 290e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 291e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 292e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 293e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 294e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 295e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 296e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mFields[i].e->decRefs(&p[mFields[i].offsetBits >> 3]); 297e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 298e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 299e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 300d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 3014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 302326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState() 303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 304326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 306326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState() 307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 3088154954868694e1f233d87d4933a474518b1cb81Jason Sams rsAssert(!mElements.size()); 309326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 310326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3114815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 313e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 315326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 316326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 318d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc, 319d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType dt, 320d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind dk, 321d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool norm, 322d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams uint32_t vecSize) 323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 324d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); 3258154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *e = Element::create(rsc, dt, dk, norm, vecSize); 326d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 3278154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 328d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 3294815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 330d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc, 331d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams size_t count, 332d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const RsElement * ein, 333d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char ** names, 334d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const size_t * nameLengths) 335d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 336d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate2 %i", count); 3378154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths); 338d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 3398154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 342417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetNativeData(Context *rsc, RsElement elem, uint32_t *elemData, uint32_t elemDataSize) 343417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{ 344417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(elemDataSize == 5); 345417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements 346417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 347417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 348417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getType(); 349417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getKind(); 350417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0; 351417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getVectorSize(); 352417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getFieldCount(); 353417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 354417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 355417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 356417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_ElementGetSubElements(Context *rsc, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize) 357417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{ 358417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 359417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(e->getFieldCount() == dataSize); 360417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 361417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk for(uint32_t i = 0; i < dataSize; i ++) { 362417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk ids[i] = (uint32_t)e->getField(i); 363417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk names[i] = e->getFieldName(i); 364417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk } 365417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 366417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 367417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 371