Program.java revision a0c2eb27b408660b02fa248943166d6c7e447908
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 17package android.renderscript; 18 19 20import java.io.IOException; 21import java.io.InputStream; 22import java.io.UnsupportedEncodingException; 23 24import android.content.res.Resources; 25import android.util.Log; 26 27 28/** @deprecated renderscript is deprecated in J 29 * 30 * Program is a base class for all the objects that modify 31 * various stages of the graphics pipeline 32 * 33 **/ 34public class Program extends BaseObj { 35 static final int MAX_INPUT = 8; 36 static final int MAX_OUTPUT = 8; 37 static final int MAX_CONSTANT = 8; 38 static final int MAX_TEXTURE = 8; 39 40 /** @deprecated renderscript is deprecated in J 41 * 42 * TextureType specifies what textures are attached to Program 43 * objects 44 * 45 **/ 46 public enum TextureType { 47 /** @deprecated renderscript is deprecated in J 48 */ 49 TEXTURE_2D (0), 50 /** @deprecated renderscript is deprecated in J 51 */ 52 TEXTURE_CUBE (1); 53 54 int mID; 55 TextureType(int id) { 56 mID = id; 57 } 58 } 59 60 enum ProgramParam { 61 INPUT (0), 62 OUTPUT (1), 63 CONSTANT (2), 64 TEXTURE_TYPE (3); 65 66 int mID; 67 ProgramParam(int id) { 68 mID = id; 69 } 70 }; 71 72 Element mInputs[]; 73 Element mOutputs[]; 74 Type mConstants[]; 75 TextureType mTextures[]; 76 String mTextureNames[]; 77 int mTextureCount; 78 String mShader; 79 80 Program(int id, RenderScript rs) { 81 super(id, rs); 82 } 83 84 /** @hide renderscript is deprecated in J 85 * Program object can have zero or more constant allocations 86 * associated with it. This method returns the total count. 87 * @return number of constant input types 88 */ 89 public int getConstantCount() { 90 return mConstants != null ? mConstants.length : 0; 91 } 92 93 /** @hide renderscript is deprecated in J 94 * Returns the type of the constant buffer used in the program 95 * object. It could be used to query internal elements or create 96 * an allocation to store constant data. 97 * @param slot index of the constant input type to return 98 * @return constant input type 99 */ 100 public Type getConstant(int slot) { 101 if (slot < 0 || slot >= mConstants.length) { 102 throw new IllegalArgumentException("Slot ID out of range."); 103 } 104 return mConstants[slot]; 105 } 106 107 /** @hide renderscript is deprecated in J 108 * Returns the number of textures used in this program object 109 * @return number of texture inputs 110 */ 111 public int getTextureCount() { 112 return mTextureCount; 113 } 114 115 /** @hide renderscript is deprecated in J 116 * Returns the type of texture at a given slot. e.g. 2D or Cube 117 * @param slot index of the texture input 118 * @return texture input type 119 */ 120 public TextureType getTextureType(int slot) { 121 if ((slot < 0) || (slot >= mTextureCount)) { 122 throw new IllegalArgumentException("Slot ID out of range."); 123 } 124 return mTextures[slot]; 125 } 126 127 /** @hide renderscript is deprecated in J 128 * Returns the name of the texture input at a given slot. e.g. 129 * tex0, diffuse, spec 130 * @param slot index of the texture input 131 * @return texture input name 132 */ 133 public String getTextureName(int slot) { 134 if ((slot < 0) || (slot >= mTextureCount)) { 135 throw new IllegalArgumentException("Slot ID out of range."); 136 } 137 return mTextureNames[slot]; 138 } 139 140 /** @deprecated renderscript is deprecated in J 141 * Binds a constant buffer to be used as uniform inputs to the 142 * program 143 * 144 * @param a allocation containing uniform data 145 * @param slot index within the program's list of constant 146 * buffer allocations 147 */ 148 public void bindConstants(Allocation a, int slot) { 149 if (slot < 0 || slot >= mConstants.length) { 150 throw new IllegalArgumentException("Slot ID out of range."); 151 } 152 if (a != null && 153 a.getType().getID(mRS) != mConstants[slot].getID(mRS)) { 154 throw new IllegalArgumentException("Allocation type does not match slot type."); 155 } 156 int id = a != null ? a.getID(mRS) : 0; 157 mRS.nProgramBindConstants(getID(mRS), slot, id); 158 } 159 160 /** @deprecated renderscript is deprecated in J 161 * Binds a texture to be used in the program 162 * 163 * @param va allocation containing texture data 164 * @param slot index within the program's list of textures 165 * 166 */ 167 public void bindTexture(Allocation va, int slot) 168 throws IllegalArgumentException { 169 mRS.validate(); 170 if ((slot < 0) || (slot >= mTextureCount)) { 171 throw new IllegalArgumentException("Slot ID out of range."); 172 } 173 if (va != null && va.getType().hasFaces() && 174 mTextures[slot] != TextureType.TEXTURE_CUBE) { 175 throw new IllegalArgumentException("Cannot bind cubemap to 2d texture slot"); 176 } 177 178 int id = va != null ? va.getID(mRS) : 0; 179 mRS.nProgramBindTexture(getID(mRS), slot, id); 180 } 181 182 /** @deprecated renderscript is deprecated in J 183 * Binds an object that describes how a texture at the 184 * corresponding location is sampled 185 * 186 * @param vs sampler for a corresponding texture 187 * @param slot index within the program's list of textures to 188 * use the sampler on 189 * 190 */ 191 public void bindSampler(Sampler vs, int slot) 192 throws IllegalArgumentException { 193 mRS.validate(); 194 if ((slot < 0) || (slot >= mTextureCount)) { 195 throw new IllegalArgumentException("Slot ID out of range."); 196 } 197 198 int id = vs != null ? vs.getID(mRS) : 0; 199 mRS.nProgramBindSampler(getID(mRS), slot, id); 200 } 201 202 203 public static class BaseProgramBuilder { 204 RenderScript mRS; 205 Element mInputs[]; 206 Element mOutputs[]; 207 Type mConstants[]; 208 Type mTextures[]; 209 TextureType mTextureTypes[]; 210 String mTextureNames[]; 211 int mInputCount; 212 int mOutputCount; 213 int mConstantCount; 214 int mTextureCount; 215 String mShader; 216 217 /** @deprecated renderscript is deprecated in J 218 */ 219 protected BaseProgramBuilder(RenderScript rs) { 220 mRS = rs; 221 mInputs = new Element[MAX_INPUT]; 222 mOutputs = new Element[MAX_OUTPUT]; 223 mConstants = new Type[MAX_CONSTANT]; 224 mInputCount = 0; 225 mOutputCount = 0; 226 mConstantCount = 0; 227 mTextureCount = 0; 228 mTextureTypes = new TextureType[MAX_TEXTURE]; 229 mTextureNames = new String[MAX_TEXTURE]; 230 } 231 232 /** @deprecated renderscript is deprecated in J 233 * Sets the GLSL shader code to be used in the program 234 * 235 * @param s GLSL shader string 236 * @return self 237 */ 238 public BaseProgramBuilder setShader(String s) { 239 mShader = s; 240 return this; 241 } 242 243 /** @deprecated renderscript is deprecated in J 244 * Sets the GLSL shader code to be used in the program 245 * 246 * @param resources application resources 247 * @param resourceID id of the file containing GLSL shader code 248 * 249 * @return self 250 */ 251 public BaseProgramBuilder setShader(Resources resources, int resourceID) { 252 byte[] str; 253 int strLength; 254 InputStream is = resources.openRawResource(resourceID); 255 try { 256 try { 257 str = new byte[1024]; 258 strLength = 0; 259 while(true) { 260 int bytesLeft = str.length - strLength; 261 if (bytesLeft == 0) { 262 byte[] buf2 = new byte[str.length * 2]; 263 System.arraycopy(str, 0, buf2, 0, str.length); 264 str = buf2; 265 bytesLeft = str.length - strLength; 266 } 267 int bytesRead = is.read(str, strLength, bytesLeft); 268 if (bytesRead <= 0) { 269 break; 270 } 271 strLength += bytesRead; 272 } 273 } finally { 274 is.close(); 275 } 276 } catch(IOException e) { 277 throw new Resources.NotFoundException(); 278 } 279 280 try { 281 mShader = new String(str, 0, strLength, "UTF-8"); 282 } catch (UnsupportedEncodingException e) { 283 Log.e("Renderscript shader creation", "Could not decode shader string"); 284 } 285 286 return this; 287 } 288 289 /** @deprecated renderscript is deprecated in J 290 * Queries the index of the last added constant buffer type 291 * 292 */ 293 public int getCurrentConstantIndex() { 294 return mConstantCount - 1; 295 } 296 297 /** @deprecated renderscript is deprecated in J 298 * Queries the index of the last added texture type 299 * 300 */ 301 public int getCurrentTextureIndex() { 302 return mTextureCount - 1; 303 } 304 305 /** @deprecated renderscript is deprecated in J 306 * Adds constant (uniform) inputs to the program 307 * 308 * @param t Type that describes the layout of the Allocation 309 * object to be used as constant inputs to the Program 310 * @return self 311 */ 312 public BaseProgramBuilder addConstant(Type t) throws IllegalStateException { 313 // Should check for consistant and non-conflicting names... 314 if(mConstantCount >= MAX_CONSTANT) { 315 throw new RSIllegalArgumentException("Max input count exceeded."); 316 } 317 if (t.getElement().isComplex()) { 318 throw new RSIllegalArgumentException("Complex elements not allowed."); 319 } 320 mConstants[mConstantCount] = t; 321 mConstantCount++; 322 return this; 323 } 324 325 /** @deprecated renderscript is deprecated in J 326 * Adds a texture input to the Program 327 * 328 * @param texType describes that the texture to append it (2D, 329 * Cubemap, etc.) 330 * @return self 331 */ 332 public BaseProgramBuilder addTexture(TextureType texType) throws IllegalArgumentException { 333 addTexture(texType, "Tex" + mTextureCount); 334 return this; 335 } 336 337 /** @hide renderscript is deprecated in J 338 * Adds a texture input to the Program 339 * 340 * @param texType describes that the texture to append it (2D, 341 * Cubemap, etc.) 342 * @param texName what the texture should be called in the 343 * shader 344 * @return self 345 */ 346 public BaseProgramBuilder addTexture(TextureType texType, String texName) 347 throws IllegalArgumentException { 348 if(mTextureCount >= MAX_TEXTURE) { 349 throw new IllegalArgumentException("Max texture count exceeded."); 350 } 351 mTextureTypes[mTextureCount] = texType; 352 mTextureNames[mTextureCount] = texName; 353 mTextureCount ++; 354 return this; 355 } 356 357 /** @deprecated renderscript is deprecated in J 358 */ 359 protected void initProgram(Program p) { 360 p.mInputs = new Element[mInputCount]; 361 System.arraycopy(mInputs, 0, p.mInputs, 0, mInputCount); 362 p.mOutputs = new Element[mOutputCount]; 363 System.arraycopy(mOutputs, 0, p.mOutputs, 0, mOutputCount); 364 p.mConstants = new Type[mConstantCount]; 365 System.arraycopy(mConstants, 0, p.mConstants, 0, mConstantCount); 366 p.mTextureCount = mTextureCount; 367 p.mTextures = new TextureType[mTextureCount]; 368 System.arraycopy(mTextureTypes, 0, p.mTextures, 0, mTextureCount); 369 p.mTextureNames = new String[mTextureCount]; 370 System.arraycopy(mTextureNames, 0, p.mTextureNames, 0, mTextureCount); 371 } 372 } 373 374} 375 376 377