rsType.cpp revision aa7d2884cb563f87294003981e03e37a1abeb961
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
17aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST
18d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams#include "rsContext.h"
191bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams#include <GLES/gl.h>
20aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#else
21aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#include "rsContextHostStub.h"
22aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#include <OpenGL/gl.h>
23aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk#endif
24d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
25d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android;
26d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsusing namespace android::renderscript;
27d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
28a9e7a05b84470257637c97d65f6562aa832c66efJason SamsType::Type(Context *rsc) : ObjectBase(rsc)
29d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
3061f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844Jason Sams    mAllocFile = __FILE__;
3161f08d6fa7c7657e9fbcd17e9a1c5b9114bb3844Jason Sams    mAllocLine = __LINE__;
32d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mLODs = 0;
33d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mLODCount = 0;
34d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    clear();
35d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
36d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
37d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsType::~Type()
38d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
39e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) {
40e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        if (mRSC->mStateType.mTypes[ct] == this) {
41e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams            mRSC->mStateType.mTypes.removeAt(ct);
42e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams            break;
43e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        }
44e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    }
45d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mLODs) {
46d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        delete [] mLODs;
47d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
48d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
49d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
50d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::clear()
51d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
52d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mLODs) {
53d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        delete [] mLODs;
54d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs = NULL;
55d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
56d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimX = 0;
57d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimY = 0;
58d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimZ = 0;
59d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mDimLOD = 0;
60d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mFaces = false;
61d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mElement.clear();
62d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
63d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
64d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::TypeState()
65d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
66d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
67d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
68d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsTypeState::~TypeState()
69d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
70d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
71d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
72d19f10d43aa400e1183aa21a97099d02074131a2Jason Samssize_t Type::getOffsetForFace(uint32_t face) const
73d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
74d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    rsAssert(mFaces);
75d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return 0;
76d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
77d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
78d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid Type::compute()
79d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
80d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t oldLODCount = mLODCount;
81d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mDimLOD) {
82d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        uint32_t l2x = rsFindHighBit(mDimX) + 1;
83d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        uint32_t l2y = rsFindHighBit(mDimY) + 1;
84d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        uint32_t l2z = rsFindHighBit(mDimZ) + 1;
85d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
86d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODCount = rsMax(l2x, l2y);
87d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODCount = rsMax(mLODCount, l2z);
88d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    } else {
89d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODCount = 1;
90d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
91d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mLODCount != oldLODCount) {
92d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        delete [] mLODs;
93d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs = new LOD[mLODCount];
94d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
95d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
96d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t tx = mDimX;
97d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t ty = mDimY;
98d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t tz = mDimZ;
99d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    size_t offset = 0;
100d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    for (uint32_t lod=0; lod < mLODCount; lod++) {
101d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mX = tx;
102d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mY = ty;
103d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mZ = tz;
104d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        mLODs[lod].mOffset = offset;
105d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
106917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams        if (tx > 1) tx >>= 1;
107917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams        if (ty > 1) ty >>= 1;
108917cd4fcda61c63429d73639284f34bb85c97f37Jason Sams        if (tz > 1) tz >>= 1;
109d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
110d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
111d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // At this point the offset is the size of a mipmap chain;
112d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mMipChainSizeBytes = offset;
113d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
114d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (mFaces) {
115d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        offset *= 6;
116d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
117d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    mTotalSizeBytes = offset;
118d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1191bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    makeGLComponents();
120d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
121d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
122d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const
123d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
124d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t offset = mLODs[lod].mOffset;
125d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    offset += x * mElement->getSizeBytes();
126d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return offset;
127d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
128d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
129d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const
130d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
131d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t offset = mLODs[lod].mOffset;
132d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes();
133d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return offset;
134d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
135d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
136d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const
137d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
138d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    uint32_t offset = mLODs[lod].mOffset;
139d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes();
140d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return offset;
141d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
142d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
143d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
1441bada8cd6e4f340de93cff4a2439835fc3b1456cJason Samsvoid Type::makeGLComponents()
1451bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams{
146a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    uint32_t userNum = 0;
1471bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
1480011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
149718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        const Component &c = getElement()->getField(ct)->getComponent();
1501bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
151718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        switch(c.getKind()) {
152a09a6e145b778861f7abee86ce17e59507ed221eJason Sams        case RS_KIND_USER:
153a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mUser[userNum].size = c.getVectorSize();
154a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mUser[userNum].offset = mElement->getFieldOffsetBytes(ct);
155a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mUser[userNum].type = c.getGLType();
156a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mUser[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized();
157a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mUser[userNum].name.setTo(getElement()->getFieldName(ct));
158a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            userNum ++;
159a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            break;
160a09a6e145b778861f7abee86ce17e59507ed221eJason Sams
161718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        case RS_KIND_POSITION:
1621bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            rsAssert(mGL.mVtx.size == 0);
163718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mGL.mVtx.size = c.getVectorSize();
1640011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            mGL.mVtx.offset = mElement->getFieldOffsetBytes(ct);
165718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mGL.mVtx.type = c.getGLType();
166a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mVtx.normalized = false;
167a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mVtx.name.setTo("Position");
1681bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            break;
1691bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
170718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        case RS_KIND_COLOR:
1711bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            rsAssert(mGL.mColor.size == 0);
172718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mGL.mColor.size = c.getVectorSize();
1730011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            mGL.mColor.offset = mElement->getFieldOffsetBytes(ct);
174718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mGL.mColor.type = c.getGLType();
175a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mColor.normalized = c.getType() != RS_TYPE_FLOAT_32;
176a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mColor.name.setTo("Color");
1771bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            break;
1781bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
179718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        case RS_KIND_NORMAL:
1801bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            rsAssert(mGL.mNorm.size == 0);
181718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mGL.mNorm.size = c.getVectorSize();
1820011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            mGL.mNorm.offset = mElement->getFieldOffsetBytes(ct);
183718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mGL.mNorm.type = c.getGLType();
184a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mNorm.normalized = false;
185a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mNorm.name.setTo("Normal");
186718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            break;
1871bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
188718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams        case RS_KIND_TEXTURE:
189a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            rsAssert(mGL.mTex.size == 0);
190a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mTex.size = c.getVectorSize();
191a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mTex.offset = mElement->getFieldOffsetBytes(ct);
192a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mTex.type = c.getGLType();
193a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mTex.normalized = false;
194a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mTex.name.setTo("Texture");
195718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            break;
1961bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
1970011bcf57ff711a221a3a4c73f2a79125111647dJason Sams        case RS_KIND_POINT_SIZE:
19825ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams            rsAssert(!mGL.mPointSize.size);
199718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mGL.mPointSize.size = c.getVectorSize();
2000011bcf57ff711a221a3a4c73f2a79125111647dJason Sams            mGL.mPointSize.offset = mElement->getFieldOffsetBytes(ct);
201718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams            mGL.mPointSize.type = c.getGLType();
202a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mPointSize.normalized = false;
203a09a6e145b778861f7abee86ce17e59507ed221eJason Sams            mGL.mPointSize.name.setTo("PointSize");
20425ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams        break;
20525ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams
2061bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams        default:
2071bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            break;
2081bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams        }
2091bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    }
2101bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams}
2111bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
212bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Samsvoid Type::enableGLVertexBuffer(VertexArray *va) const
2131bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams{
2141bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    // Note: We are only going to enable buffers and never disable them
215a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    // here.  The reason is more than one Allocation may be used as a vertex
2161bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    // source.  So we cannot disable arrays that may have been in use by
2171bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    // another allocation.
2181bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
2191bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    uint32_t stride = mElement->getSizeBytes();
2201bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    if (mGL.mVtx.size) {
221df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams        va->addLegacy(mGL.mVtx.type,
222df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                      mGL.mVtx.size,
223df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                      stride,
224df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                      RS_KIND_POSITION,
225df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                      false,
226df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                      mGL.mVtx.offset);
2271bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    }
2281bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
2291bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    if (mGL.mNorm.size) {
230df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams        va->addLegacy(mGL.mNorm.type,
231df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     3,
232df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     stride,
233df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     RS_KIND_NORMAL,
234df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     false,
235df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     mGL.mNorm.offset);
2361bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    }
2371bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
2381bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    if (mGL.mColor.size) {
239df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams        va->addLegacy(mGL.mColor.type,
240df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     mGL.mColor.size,
241bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Sams                     stride,
242df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     RS_KIND_COLOR,
243df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     true,
244bb51c40d89c7dbdee7d7507fdfe0a64e8f4f87a9Jason Sams                     mGL.mColor.offset);
2451bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    }
2461bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
247a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    if (mGL.mTex.size) {
248df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams        va->addLegacy(mGL.mTex.type,
249df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     mGL.mTex.size,
250df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     stride,
251df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     RS_KIND_TEXTURE,
252df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     false,
253df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     mGL.mTex.offset);
2541bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    }
2551bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
25625ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams    if (mGL.mPointSize.size) {
257df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams        va->addLegacy(mGL.mPointSize.type,
258df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     1,
259df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     stride,
260df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     RS_KIND_POINT_SIZE,
261df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     false,
262df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams                     mGL.mPointSize.offset);
26325ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams    }
26425ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams
2651bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams}
2661bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
267a09a6e145b778861f7abee86ce17e59507ed221eJason Samsvoid Type::enableGLVertexBuffer2(VertexArray *va) const
268a09a6e145b778861f7abee86ce17e59507ed221eJason Sams{
269a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    // Do legacy buffers
270a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    enableGLVertexBuffer(va);
271a09a6e145b778861f7abee86ce17e59507ed221eJason Sams
272a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    uint32_t stride = mElement->getSizeBytes();
273a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
274a09a6e145b778861f7abee86ce17e59507ed221eJason Sams        if (mGL.mUser[ct].size) {
275df48b571144ed0b0a09c735f997cc408c3d22b2bJason Sams            va->addUser(mGL.mUser[ct], stride);
276a09a6e145b778861f7abee86ce17e59507ed221eJason Sams        }
277a09a6e145b778861f7abee86ce17e59507ed221eJason Sams    }
278a09a6e145b778861f7abee86ce17e59507ed221eJason Sams}
279a09a6e145b778861f7abee86ce17e59507ed221eJason Sams
280a09a6e145b778861f7abee86ce17e59507ed221eJason Sams
2811bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
2823c0dfbab807a459622aeade4940daddf482dec66Jason Samsvoid Type::dumpLOGV(const char *prefix) const
2833c0dfbab807a459622aeade4940daddf482dec66Jason Sams{
2843c0dfbab807a459622aeade4940daddf482dec66Jason Sams    char buf[1024];
2853c0dfbab807a459622aeade4940daddf482dec66Jason Sams    ObjectBase::dumpLOGV(prefix);
2863c0dfbab807a459622aeade4940daddf482dec66Jason Sams    LOGV("%s   Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces);
2873c0dfbab807a459622aeade4940daddf482dec66Jason Sams    sprintf(buf, "%s element: ", prefix);
2883c0dfbab807a459622aeade4940daddf482dec66Jason Sams    mElement->dumpLOGV(buf);
2893c0dfbab807a459622aeade4940daddf482dec66Jason Sams}
2903c0dfbab807a459622aeade4940daddf482dec66Jason Sams
291aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchoukvoid Type::serialize(OStream *stream) const
292aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk{
293aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    // Need to identify ourselves
294aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU32((uint32_t)getClassId());
295aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
296aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    String8 name(getName());
297aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addString(&name);
298aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
299aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    mElement->serialize(stream);
300aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
301aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU32(mDimX);
302aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU32(mDimY);
303aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU32(mDimZ);
304aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
305aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU8((uint8_t)(mDimLOD ? 1 : 0));
306aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->addU8((uint8_t)(mFaces ? 1 : 0));
307aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk}
308aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
309aa7d2884cb563f87294003981e03e37a1abeb961Alex SakhartchoukType *Type::createFromStream(Context *rsc, IStream *stream)
310aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk{
311aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    // First make sure we are reading the correct object
312aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    A3DClassID classID = (A3DClassID)stream->loadU32();
313aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    if(classID != A3D_CLASS_ID_TYPE) {
314aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk        LOGE("type loading skipped due to invalid class id\n");
315aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk        return NULL;
316aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    }
317aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
318aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    String8 name;
319aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    stream->loadString(&name);
320aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
321aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    Element *elem = Element::createFromStream(rsc, stream);
322aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    if(!elem) {
323aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk        return NULL;
324aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    }
325aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
326aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    Type *type = new Type(rsc);
327aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mDimX = stream->loadU32();
328aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mDimY = stream->loadU32();
329aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mDimZ = stream->loadU32();
330aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
331aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    uint8_t temp = stream->loadU8();
332aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mDimLOD = temp != 0;
333aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
334aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    temp = stream->loadU8();
335aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->mFaces = temp != 0;
336aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
337aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    type->setElement(elem);
338aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
339aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk    return type;
340aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk}
341aa7d2884cb563f87294003981e03e37a1abeb961Alex Sakhartchouk
3422978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Samsbool Type::getIsNp2() const
3432978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams{
3442978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    uint32_t x = getDimX();
3452978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    uint32_t y = getDimY();
3462978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    uint32_t z = getDimZ();
3472978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams
3482978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    if (x && (x & (x-1))) {
3492978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams        return true;
3502978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    }
3512978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    if (y && (y & (y-1))) {
3522978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams        return true;
3532978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    }
3542978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    if (z && (z & (z-1))) {
3552978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams        return true;
3562978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    }
3572978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams    return false;
3582978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams}
3592978bfc6ad79c8f1138d34a704ce5b3d3d70d2c1Jason Sams
3603c0dfbab807a459622aeade4940daddf482dec66Jason Sams
361d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams//////////////////////////////////////////////////
3621bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams//
363d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace android {
364d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsnamespace renderscript {
365d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
366d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse)
367d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
368d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState * stc = &rsc->mStateType;
369d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
370d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mX = 0;
371d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mY = 0;
372d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mZ = 0;
373d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mLOD = false;
374d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mFaces = false;
375d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    stc->mElement.set(static_cast<const Element *>(vse));
376d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
377d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
378d19f10d43aa400e1183aa21a97099d02074131a2Jason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value)
379d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
380d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState * stc = &rsc->mStateType;
381d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
382d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if (dim < 0) {
383d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        //error
384d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
385d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
386d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
387d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
388d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    switch (dim) {
389d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_X:
390d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mX = value;
391d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
392d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_Y:
393d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mY = value;
394d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
395d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_Z:
396d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mZ = value;
397d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
398d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_FACE:
399d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mFaces = (value != 0);
400d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
401d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    case RS_DIMENSION_LOD:
402d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        stc->mLOD = (value != 0);
403d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
404d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    default:
405d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        break;
406d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
407d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
408d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
409d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0;
410d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    if ((dim < 0) || (dim > RS_DIMENSION_MAX)) {
411d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        LOGE("rsTypeAdd: Bad dimension");
412d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        //error
413d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams        return;
414d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    }
415d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
416d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    // todo: implement array support
417d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
418d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
419d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
420d19f10d43aa400e1183aa21a97099d02074131a2Jason SamsRsType rsi_TypeCreate(Context *rsc)
421d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams{
422d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    TypeState * stc = &rsc->mStateType;
423d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
424e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
425e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        Type *t = stc->mTypes[ct];
426e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        if (t->getElement() != stc->mElement.get()) continue;
427e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        if (t->getDimX() != stc->mX) continue;
428e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        if (t->getDimY() != stc->mY) continue;
429e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        if (t->getDimZ() != stc->mZ) continue;
430e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        if (t->getDimLOD() != stc->mLOD) continue;
431e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        if (t->getDimFaces() != stc->mFaces) continue;
432e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        t->incUserRef();
433e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams        return t;
434e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    }
435e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams
436a9e7a05b84470257637c97d65f6562aa832c66efJason Sams    Type * st = new Type(rsc);
43707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams    st->incUserRef();
438d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimX(stc->mX);
439d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimY(stc->mY);
440d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimZ(stc->mZ);
441d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setElement(stc->mElement.get());
442d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimLOD(stc->mLOD);
443d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->setDimFaces(stc->mFaces);
444d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    st->compute();
445a57e982785d318ddcaa4d86486d63343acefa3fbJason Sams    stc->mElement.clear();
446e4c487a75282e8a38a8b3defd49e7799c8670881Jason Sams    stc->mTypes.push(st);
447d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams    return st;
448d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
449d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
450d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
451d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
452d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams}
453d19f10d43aa400e1183aa21a97099d02074131a2Jason Sams
454