149a05d7b82956009f03acbb92a064eed054eb031Jason Sams/* 249a05d7b82956009f03acbb92a064eed054eb031Jason Sams * Copyright (C) 2008 The Android Open Source Project 349a05d7b82956009f03acbb92a064eed054eb031Jason Sams * 449a05d7b82956009f03acbb92a064eed054eb031Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 549a05d7b82956009f03acbb92a064eed054eb031Jason Sams * you may not use this file except in compliance with the License. 649a05d7b82956009f03acbb92a064eed054eb031Jason Sams * You may obtain a copy of the License at 749a05d7b82956009f03acbb92a064eed054eb031Jason Sams * 849a05d7b82956009f03acbb92a064eed054eb031Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 949a05d7b82956009f03acbb92a064eed054eb031Jason Sams * 1049a05d7b82956009f03acbb92a064eed054eb031Jason Sams * Unless required by applicable law or agreed to in writing, software 1149a05d7b82956009f03acbb92a064eed054eb031Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1249a05d7b82956009f03acbb92a064eed054eb031Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1349a05d7b82956009f03acbb92a064eed054eb031Jason Sams * See the License for the specific language governing permissions and 1449a05d7b82956009f03acbb92a064eed054eb031Jason Sams * limitations under the License. 1549a05d7b82956009f03acbb92a064eed054eb031Jason Sams */ 1649a05d7b82956009f03acbb92a064eed054eb031Jason Sams 1749a05d7b82956009f03acbb92a064eed054eb031Jason Samspackage android.renderscript; 1849a05d7b82956009f03acbb92a064eed054eb031Jason Sams 199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 20c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Only intended for use by generated reflected code. 2149a05d7b82956009f03acbb92a064eed054eb031Jason Sams * 2249a05d7b82956009f03acbb92a064eed054eb031Jason Sams **/ 2349a05d7b82956009f03acbb92a064eed054eb031Jason Samspublic class AllocationAdapter extends Allocation { 24460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray AllocationAdapter(long id, RenderScript rs, Allocation alloc) { 25ba862d1544a06528151550be1784a926ee986580Jason Sams super(id, rs, alloc.mType, alloc.mUsage); 26ba862d1544a06528151550be1784a926ee986580Jason Sams mAdaptedAllocation = alloc; 2749a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 2849a05d7b82956009f03acbb92a064eed054eb031Jason Sams 29460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray long getID(RenderScript rs) { 3048fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams throw new RSInvalidStateException( 3148fe534838d8b9d10f98ea2662eec258320ab4e7Jason Sams "This operation is not supported with adapters at this time."); 32ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 33ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 34ba862d1544a06528151550be1784a926ee986580Jason Sams /** 35ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 36ba862d1544a06528151550be1784a926ee986580Jason Sams */ 3749a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData(int xoff, FieldPacker fp) { 38ba862d1544a06528151550be1784a926ee986580Jason Sams super.setFromFieldPacker(xoff, fp); 3949a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 40ba862d1544a06528151550be1784a926ee986580Jason Sams /** 41ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 42ba862d1544a06528151550be1784a926ee986580Jason Sams */ 4349a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subElementData(int xoff, int component_number, FieldPacker fp) { 44ba862d1544a06528151550be1784a926ee986580Jason Sams super.setFromFieldPacker(xoff, component_number, fp); 4549a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 46ba862d1544a06528151550be1784a926ee986580Jason Sams /** 47ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 48ba862d1544a06528151550be1784a926ee986580Jason Sams */ 4949a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData1D(int off, int count, int[] d) { 50ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy1DRangeFrom(off, count, d); 5149a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 52ba862d1544a06528151550be1784a926ee986580Jason Sams /** 53ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 54ba862d1544a06528151550be1784a926ee986580Jason Sams */ 5549a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData1D(int off, int count, short[] d) { 56ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy1DRangeFrom(off, count, d); 5749a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 58ba862d1544a06528151550be1784a926ee986580Jason Sams /** 59ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 60ba862d1544a06528151550be1784a926ee986580Jason Sams */ 6149a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData1D(int off, int count, byte[] d) { 62ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy1DRangeFrom(off, count, d); 6349a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 64ba862d1544a06528151550be1784a926ee986580Jason Sams /** 65ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 66ba862d1544a06528151550be1784a926ee986580Jason Sams */ 6749a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData1D(int off, int count, float[] d) { 68ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy1DRangeFrom(off, count, d); 6949a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 70304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk /** 71ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 72304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk */ 7349a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData2D(int xoff, int yoff, int w, int h, int[] d) { 74ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy2DRangeFrom(xoff, yoff, w, h, d); 7549a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 76ba862d1544a06528151550be1784a926ee986580Jason Sams /** 77ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 78ba862d1544a06528151550be1784a926ee986580Jason Sams */ 7949a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void subData2D(int xoff, int yoff, int w, int h, float[] d) { 80ba862d1544a06528151550be1784a926ee986580Jason Sams super.copy2DRangeFrom(xoff, yoff, w, h, d); 81304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk } 82304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk /** 83ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 84304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk */ 8549a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void readData(int[] d) { 86ba862d1544a06528151550be1784a926ee986580Jason Sams super.copyTo(d); 8749a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 88ba862d1544a06528151550be1784a926ee986580Jason Sams /** 89ba862d1544a06528151550be1784a926ee986580Jason Sams * @hide 90ba862d1544a06528151550be1784a926ee986580Jason Sams */ 9149a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void readData(float[] d) { 92ba862d1544a06528151550be1784a926ee986580Jason Sams super.copyTo(d); 9349a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 9449a05d7b82956009f03acbb92a064eed054eb031Jason Sams 95ba862d1544a06528151550be1784a926ee986580Jason Sams void initLOD(int lod) { 96ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (lod < 0) { 97ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams throw new RSIllegalArgumentException("Attempting to set negative lod (" + lod + ")."); 98ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 99ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 100ba862d1544a06528151550be1784a926ee986580Jason Sams int tx = mAdaptedAllocation.mType.getX(); 101ba862d1544a06528151550be1784a926ee986580Jason Sams int ty = mAdaptedAllocation.mType.getY(); 102ba862d1544a06528151550be1784a926ee986580Jason Sams int tz = mAdaptedAllocation.mType.getZ(); 103ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 104ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams for (int ct=0; ct < lod; ct++) { 105ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if ((tx==1) && (ty == 1) && (tz == 1)) { 106ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams throw new RSIllegalArgumentException("Attempting to set lod (" + lod + ") out of range."); 107ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 108ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 109ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (tx > 1) tx >>= 1; 110ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (ty > 1) ty >>= 1; 111ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (tz > 1) tz >>= 1; 112ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 113ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 114ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentDimX = tx; 115ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentDimY = ty; 116ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentDimZ = tz; 117ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentCount = mCurrentDimX; 118ba862d1544a06528151550be1784a926ee986580Jason Sams if (mCurrentDimY > 1) { 119ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentCount *= mCurrentDimY; 120ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 121ba862d1544a06528151550be1784a926ee986580Jason Sams if (mCurrentDimZ > 1) { 122ba862d1544a06528151550be1784a926ee986580Jason Sams mCurrentCount *= mCurrentDimZ; 123ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 124ba862d1544a06528151550be1784a926ee986580Jason Sams mSelectedY = 0; 125ba862d1544a06528151550be1784a926ee986580Jason Sams mSelectedZ = 0; 126ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 127ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 1289c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 129ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams * Set the active LOD. The LOD must be within the range for the 130ba862d1544a06528151550be1784a926ee986580Jason Sams * type being adapted. The base allocation must have mipmaps. 131ba862d1544a06528151550be1784a926ee986580Jason Sams * 132ba862d1544a06528151550be1784a926ee986580Jason Sams * Because this changes the dimensions of the adapter the 133ba862d1544a06528151550be1784a926ee986580Jason Sams * current Y and Z will be reset. 134ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams * 135ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams * @param lod The LOD to make active. 136ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams */ 13749a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void setLOD(int lod) { 138ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mAdaptedAllocation.getType().hasMipmaps()) { 139ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams throw new RSInvalidStateException("Cannot set LOD when the allocation type does not include mipmaps."); 140ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 141ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams if (!mConstrainedLOD) { 142ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps."); 143ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams } 144ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams 145ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams initLOD(lod); 14649a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 14749a05d7b82956009f03acbb92a064eed054eb031Jason Sams 1489c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 149ba862d1544a06528151550be1784a926ee986580Jason Sams * Set the active Face. The base allocation must be of a type 150ba862d1544a06528151550be1784a926ee986580Jason Sams * that includes faces. 151ba862d1544a06528151550be1784a926ee986580Jason Sams * 152ba862d1544a06528151550be1784a926ee986580Jason Sams * @param cf The face to make active. 153ba862d1544a06528151550be1784a926ee986580Jason Sams */ 15449a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void setFace(Type.CubemapFace cf) { 155ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mAdaptedAllocation.getType().hasFaces()) { 156ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Face when the allocation type does not include faces."); 157ba862d1544a06528151550be1784a926ee986580Jason Sams } 158ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mConstrainedFace) { 159ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps."); 160ba862d1544a06528151550be1784a926ee986580Jason Sams } 161ba862d1544a06528151550be1784a926ee986580Jason Sams if (cf == null) { 162ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSIllegalArgumentException("Cannot set null face."); 163ba862d1544a06528151550be1784a926ee986580Jason Sams } 164ba862d1544a06528151550be1784a926ee986580Jason Sams 165304b1f5497155bcf91e7b855cfab7a675e80bf26Alex Sakhartchouk mSelectedFace = cf; 16649a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 16749a05d7b82956009f03acbb92a064eed054eb031Jason Sams 1689c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 169ba862d1544a06528151550be1784a926ee986580Jason Sams * Set the active Y. The y value must be within the range for 170ba862d1544a06528151550be1784a926ee986580Jason Sams * the allocation being adapted. The base allocation must 171ba862d1544a06528151550be1784a926ee986580Jason Sams * contain the Y dimension. 172ba862d1544a06528151550be1784a926ee986580Jason Sams * 173ba862d1544a06528151550be1784a926ee986580Jason Sams * @param y The y to make active. 174ba862d1544a06528151550be1784a926ee986580Jason Sams */ 17549a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void setY(int y) { 176ba862d1544a06528151550be1784a926ee986580Jason Sams if (mAdaptedAllocation.getType().getY() == 0) { 177ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Y when the allocation type does not include Y dim."); 178ba862d1544a06528151550be1784a926ee986580Jason Sams } 179ba862d1544a06528151550be1784a926ee986580Jason Sams if (mAdaptedAllocation.getType().getY() <= y) { 180ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Y greater than dimension of allocation."); 181ba862d1544a06528151550be1784a926ee986580Jason Sams } 182ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mConstrainedY) { 183ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Y when the adapter includes Y."); 184ba862d1544a06528151550be1784a926ee986580Jason Sams } 185ba862d1544a06528151550be1784a926ee986580Jason Sams 186ba862d1544a06528151550be1784a926ee986580Jason Sams mSelectedY = y; 18749a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 18849a05d7b82956009f03acbb92a064eed054eb031Jason Sams 1899c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 190ba862d1544a06528151550be1784a926ee986580Jason Sams * Set the active Z. The z value must be within the range for 191ba862d1544a06528151550be1784a926ee986580Jason Sams * the allocation being adapted. The base allocation must 192ba862d1544a06528151550be1784a926ee986580Jason Sams * contain the Z dimension. 193ba862d1544a06528151550be1784a926ee986580Jason Sams * 194ba862d1544a06528151550be1784a926ee986580Jason Sams * @param z The z to make active. 195ba862d1544a06528151550be1784a926ee986580Jason Sams */ 19649a05d7b82956009f03acbb92a064eed054eb031Jason Sams public void setZ(int z) { 197ba862d1544a06528151550be1784a926ee986580Jason Sams if (mAdaptedAllocation.getType().getZ() == 0) { 198ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Z when the allocation type does not include Z dim."); 199ba862d1544a06528151550be1784a926ee986580Jason Sams } 200ba862d1544a06528151550be1784a926ee986580Jason Sams if (mAdaptedAllocation.getType().getZ() <= z) { 201ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Z greater than dimension of allocation."); 202ba862d1544a06528151550be1784a926ee986580Jason Sams } 203ba862d1544a06528151550be1784a926ee986580Jason Sams if (!mConstrainedZ) { 204ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Cannot set Z when the adapter includes Z."); 205ba862d1544a06528151550be1784a926ee986580Jason Sams } 206ba862d1544a06528151550be1784a926ee986580Jason Sams 207ba862d1544a06528151550be1784a926ee986580Jason Sams mSelectedZ = z; 20849a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 20949a05d7b82956009f03acbb92a064eed054eb031Jason Sams 210ba862d1544a06528151550be1784a926ee986580Jason Sams static public AllocationAdapter create1D(RenderScript rs, Allocation a) { 211ba862d1544a06528151550be1784a926ee986580Jason Sams rs.validate(); 212ba862d1544a06528151550be1784a926ee986580Jason Sams AllocationAdapter aa = new AllocationAdapter(0, rs, a); 213ba862d1544a06528151550be1784a926ee986580Jason Sams aa.mConstrainedLOD = true; 214ba862d1544a06528151550be1784a926ee986580Jason Sams aa.mConstrainedFace = true; 215ba862d1544a06528151550be1784a926ee986580Jason Sams aa.mConstrainedY = true; 216ba862d1544a06528151550be1784a926ee986580Jason Sams aa.mConstrainedZ = true; 217ba862d1544a06528151550be1784a926ee986580Jason Sams aa.initLOD(0); 218ba862d1544a06528151550be1784a926ee986580Jason Sams return aa; 219ba862d1544a06528151550be1784a926ee986580Jason Sams } 22049a05d7b82956009f03acbb92a064eed054eb031Jason Sams 22149a05d7b82956009f03acbb92a064eed054eb031Jason Sams static public AllocationAdapter create2D(RenderScript rs, Allocation a) { 22249a05d7b82956009f03acbb92a064eed054eb031Jason Sams rs.validate(); 22349a05d7b82956009f03acbb92a064eed054eb031Jason Sams AllocationAdapter aa = new AllocationAdapter(0, rs, a); 224ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.mConstrainedLOD = true; 225ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.mConstrainedFace = true; 226ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.mConstrainedY = false; 227ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.mConstrainedZ = true; 228ee2d809ab099e67698a37f13a42d22eaa2251f77Jason Sams aa.initLOD(0); 22949a05d7b82956009f03acbb92a064eed054eb031Jason Sams return aa; 23049a05d7b82956009f03acbb92a064eed054eb031Jason Sams } 23149a05d7b82956009f03acbb92a064eed054eb031Jason Sams 23249a05d7b82956009f03acbb92a064eed054eb031Jason Sams 2339c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 234ba862d1544a06528151550be1784a926ee986580Jason Sams * Override the Allocation resize. Resizing adapters is not 235ba862d1544a06528151550be1784a926ee986580Jason Sams * allowed and will throw a RSInvalidStateException. 236ba862d1544a06528151550be1784a926ee986580Jason Sams * 237ba862d1544a06528151550be1784a926ee986580Jason Sams * @param dimX ignored. 238ba862d1544a06528151550be1784a926ee986580Jason Sams */ 239ba862d1544a06528151550be1784a926ee986580Jason Sams public synchronized void resize(int dimX) { 240ba862d1544a06528151550be1784a926ee986580Jason Sams throw new RSInvalidStateException("Resize not allowed for Adapters."); 241ba862d1544a06528151550be1784a926ee986580Jason Sams } 242ba862d1544a06528151550be1784a926ee986580Jason Sams 24349a05d7b82956009f03acbb92a064eed054eb031Jason Sams} 24449a05d7b82956009f03acbb92a064eed054eb031Jason Sams 24549a05d7b82956009f03acbb92a064eed054eb031Jason Sams 246