Allocation.java revision 11518acc8c416023d8c2192b441a1767205676d9
1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/* 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright (C) 2008 The Android Open Source Project 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Licensed under the Apache License, Version 2.0 (the "License"); 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * you may not use this file except in compliance with the License. 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * You may obtain a copy of the License at 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * http://www.apache.org/licenses/LICENSE-2.0 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Unless required by applicable law or agreed to in writing, software 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * distributed under the License is distributed on an "AS IS" BASIS, 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * See the License for the specific language governing permissions and 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * limitations under the License. 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */ 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpackage android.renderscript; 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport java.io.IOException; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochimport java.io.InputStream; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochimport android.content.res.Resources; 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport android.content.res.AssetManager; 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenimport android.graphics.Bitmap; 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport android.graphics.BitmapFactory; 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport android.util.Log; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport android.util.TypedValue; 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/** 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * <p> 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Memory allocation class for renderscript. An allocation combines a 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * {@link android.renderscript.Type} with the memory to provide storage for user data and objects. 324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch * This implies that all memory in Renderscript is typed. 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * </p> 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * <p>Allocations are the primary way data moves into and out of scripts. Memory is user 363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * synchronized and it's possible for allocations to exist in multiple memory spaces 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * concurrently. Currently those spaces are:</p> 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * <ul> 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * <li>Script: accessable by RS scripts.</li> 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * <li>Graphics Texture: accessable as a graphics texture.</li> 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * <li>Graphics Vertex: accessable as graphical vertex data.</li> 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * <li>Graphics Constants: Accessable as constants in user shaders</li> 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * </ul> 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * </p> 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * <p> 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * For example, when creating a allocation for a texture, the user can 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * specify its memory spaces as both script and textures. This means that it can both 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * be used as script binding and as a GPU texture for rendering. To maintain 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * synchronization if a script modifies an allocation used by other targets it must 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * call a synchronizing function to push the updates to the memory, otherwise the results 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * are undefined. 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * </p> 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * <p>By default, Android system side updates are always applied to the script accessable 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * memory. If this is not present, they are then applied to the various HW 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * memory types. A {@link android.renderscript.Allocation#syncAll syncAll()} 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * call is necessary after the script data is updated to 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * keep the other memory spaces in sync.</p> 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * <p>Allocation data is uploaded in one of two primary ways. For simple 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * arrays there are copyFrom() functions that take an array from the control code and 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * copy it to the slave memory store. Both type checked and unchecked copies are provided. 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * The unchecked variants exist to allow apps to copy over arrays of structures from a 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * control language that does not support structures.</p> 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick **/ 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickpublic class Allocation extends BaseObj { 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Type mType; 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Bitmap mBitmap; 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int mUsage; 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * The usage of the allocation. These signal to renderscript 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * where to place the allocation in memory. 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * SCRIPT The allocation will be bound to and accessed by 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * scripts. 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public static final int USAGE_SCRIPT = 0x0001; 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * GRAPHICS_TEXTURE The allcation will be used as a texture 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * source by one or more graphcics programs. 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public static final int USAGE_GRAPHICS_TEXTURE = 0x0002; 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * GRAPHICS_VERTEX The allocation will be used as a graphics 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * mesh. 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */ 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public static final int USAGE_GRAPHICS_VERTEX = 0x0004; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick /** 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * GRAPHICS_CONSTANTS The allocation will be used as the source 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * of shader constants by one or more programs. 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public static final int USAGE_GRAPHICS_CONSTANTS = 0x0008; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Controls mipmap behavior when using the bitmap creation and 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * update functions. 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public enum MipmapControl { 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * No mipmaps will be generated and the type generated from the 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * incoming bitmap will not contain additional LODs. 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen MIPMAP_NONE(0), 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * A Full mipmap chain will be created in script memory. The 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * type of the allocation will contain a full mipmap chain. On 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * upload to graphics the full chain will be transfered. 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MIPMAP_FULL(1), 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick /** 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * The type of the allocation will be the same as MIPMAP_NONE. 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * It will not contain mipmaps. On upload to graphics the 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * graphics copy of the allocation data will contain a full 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * mipmap chain generated from the top level in script memory. 1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */ 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick MIPMAP_ON_SYNC_TO_TEXTURE(2); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int mID; 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MipmapControl(int id) { 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mID = id; 1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Allocation(int id, RenderScript rs, Type t, int usage) { 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott super(id, rs); 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((usage & ~(USAGE_SCRIPT | 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott USAGE_GRAPHICS_TEXTURE | 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott USAGE_GRAPHICS_VERTEX | 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott USAGE_GRAPHICS_CONSTANTS)) != 0) { 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Unknown usage specified."); 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType = t; 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private void validateIsInt32() { 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((mType.mElement.mType == Element.DataType.SIGNED_32) || 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (mType.mElement.mType == Element.DataType.UNSIGNED_32)) { 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException( 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "32 bit integer source does not match allocation type " + mType.mElement.mType); 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private void validateIsInt16() { 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if ((mType.mElement.mType == Element.DataType.SIGNED_16) || 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen (mType.mElement.mType == Element.DataType.UNSIGNED_16)) { 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException( 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "16 bit integer source does not match allocation type " + mType.mElement.mType); 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private void validateIsInt8() { 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if ((mType.mElement.mType == Element.DataType.SIGNED_8) || 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (mType.mElement.mType == Element.DataType.UNSIGNED_8)) { 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException( 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "8 bit integer source does not match allocation type " + mType.mElement.mType); 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private void validateIsFloat32() { 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mType.mElement.mType == Element.DataType.FLOAT_32) { 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return; 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException( 178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen "32 bit float source does not match allocation type " + mType.mElement.mType); 179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private void validateIsObject() { 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((mType.mElement.mType == Element.DataType.RS_ELEMENT) || 18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (mType.mElement.mType == Element.DataType.RS_TYPE) || 18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (mType.mElement.mType == Element.DataType.RS_ALLOCATION) || 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (mType.mElement.mType == Element.DataType.RS_SAMPLER) || 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (mType.mElement.mType == Element.DataType.RS_SCRIPT) || 18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (mType.mElement.mType == Element.DataType.RS_MESH) || 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (mType.mElement.mType == Element.DataType.RS_PROGRAM_FRAGMENT) || 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (mType.mElement.mType == Element.DataType.RS_PROGRAM_VERTEX) || 19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (mType.mElement.mType == Element.DataType.RS_PROGRAM_RASTER) || 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (mType.mElement.mType == Element.DataType.RS_PROGRAM_STORE)) { 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen throw new RSIllegalArgumentException( 1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch "Object source does not match allocation type " + mType.mElement.mType); 1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 1974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch @Override 1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void updateFromNative() { 2004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch super.updateFromNative(); 2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch int typeID = mRS.nAllocationGetType(getID()); 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if(typeID != 0) { 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType = new Type(typeID, mRS); 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.updateFromNative(); 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public Type getType() { 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return mType; 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void syncAll(int srcLocation) { 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch (srcLocation) { 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case USAGE_SCRIPT: 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case USAGE_GRAPHICS_CONSTANTS: 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case USAGE_GRAPHICS_TEXTURE: 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case USAGE_GRAPHICS_VERTEX: 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott default: 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Source must be exactly one usage type."); 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationSyncAll(getID(), srcLocation); 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyFrom(BaseObj[] d) { 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateIsObject(); 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (d.length != mType.getCount()) { 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Array size mismatch, allocation sizeX = " + 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.getCount() + ", array length = " + d.length); 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int i[] = new int[d.length]; 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int ct=0; ct < d.length; ct++) { 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott i[ct] = d[ct].getID(); 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott copy1DRangeFromUnchecked(0, mType.getCount(), i); 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private void validateBitmapFormat(Bitmap b) { 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bitmap.Config bc = b.getConfig(); 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott switch (bc) { 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case ALPHA_8: 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mType.getElement().mKind != Element.DataKind.PIXEL_A) { 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Allocation kind is " + 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.getElement().mKind + ", type " + 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.getElement().mType + 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " of " + mType.getElement().getSizeBytes() + 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " bytes, passed bitmap was " + bc); 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case ARGB_8888: 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) || 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (mType.getElement().getSizeBytes() != 4)) { 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch throw new RSIllegalArgumentException("Allocation kind is " + 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mType.getElement().mKind + ", type " + 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.getElement().mType + 25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen " of " + mType.getElement().getSizeBytes() + 25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen " bytes, passed bitmap was " + bc); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case RGB_565: 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGB) || 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (mType.getElement().getSizeBytes() != 2)) { 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Allocation kind is " + 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.getElement().mKind + ", type " + 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.getElement().mType + 268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " of " + mType.getElement().getSizeBytes() + 269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " bytes, passed bitmap was " + bc); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott case ARGB_4444: 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) || 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (mType.getElement().getSizeBytes() != 2)) { 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch throw new RSIllegalArgumentException("Allocation kind is " + 276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.getElement().mKind + ", type " + 27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen mType.getElement().mType + 27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen " of " + mType.getElement().getSizeBytes() + 279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " bytes, passed bitmap was " + bc); 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott break; 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private void validateBitmapSize(Bitmap b) { 287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if(mType.getX() != b.getWidth() || 288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.getY() != b.getHeight()) { 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch"); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copy an allocation from an array. This variant is not type 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * checked which allows an application to fill in structured 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * data from an array. 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * @param d the source data array 299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public void copyFromUnchecked(int[] d) { 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mRS.validate(); 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch copy1DRangeFromUnchecked(0, mType.getCount(), d); 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch /** 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Copy an allocation from an array. This variant is not type 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * checked which allows an application to fill in structured 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * data from an array. 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @param d the source data array 31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public void copyFromUnchecked(short[] d) { 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mRS.validate(); 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch copy1DRangeFromUnchecked(0, mType.getCount(), d); 3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Copy an allocation from an array. This variant is not type 31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * checked which allows an application to fill in structured 3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * data from an array. 3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param d the source data array 32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public void copyFromUnchecked(byte[] d) { 32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen mRS.validate(); 324201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch copy1DRangeFromUnchecked(0, mType.getCount(), d); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copy an allocation from an array. This variant is not type 3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * checked which allows an application to fill in structured 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * data from an array. 3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param d the source data array 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */ 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public void copyFromUnchecked(float[] d) { 3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick mRS.validate(); 3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick copy1DRangeFromUnchecked(0, mType.getCount(), d); 336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copy an allocation from an array. This variant is type 340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * checked and will generate exceptions if the Allocation type 341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * is not a 32 bit integer type. 342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param d the source data array 344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyFrom(int[] d) { 346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott copy1DRangeFrom(0, mType.getCount(), d); 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copy an allocation from an array. This variant is type 352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * checked and will generate exceptions if the Allocation type 353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * is not a 16 bit integer type. 354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param d the source data array 356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyFrom(short[] d) { 358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott copy1DRangeFrom(0, mType.getCount(), d); 360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch /** 363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copy an allocation from an array. This variant is type 364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * checked and will generate exceptions if the Allocation type 365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * is not a 8 bit integer type. 366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param d the source data array 368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyFrom(byte[] d) { 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott copy1DRangeFrom(0, mType.getCount(), d); 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch /** 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Copy an allocation from an array. This variant is type 376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * checked and will generate exceptions if the Allocation type 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * is not a 32 bit float type. 378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param d the source data array 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyFrom(float[] d) { 382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott copy1DRangeFrom(0, mType.getCount(), d); 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Copy an allocation from a bitmap. The height, width, and 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * format of the bitmap must match the existing allocation. 389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param b the source bitmap 391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyFrom(Bitmap b) { 393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateBitmapSize(b); 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateBitmapFormat(b); 396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationCopyFromBitmap(getID(), b); 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * This is only intended to be used by auto-generate code reflected from the 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * renderscript script files. 402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param xoff 404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param fp 405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void setFromFieldPacker(int xoff, FieldPacker fp) { 407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int eSize = mType.mElement.getSizeBytes(); 408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott final byte[] data = fp.getData(); 409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int count = data.length / eSize; 411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((eSize * count) != data.length) { 412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Field packer length " + data.length + 413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " not divisible by element size " + eSize + "."); 414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott data1DChecks(xoff, count, data.length, data.length); 416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationData1D(getID(), xoff, 0, count, data, data.length); 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * This is only intended to be used by auto-generate code reflected from the 421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * renderscript script files. 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param xoff 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param component_number 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param fp 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) { 428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (component_number >= mType.mElement.mElements.length) { 429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Component_number " + component_number + " out of range."); 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if(xoff < 0) { 432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Offset must be >= 0."); 433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott final byte[] data = fp.getData(); 436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int eSize = mType.mElement.mElements[component_number].getSizeBytes(); 437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (data.length != eSize) { 439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Field packer sizelength " + data.length + 440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " does not match component size " + eSize + "."); 441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationElementData1D(getID(), xoff, 0, component_number, data, data.length); 444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private void data1DChecks(int off, int count, int len, int dataSize) { 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch mRS.validate(); 448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if(off < 0) { 449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Offset must be >= 0."); 450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if(count < 1) { 452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Count must be >= 1."); 453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if((off + count) > mType.getCount()) { 455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Overflow, Available count " + mType.getCount() + 456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ", got " + count + " at offset " + off + "."); 457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if((len) < dataSize) { 459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Array too small for allocation type."); 460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Generate a mipmap chain. Requires the type of the allocation 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * include mipmaps. 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * This function will generate a complete set of mipmaps from 468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the top level lod and place them into the script memoryspace. 469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * If the allocation is also using other memory spaces a 471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * followup sync will be required. 4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */ 4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public void generateMipmaps() { 4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick mRS.nAllocationGenerateMipmaps(getID()); 4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick /** 4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Copy part of an allocation from an array. This variant is 4793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * not type checked which allows an application to fill in 4803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * structured data from an array. 4813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param off The offset of the first element to be copied. 4833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param count The number of elements to be copied. 4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param d the source data array 4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */ 4863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public void copy1DRangeFromUnchecked(int off, int count, int[] d) { 487513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int dataSize = mType.mElement.getSizeBytes() * count; 488513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch data1DChecks(off, count, d.length * 4, dataSize); 489513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); 490513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 491513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch /** 492513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Copy part of an allocation from an array. This variant is 493513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * not type checked which allows an application to fill in 494513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * structured data from an array. 495513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * 496513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param off The offset of the first element to be copied. 497513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param count The number of elements to be copied. 498513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param d the source data array 499513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */ 500513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public void copy1DRangeFromUnchecked(int off, int count, short[] d) { 501513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int dataSize = mType.mElement.getSizeBytes() * count; 502513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch data1DChecks(off, count, d.length * 2, dataSize); 503513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); 504513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 505513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch /** 506513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Copy part of an allocation from an array. This variant is 507513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * not type checked which allows an application to fill in 508513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * structured data from an array. 509513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * 510513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param off The offset of the first element to be copied. 511513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param count The number of elements to be copied. 512513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param d the source data array 513513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */ 514513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public void copy1DRangeFromUnchecked(int off, int count, byte[] d) { 515513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int dataSize = mType.mElement.getSizeBytes() * count; 516513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch data1DChecks(off, count, d.length, dataSize); 517513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); 518513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 519513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch /** 520513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Copy part of an allocation from an array. This variant is 521513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * not type checked which allows an application to fill in 522513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * structured data from an array. 523513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * 524513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param off The offset of the first element to be copied. 525513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param count The number of elements to be copied. 526513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param d the source data array 527513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */ 528513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public void copy1DRangeFromUnchecked(int off, int count, float[] d) { 529513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int dataSize = mType.mElement.getSizeBytes() * count; 530513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch data1DChecks(off, count, d.length * 4, dataSize); 531513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); 532513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 533513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 534513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch /** 535513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Copy part of an allocation from an array. This variant is 536513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * type checked and will generate exceptions if the Allocation 537513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * type is not a 32 bit integer type. 538513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * 539513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param off The offset of the first element to be copied. 540513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param count The number of elements to be copied. 541513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param d the source data array 542513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */ 543513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public void copy1DRangeFrom(int off, int count, int[] d) { 544513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch validateIsInt32(); 545513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch copy1DRangeFromUnchecked(off, count, d); 546513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 547513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 5483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick /** 5493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Copy part of an allocation from an array. This variant is 5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * type checked and will generate exceptions if the Allocation 5513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * type is not a 16 bit integer type. 5523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 5533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param off The offset of the first element to be copied. 5543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param count The number of elements to be copied. 5553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param d the source data array 5563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */ 5573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public void copy1DRangeFrom(int off, int count, short[] d) { 5583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick validateIsInt16(); 5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick copy1DRangeFromUnchecked(off, count, d); 5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick /** 5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Copy part of an allocation from an array. This variant is 5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * type checked and will generate exceptions if the Allocation 5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * type is not a 8 bit integer type. 5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param off The offset of the first element to be copied. 568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param count The number of elements to be copied. 569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param d the source data array 570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copy1DRangeFrom(int off, int count, byte[] d) { 572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateIsInt8(); 573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott copy1DRangeFromUnchecked(off, count, d); 574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 57672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 57772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Copy part of an allocation from an array. This variant is 57872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * type checked and will generate exceptions if the Allocation 57972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * type is not a 32 bit float type. 580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param off The offset of the first element to be copied. 582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param count The number of elements to be copied. 583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param d the source data array 584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copy1DRangeFrom(int off, int count, float[] d) { 586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateIsFloat32(); 587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott copy1DRangeFromUnchecked(off, count, d); 588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private void validate2DRange(int xoff, int yoff, int w, int h) { 591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (xoff < 0 || yoff < 0) { 592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Offset cannot be negative."); 593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (h < 0 || w < 0) { 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch throw new RSIllegalArgumentException("Height or width cannot be negative."); 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((xoff + w) > mType.mDimX || 598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (yoff + h) > mType.mDimY) { 599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Updated region larger than allocation."); 600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copy a rectanglular region from the array into the 605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * allocation. The incoming array is assumed to be tightly 606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * packed. 607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param xoff X offset of the region to update 609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param yoff Y offset of the region to update 610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param w Width of the incoming region to update 611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param h Height of the incoming region to update 612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param data to be placed into the allocation 613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copy2DRangeFrom(int xoff, int yoff, int w, int h, byte[] data) { 615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validate2DRange(xoff, yoff, w, h); 617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, data, data.length); 618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copy2DRangeFrom(int xoff, int yoff, int w, int h, short[] data) { 621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validate2DRange(xoff, yoff, w, h); 623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, data, data.length * 2); 624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copy2DRangeFrom(int xoff, int yoff, int w, int h, int[] data) { 627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validate2DRange(xoff, yoff, w, h); 629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, data, data.length * 4); 630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 632513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public void copy2DRangeFrom(int xoff, int yoff, int w, int h, float[] data) { 633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validate2DRange(xoff, yoff, w, h); 635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, data, data.length * 4); 636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copy a bitmap into an allocation. The height and width of 640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the update will use the height and width of the incoming 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * bitmap. 642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param xoff X offset of the region to update 6443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param yoff Y offset of the region to update 645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param data the bitmap to be copied 646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copy2DRangeFrom(int xoff, int yoff, Bitmap data) { 648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateBitmapFormat(data); 650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validate2DRange(xoff, yoff, data.getWidth(), data.getHeight()); 651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, data); 652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 65472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 65572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public void copyTo(Bitmap b) { 656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateBitmapFormat(b); 658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch validateBitmapSize(b); 659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationCopyToBitmap(getID(), b); 660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyTo(byte[] d) { 663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateIsInt8(); 664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationRead(getID(), d); 666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyTo(short[] d) { 669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateIsInt16(); 670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationRead(getID(), d); 672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyTo(int[] d) { 675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateIsInt32(); 676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationRead(getID(), d); 678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void copyTo(float[] d) { 681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott validateIsFloat32(); 682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.validate(); 683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationRead(getID(), d); 684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 68572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 68672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 68772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Resize a 1D allocation. The contents of the allocation are 68872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * preserved. If new elements are allocated objects are created 689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * with null contents and the new region is otherwise undefined. 690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * If the new region is smaller the references of any objects 692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * outside the new region will be released. 693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * A new type will be created with the new dimension. 695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param dimX The new size of the allocation. 697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public synchronized void resize(int dimX) { 699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) { 700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch throw new RSInvalidStateException("Resize only support for 1D allocations at this time."); 701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationResize1D(getID(), dimX); 703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.finish(); // Necessary because resize is fifoed and update is async. 704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int typeID = mRS.nAllocationGetType(getID()); 706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType = new Type(typeID, mRS); 707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mType.updateFromNative(); 708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /* 711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public void resize(int dimX, int dimY) { 712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if ((mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) { 713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalStateException("Resize only support for 2D allocations at this time."); 714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (mType.getY() == 0) { 716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalStateException("Resize only support for 2D allocations at this time."); 717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott mRS.nAllocationResize2D(getID(), dimX, dimY); 719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // creation 725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options(); 72772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static { 72872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen mBitmapOptions.inScaled = false; 72972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 73072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param type renderscript type describing data layout 734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param mips specifies desired mipmap behaviour for the 735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * allocation 736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param usage bit field specifying how the allocation is 737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * utilized 738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createTyped(RenderScript rs, Type type, MipmapControl mips, int usage) { 740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rs.validate(); 741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (type.getID() == 0) { 742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch throw new RSInvalidStateException("Bad Type"); 743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int id = rs.nAllocationCreateTyped(type.getID(), mips.mID, usage); 745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (id == 0) { 746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSRuntimeException("Allocation creation failed."); 747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return new Allocation(id, rs, type, usage); 749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Creates a renderscript allocation with the size specified by 753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * the type and no mipmaps generated by default 754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param type renderscript type describing data layout 757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param usage bit field specifying how the allocation is 758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * utilized 759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return allocation 761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createTyped(RenderScript rs, Type type, int usage) { 763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return createTyped(rs, type, MipmapControl.MIPMAP_NONE, usage); 764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 76672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 76772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Creates a renderscript allocation for use by the script with 76872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * the size specified by the type and no mipmaps generated by 76972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * default 770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param type renderscript type describing data layout 773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @return allocation 775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createTyped(RenderScript rs, Type type) { 777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return createTyped(rs, type, MipmapControl.MIPMAP_NONE, USAGE_SCRIPT); 778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Creates a renderscript allocation with a specified number of 782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * given elements 783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param e describes what each element of an allocation is 786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param count specifies the number of element in the allocation 787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param usage bit field specifying how the allocation is 788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * utilized 789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return allocation 791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createSized(RenderScript rs, Element e, 793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int count, int usage) { 794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rs.validate(); 795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Type.Builder b = new Type.Builder(rs, e); 796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b.setX(count); 79772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Type t = b.create(); 79872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 79972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int id = rs.nAllocationCreateTyped(t.getID(), MipmapControl.MIPMAP_NONE.mID, usage); 80072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (id == 0) { 801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSRuntimeException("Allocation creation failed."); 802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return new Allocation(id, rs, t, usage); 804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Creates a renderscript allocation with a specified number of 808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * given elements 809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param e describes what each element of an allocation is 812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param count specifies the number of element in the allocation 813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return allocation 815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createSized(RenderScript rs, Element e, int count) { 817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return createSized(rs, e, count, USAGE_SCRIPT); 818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Element elementFromBitmap(RenderScript rs, Bitmap b) { 821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott final Bitmap.Config bc = b.getConfig(); 822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc == Bitmap.Config.ALPHA_8) { 823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return Element.A_8(rs); 824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 82572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (bc == Bitmap.Config.ARGB_4444) { 82672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return Element.RGBA_4444(rs); 82772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc == Bitmap.Config.ARGB_8888) { 829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return Element.RGBA_8888(rs); 830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (bc == Bitmap.Config.RGB_565) { 832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return Element.RGB_565(rs); 833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSInvalidStateException("Bad bitmap type: " + bc); 835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static Type typeFromBitmap(RenderScript rs, Bitmap b, 838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MipmapControl mip) { 839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Element e = elementFromBitmap(rs, b); 840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Type.Builder tb = new Type.Builder(rs, e); 841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch tb.setX(b.getWidth()); 842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tb.setY(b.getHeight()); 843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tb.setMipmaps(mip == MipmapControl.MIPMAP_FULL); 844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return tb.create(); 845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Creates a renderscript allocation from a bitmap 849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param b bitmap source for the allocation data 852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param mips specifies desired mipmap behaviour for the 853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * allocation 854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param usage bit field specifying how the allocation is 855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * utilized 856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return renderscript allocation containing bitmap data 858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createFromBitmap(RenderScript rs, Bitmap b, 861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MipmapControl mips, 862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int usage) { 863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rs.validate(); 864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Type t = typeFromBitmap(rs, b, mips); 865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int id = rs.nAllocationCreateFromBitmap(t.getID(), mips.mID, b, usage); 867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (id == 0) { 868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSRuntimeException("Load failed."); 869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return new Allocation(id, rs, t, usage); 871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Creates a non-mipmapped renderscript allocation to use as a 875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * graphics texture 876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param b bitmap source for the allocation data 879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return renderscript allocation containing bitmap data 881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createFromBitmap(RenderScript rs, Bitmap b) { 884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return createFromBitmap(rs, b, MipmapControl.MIPMAP_NONE, 885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott USAGE_GRAPHICS_TEXTURE); 886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 88872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen /** 88972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * Creates a cubemap allocation from a bitmap containing the 89072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * horizontal list of cube faces. Each individual face must be 89172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * the same size and power of 2 892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param b bitmap with cubemap faces layed out in the following 895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * format: right, left, top, bottom, front, back 896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param mips specifies desired mipmap behaviour for the cubemap 897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param usage bit field specifying how the cubemap is utilized 898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return allocation containing cubemap data 900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createCubemapFromBitmap(RenderScript rs, Bitmap b, 903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MipmapControl mips, 904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int usage) { 905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rs.validate(); 906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int height = b.getHeight(); 908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int width = b.getWidth(); 909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (width % 6 != 0) { 911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Cubemap height must be multiple of 6"); 912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (width / 6 != height) { 914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Only square cube map faces supported"); 915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott boolean isPow2 = (height & (height - 1)) == 0; 917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (!isPow2) { 918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSIllegalArgumentException("Only power of 2 cube faces supported"); 919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Element e = elementFromBitmap(rs, b); 922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Type.Builder tb = new Type.Builder(rs, e); 923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tb.setX(height); 924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tb.setY(height); 925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tb.setFaces(true); 926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL); 927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Type t = tb.create(); 928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int id = rs.nAllocationCubeCreateFromBitmap(t.getID(), mips.mID, b, usage); 930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if(id == 0) { 931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e); 932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return new Allocation(id, rs, t, usage); 9343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 9353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick /** 937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Creates a non-mipmapped cubemap allocation for use as a 938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * graphics texture from a bitmap containing the horizontal list 939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * of cube faces. Each individual face must be the same size and 940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * power of 2 941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 94272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @param rs Context to which the allocation will belong. 94372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * @param b bitmap with cubemap faces layed out in the following 94472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * format: right, left, top, bottom, front, back 9453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 9463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @return allocation containing cubemap data 9473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */ 9493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static public Allocation createCubemapFromBitmap(RenderScript rs, 9503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Bitmap b) { 951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return createCubemapFromBitmap(rs, b, MipmapControl.MIPMAP_NONE, 9523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick USAGE_GRAPHICS_TEXTURE); 9533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 9543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick /** 9563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Creates a cubemap allocation from 6 bitmaps containing 9573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * the cube faces. All the faces must be the same size and 9583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * power of 2 9593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * 9603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param rs Context to which the allocation will belong. 9613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param xpos cubemap face in the positive x direction 962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param xneg cubemap face in the negative x direction 963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param ypos cubemap face in the positive y direction 964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param yneg cubemap face in the negative y direction 965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param zpos cubemap face in the positive z direction 966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param zneg cubemap face in the negative z direction 967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param mips specifies desired mipmap behaviour for the cubemap 968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param usage bit field specifying how the cubemap is utilized 969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @return allocation containing cubemap data 971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */ 973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static public Allocation createCubemapFromCubeFaces(RenderScript rs, 9743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Bitmap xpos, 9753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Bitmap xneg, 9763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Bitmap ypos, 9773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Bitmap yneg, 978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Bitmap zpos, 979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Bitmap zneg, 980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MipmapControl mips, 981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int usage) { 982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int height = xpos.getHeight(); 983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (xpos.getWidth() != height || 984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch xneg.getWidth() != height || xneg.getHeight() != height || 985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ypos.getWidth() != height || ypos.getHeight() != height || 986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch yneg.getWidth() != height || yneg.getHeight() != height || 987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch zpos.getWidth() != height || zpos.getHeight() != height || 988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch zneg.getWidth() != height || zneg.getHeight() != height) { 9893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick throw new RSIllegalArgumentException("Only square cube map faces supported"); 990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 9913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick boolean isPow2 = (height & (height - 1)) == 0; 9923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!isPow2) { 9933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick throw new RSIllegalArgumentException("Only power of 2 cube faces supported"); 9943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Element e = elementFromBitmap(rs, xpos); 9973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Type.Builder tb = new Type.Builder(rs, e); 9983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick tb.setX(height); 9993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick tb.setY(height); 10003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick tb.setFaces(true); 10013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL); 10023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Type t = tb.create(); 10033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Allocation cubemap = Allocation.createTyped(rs, t, mips, usage); 10043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AllocationAdapter adapter = AllocationAdapter.create2D(rs, cubemap); 10063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.setFace(Type.CubemapFace.POSITVE_X); 10073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.copyFrom(xpos); 10083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.setFace(Type.CubemapFace.NEGATIVE_X); 10093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.copyFrom(xneg); 10103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.setFace(Type.CubemapFace.POSITVE_Y); 10113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.copyFrom(ypos); 10123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.setFace(Type.CubemapFace.NEGATIVE_Y); 10133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.copyFrom(yneg); 10143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.setFace(Type.CubemapFace.POSITVE_Z); 10153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.copyFrom(zpos); 10163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.setFace(Type.CubemapFace.NEGATIVE_Z); 10173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick adapter.copyFrom(zneg); 10183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return cubemap; 10203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 10213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick /** 10233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * Creates a non-mipmapped cubemap allocation for use as a 10243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * graphics texture from 6 bitmaps containing 10253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * the cube faces. All the faces must be the same size and 10263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * power of 2 1027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * @param rs Context to which the allocation will belong. 1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param xpos cubemap face in the positive x direction 1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param xneg cubemap face in the negative x direction 1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param ypos cubemap face in the positive y direction 1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param yneg cubemap face in the negative y direction 1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param zpos cubemap face in the positive z direction 1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param zneg cubemap face in the negative z direction 1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return allocation containing cubemap data 103772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen * 103872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen */ 103972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static public Allocation createCubemapFromCubeFaces(RenderScript rs, 104072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Bitmap xpos, 1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bitmap xneg, 1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bitmap ypos, 1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bitmap yneg, 1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bitmap zpos, 1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bitmap zneg) { 1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return createCubemapFromCubeFaces(rs, xpos, xneg, ypos, yneg, 1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott zpos, zneg, MipmapControl.MIPMAP_NONE, 1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott USAGE_GRAPHICS_TEXTURE); 1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Creates a renderscript allocation from the bitmap referenced 1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * by resource id 1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param res application resources 1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param id resource id to load the data from 1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param mips specifies desired mipmap behaviour for the 1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * allocation 1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param usage bit field specifying how the allocation is 1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * utilized 1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return renderscript allocation containing resource data 1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createFromBitmapResource(RenderScript rs, 1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Resources res, 1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int id, 1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MipmapControl mips, 1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int usage) { 1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rs.validate(); 1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Bitmap b = BitmapFactory.decodeResource(res, id); 1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Allocation alloc = createFromBitmap(rs, b, mips, usage); 1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott b.recycle(); 1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return alloc; 1077c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch /** 1080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Creates a non-mipmapped renderscript allocation to use as a 1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * graphics texture from the bitmap referenced by resource id 1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param res application resources 1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param id resource id to load the data from 1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * 1087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @return renderscript allocation containing resource data 1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 1090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createFromBitmapResource(RenderScript rs, 1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Resources res, 1092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int id) { 1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return createFromBitmapResource(rs, res, id, 1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott MipmapControl.MIPMAP_NONE, 1095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott USAGE_GRAPHICS_TEXTURE); 1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott /** 1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Creates a renderscript allocation containing string data 1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * encoded in UTF-8 format 1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param rs Context to which the allocation will belong. 1103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * @param str string to create the allocation from 11043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * @param usage bit field specifying how the allocaiton is 1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * utilized 1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * 1107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott */ 1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static public Allocation createFromString(RenderScript rs, 1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott String str, 1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int usage) { 1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rs.validate(); 1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott byte[] allocArray = null; 1113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott try { 1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott allocArray = str.getBytes("UTF-8"); 1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length, usage); 1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott alloc.copyFrom(allocArray); 1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return alloc; 1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott catch (Exception e) { 1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott throw new RSRuntimeException("Could not convert string to utf-8."); 1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 112272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 112372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 112472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 112572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott