rsType.cpp revision ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8
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{
348154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) {
358154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (mRSC->mStateType.mTypes[ct] == this) {
368154954868694e1f233d87d4933a474518b1cb81Jason Sams            mRSC->mStateType.mTypes.removeAt(ct);
378154954868694e1f233d87d4933a474518b1cb81Jason Sams            break;
388154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
398154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODs) {
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::clear()
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODs) {
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs = NULL;
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimX = 0;
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimY = 0;
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimZ = 0;
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimLOD = 0;
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mFaces = false;
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mElement.clear();
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
59326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::TypeState()
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
63326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::~TypeState()
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Type::getOffsetForFace(uint32_t face) const
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(mFaces);
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 0;
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::compute()
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t oldLODCount = mLODCount;
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mDimLOD) {
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2x = rsFindHighBit(mDimX) + 1;
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2y = rsFindHighBit(mDimY) + 1;
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2z = rsFindHighBit(mDimZ) + 1;
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = rsMax(l2x, l2y);
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = rsMax(mLODCount, l2z);
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    } else {
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = 1;
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODCount != oldLODCount) {
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs = new LOD[mLODCount];
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t tx = mDimX;
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t ty = mDimY;
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t tz = mDimZ;
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t offset = 0;
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (uint32_t lod=0; lod < mLODCount; lod++) {
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mX = tx;
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mY = ty;
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mZ = tz;
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mOffset = offset;
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
1017c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (tx > 1) tx >>= 1;
1027c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (ty > 1) ty >>= 1;
1037c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (tz > 1) tz >>= 1;
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // At this point the offset is the size of a mipmap chain;
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mMipChainSizeBytes = offset;
108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mFaces) {
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        offset *= 6;
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTotalSizeBytes = offset;
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
114e5ffb879ae535a899a486285a23bea05e912480fJason Sams    makeGLComponents();
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += x * mElement->getSizeBytes();
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes();
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes();
135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
139e5ffb879ae535a899a486285a23bea05e912480fJason Samsvoid Type::makeGLComponents()
140e5ffb879ae535a899a486285a23bea05e912480fJason Sams{
141433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    uint32_t userNum = 0;
142e5ffb879ae535a899a486285a23bea05e912480fJason Sams
1434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
144d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        const Component &c = getElement()->getField(ct)->getComponent();
145e5ffb879ae535a899a486285a23bea05e912480fJason Sams
146d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        switch(c.getKind()) {
147433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        case RS_KIND_USER:
148433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].size = c.getVectorSize();
149433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].offset = mElement->getFieldOffsetBytes(ct);
150433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].type = c.getGLType();
151433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized();
152433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mUser[userNum].name.setTo(getElement()->getFieldName(ct));
153433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            userNum ++;
154433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            break;
155433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
156d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        case RS_KIND_POSITION:
157e5ffb879ae535a899a486285a23bea05e912480fJason Sams            rsAssert(mGL.mVtx.size == 0);
158d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mVtx.size = c.getVectorSize();
1594815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            mGL.mVtx.offset = mElement->getFieldOffsetBytes(ct);
160d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mVtx.type = c.getGLType();
161433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mVtx.normalized = false;
162433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mVtx.name.setTo("Position");
163e5ffb879ae535a899a486285a23bea05e912480fJason Sams            break;
164e5ffb879ae535a899a486285a23bea05e912480fJason Sams
165d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        case RS_KIND_COLOR:
166e5ffb879ae535a899a486285a23bea05e912480fJason Sams            rsAssert(mGL.mColor.size == 0);
167d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mColor.size = c.getVectorSize();
1684815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            mGL.mColor.offset = mElement->getFieldOffsetBytes(ct);
169d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mColor.type = c.getGLType();
170433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mColor.normalized = c.getType() != RS_TYPE_FLOAT_32;
171433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mColor.name.setTo("Color");
172e5ffb879ae535a899a486285a23bea05e912480fJason Sams            break;
173e5ffb879ae535a899a486285a23bea05e912480fJason Sams
174d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        case RS_KIND_NORMAL:
175e5ffb879ae535a899a486285a23bea05e912480fJason Sams            rsAssert(mGL.mNorm.size == 0);
176d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mNorm.size = c.getVectorSize();
1774815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            mGL.mNorm.offset = mElement->getFieldOffsetBytes(ct);
178d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mNorm.type = c.getGLType();
179433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mNorm.normalized = false;
180433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mNorm.name.setTo("Normal");
181d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            break;
182e5ffb879ae535a899a486285a23bea05e912480fJason Sams
183d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        case RS_KIND_TEXTURE:
184433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            rsAssert(mGL.mTex.size == 0);
185433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.size = c.getVectorSize();
186433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.offset = mElement->getFieldOffsetBytes(ct);
187433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.type = c.getGLType();
188433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.normalized = false;
189433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mTex.name.setTo("Texture");
190d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            break;
191e5ffb879ae535a899a486285a23bea05e912480fJason Sams
1924815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams        case RS_KIND_POINT_SIZE:
193e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams            rsAssert(!mGL.mPointSize.size);
194d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mPointSize.size = c.getVectorSize();
1954815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams            mGL.mPointSize.offset = mElement->getFieldOffsetBytes(ct);
196d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams            mGL.mPointSize.type = c.getGLType();
197433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mPointSize.normalized = false;
198433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams            mGL.mPointSize.name.setTo("PointSize");
199e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams        break;
200e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams
201e5ffb879ae535a899a486285a23bea05e912480fJason Sams        default:
202e5ffb879ae535a899a486285a23bea05e912480fJason Sams            break;
203e5ffb879ae535a899a486285a23bea05e912480fJason Sams        }
204e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
205e5ffb879ae535a899a486285a23bea05e912480fJason Sams}
206e5ffb879ae535a899a486285a23bea05e912480fJason Sams
207c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid Type::enableGLVertexBuffer(VertexArray *va) const
208e5ffb879ae535a899a486285a23bea05e912480fJason Sams{
209e5ffb879ae535a899a486285a23bea05e912480fJason Sams    // Note: We are only going to enable buffers and never disable them
210433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    // here.  The reason is more than one Allocation may be used as a vertex
211e5ffb879ae535a899a486285a23bea05e912480fJason Sams    // source.  So we cannot disable arrays that may have been in use by
212e5ffb879ae535a899a486285a23bea05e912480fJason Sams    // another allocation.
213e5ffb879ae535a899a486285a23bea05e912480fJason Sams
214e5ffb879ae535a899a486285a23bea05e912480fJason Sams    uint32_t stride = mElement->getSizeBytes();
215e5ffb879ae535a899a486285a23bea05e912480fJason Sams    if (mGL.mVtx.size) {
216be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mVtx.type,
217be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      mGL.mVtx.size,
218be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      stride,
219be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      RS_KIND_POSITION,
220be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      false,
221be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                      mGL.mVtx.offset);
222e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
223e5ffb879ae535a899a486285a23bea05e912480fJason Sams
224e5ffb879ae535a899a486285a23bea05e912480fJason Sams    if (mGL.mNorm.size) {
225be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mNorm.type,
226be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     3,
227be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     stride,
228be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     RS_KIND_NORMAL,
229be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     false,
230be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mNorm.offset);
231e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
232e5ffb879ae535a899a486285a23bea05e912480fJason Sams
233e5ffb879ae535a899a486285a23bea05e912480fJason Sams    if (mGL.mColor.size) {
234be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mColor.type,
235be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mColor.size,
236c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                     stride,
237be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     RS_KIND_COLOR,
238be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     true,
239c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                     mGL.mColor.offset);
240e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
241e5ffb879ae535a899a486285a23bea05e912480fJason Sams
242433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    if (mGL.mTex.size) {
243be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mTex.type,
244be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mTex.size,
245be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     stride,
246be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     RS_KIND_TEXTURE,
247be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     false,
248be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mTex.offset);
249e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
250e5ffb879ae535a899a486285a23bea05e912480fJason Sams
251e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams    if (mGL.mPointSize.size) {
252be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams        va->addLegacy(mGL.mPointSize.type,
253be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     1,
254be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     stride,
255be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     RS_KIND_POINT_SIZE,
256be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     false,
257be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams                     mGL.mPointSize.offset);
258e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams    }
259e0158410a2fedef43f5a2848c28393ad611e8cadJason Sams
260e5ffb879ae535a899a486285a23bea05e912480fJason Sams}
261e5ffb879ae535a899a486285a23bea05e912480fJason Sams
262433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Samsvoid Type::enableGLVertexBuffer2(VertexArray *va) const
263433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{
264433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    // Do legacy buffers
265433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    enableGLVertexBuffer(va);
266433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
267433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    uint32_t stride = mElement->getSizeBytes();
268433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
269433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        if (mGL.mUser[ct].size) {
270be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams            va->addUser(mGL.mUser[ct], stride);
271433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        }
272433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    }
273433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams}
274433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
275433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
276e5ffb879ae535a899a486285a23bea05e912480fJason Sams
277e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Type::dumpLOGV(const char *prefix) const
278e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{
279e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    char buf[1024];
280e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
281e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    LOGV("%s   Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces);
282e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    sprintf(buf, "%s element: ", prefix);
283e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    mElement->dumpLOGV(buf);
284e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
285e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
286ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Samsbool Type::getIsNp2() const
287ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams{
288ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    uint32_t x = getDimX();
289ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    uint32_t y = getDimY();
290ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    uint32_t z = getDimZ();
291ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams
292ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    if (x && (x & (x-1))) {
293ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return true;
294ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
295ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    if (y && (y & (y-1))) {
296ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return true;
297ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
298ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    if (z && (z & (z-1))) {
299ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return true;
300ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
301ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    return false;
302ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams}
303ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams
304e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams//////////////////////////////////////////////////
306e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
308326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
309326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
310326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse)
311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mX = 0;
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mY = 0;
316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mZ = 0;
317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mLOD = false;
318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mFaces = false;
319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mElement.set(static_cast<const Element *>(vse));
320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
322326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value)
323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (dim < 0) {
327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    switch (dim) {
333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_X:
334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mX = value;
335326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Y:
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mY = value;
338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Z:
340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mZ = value;
341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_FACE:
343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mFaces = (value != 0);
344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_LOD:
346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mLOD = (value != 0);
347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    default:
349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
353326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0;
354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if ((dim < 0) || (dim > RS_DIMENSION_MAX)) {
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        LOGE("rsTypeAdd: Bad dimension");
356326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // todo: implement array support
361326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
364326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsType rsi_TypeCreate(Context *rsc)
365326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3688154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
3698154954868694e1f233d87d4933a474518b1cb81Jason Sams        Type *t = stc->mTypes[ct];
3708154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getElement() != stc->mElement.get()) continue;
3718154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimX() != stc->mX) continue;
3728154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimY() != stc->mY) continue;
3738154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimZ() != stc->mZ) continue;
3748154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimLOD() != stc->mLOD) continue;
3758154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimFaces() != stc->mFaces) continue;
3768154954868694e1f233d87d4933a474518b1cb81Jason Sams        t->incUserRef();
3778154954868694e1f233d87d4933a474518b1cb81Jason Sams        return t;
3788154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
3798154954868694e1f233d87d4933a474518b1cb81Jason Sams
380e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Type * st = new Type(rsc);
3819397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    st->incUserRef();
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimX(stc->mX);
383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimY(stc->mY);
384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimZ(stc->mZ);
385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setElement(stc->mElement.get());
386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimLOD(stc->mLOD);
387326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimFaces(stc->mFaces);
388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->compute();
3898312801ccbed0c86cb2592f7ca2fd1cb9847ab8dJason Sams    stc->mElement.clear();
3908154954868694e1f233d87d4933a474518b1cb81Jason Sams    stc->mTypes.push(st);
391326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return st;
392326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
393326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
394326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
395326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
396326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
397326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
398