122534176fb5c1257130ef4ee589739ca42766a32Jason Sams/* 222534176fb5c1257130ef4ee589739ca42766a32Jason Sams * Copyright (C) 2008 The Android Open Source Project 322534176fb5c1257130ef4ee589739ca42766a32Jason Sams * 422534176fb5c1257130ef4ee589739ca42766a32Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 522534176fb5c1257130ef4ee589739ca42766a32Jason Sams * you may not use this file except in compliance with the License. 622534176fb5c1257130ef4ee589739ca42766a32Jason Sams * You may obtain a copy of the License at 722534176fb5c1257130ef4ee589739ca42766a32Jason Sams * 822534176fb5c1257130ef4ee589739ca42766a32Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 922534176fb5c1257130ef4ee589739ca42766a32Jason Sams * 1022534176fb5c1257130ef4ee589739ca42766a32Jason Sams * Unless required by applicable law or agreed to in writing, software 1122534176fb5c1257130ef4ee589739ca42766a32Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1222534176fb5c1257130ef4ee589739ca42766a32Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1322534176fb5c1257130ef4ee589739ca42766a32Jason Sams * See the License for the specific language governing permissions and 1422534176fb5c1257130ef4ee589739ca42766a32Jason Sams * limitations under the License. 1522534176fb5c1257130ef4ee589739ca42766a32Jason Sams */ 1622534176fb5c1257130ef4ee589739ca42766a32Jason Sams 1722534176fb5c1257130ef4ee589739ca42766a32Jason Samspackage android.renderscript; 1822534176fb5c1257130ef4ee589739ca42766a32Jason Sams 1922534176fb5c1257130ef4ee589739ca42766a32Jason Sams 2022534176fb5c1257130ef4ee589739ca42766a32Jason Samsimport android.util.Config; 2122534176fb5c1257130ef4ee589739ca42766a32Jason Samsimport android.util.Log; 2222534176fb5c1257130ef4ee589739ca42766a32Jason Sams 2322534176fb5c1257130ef4ee589739ca42766a32Jason Sams 2422534176fb5c1257130ef4ee589739ca42766a32Jason Sams/** 2522534176fb5c1257130ef4ee589739ca42766a32Jason Sams * @hide 2622534176fb5c1257130ef4ee589739ca42766a32Jason Sams * 2722534176fb5c1257130ef4ee589739ca42766a32Jason Sams **/ 287e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Samspublic class ProgramFragment extends Program { 2922534176fb5c1257130ef4ee589739ca42766a32Jason Sams ProgramFragment(int id, RenderScript rs) { 307e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams super(id, rs); 3122534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 3222534176fb5c1257130ef4ee589739ca42766a32Jason Sams 337e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams public static class ShaderBuilder extends BaseProgramBuilder { 347e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams public ShaderBuilder(RenderScript rs) { 357e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams super(rs); 367e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams } 377e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams 387e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams public ProgramFragment create() { 397e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams mRS.validate(); 407e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + 1) * 2]; 417e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams int idx = 0; 427e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams 437e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams for (int i=0; i < mInputCount; i++) { 447e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = 0; 457e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = mInputs[i].mID; 467e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams } 477e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams for (int i=0; i < mOutputCount; i++) { 487e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = 1; 497e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = mOutputs[i].mID; 507e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams } 517e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams for (int i=0; i < mConstantCount; i++) { 527e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = 2; 537e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = mConstants[i].mID; 547e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams } 557e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = 3; 567e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = mTextureCount; 577e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams 587e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams int id = mRS.nProgramFragmentCreate2(mShader, tmp); 597e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams ProgramFragment pf = new ProgramFragment(id, mRS); 607e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams initProgram(pf); 617e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams return pf; 627e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams } 637e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams } 6422534176fb5c1257130ef4ee589739ca42766a32Jason Sams 6522534176fb5c1257130ef4ee589739ca42766a32Jason Sams public static class Builder { 6668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public static final int MAX_TEXTURE = 2; 6722534176fb5c1257130ef4ee589739ca42766a32Jason Sams RenderScript mRS; 6825ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams boolean mPointSpriteEnable; 6922534176fb5c1257130ef4ee589739ca42766a32Jason Sams 7068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public enum EnvMode { 7168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams REPLACE (1), 7268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams MODULATE (2), 7368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams DECAL (3); 7422534176fb5c1257130ef4ee589739ca42766a32Jason Sams 7568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams int mID; 7668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams EnvMode(int id) { 7768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mID = id; 7822534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 7922534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 8022534176fb5c1257130ef4ee589739ca42766a32Jason Sams 8168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public enum Format { 8268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams ALPHA (1), 8368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams LUMINANCE_ALPHA (2), 8468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams RGB (3), 8568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams RGBA (4); 8654c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams 8768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams int mID; 8868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams Format(int id) { 8968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mID = id; 9022534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 9122534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 9222534176fb5c1257130ef4ee589739ca42766a32Jason Sams 9368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams private class Slot { 9468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams EnvMode env; 9568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams Format format; 9668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams Slot(EnvMode _env, Format _fmt) { 9768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams env = _env; 9868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams format = _fmt; 9922534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 10068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 10168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams Slot[] mSlots; 10222534176fb5c1257130ef4ee589739ca42766a32Jason Sams 10368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public Builder(RenderScript rs) { 10468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mRS = rs; 10568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mSlots = new Slot[MAX_TEXTURE]; 10668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mPointSpriteEnable = false; 10722534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 10822534176fb5c1257130ef4ee589739ca42766a32Jason Sams 10968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams public void setTexture(EnvMode env, Format fmt, int slot) 11022534176fb5c1257130ef4ee589739ca42766a32Jason Sams throws IllegalArgumentException { 11168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams if((slot < 0) || (slot >= MAX_TEXTURE)) { 11268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams throw new IllegalArgumentException("MAX_TEXTURE exceeded."); 11322534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 11468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams mSlots[slot] = new Slot(env, fmt); 11522534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 11622534176fb5c1257130ef4ee589739ca42766a32Jason Sams 11725ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams public void setPointSpriteTexCoordinateReplacement(boolean enable) { 11825ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams mPointSpriteEnable = enable; 11925ffcdc9d7e32c9c1eeb2b48cc2f17d1353e9faeJason Sams } 12022534176fb5c1257130ef4ee589739ca42766a32Jason Sams 12122534176fb5c1257130ef4ee589739ca42766a32Jason Sams public ProgramFragment create() { 122771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 12368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams int[] tmp = new int[MAX_TEXTURE * 2 + 1]; 12468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams if (mSlots[0] != null) { 12568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams tmp[0] = mSlots[0].env.mID; 12668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams tmp[1] = mSlots[0].format.mID; 12768afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 12868afd01ec9fd37774d8291192952a25e5605b6fbJason Sams if (mSlots[1] != null) { 12968afd01ec9fd37774d8291192952a25e5605b6fbJason Sams tmp[2] = mSlots[1].env.mID; 13068afd01ec9fd37774d8291192952a25e5605b6fbJason Sams tmp[3] = mSlots[1].format.mID; 13168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams } 13268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams tmp[4] = mPointSpriteEnable ? 1 : 0; 13368afd01ec9fd37774d8291192952a25e5605b6fbJason Sams int id = mRS.nProgramFragmentCreate(tmp); 13468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams ProgramFragment pf = new ProgramFragment(id, mRS); 13568afd01ec9fd37774d8291192952a25e5605b6fbJason Sams pf.mTextureCount = MAX_TEXTURE; 13668afd01ec9fd37774d8291192952a25e5605b6fbJason Sams return pf; 13722534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 13822534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 13922534176fb5c1257130ef4ee589739ca42766a32Jason Sams} 14022534176fb5c1257130ef4ee589739ca42766a32Jason Sams 14122534176fb5c1257130ef4ee589739ca42766a32Jason Sams 14222534176fb5c1257130ef4ee589739ca42766a32Jason Sams 143