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