1 /*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "libRS_cpp"
18
19 #include <utils/Log.h>
20 #include <malloc.h>
21 #include <string.h>
22
23 #include "RenderScript.h"
24 #include "Element.h"
25 #include "Type.h"
26
27 using namespace android;
28 using namespace renderscriptCpp;
29
calcElementCount()30 void Type::calcElementCount() {
31 bool hasLod = hasMipmaps();
32 uint32_t x = getX();
33 uint32_t y = getY();
34 uint32_t z = getZ();
35 uint32_t faces = 1;
36 if (hasFaces()) {
37 faces = 6;
38 }
39 if (x == 0) {
40 x = 1;
41 }
42 if (y == 0) {
43 y = 1;
44 }
45 if (z == 0) {
46 z = 1;
47 }
48
49 uint32_t count = x * y * z * faces;
50 while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
51 if(x > 1) {
52 x >>= 1;
53 }
54 if(y > 1) {
55 y >>= 1;
56 }
57 if(z > 1) {
58 z >>= 1;
59 }
60
61 count += x * y * z * faces;
62 }
63 mElementCount = count;
64 }
65
66
Type(void * id,RenderScript * rs)67 Type::Type(void *id, RenderScript *rs) : BaseObj(id, rs) {
68 mDimX = 0;
69 mDimY = 0;
70 mDimZ = 0;
71 mDimMipmaps = false;
72 mDimFaces = false;
73 mElement = NULL;
74 }
75
updateFromNative()76 void Type::updateFromNative() {
77 // We have 6 integer to obtain mDimX; mDimY; mDimZ;
78 // mDimLOD; mDimFaces; mElement;
79
80 /*
81 int[] dataBuffer = new int[6];
82 mRS.nTypeGetNativeData(getID(), dataBuffer);
83
84 mDimX = dataBuffer[0];
85 mDimY = dataBuffer[1];
86 mDimZ = dataBuffer[2];
87 mDimMipmaps = dataBuffer[3] == 1 ? true : false;
88 mDimFaces = dataBuffer[4] == 1 ? true : false;
89
90 int elementID = dataBuffer[5];
91 if(elementID != 0) {
92 mElement = new Element(elementID, mRS);
93 mElement.updateFromNative();
94 }
95 calcElementCount();
96 */
97 }
98
Builder(RenderScript * rs,sp<const Element> e)99 Type::Builder::Builder(RenderScript *rs, sp<const Element> e) {
100 mRS = rs;
101 mElement = e;
102 mDimX = 0;
103 mDimY = 0;
104 mDimZ = 0;
105 mDimMipmaps = false;
106 mDimFaces = false;
107 }
108
setX(uint32_t value)109 void Type::Builder::setX(uint32_t value) {
110 if(value < 1) {
111 ALOGE("Values of less than 1 for Dimension X are not valid.");
112 }
113 mDimX = value;
114 }
115
setY(int value)116 void Type::Builder::setY(int value) {
117 if(value < 1) {
118 ALOGE("Values of less than 1 for Dimension Y are not valid.");
119 }
120 mDimY = value;
121 }
122
setMipmaps(bool value)123 void Type::Builder::setMipmaps(bool value) {
124 mDimMipmaps = value;
125 }
126
setFaces(bool value)127 void Type::Builder::setFaces(bool value) {
128 mDimFaces = value;
129 }
130
create()131 sp<const Type> Type::Builder::create() {
132 if (mDimZ > 0) {
133 if ((mDimX < 1) || (mDimY < 1)) {
134 ALOGE("Both X and Y dimension required when Z is present.");
135 }
136 if (mDimFaces) {
137 ALOGE("Cube maps not supported with 3D types.");
138 }
139 }
140 if (mDimY > 0) {
141 if (mDimX < 1) {
142 ALOGE("X dimension required when Y is present.");
143 }
144 }
145 if (mDimFaces) {
146 if (mDimY < 1) {
147 ALOGE("Cube maps require 2D Types.");
148 }
149 }
150
151 void * id = rsTypeCreate(mRS->mContext, mElement->getID(), mDimX, mDimY, mDimZ,
152 mDimMipmaps, mDimFaces);
153 Type *t = new Type(id, mRS);
154 t->mElement = mElement;
155 t->mDimX = mDimX;
156 t->mDimY = mDimY;
157 t->mDimZ = mDimZ;
158 t->mDimMipmaps = mDimMipmaps;
159 t->mDimFaces = mDimFaces;
160
161 t->calcElementCount();
162 return t;
163 }
164
165