rsType.cpp revision 96abf819e50b59ba8cf886c13f894633eb0a24ba
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;
1494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    for (uint32_t ct=0; ct < getElement()->getFieldCount(); ct++) {
150d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams        const Component &c = getElement()->getField(ct)->getComponent();
151e5ffb879ae535a899a486285a23bea05e912480fJason Sams
152886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk        if(getElement()->getFieldName(ct)[0] == '#') {
153886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk            continue;
154886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk        }
155886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk
15679f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        mAttribs[userNum].size = c.getVectorSize();
15779f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        mAttribs[userNum].offset = mElement->getFieldOffsetBytes(ct);
15879f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        mAttribs[userNum].type = c.getGLType();
15979f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized();
160886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk        String8 tmp(RS_SHADER_ATTR);
161886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk        tmp.append(getElement()->getFieldName(ct));
162886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk        mAttribs[userNum].name.setTo(tmp.string());
16379f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        userNum ++;
164886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk
165886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk        if(userNum == RS_MAX_ATTRIBS) {
166886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk            return;
167886f11ade9dde05485cb11c0d67d87f76a428f6cAlex Sakhartchouk        }
168e5ffb879ae535a899a486285a23bea05e912480fJason Sams    }
169e5ffb879ae535a899a486285a23bea05e912480fJason Sams}
170e5ffb879ae535a899a486285a23bea05e912480fJason Sams
171e5ffb879ae535a899a486285a23bea05e912480fJason Sams
17279f52df541f87ac07709e770cd79f14dd1a05e93Jason Samsvoid Type::enableGLVertexBuffer(VertexArray *va) const
173433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams{
174433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    uint32_t stride = mElement->getSizeBytes();
175433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    for (uint32_t ct=0; ct < RS_MAX_ATTRIBS; ct++) {
17679f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams        if (mAttribs[ct].size) {
17779f52df541f87ac07709e770cd79f14dd1a05e93Jason Sams            va->add(mAttribs[ct], stride);
178433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams        }
179433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams    }
180433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams}
181433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
182433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams
183e5ffb879ae535a899a486285a23bea05e912480fJason Sams
184e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Samsvoid Type::dumpLOGV(const char *prefix) const
185e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams{
186e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    char buf[1024];
187e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    ObjectBase::dumpLOGV(prefix);
188e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    LOGV("%s   Type: x=%i y=%i z=%i mip=%i face=%i", prefix, mDimX, mDimY, mDimZ, mDimLOD, mFaces);
189e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    sprintf(buf, "%s element: ", prefix);
190e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams    mElement->dumpLOGV(buf);
191e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams}
192e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
193fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukvoid Type::serialize(OStream *stream) const
194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
195fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
196fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
197fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name(getName());
199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addString(&name);
200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
201fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mElement->serialize(stream);
202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mDimX);
204fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mDimY);
205fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(mDimZ);
206fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
207fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU8((uint8_t)(mDimLOD ? 1 : 0));
208fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU8((uint8_t)(mFaces ? 1 : 0));
209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
210fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
211fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukType *Type::createFromStream(Context *rsc, IStream *stream)
212fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{
213fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
214b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
215b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    if(classID != RS_A3D_CLASS_ID_TYPE) {
216fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("type loading skipped due to invalid class id\n");
217fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
218fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
219fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
220fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name;
221fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->loadString(&name);
222fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
223fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Element *elem = Element::createFromStream(rsc, stream);
224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    if(!elem) {
225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
227fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
228fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Type *type = new Type(rsc);
229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mDimX = stream->loadU32();
230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mDimY = stream->loadU32();
231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mDimZ = stream->loadU32();
232fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
233fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    uint8_t temp = stream->loadU8();
234fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mDimLOD = temp != 0;
235fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
236fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    temp = stream->loadU8();
237fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->mFaces = temp != 0;
238fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
239fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->setElement(elem);
240fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
241fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return type;
242fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
243fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
244ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Samsbool Type::getIsNp2() const
245ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams{
246ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    uint32_t x = getDimX();
247ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    uint32_t y = getDimY();
248ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    uint32_t z = getDimZ();
249ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams
250ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    if (x && (x & (x-1))) {
251ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return true;
252ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
253ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    if (y && (y & (y-1))) {
254ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return true;
255ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
256ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    if (z && (z & (z-1))) {
257ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams        return true;
258ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    }
259ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams    return false;
260ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams}
261ef21edcc70fc2734a3dc7995d3c3af1f90d16ef8Jason Sams
262383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchoukbool Type::isEqual(const Type *other) const {
263383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    if(other == NULL) {
264383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        return false;
265383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
266383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    if (other->getElement()->isEqual(getElement()) &&
267383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        other->getDimX() == mDimX &&
268383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        other->getDimY() == mDimY &&
269383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        other->getDimZ() == mDimZ &&
270383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        other->getDimLOD() == mDimLOD &&
271383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        other->getDimFaces() == mFaces) {
272383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk        return true;
273383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    }
274383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    return false;
275383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk}
276e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams
27796abf819e50b59ba8cf886c13f894633eb0a24baJason SamsType * Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const
27896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams{
27996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    TypeState * stc = &rsc->mStateType;
28096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
28196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        Type *t = stc->mTypes[ct];
28296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getElement() != mElement.get()) continue;
28396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimX() != dimX) continue;
28496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimY() != mDimY) continue;
28596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimZ() != mDimZ) continue;
28696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimLOD() != mDimLOD) continue;
28796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimFaces() != mFaces) continue;
28896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        t->incUserRef();
28996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        return t;
29096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
29196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
29296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Type *nt = new Type(rsc);
29396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mElement.set(mElement);
29496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mDimX = dimX;
29596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mDimY = mDimY;
29696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mDimZ = mDimZ;
29796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mDimLOD = mDimLOD;
29896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mFaces = mFaces;
29996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->compute();
30096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    return nt;
30196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
30296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
30396abf819e50b59ba8cf886c13f894633eb0a24baJason SamsType * Type::cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const
30496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams{
30596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    TypeState * stc = &rsc->mStateType;
30696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
30796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        Type *t = stc->mTypes[ct];
30896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getElement() != mElement.get()) continue;
30996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimX() != dimX) continue;
31096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimY() != dimY) continue;
31196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimZ() != mDimZ) continue;
31296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimLOD() != mDimLOD) continue;
31396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        if (t->getDimFaces() != mFaces) continue;
31496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        t->incUserRef();
31596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        return t;
31696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
31796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
31896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Type *nt = new Type(rsc);
31996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mElement.set(mElement);
32096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mDimX = dimX;
32196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mDimY = dimY;
32296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mDimZ = mDimZ;
32396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mDimLOD = mDimLOD;
32496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->mFaces = mFaces;
32596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    nt->compute();
32696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    return nt;
32796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
32896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
32996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams//////////////////////////////////////////////////
331e5ffb879ae535a899a486285a23bea05e912480fJason Sams//
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
333326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
335326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeBegin(Context *rsc, RsElement vse)
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mX = 0;
340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mY = 0;
341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mZ = 0;
342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mLOD = false;
343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mFaces = false;
344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    stc->mElement.set(static_cast<const Element *>(vse));
345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
347326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_TypeAdd(Context *rsc, RsDimension dim, size_t value)
348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (dim < 0) {
352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
353326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
356326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    switch (dim) {
358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_X:
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mX = value;
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
361326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Y:
362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mY = value;
363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
364326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_Z:
365326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mZ = value;
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_FACE:
368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mFaces = (value != 0);
369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    case RS_DIMENSION_LOD:
371326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        stc->mLOD = (value != 0);
372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    default:
374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        break;
375326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if ((dim < 0) || (dim > RS_DIMENSION_MAX)) {
378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        LOGE("rsTypeAdd: Bad dimension");
379326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        //error
380326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        return;
381326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    // todo: implement array support
384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
387326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsType rsi_TypeCreate(Context *rsc)
388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    TypeState * stc = &rsc->mStateType;
390326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3918154954868694e1f233d87d4933a474518b1cb81Jason Sams    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
3928154954868694e1f233d87d4933a474518b1cb81Jason Sams        Type *t = stc->mTypes[ct];
3938154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getElement() != stc->mElement.get()) continue;
3948154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimX() != stc->mX) continue;
3958154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimY() != stc->mY) continue;
3968154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimZ() != stc->mZ) continue;
3978154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimLOD() != stc->mLOD) continue;
3988154954868694e1f233d87d4933a474518b1cb81Jason Sams        if (t->getDimFaces() != stc->mFaces) continue;
3998154954868694e1f233d87d4933a474518b1cb81Jason Sams        t->incUserRef();
4008154954868694e1f233d87d4933a474518b1cb81Jason Sams        return t;
4018154954868694e1f233d87d4933a474518b1cb81Jason Sams    }
4028154954868694e1f233d87d4933a474518b1cb81Jason Sams
403e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Type * st = new Type(rsc);
4049397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    st->incUserRef();
405326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimX(stc->mX);
406326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimY(stc->mY);
407326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimZ(stc->mZ);
408326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setElement(stc->mElement.get());
409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimLOD(stc->mLOD);
410326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->setDimFaces(stc->mFaces);
411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    st->compute();
4128312801ccbed0c86cb2592f7ca2fd1cb9847ab8dJason Sams    stc->mElement.clear();
4138154954868694e1f233d87d4933a474518b1cb81Jason Sams    stc->mTypes.push(st);
414326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return st;
415326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
416326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
417417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchoukvoid rsi_TypeGetNativeData(Context *rsc, RsType type, uint32_t *typeData, uint32_t typeDataSize)
418417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk{
419417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    rsAssert(typeDataSize == 6);
420417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // Pack the data in the follofing way mDimX; mDimY; mDimZ;
421417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    // mDimLOD; mDimFaces; mElement; into typeData
422417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    Type *t = static_cast<Type *>(type);
423417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
424417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimX();
425417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimY();
426417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimZ();
427417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimLOD();
428417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = t->getDimFaces() ? 1 : 0;
429417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk    (*typeData++) = (uint32_t)t->getElement();
430417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
431417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk}
432417e6a486adb02b3b29ada9725286f554cc6d0d3Alex Sakhartchouk
433326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
434326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
435326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
436326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
437