rsType.cpp revision 326e0ddf89e8df2837752fbfd7a014814b32082c
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
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
22326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsType::Type()
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mLODs = 0;
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mLODCount = 0;
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
29326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsType::~Type()
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODs) {
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::clear()
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODs) {
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs = NULL;
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimX = 0;
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimY = 0;
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimZ = 0;
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimLOD = 0;
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mFaces = false;
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mElement.clear();
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
50326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::TypeState()
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
54326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::~TypeState()
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Type::getOffsetForFace(uint32_t face) const
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(mFaces);
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 0;
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::compute()
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("compute");
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t oldLODCount = mLODCount;
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mDimLOD) {
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2x = rsFindHighBit(mDimX) + 1;
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2y = rsFindHighBit(mDimY) + 1;
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2z = rsFindHighBit(mDimZ) + 1;
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = rsMax(l2x, l2y);
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = rsMax(mLODCount, l2z);
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    } else {
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = 1;
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODCount != oldLODCount) {
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs = new LOD[mLODCount];
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("xyz %i %i %i", mDimX, mDimY, mDimZ);
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("mips %i", mLODCount);
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("e size %i", mElement->getSizeBytes());
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t tx = mDimX;
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t ty = mDimY;
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t tz = mDimZ;
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t offset = 0;
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (uint32_t lod=0; lod < mLODCount; lod++) {
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mX = tx;
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mY = ty;
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mZ = tz;
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mOffset = offset;
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //LOGE("txyz %i %i %i", tx, ty, tz);
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        tx >>= 1;
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        ty >>= 1;
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        tz >>= 1;
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("size %i", offset);
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // At this point the offset is the size of a mipmap chain;
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mMipChainSizeBytes = offset;
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mFaces) {
108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        offset *= 6;
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTotalSizeBytes = offset;
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += x * mElement->getSizeBytes();
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes();
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes();
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams//////////////////////////////////////////////////
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams//
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
139326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse)
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mX = 0;
146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mY = 0;
147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mZ = 0;
148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mLOD = false;
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mFaces = false;
150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mElement.set(static_cast<const Element *>(vse));
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
153326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value)
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (dim < 0) {
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    switch (dim) {
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_X:
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mX = value;
166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Y:
168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mY = value;
169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Z:
171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mZ = value;
172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_FACE:
174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mFaces = (value != 0);
175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_LOD:
177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mLOD = (value != 0);
178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    default:
180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0;
185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if ((dim < 0) || (dim > RS_DIMENSION_MAX)) {
186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        LOGE("rsTypeAdd: Bad dimension");
187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
189326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // todo: implement array support
192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
195326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsType rsi_TypeCreate(Context *rsc)
196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
197326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Type * st = new Type();
200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimX(stc->mX);
201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimY(stc->mY);
202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimZ(stc->mZ);
203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setElement(stc->mElement.get());
204326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimLOD(stc->mLOD);
205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimFaces(stc->mFaces);
206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->compute();
207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mAllTypes.add(st);
209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return st;
211326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
213326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeDestroy(Context *rsc, RsType vst)
214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Type * st = static_cast<Type *>(vst);
217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (size_t ct = 0; ct < stc->mAllTypes.size(); ct++) {
219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        if (stc->mAllTypes[ct] == st) {
220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            stc->mAllTypes.removeAt(ct);
221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            break;
222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    delete st;
225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
230