rsElement.cpp revision 54929cce0bf44090424b1f91b676529a2422378f
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; 334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFields = NULL; 344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 35e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mHasReference = false; 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 39326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element() 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 418154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) { 428154954868694e1f233d87d4933a474518b1cb81Jason Sams if (mRSC->mStateElement.mElements[ct] == this) { 438154954868694e1f233d87d4933a474518b1cb81Jason Sams mRSC->mStateElement.mElements.removeAt(ct); 448154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 458154954868694e1f233d87d4933a474518b1cb81Jason Sams } 468154954868694e1f233d87d4933a474518b1cb81Jason Sams } 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear() 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 524815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams delete [] mFields; 534815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFields = NULL; 544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 55e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams mHasReference = false; 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 604815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (!mFieldCount) { 614815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return mBits; 624815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 634815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t total = 0; 654815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < mFieldCount; ct++) { 6639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk total += mFields[ct].e->mBits * mFields[ct].arraySize; 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return total; 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 71e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Element::dumpLOGV(const char *prefix) const 72e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{ 73e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams ObjectBase::dumpLOGV(prefix); 74963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk LOGV("%s Element: fieldCount: %i, size bytes: %i", prefix, mFieldCount, getSizeBytes()); 754815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (uint32_t ct = 0; ct < mFieldCount; ct++) { 76963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk LOGV("%s Element field index: %u ------------------", prefix, ct); 77963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk LOGV("%s name: %s, offsetBits: %u, arraySize: %u", 78963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk prefix, mFields[ct].name.string(), mFields[ct].offsetBits, mFields[ct].arraySize); 79963bb455b6130fac7a93e2352a4910e446a65a71Alex Sakhartchouk mFields[ct].e->dumpLOGV(prefix); 80e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams } 81e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams} 82e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 83fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid Element::serialize(OStream *stream) const 84fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 85fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 86fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 87fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 88fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 89fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 91fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mComponent.serialize(stream); 92fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 93fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now serialize all the fields 94fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mFieldCount); 95fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t ct = 0; ct < mFieldCount; ct++) { 96fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&mFields[ct].name); 9746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams stream->addU32(mFields[ct].arraySize); 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 117fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mFieldCount = stream->loadU32(); 118fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(elem->mFieldCount) { 119fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mFields = new ElementField_t [elem->mFieldCount]; 120fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for(uint32_t ct = 0; ct < elem->mFieldCount; ct ++) { 121fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&elem->mFields[ct].name); 12246e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams elem->mFields[ct].arraySize = stream->loadU32(); 123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *fieldElem = Element::createFromStream(rsc, stream); 124fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk elem->mFields[ct].e.set(fieldElem); 125fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 126fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 127fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 128fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // We need to check if this already exists 129fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 130fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Element *ee = rsc->mStateElement.mElements[ct]; 131383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(ee->isEqual(elem)) { 132225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams ObjectBase::checkDelete(elem); 133383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk ee->incUserRef(); 134383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return ee; 135fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 136fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 137fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 13854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk elem->compute(); 139fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk rsc->mStateElement.mElements.push(elem); 140fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return elem; 141fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 143383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukbool Element::isEqual(const Element *other) const { 144383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if(other == NULL) { 145383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 146383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 147383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if (!other->getFieldCount() && !mFieldCount) { 148383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if((other->getType() == getType()) && 149383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->getKind() == getKind()) && 150383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->getComponent().getIsNormalized() == getComponent().getIsNormalized()) && 151383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->getComponent().getVectorSize() == getComponent().getVectorSize())) { 152383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return true; 153383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 154383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 155383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 156383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if (other->getFieldCount() == mFieldCount) { 157383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk for (uint32_t i=0; i < mFieldCount; i++) { 158383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk if ((!other->mFields[i].e->isEqual(mFields[i].e.get())) || 159383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->mFields[i].name.length() != mFields[i].name.length()) || 160383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->mFields[i].name != mFields[i].name) || 161383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk (other->mFields[i].arraySize != mFields[i].arraySize)) { 162383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 163383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 164383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 165383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return true; 166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk } 167383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk return false; 168383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk} 169d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 17054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Element::compute() { 17154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(mFieldCount == 0) { 17254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mBits = mComponent.getBits(); 17354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mHasReference = mComponent.isReference(); 17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return; 17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 17754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk size_t bits = 0; 17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (size_t ct=0; ct < mFieldCount; ct++) { 17954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mFields[ct].offsetBits = bits; 18054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize; 18154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 18254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (mFields[ct].e->mHasReference) { 18354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mHasReference = true; 18454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 18554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 18654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 18754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 18854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 1898154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk, 190d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool isNorm, uint32_t vecSize) 1914815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 1928154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 1938154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 1948154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 1958154954868694e1f233d87d4933a474518b1cb81Jason Sams if (!ee->getFieldCount() && 1968154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getType() == dt) && 1978154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getKind() == dk) && 1988154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getIsNormalized() == isNorm) && 1998154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getVectorSize() == vecSize)) { 2008154954868694e1f233d87d4933a474518b1cb81Jason Sams // Match 2018154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 2028154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 2038154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2048154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2058154954868694e1f233d87d4933a474518b1cb81Jason Sams 2064815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 207d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mComponent.set(dt, dk, isNorm, vecSize); 20854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->compute(); 2098154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 2104815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 2114815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2124815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 2138154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein, 21446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const char **nin, const size_t * lengths, const uint32_t *asin) 2154815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 2168154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 2178154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 2188154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 2198154954868694e1f233d87d4933a474518b1cb81Jason Sams if (ee->getFieldCount() == count) { 2208154954868694e1f233d87d4933a474518b1cb81Jason Sams bool match = true; 2218154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t i=0; i < count; i++) { 2228154954868694e1f233d87d4933a474518b1cb81Jason Sams if ((ee->mFields[i].e.get() != ein[i]) || 2238154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->mFields[i].name.length() != lengths[i]) || 22446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].name != nin[i]) || 22546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams (ee->mFields[i].arraySize != asin[i])) { 2268154954868694e1f233d87d4933a474518b1cb81Jason Sams match = false; 2278154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 2288154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2298154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2308154954868694e1f233d87d4933a474518b1cb81Jason Sams if (match) { 2318154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 2328154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 2338154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2348154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2358154954868694e1f233d87d4933a474518b1cb81Jason Sams } 2368154954868694e1f233d87d4933a474518b1cb81Jason Sams 2374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 2384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields = new ElementField_t [count]; 2394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFieldCount = count; 2404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < count; ct++) { 2414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].e.set(ein[ct]); 2424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].name.setTo(nin[ct], lengths[ct]); 24346e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams e->mFields[ct].arraySize = asin[ct]; 2444815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 24554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk e->compute(); 2464815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 2478154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 2484815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 2494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 2504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 251b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const 252b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{ 253b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams String8 s; 254b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 255b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(" "); 256b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 257b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 258b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams if (!mFieldCount) { 259b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams // Basic component. 260b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(mComponent.getGLSLType()); 261b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } else { 262b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(0); 263b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append("struct "); 264b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append(getCStructBody(indent)); 265b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 266b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 267b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams return s; 268b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams} 269d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 270e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::incRefs(const void *ptr) const 271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{ 272e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 273e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 274e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 27610e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->incSysRef(); 277e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 278e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 279e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 280e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 281e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 282e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 283e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 28446e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p = &p[mFields[i].offsetBits >> 3]; 28546e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 28646e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams mFields[i].e->incRefs(p); 28746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p += mFields[i].e->getSizeBytes(); 28846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 289e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 290e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 291e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 292e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 293e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Samsvoid Element::decRefs(const void *ptr) const 294e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams{ 295e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (!mFieldCount) { 296e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mComponent.isReference()) { 297e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr); 298e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ObjectBase *ob = obp[0]; 29910e5e570bab66a6cd543c857b26c576795eb240fJason Sams if (ob) ob->decSysRef(); 300e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 301e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams return; 302e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 303e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 304e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 305e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams for (uint32_t i=0; i < mFieldCount; i++) { 306e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mFields[i].e->mHasReference) { 30746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p = &p[mFields[i].offsetBits >> 3]; 30846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) { 30946e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams mFields[i].e->decRefs(p); 31046e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams p += mFields[i].e->getSizeBytes(); 31146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams } 312e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 313e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 314e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 315d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 3164815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 317326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState() 318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 319e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const uint32_t initialCapacity = 32; 320e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderElements.setCapacity(initialCapacity); 321e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameStrings.setCapacity(initialCapacity); 322e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameLengths.setCapacity(initialCapacity); 323e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderArrays.setCapacity(initialCapacity); 324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 326326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState() 327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 3288154954868694e1f233d87d4933a474518b1cb81Jason Sams rsAssert(!mElements.size()); 329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 331e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukvoid ElementState::elementBuilderBegin() { 332e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderElements.clear(); 333e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameStrings.clear(); 334e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameLengths.clear(); 335e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderArrays.clear(); 336e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk} 337e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 338e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukvoid ElementState::elementBuilderAdd(const Element *e, const char *nameStr, uint32_t arraySize) { 339e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderElements.push(e); 340e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameStrings.push(nameStr); 341e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameLengths.push(strlen(nameStr)); 342e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderArrays.push(arraySize); 343e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 344e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk} 345e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 346e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchoukconst Element *ElementState::elementBuilderCreate(Context *rsc) { 347e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk return Element::create(rsc, mBuilderElements.size(), 348e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk &(mBuilderElements.editArray()[0]), 349e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk &(mBuilderNameStrings.editArray()[0]), 350e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderNameLengths.editArray(), 351e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk mBuilderArrays.editArray()); 352e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk} 353e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 3544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 356e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 358326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 359326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 361d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc, 362d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType dt, 363d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind dk, 364d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool norm, 365d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams uint32_t vecSize) 366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 367d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); 3688154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *e = Element::create(rsc, dt, dk, norm, vecSize); 369d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 3708154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 371d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 3724815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 373d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc, 374d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams size_t count, 375d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const RsElement * ein, 376d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char ** names, 37746e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const size_t * nameLengths, 37846e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const uint32_t * arraySizes) 379d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 380d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate2 %i", count); 38146e45548dc80e801139c9ccc2f2aa927e7f35027Jason Sams const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths, arraySizes); 382d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 3838154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 386dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 387dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 388dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 389dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaElementGetNativeData(RsContext con, RsElement elem, uint32_t *elemData, uint32_t elemDataSize) 390417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{ 391417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(elemDataSize == 5); 392417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements 393417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 394417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 395417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getType(); 396417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = (uint32_t)e->getKind(); 397417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0; 398417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getComponent().getVectorSize(); 399417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk (*elemData++) = e->getFieldCount(); 400417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 401417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 402417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 403dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaElementGetSubElements(RsContext con, RsElement elem, uint32_t *ids, const char **names, uint32_t dataSize) 404417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{ 405417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk Element *e = static_cast<Element *>(elem); 406417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk rsAssert(e->getFieldCount() == dataSize); 407417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 408417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk for(uint32_t i = 0; i < dataSize; i ++) { 409f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams e->getField(i)->incUserRef(); 410417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk ids[i] = (uint32_t)e->getField(i); 411417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk names[i] = e->getFieldName(i); 412417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk } 413417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk 414417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk} 415