rsType.cpp revision be504f2d0c5db4485e6db5b406e9e8b8c390dea9
181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent/*
281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * Copyright (C) 2009 The Android Open Source Project
381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent *
481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * you may not use this file except in compliance with the License.
681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * You may obtain a copy of the License at
781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent *
881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent *
1081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * Unless required by applicable law or agreed to in writing, software
1181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
1281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * See the License for the specific language governing permissions and
1481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent * limitations under the License.
1581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent */
1681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include "rsContext.h"
1881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#include <GLES/gl.h>
1981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentusing namespace android;
2181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentusing namespace android::renderscript;
2281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2381784c37c61b09289654b979567a42bf73cd2b12Eric LaurentType::Type(Context *rsc) : ObjectBase(rsc)
2481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
2581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mAllocFile = __FILE__;
2681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mAllocLine = __LINE__;
2781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mLODs = 0;
2881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mLODCount = 0;
2981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    clear();
3081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
3181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3281784c37c61b09289654b979567a42bf73cd2b12Eric LaurentType::~Type()
3381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
3481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mLODs) {
3581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        delete [] mLODs;
3681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
3781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
3881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::clear()
4081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
4181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mLODs) {
4281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        delete [] mLODs;
4381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLODs = NULL;
4481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
4581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mDimX = 0;
4681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mDimY = 0;
4781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mDimZ = 0;
4881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mDimLOD = 0;
4981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mFaces = false;
5081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mElement.clear();
5181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
5281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5381784c37c61b09289654b979567a42bf73cd2b12Eric LaurentTypeState::TypeState()
5481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
5581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
5681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5781784c37c61b09289654b979567a42bf73cd2b12Eric LaurentTypeState::~TypeState()
5881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
5981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
6081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
6181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentsize_t Type::getOffsetForFace(uint32_t face) const
6281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
6381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    rsAssert(mFaces);
6481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return 0;
6581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
6681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
6781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::compute()
6881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
6981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t oldLODCount = mLODCount;
7081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mDimLOD) {
7181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t l2x = rsFindHighBit(mDimX) + 1;
7281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t l2y = rsFindHighBit(mDimY) + 1;
7381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        uint32_t l2z = rsFindHighBit(mDimZ) + 1;
7481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
7581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLODCount = rsMax(l2x, l2y);
7681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLODCount = rsMax(mLODCount, l2z);
7781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    } else {
7881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLODCount = 1;
7981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
8081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mLODCount != oldLODCount) {
8181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        delete [] mLODs;
8281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLODs = new LOD[mLODCount];
8381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
8481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
8581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t tx = mDimX;
8681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t ty = mDimY;
8781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t tz = mDimZ;
8881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t offset = 0;
8981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (uint32_t lod=0; lod < mLODCount; lod++) {
9081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLODs[lod].mX = tx;
9181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLODs[lod].mY = ty;
9281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLODs[lod].mZ = tz;
9381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        mLODs[lod].mOffset = offset;
9481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
9581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (tx > 1) tx >>= 1;
9681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (ty > 1) ty >>= 1;
9781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (tz > 1) tz >>= 1;
9881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
9981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
10081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // At this point the offset is the size of a mipmap chain;
10181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mMipChainSizeBytes = offset;
10281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
10381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mFaces) {
10481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        offset *= 6;
10581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
10681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mTotalSizeBytes = offset;
10781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
10881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    makeGLComponents();
10981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
11081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
11181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const
11281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
11381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t offset = mLODs[lod].mOffset;
11481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    offset += x * mElement->getSizeBytes();
11581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return offset;
11681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
11781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
11881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const
11981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
12081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t offset = mLODs[lod].mOffset;
12181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes();
12281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return offset;
12381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
12481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
12581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const
12681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
12781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t offset = mLODs[lod].mOffset;
12881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes();
12981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return offset;
13081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
13181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
13281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
13381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::makeGLComponents()
13481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
13581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t userNum = 0;
13681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
13781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
13881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        const Component &c = getElement()->getField(ct)->getComponent();
13981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
14081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        switch(c.getKind()) {
14181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        case RS_KIND_USER:
14281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mUser[userNum].size = c.getVectorSize();
14381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mUser[userNum].offset = mElement->getFieldOffsetBytes(ct);
14481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mUser[userNum].type = c.getGLType();
14581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mUser[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized();
14681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mUser[userNum].name.setTo(getElement()->getFieldName(ct));
14781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            userNum ++;
14881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
14981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
15081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        case RS_KIND_POSITION:
15181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            rsAssert(mGL.mVtx.size == 0);
15281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mVtx.size = c.getVectorSize();
15381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mVtx.offset = mElement->getFieldOffsetBytes(ct);
15481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mVtx.type = c.getGLType();
15581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mVtx.normalized = false;
15681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mVtx.name.setTo("Position");
15781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
15881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
15981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        case RS_KIND_COLOR:
16081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            rsAssert(mGL.mColor.size == 0);
16181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mColor.size = c.getVectorSize();
16281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mColor.offset = mElement->getFieldOffsetBytes(ct);
16381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mColor.type = c.getGLType();
16481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mColor.normalized = c.getType() != RS_TYPE_FLOAT_32;
16581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mColor.name.setTo("Color");
16681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
16781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
16881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        case RS_KIND_NORMAL:
16981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            rsAssert(mGL.mNorm.size == 0);
17081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mNorm.size = c.getVectorSize();
17181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mNorm.offset = mElement->getFieldOffsetBytes(ct);
17281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mNorm.type = c.getGLType();
17381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mNorm.normalized = false;
17481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mNorm.name.setTo("Normal");
17581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
17681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
17781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        case RS_KIND_TEXTURE:
17881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            rsAssert(mGL.mTex.size == 0);
17981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mTex.size = c.getVectorSize();
18081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mTex.offset = mElement->getFieldOffsetBytes(ct);
18181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mTex.type = c.getGLType();
18281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mTex.normalized = false;
18381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mTex.name.setTo("Texture");
18481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
18581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
18681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        case RS_KIND_POINT_SIZE:
18781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            rsAssert(!mGL.mPointSize.size);
18881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mPointSize.size = c.getVectorSize();
18981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mPointSize.offset = mElement->getFieldOffsetBytes(ct);
19081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mPointSize.type = c.getGLType();
19181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mPointSize.normalized = false;
19281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            mGL.mPointSize.name.setTo("PointSize");
19381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
19481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
19581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        default:
19681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            break;
19781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
19881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
19981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
20081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
20181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::enableGLVertexBuffer(VertexArray *va) const
20281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
20381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Note: We are only going to enable buffers and never disable them
20481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // here.  The reason is more than one Allocation may be used as a vertex
20581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // source.  So we cannot disable arrays that may have been in use by
20681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // another allocation.
20781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
20881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t stride = mElement->getSizeBytes();
20981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mGL.mVtx.size) {
21081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        va->addLegacy(mGL.mVtx.type,
21181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                      mGL.mVtx.size,
21281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                      stride,
21381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                      RS_KIND_POSITION,
21481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                      false,
21581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                      mGL.mVtx.offset);
21681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
21781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
21881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mGL.mNorm.size) {
21981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        va->addLegacy(mGL.mNorm.type,
22081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     3,
22181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     stride,
22281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     RS_KIND_NORMAL,
22381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     false,
22481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     mGL.mNorm.offset);
22581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
22681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
22781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mGL.mColor.size) {
22881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        va->addLegacy(mGL.mColor.type,
22981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     mGL.mColor.size,
23081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     stride,
23181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     RS_KIND_COLOR,
23281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     true,
23381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     mGL.mColor.offset);
23481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
23581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
23681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mGL.mTex.size) {
23781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        va->addLegacy(mGL.mTex.type,
23881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     mGL.mTex.size,
23981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     stride,
24081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     RS_KIND_TEXTURE,
24181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     false,
24281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     mGL.mTex.offset);
24381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
24481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
24581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (mGL.mPointSize.size) {
24681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        va->addLegacy(mGL.mPointSize.type,
24781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     1,
24881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     stride,
24981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     RS_KIND_POINT_SIZE,
25081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     false,
25181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                     mGL.mPointSize.offset);
25281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
25381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
25481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
25581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
25681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::enableGLVertexBuffer2(VertexArray *va) const
25781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
25881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Do legacy buffers
25981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    enableGLVertexBuffer(va);
26081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
26181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    uint32_t stride = mElement->getSizeBytes();
26281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
26381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        if (mGL.mUser[ct].size) {
26481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            va->addUser(mGL.mUser[ct], stride);
26581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        }
26681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
26781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
26881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
26981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
27081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
27181784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid Type::dumpLOGV(const char *prefix) const
27281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
27381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    char buf[1024];
27481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    ObjectBase::dumpLOGV(prefix);
27581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    LOGV("%s   Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces);
27681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sprintf(buf, "%s element: ", prefix);
27781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mElement->dumpLOGV(buf);
27881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
27981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
28081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
28181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent//////////////////////////////////////////////////
28281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent//
28381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentnamespace android {
28481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentnamespace renderscript {
28581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
28681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid rsi_TypeBegin(Context *rsc, RsElement vse)
28781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
28881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    TypeState * stc = &rsc->mStateType;
28981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
29081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    stc->mX = 0;
29181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    stc->mY = 0;
29281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    stc->mZ = 0;
29381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    stc->mLOD = false;
29481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    stc->mFaces = false;
29581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    stc->mElement.set(static_cast<const Element *>(vse));
29681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
29781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
29881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value)
29981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
30081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    TypeState * stc = &rsc->mStateType;
30181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
30281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if (dim < 0) {
30381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //error
30481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return;
30581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
30681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
30781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
30881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    switch (dim) {
30981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case RS_DIMENSION_X:
31081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        stc->mX = value;
31181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return;
31281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case RS_DIMENSION_Y:
31381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        stc->mY = value;
31481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return;
31581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case RS_DIMENSION_Z:
31681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        stc->mZ = value;
31781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return;
3187f5d335f7b4caecd0dfb8f1085f352f1d2da5d2eGlenn Kasten    case RS_DIMENSION_FACE:
3199e58b552f51b00b3b674102876bd6c77ef3da806Glenn Kasten        stc->mFaces = (value != 0);
32081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return;
32181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    case RS_DIMENSION_LOD:
32281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        stc->mLOD = (value != 0);
32381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return;
32481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    default:
32581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        break;
32681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
32781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
32881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
32981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0;
33081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    if ((dim < 0) || (dim > RS_DIMENSION_MAX)) {
33181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        LOGE("rsTypeAdd: Bad dimension");
33281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        //error
33381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent        return;
33481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    }
33581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
33681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // todo: implement array support
33781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
33881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
33981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
34081784c37c61b09289654b979567a42bf73cd2b12Eric LaurentRsType rsi_TypeCreate(Context *rsc)
34181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent{
34281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    TypeState * stc = &rsc->mStateType;
34381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
34481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Type * st = new Type(rsc);
34581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    st->incUserRef();
34681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    st->setDimX(stc->mX);
34781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    st->setDimY(stc->mY);
34881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    st->setDimZ(stc->mZ);
34981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    st->setElement(stc->mElement.get());
35081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    st->setDimLOD(stc->mLOD);
35181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    st->setDimFaces(stc->mFaces);
35281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    st->compute();
35381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    stc->mElement.clear();
35481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
35581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    return st;
35681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
35781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
35881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
35981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
36081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent}
36181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
36281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent