Home | History | Annotate | Download | only in renderscript
      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 
     17 package android.renderscript;
     18 
     19 
     20 import android.util.Config;
     21 import android.util.Log;
     22 
     23 
     24 /**
     25  * @hide
     26  *
     27  **/
     28 public class ProgramVertex extends Program {
     29     public static final int MAX_LIGHT = 8;
     30 
     31 
     32     ProgramVertex(int id, RenderScript rs) {
     33         super(id, rs);
     34     }
     35 
     36     public void bindAllocation(MatrixAllocation va) {
     37         mRS.validate();
     38         bindConstants(va.mAlloc, 0);
     39     }
     40 
     41 
     42     public static class Builder {
     43         RenderScript mRS;
     44         boolean mTextureMatrixEnable;
     45 
     46         public Builder(RenderScript rs, Element in, Element out) {
     47             mRS = rs;
     48         }
     49 
     50         public void setTextureMatrixEnable(boolean enable) {
     51             mTextureMatrixEnable = enable;
     52         }
     53 
     54         public ProgramVertex create() {
     55             int id = mRS.nProgramVertexCreate(mTextureMatrixEnable);
     56             return new ProgramVertex(id, mRS);
     57         }
     58     }
     59 
     60     public static class ShaderBuilder extends BaseProgramBuilder {
     61         public ShaderBuilder(RenderScript rs) {
     62             super(rs);
     63         }
     64 
     65         public ProgramVertex create() {
     66             mRS.validate();
     67             int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount +1) * 2];
     68             int idx = 0;
     69 
     70             for (int i=0; i < mInputCount; i++) {
     71                 tmp[idx++] = 0;
     72                 tmp[idx++] = mInputs[i].mID;
     73             }
     74             for (int i=0; i < mOutputCount; i++) {
     75                 tmp[idx++] = 1;
     76                 tmp[idx++] = mOutputs[i].mID;
     77             }
     78             for (int i=0; i < mConstantCount; i++) {
     79                 tmp[idx++] = 2;
     80                 tmp[idx++] = mConstants[i].mID;
     81             }
     82             tmp[idx++] = 3;
     83             tmp[idx++] = mTextureCount;
     84 
     85             int id = mRS.nProgramVertexCreate2(mShader, tmp);
     86             ProgramVertex pv = new ProgramVertex(id, mRS);
     87             initProgram(pv);
     88             return pv;
     89         }
     90     }
     91 
     92 
     93 
     94     public static class MatrixAllocation {
     95         static final int MODELVIEW_OFFSET = 0;
     96         static final int PROJECTION_OFFSET = 16;
     97         static final int TEXTURE_OFFSET = 32;
     98 
     99         Matrix4f mModel;
    100         Matrix4f mProjection;
    101         Matrix4f mTexture;
    102 
    103         public Allocation mAlloc;
    104 
    105         public MatrixAllocation(RenderScript rs) {
    106             mModel = new Matrix4f();
    107             mProjection = new Matrix4f();
    108             mTexture = new Matrix4f();
    109 
    110             mAlloc = Allocation.createSized(rs, Element.createUser(rs, Element.DataType.FLOAT_32), 48);
    111             mAlloc.subData1D(MODELVIEW_OFFSET, 16, mModel.mMat);
    112             mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
    113             mAlloc.subData1D(TEXTURE_OFFSET, 16, mTexture.mMat);
    114         }
    115 
    116         public void destroy() {
    117             mAlloc.destroy();
    118             mAlloc = null;
    119         }
    120 
    121         public void loadModelview(Matrix4f m) {
    122             mModel = m;
    123             mAlloc.subData1D(MODELVIEW_OFFSET, 16, m.mMat);
    124         }
    125 
    126         public void loadProjection(Matrix4f m) {
    127             mProjection = m;
    128             mAlloc.subData1D(PROJECTION_OFFSET, 16, m.mMat);
    129         }
    130 
    131         public void loadTexture(Matrix4f m) {
    132             mTexture = m;
    133             mAlloc.subData1D(TEXTURE_OFFSET, 16, m.mMat);
    134         }
    135 
    136         public void setupOrthoWindow(int w, int h) {
    137             mProjection.loadOrtho(0,w, h,0, -1,1);
    138             mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
    139         }
    140 
    141         public void setupOrthoNormalized(int w, int h) {
    142             // range -1,1 in the narrow axis.
    143             if(w > h) {
    144                 float aspect = ((float)w) / h;
    145                 mProjection.loadOrtho(-aspect,aspect,  -1,1,  -1,1);
    146             } else {
    147                 float aspect = ((float)h) / w;
    148                 mProjection.loadOrtho(-1,1, -aspect,aspect,  -1,1);
    149             }
    150             mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
    151         }
    152 
    153         public void setupProjectionNormalized(int w, int h) {
    154             // range -1,1 in the narrow axis at z = 0.
    155             Matrix4f m1 = new Matrix4f();
    156             Matrix4f m2 = new Matrix4f();
    157 
    158             if(w > h) {
    159                 float aspect = ((float)w) / h;
    160                 m1.loadFrustum(-aspect,aspect,  -1,1,  1,100);
    161             } else {
    162                 float aspect = ((float)h) / w;
    163                 m1.loadFrustum(-1,1, -aspect,aspect, 1,100);
    164             }
    165 
    166             m2.loadRotate(180, 0, 1, 0);
    167             m1.loadMultiply(m1, m2);
    168 
    169             m2.loadScale(-2, 2, 1);
    170             m1.loadMultiply(m1, m2);
    171 
    172             m2.loadTranslate(0, 0, 2);
    173             m1.loadMultiply(m1, m2);
    174 
    175             mProjection = m1;
    176             mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat);
    177         }
    178 
    179     }
    180 
    181 }
    182 
    183