Allocation.java revision dcc231955d81c66309ce97cca05a25f79ee7d5ea
1b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/* 2b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Copyright (C) 2008 The Android Open Source Project 3b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * 4b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * you may not use this file except in compliance with the License. 6b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * You may obtain a copy of the License at 7b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * 8b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * 10b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Unless required by applicable law or agreed to in writing, software 11b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * See the License for the specific language governing permissions and 14b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * limitations under the License. 15b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams */ 16b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 17b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspackage android.renderscript; 18b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 19b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport java.io.IOException; 20b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport java.io.InputStream; 21b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.content.res.Resources; 22650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guyimport android.content.res.AssetManager; 23b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.graphics.Bitmap; 24b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.graphics.BitmapFactory; 25b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.util.Log; 26650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guyimport android.util.TypedValue; 27b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 28b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/** 29a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * Memory allocation class for renderscript. An allocation combines a Type with 30a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * memory to provide storage for user data and objects. 31a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * 32a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * Allocations may exist in one or more memory spaces. Currently those are 33a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * Script: accessable by RS scripts. 34a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * Graphics Texture: accessable as a graphics texture. 35a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * Graphics Vertex: accessable as graphical vertex data. 36a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * Graphics Constants: Accessable as constants in user shaders 37a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * 38a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * By default java side updates are always applied to the script accessable 39a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * memory. If this is not present they are then applied to the various HW 40a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * memory types. A syncAll call is necessary after the script data is update to 41a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * keep the other memory spaces in sync. 42b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * 43b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams **/ 44b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspublic class Allocation extends BaseObj { 4543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams Type mType; 468a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Bitmap mBitmap; 475476b450e50939940dcf3f15c92335cee2fc572dJason Sams int mUsage; 485476b450e50939940dcf3f15c92335cee2fc572dJason Sams 495476b450e50939940dcf3f15c92335cee2fc572dJason Sams public static final int USAGE_SCRIPT = 0x0001; 505476b450e50939940dcf3f15c92335cee2fc572dJason Sams public static final int USAGE_GRAPHICS_TEXTURE = 0x0002; 515476b450e50939940dcf3f15c92335cee2fc572dJason Sams public static final int USAGE_GRAPHICS_VERTEX = 0x0004; 525476b450e50939940dcf3f15c92335cee2fc572dJason Sams public static final int USAGE_GRAPHICS_CONSTANTS = 0x0008; 535476b450e50939940dcf3f15c92335cee2fc572dJason Sams 5443ee06857bb7f99446d1d84f8789016c5d105558Jason Sams 554ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams public enum MipmapControl { 565476b450e50939940dcf3f15c92335cee2fc572dJason Sams MIPMAP_NONE(0), 575476b450e50939940dcf3f15c92335cee2fc572dJason Sams MIPMAP_FULL(1), 585476b450e50939940dcf3f15c92335cee2fc572dJason Sams MIPMAP_ON_SYNC_TO_TEXTURE(2); 595476b450e50939940dcf3f15c92335cee2fc572dJason Sams 605476b450e50939940dcf3f15c92335cee2fc572dJason Sams int mID; 614ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams MipmapControl(int id) { 625476b450e50939940dcf3f15c92335cee2fc572dJason Sams mID = id; 635476b450e50939940dcf3f15c92335cee2fc572dJason Sams } 64b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 65b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 665476b450e50939940dcf3f15c92335cee2fc572dJason Sams Allocation(int id, RenderScript rs, Type t, int usage) { 670de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk super(id, rs); 6849a05d7b82956009f03acbb92a064eed054eb031Jason Sams if ((usage & ~(USAGE_SCRIPT | 6949a05d7b82956009f03acbb92a064eed054eb031Jason Sams USAGE_GRAPHICS_TEXTURE | 7049a05d7b82956009f03acbb92a064eed054eb031Jason Sams USAGE_GRAPHICS_VERTEX | 7149a05d7b82956009f03acbb92a064eed054eb031Jason Sams USAGE_GRAPHICS_CONSTANTS)) != 0) { 725476b450e50939940dcf3f15c92335cee2fc572dJason Sams throw new RSIllegalArgumentException("Unknown usage specified."); 735476b450e50939940dcf3f15c92335cee2fc572dJason Sams } 745476b450e50939940dcf3f15c92335cee2fc572dJason Sams mType = t; 7580a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk } 7680a4c2cd34aedb4f1a2e5e7d1ac26a9aeebe41aeAlex Sakhartchouk 77dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk @Override 78dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk void updateFromNative() { 7906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams super.updateFromNative(); 8006d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams int typeID = mRS.nAllocationGetType(getID()); 81dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk if(typeID != 0) { 82dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mType = new Type(typeID, mRS); 83dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk mType.updateFromNative(); 84dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 85dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk } 86dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk 87ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams public Type getType() { 88ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams return mType; 89ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams } 90ea87e96959895ef94cc3aa9576f41a660d2bbf03Jason Sams 915476b450e50939940dcf3f15c92335cee2fc572dJason Sams public void syncAll(int srcLocation) { 925476b450e50939940dcf3f15c92335cee2fc572dJason Sams switch (srcLocation) { 935476b450e50939940dcf3f15c92335cee2fc572dJason Sams case USAGE_SCRIPT: 945476b450e50939940dcf3f15c92335cee2fc572dJason Sams case USAGE_GRAPHICS_CONSTANTS: 955476b450e50939940dcf3f15c92335cee2fc572dJason Sams case USAGE_GRAPHICS_TEXTURE: 965476b450e50939940dcf3f15c92335cee2fc572dJason Sams case USAGE_GRAPHICS_VERTEX: 975476b450e50939940dcf3f15c92335cee2fc572dJason Sams break; 985476b450e50939940dcf3f15c92335cee2fc572dJason Sams default: 995476b450e50939940dcf3f15c92335cee2fc572dJason Sams throw new RSIllegalArgumentException("Source must be exactly one usage type."); 1005476b450e50939940dcf3f15c92335cee2fc572dJason Sams } 1015476b450e50939940dcf3f15c92335cee2fc572dJason Sams mRS.validate(); 1025476b450e50939940dcf3f15c92335cee2fc572dJason Sams mRS.nAllocationSyncAll(getID(), srcLocation); 1035476b450e50939940dcf3f15c92335cee2fc572dJason Sams } 1045476b450e50939940dcf3f15c92335cee2fc572dJason Sams 105bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public void copyFrom(BaseObj[] d) { 106bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams mRS.validate(); 107bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if (d.length != mType.getCount()) { 108bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams throw new RSIllegalArgumentException("Array size mismatch, allocation sizeX = " + 109bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams mType.getCount() + ", array length = " + d.length); 110bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams } 111bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams int i[] = new int[d.length]; 112bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams for (int ct=0; ct < d.length; ct++) { 113bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams i[ct] = d[ct].getID(); 114bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams } 115fa445b9353972735d8d65e8a936786b1afe9886dJason Sams copy1DRangeFrom(0, mType.getCount(), i); 116bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams } 117bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams 1184ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams private void validateBitmap(Bitmap b) { 1194ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams mRS.validate(); 1204ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams if(mType.getX() != b.getWidth() || 1214ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams mType.getY() != b.getHeight()) { 1224ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch"); 1234ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams } 1244ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams } 1254ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams 126bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public void copyFrom(int[] d) { 127771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 128fa445b9353972735d8d65e8a936786b1afe9886dJason Sams copy1DRangeFrom(0, mType.getCount(), d); 129768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 130bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public void copyFrom(short[] d) { 131771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 132fa445b9353972735d8d65e8a936786b1afe9886dJason Sams copy1DRangeFrom(0, mType.getCount(), d); 133768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 134bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public void copyFrom(byte[] d) { 135771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 136fa445b9353972735d8d65e8a936786b1afe9886dJason Sams copy1DRangeFrom(0, mType.getCount(), d); 137b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 138bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public void copyFrom(float[] d) { 139771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 140fa445b9353972735d8d65e8a936786b1afe9886dJason Sams copy1DRangeFrom(0, mType.getCount(), d); 141b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 142bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams public void copyFrom(Bitmap b) { 1434ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams validateBitmap(b); 1444ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams mRS.nAllocationCopyFromBitmap(getID(), b); 1454ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams } 14626ae3904e8050eae655722caf93ee5d3f0ab195aAlex Sakhartchouk 147fa445b9353972735d8d65e8a936786b1afe9886dJason Sams /** 148fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * @hide 149fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * 150fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * This is only intended to be used by auto-generate code reflected from the 151fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * renderscript script files. 152fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * 153fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * @param xoff 154fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * @param fp 155fa445b9353972735d8d65e8a936786b1afe9886dJason Sams */ 156fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void setOneElement(int xoff, FieldPacker fp) { 157a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams int eSize = mType.mElement.getSizeBytes(); 158a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams final byte[] data = fp.getData(); 159a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams 160a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams int count = data.length / eSize; 161a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if ((eSize * count) != data.length) { 16206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Field packer length " + data.length + 163a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams " not divisible by element size " + eSize + "."); 164a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 16549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams data1DChecks(xoff, count, data.length, data.length); 16649a05d7b82956009f03acbb92a064eed054eb031Jason Sams mRS.nAllocationData1D(getID(), xoff, 0, count, data, data.length); 16749bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 16849bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 16949bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 170fa445b9353972735d8d65e8a936786b1afe9886dJason Sams /** 171fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * @hide 172fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * 173fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * This is only intended to be used by auto-generate code reflected from the 174fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * renderscript script files. 175fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * 176fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * @param xoff 177fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * @param component_number 178fa445b9353972735d8d65e8a936786b1afe9886dJason Sams * @param fp 179fa445b9353972735d8d65e8a936786b1afe9886dJason Sams */ 180fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void setOneComponent(int xoff, int component_number, FieldPacker fp) { 18149bdaf0293408159df18a1d8540360f9623c40f7Jason Sams if (component_number >= mType.mElement.mElements.length) { 18206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Component_number " + component_number + " out of range."); 18349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 18449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams if(xoff < 0) { 18506d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Offset must be >= 0."); 18649bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 18749bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 18849bdaf0293408159df18a1d8540360f9623c40f7Jason Sams final byte[] data = fp.getData(); 18949bdaf0293408159df18a1d8540360f9623c40f7Jason Sams int eSize = mType.mElement.mElements[component_number].getSizeBytes(); 19049bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 19149bdaf0293408159df18a1d8540360f9623c40f7Jason Sams if (data.length != eSize) { 19206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Field packer sizelength " + data.length + 19349bdaf0293408159df18a1d8540360f9623c40f7Jason Sams " does not match component size " + eSize + "."); 19449bdaf0293408159df18a1d8540360f9623c40f7Jason Sams } 19549bdaf0293408159df18a1d8540360f9623c40f7Jason Sams 19649a05d7b82956009f03acbb92a064eed054eb031Jason Sams mRS.nAllocationElementData1D(getID(), xoff, 0, component_number, data, data.length); 197a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 198a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams 199768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams private void data1DChecks(int off, int count, int len, int dataSize) { 200771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 201a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if(off < 0) { 20206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Offset must be >= 0."); 203a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 204a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams if(count < 1) { 20506d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Count must be >= 1."); 206a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams } 207bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if((off + count) > mType.getCount()) { 208bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams throw new RSIllegalArgumentException("Overflow, Available count " + mType.getCount() + 209a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams ", got " + count + " at offset " + off + "."); 210768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 211768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if((len) < dataSize) { 21206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalArgumentException("Array too small for allocation type."); 213768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 214b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 215b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 216fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copy1DRangeFrom(int off, int count, int[] d) { 217768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 218768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 4, dataSize); 21949a05d7b82956009f03acbb92a064eed054eb031Jason Sams mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); 220768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 221fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copy1DRangeFrom(int off, int count, short[] d) { 222768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 223768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 2, dataSize); 22449a05d7b82956009f03acbb92a064eed054eb031Jason Sams mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); 225768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 226fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copy1DRangeFrom(int off, int count, byte[] d) { 227768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 228768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length, dataSize); 22949a05d7b82956009f03acbb92a064eed054eb031Jason Sams mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); 230768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 231fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copy1DRangeFrom(int off, int count, float[] d) { 232768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int dataSize = mType.mElement.getSizeBytes() * count; 233768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams data1DChecks(off, count, d.length * 4, dataSize); 23449a05d7b82956009f03acbb92a064eed054eb031Jason Sams mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize); 235b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 236b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 237768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 238fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copy2DRangeFrom(int xoff, int yoff, int w, int h, byte[] d) { 239fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.validate(); 240fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, d, d.length); 241fa445b9353972735d8d65e8a936786b1afe9886dJason Sams } 242fa445b9353972735d8d65e8a936786b1afe9886dJason Sams 243fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copy2DRangeFrom(int xoff, int yoff, int w, int h, short[] d) { 244fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.validate(); 245fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, d, d.length * 2); 246fa445b9353972735d8d65e8a936786b1afe9886dJason Sams } 247fa445b9353972735d8d65e8a936786b1afe9886dJason Sams 248fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copy2DRangeFrom(int xoff, int yoff, int w, int h, int[] d) { 249771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 25049a05d7b82956009f03acbb92a064eed054eb031Jason Sams mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, d, d.length * 4); 251b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 252b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 253fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copy2DRangeFrom(int xoff, int yoff, int w, int h, float[] d) { 254771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 25549a05d7b82956009f03acbb92a064eed054eb031Jason Sams mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, d, d.length * 4); 256b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 257b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 258fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copy2DRangeFrom(int xoff, int yoff, Bitmap b) { 259fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.validate(); 260fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, b); 261fa445b9353972735d8d65e8a936786b1afe9886dJason Sams } 262fa445b9353972735d8d65e8a936786b1afe9886dJason Sams 263fa445b9353972735d8d65e8a936786b1afe9886dJason Sams 264fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copyTo(Bitmap b) { 265fa445b9353972735d8d65e8a936786b1afe9886dJason Sams validateBitmap(b); 266fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.nAllocationCopyToBitmap(getID(), b); 267fa445b9353972735d8d65e8a936786b1afe9886dJason Sams } 268fa445b9353972735d8d65e8a936786b1afe9886dJason Sams 269fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copyTo(byte[] d) { 270fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.validate(); 271fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.nAllocationRead(getID(), d); 272fa445b9353972735d8d65e8a936786b1afe9886dJason Sams } 273fa445b9353972735d8d65e8a936786b1afe9886dJason Sams 274fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copyTo(short[] d) { 275fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.validate(); 276fa445b9353972735d8d65e8a936786b1afe9886dJason Sams mRS.nAllocationRead(getID(), d); 277fa445b9353972735d8d65e8a936786b1afe9886dJason Sams } 278fa445b9353972735d8d65e8a936786b1afe9886dJason Sams 279fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copyTo(int[] d) { 280771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 28106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationRead(getID(), d); 28240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams } 28340a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 284fa445b9353972735d8d65e8a936786b1afe9886dJason Sams public void copyTo(float[] d) { 285771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 28606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationRead(getID(), d); 28740a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams } 28840a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 28931a7e42f4baa059352f0db119de38428e655eab2Jason Sams public synchronized void resize(int dimX) { 290bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) { 29106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSInvalidStateException("Resize only support for 1D allocations at this time."); 2925edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 29306d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationResize1D(getID(), dimX); 294d26297fa562d8bb203df1bb5e6ded7f62c56cdb7Jason Sams mRS.finish(); // Necessary because resize is fifoed and update is async. 29531a7e42f4baa059352f0db119de38428e655eab2Jason Sams 29606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams int typeID = mRS.nAllocationGetType(getID()); 29731a7e42f4baa059352f0db119de38428e655eab2Jason Sams mType = new Type(typeID, mRS); 29831a7e42f4baa059352f0db119de38428e655eab2Jason Sams mType.updateFromNative(); 2995edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 3005edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams 3015edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams /* 3025edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams public void resize(int dimX, int dimY) { 3035edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams if ((mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) { 30406d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalStateException("Resize only support for 2D allocations at this time."); 3055edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 3065edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams if (mType.getY() == 0) { 30706d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSIllegalStateException("Resize only support for 2D allocations at this time."); 3085edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 30906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams mRS.nAllocationResize2D(getID(), dimX, dimY); 3105edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams } 3115edc608a0749ed4b7074b5c1243043eb722c3c31Jason Sams */ 31240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams 313bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams 314b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 315b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams // creation 316b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 31749a05d7b82956009f03acbb92a064eed054eb031Jason Sams static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options(); 318b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams static { 319b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mBitmapOptions.inScaled = false; 320b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 321b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 322d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams static public Allocation createTyped(RenderScript rs, Type type, MipmapControl mc, int usage) { 323771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 3245476b450e50939940dcf3f15c92335cee2fc572dJason Sams if (type.getID() == 0) { 32506d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSInvalidStateException("Bad Type"); 32606d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams } 327d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams int id = rs.nAllocationCreateTyped(type.getID(), mc.mID, usage); 3285476b450e50939940dcf3f15c92335cee2fc572dJason Sams if (id == 0) { 32906d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Allocation creation failed."); 3301bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 3315476b450e50939940dcf3f15c92335cee2fc572dJason Sams return new Allocation(id, rs, type, usage); 332b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 333b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 334e5d3712d9eaef7ebbf142b508bd740414d930cb0Jason Sams static public Allocation createTyped(RenderScript rs, Type type, int usage) { 335e5d3712d9eaef7ebbf142b508bd740414d930cb0Jason Sams return createTyped(rs, type, MipmapControl.MIPMAP_NONE, usage); 336e5d3712d9eaef7ebbf142b508bd740414d930cb0Jason Sams } 337e5d3712d9eaef7ebbf142b508bd740414d930cb0Jason Sams 3385476b450e50939940dcf3f15c92335cee2fc572dJason Sams static public Allocation createTyped(RenderScript rs, Type type) { 339d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams return createTyped(rs, type, MipmapControl.MIPMAP_NONE, USAGE_SCRIPT); 3405476b450e50939940dcf3f15c92335cee2fc572dJason Sams } 3411bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 3425476b450e50939940dcf3f15c92335cee2fc572dJason Sams static public Allocation createSized(RenderScript rs, Element e, 3435476b450e50939940dcf3f15c92335cee2fc572dJason Sams int count, int usage) { 344771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 345768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams Type.Builder b = new Type.Builder(rs, e); 346bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams b.setX(count); 347768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams Type t = b.create(); 348768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 349d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams int id = rs.nAllocationCreateTyped(t.getID(), MipmapControl.MIPMAP_NONE.mID, usage); 3505476b450e50939940dcf3f15c92335cee2fc572dJason Sams if (id == 0) { 35106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Allocation creation failed."); 352b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 3535476b450e50939940dcf3f15c92335cee2fc572dJason Sams return new Allocation(id, rs, t, usage); 3545476b450e50939940dcf3f15c92335cee2fc572dJason Sams } 3555476b450e50939940dcf3f15c92335cee2fc572dJason Sams 3565476b450e50939940dcf3f15c92335cee2fc572dJason Sams static public Allocation createSized(RenderScript rs, Element e, int count) { 357d4b23b54445b13dacaafad97d100999abb36ea6fJason Sams return createSized(rs, e, count, USAGE_SCRIPT); 358b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 359b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 36049a05d7b82956009f03acbb92a064eed054eb031Jason Sams static Element elementFromBitmap(RenderScript rs, Bitmap b) { 3618a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams final Bitmap.Config bc = b.getConfig(); 3628a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ALPHA_8) { 3638a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.A_8(rs); 3648a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3658a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ARGB_4444) { 3668a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGBA_4444(rs); 3678a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3688a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.ARGB_8888) { 3698a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGBA_8888(rs); 3708a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3718a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams if (bc == Bitmap.Config.RGB_565) { 3728a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return Element.RGB_565(rs); 3738a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3744bd1a3dbcad2ae424293e276434b45ebee97248dJeff Sharkey throw new RSInvalidStateException("Bad bitmap type: " + bc); 3758a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3768a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 37749a05d7b82956009f03acbb92a064eed054eb031Jason Sams static Type typeFromBitmap(RenderScript rs, Bitmap b, 3784ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams MipmapControl mip) { 3798a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Element e = elementFromBitmap(rs, b); 3808a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams Type.Builder tb = new Type.Builder(rs, e); 381bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams tb.setX(b.getWidth()); 382bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams tb.setY(b.getHeight()); 3834ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams tb.setMipmaps(mip == MipmapControl.MIPMAP_FULL); 3848a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams return tb.create(); 3858a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 3868a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 38767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk static public Allocation createFromBitmap(RenderScript rs, Bitmap b, 3884ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams MipmapControl mips, 3895476b450e50939940dcf3f15c92335cee2fc572dJason Sams int usage) { 390771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 3915476b450e50939940dcf3f15c92335cee2fc572dJason Sams Type t = typeFromBitmap(rs, b, mips); 3928a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 3935476b450e50939940dcf3f15c92335cee2fc572dJason Sams int id = rs.nAllocationCreateFromBitmap(t.getID(), mips.mID, b, usage); 3945476b450e50939940dcf3f15c92335cee2fc572dJason Sams if (id == 0) { 39506d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Load failed."); 396718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams } 3975476b450e50939940dcf3f15c92335cee2fc572dJason Sams return new Allocation(id, rs, t, usage); 3985476b450e50939940dcf3f15c92335cee2fc572dJason Sams } 3995476b450e50939940dcf3f15c92335cee2fc572dJason Sams 4006d8eb266dd398abf0511685fdaf98abba3396174Jason Sams static public Allocation createFromBitmap(RenderScript rs, Bitmap b) { 4016d8eb266dd398abf0511685fdaf98abba3396174Jason Sams return createFromBitmap(rs, b, MipmapControl.MIPMAP_NONE, 4026d8eb266dd398abf0511685fdaf98abba3396174Jason Sams USAGE_GRAPHICS_TEXTURE); 4038a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams } 4048a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams 405fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk /** 406fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * Creates a cubemap allocation from a bitmap containing the 407fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * horizontal list of cube faces. Each individual face must be 408fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * the same size and power of 2 409fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * 410fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * @param rs 411fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * @param b bitmap with cubemap faces layed out in the following 412fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * format: right, left, top, bottom, front, back 413fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * @param mips specifies desired mipmap behaviour for the cubemap 414fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * @param usage bitfield specifying how the cubemap is utilized 415fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk * 416fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk **/ 41767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk static public Allocation createCubemapFromBitmap(RenderScript rs, Bitmap b, 4184ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams MipmapControl mips, 4195476b450e50939940dcf3f15c92335cee2fc572dJason Sams int usage) { 42067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk rs.validate(); 4215476b450e50939940dcf3f15c92335cee2fc572dJason Sams 42267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk int height = b.getHeight(); 42367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk int width = b.getWidth(); 42467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk 425fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk if (width % 6 != 0) { 42667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk throw new RSIllegalArgumentException("Cubemap height must be multiple of 6"); 42767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 428fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk if (width / 6 != height) { 429dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk throw new RSIllegalArgumentException("Only square cube map faces supported"); 43067f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 431fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk boolean isPow2 = (height & (height - 1)) == 0; 43267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk if (!isPow2) { 43367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk throw new RSIllegalArgumentException("Only power of 2 cube faces supported"); 43467f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 43567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk 43667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk Element e = elementFromBitmap(rs, b); 43767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk Type.Builder tb = new Type.Builder(rs, e); 438fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk tb.setX(height); 439fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk tb.setY(height); 440bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams tb.setFaces(true); 4414ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL); 44267f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk Type t = tb.create(); 44367f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk 4445476b450e50939940dcf3f15c92335cee2fc572dJason Sams int id = rs.nAllocationCubeCreateFromBitmap(t.getID(), mips.mID, b, usage); 44567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk if(id == 0) { 44667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e); 44767f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 4485476b450e50939940dcf3f15c92335cee2fc572dJason Sams return new Allocation(id, rs, t, usage); 4495476b450e50939940dcf3f15c92335cee2fc572dJason Sams } 4505476b450e50939940dcf3f15c92335cee2fc572dJason Sams 451dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk static public Allocation createCubemapFromBitmap(RenderScript rs, 452dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap b) { 4536d8eb266dd398abf0511685fdaf98abba3396174Jason Sams return createCubemapFromBitmap(rs, b, MipmapControl.MIPMAP_NONE, 454fe852e216fdfab20e7b3d3e55247f70634d267b9Alex Sakhartchouk USAGE_GRAPHICS_TEXTURE); 45567f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk } 45667f2e442a31b8395e3c1951f8e91139ec7f2be99Alex Sakhartchouk 457dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk static public Allocation createCubemapFromCubeFaces(RenderScript rs, 458dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap xpos, 459dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap xneg, 460dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap ypos, 461dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap yneg, 462dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap zpos, 463dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap zneg, 464dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk MipmapControl mips, 465dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk int usage) { 466dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk int height = xpos.getHeight(); 467dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk if (xpos.getWidth() != height || 468dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk xneg.getWidth() != height || xneg.getHeight() != height || 469dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk ypos.getWidth() != height || ypos.getHeight() != height || 470dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk yneg.getWidth() != height || yneg.getHeight() != height || 471dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk zpos.getWidth() != height || zpos.getHeight() != height || 472dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk zneg.getWidth() != height || zneg.getHeight() != height) { 473dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk throw new RSIllegalArgumentException("Only square cube map faces supported"); 474dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk } 475dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk boolean isPow2 = (height & (height - 1)) == 0; 476dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk if (!isPow2) { 477dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk throw new RSIllegalArgumentException("Only power of 2 cube faces supported"); 478dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk } 479dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk 480dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Element e = elementFromBitmap(rs, xpos); 481dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Type.Builder tb = new Type.Builder(rs, e); 482dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk tb.setX(height); 483dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk tb.setY(height); 484dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk tb.setFaces(true); 485dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL); 486dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Type t = tb.create(); 487dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Allocation cubemap = Allocation.createTyped(rs, t, mips, usage); 488dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk 489dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk AllocationAdapter adapter = AllocationAdapter.create2D(rs, cubemap); 490dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.setFace(Type.CubemapFace.POSITVE_X); 491dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.copyFrom(xpos); 492dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.setFace(Type.CubemapFace.NEGATIVE_X); 493dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.copyFrom(xneg); 494dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.setFace(Type.CubemapFace.POSITVE_Y); 495dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.copyFrom(ypos); 496dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.setFace(Type.CubemapFace.NEGATIVE_Y); 497dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.copyFrom(yneg); 498dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.setFace(Type.CubemapFace.POSITVE_Z); 499dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.copyFrom(zpos); 500dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.setFace(Type.CubemapFace.NEGATIVE_Z); 501dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk adapter.copyFrom(zneg); 502dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk 503dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk return cubemap; 504dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk } 505dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk 506dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk static public Allocation createCubemapFromCubeFaces(RenderScript rs, 507dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap xpos, 508dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap xneg, 509dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap ypos, 510dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap yneg, 511dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap zpos, 512dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk Bitmap zneg) { 513dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk return createCubemapFromCubeFaces(rs, xpos, xneg, ypos, yneg, 514dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk zpos, zneg, MipmapControl.MIPMAP_NONE, 515dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk USAGE_GRAPHICS_TEXTURE); 516dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk } 517dcc231955d81c66309ce97cca05a25f79ee7d5eaAlex Sakhartchouk 5185476b450e50939940dcf3f15c92335cee2fc572dJason Sams static public Allocation createFromBitmapResource(RenderScript rs, 5195476b450e50939940dcf3f15c92335cee2fc572dJason Sams Resources res, 5205476b450e50939940dcf3f15c92335cee2fc572dJason Sams int id, 5214ef6650bd05a39a09958ea1db92f120ea4949cb1Jason Sams MipmapControl mips, 5225476b450e50939940dcf3f15c92335cee2fc572dJason Sams int usage) { 523b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 524771bebb94054d06f97284379c93a2620613513c3Jason Sams rs.validate(); 5255476b450e50939940dcf3f15c92335cee2fc572dJason Sams Bitmap b = BitmapFactory.decodeResource(res, id); 5265476b450e50939940dcf3f15c92335cee2fc572dJason Sams Allocation alloc = createFromBitmap(rs, b, mips, usage); 5275476b450e50939940dcf3f15c92335cee2fc572dJason Sams b.recycle(); 5285476b450e50939940dcf3f15c92335cee2fc572dJason Sams return alloc; 5295476b450e50939940dcf3f15c92335cee2fc572dJason Sams } 530650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy 5315476b450e50939940dcf3f15c92335cee2fc572dJason Sams static public Allocation createFromBitmapResource(RenderScript rs, 5325476b450e50939940dcf3f15c92335cee2fc572dJason Sams Resources res, 5336d8eb266dd398abf0511685fdaf98abba3396174Jason Sams int id) { 5346d8eb266dd398abf0511685fdaf98abba3396174Jason Sams return createFromBitmapResource(rs, res, id, 5356d8eb266dd398abf0511685fdaf98abba3396174Jason Sams MipmapControl.MIPMAP_NONE, 5366d8eb266dd398abf0511685fdaf98abba3396174Jason Sams USAGE_GRAPHICS_TEXTURE); 5376d8eb266dd398abf0511685fdaf98abba3396174Jason Sams } 5386d8eb266dd398abf0511685fdaf98abba3396174Jason Sams 5395476b450e50939940dcf3f15c92335cee2fc572dJason Sams static public Allocation createFromString(RenderScript rs, 5405476b450e50939940dcf3f15c92335cee2fc572dJason Sams String str, 5415476b450e50939940dcf3f15c92335cee2fc572dJason Sams int usage) { 5425476b450e50939940dcf3f15c92335cee2fc572dJason Sams rs.validate(); 5439b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk byte[] allocArray = null; 5449b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk try { 5459b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk allocArray = str.getBytes("UTF-8"); 5465476b450e50939940dcf3f15c92335cee2fc572dJason Sams Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length, usage); 547bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams alloc.copyFrom(allocArray); 5489b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk return alloc; 5499b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 5509b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk catch (Exception e) { 55106d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams throw new RSRuntimeException("Could not convert string to utf-8."); 5529b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 5539b949fce39f0f39ce9275b71d7c347210775e7a8Alex Sakhartchouk } 554b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams} 555b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 556b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 557