rsType.cpp revision be504f2d0c5db4485e6db5b406e9e8b8c390dea9
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"
18e5ffb879ae535a899a486285a23bea05e912480fJason Sams#include <GLES/gl.h>
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
23e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsType::Type(Context *rsc) : ObjectBase(rsc)
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
25f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
26f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mLODs = 0;
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mLODCount = 0;
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
30326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
32326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsType::~Type()
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODs) {
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::clear()
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODs) {
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs = NULL;
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimX = 0;
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimY = 0;
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimZ = 0;
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimLOD = 0;
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mFaces = false;
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mElement.clear();
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
53326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::TypeState()
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
57326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::~TypeState()
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Type::getOffsetForFace(uint32_t face) const
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(mFaces);
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 0;
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::compute()
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t oldLODCount = mLODCount;
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mDimLOD) {
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2x = rsFindHighBit(mDimX) + 1;
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2y = rsFindHighBit(mDimY) + 1;
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2z = rsFindHighBit(mDimZ) + 1;
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = rsMax(l2x, l2y);
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = rsMax(mLODCount, l2z);
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    } else {
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = 1;
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODCount != oldLODCount) {
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs = new LOD[mLODCount];
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t tx = mDimX;
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t ty = mDimY;
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t tz = mDimZ;
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t offset = 0;
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (uint32_t lod=0; lod < mLODCount; lod++) {
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mX = tx;
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mY = ty;
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mZ = tz;
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mOffset = offset;
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
957c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (tx > 1) tx >>= 1;
967c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (ty > 1) ty >>= 1;
977c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (tz > 1) tz >>= 1;
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // At this point the offset is the size of a mipmap chain;
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mMipChainSizeBytes = offset;
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mFaces) {
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        offset *= 6;
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTotalSizeBytes = offset;
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
108e5ffb879ae535a899a486285a23bea05e912480fJason Sams    makeGLComponents();
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += x * mElement->getSizeBytes();
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes();
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes();
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
133e5ffb879ae535a899a486285a23bea05e912480fJason Samsvoid Type::makeGLComponents()
134e5ffb879ae535a899a486285a23bea05e912480fJason Sams{
135433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    uint32_t userNum = 0;
136e5ffb879ae535a899a486285a23bea05e912480fJason Sams
1374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
138d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        const Component &c = getElement()->getField(ct)->getComponent();
139e5ffb879ae535a899a486285a23bea05e912480fJason Sams
140d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        switch(c.getKind()) {
141433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        case RS_KIND_USER:
142433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].size = c.getVectorSize();
143433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].offset = mElement->getFieldOffsetBytes(ct);
144433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].type = c.getGLType();
145433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized();
146433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].name.setTo(getElement()->getFieldName(ct));
147433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            userNum ++;
148433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            break;
149433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
150d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        case RS_KIND_POSITION:
151e5ffb879ae535a899a486285a23bea05e912480fJason Sams            rsAssert(mGL.mVtx.size == 0);
152d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mVtx.size = c.getVectorSize();
1534815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            mGL.mVtx.offset = mElement->getFieldOffsetBytes(ct);
154d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mVtx.type = c.getGLType();
155433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mVtx.normalized = false;
156433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mVtx.name.setTo("Position");
157e5ffb879ae535a899a486285a23bea05e912480fJason Sams            break;
158e5ffb879ae535a899a486285a23bea05e912480fJason Sams
159d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        case RS_KIND_COLOR:
160e5ffb879ae535a899a486285a23bea05e912480fJason Sams            rsAssert(mGL.mColor.size == 0);
161d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mColor.size = c.getVectorSize();
1624815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            mGL.mColor.offset = mElement->getFieldOffsetBytes(ct);
163d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mColor.type = c.getGLType();
164433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mColor.normalized = c.getType() != RS_TYPE_FLOAT_32;
165433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mColor.name.setTo("Color");
166e5ffb879ae535a899a486285a23bea05e912480fJason Sams            break;
167e5ffb879ae535a899a486285a23bea05e912480fJason Sams
168d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        case RS_KIND_NORMAL:
169e5ffb879ae535a899a486285a23bea05e912480fJason Sams            rsAssert(mGL.mNorm.size == 0);
170d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mNorm.size = c.getVectorSize();
1714815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            mGL.mNorm.offset = mElement->getFieldOffsetBytes(ct);
172d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mNorm.type = c.getGLType();
173433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mNorm.normalized = false;
174433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mNorm.name.setTo("Normal");
175d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            break;
176e5ffb879ae535a899a486285a23bea05e912480fJason Sams
177d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        case RS_KIND_TEXTURE:
178433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            rsAssert(mGL.mTex.size == 0);
179433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.size = c.getVectorSize();
180433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.offset = mElement->getFieldOffsetBytes(ct);
181433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.type = c.getGLType();
182433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.normalized = false;
183433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.name.setTo("Texture");
184d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            break;
185e5ffb879ae535a899a486285a23bea05e912480fJason Sams
1864815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        case RS_KIND_POINT_SIZE:
187e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams            rsAssert(!mGL.mPointSize.size);
188d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mPointSize.size = c.getVectorSize();
1894815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            mGL.mPointSize.offset = mElement->getFieldOffsetBytes(ct);
190d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mPointSize.type = c.getGLType();
191433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mPointSize.normalized = false;
192433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mPointSize.name.setTo("PointSize");
193e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams        break;
194e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams
195e5ffb879ae535a899a486285a23bea05e912480fJason Sams        default:
196e5ffb879ae535a899a486285a23bea05e912480fJason Sams            break;
197e5ffb879ae535a899a486285a23bea05e912480fJason Sams        }
198e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
199e5ffb879ae535a899a486285a23bea05e912480fJason Sams}
200e5ffb879ae535a899a486285a23bea05e912480fJason Sams
201c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid Type::enableGLVertexBuffer(VertexArray *va) const
202e5ffb879ae535a899a486285a23bea05e912480fJason Sams{
203e5ffb879ae535a899a486285a23bea05e912480fJason Sams    // Note: We are only going to enable buffers and never disable them
204433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    // here.  The reason is more than one Allocation may be used as a vertex
205e5ffb879ae535a899a486285a23bea05e912480fJason Sams    // source.  So we cannot disable arrays that may have been in use by
206e5ffb879ae535a899a486285a23bea05e912480fJason Sams    // another allocation.
207e5ffb879ae535a899a486285a23bea05e912480fJason Sams
208e5ffb879ae535a899a486285a23bea05e912480fJason Sams    uint32_t stride = mElement->getSizeBytes();
209e5ffb879ae535a899a486285a23bea05e912480fJason Sams    if (mGL.mVtx.size) {
210be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mVtx.type,
211be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      mGL.mVtx.size,
212be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      stride,
213be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      RS_KIND_POSITION,
214be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      false,
215be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      mGL.mVtx.offset);
216e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
217e5ffb879ae535a899a486285a23bea05e912480fJason Sams
218e5ffb879ae535a899a486285a23bea05e912480fJason Sams    if (mGL.mNorm.size) {
219be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mNorm.type,
220be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     3,
221be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     stride,
222be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     RS_KIND_NORMAL,
223be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     false,
224be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mNorm.offset);
225e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
226e5ffb879ae535a899a486285a23bea05e912480fJason Sams
227e5ffb879ae535a899a486285a23bea05e912480fJason Sams    if (mGL.mColor.size) {
228be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mColor.type,
229be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mColor.size,
230c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                     stride,
231be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     RS_KIND_COLOR,
232be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     true,
233c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                     mGL.mColor.offset);
234e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
235e5ffb879ae535a899a486285a23bea05e912480fJason Sams
236433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    if (mGL.mTex.size) {
237be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mTex.type,
238be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mTex.size,
239be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     stride,
240be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     RS_KIND_TEXTURE,
241be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     false,
242be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mTex.offset);
243e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
244e5ffb879ae535a899a486285a23bea05e912480fJason Sams
245e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams    if (mGL.mPointSize.size) {
246be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mPointSize.type,
247be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     1,
248be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     stride,
249be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     RS_KIND_POINT_SIZE,
250be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     false,
251be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mPointSize.offset);
252e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams    }
253e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams
254e5ffb879ae535a899a486285a23bea05e912480fJason Sams}
255e5ffb879ae535a899a486285a23bea05e912480fJason Sams
256433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Samsvoid Type::enableGLVertexBuffer2(VertexArray *va) const
257433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{
258433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    // Do legacy buffers
259433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    enableGLVertexBuffer(va);
260433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
261433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    uint32_t stride = mElement->getSizeBytes();
262433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
263433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        if (mGL.mUser[ct].size) {
264be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams            va->addUser(mGL.mUser[ct], stride);
265433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        }
266433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    }
267433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams}
268433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
269433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
270e5ffb879ae535a899a486285a23bea05e912480fJason Sams
271e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Type::dumpLOGV(const char *prefix) const
272e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{
273e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    char buf[1024];
274e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
275e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    LOGV("%s   Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces);
276e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    sprintf(buf, "%s element: ", prefix);
277e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    mElement->dumpLOGV(buf);
278e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
279e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
280e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
281326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams//////////////////////////////////////////////////
282e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
283326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
284326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
286326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse)
287326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
288326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
289326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
290326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mX = 0;
291326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mY = 0;
292326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mZ = 0;
293326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mLOD = false;
294326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mFaces = false;
295326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mElement.set(static_cast<const Element *>(vse));
296326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
297326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
298326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value)
299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
301326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
302326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (dim < 0) {
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
304326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
308326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    switch (dim) {
309326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_X:
310326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mX = value;
311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Y:
313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mY = value;
314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Z:
316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mZ = value;
317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_FACE:
319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mFaces = (value != 0);
320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_LOD:
322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mLOD = (value != 0);
323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    default:
325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0;
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if ((dim < 0) || (dim > RS_DIMENSION_MAX)) {
331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        LOGE("rsTypeAdd: Bad dimension");
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
335326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // todo: implement array support
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
340326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsType rsi_TypeCreate(Context *rsc)
341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
344e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Type * st = new Type(rsc);
3459397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    st->incUserRef();
346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimX(stc->mX);
347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimY(stc->mY);
348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimZ(stc->mZ);
349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setElement(stc->mElement.get());
350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimLOD(stc->mLOD);
351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimFaces(stc->mFaces);
352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->compute();
3538312801ccbed0c86cb2592f7ca2fd1cb9847ab8dJason Sams    stc->mElement.clear();
354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return st;
356326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
361326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
362