rsElement.cpp revision e514b45de8561fbc6ef6770845102ca10b0a69d7
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{ 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponents = NULL; 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponentCount = 0; 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 31e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsElement::Element(Context *rsc, uint32_t count) : ObjectBase(rsc) 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponents = new ObjectBaseRef<Component> [count]; 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponentCount = count; 35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 37326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElement::~Element() 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams clear(); 40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 42326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::clear() 43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams delete [] mComponents; 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponents = NULL; 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponentCount = 0; 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Element::setComponent(uint32_t idx, Component *c) 50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!mComponents[idx].get()); 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(idx < mComponentCount); 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams mComponents[idx].set(c); 549397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams c->incUserRef(); 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getSizeBits() const 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t total = 0; 61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (size_t ct=0; ct < mComponentCount; ct++) { 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams total += mComponents[ct]->getBits(); 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return total; 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 67326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Element::getComponentOffsetBits(uint32_t componentNumber) const 68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams size_t offset = 0; 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t ct = 0; ct < componentNumber; ct++) { 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams offset += mComponents[ct]->getBits(); 72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return offset; 74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 76565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Samsuint32_t Element::getGLType() const 77565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams{ 78565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams int bits[4]; 79565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 80565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (mComponentCount > 4) { 81565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 82565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 83565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 84565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams for (uint32_t ct=0; ct < mComponentCount; ct++) { 85565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams bits[ct] = mComponents[ct]->getBits(); 86565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (mComponents[ct]->getType() != Component::UNSIGNED) { 87565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 88565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 89565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (!mComponents[ct]->getIsNormalized()) { 90565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 91565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 92565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 93565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 94565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams switch(mComponentCount) { 95565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 1: 96565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (bits[0] == 8) { 97565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_BYTE; 98565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 99565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 100565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 2: 101565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 8) && 102565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 8)) { 103565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_BYTE; 104565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 105565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 106565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 3: 107565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 8) && 108565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 8) && 109565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 8)) { 110565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_BYTE; 111565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 112565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 5) && 113565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 6) && 114565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 5)) { 115565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_SHORT_5_6_5; 116565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 117565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 118565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 4: 119565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 8) && 120565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 8) && 121565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 8) && 122565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[3] == 8)) { 123565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_BYTE; 124565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 125565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 4) && 126565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 4) && 127565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 4) && 128565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[3] == 4)) { 129565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_SHORT_4_4_4_4; 130565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 131565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((bits[0] == 5) && 132565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[1] == 5) && 133565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[2] == 5) && 134565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (bits[3] == 1)) { 135565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_UNSIGNED_SHORT_5_5_5_1; 136565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 137565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 138565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 139565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams} 140565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 141565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Samsuint32_t Element::getGLFormat() const 142565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams{ 143565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams switch(mComponentCount) { 144565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 1: 145565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (mComponents[0]->getKind() == Component::ALPHA) { 146565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_ALPHA; 147565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 148565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (mComponents[0]->getKind() == Component::LUMINANCE) { 149565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_LUMINANCE; 150565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 151565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams break; 152565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 2: 153565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((mComponents[0]->getKind() == Component::LUMINANCE) && 154565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[1]->getKind() == Component::ALPHA)) { 155565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_LUMINANCE_ALPHA; 156565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 157565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams break; 158565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 3: 159565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((mComponents[0]->getKind() == Component::RED) && 160565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[1]->getKind() == Component::GREEN) && 161565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[2]->getKind() == Component::BLUE)) { 162565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_RGB; 163565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 164565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams break; 165565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams case 4: 166565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if ((mComponents[0]->getKind() == Component::RED) && 167565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[1]->getKind() == Component::GREEN) && 168565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[2]->getKind() == Component::BLUE) && 169565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams (mComponents[3]->getKind() == Component::ALPHA)) { 170565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return GL_RGBA; 171565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 172565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams break; 173565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 174565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return 0; 175565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams} 176565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 177565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 178326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::ElementState() 179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 182326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsElementState::~ElementState() 183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////////////////////////////// 187e5ffb879ae535a899a486285a23bea05e912480fJason Sams// 188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 189326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 190326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 192326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ElementBegin(Context *rsc) 193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateElement.mComponentBuildList.clear(); 195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1978b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Samsvoid rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits, const char *name) 198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState * sec = &rsc->mStateElement; 200e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Component *c = new Component(rsc, 201e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams static_cast<Component::DataKind>(dk), 202e5ffb879ae535a899a486285a23bea05e912480fJason Sams static_cast<Component::DataType>(dt), 203e5ffb879ae535a899a486285a23bea05e912480fJason Sams isNormalized, 2048b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams bits, 2058b2c065dfc16c148e2829a19e83d2269b9bcd4ccJason Sams name); 206e5ffb879ae535a899a486285a23bea05e912480fJason Sams sec->mComponentBuildList.add(c); 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 209326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsElement rsi_ElementCreate(Context *rsc) 210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ElementState * sec = &rsc->mStateElement; 212e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams Element *se = new Element(rsc, sec->mComponentBuildList.size()); 213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (size_t ct = 0; ct < se->getComponentCount(); ct++) { 215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams se->setComponent(ct, sec->mComponentBuildList[ct]); 216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsc->mStateElement.mComponentBuildList.clear(); 2199397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams se->incUserRef(); 220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return se; 221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 226