blob: 1b155d7c4bf833d66fb3c4167b76472b1e9350f3 [file] [log] [blame]
Jason Sams110195f2009-08-04 18:47:46 -07001/*
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
17package android.renderscript;
18
19
20import android.util.Config;
21import android.util.Log;
22
23
24/**
25 * @hide
26 *
27 **/
Jason Sams0011bcf2009-12-15 12:58:36 -080028public class ProgramVertex extends Program {
Jason Sams110195f2009-08-04 18:47:46 -070029 public static final int MAX_LIGHT = 8;
30
Jason Sams0011bcf2009-12-15 12:58:36 -080031
Jason Sams110195f2009-08-04 18:47:46 -070032 ProgramVertex(int id, RenderScript rs) {
Jason Sams0011bcf2009-12-15 12:58:36 -080033 super(id, rs);
Jason Sams110195f2009-08-04 18:47:46 -070034 }
35
Jason Sams9bee51c2009-08-05 13:57:03 -070036 public void bindAllocation(MatrixAllocation va) {
Jason Sams771bebb2009-12-07 12:40:12 -080037 mRS.validate();
Jason Sams0011bcf2009-12-15 12:58:36 -080038 bindConstants(va.mAlloc, 0);
Jason Sams110195f2009-08-04 18:47:46 -070039 }
40
41
42 public static class Builder {
43 RenderScript mRS;
Jason Sams110195f2009-08-04 18:47:46 -070044 boolean mTextureMatrixEnable;
Jason Sams110195f2009-08-04 18:47:46 -070045
46 public Builder(RenderScript rs, Element in, Element out) {
47 mRS = rs;
Jason Sams110195f2009-08-04 18:47:46 -070048 }
49
50 public void setTextureMatrixEnable(boolean enable) {
51 mTextureMatrixEnable = enable;
52 }
53
Jason Sams0011bcf2009-12-15 12:58:36 -080054 public ProgramVertex create() {
55 int id = mRS.nProgramVertexCreate(mTextureMatrixEnable);
56 return new ProgramVertex(id, mRS);
Jason Sams54c0ec12009-11-30 14:49:55 -080057 }
Jason Sams0011bcf2009-12-15 12:58:36 -080058 }
Jason Sams54c0ec12009-11-30 14:49:55 -080059
Jason Sams0011bcf2009-12-15 12:58:36 -080060 public static class ShaderBuilder extends BaseProgramBuilder {
61 public ShaderBuilder(RenderScript rs) {
62 super(rs);
Jason Sams110195f2009-08-04 18:47:46 -070063 }
64
65 public ProgramVertex create() {
Jason Sams771bebb2009-12-07 12:40:12 -080066 mRS.validate();
Jason Sams0011bcf2009-12-15 12:58:36 -080067 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 }
Jason Sams7e5ab3b2009-12-15 13:27:04 -080082 tmp[idx++] = 3;
83 tmp[idx++] = mTextureCount;
Jason Sams0011bcf2009-12-15 12:58:36 -080084
85 int id = mRS.nProgramVertexCreate2(mShader, tmp);
86 ProgramVertex pv = new ProgramVertex(id, mRS);
87 initProgram(pv);
88 return pv;
Jason Sams110195f2009-08-04 18:47:46 -070089 }
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
Jason Sams25430d02010-02-02 15:26:40 -080099 Matrix4f mModel;
100 Matrix4f mProjection;
101 Matrix4f mTexture;
Jason Sams110195f2009-08-04 18:47:46 -0700102
103 public Allocation mAlloc;
104
105 public MatrixAllocation(RenderScript rs) {
Jason Sams25430d02010-02-02 15:26:40 -0800106 mModel = new Matrix4f();
107 mProjection = new Matrix4f();
108 mTexture = new Matrix4f();
Jason Sams110195f2009-08-04 18:47:46 -0700109
Jason Sams718cd1f2009-12-23 14:35:29 -0800110 mAlloc = Allocation.createSized(rs, Element.createUser(rs, Element.DataType.FLOAT_32), 48);
Jason Sams110195f2009-08-04 18:47:46 -0700111 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
Jason Sams25430d02010-02-02 15:26:40 -0800121 public void loadModelview(Matrix4f m) {
Jason Sams110195f2009-08-04 18:47:46 -0700122 mModel = m;
123 mAlloc.subData1D(MODELVIEW_OFFSET, 16, m.mMat);
124 }
125
Jason Sams25430d02010-02-02 15:26:40 -0800126 public void loadProjection(Matrix4f m) {
Jason Sams110195f2009-08-04 18:47:46 -0700127 mProjection = m;
128 mAlloc.subData1D(PROJECTION_OFFSET, 16, m.mMat);
129 }
130
Jason Sams25430d02010-02-02 15:26:40 -0800131 public void loadTexture(Matrix4f m) {
Jason Sams110195f2009-08-04 18:47:46 -0700132 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.
Jason Sams25430d02010-02-02 15:26:40 -0800155 Matrix4f m1 = new Matrix4f();
156 Matrix4f m2 = new Matrix4f();
Jason Sams110195f2009-08-04 18:47:46 -0700157
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