• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
21 using namespace android;
22 using namespace android::renderscript;
23 
24 
Element(Context * rsc)25 Element::Element(Context *rsc) : ObjectBase(rsc)
26 {
27     mAllocFile = __FILE__;
28     mAllocLine = __LINE__;
29     mComponents = NULL;
30     mComponentCount = 0;
31 }
32 
Element(Context * rsc,uint32_t count)33 Element::Element(Context *rsc, uint32_t count) : ObjectBase(rsc)
34 {
35     mAllocFile = __FILE__;
36     mAllocLine = __LINE__;
37     mComponents = new ObjectBaseRef<Component> [count];
38     mComponentCount = count;
39 }
40 
~Element()41 Element::~Element()
42 {
43     clear();
44 }
45 
clear()46 void Element::clear()
47 {
48     delete [] mComponents;
49     mComponents = NULL;
50     mComponentCount = 0;
51 }
52 
setComponent(uint32_t idx,Component * c)53 void Element::setComponent(uint32_t idx, Component *c)
54 {
55     rsAssert(!mComponents[idx].get());
56     rsAssert(idx < mComponentCount);
57     mComponents[idx].set(c);
58 
59 // Fixme: This should probably not be here
60     c->incUserRef();
61 }
62 
63 
getSizeBits() const64 size_t Element::getSizeBits() const
65 {
66     size_t total = 0;
67     for (size_t ct=0; ct < mComponentCount; ct++) {
68         total += mComponents[ct]->getBits();
69     }
70     return total;
71 }
72 
getComponentOffsetBits(uint32_t componentNumber) const73 size_t Element::getComponentOffsetBits(uint32_t componentNumber) const
74 {
75     size_t offset = 0;
76     for (uint32_t ct = 0; ct < componentNumber; ct++) {
77         offset += mComponents[ct]->getBits();
78     }
79     return offset;
80 }
81 
getGLType() const82 uint32_t Element::getGLType() const
83 {
84     int bits[4];
85 
86     if (mComponentCount > 4) {
87         return 0;
88     }
89 
90     for (uint32_t ct=0; ct < mComponentCount; ct++) {
91         bits[ct] = mComponents[ct]->getBits();
92         if (mComponents[ct]->getType() != Component::UNSIGNED) {
93             return 0;
94         }
95         if (!mComponents[ct]->getIsNormalized()) {
96             return 0;
97         }
98     }
99 
100     switch(mComponentCount) {
101     case 1:
102         if (bits[0] == 8) {
103             return GL_UNSIGNED_BYTE;
104         }
105         return 0;
106     case 2:
107         if ((bits[0] == 8) &&
108             (bits[1] == 8)) {
109             return GL_UNSIGNED_BYTE;
110         }
111         return 0;
112     case 3:
113         if ((bits[0] == 8) &&
114             (bits[1] == 8) &&
115             (bits[2] == 8)) {
116             return GL_UNSIGNED_BYTE;
117         }
118         if ((bits[0] == 5) &&
119             (bits[1] == 6) &&
120             (bits[2] == 5)) {
121             return GL_UNSIGNED_SHORT_5_6_5;
122         }
123         return 0;
124     case 4:
125         if ((bits[0] == 8) &&
126             (bits[1] == 8) &&
127             (bits[2] == 8) &&
128             (bits[3] == 8)) {
129             return GL_UNSIGNED_BYTE;
130         }
131         if ((bits[0] == 4) &&
132             (bits[1] == 4) &&
133             (bits[2] == 4) &&
134             (bits[3] == 4)) {
135             return GL_UNSIGNED_SHORT_4_4_4_4;
136         }
137         if ((bits[0] == 5) &&
138             (bits[1] == 5) &&
139             (bits[2] == 5) &&
140             (bits[3] == 1)) {
141             return GL_UNSIGNED_SHORT_5_5_5_1;
142         }
143     }
144     return 0;
145 }
146 
getGLFormat() const147 uint32_t Element::getGLFormat() const
148 {
149     switch(mComponentCount) {
150     case 1:
151         if (mComponents[0]->getKind() == Component::ALPHA) {
152             return GL_ALPHA;
153         }
154         if (mComponents[0]->getKind() == Component::LUMINANCE) {
155             return GL_LUMINANCE;
156         }
157         break;
158     case 2:
159         if ((mComponents[0]->getKind() == Component::LUMINANCE) &&
160             (mComponents[1]->getKind() == Component::ALPHA)) {
161             return GL_LUMINANCE_ALPHA;
162         }
163         break;
164     case 3:
165         if ((mComponents[0]->getKind() == Component::RED) &&
166             (mComponents[1]->getKind() == Component::GREEN) &&
167             (mComponents[2]->getKind() == Component::BLUE)) {
168             return GL_RGB;
169         }
170         break;
171     case 4:
172         if ((mComponents[0]->getKind() == Component::RED) &&
173             (mComponents[1]->getKind() == Component::GREEN) &&
174             (mComponents[2]->getKind() == Component::BLUE) &&
175             (mComponents[3]->getKind() == Component::ALPHA)) {
176             return GL_RGBA;
177         }
178         break;
179     }
180     return 0;
181 }
182 
183 
dumpLOGV(const char * prefix) const184 void Element::dumpLOGV(const char *prefix) const
185 {
186     ObjectBase::dumpLOGV(prefix);
187     LOGV("%s   Element: components %i,  size %i", prefix, mComponentCount, getSizeBytes());
188     for (uint32_t ct = 0; ct < mComponentCount; ct++) {
189         char buf[1024];
190         sprintf(buf, "%s component %i: ", prefix, ct);
191         mComponents[ct]->dumpLOGV(buf);
192     }
193 }
194 
ElementState()195 ElementState::ElementState()
196 {
197 }
198 
~ElementState()199 ElementState::~ElementState()
200 {
201 }
202 
203 /////////////////////////////////////////
204 //
205 
206 namespace android {
207 namespace renderscript {
208 
rsi_ElementBegin(Context * rsc)209 void rsi_ElementBegin(Context *rsc)
210 {
211     rsc->mStateElement.mComponentBuildList.clear();
212 }
213 
rsi_ElementAdd(Context * rsc,RsDataKind dk,RsDataType dt,bool isNormalized,size_t bits,const char * name)214 void rsi_ElementAdd(Context *rsc, RsDataKind dk, RsDataType dt, bool isNormalized, size_t bits, const char *name)
215 {
216     ElementState * sec = &rsc->mStateElement;
217 
218     rsAssert(bits > 0);
219 
220     Component *c = new Component(rsc,
221                                  static_cast<Component::DataKind>(dk),
222                                  static_cast<Component::DataType>(dt),
223                                  isNormalized,
224                                  bits,
225                                  name);
226     sec->mComponentBuildList.add(c);
227 }
228 
rsi_ElementCreate(Context * rsc)229 RsElement rsi_ElementCreate(Context *rsc)
230 {
231     ElementState * sec = &rsc->mStateElement;
232     Element *se = new Element(rsc, sec->mComponentBuildList.size());
233 
234     rsAssert(se->getComponentCount() > 0);
235 
236     for (size_t ct = 0; ct < se->getComponentCount(); ct++) {
237         se->setComponent(ct, sec->mComponentBuildList[ct]);
238     }
239 
240     rsc->mStateElement.mComponentBuildList.clear();
241     se->incUserRef();
242     return se;
243 }
244 
245 
246 }
247 }
248