diff options
Diffstat (limited to 'graphics/java/android/renderscript/ProgramFragment.java')
-rw-r--r-- | graphics/java/android/renderscript/ProgramFragment.java | 115 |
1 files changed, 27 insertions, 88 deletions
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java index 5e04f0c57526..14c0c01ca34d 100644 --- a/graphics/java/android/renderscript/ProgramFragment.java +++ b/graphics/java/android/renderscript/ProgramFragment.java @@ -22,7 +22,9 @@ import android.util.Log; /** - * @hide + * ProgramFragment, also know as a fragment shader, describes a + * stage in the graphics pipeline responsible for manipulating + * pixel data in a user-defined way. * **/ public class ProgramFragment extends Program { @@ -30,109 +32,46 @@ public class ProgramFragment extends Program { super(id, rs); } - public static class ShaderBuilder extends BaseProgramBuilder { - public ShaderBuilder(RenderScript rs) { + public static class Builder extends BaseProgramBuilder { + /** + * Create a builder object. + * + * @param rs + */ + public Builder(RenderScript rs) { super(rs); } + /** + * Creates ProgramFragment from the current state of the builder + * + * @return ProgramFragment + */ public ProgramFragment create() { mRS.validate(); - int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + 1) * 2]; + int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; int idx = 0; for (int i=0; i < mInputCount; i++) { - tmp[idx++] = 0; - tmp[idx++] = mInputs[i].mID; + tmp[idx++] = ProgramParam.INPUT.mID; + tmp[idx++] = mInputs[i].getID(); } for (int i=0; i < mOutputCount; i++) { - tmp[idx++] = 1; - tmp[idx++] = mOutputs[i].mID; + tmp[idx++] = ProgramParam.OUTPUT.mID; + tmp[idx++] = mOutputs[i].getID(); } for (int i=0; i < mConstantCount; i++) { - tmp[idx++] = 2; - tmp[idx++] = mConstants[i].mID; - } - tmp[idx++] = 3; - tmp[idx++] = mTextureCount; - - int id = mRS.nProgramFragmentCreate2(mShader, tmp); - ProgramFragment pf = new ProgramFragment(id, mRS); - initProgram(pf); - return pf; - } - } - - public static class Builder { - public static final int MAX_TEXTURE = 2; - RenderScript mRS; - boolean mPointSpriteEnable; - - public enum EnvMode { - REPLACE (1), - MODULATE (2), - DECAL (3); - - int mID; - EnvMode(int id) { - mID = id; + tmp[idx++] = ProgramParam.CONSTANT.mID; + tmp[idx++] = mConstants[i].getID(); } - } - - public enum Format { - ALPHA (1), - LUMINANCE_ALPHA (2), - RGB (3), - RGBA (4); - - int mID; - Format(int id) { - mID = id; + for (int i=0; i < mTextureCount; i++) { + tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; + tmp[idx++] = mTextureTypes[i].mID; } - } - private class Slot { - EnvMode env; - Format format; - Slot(EnvMode _env, Format _fmt) { - env = _env; - format = _fmt; - } - } - Slot[] mSlots; - - public Builder(RenderScript rs) { - mRS = rs; - mSlots = new Slot[MAX_TEXTURE]; - mPointSpriteEnable = false; - } - - public void setTexture(EnvMode env, Format fmt, int slot) - throws IllegalArgumentException { - if((slot < 0) || (slot >= MAX_TEXTURE)) { - throw new IllegalArgumentException("MAX_TEXTURE exceeded."); - } - mSlots[slot] = new Slot(env, fmt); - } - - public void setPointSpriteTexCoordinateReplacement(boolean enable) { - mPointSpriteEnable = enable; - } - - public ProgramFragment create() { - mRS.validate(); - int[] tmp = new int[MAX_TEXTURE * 2 + 1]; - if (mSlots[0] != null) { - tmp[0] = mSlots[0].env.mID; - tmp[1] = mSlots[0].format.mID; - } - if (mSlots[1] != null) { - tmp[2] = mSlots[1].env.mID; - tmp[3] = mSlots[1].format.mID; - } - tmp[4] = mPointSpriteEnable ? 1 : 0; - int id = mRS.nProgramFragmentCreate(tmp); + int id = mRS.nProgramFragmentCreate(mShader, tmp); ProgramFragment pf = new ProgramFragment(id, mRS); - pf.mTextureCount = MAX_TEXTURE; + initProgram(pf); return pf; } } |