rsProgramVertex.cpp revision 4815c0d121310cfcd6a8aba4eab77a9910af53ac
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h"
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsProgramVertex.h"
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
201aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h>
211aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h>
22c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2.h>
23c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <GLES2/gl2ext.h>
241aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
294815c0d121310cfcd6a8aba4eab77a9910af53acJason SamsProgramVertex::ProgramVertex(Context *rsc, bool texMat) :
304815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Program(rsc)
314815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams{
324815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mAllocFile = __FILE__;
334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mAllocLine = __LINE__;
344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mTextureMatrixEnable = texMat;
354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    mLightCount = 0;
364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    init(rsc);
374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams}
384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
394815c0d121310cfcd6a8aba4eab77a9910af53acJason SamsProgramVertex::ProgramVertex(Context *rsc, const char * shaderText,
404815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                             uint32_t shaderLength, const uint32_t * params,
414815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                             uint32_t paramLength) :
424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    Program(rsc, shaderText, shaderLength, params, paramLength)
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
44f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocFile = __FILE__;
45f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocLine = __LINE__;
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTextureMatrixEnable = false;
47b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    mLightCount = 0;
484815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
494815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    init(rsc);
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
52326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramVertex::~ProgramVertex()
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
5656bc1af0a040b003164e3394f1c7a277b15e7d85Jason Samsstatic void logMatrix(const char *txt, const float *f)
5756bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams{
58992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    LOGV("Matrix %s, %p", txt, f);
59992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[0], f[4], f[8], f[12]);
60992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[1], f[5], f[9], f[13]);
61992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[2], f[6], f[10], f[14]);
62992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams    LOGV("%6.2f, %6.2f, %6.2f, %6.2f", f[3], f[7], f[11], f[15]);
6356bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams}
6456bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams
65afcb25c65e8145d15aaf50a0ca38333954a97000Jason Samsvoid ProgramVertex::setupGL(const Context *rsc, ProgramVertexState *state)
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
67cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    if ((state->mLast.get() == this) && !mDirty) {
68cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams        return;
69cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    }
70cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    state->mLast.set(this);
71cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams
72cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    const float *f = static_cast<const float *>(mConstants->getPtr());
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glMatrixMode(GL_TEXTURE);
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (mTextureMatrixEnable) {
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glLoadMatrixf(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET]);
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    } else {
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glLoadIdentity();
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
81b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    glMatrixMode(GL_MODELVIEW);
82b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    glLoadIdentity();
83b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    if (mLightCount) {
8448b7edc13372dcb4537713e32beeb36bcd73a6d9Romain Guy        int v = 0;
85b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        glEnable(GL_LIGHTING);
86b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        glLightModelxv(GL_LIGHT_MODEL_TWO_SIDE, &v);
87b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        for (uint32_t ct = 0; ct < mLightCount; ct++) {
88b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams            const Light *l = mLights[ct].get();
89b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams            glEnable(GL_LIGHT0 + ct);
90b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams            l->setupGL(ct);
91b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        }
92b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        for (uint32_t ct = mLightCount; ct < MAX_LIGHTS; ct++) {
93b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams            glDisable(GL_LIGHT0 + ct);
94b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        }
95b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    } else {
96b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        glDisable(GL_LIGHTING);
97b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    }
98cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams
99b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    if (!f) {
100b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        LOGE("Must bind constants to vertex program");
101b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    }
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glMatrixMode(GL_PROJECTION);
10456bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams    glLoadMatrixf(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glMatrixMode(GL_MODELVIEW);
10656bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams    glLoadMatrixf(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]);
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
108cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    mDirty = false;
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
111c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramVertex::loadShader() {
112c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    Program::loadShader(GL_VERTEX_SHADER);
113c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
114c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
115c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramVertex::createShader()
116c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
117c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mShader.setTo("");
118c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
119c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    for (uint32_t ct=0; ct < mAttribCount; ct++) {
120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        mShader.append("attribute vec4 ");
121c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        mShader.append(mAttribNames[ct]);
122c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        mShader.append(";\n");
123c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
124c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    for (uint32_t ct=0; ct < mUniformCount; ct++) {
126c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        mShader.append("uniform mat4 ");
127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        mShader.append(mUniformNames[ct]);
128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        mShader.append(";\n");
129c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
130c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
131c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mShader.append("varying vec4 varColor;\n");
132c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mShader.append("varying vec4 varTex0;\n");
133c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
134f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams    if (mUserShader.length() > 1) {
135f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        mShader.append(mUserShader);
136c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    } else {
137f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        mShader.append("void main() {\n");
138f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        mShader.append("  gl_Position = uni_MVP * attrib_Position;\n");
139f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        mShader.append("  gl_PointSize = attrib_PointSize.x;\n");
140f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams
141f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        mShader.append("  varColor = attrib_Color;\n");
142f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        if (mTextureMatrixEnable) {
143f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams            mShader.append("  varTex0 = uni_TexMatrix * attrib_T0;\n");
144f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        } else {
145f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams            mShader.append("  varTex0 = attrib_T0;\n");
146f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        }
147f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        //mShader.append("  pos.x = pos.x / 480.0;\n");
148f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        //mShader.append("  pos.y = pos.y / 800.0;\n");
149f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        //mShader.append("  gl_Position = pos;\n");
150f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams        mShader.append("}\n");
151c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
152c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
153c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
154c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramVertex::setupGL2(const Context *rsc, ProgramVertexState *state, ShaderCache *sc)
155c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
156c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    //LOGE("sgl2 vtx1 %x", glGetError());
157c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    if ((state->mLast.get() == this) && !mDirty) {
158c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        //return;
159c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
160c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
161c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    const float *f = static_cast<const float *>(mConstants->getPtr());
162c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
163c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    Matrix mvp;
164c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mvp.load(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
165c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    Matrix t;
166c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    t.load(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]);
167c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mvp.multiply(&t);
168c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
169c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    glUniformMatrix4fv(sc->vtxUniformSlot(0), 1, GL_FALSE, mvp.m);
170c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    if (mTextureMatrixEnable) {
171c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams        glUniformMatrix4fv(sc->vtxUniformSlot(1), 1, GL_FALSE,
172c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams                           &f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET]);
173c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    }
174c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
175c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    state->mLast.set(this);
176c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    //LOGE("sgl2 vtx2 %x", glGetError());
177c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
178c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
179b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Samsvoid ProgramVertex::addLight(const Light *l)
180b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams{
181b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    if (mLightCount < MAX_LIGHTS) {
182b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        mLights[mLightCount].set(l);
183b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams        mLightCount++;
184b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams    }
185b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams}
186b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams
187c9d43db4d216b01b13aebfdb31d5615909591b33Jason Samsvoid ProgramVertex::setProjectionMatrix(const rsc_Matrix *m) const
188c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams{
189cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    float *f = static_cast<float *>(mConstants->getPtr());
190c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams    memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m, sizeof(rsc_Matrix));
191cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    mDirty = true;
192c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams}
193c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams
194c9d43db4d216b01b13aebfdb31d5615909591b33Jason Samsvoid ProgramVertex::setModelviewMatrix(const rsc_Matrix *m) const
195c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams{
196cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    float *f = static_cast<float *>(mConstants->getPtr());
197c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams    memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m, sizeof(rsc_Matrix));
198cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    mDirty = true;
199c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams}
200c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams
201c9d43db4d216b01b13aebfdb31d5615909591b33Jason Samsvoid ProgramVertex::setTextureMatrix(const rsc_Matrix *m) const
202c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams{
203cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    float *f = static_cast<float *>(mConstants->getPtr());
204c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams    memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m, sizeof(rsc_Matrix));
205cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    mDirty = true;
206c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams}
207c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams
2083a97c59c6f8cc974d007080365b82c5177ba6a3fJason Samsvoid ProgramVertex::transformToScreen(const Context *rsc, float *v4out, const float *v3in) const
2093a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams{
2103a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams    float *f = static_cast<float *>(mConstants->getPtr());
2113a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams    Matrix mvp;
2123a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams    mvp.loadMultiply((Matrix *)&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET],
2133a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams                     (Matrix *)&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
2143a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams    mvp.vectorMultiply(v4out, v3in);
2153a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams}
216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
217c460e55d78cbe8bee95c5c947dfe541218142a5bJason Samsvoid ProgramVertex::init(Context *rsc)
218c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams{
219c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mAttribCount = 6;
220c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mAttribNames[VertexArray::POSITION].setTo("attrib_Position");
221c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mAttribNames[VertexArray::COLOR].setTo("attrib_Color");
222c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mAttribNames[VertexArray::NORMAL].setTo("attrib_Normal");
223c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mAttribNames[VertexArray::POINT_SIZE].setTo("attrib_PointSize");
224c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mAttribNames[VertexArray::TEXTURE_0].setTo("attrib_T0");
225c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mAttribNames[VertexArray::TEXTURE_1].setTo("attrib_T1");
226c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
227c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mUniformCount = 2;
228c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mUniformNames[0].setTo("uni_MVP");
229c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    mUniformNames[1].setTo("uni_TexMatrix");
230c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
231c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    createShader();
232c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams}
233c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
2344815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams
235c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams///////////////////////////////////////////////////////////////////////
236c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams
237326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramVertexState::ProgramVertexState()
238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
241326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsProgramVertexState::~ProgramVertexState()
242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Samsvoid ProgramVertexState::init(Context *rsc, int32_t w, int32_t h)
2468ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams{
2478287c0c89bb346a9f251505ac5d5ceb8f449bbafJason Sams    rsi_ElementBegin(rsc);
2488287c0c89bb346a9f251505ac5d5ceb8f449bbafJason Sams    rsi_ElementAdd(rsc, RS_KIND_USER, RS_TYPE_FLOAT, false, 32, NULL);
2498287c0c89bb346a9f251505ac5d5ceb8f449bbafJason Sams    RsElement e = rsi_ElementCreate(rsc);
2508287c0c89bb346a9f251505ac5d5ceb8f449bbafJason Sams
2518287c0c89bb346a9f251505ac5d5ceb8f449bbafJason Sams    rsi_TypeBegin(rsc, e);
2528287c0c89bb346a9f251505ac5d5ceb8f449bbafJason Sams    rsi_TypeAdd(rsc, RS_DIMENSION_X, 48);
253f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocType.set((Type *)rsi_TypeCreate(rsc));
2548287c0c89bb346a9f251505ac5d5ceb8f449bbafJason Sams
2554815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    ProgramVertex *pv = new ProgramVertex(rsc, false);
256f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    Allocation *alloc = (Allocation *)rsi_AllocationCreateTyped(rsc, mAllocType.get());
2578ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mDefaultAlloc.set(alloc);
2588ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mDefault.set(pv);
259c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams    pv->init(rsc);
260cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams    pv->bindAllocation(alloc);
261cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams
262e18844a5f648071fcc3594f84bca1728644af41aJason Sams    updateSize(rsc, w, h);
263e18844a5f648071fcc3594f84bca1728644af41aJason Sams}
264e18844a5f648071fcc3594f84bca1728644af41aJason Sams
265e18844a5f648071fcc3594f84bca1728644af41aJason Samsvoid ProgramVertexState::updateSize(Context *rsc, int32_t w, int32_t h)
266e18844a5f648071fcc3594f84bca1728644af41aJason Sams{
2678ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    Matrix m;
2688ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    m.loadOrtho(0,w, h,0, -1,1);
269e18844a5f648071fcc3594f84bca1728644af41aJason Sams    mDefaultAlloc->subData(RS_PROGRAM_VERTEX_PROJECTION_OFFSET, 16, &m.m[0], 16*4);
2708ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams
2718ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    m.loadIdentity();
272e18844a5f648071fcc3594f84bca1728644af41aJason Sams    mDefaultAlloc->subData(RS_PROGRAM_VERTEX_MODELVIEW_OFFSET, 16, &m.m[0], 16*4);
2738ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams}
274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
275f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Samsvoid ProgramVertexState::deinit(Context *rsc)
276f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams{
277f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mDefaultAlloc.clear();
278f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mDefault.clear();
279f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mAllocType.clear();
280f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams    mLast.clear();
281f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams}
282f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams
283326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
284326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
285326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
286326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
287326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2884815c0d121310cfcd6a8aba4eab77a9910af53acJason SamsRsProgramVertex rsi_ProgramVertexCreate(Context *rsc, bool texMat)
289326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
2904815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    ProgramVertex *pv = new ProgramVertex(rsc, texMat);
2919397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    pv->incUserRef();
292326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return pv;
293326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
294326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2954815c0d121310cfcd6a8aba4eab77a9910af53acJason SamsRsProgramVertex rsi_ProgramVertexCreate2(Context *rsc, const char * shaderText,
2964815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                             uint32_t shaderLength, const uint32_t * params,
2974815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams                             uint32_t paramLength)
298326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
2994815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    ProgramVertex *pv = new ProgramVertex(rsc, shaderText, shaderLength, params, paramLength);
3004815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    pv->incUserRef();
3014815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams    return pv;
302b5909ce06dd10dcb5ac715572a05b2d225b77c98Jason Sams}
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
304326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
307