Type.cpp revision 69cccdf0659a193d6a75420ec745421fb5c436e6
1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/*
269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams * Copyright (C) 2012 The Android Open Source Project
3221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams *
4221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * you may not use this file except in compliance with the License.
6221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * You may obtain a copy of the License at
7221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams *
8221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams *
10221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Unless required by applicable law or agreed to in writing, software
11221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * See the License for the specific language governing permissions and
14221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * limitations under the License.
15221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */
16221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
17f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams#define LOG_TAG "libRS_cpp"
18f1e6d229636c35ad311995853a9cab52c723bed7Jason Sams
19221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <utils/Log.h>
20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <malloc.h>
21221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <string.h>
22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
23221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "RenderScript.h"
24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "Element.h"
25221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "Type.h"
26221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2769cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android;
2869cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace renderscriptCpp;
2969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::calcElementCount() {
31221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    bool hasLod = hasMipmaps();
32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t x = getX();
33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t y = getY();
34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t z = getZ();
35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t faces = 1;
36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (hasFaces()) {
37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        faces = 6;
38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (x == 0) {
40221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        x = 1;
41221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
42221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (y == 0) {
43221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        y = 1;
44221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (z == 0) {
46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        z = 1;
47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t count = x * y * z * faces;
50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
51221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if(x > 1) {
52221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            x >>= 1;
53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if(y > 1) {
55221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            y >>= 1;
56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
57221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if(z > 1) {
58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            z >>= 1;
59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        count += x * y * z * faces;
62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mElementCount = count;
64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
67221a4b17cda03916a0599628fcbb5f48605a0e5aJason SamsType::Type(void *id, RenderScript *rs) : BaseObj(id, rs) {
68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimX = 0;
69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimY = 0;
70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimZ = 0;
71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimMipmaps = false;
72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimFaces = false;
73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mElement = NULL;
74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
76221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::updateFromNative() {
77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    // We have 6 integer to obtain mDimX; mDimY; mDimZ;
78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    // mDimLOD; mDimFaces; mElement;
79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    /*
81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int[] dataBuffer = new int[6];
82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.nTypeGetNativeData(getID(), dataBuffer);
83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimX = dataBuffer[0];
85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimY = dataBuffer[1];
86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimZ = dataBuffer[2];
87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimMipmaps = dataBuffer[3] == 1 ? true : false;
88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimFaces = dataBuffer[4] == 1 ? true : false;
89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int elementID = dataBuffer[5];
91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(elementID != 0) {
92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mElement = new Element(elementID, mRS);
93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mElement.updateFromNative();
94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    calcElementCount();
96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    */
97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
9969cccdf0659a193d6a75420ec745421fb5c436e6Jason SamsType::Builder::Builder(RenderScript *rs, sp<const Element> e) {
100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS = rs;
101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mElement = e;
102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimX = 0;
103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimY = 0;
104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimZ = 0;
105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimMipmaps = false;
106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimFaces = false;
107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setX(uint32_t value) {
110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(value < 1) {
111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Values of less than 1 for Dimension X are not valid.");
112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimX = value;
114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setY(int value) {
117221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(value < 1) {
118221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Values of less than 1 for Dimension Y are not valid.");
119221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimY = value;
121221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setMipmaps(bool value) {
124221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimMipmaps = value;
125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setFaces(bool value) {
128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimFaces = value;
129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
13169cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Type> Type::Builder::create() {
132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mDimZ > 0) {
133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if ((mDimX < 1) || (mDimY < 1)) {
134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Both X and Y dimension required when Z is present.");
135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (mDimFaces) {
137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Cube maps not supported with 3D types.");
138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mDimY > 0) {
141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (mDimX < 1) {
142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("X dimension required when Y is present.");
143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
144221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mDimFaces) {
146221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (mDimY < 1) {
147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Cube maps require 2D Types.");
148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
15169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams    void * id = rsTypeCreate(mRS->mContext, mElement->getID(), mDimX, mDimY, mDimZ,
15269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams            mDimMipmaps, mDimFaces);
153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    Type *t = new Type(id, mRS);
154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mElement = mElement;
155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimX = mDimX;
156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimY = mDimY;
157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimZ = mDimZ;
158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimMipmaps = mDimMipmaps;
159221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimFaces = mDimFaces;
160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->calcElementCount();
162221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return t;
163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
165