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