1110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams/* 2110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * Copyright (C) 2008 The Android Open Source Project 3110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * 4110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * you may not use this file except in compliance with the License. 6110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * You may obtain a copy of the License at 7110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * 8110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * 10110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * Unless required by applicable law or agreed to in writing, software 11110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * See the License for the specific language governing permissions and 14110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * limitations under the License. 15110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams */ 16110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 17110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Samspackage android.renderscript; 18110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 19110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 20110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Samsimport android.util.Config; 21110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Samsimport android.util.Log; 22110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 23110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 24110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams/** 25110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * @hide 26110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams * 27110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams **/ 280011bcf57ff711a221a3a4c73f2a79125111647dJason Samspublic class ProgramVertex extends Program { 29110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public static final int MAX_LIGHT = 8; 30110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 310011bcf57ff711a221a3a4c73f2a79125111647dJason Sams 32110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams ProgramVertex(int id, RenderScript rs) { 330011bcf57ff711a221a3a4c73f2a79125111647dJason Sams super(id, rs); 34110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 35110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 369bee51c42eb8c3daffe7d6fa483edbb1689b94d2Jason Sams public void bindAllocation(MatrixAllocation va) { 37771bebb94054d06f97284379c93a2620613513c3Jason Sams mRS.validate(); 380011bcf57ff711a221a3a4c73f2a79125111647dJason Sams bindConstants(va.mAlloc, 0); 39110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 40110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 41110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 42110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public static class Builder { 43110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams RenderScript mRS; 44110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams boolean mTextureMatrixEnable; 45110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 46110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public Builder(RenderScript rs, Element in, Element out) { 47110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mRS = rs; 48110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 49110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 50110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public void setTextureMatrixEnable(boolean enable) { 51110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mTextureMatrixEnable = enable; 52110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 53110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 540011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public ProgramVertex create() { 550011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int id = mRS.nProgramVertexCreate(mTextureMatrixEnable); 560011bcf57ff711a221a3a4c73f2a79125111647dJason Sams return new ProgramVertex(id, mRS); 5754c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams } 580011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 5954c0ec14e016e4a1bf3ceab40ed6ca5447da4725Jason Sams 600011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public static class ShaderBuilder extends BaseProgramBuilder { 610011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public ShaderBuilder(RenderScript rs) { 620011bcf57ff711a221a3a4c73f2a79125111647dJason Sams super(rs); 63110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 64110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 650011bcf57ff711a221a3a4c73f2a79125111647dJason Sams public ProgramVertex create() { 660011bcf57ff711a221a3a4c73f2a79125111647dJason Sams mRS.validate(); 670011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount +1) * 2]; 680011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int idx = 0; 69110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 700011bcf57ff711a221a3a4c73f2a79125111647dJason Sams for (int i=0; i < mInputCount; i++) { 710011bcf57ff711a221a3a4c73f2a79125111647dJason Sams tmp[idx++] = 0; 720011bcf57ff711a221a3a4c73f2a79125111647dJason Sams tmp[idx++] = mInputs[i].mID; 73110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 740011bcf57ff711a221a3a4c73f2a79125111647dJason Sams for (int i=0; i < mOutputCount; i++) { 750011bcf57ff711a221a3a4c73f2a79125111647dJason Sams tmp[idx++] = 1; 760011bcf57ff711a221a3a4c73f2a79125111647dJason Sams tmp[idx++] = mOutputs[i].mID; 77110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 780011bcf57ff711a221a3a4c73f2a79125111647dJason Sams for (int i=0; i < mConstantCount; i++) { 790011bcf57ff711a221a3a4c73f2a79125111647dJason Sams tmp[idx++] = 2; 800011bcf57ff711a221a3a4c73f2a79125111647dJason Sams tmp[idx++] = mConstants[i].mID; 810011bcf57ff711a221a3a4c73f2a79125111647dJason Sams } 827e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = 3; 837e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams tmp[idx++] = mTextureCount; 84110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 850011bcf57ff711a221a3a4c73f2a79125111647dJason Sams int id = mRS.nProgramVertexCreate2(mShader, tmp); 860011bcf57ff711a221a3a4c73f2a79125111647dJason Sams ProgramVertex pv = new ProgramVertex(id, mRS); 870011bcf57ff711a221a3a4c73f2a79125111647dJason Sams initProgram(pv); 880011bcf57ff711a221a3a4c73f2a79125111647dJason Sams return pv; 89110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 90110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 91110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 92110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 93110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 94110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public static class MatrixAllocation { 95110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams static final int MODELVIEW_OFFSET = 0; 96110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams static final int PROJECTION_OFFSET = 16; 97110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams static final int TEXTURE_OFFSET = 32; 98110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 9925430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Matrix4f mModel; 10025430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Matrix4f mProjection; 10125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Matrix4f mTexture; 102110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 103110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public Allocation mAlloc; 104110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 105110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public MatrixAllocation(RenderScript rs) { 10625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mModel = new Matrix4f(); 10725430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mProjection = new Matrix4f(); 10825430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams mTexture = new Matrix4f(); 109110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 110718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams mAlloc = Allocation.createSized(rs, Element.createUser(rs, Element.DataType.FLOAT_32), 48); 111110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.subData1D(MODELVIEW_OFFSET, 16, mModel.mMat); 112110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat); 113110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.subData1D(TEXTURE_OFFSET, 16, mTexture.mMat); 114110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 115110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 116110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public void destroy() { 117110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.destroy(); 118110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc = null; 119110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 120110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 12125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void loadModelview(Matrix4f m) { 122110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mModel = m; 123110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.subData1D(MODELVIEW_OFFSET, 16, m.mMat); 124110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 125110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 12625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void loadProjection(Matrix4f m) { 127110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mProjection = m; 128110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.subData1D(PROJECTION_OFFSET, 16, m.mMat); 129110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 130110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 13125430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams public void loadTexture(Matrix4f m) { 132110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mTexture = m; 133110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.subData1D(TEXTURE_OFFSET, 16, m.mMat); 134110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 135110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 136110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public void setupOrthoWindow(int w, int h) { 137110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mProjection.loadOrtho(0,w, h,0, -1,1); 138110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat); 139110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 140110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 141110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public void setupOrthoNormalized(int w, int h) { 142110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams // range -1,1 in the narrow axis. 143110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams if(w > h) { 144110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams float aspect = ((float)w) / h; 145110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mProjection.loadOrtho(-aspect,aspect, -1,1, -1,1); 146110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } else { 147110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams float aspect = ((float)h) / w; 148110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mProjection.loadOrtho(-1,1, -aspect,aspect, -1,1); 149110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 150110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat); 151110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 152110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 153110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams public void setupProjectionNormalized(int w, int h) { 154110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams // range -1,1 in the narrow axis at z = 0. 15525430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Matrix4f m1 = new Matrix4f(); 15625430d0734d12d12ca2d2d7a9d18c0cf3c5bdc4eJason Sams Matrix4f m2 = new Matrix4f(); 157110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 158110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams if(w > h) { 159110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams float aspect = ((float)w) / h; 160110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams m1.loadFrustum(-aspect,aspect, -1,1, 1,100); 161110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } else { 162110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams float aspect = ((float)h) / w; 163110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams m1.loadFrustum(-1,1, -aspect,aspect, 1,100); 164110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 165110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 166110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams m2.loadRotate(180, 0, 1, 0); 167110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams m1.loadMultiply(m1, m2); 168110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 169110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams m2.loadScale(-2, 2, 1); 170110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams m1.loadMultiply(m1, m2); 171110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 172110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams m2.loadTranslate(0, 0, 2); 173110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams m1.loadMultiply(m1, m2); 174110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 175110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mProjection = m1; 176110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams mAlloc.subData1D(PROJECTION_OFFSET, 16, mProjection.mMat); 177110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 178110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 179110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams } 180110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 181110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams} 182110195fe9ff96255242bfa4df1d15c6a56b140d6Jason Sams 183