rsType.cpp revision d19f10d43aa400e1183aa21a97099d02074131a2
1d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams/*
2d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Copyright (C) 2009 The Android Open Source Project
3d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
4d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * you may not use this file except in compliance with the License.
6d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * You may obtain a copy of the License at
7d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
8d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams *
10d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * Unless required by applicable law or agreed to in writing, software
11d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * See the License for the specific language governing permissions and
14d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams * limitations under the License.
15d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams */
16d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
17d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsContext.h"
18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
19d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android;
20d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android::renderscript;
21d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
22d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsType::Type()
23d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mLODs = 0;
25d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mLODCount = 0;
26d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    clear();
27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
28d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
29d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsType::~Type()
30d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
31d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mLODs) {
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        delete [] mLODs;
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
36d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::clear()
37d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mLODs) {
39d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        delete [] mLODs;
40d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs = NULL;
41d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
42d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimX = 0;
43d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimY = 0;
44d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimZ = 0;
45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimLOD = 0;
46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mFaces = false;
47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mElement.clear();
48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
50d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::TypeState()
51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
52d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
54d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::~TypeState()
55d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
56d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
57d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
58d19f10d43aa400e1183aa21a97099d02074131a2Jason Samssize_t Type::getOffsetForFace(uint32_t face) const
59d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
60d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    rsAssert(mFaces);
61d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return 0;
62d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
63d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
64d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::compute()
65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
66d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //LOGE("compute");
67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t oldLODCount = mLODCount;
68d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mDimLOD) {
69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        uint32_t l2x = rsFindHighBit(mDimX) + 1;
70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        uint32_t l2y = rsFindHighBit(mDimY) + 1;
71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        uint32_t l2z = rsFindHighBit(mDimZ) + 1;
72d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODCount = rsMax(l2x, l2y);
74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODCount = rsMax(mLODCount, l2z);
75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    } else {
76d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODCount = 1;
77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
78d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mLODCount != oldLODCount) {
79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        delete [] mLODs;
80d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs = new LOD[mLODCount];
81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //LOGE("xyz %i %i %i", mDimX, mDimY, mDimZ);
84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //LOGE("mips %i", mLODCount);
85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //LOGE("e size %i", mElement->getSizeBytes());
86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t tx = mDimX;
87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t ty = mDimY;
88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t tz = mDimZ;
89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t offset = 0;
90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for (uint32_t lod=0; lod < mLODCount; lod++) {
91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mX = tx;
92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mY = ty;
93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mZ = tz;
94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mOffset = offset;
95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        //LOGE("txyz %i %i %i", tx, ty, tz);
96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        tx >>= 1;
98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        ty >>= 1;
99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        tz >>= 1;
100d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
101d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
102d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    //LOGE("size %i", offset);
103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // At this point the offset is the size of a mipmap chain;
105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mMipChainSizeBytes = offset;
106d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
107d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mFaces) {
108d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        offset *= 6;
109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mTotalSizeBytes = offset;
111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
114d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const
115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
116d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t offset = mLODs[lod].mOffset;
117d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    offset += x * mElement->getSizeBytes();
118d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return offset;
119d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
121d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const
122d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t offset = mLODs[lod].mOffset;
124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes();
125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return offset;
126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
128d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const
129d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t offset = mLODs[lod].mOffset;
131d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes();
132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return offset;
133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
134d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
135d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
136d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams//////////////////////////////////////////////////
137d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams//
138d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android {
139d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript {
140d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
141d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse)
142d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
143d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState * stc = &rsc->mStateType;
144d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
145d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mX = 0;
146d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mY = 0;
147d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mZ = 0;
148d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mLOD = false;
149d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mFaces = false;
150d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mElement.set(static_cast<const Element *>(vse));
151d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
152d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
153d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value)
154d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
155d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState * stc = &rsc->mStateType;
156d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
157d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (dim < 0) {
158d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        //error
159d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
160d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
161d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
162d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
163d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    switch (dim) {
164d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_X:
165d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mX = value;
166d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
167d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_Y:
168d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mY = value;
169d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
170d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_Z:
171d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mZ = value;
172d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
173d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_FACE:
174d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mFaces = (value != 0);
175d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
176d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_LOD:
177d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mLOD = (value != 0);
178d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
179d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    default:
180d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
181d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
182d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
183d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
184d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0;
185d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if ((dim < 0) || (dim > RS_DIMENSION_MAX)) {
186d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        LOGE("rsTypeAdd: Bad dimension");
187d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        //error
188d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
189d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
190d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
191d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // todo: implement array support
192d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
193d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
194d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
195d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsRsType rsi_TypeCreate(Context *rsc)
196d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
197d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState * stc = &rsc->mStateType;
198d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
199d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    Type * st = new Type();
200d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimX(stc->mX);
201d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimY(stc->mY);
202d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimZ(stc->mZ);
203d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setElement(stc->mElement.get());
204d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimLOD(stc->mLOD);
205d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimFaces(stc->mFaces);
206d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->compute();
207d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
208d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mAllTypes.add(st);
209d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
210d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return st;
211d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
212d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
213d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeDestroy(Context *rsc, RsType vst)
214d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
215d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState * stc = &rsc->mStateType;
216d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    Type * st = static_cast<Type *>(vst);
217d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
218d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for (size_t ct = 0; ct < stc->mAllTypes.size(); ct++) {
219d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        if (stc->mAllTypes[ct] == st) {
220d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            stc->mAllTypes.removeAt(ct);
221d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams            break;
222d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        }
223d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
224d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    delete st;
225d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
226d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
227d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
228d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
229d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
230