rsElement.cpp revision b4d3568f68b1ae97e2a82061cccf220f8e93cd94
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{ 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear() 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams delete [] mFields; 434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFields = NULL; 444815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams mFieldCount = 0; 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams if (!mFieldCount) { 504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return mBits; 514815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 524815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t total = 0; 544815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < mFieldCount; ct++) { 554815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams total += mFields[ct].e->mBits; 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return total; 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 604815c0d121310cfcd6a8aba4eab77a9910af53acJason Samssize_t Element::getFieldOffsetBits(uint32_t componentNumber) const 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t offset = 0; 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t ct = 0; ct < componentNumber; ct++) { 644815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams offset += mFields[ct].e->mBits; 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 69e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Element::dumpLOGV(const char *prefix) const 70e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{ 71e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams ObjectBase::dumpLOGV(prefix); 724815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams LOGV("%s Element: components %i, size %i", prefix, mFieldCount, mBits); 734815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (uint32_t ct = 0; ct < mFieldCount; ct++) { 74e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams char buf[1024]; 75e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams sprintf(buf, "%s component %i: ", prefix, ct); 764815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams //mComponents[ct]->dumpLOGV(buf); 77e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams } 78e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams} 79e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams 80d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 81d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsElement * Element::create(Context *rsc, RsDataType dt, RsDataKind dk, 82d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool isNorm, uint32_t vecSize) 834815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 844815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 85d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mComponent.set(dt, dk, isNorm, vecSize); 86d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->mBits = e->mComponent.getBits(); 874815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 884815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 894815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 90d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsElement * Element::create(Context *rsc, size_t count, const Element **ein, 91d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char **nin, const size_t * lengths) 924815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{ 934815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams Element *e = new Element(rsc); 944815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields = new ElementField_t [count]; 954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFieldCount = count; 964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 974815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams for (size_t ct=0; ct < count; ct++) { 984815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].e.set(ein[ct]); 994815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams e->mFields[ct].name.setTo(nin[ct], lengths[ct]); 1004815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams } 1014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 1024815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams return e; 1034815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams} 1044815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 105d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsString8 Element::getCStructBody(uint32_t indent) const 106d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 107d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams String8 si; 108d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 109d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams si.append(" "); 110d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } 111d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 112d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams String8 s(si); 113d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append("{\n"); 114d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams for (uint32_t ct = 0; ct < mFieldCount; ct++) { 115d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(si); 116d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(mFields[ct].e->getCType(indent+4)); 117d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(" "); 118d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(mFields[ct].name); 119d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(";\n"); 120d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } 121d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(si); 122d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append("}"); 123d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams return s; 124d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 125d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 126d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsString8 Element::getCType(uint32_t indent) const 127d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 128d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams String8 s; 129d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 130d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(" "); 131d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } 132d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 133d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams if (!mFieldCount) { 134d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams // Basic component. 135d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(mComponent.getCType()); 136d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } else { 137d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append("struct "); 138d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams s.append(getCStructBody(indent)); 139d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams } 140d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 141d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams return s; 142d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 143d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 144b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason SamsString8 Element::getGLSLType(uint32_t indent) const 145b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams{ 146b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams String8 s; 147b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams for (uint32_t ct=0; ct < indent; ct++) { 148b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(" "); 149b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 150b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 151b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams if (!mFieldCount) { 152b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams // Basic component. 153b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams s.append(mComponent.getGLSLType()); 154b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } else { 155b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams rsAssert(0); 156b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append("struct "); 157b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams //s.append(getCStructBody(indent)); 158b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams } 159b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 160b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams return s; 161b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams} 162d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 163d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams 1644815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 165326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState() 166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 169326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState() 170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1734815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 175e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 177326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 178326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 180d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate(Context *rsc, 181d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataType dt, 182d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams RsDataKind dk, 183d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams bool norm, 184d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams uint32_t vecSize) 185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 186d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize); 187d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams Element *e = Element::create(rsc, dt, dk, norm, vecSize); 188d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 189d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams return e; 190d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams} 1914815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 192d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason SamsRsElement rsi_ElementCreate2(Context *rsc, 193d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams size_t count, 194d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const RsElement * ein, 195d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const char ** names, 196d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams const size_t * nameLengths) 197d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams{ 198d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams //LOGE("rsi_ElementCreate2 %i", count); 199d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths); 200d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams e->incUserRef(); 201d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams return e; 202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 207