rsElement.cpp revision 8154954868694e1f233d87d4933a474518b1cb81
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#include "rsContext.h" 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 19565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams#include <GLES/gl.h> 20565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 25e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsElement::Element(Context *rsc) : ObjectBase(rsc) 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 274815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mBits = 0; 28f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 29f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFields = NULL; 314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 35326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element() 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 378154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) { 388154954868694e1f233d87d4933a474518b1cb81Jason Sams if (mRSC->mStateElement.mElements[ct] == this) { 398154954868694e1f233d87d4933a474518b1cb81Jason Sams mRSC->mStateElement.mElements.removeAt(ct); 408154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 418154954868694e1f233d87d4933a474518b1cb81Jason Sams } 428154954868694e1f233d87d4933a474518b1cb81Jason Sams } 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear() 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 484815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams delete [] mFields; 494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFields = NULL; 504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 554815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (!mFieldCount) { 564815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return mBits; 574815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 584815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t total = 0; 604815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < mFieldCount; ct++) { 614815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams total += mFields[ct].e->mBits; 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return total; 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 664815c0d121310cfcd6a8aba4eab77a9910af53acJason Samssize_t Element::getFieldOffsetBits(uint32_t componentNumber) const 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t offset = 0; 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t ct = 0; ct < componentNumber; ct++) { 704815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams offset += mFields[ct].e->mBits; 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 75e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Element::dumpLOGV(const char *prefix) const 76e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{ 77e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams ObjectBase::dumpLOGV(prefix); 784815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams LOGV("%s Element: components %i, size %i", prefix, mFieldCount, mBits); 794815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (uint32_t ct = 0; ct < mFieldCount; ct++) { 80e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams char buf[1024]; 81e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams sprintf(buf, "%s component %i: ", prefix, ct); 824815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams //mComponents[ct]->dumpLOGV(buf); 83e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams } 84e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams} 85e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 86d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 878154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk, 88d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool isNorm, uint32_t vecSize) 894815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 908154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 918154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 928154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 938154954868694e1f233d87d4933a474518b1cb81Jason Sams if (!ee->getFieldCount() && 948154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getType() == dt) && 958154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getKind() == dk) && 968154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getIsNormalized() == isNorm) && 978154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->getComponent().getVectorSize() == vecSize)) { 988154954868694e1f233d87d4933a474518b1cb81Jason Sams // Match 998154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 1008154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 1018154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1028154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1038154954868694e1f233d87d4933a474518b1cb81Jason Sams 1044815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 105d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mComponent.set(dt, dk, isNorm, vecSize); 106d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mBits = e->mComponent.getBits(); 1078154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 1084815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 1094815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 1104815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 1118154954868694e1f233d87d4933a474518b1cb81Jason Samsconst Element * Element::create(Context *rsc, size_t count, const Element **ein, 112d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char **nin, const size_t * lengths) 1134815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 1148154954868694e1f233d87d4933a474518b1cb81Jason Sams // Look for an existing match. 1158154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) { 1168154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *ee = rsc->mStateElement.mElements[ct]; 1178154954868694e1f233d87d4933a474518b1cb81Jason Sams if (ee->getFieldCount() == count) { 1188154954868694e1f233d87d4933a474518b1cb81Jason Sams bool match = true; 1198154954868694e1f233d87d4933a474518b1cb81Jason Sams for (uint32_t i=0; i < count; i++) { 1208154954868694e1f233d87d4933a474518b1cb81Jason Sams if ((ee->mFields[i].e.get() != ein[i]) || 1218154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->mFields[i].name.length() != lengths[i]) || 1228154954868694e1f233d87d4933a474518b1cb81Jason Sams (ee->mFields[i].name != nin[i])) { 1238154954868694e1f233d87d4933a474518b1cb81Jason Sams match = false; 1248154954868694e1f233d87d4933a474518b1cb81Jason Sams break; 1258154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1268154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1278154954868694e1f233d87d4933a474518b1cb81Jason Sams if (match) { 1288154954868694e1f233d87d4933a474518b1cb81Jason Sams ee->incUserRef(); 1298154954868694e1f233d87d4933a474518b1cb81Jason Sams return ee; 1308154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1318154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1328154954868694e1f233d87d4933a474518b1cb81Jason Sams } 1338154954868694e1f233d87d4933a474518b1cb81Jason Sams 1344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 1354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields = new ElementField_t [count]; 1364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFieldCount = count; 1374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < count; ct++) { 1384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].e.set(ein[ct]); 1394815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].name.setTo(nin[ct], lengths[ct]); 1404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 1414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 1428154954868694e1f233d87d4933a474518b1cb81Jason Sams rsc->mStateElement.mElements.push(e); 1434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 1444815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 1454815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 146d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsString8 Element::getCStructBody(uint32_t indent) const 147d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 148d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams String8 si; 149d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 150d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams si.append(" "); 151d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } 152d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 153d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams String8 s(si); 154d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append("{\n"); 155d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams for (uint32_t ct = 0; ct < mFieldCount; ct++) { 156d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(si); 157d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(mFields[ct].e->getCType(indent+4)); 158d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(" "); 159d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(mFields[ct].name); 160d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(";\n"); 161d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } 162d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(si); 163d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append("}"); 164d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams return s; 165d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 166d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 167d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsString8 Element::getCType(uint32_t indent) const 168d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 169d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams String8 s; 170d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 171d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(" "); 172d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } 173d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 174d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams if (!mFieldCount) { 175d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams // Basic component. 176d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(mComponent.getCType()); 177d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } else { 178d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append("struct "); 179d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(getCStructBody(indent)); 180d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } 181d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 182d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams return s; 183d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 184d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 185b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const 186b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{ 187b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams String8 s; 188b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 189b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(" "); 190b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 191b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 192b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams if (!mFieldCount) { 193b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams // Basic component. 194b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(mComponent.getGLSLType()); 195b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } else { 196b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(0); 197b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append("struct "); 198b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append(getCStructBody(indent)); 199b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 200b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 201b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams return s; 202b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams} 203d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 204d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 2054815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 206326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState() 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 210326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState() 211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 2128154954868694e1f233d87d4933a474518b1cb81Jason Sams rsAssert(!mElements.size()); 213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 2154815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 217e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 219326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 220326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 222d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc, 223d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType dt, 224d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind dk, 225d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool norm, 226d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams uint32_t vecSize) 227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 228d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); 2298154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *e = Element::create(rsc, dt, dk, norm, vecSize); 230d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 2318154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 232d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 234d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc, 235d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams size_t count, 236d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const RsElement * ein, 237d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char ** names, 238d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const size_t * nameLengths) 239d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 240d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate2 %i", count); 2418154954868694e1f233d87d4933a474518b1cb81Jason Sams const Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths); 242d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 2438154954868694e1f233d87d4933a474518b1cb81Jason Sams return (RsElement)e; 244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 245326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 248326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 249