rsType.cpp revision 417e6a486adb02b3b29ada9725286f554cc6d0d3
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
17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h"
19e5ffb879ae535a899a486285a23bea05e912480fJason Sams#include <GLES/gl.h>
20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else
21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h"
22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h>
23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
28e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsType::Type(Context *rsc) : ObjectBase(rsc)
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
30f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
31f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mLODs = 0;
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mLODCount = 0;
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
37326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsType::~Type()
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
398154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) {
408154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (mRSC->mStateType.mTypes[ct] == this) {
418154954868694e1f233d87d4933a474518b1cb81Jason Sams            mRSC->mStateType.mTypes.removeAt(ct);
428154954868694e1f233d87d4933a474518b1cb81Jason Sams            break;
438154954868694e1f233d87d4933a474518b1cb81Jason Sams        }
448154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODs) {
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::clear()
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODs) {
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        delete [] mLODs;
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs = NULL;
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimX = 0;
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimY = 0;
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimZ = 0;
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mDimLOD = 0;
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mFaces = false;
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mElement.clear();
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
64326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::TypeState()
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
68326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsTypeState::~TypeState()
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Samssize_t Type::getOffsetForFace(uint32_t face) const
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(mFaces);
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return 0;
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid Type::compute()
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t oldLODCount = mLODCount;
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mDimLOD) {
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2x = rsFindHighBit(mDimX) + 1;
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2y = rsFindHighBit(mDimY) + 1;
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint32_t l2z = rsFindHighBit(mDimZ) + 1;
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = rsMax(l2x, l2y);
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = rsMax(mLODCount, l2z);
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    } else {
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODCount = 1;
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mLODCount != oldLODCount) {
92d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk        if(mLODs){
93d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk            delete [] mLODs;
94417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk        }
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs = new LOD[mLODCount];
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t tx = mDimX;
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t ty = mDimY;
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t tz = mDimZ;
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    size_t offset = 0;
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (uint32_t lod=0; lod < mLODCount; lod++) {
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mX = tx;
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mY = ty;
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mZ = tz;
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        mLODs[lod].mOffset = offset;
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
1087c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (tx > 1) tx >>= 1;
1097c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (ty > 1) ty >>= 1;
1107c52898ac201043a26b3edb7526d414684cfb96bJason Sams        if (tz > 1) tz >>= 1;
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // At this point the offset is the size of a mipmap chain;
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mMipChainSizeBytes = offset;
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mFaces) {
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        offset *= 6;
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTotalSizeBytes = offset;
120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
121e5ffb879ae535a899a486285a23bea05e912480fJason Sams    makeGLComponents();
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += x * mElement->getSizeBytes();
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += (x + y * mLODs[lod].mX) * mElement->getSizeBytes();
135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsuint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const
139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t offset = mLODs[lod].mOffset;
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    offset += (x + y*mLODs[lod].mX + z*mLODs[lod].mX*mLODs[lod].mY) * mElement->getSizeBytes();
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return offset;
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
146e5ffb879ae535a899a486285a23bea05e912480fJason Samsvoid Type::makeGLComponents()
147e5ffb879ae535a899a486285a23bea05e912480fJason Sams{
148433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    uint32_t userNum = 0;
149e5ffb879ae535a899a486285a23bea05e912480fJason Sams
1504815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
151d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        const Component &c = getElement()->getField(ct)->getComponent();
152e5ffb879ae535a899a486285a23bea05e912480fJason Sams
15379f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        mAttribs[userNum].size = c.getVectorSize();
15479f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        mAttribs[userNum].offset = mElement->getFieldOffsetBytes(ct);
15579f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        mAttribs[userNum].type = c.getGLType();
15679f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized();
15779f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        mAttribs[userNum].name.setTo(getElement()->getFieldName(ct));
15879f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        userNum ++;
159e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
160e5ffb879ae535a899a486285a23bea05e912480fJason Sams}
161e5ffb879ae535a899a486285a23bea05e912480fJason Sams
162e5ffb879ae535a899a486285a23bea05e912480fJason Sams
16379f52df541f87ac07709e770cd79f14dd1a05e93Jason Samsvoid Type::enableGLVertexBuffer(VertexArray *va) const
164433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{
165433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    uint32_t stride = mElement->getSizeBytes();
166433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
16779f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        if (mAttribs[ct].size) {
16879f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams            va->add(mAttribs[ct], stride);
169433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        }
170433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    }
171433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams}
172433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
173433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
174e5ffb879ae535a899a486285a23bea05e912480fJason Sams
175e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Type::dumpLOGV(const char *prefix) const
176e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{
177e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    char buf[1024];
178e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
179e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    LOGV("%s   Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces);
180e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    sprintf(buf, "%s element: ", prefix);
181e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    mElement->dumpLOGV(buf);
182e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
183e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
184fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid Type::serialize(OStream *stream) const
185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
187fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
188fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
189fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name(getName());
190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addString(&name);
191fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
192fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mElement->serialize(stream);
193fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mDimX);
195fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mDimY);
196fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mDimZ);
197fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU8((uint8_t)(mDimLOD ? 1 : 0));
199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU8((uint8_t)(mFaces ? 1 : 0));
200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
201fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukType *Type::createFromStream(Context *rsc, IStream *stream)
203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
204fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
205b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
206b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    if(classID != RS_A3D_CLASS_ID_TYPE) {
207fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("type loading skipped due to invalid class id\n");
208fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
210fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
211fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name;
212fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->loadString(&name);
213fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
214fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Element *elem = Element::createFromStream(rsc, stream);
215fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    if(!elem) {
216fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
217fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
218fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
219fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Type *type = new Type(rsc);
220fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mDimX = stream->loadU32();
221fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mDimY = stream->loadU32();
222fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mDimZ = stream->loadU32();
223fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    uint8_t temp = stream->loadU8();
225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mDimLOD = temp != 0;
226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
227fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    temp = stream->loadU8();
228fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mFaces = temp != 0;
229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->setElement(elem);
231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
232fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return type;
233fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
234fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
235ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Samsbool Type::getIsNp2() const
236ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams{
237ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    uint32_t x = getDimX();
238ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    uint32_t y = getDimY();
239ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    uint32_t z = getDimZ();
240ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams
241ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    if (x && (x & (x-1))) {
242ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return true;
243ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
244ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    if (y && (y & (y-1))) {
245ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return true;
246ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
247ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    if (z && (z & (z-1))) {
248ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return true;
249ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
250ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    return false;
251ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams}
252ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams
253e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
254326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams//////////////////////////////////////////////////
255e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
256326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
257326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
258326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
259326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse)
260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
263326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mX = 0;
264326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mY = 0;
265326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mZ = 0;
266326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mLOD = false;
267326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mFaces = false;
268326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mElement.set(static_cast<const Element *>(vse));
269326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
270326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
271326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value)
272326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
273326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
275326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (dim < 0) {
276326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
279326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
280326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
281326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    switch (dim) {
282326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_X:
283326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mX = value;
284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
285326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Y:
286326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mY = value;
287326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
288326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Z:
289326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mZ = value;
290326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
291326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_FACE:
292326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mFaces = (value != 0);
293326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
294326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_LOD:
295326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mLOD = (value != 0);
296326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
297326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    default:
298326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
301326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
302326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    int32_t arrayNum = dim - RS_DIMENSION_ARRAY_0;
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if ((dim < 0) || (dim > RS_DIMENSION_MAX)) {
304326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        LOGE("rsTypeAdd: Bad dimension");
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
308326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
309326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // todo: implement array support
310326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
313326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsType rsi_TypeCreate(Context *rsc)
314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3178154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
3188154954868694e1f233d87d4933a474518b1cb81Jason Sams        Type *t = stc->mTypes[ct];
3198154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getElement() != stc->mElement.get()) continue;
3208154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimX() != stc->mX) continue;
3218154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimY() != stc->mY) continue;
3228154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimZ() != stc->mZ) continue;
3238154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimLOD() != stc->mLOD) continue;
3248154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimFaces() != stc->mFaces) continue;
3258154954868694e1f233d87d4933a474518b1cb81Jason Sams        t->incUserRef();
3268154954868694e1f233d87d4933a474518b1cb81Jason Sams        return t;
3278154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
3288154954868694e1f233d87d4933a474518b1cb81Jason Sams
329e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Type * st = new Type(rsc);
3309397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    st->incUserRef();
331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimX(stc->mX);
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimY(stc->mY);
333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimZ(stc->mZ);
334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setElement(stc->mElement.get());
335326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimLOD(stc->mLOD);
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimFaces(stc->mFaces);
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->compute();
3388312801ccbed0c86cb2592f7ca2fd1cb9847ab8dJason Sams    stc->mElement.clear();
3398154954868694e1f233d87d4933a474518b1cb81Jason Sams    stc->mTypes.push(st);
340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return st;
341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
343417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_TypeGetNativeData(Context *rsc, RsType type, uint32_t *typeData, uint32_t typeDataSize)
344417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
345417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(typeDataSize == 6);
346417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // Pack the data in the follofing way mDimX; mDimY; mDimZ;
347417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // mDimLOD; mDimFaces; mElement; into typeData
348417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Type *t = static_cast<Type *>(type);
349417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
350417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimX();
351417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimY();
352417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimZ();
353417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimLOD();
354417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimFaces() ? 1 : 0;
355417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = (uint32_t)t->getElement();
356417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
357417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
358417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
361326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
363