Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 110195fe authored by Jason Sams's avatar Jason Sams
Browse files

Seperate ProgramVertex from RenderScript.java and merge ProgramVertexAlloc...

Seperate ProgramVertex from RenderScript.java and merge ProgramVertexAlloc into the ProgramVertex class.
parent a2136d6b
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -16,18 +16,9 @@

package android.renderscript;


import java.io.IOException;
import java.io.InputStream;

import android.content.res.Resources;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

/**
 * @hide
 *
+14 −3
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import android.util.Log;
 *
 **/
public class ProgramFragment extends BaseObj {
    public static final int MAX_SLOT = 2;

    public enum EnvMode {
        REPLACE (0),
        MODULATE (1),
@@ -48,17 +50,26 @@ public class ProgramFragment extends BaseObj {
        mID = 0;
    }

    public void bindTexture(Allocation va, int slot) {
    public void bindTexture(Allocation va, int slot)
        throws IllegalArgumentException {
        if((slot < 0) || (slot >= MAX_SLOT)) {
            throw new IllegalArgumentException("Slot ID out of range.");
        }

        mRS.nProgramFragmentBindTexture(mID, slot, va.mID);
    }

    public void bindSampler(Sampler vs, int slot) {
    public void bindSampler(Sampler vs, int slot)
        throws IllegalArgumentException {
        if((slot < 0) || (slot >= MAX_SLOT)) {
            throw new IllegalArgumentException("Slot ID out of range.");
        }

        mRS.nProgramFragmentBindSampler(mID, slot, vs.mID);
    }


    public static class Builder {
        public static final int MAX_SLOT = 2;
        RenderScript mRS;
        Element mIn;
        Element mOut;
+190 −0
Original line number Diff line number Diff line
/*
 * 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.util.Config;
import android.util.Log;


/**
 * @hide
 *
 **/
public class ProgramVertex extends BaseObj {
    public static final int MAX_LIGHT = 8;

    ProgramVertex(int id, RenderScript rs) {
        super(rs);
        mID = id;
    }

    public void destroy() {
        mRS.nProgramVertexDestroy(mID);
        mID = 0;
    }

    public void bindAllocation(int slot, MatrixAllocation va) {
        mRS.nProgramVertexBindAllocation(mID, slot, va.mAlloc.mID);
    }


    public static class Builder {
        RenderScript mRS;
        Element mIn;
        Element mOut;
        Light[] mLights;
        int mLightCount;
        boolean mTextureMatrixEnable;


        public Builder(RenderScript rs, Element in, Element out) {
            mRS = rs;
            mIn = in;
            mOut = out;
            mLights = new Light[MAX_LIGHT];
            mLightCount = 0;
        }

        public void setTextureMatrixEnable(boolean enable) {
            mTextureMatrixEnable = enable;
        }

        public void addLight(Light l) throws IllegalStateException {
            if(mLightCount >= MAX_LIGHT) {
                throw new IllegalArgumentException("Max light count exceeded.");
            }
            mLights[mLightCount] = l;
            mLightCount++;
        }



        static synchronized ProgramVertex internalCreate(RenderScript rs, Builder b) {
            int inID = 0;
            int outID = 0;
            if (b.mIn != null) {
                inID = b.mIn.mID;
            }
            if (b.mOut != null) {
                outID = b.mOut.mID;
            }
            rs.nProgramVertexBegin(inID, outID);
            for(int ct=0; ct < b.mLightCount; ct++) {
                rs.nProgramVertexAddLight(b.mLights[ct].mID);
            }
            rs.nProgramVertexSetTextureMatrixEnable(b.mTextureMatrixEnable);
            int id = rs.nProgramVertexCreate();
            return new ProgramVertex(id, rs);
        }

        public ProgramVertex create() {
            return internalCreate(mRS, this);
        }
    }



    public static class MatrixAllocation {
        static final int MODELVIEW_OFFSET = 0;
        static final int PROJECTION_OFFSET = 16;
        static final int TEXTURE_OFFSET = 32;

        Matrix mModel;
        Matrix mProjection;
        Matrix mTexture;

        public Allocation mAlloc;

        public MatrixAllocation(RenderScript rs) {
            mModel = new Matrix();
            mProjection = new Matrix();
            mTexture = new Matrix();

            mAlloc = Allocation.createSized(rs, Element.USER_FLOAT, 48);
            mAlloc.subData1D(MODELVIEW_OFFSET, 16, mModel.mMat);
            mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
            mAlloc.subData1D(TEXTURE_OFFSET, 16, mTexture.mMat);
        }

        public void destroy() {
            mAlloc.destroy();
            mAlloc = null;
        }

        public void loadModelview(Matrix m) {
            mModel = m;
            mAlloc.subData1D(MODELVIEW_OFFSET, 16, m.mMat);
        }

        public void loadProjection(Matrix m) {
            mProjection = m;
            mAlloc.subData1D(PROJECTION_OFFSET, 16, m.mMat);
        }

        public void loadTexture(Matrix m) {
            mTexture = m;
            mAlloc.subData1D(TEXTURE_OFFSET, 16, m.mMat);
        }

        public void setupOrthoWindow(int w, int h) {
            mProjection.loadOrtho(0,w, h,0, -1,1);
            mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
        }

        public void setupOrthoNormalized(int w, int h) {
            // range -1,1 in the narrow axis.
            if(w > h) {
                float aspect = ((float)w) / h;
                mProjection.loadOrtho(-aspect,aspect,  -1,1,  -1,1);
            } else {
                float aspect = ((float)h) / w;
                mProjection.loadOrtho(-1,1, -aspect,aspect,  -1,1);
            }
            mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
        }

        public void setupProjectionNormalized(int w, int h) {
            // range -1,1 in the narrow axis at z = 0.
            Matrix m1 = new Matrix();
            Matrix m2 = new Matrix();

            if(w > h) {
                float aspect = ((float)w) / h;
                m1.loadFrustum(-aspect,aspect,  -1,1,  1,100);
            } else {
                float aspect = ((float)h) / w;
                m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
            }

            m2.loadRotate(180, 0, 1, 0);
            m1.loadMultiply(m1, m2);

            m2.loadScale(-2, 2, 1);
            m1.loadMultiply(m1, m2);

            m2.loadTranslate(0, 0, 2);
            m1.loadMultiply(m1, m2);

            mProjection = m1;
            mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
        }

    }

}
+0 −115
Original line number Diff line number Diff line
/*
 * Copyright (C) 2009 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 java.lang.Math;

import android.renderscript.Element;
import android.util.Log;


/**
 * @hide
 *
 **/
public class ProgramVertexAlloc {
    public static final int MODELVIEW_OFFSET = 0;
    public static final int PROJECTION_OFFSET = 16;
    public static final int TEXTURE_OFFSET = 32;

    Matrix mModel;
    Matrix mProjection;
    Matrix mTexture;

    public Allocation mAlloc;

    public ProgramVertexAlloc(RenderScript rs) {
        mModel = new Matrix();
        mProjection = new Matrix();
        mTexture = new Matrix();

        mAlloc = Allocation.createSized(rs, Element.USER_FLOAT, 48);
        mAlloc.subData1D(MODELVIEW_OFFSET, 16, mModel.mMat);
        mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
        mAlloc.subData1D(TEXTURE_OFFSET, 16, mTexture.mMat);
    }

    public void loadModelview(Matrix m) {
        mModel = m;
        mAlloc.subData1D(MODELVIEW_OFFSET, 16, m.mMat);
    }

    public void loadProjection(Matrix m) {
        mProjection = m;
        mAlloc.subData1D(PROJECTION_OFFSET, 16, m.mMat);
    }

    public void loadTexture(Matrix m) {
        mTexture = m;
        mAlloc.subData1D(TEXTURE_OFFSET, 16, m.mMat);
    }

    public void setupOrthoWindow(int w, int h) {
        mProjection.loadOrtho(0,w, h,0, -1,1);
        mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
    }

    public void setupOrthoNormalized(int w, int h) {
        // range -1,1 in the narrow axis.
        if(w > h) {
            float aspect = ((float)w) / h;
            mProjection.loadOrtho(-aspect,aspect,  -1,1,  -1,1);
        } else {
            float aspect = ((float)h) / w;
            mProjection.loadOrtho(-1,1, -aspect,aspect,  -1,1);
        }
        mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
    }

    public void setupProjectionNormalized(int w, int h) {
        // range -1,1 in the narrow axis at z = 0.
        Matrix m1 = new Matrix();
        Matrix m2 = new Matrix();

        if(w > h) {
            float aspect = ((float)w) / h;
            m1.loadFrustum(-aspect,aspect,  -1,1,  1,100);
        } else {
            float aspect = ((float)h) / w;
            m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
        }

        m2.loadRotate(180, 0, 1, 0);
        m1.loadMultiply(m1, m2);

        m2.loadScale(-2, 2, 1);
        m1.loadMultiply(m1, m2);

        m2.loadTranslate(0, 0, 2);
        m1.loadMultiply(m1, m2);

        mProjection = m1;
        mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
    }

}





+0 −49
Original line number Diff line number Diff line
@@ -251,55 +251,6 @@ public class RenderScript {
        return new TriangleMesh(id);
    }

    //////////////////////////////////////////////////////////////////////////////////
    // ProgramVertex

    public class ProgramVertex extends BaseObj {
        ProgramVertex(int id) {
            super(RenderScript.this);
            mID = id;
        }

        public void destroy() {
            nProgramVertexDestroy(mID);
            mID = 0;
        }

        public void bindAllocation(int slot, Allocation va) {
            nProgramVertexBindAllocation(mID, slot, va.mID);
        }
    }

    public void programVertexBegin(Element in, Element out) {
        int inID = 0;
        int outID = 0;
        if (in != null) {
            inID = in.mID;
        }
        if (out != null) {
            outID = out.mID;
        }
        nProgramVertexBegin(inID, outID);
    }

    public void programVertexSetType(int slot, Type t) {
        nProgramVertexSetType(slot, t.mID);
    }

    public void programVertexSetTextureMatrixEnable(boolean enable) {
        nProgramVertexSetTextureMatrixEnable(enable);
    }

    public void programVertexAddLight(Light l) {
        nProgramVertexAddLight(l.mID);
    }

    public ProgramVertex programVertexCreate() {
        int id = nProgramVertexCreate();
        return new ProgramVertex(id);
    }


    //////////////////////////////////////////////////////////////////////////////////
    // File

Loading