• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.renderscript;
18 
19 /**
20  * Only intended for use by generated reflected code.
21  *
22  **/
23 public class AllocationAdapter extends Allocation {
AllocationAdapter(long id, RenderScript rs, Allocation alloc)24     AllocationAdapter(long id, RenderScript rs, Allocation alloc) {
25         super(id, rs, alloc.mType, alloc.mUsage);
26         mAdaptedAllocation = alloc;
27     }
28 
getID(RenderScript rs)29     long getID(RenderScript rs) {
30         throw new RSInvalidStateException(
31             "This operation is not supported with adapters at this time.");
32     }
33 
34     /**
35      * @hide
36      */
subData(int xoff, FieldPacker fp)37     public void subData(int xoff, FieldPacker fp) {
38         super.setFromFieldPacker(xoff, fp);
39     }
40     /**
41      * @hide
42      */
subElementData(int xoff, int component_number, FieldPacker fp)43     public void subElementData(int xoff, int component_number, FieldPacker fp) {
44         super.setFromFieldPacker(xoff, component_number, fp);
45     }
46     /**
47      * @hide
48      */
subData1D(int off, int count, int[] d)49     public void subData1D(int off, int count, int[] d) {
50         super.copy1DRangeFrom(off, count, d);
51     }
52     /**
53      * @hide
54      */
subData1D(int off, int count, short[] d)55     public void subData1D(int off, int count, short[] d) {
56         super.copy1DRangeFrom(off, count, d);
57     }
58     /**
59      * @hide
60      */
subData1D(int off, int count, byte[] d)61     public void subData1D(int off, int count, byte[] d) {
62         super.copy1DRangeFrom(off, count, d);
63     }
64     /**
65      * @hide
66      */
subData1D(int off, int count, float[] d)67     public void subData1D(int off, int count, float[] d) {
68         super.copy1DRangeFrom(off, count, d);
69     }
70     /**
71      * @hide
72      */
subData2D(int xoff, int yoff, int w, int h, int[] d)73     public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
74         super.copy2DRangeFrom(xoff, yoff, w, h, d);
75     }
76     /**
77      * @hide
78      */
subData2D(int xoff, int yoff, int w, int h, float[] d)79     public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
80         super.copy2DRangeFrom(xoff, yoff, w, h, d);
81     }
82     /**
83      * @hide
84      */
readData(int[] d)85     public void readData(int[] d) {
86         super.copyTo(d);
87     }
88     /**
89      * @hide
90      */
readData(float[] d)91     public void readData(float[] d) {
92         super.copyTo(d);
93     }
94 
initLOD(int lod)95     void initLOD(int lod) {
96         if (lod < 0) {
97             throw new RSIllegalArgumentException("Attempting to set negative lod (" + lod + ").");
98         }
99 
100         int tx = mAdaptedAllocation.mType.getX();
101         int ty = mAdaptedAllocation.mType.getY();
102         int tz = mAdaptedAllocation.mType.getZ();
103 
104         for (int ct=0; ct < lod; ct++) {
105             if ((tx==1) && (ty == 1) && (tz == 1)) {
106                 throw new RSIllegalArgumentException("Attempting to set lod (" + lod + ") out of range.");
107             }
108 
109             if (tx > 1) tx >>= 1;
110             if (ty > 1) ty >>= 1;
111             if (tz > 1) tz >>= 1;
112         }
113 
114         mCurrentDimX = tx;
115         mCurrentDimY = ty;
116         mCurrentDimZ = tz;
117         mCurrentCount = mCurrentDimX;
118         if (mCurrentDimY > 1) {
119             mCurrentCount *= mCurrentDimY;
120         }
121         if (mCurrentDimZ > 1) {
122             mCurrentCount *= mCurrentDimZ;
123         }
124         mSelectedY = 0;
125         mSelectedZ = 0;
126     }
127 
128     /**
129      * Set the active LOD.  The LOD must be within the range for the
130      * type being adapted.  The base allocation must have mipmaps.
131      *
132      * Because this changes the dimensions of the adapter the
133      * current Y and Z will be reset.
134      *
135      * @param lod The LOD to make active.
136      */
setLOD(int lod)137     public void setLOD(int lod) {
138         if (!mAdaptedAllocation.getType().hasMipmaps()) {
139             throw new RSInvalidStateException("Cannot set LOD when the allocation type does not include mipmaps.");
140         }
141         if (!mConstrainedLOD) {
142             throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps.");
143         }
144 
145         initLOD(lod);
146     }
147 
148     /**
149      * Set the active Face.  The base allocation must be of a type
150      * that includes faces.
151      *
152      * @param cf The face to make active.
153      */
setFace(Type.CubemapFace cf)154     public void setFace(Type.CubemapFace cf) {
155         if (!mAdaptedAllocation.getType().hasFaces()) {
156             throw new RSInvalidStateException("Cannot set Face when the allocation type does not include faces.");
157         }
158         if (!mConstrainedFace) {
159             throw new RSInvalidStateException("Cannot set LOD when the adapter includes mipmaps.");
160         }
161         if (cf == null) {
162             throw new RSIllegalArgumentException("Cannot set null face.");
163         }
164 
165         mSelectedFace = cf;
166     }
167 
168     /**
169      * Set the active Y.  The y value must be within the range for
170      * the allocation being adapted.  The base allocation must
171      * contain the Y dimension.
172      *
173      * @param y The y to make active.
174      */
setY(int y)175     public void setY(int y) {
176         if (mAdaptedAllocation.getType().getY() == 0) {
177             throw new RSInvalidStateException("Cannot set Y when the allocation type does not include Y dim.");
178         }
179         if (mAdaptedAllocation.getType().getY() <= y) {
180             throw new RSInvalidStateException("Cannot set Y greater than dimension of allocation.");
181         }
182         if (!mConstrainedY) {
183             throw new RSInvalidStateException("Cannot set Y when the adapter includes Y.");
184         }
185 
186         mSelectedY = y;
187     }
188 
189     /**
190      * Set the active Z.  The z value must be within the range for
191      * the allocation being adapted.  The base allocation must
192      * contain the Z dimension.
193      *
194      * @param z The z to make active.
195      */
setZ(int z)196     public void setZ(int z) {
197         if (mAdaptedAllocation.getType().getZ() == 0) {
198             throw new RSInvalidStateException("Cannot set Z when the allocation type does not include Z dim.");
199         }
200         if (mAdaptedAllocation.getType().getZ() <= z) {
201             throw new RSInvalidStateException("Cannot set Z greater than dimension of allocation.");
202         }
203         if (!mConstrainedZ) {
204             throw new RSInvalidStateException("Cannot set Z when the adapter includes Z.");
205         }
206 
207         mSelectedZ = z;
208     }
209 
create1D(RenderScript rs, Allocation a)210     static public AllocationAdapter create1D(RenderScript rs, Allocation a) {
211         rs.validate();
212         AllocationAdapter aa = new AllocationAdapter(0, rs, a);
213         aa.mConstrainedLOD = true;
214         aa.mConstrainedFace = true;
215         aa.mConstrainedY = true;
216         aa.mConstrainedZ = true;
217         aa.initLOD(0);
218         return aa;
219     }
220 
create2D(RenderScript rs, Allocation a)221     static public AllocationAdapter create2D(RenderScript rs, Allocation a) {
222         rs.validate();
223         AllocationAdapter aa = new AllocationAdapter(0, rs, a);
224         aa.mConstrainedLOD = true;
225         aa.mConstrainedFace = true;
226         aa.mConstrainedY = false;
227         aa.mConstrainedZ = true;
228         aa.initLOD(0);
229         return aa;
230     }
231 
232 
233     /**
234      * Override the Allocation resize.  Resizing adapters is not
235      * allowed and will throw a RSInvalidStateException.
236      *
237      * @param dimX ignored.
238      */
resize(int dimX)239     public synchronized void resize(int dimX) {
240         throw new RSInvalidStateException("Resize not allowed for Adapters.");
241     }
242 
243 }
244 
245 
246