diff options
Diffstat (limited to 'graphics/java/android/renderscript/ProgramVertexFixedFunction.java')
-rw-r--r-- | graphics/java/android/renderscript/ProgramVertexFixedFunction.java | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/graphics/java/android/renderscript/ProgramVertexFixedFunction.java b/graphics/java/android/renderscript/ProgramVertexFixedFunction.java new file mode 100644 index 0000000..556964a --- /dev/null +++ b/graphics/java/android/renderscript/ProgramVertexFixedFunction.java @@ -0,0 +1,268 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.renderscript; + + +import android.graphics.Matrix; +import android.util.Config; +import android.util.Log; + + +/** + * ProgramVertexFixedFunction is a helper class that provides a + * simple way to create a fixed function emulation vertex shader + * without writing any GLSL code. + * + **/ +public class ProgramVertexFixedFunction extends ProgramVertex { + + ProgramVertexFixedFunction(int id, RenderScript rs) { + super(id, rs); + } + + /** + * Binds the constant buffer containing fixed function emulation + * matrices + * + * @param va allocation containing fixed function matrices + */ + public void bindConstants(Constants va) { + mRS.validate(); + bindConstants(va.getAllocation(), 0); + } + + static class InternalBuilder extends BaseProgramBuilder { + public InternalBuilder(RenderScript rs) { + super(rs); + } + + public InternalBuilder addInput(Element e) throws IllegalStateException { + // Should check for consistant and non-conflicting names... + if(mInputCount >= MAX_INPUT) { + throw new RSIllegalArgumentException("Max input count exceeded."); + } + if (e.isComplex()) { + throw new RSIllegalArgumentException("Complex elements not allowed."); + } + mInputs[mInputCount++] = e; + return this; + } + + /** + * Creates ProgramVertexFixedFunction from the current state of + * the builder + * + * @return ProgramVertexFixedFunction + */ + public ProgramVertexFixedFunction create() { + mRS.validate(); + int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; + int idx = 0; + + for (int i=0; i < mInputCount; i++) { + tmp[idx++] = ProgramParam.INPUT.mID; + tmp[idx++] = mInputs[i].getID(); + } + for (int i=0; i < mOutputCount; i++) { + tmp[idx++] = ProgramParam.OUTPUT.mID; + tmp[idx++] = mOutputs[i].getID(); + } + for (int i=0; i < mConstantCount; i++) { + tmp[idx++] = ProgramParam.CONSTANT.mID; + tmp[idx++] = mConstants[i].getID(); + } + for (int i=0; i < mTextureCount; i++) { + tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; + tmp[idx++] = mTextureTypes[i].mID; + } + + int id = mRS.nProgramVertexCreate(mShader, tmp); + ProgramVertexFixedFunction pv = new ProgramVertexFixedFunction(id, mRS); + initProgram(pv); + return pv; + } + } + + public static class Builder { + boolean mTextureMatrixEnable; + String mShader; + RenderScript mRS; + + /** + * Creates a builder for fixed function vertex program + * + * @param rs Context to which the program will belong. + */ + public Builder(RenderScript rs) { + mRS = rs; + } + + /** + * Specifies whether texture matrix calculations are to be added + * to the shader + * + */ + public Builder setTextureMatrixEnable(boolean enable) { + mTextureMatrixEnable = enable; + return this; + } + static Type getConstantInputType(RenderScript rs) { + Element.Builder b = new Element.Builder(rs); + b.add(Element.MATRIX4X4(rs), "MV"); + b.add(Element.MATRIX4X4(rs), "P"); + b.add(Element.MATRIX4X4(rs), "TexMatrix"); + b.add(Element.MATRIX4X4(rs), "MVP"); + + Type.Builder typeBuilder = new Type.Builder(rs, b.create()); + typeBuilder.setX(1); + return typeBuilder.create(); + } + + private void buildShaderString() { + + mShader = "//rs_shader_internal\n"; + mShader += "varying vec4 varColor;\n"; + mShader += "varying vec2 varTex0;\n"; + + mShader += "void main() {\n"; + mShader += " gl_Position = UNI_MVP * ATTRIB_position;\n"; + mShader += " gl_PointSize = 1.0;\n"; + + mShader += " varColor = ATTRIB_color;\n"; + if (mTextureMatrixEnable) { + mShader += " varTex0 = (UNI_TexMatrix * vec4(ATTRIB_texture0, 0.0, 1.0)).xy;\n"; + } else { + mShader += " varTex0 = ATTRIB_texture0;\n"; + } + mShader += "}\n"; + } + + /** + * Creates ProgramVertexFixedFunction from the current state of + * the builder + * + * @return Fixed function emulation ProgramVertex + */ + public ProgramVertexFixedFunction create() { + buildShaderString(); + + InternalBuilder sb = new InternalBuilder(mRS); + sb.setShader(mShader); + sb.addConstant(getConstantInputType(mRS)); + + Element.Builder b = new Element.Builder(mRS); + b.add(Element.F32_4(mRS), "position"); + b.add(Element.F32_4(mRS), "color"); + b.add(Element.F32_3(mRS), "normal"); + b.add(Element.F32_2(mRS), "texture0"); + sb.addInput(b.create()); + + return sb.create(); + } + } + + /** + * Helper class to store modelview, projection and texture + * matrices for ProgramVertexFixedFunction + * + */ + public static class Constants { + static final int MODELVIEW_OFFSET = 0; + static final int PROJECTION_OFFSET = 16; + static final int TEXTURE_OFFSET = 32; + + Matrix4f mModel; + Matrix4f mProjection; + Matrix4f mTexture; + + Allocation mAlloc; + Allocation getAllocation() { + return mAlloc; + } + private FieldPacker mIOBuffer; + + /** + * Creates a buffer to store fixed function emulation matrices + * + * @param rs Context to which the allocation will belong. + **/ + public Constants(RenderScript rs) { + Type constInputType = ProgramVertexFixedFunction.Builder.getConstantInputType(rs); + mAlloc = Allocation.createTyped(rs, constInputType); + int bufferSize = constInputType.getElement().getSizeBytes()* + constInputType.getCount(); + mIOBuffer = new FieldPacker(bufferSize); + mModel = new Matrix4f(); + mProjection = new Matrix4f(); + mTexture = new Matrix4f(); + setModelview(new Matrix4f()); + setProjection(new Matrix4f()); + setTexture(new Matrix4f()); + } + + /** + * Forces deallocation of memory backing the contant matrices. + * Normally, this is unnecessary and will be garbage collected + * + */ + public void destroy() { + mAlloc.destroy(); + mAlloc = null; + } + + private void addToBuffer(int offset, Matrix4f m) { + mIOBuffer.reset(offset); + for(int i = 0; i < 16; i ++) { + mIOBuffer.addF32(m.mMat[i]); + } + mAlloc.setFromFieldPacker(0, mIOBuffer); + } + + /** + * Sets the modelview matrix in the fixed function matrix buffer + * + * @param m modelview matrix + */ + public void setModelview(Matrix4f m) { + mModel.load(m); + addToBuffer(MODELVIEW_OFFSET*4, m); + } + + /** + * Sets the projection matrix in the fixed function matrix buffer + * + * @param m projection matrix + */ + public void setProjection(Matrix4f m) { + mProjection.load(m); + addToBuffer(PROJECTION_OFFSET*4, m); + } + + /** + * Sets the texture matrix in the fixed function matrix buffer. + * Texture matrix must be enabled in the + * ProgramVertexFixedFunction builder for the shader to utilize + * it. + * + * @param m modelview matrix + */ + public void setTexture(Matrix4f m) { + mTexture.load(m); + addToBuffer(TEXTURE_OFFSET*4, m); + } + } +} |