rsElement.cpp revision 0c0ccb01874f41e2028de017ec0d90fb66dbb079
1/* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "rsContext.h" 18 19#include <GLES/gl.h> 20 21using namespace android; 22using namespace android::renderscript; 23 24 25Element::Element(Context *rsc) : ObjectBase(rsc) 26{ 27 mBits = 0; 28 mAllocFile = __FILE__; 29 mAllocLine = __LINE__; 30 mFields = NULL; 31 mFieldCount = 0; 32} 33 34 35Element::~Element() 36{ 37 clear(); 38} 39 40void Element::clear() 41{ 42 delete [] mFields; 43 mFields = NULL; 44 mFieldCount = 0; 45} 46/* 47void Element::setComponent(uint32_t idx, Component *c) 48{ 49 rsAssert(!mComponents[idx].get()); 50 rsAssert(idx < mComponentCount); 51 mComponents[idx].set(c); 52 53// Fixme: This should probably not be here 54 c->incUserRef(); 55} 56*/ 57 58size_t Element::getSizeBits() const 59{ 60 if (!mFieldCount) { 61 return mBits; 62 } 63 64 size_t total = 0; 65 for (size_t ct=0; ct < mFieldCount; ct++) { 66 total += mFields[ct].e->mBits; 67 } 68 return total; 69} 70 71size_t Element::getFieldOffsetBits(uint32_t componentNumber) const 72{ 73 size_t offset = 0; 74 for (uint32_t ct = 0; ct < componentNumber; ct++) { 75 offset += mFields[ct].e->mBits; 76 } 77 return offset; 78} 79 80void Element::dumpLOGV(const char *prefix) const 81{ 82 ObjectBase::dumpLOGV(prefix); 83 LOGV("%s Element: components %i, size %i", prefix, mFieldCount, mBits); 84 for (uint32_t ct = 0; ct < mFieldCount; ct++) { 85 char buf[1024]; 86 sprintf(buf, "%s component %i: ", prefix, ct); 87 //mComponents[ct]->dumpLOGV(buf); 88 } 89} 90 91 92Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk, 93 bool isNorm, uint32_t vecSize) 94{ 95 Element *e = new Element(rsc); 96 e->mComponent.set(dt, dk, isNorm, vecSize); 97 e->mBits = e->mComponent.getBits(); 98 return e; 99} 100 101Element * Element::create(Context *rsc, size_t count, const Element **ein, 102 const char **nin, const size_t * lengths) 103{ 104 Element *e = new Element(rsc); 105 e->mFields = new ElementField_t [count]; 106 e->mFieldCount = count; 107 108 for (size_t ct=0; ct < count; ct++) { 109 e->mFields[ct].e.set(ein[ct]); 110 e->mFields[ct].name.setTo(nin[ct], lengths[ct]); 111 } 112 113 return e; 114} 115 116String8 Element::getCStructBody(uint32_t indent) const 117{ 118 String8 si; 119 for (uint32_t ct=0; ct < indent; ct++) { 120 si.append(" "); 121 } 122 123 String8 s(si); 124 s.append("{\n"); 125 for (uint32_t ct = 0; ct < mFieldCount; ct++) { 126 s.append(si); 127 s.append(mFields[ct].e->getCType(indent+4)); 128 s.append(" "); 129 s.append(mFields[ct].name); 130 s.append(";\n"); 131 } 132 s.append(si); 133 s.append("}"); 134 return s; 135} 136 137String8 Element::getCType(uint32_t indent) const 138{ 139 String8 s; 140 for (uint32_t ct=0; ct < indent; ct++) { 141 s.append(" "); 142 } 143 144 if (!mFieldCount) { 145 // Basic component. 146 s.append(mComponent.getCType()); 147 } else { 148 s.append("struct "); 149 s.append(getCStructBody(indent)); 150 } 151 152 return s; 153} 154 155 156 157 158ElementState::ElementState() 159{ 160} 161 162ElementState::~ElementState() 163{ 164} 165 166 167///////////////////////////////////////// 168// 169 170namespace android { 171namespace renderscript { 172 173RsElement rsi_ElementCreate(Context *rsc, 174 RsDataType dt, 175 RsDataKind dk, 176 bool norm, 177 uint32_t vecSize) 178{ 179 //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); 180 Element *e = Element::create(rsc, dt, dk, norm, vecSize); 181 e->incUserRef(); 182 return e; 183} 184 185RsElement rsi_ElementCreate2(Context *rsc, 186 size_t count, 187 const RsElement * ein, 188 const char ** names, 189 const size_t * nameLengths) 190{ 191 //LOGE("rsi_ElementCreate2 %i", count); 192 Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths); 193 e->incUserRef(); 194 return e; 195} 196 197/* 198void rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits, const char *name) 199{ 200 ElementState * sec = &rsc->mStateElement; 201 202 rsAssert(bits > 0); 203 204 Element *c = Element::create(rsc, dk, dt, isNormalized, bits); 205 sec->mBuildList.add(c); 206 if (name) 207 sec->mNames.add(String8(name)); 208 else 209 sec->mNames.add(String8("")); 210} 211 212RsElement rsi_ElementCreate(Context *rsc) 213{ 214 ElementState * sec = &rsc->mStateElement; 215 216 size_t count = sec->mBuildList.size(); 217 rsAssert(count > 0); 218 219 if (count == 1) { 220 Element *se = sec->mBuildList[0]; 221 se->incUserRef(); 222 sec->mBuildList.clear(); 223 sec->mNames.clear(); 224 return se; 225 } 226 227 Element ** tmpElements = (Element **)calloc(count, sizeof(Element *)); 228 const char ** tmpNames = (const char **)calloc(count, sizeof(char *)); 229 size_t * tmpLengths = (size_t *)calloc(count, sizeof(size_t)); 230 231 232 for (size_t ct = 0; ct < count; ct++) { 233 tmpElements[ct] = sec->mBuildList[ct]; 234 tmpNames[ct] = sec->mNames[ct].string(); 235 tmpLengths[ct] = sec->mNames[ct].length(); 236 } 237 Element *se = Element::create(rsc, tmpElements, tmpNames, tmpLengths, count); 238 239 sec->mBuildList.clear(); 240 sec->mNames.clear(); 241 se->incUserRef(); 242 free(tmpElements); 243 free(tmpNames); 244 free(tmpLengths); 245 return se; 246} 247*/ 248 249 250} 251} 252