blob: 207ad15e044ac88be24410d8c8d1b67e0ee4fe19 [file] [log] [blame]
Jason Sams326e0dd2009-05-22 14:03:28 -07001/*
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
Jason Sams565ac362009-06-03 16:04:54 -070019#include <GLES/gl.h>
20
Jason Sams326e0dd2009-05-22 14:03:28 -070021using namespace android;
22using namespace android::renderscript;
23
Jason Sams326e0dd2009-05-22 14:03:28 -070024
Jason Samse514b452009-09-25 14:51:22 -070025Element::Element(Context *rsc) : ObjectBase(rsc)
Jason Sams326e0dd2009-05-22 14:03:28 -070026{
Jason Sams4815c0d2009-12-15 12:58:36 -080027 mBits = 0;
Jason Samsf2649a92009-09-25 16:37:33 -070028 mAllocFile = __FILE__;
29 mAllocLine = __LINE__;
Jason Sams4815c0d2009-12-15 12:58:36 -080030 mFields = NULL;
31 mFieldCount = 0;
Jason Sams326e0dd2009-05-22 14:03:28 -070032}
33
Jason Sams326e0dd2009-05-22 14:03:28 -070034
35Element::~Element()
36{
37 clear();
38}
39
40void Element::clear()
41{
Jason Sams4815c0d2009-12-15 12:58:36 -080042 delete [] mFields;
43 mFields = NULL;
44 mFieldCount = 0;
Jason Sams326e0dd2009-05-22 14:03:28 -070045}
Jason Sams326e0dd2009-05-22 14:03:28 -070046
47size_t Element::getSizeBits() const
48{
Jason Sams4815c0d2009-12-15 12:58:36 -080049 if (!mFieldCount) {
50 return mBits;
51 }
52
Jason Sams326e0dd2009-05-22 14:03:28 -070053 size_t total = 0;
Jason Sams4815c0d2009-12-15 12:58:36 -080054 for (size_t ct=0; ct < mFieldCount; ct++) {
55 total += mFields[ct].e->mBits;
Jason Sams326e0dd2009-05-22 14:03:28 -070056 }
57 return total;
58}
59
Jason Sams4815c0d2009-12-15 12:58:36 -080060size_t Element::getFieldOffsetBits(uint32_t componentNumber) const
Jason Sams326e0dd2009-05-22 14:03:28 -070061{
62 size_t offset = 0;
63 for (uint32_t ct = 0; ct < componentNumber; ct++) {
Jason Sams4815c0d2009-12-15 12:58:36 -080064 offset += mFields[ct].e->mBits;
Jason Sams326e0dd2009-05-22 14:03:28 -070065 }
66 return offset;
67}
68
Jason Samse12c1c52009-09-27 17:50:38 -070069void Element::dumpLOGV(const char *prefix) const
70{
71 ObjectBase::dumpLOGV(prefix);
Jason Sams4815c0d2009-12-15 12:58:36 -080072 LOGV("%s Element: components %i, size %i", prefix, mFieldCount, mBits);
73 for (uint32_t ct = 0; ct < mFieldCount; ct++) {
Jason Samse12c1c52009-09-27 17:50:38 -070074 char buf[1024];
75 sprintf(buf, "%s component %i: ", prefix, ct);
Jason Sams4815c0d2009-12-15 12:58:36 -080076 //mComponents[ct]->dumpLOGV(buf);
Jason Samse12c1c52009-09-27 17:50:38 -070077 }
78}
79
Jason Samsd01d9702009-12-23 14:35:29 -080080
81Element * Element::create(Context *rsc, RsDataType dt, RsDataKind dk,
82 bool isNorm, uint32_t vecSize)
Jason Sams4815c0d2009-12-15 12:58:36 -080083{
84 Element *e = new Element(rsc);
Jason Samsd01d9702009-12-23 14:35:29 -080085 e->mComponent.set(dt, dk, isNorm, vecSize);
86 e->mBits = e->mComponent.getBits();
Jason Sams4815c0d2009-12-15 12:58:36 -080087 return e;
88}
89
Jason Samsd01d9702009-12-23 14:35:29 -080090Element * Element::create(Context *rsc, size_t count, const Element **ein,
91 const char **nin, const size_t * lengths)
Jason Sams4815c0d2009-12-15 12:58:36 -080092{
93 Element *e = new Element(rsc);
94 e->mFields = new ElementField_t [count];
95 e->mFieldCount = count;
96
97 for (size_t ct=0; ct < count; ct++) {
98 e->mFields[ct].e.set(ein[ct]);
99 e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
100 }
101
102 return e;
103}
104
Jason Samsd01d9702009-12-23 14:35:29 -0800105String8 Element::getCStructBody(uint32_t indent) const
106{
107 String8 si;
108 for (uint32_t ct=0; ct < indent; ct++) {
109 si.append(" ");
110 }
111
112 String8 s(si);
113 s.append("{\n");
114 for (uint32_t ct = 0; ct < mFieldCount; ct++) {
115 s.append(si);
116 s.append(mFields[ct].e->getCType(indent+4));
117 s.append(" ");
118 s.append(mFields[ct].name);
119 s.append(";\n");
120 }
121 s.append(si);
122 s.append("}");
123 return s;
124}
125
126String8 Element::getCType(uint32_t indent) const
127{
128 String8 s;
129 for (uint32_t ct=0; ct < indent; ct++) {
130 s.append(" ");
131 }
132
133 if (!mFieldCount) {
134 // Basic component.
135 s.append(mComponent.getCType());
136 } else {
137 s.append("struct ");
138 s.append(getCStructBody(indent));
139 }
140
141 return s;
142}
143
Jason Samsb4d35682010-01-04 16:52:27 -0800144String8 Element::getGLSLType(uint32_t indent) const
145{
146 String8 s;
147 for (uint32_t ct=0; ct < indent; ct++) {
148 s.append(" ");
149 }
150
151 if (!mFieldCount) {
152 // Basic component.
153 s.append(mComponent.getGLSLType());
154 } else {
155 rsAssert(0);
156 //s.append("struct ");
157 //s.append(getCStructBody(indent));
158 }
159
160 return s;
161}
Jason Samsd01d9702009-12-23 14:35:29 -0800162
163
Jason Sams4815c0d2009-12-15 12:58:36 -0800164
Jason Sams326e0dd2009-05-22 14:03:28 -0700165ElementState::ElementState()
166{
167}
168
169ElementState::~ElementState()
170{
171}
172
Jason Sams4815c0d2009-12-15 12:58:36 -0800173
Jason Sams326e0dd2009-05-22 14:03:28 -0700174/////////////////////////////////////////
Jason Samse5ffb872009-08-09 17:01:55 -0700175//
Jason Sams326e0dd2009-05-22 14:03:28 -0700176
177namespace android {
178namespace renderscript {
179
Jason Samsd01d9702009-12-23 14:35:29 -0800180RsElement rsi_ElementCreate(Context *rsc,
181 RsDataType dt,
182 RsDataKind dk,
183 bool norm,
184 uint32_t vecSize)
Jason Sams326e0dd2009-05-22 14:03:28 -0700185{
Jason Samsd01d9702009-12-23 14:35:29 -0800186 //LOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
187 Element *e = Element::create(rsc, dt, dk, norm, vecSize);
188 e->incUserRef();
189 return e;
Jason Sams326e0dd2009-05-22 14:03:28 -0700190}
191
Jason Samsd01d9702009-12-23 14:35:29 -0800192RsElement rsi_ElementCreate2(Context *rsc,
193 size_t count,
194 const RsElement * ein,
195 const char ** names,
196 const size_t * nameLengths)
197{
198 //LOGE("rsi_ElementCreate2 %i", count);
199 Element *e = Element::create(rsc, count, (const Element **)ein, names, nameLengths);
200 e->incUserRef();
201 return e;
202}
203
Jason Sams326e0dd2009-05-22 14:03:28 -0700204
205}
206}