blob: ce7f571c891844e526300aeaa0b08e303946f053 [file] [log] [blame]
Jason Samsb8c5a842009-07-31 20:40:47 -07001/*
Jason Samsdd6c8b32013-02-15 17:27:24 -08002 * Copyright (C) 2013 The Android Open Source Project
Jason Samsb8c5a842009-07-31 20:40:47 -07003 *
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
17package android.renderscript;
18
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -070019
Jason Sams43ee06852009-08-12 17:54:11 -070020import java.lang.reflect.Field;
Jason Samsb109cc72013-01-07 18:20:12 -080021
22import android.graphics.ImageFormat;
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -070023import android.util.Log;
Jason Sams43ee06852009-08-12 17:54:11 -070024
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070025/**
Tim Murrayc11e25c2013-04-09 11:01:01 -070026 * <p>A Type describes the {@link android.renderscript.Element} and dimensions used for an {@link
27 * android.renderscript.Allocation} or a parallel operation. Types are created through {@link
28 * android.renderscript.Type.Builder}.</p>
Jason Samsa1b13ed2010-11-12 14:58:37 -080029 *
Tim Murrayc11e25c2013-04-09 11:01:01 -070030 * <p>A Type always includes an {@link android.renderscript.Element} and an X
31 * dimension. A Type may be multidimensional, up to three dimensions. A nonzero
32 * value in the Y or Z dimensions indicates that the dimension is present. Note
33 * that a Type with only a given X dimension and a Type with the same X
34 * dimension but Y = 1 are not equivalent.</p>
Jason Samsa1b13ed2010-11-12 14:58:37 -080035 *
Tim Murrayc11e25c2013-04-09 11:01:01 -070036 * <p>A Type also supports inclusion of level of detail (LOD) or cube map
37 * faces. LOD and cube map faces are booleans to indicate present or not
38 * present. </p>
39 *
Eino-Ville Talvalaccadaf12013-08-14 10:36:30 -070040 * <p>A Type also supports YUV format information to support an
41 * {@link android.renderscript.Allocation} in a YUV format. The YUV formats
42 * supported are {@link android.graphics.ImageFormat#YV12},
43 * {@link android.graphics.ImageFormat#NV21}, and
44 * {@link android.graphics.ImageFormat#YUV_420_888}</p>
Jason Samsa1b13ed2010-11-12 14:58:37 -080045 *
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080046 * <div class="special reference">
47 * <h3>Developer Guides</h3>
Tim Murrayc11e25c2013-04-09 11:01:01 -070048 * <p>For more information about creating an application that uses RenderScript, read the
49 * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
Joe Fernandez3aef8e1d2011-12-20 10:38:34 -080050 * </div>
Jason Samsb8c5a842009-07-31 20:40:47 -070051 **/
52public class Type extends BaseObj {
Jason Sams768bc022009-09-21 19:41:04 -070053 int mDimX;
54 int mDimY;
55 int mDimZ;
Jason Samsbf6ef8d2010-12-06 15:59:59 -080056 boolean mDimMipmaps;
Jason Sams768bc022009-09-21 19:41:04 -070057 boolean mDimFaces;
Jason Sams8140d7b2012-12-13 17:01:09 -080058 int mDimYuv;
Jason Sams768bc022009-09-21 19:41:04 -070059 int mElementCount;
Jason Sams1bada8c2009-08-09 17:01:55 -070060 Element mElement;
Jason Sams768bc022009-09-21 19:41:04 -070061
Jason Sams49a05d72010-12-29 14:31:29 -080062 public enum CubemapFace {
Stephen Hines20fbd012011-06-16 17:44:53 -070063 POSITIVE_X (0),
Jason Sams49a05d72010-12-29 14:31:29 -080064 NEGATIVE_X (1),
Stephen Hines20fbd012011-06-16 17:44:53 -070065 POSITIVE_Y (2),
Jason Sams49a05d72010-12-29 14:31:29 -080066 NEGATIVE_Y (3),
Stephen Hines20fbd012011-06-16 17:44:53 -070067 POSITIVE_Z (4),
68 NEGATIVE_Z (5),
69 @Deprecated
70 POSITVE_X (0),
71 @Deprecated
72 POSITVE_Y (2),
73 @Deprecated
74 POSITVE_Z (4);
Jason Sams49a05d72010-12-29 14:31:29 -080075
76 int mID;
77 CubemapFace(int id) {
78 mID = id;
79 }
80 }
81
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070082 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -080083 * Return the element associated with this Type.
84 *
85 * @return Element
86 */
Jason Samse17964e2010-01-04 16:52:27 -080087 public Element getElement() {
88 return mElement;
89 }
Jason Sams1bada8c2009-08-09 17:01:55 -070090
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -070091 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -080092 * Return the value of the X dimension.
93 *
94 * @return int
95 */
Jason Sams768bc022009-09-21 19:41:04 -070096 public int getX() {
97 return mDimX;
98 }
Jason Samsa1b13ed2010-11-12 14:58:37 -080099
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700100 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -0800101 * Return the value of the Y dimension or 0 for a 1D allocation.
102 *
103 * @return int
104 */
Jason Sams768bc022009-09-21 19:41:04 -0700105 public int getY() {
106 return mDimY;
107 }
Jason Samsa1b13ed2010-11-12 14:58:37 -0800108
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700109 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -0800110 * Return the value of the Z dimension or 0 for a 1D or 2D allocation.
111 *
112 * @return int
113 */
Jason Sams768bc022009-09-21 19:41:04 -0700114 public int getZ() {
115 return mDimZ;
116 }
Jason Samsa1b13ed2010-11-12 14:58:37 -0800117
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700118 /**
Jason Sams5a722cf2013-03-26 13:27:37 -0700119 * Get the YUV format
120 *
Jason Sams02d56d92013-04-12 16:40:50 -0700121 *
Jason Sams5a722cf2013-03-26 13:27:37 -0700122 * @return int
123 */
124 public int getYuv() {
125 return mDimYuv;
126 }
127
128 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -0800129 * Return if the Type has a mipmap chain.
130 *
131 * @return boolean
132 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800133 public boolean hasMipmaps() {
134 return mDimMipmaps;
Jason Sams768bc022009-09-21 19:41:04 -0700135 }
Jason Samsa1b13ed2010-11-12 14:58:37 -0800136
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700137 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -0800138 * Return if the Type is a cube map.
139 *
140 * @return boolean
141 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800142 public boolean hasFaces() {
Jason Sams768bc022009-09-21 19:41:04 -0700143 return mDimFaces;
144 }
Jason Samsa1b13ed2010-11-12 14:58:37 -0800145
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700146 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -0800147 * Return the total number of accessable cells in the Type.
148 *
149 * @return int
150 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800151 public int getCount() {
Jason Sams768bc022009-09-21 19:41:04 -0700152 return mElementCount;
153 }
154
155 void calcElementCount() {
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800156 boolean hasLod = hasMipmaps();
Jason Sams768bc022009-09-21 19:41:04 -0700157 int x = getX();
158 int y = getY();
159 int z = getZ();
160 int faces = 1;
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800161 if (hasFaces()) {
Jason Sams768bc022009-09-21 19:41:04 -0700162 faces = 6;
163 }
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800164 if (x == 0) {
Jason Sams768bc022009-09-21 19:41:04 -0700165 x = 1;
166 }
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800167 if (y == 0) {
Jason Sams768bc022009-09-21 19:41:04 -0700168 y = 1;
169 }
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800170 if (z == 0) {
Jason Sams768bc022009-09-21 19:41:04 -0700171 z = 1;
172 }
173
174 int count = x * y * z * faces;
Alex Sakhartchouk9ea30a62011-03-02 12:33:50 -0800175
176 while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
Jason Sams768bc022009-09-21 19:41:04 -0700177 if(x > 1) {
178 x >>= 1;
179 }
180 if(y > 1) {
181 y >>= 1;
182 }
183 if(z > 1) {
184 z >>= 1;
185 }
186
187 count += x * y * z * faces;
188 }
189 mElementCount = count;
190 }
191
192
Tim Murray7a629fa2013-11-19 12:45:54 -0800193 Type(long id, RenderScript rs) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -0700194 super(id, rs);
Jason Sams43ee06852009-08-12 17:54:11 -0700195 }
196
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -0700197 @Override
198 void updateFromNative() {
Ashok Bhat98071552014-02-12 09:54:43 +0000199 // We have 6 integer/long to obtain mDimX; mDimY; mDimZ;
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -0700200 // mDimLOD; mDimFaces; mElement;
Ashok Bhat98071552014-02-12 09:54:43 +0000201 long[] dataBuffer = new long[6];
202 mRS.nTypeGetNativeData(getID(mRS), dataBuffer);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -0700203
Ashok Bhat98071552014-02-12 09:54:43 +0000204 mDimX = (int)dataBuffer[0];
205 mDimY = (int)dataBuffer[1];
206 mDimZ = (int)dataBuffer[2];
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800207 mDimMipmaps = dataBuffer[3] == 1 ? true : false;
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -0700208 mDimFaces = dataBuffer[4] == 1 ? true : false;
209
Ashok Bhat98071552014-02-12 09:54:43 +0000210 long elementID = dataBuffer[5];
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -0700211 if(elementID != 0) {
Alex Sakhartchouk0de94442010-08-11 14:41:28 -0700212 mElement = new Element(elementID, mRS);
Alex Sakhartchoukdfac8142010-07-15 11:33:03 -0700213 mElement.updateFromNative();
214 }
215 calcElementCount();
216 }
217
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700218 /**
Tim Murray0e3431d2014-01-31 12:57:20 -0800219 * @hide
Jason Sams4b7f3782013-10-09 17:15:36 -0700220 * Utility function for creating basic 1D types. The type is
221 * created without mipmaps enabled.
222 *
223 * @param rs The RenderScript context
224 * @param e The Element for the Type
225 * @param dimX The X dimension, must be > 0
226 *
227 * @return Type
228 */
229 static public Type createX(RenderScript rs, Element e, int dimX) {
230 if (dimX < 1) {
231 throw new RSInvalidStateException("Dimension must be >= 1.");
232 }
233
Tim Murray7a629fa2013-11-19 12:45:54 -0800234 long id = rs.nTypeCreate(e.getID(rs), dimX, 0, 0, false, false, 0);
Jason Sams4b7f3782013-10-09 17:15:36 -0700235 Type t = new Type(id, rs);
236 t.mElement = e;
237 t.mDimX = dimX;
238 t.calcElementCount();
239 return t;
240 }
241
242 /**
Tim Murray0e3431d2014-01-31 12:57:20 -0800243 * @hide
Jason Sams4b7f3782013-10-09 17:15:36 -0700244 * Utility function for creating basic 2D types. The type is
245 * created without mipmaps or cubemaps.
246 *
247 * @param rs The RenderScript context
248 * @param e The Element for the Type
249 * @param dimX The X dimension, must be > 0
250 * @param dimY The Y dimension, must be > 0
251 *
252 * @return Type
253 */
254 static public Type createXY(RenderScript rs, Element e, int dimX, int dimY) {
255 if ((dimX < 1) || (dimY < 1)) {
256 throw new RSInvalidStateException("Dimension must be >= 1.");
257 }
258
Tim Murray7a629fa2013-11-19 12:45:54 -0800259 long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, 0, false, false, 0);
Jason Sams4b7f3782013-10-09 17:15:36 -0700260 Type t = new Type(id, rs);
261 t.mElement = e;
262 t.mDimX = dimX;
263 t.mDimY = dimY;
264 t.calcElementCount();
265 return t;
266 }
267
268 /**
Tim Murray0e3431d2014-01-31 12:57:20 -0800269 * @hide
Jason Sams4b7f3782013-10-09 17:15:36 -0700270 * Utility function for creating basic 3D types. The type is
271 * created without mipmaps.
272 *
273 * @param rs The RenderScript context
274 * @param e The Element for the Type
275 * @param dimX The X dimension, must be > 0
276 * @param dimY The Y dimension, must be > 0
277 * @param dimZ The Z dimension, must be > 0
278 *
279 * @return Type
280 */
281 static public Type createXYZ(RenderScript rs, Element e, int dimX, int dimY, int dimZ) {
282 if ((dimX < 1) || (dimY < 1) || (dimZ < 1)) {
283 throw new RSInvalidStateException("Dimension must be >= 1.");
284 }
285
Tim Murray7a629fa2013-11-19 12:45:54 -0800286 long id = rs.nTypeCreate(e.getID(rs), dimX, dimY, dimZ, false, false, 0);
Jason Sams4b7f3782013-10-09 17:15:36 -0700287 Type t = new Type(id, rs);
288 t.mElement = e;
289 t.mDimX = dimX;
290 t.mDimY = dimY;
291 t.mDimZ = dimZ;
292 t.calcElementCount();
293 return t;
294 }
295
296 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -0800297 * Builder class for Type.
298 *
299 */
Jason Samsb8c5a842009-07-31 20:40:47 -0700300 public static class Builder {
301 RenderScript mRS;
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800302 int mDimX = 1;
303 int mDimY;
304 int mDimZ;
305 boolean mDimMipmaps;
306 boolean mDimFaces;
Jason Samsb109cc72013-01-07 18:20:12 -0800307 int mYuv;
Jason Samsb8c5a842009-07-31 20:40:47 -0700308
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800309 Element mElement;
Jason Samsb8c5a842009-07-31 20:40:47 -0700310
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700311 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -0800312 * Create a new builder object.
313 *
314 * @param rs
315 * @param e The element for the type to be created.
316 */
Jason Sams22534172009-08-04 16:58:20 -0700317 public Builder(RenderScript rs, Element e) {
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800318 e.checkValid();
Jason Sams22534172009-08-04 16:58:20 -0700319 mRS = rs;
Jason Sams22534172009-08-04 16:58:20 -0700320 mElement = e;
Jason Samsb8c5a842009-07-31 20:40:47 -0700321 }
322
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700323 /**
Jason Samsa1b13ed2010-11-12 14:58:37 -0800324 * Add a dimension to the Type.
325 *
326 *
Jason Samsa1b13ed2010-11-12 14:58:37 -0800327 * @param value
328 */
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800329 public Builder setX(int value) {
Jason Sams3c0dfba2009-09-27 17:50:38 -0700330 if(value < 1) {
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800331 throw new RSIllegalArgumentException("Values of less than 1 for Dimension X are not valid.");
Jason Sams3c0dfba2009-09-27 17:50:38 -0700332 }
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800333 mDimX = value;
334 return this;
Jason Sams22534172009-08-04 16:58:20 -0700335 }
336
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800337 public Builder setY(int value) {
338 if(value < 1) {
339 throw new RSIllegalArgumentException("Values of less than 1 for Dimension Y are not valid.");
340 }
341 mDimY = value;
342 return this;
343 }
344
Jason Samsd1c306a2012-12-27 20:26:41 -0800345 public Builder setZ(int value) {
346 if(value < 1) {
347 throw new RSIllegalArgumentException("Values of less than 1 for Dimension Z are not valid.");
348 }
349 mDimZ = value;
350 return this;
351 }
352
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800353 public Builder setMipmaps(boolean value) {
354 mDimMipmaps = value;
355 return this;
356 }
357
358 public Builder setFaces(boolean value) {
359 mDimFaces = value;
360 return this;
361 }
362
Jason Samsb109cc72013-01-07 18:20:12 -0800363 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -0700364 * Set the YUV layout for a Type.
Jason Samsb109cc72013-01-07 18:20:12 -0800365 *
Eino-Ville Talvalaccadaf12013-08-14 10:36:30 -0700366 * @param yuvFormat {@link android.graphics.ImageFormat#YV12}, {@link android.graphics.ImageFormat#NV21}, or
367 * {@link android.graphics.ImageFormat#YUV_420_888}.
Jason Samsb109cc72013-01-07 18:20:12 -0800368 */
369 public Builder setYuvFormat(int yuvFormat) {
370 switch (yuvFormat) {
371 case android.graphics.ImageFormat.NV21:
372 case android.graphics.ImageFormat.YV12:
Eino-Ville Talvalaccadaf12013-08-14 10:36:30 -0700373 case android.graphics.ImageFormat.YUV_420_888:
Jason Samsb109cc72013-01-07 18:20:12 -0800374 break;
375
376 default:
Eino-Ville Talvalaccadaf12013-08-14 10:36:30 -0700377 throw new RSIllegalArgumentException(
378 "Only ImageFormat.NV21, .YV12, and .YUV_420_888 are supported..");
Jason Samsb109cc72013-01-07 18:20:12 -0800379 }
380
381 mYuv = yuvFormat;
382 return this;
383 }
384
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800385
Stephen Hines9c9ad3f8c22012-05-07 15:34:29 -0700386 /**
Tim Murrayc11e25c2013-04-09 11:01:01 -0700387 * Validate structure and create a new Type.
Jason Samsa1b13ed2010-11-12 14:58:37 -0800388 *
389 * @return Type
390 */
Jason Samsb8c5a842009-07-31 20:40:47 -0700391 public Type create() {
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800392 if (mDimZ > 0) {
393 if ((mDimX < 1) || (mDimY < 1)) {
Jason Samsa1b13ed2010-11-12 14:58:37 -0800394 throw new RSInvalidStateException("Both X and Y dimension required when Z is present.");
395 }
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800396 if (mDimFaces) {
Jason Samsa1b13ed2010-11-12 14:58:37 -0800397 throw new RSInvalidStateException("Cube maps not supported with 3D types.");
398 }
399 }
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800400 if (mDimY > 0) {
401 if (mDimX < 1) {
Jason Samsa1b13ed2010-11-12 14:58:37 -0800402 throw new RSInvalidStateException("X dimension required when Y is present.");
403 }
404 }
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800405 if (mDimFaces) {
406 if (mDimY < 1) {
Jason Samsa1b13ed2010-11-12 14:58:37 -0800407 throw new RSInvalidStateException("Cube maps require 2D Types.");
408 }
409 }
410
Jason Samsb109cc72013-01-07 18:20:12 -0800411 if (mYuv != 0) {
412 if ((mDimZ != 0) || mDimFaces || mDimMipmaps) {
413 throw new RSInvalidStateException("YUV only supports basic 2D.");
414 }
415 }
416
Tim Murray7a629fa2013-11-19 12:45:54 -0800417 long id = mRS.nTypeCreate(mElement.getID(mRS),
Jason Samsb109cc72013-01-07 18:20:12 -0800418 mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces, mYuv);
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800419 Type t = new Type(id, mRS);
420 t.mElement = mElement;
421 t.mDimX = mDimX;
422 t.mDimY = mDimY;
423 t.mDimZ = mDimZ;
424 t.mDimMipmaps = mDimMipmaps;
425 t.mDimFaces = mDimFaces;
Jason Samsb109cc72013-01-07 18:20:12 -0800426 t.mDimYuv = mYuv;
Jason Samsbf6ef8d2010-12-06 15:59:59 -0800427
Jason Sams768bc022009-09-21 19:41:04 -0700428 t.calcElementCount();
Jason Sams1bada8c2009-08-09 17:01:55 -0700429 return t;
Jason Samsb8c5a842009-07-31 20:40:47 -0700430 }
431 }
432
433}