rsScriptC.cpp revision 8ce125be69531dbf3a7e856d5e59d1b8e2789db0
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 "rsScriptC.h"
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsMatrix.h"
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
211ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich#include "acc/acc.h"
22a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams#include "utils/String8.h"
231ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
28326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::ScriptC()
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
301ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    mAccScript = NULL;
31efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mProgram, 0, sizeof(mProgram));
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
34326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::~ScriptC()
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
361ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    if (mAccScript) {
371ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich        accDeleteScript(mAccScript);
381ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    }
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
41fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixLoadIdentity(void *con, rsc_Matrix *mat)
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadIdentity();
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
47fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixLoadFloat(void *con, rsc_Matrix *mat, const float *f)
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->load(f);
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
53fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixLoadMat(void *con, rsc_Matrix *mat, const rsc_Matrix *newmat)
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->load(reinterpret_cast<const Matrix *>(newmat));
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
59fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixLoadRotate(void *con, rsc_Matrix *mat, float rot, float x, float y, float z)
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadRotate(rot, x, y, z);
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
65fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixLoadScale(void *con, rsc_Matrix *mat, float x, float y, float z)
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadScale(x, y, z);
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
71fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixLoadTranslate(void *con, rsc_Matrix *mat, float x, float y, float z)
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadTranslate(x, y, z);
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
77fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixLoadMultiply(void *con, rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadMultiply(reinterpret_cast<const Matrix *>(lhs),
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                    reinterpret_cast<const Matrix *>(rhs));
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
84fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixMultiply(void *con, rsc_Matrix *mat, const rsc_Matrix *rhs)
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->multiply(reinterpret_cast<const Matrix *>(rhs));
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
90fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixRotate(void *con, rsc_Matrix *mat, float rot, float x, float y, float z)
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->rotate(rot, x, y, z);
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
96fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixScale(void *con, rsc_Matrix *mat, float x, float y, float z)
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->scale(x, y, z);
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
102fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void matrixTranslate(void *con, rsc_Matrix *mat, float x, float y, float z)
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->translate(x, y, z);
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
109fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" const void * loadVp(void *vp, uint32_t bank, uint32_t offset)
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return &static_cast<const uint8_t *>(env->mScript->mSlots[bank]->getPtr())[offset];
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
115fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" float loadF(void *vp, uint32_t bank, uint32_t offset)
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("bank %i, offset %i", bank, offset);
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("%p", env->mScript->mSlots[bank]->getPtr());
120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return static_cast<const float *>(env->mScript->mSlots[bank]->getPtr())[offset];
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
123fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" int32_t loadI32(void *vp, uint32_t bank, uint32_t offset)
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return static_cast<const int32_t *>(env->mScript->mSlots[bank]->getPtr())[offset];
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
129fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" uint32_t loadU32(void *vp, uint32_t bank, uint32_t offset)
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return static_cast<const uint32_t *>(env->mScript->mSlots[bank]->getPtr())[offset];
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
135fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void loadEnvVec4(void *vp, uint32_t bank, uint32_t offset, rsc_Vector4 *v)
136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    memcpy(v, &static_cast<const float *>(env->mScript->mSlots[bank]->getPtr())[offset], sizeof(rsc_Vector4));
139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
141fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void loadEnvMatrix(void *vp, uint32_t bank, uint32_t offset, rsc_Matrix *m)
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    memcpy(m, &static_cast<const float *>(env->mScript->mSlots[bank]->getPtr())[offset], sizeof(rsc_Matrix));
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
147326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
148fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void storeF(void *vp, uint32_t bank, uint32_t offset, float v)
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    static_cast<float *>(env->mScript->mSlots[bank]->getPtr())[offset] = v;
152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
153326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
154fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void storeI32(void *vp, uint32_t bank, uint32_t offset, int32_t v)
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    static_cast<int32_t *>(env->mScript->mSlots[bank]->getPtr())[offset] = v;
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
160fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void storeU32(void *vp, uint32_t bank, uint32_t offset, uint32_t v)
161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    static_cast<uint32_t *>(env->mScript->mSlots[bank]->getPtr())[offset] = v;
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
166fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void storeEnvVec4(void *vp, uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    memcpy(&static_cast<float *>(env->mScript->mSlots[bank]->getPtr())[offset], v, sizeof(rsc_Vector4));
170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
172fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void storeEnvMatrix(void *vp, uint32_t bank, uint32_t offset, const rsc_Matrix *m)
173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    memcpy(&static_cast<float *>(env->mScript->mSlots[bank]->getPtr())[offset], m, sizeof(rsc_Matrix));
176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
178326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
179fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void color(void *vp, float r, float g, float b, float a)
180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glColor4f(r, g, b, a);
183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
184326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
185fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void renderTriangleMesh(void *vp, RsTriangleMesh mesh)
186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_TriangleMeshRender(env->mContext, mesh);
189326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
190326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
191fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void renderTriangleMeshRange(void *vp, RsTriangleMesh mesh, uint32_t start, uint32_t count)
192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_TriangleMeshRenderRange(env->mContext, mesh, start, count);
195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
197fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void materialDiffuse(void *vp, float r, float g, float b, float a)
198326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    float v[] = {r, g, b, a};
201326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, v);
202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
204fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void materialSpecular(void *vp, float r, float g, float b, float a)
205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    float v[] = {r, g, b, a};
208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, v);
209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
211fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void lightPosition(void *vp, float x, float y, float z, float w)
212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    float v[] = {x, y, z, w};
215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glLightfv(GL_LIGHT0, GL_POSITION, v);
216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
217326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
218fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void materialShininess(void *vp, float s)
219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &s);
222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
223326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
224fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void uploadToTexture(void *vp, RsAllocation va, uint32_t baseMipLevel)
225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_AllocationUploadToTexture(env->mContext, va, baseMipLevel);
228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
230fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void enable(void *vp, uint32_t p)
231326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
232326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
233326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glEnable(p);
234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
235326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
236fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void disable(void *vp, uint32_t p)
237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glDisable(p);
240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
242fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" uint32_t scriptRand(void *vp, uint32_t max)
243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return (uint32_t)(((float)rand()) * max / RAND_MAX);
245326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
248fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void drawTriangleArray(void *vp, RsAllocation alloc, uint32_t count)
249326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
250326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const Allocation *a = (const Allocation *)alloc;
251326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const uint32_t *ptr = (const uint32_t *)a->getPtr();
252326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
253326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
254326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    env->mContext->setupCheck();
255326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
256326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glBindBuffer(GL_ARRAY_BUFFER, 0);
257326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
258326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glEnableClientState(GL_VERTEX_ARRAY);
260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glDisableClientState(GL_NORMAL_ARRAY);
261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glEnableClientState(GL_COLOR_ARRAY);
263326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
264326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glVertexPointer(2, GL_FIXED, 12, ptr + 1);
265326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
266326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
267326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
268326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glDrawArrays(GL_TRIANGLES, 0, count * 3);
269326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
270326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2716678e9b2568ad041429a2477177133fe4932159fJason Samsextern "C" void drawRect(void *vp, int32_t x1, int32_t x2, int32_t y1, int32_t y2)
2726678e9b2568ad041429a2477177133fe4932159fJason Sams{
2736678e9b2568ad041429a2477177133fe4932159fJason Sams    x1 = (x1 << 16);
2746678e9b2568ad041429a2477177133fe4932159fJason Sams    x2 = (x2 << 16);
2756678e9b2568ad041429a2477177133fe4932159fJason Sams    y1 = (y1 << 16);
2766678e9b2568ad041429a2477177133fe4932159fJason Sams    y2 = (y2 << 16);
2776678e9b2568ad041429a2477177133fe4932159fJason Sams
2786678e9b2568ad041429a2477177133fe4932159fJason Sams    int32_t vtx[] = {x1,y1, x1,y2, x2,y1, x2,y2};
2796678e9b2568ad041429a2477177133fe4932159fJason Sams    static const int32_t tex[] = {0,0, 0,0x10000, 0x10000,0, 0x10000,0x10000};
2806678e9b2568ad041429a2477177133fe4932159fJason Sams
2816678e9b2568ad041429a2477177133fe4932159fJason Sams
2826678e9b2568ad041429a2477177133fe4932159fJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
2836678e9b2568ad041429a2477177133fe4932159fJason Sams    env->mContext->setupCheck();
2846678e9b2568ad041429a2477177133fe4932159fJason Sams
2856678e9b2568ad041429a2477177133fe4932159fJason Sams    glBindBuffer(GL_ARRAY_BUFFER, 0);
2866678e9b2568ad041429a2477177133fe4932159fJason Sams    //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
2876678e9b2568ad041429a2477177133fe4932159fJason Sams
2886678e9b2568ad041429a2477177133fe4932159fJason Sams    glEnableClientState(GL_VERTEX_ARRAY);
2896678e9b2568ad041429a2477177133fe4932159fJason Sams    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
2906678e9b2568ad041429a2477177133fe4932159fJason Sams    glDisableClientState(GL_NORMAL_ARRAY);
2916678e9b2568ad041429a2477177133fe4932159fJason Sams    glDisableClientState(GL_COLOR_ARRAY);
2926678e9b2568ad041429a2477177133fe4932159fJason Sams
2936678e9b2568ad041429a2477177133fe4932159fJason Sams    glVertexPointer(2, GL_FIXED, 8, vtx);
2946678e9b2568ad041429a2477177133fe4932159fJason Sams    glTexCoordPointer(2, GL_FIXED, 8, tex);
2956678e9b2568ad041429a2477177133fe4932159fJason Sams    //glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
2966678e9b2568ad041429a2477177133fe4932159fJason Sams
2976678e9b2568ad041429a2477177133fe4932159fJason Sams    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
2986678e9b2568ad041429a2477177133fe4932159fJason Sams}
2996678e9b2568ad041429a2477177133fe4932159fJason Sams
300fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void pfBindTexture(void *vp, RsProgramFragment vpf, uint32_t slot, RsAllocation va)
301326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
302326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("pfBindTexture %p", vpf);
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
304fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevich    rsi_ProgramFragmentBindTexture(env->mContext,
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   static_cast<ProgramFragment *>(vpf),
306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   slot,
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   static_cast<Allocation *>(va));
308326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
309326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
310326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
311fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void pfBindSampler(void *vp, RsProgramFragment vpf, uint32_t slot, RsSampler vs)
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
314fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevich    rsi_ProgramFragmentBindSampler(env->mContext,
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   static_cast<ProgramFragment *>(vpf),
316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   slot,
317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   static_cast<Sampler *>(vs));
318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
321fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void contextBindProgramFragmentStore(void *vp, RsProgramFragmentStore pfs)
322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("contextBindProgramFragmentStore %p", pfs);
324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_ContextBindProgramFragmentStore(env->mContext, pfs);
326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
329fd19dc9fc3e76caf5c37645ea5131b2a2cf10ef7Jack Palevichextern "C" void contextBindProgramFragment(void *vp, RsProgramFragment pf)
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("contextBindProgramFragment %p", pf);
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_ContextBindProgramFragment(env->mContext, pf);
334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
335326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
338326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic rsc_FunctionTable scriptCPtrTable = {
339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadVp,
340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadF,
341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadI32,
342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadU32,
343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadEnvVec4,
344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadEnvMatrix,
345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeF,
347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeI32,
348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeU32,
349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeEnvVec4,
350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeEnvMatrix,
351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadIdentity,
353326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadFloat,
354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadMat,
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadRotate,
356326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadScale,
357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadTranslate,
358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadMultiply,
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixMultiply,
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixRotate,
361326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixScale,
362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixTranslate,
363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
364326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    color,
365326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    pfBindTexture,
367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    pfBindSampler,
368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    materialDiffuse,
370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    materialSpecular,
371326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    lightPosition,
372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    materialShininess,
373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uploadToTexture,
374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    enable,
375326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    disable,
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    scriptRand,
378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    contextBindProgramFragment,
3796678e9b2568ad041429a2477177133fe4932159fJason Sams    contextBindProgramFragmentStore,
3806678e9b2568ad041429a2477177133fe4932159fJason Sams
3816678e9b2568ad041429a2477177133fe4932159fJason Sams
3826678e9b2568ad041429a2477177133fe4932159fJason Sams    renderTriangleMesh,
3836678e9b2568ad041429a2477177133fe4932159fJason Sams    renderTriangleMeshRange,
3846678e9b2568ad041429a2477177133fe4932159fJason Sams
3856678e9b2568ad041429a2477177133fe4932159fJason Sams    drawTriangleArray,
3866678e9b2568ad041429a2477177133fe4932159fJason Sams    drawRect
3876678e9b2568ad041429a2477177133fe4932159fJason Sams
388326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams};
389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
390326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
391a44cb29164726cd9d812117819abdd7b60dfdd93Jason Samsbool ScriptC::run(Context *rsc, uint32_t launchID)
392326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
393326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Env e = {rsc, this};
394a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
395a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragmentStore.get()) {
396a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragmentStore(mEnviroment.mFragmentStore.get());
397a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
398a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    if (mEnviroment.mFragment.get()) {
399a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        rsc->setFragment(mEnviroment.mFragment.get());
400a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    }
4018ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    if (mEnviroment.mVertex.get()) {
4028ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams        rsc->setVertex(mEnviroment.mVertex.get());
4038ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    }
404a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
405efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    return mProgram.mScript(&e, &scriptCPtrTable, launchID) != 0;
406326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
407326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
408326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState()
409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
410326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
412326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
413326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState()
414326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
4151ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    if (mAccScript) {
4161ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich        accDeleteScript(mAccScript);
4171ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    }
418326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
419326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
420326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear()
421326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
422efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mProgram, 0, sizeof(mProgram));
423efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
424326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mConstantBufferTypes.clear();
425efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
426efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    memset(&mEnviroment, 0, sizeof(mEnviroment));
427efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[0] = 0;
428efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[1] = 0;
429efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[2] = 0;
430efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearColor[3] = 1;
431efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearDepth = 1;
432efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mClearStencil = 0;
433efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    mEnviroment.mIsRoot = false;
434efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
4351ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    mAccScript = NULL;
436efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams
4371f52633fefd1862451e6a30209d590680d02beecJason Sams}
4381f52633fefd1862451e6a30209d590680d02beecJason Sams
439a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
440a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsvoid ScriptCState::runCompiler(Context *rsc)
4411f52633fefd1862451e6a30209d590680d02beecJason Sams{
4421f52633fefd1862451e6a30209d590680d02beecJason Sams    mAccScript = accCreateScript();
443a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    String8 tmp;
444a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
445a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    rsc->appendNameDefines(&tmp);
4461f52633fefd1862451e6a30209d590680d02beecJason Sams
447a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    const char* scriptSource[] = {tmp.string(), mProgram.mScriptText};
448a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    int scriptLength[] = {tmp.length(), mProgram.mScriptTextLength} ;
449a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams    accScriptSource(mAccScript, sizeof(scriptLength) / sizeof(int), scriptSource, scriptLength);
4501f52633fefd1862451e6a30209d590680d02beecJason Sams    accCompileScript(mAccScript);
451efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    accGetScriptLabel(mAccScript, "main", (ACCvoid**) &mProgram.mScript);
4521030893d9b99b72468034da13df025bda479bb97Jason Sams    rsAssert(mProgram.mScript);
4531030893d9b99b72468034da13df025bda479bb97Jason Sams
4548ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
4558ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
4568ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams    mEnviroment.mFragmentStore.set(rsc->getDefaultProgramFragmentStore());
457a4a54e42fc710a62b47cbcb9d64c34a190429d9eJason Sams
4581030893d9b99b72468034da13df025bda479bb97Jason Sams    if (mProgram.mScript) {
4591030893d9b99b72468034da13df025bda479bb97Jason Sams        const static int pragmaMax = 16;
4601030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCsizei pragmaCount;
4611030893d9b99b72468034da13df025bda479bb97Jason Sams        ACCchar * str[pragmaMax];
4621030893d9b99b72468034da13df025bda479bb97Jason Sams        accGetPragmas(mAccScript, &pragmaCount, pragmaMax, &str[0]);
4631030893d9b99b72468034da13df025bda479bb97Jason Sams
4641030893d9b99b72468034da13df025bda479bb97Jason Sams        for (int ct=0; ct < pragmaCount; ct+=2) {
4651030893d9b99b72468034da13df025bda479bb97Jason Sams            LOGE("pragma %i %s %s", ct, str[ct], str[ct+1]);
4661030893d9b99b72468034da13df025bda479bb97Jason Sams
4671030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "version")) {
4681030893d9b99b72468034da13df025bda479bb97Jason Sams                continue;
4691030893d9b99b72468034da13df025bda479bb97Jason Sams
4701030893d9b99b72468034da13df025bda479bb97Jason Sams            }
4711030893d9b99b72468034da13df025bda479bb97Jason Sams
4721030893d9b99b72468034da13df025bda479bb97Jason Sams
4731030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateVertex")) {
4748ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
4758ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
4768ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
4778ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
4788ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mVertex.clear();
4798ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
4808ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
4818ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramVertex * pv = (ProgramVertex *)rsc->lookupName(str[ct+1]);
4828ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (pv != NULL) {
4838ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mVertex.set(pv);
4848ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
4858ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
4861030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateVertex", str[ct+1]);
4871030893d9b99b72468034da13df025bda479bb97Jason Sams            }
4881030893d9b99b72468034da13df025bda479bb97Jason Sams
4891030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateRaster")) {
4901030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateRaster", str[ct+1]);
4911030893d9b99b72468034da13df025bda479bb97Jason Sams            }
4921030893d9b99b72468034da13df025bda479bb97Jason Sams
4931030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragment")) {
4948ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
4958ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
4968ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
4978ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
4988ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mFragment.clear();
4998ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
5008ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
5018ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                ProgramFragment * pf = (ProgramFragment *)rsc->lookupName(str[ct+1]);
502a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pf != NULL) {
503a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    mEnviroment.mFragment.set(pf);
5041030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
5051030893d9b99b72468034da13df025bda479bb97Jason Sams                }
5061030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragment", str[ct+1]);
5071030893d9b99b72468034da13df025bda479bb97Jason Sams            }
5081030893d9b99b72468034da13df025bda479bb97Jason Sams
5091030893d9b99b72468034da13df025bda479bb97Jason Sams            if (!strcmp(str[ct], "stateFragmentStore")) {
5108ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "default")) {
5118ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
5128ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
5138ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                if (!strcmp(str[ct+1], "parent")) {
5148ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    mEnviroment.mFragmentStore.clear();
5158ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                    continue;
5168ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams                }
517a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                ProgramFragmentStore * pfs =
518a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    (ProgramFragmentStore *)rsc->lookupName(str[ct+1]);
519a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                if (pfs != NULL) {
520a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams                    mEnviroment.mFragmentStore.set(pfs);
5211030893d9b99b72468034da13df025bda479bb97Jason Sams                    continue;
5221030893d9b99b72468034da13df025bda479bb97Jason Sams                }
5231030893d9b99b72468034da13df025bda479bb97Jason Sams                LOGE("Unreconized value %s passed to stateFragmentStore", str[ct+1]);
5241030893d9b99b72468034da13df025bda479bb97Jason Sams            }
5251030893d9b99b72468034da13df025bda479bb97Jason Sams
5261030893d9b99b72468034da13df025bda479bb97Jason Sams        }
5271030893d9b99b72468034da13df025bda479bb97Jason Sams
5281030893d9b99b72468034da13df025bda479bb97Jason Sams
5291030893d9b99b72468034da13df025bda479bb97Jason Sams    } else {
5301030893d9b99b72468034da13df025bda479bb97Jason Sams        // Deal with an error.
5311030893d9b99b72468034da13df025bda479bb97Jason Sams    }
5321030893d9b99b72468034da13df025bda479bb97Jason Sams
533326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
534326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
535326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
536326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
537326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
538326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc)
539326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
540326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
541326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->clear();
542326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
543326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
544326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
545326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
546326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
547efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearColor[0] = r;
548efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearColor[1] = g;
549efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearColor[2] = b;
550efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearColor[3] = a;
551326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
552326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
553326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetClearDepth(Context * rsc, float v)
554326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
555326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
556efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearDepth = v;
557326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
558326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
559326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
560326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
561326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
562efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mClearStencil = v;
563326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
564326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
565326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCAddType(Context * rsc, RsType vt)
566326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
567326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
568326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
569326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
570326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
571efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp)
572326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
573326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
574efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mProgram.mScript = reinterpret_cast<rsc_RunScript>(vp);
575326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
576326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
577326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
578326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
579326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
580efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mEnviroment.mIsRoot = isRoot;
581326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
582326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
5831f52633fefd1862451e6a30209d590680d02beecJason Samsvoid rsi_ScriptCSetText(Context *rsc, const char *text, uint32_t len)
5841f52633fefd1862451e6a30209d590680d02beecJason Sams{
5851f52633fefd1862451e6a30209d590680d02beecJason Sams    ScriptCState *ss = &rsc->mScriptC;
586efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mProgram.mScriptText = text;
587efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->mProgram.mScriptTextLength = len;
5881f52633fefd1862451e6a30209d590680d02beecJason Sams}
5891f52633fefd1862451e6a30209d590680d02beecJason Sams
5901f52633fefd1862451e6a30209d590680d02beecJason Sams
591326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc)
592326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
593326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
594326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
595a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams    ss->runCompiler(rsc);
5961f52633fefd1862451e6a30209d590680d02beecJason Sams
597326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC *s = new ScriptC();
598efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    s->incRef();
5991ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    s->mAccScript = ss->mAccScript;
6001ef8b80bc49f415b93912fe7335f852953bde4a4Jack Palevich    ss->mAccScript = NULL;
601efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    s->mEnviroment = ss->mEnviroment;
602efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    s->mProgram = ss->mProgram;
603efb8de1ef851c9c2a042ad06f64e33bb8b366041Jason Sams    ss->clear();
6041030893d9b99b72468034da13df025bda479bb97Jason Sams
605326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
606326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
607326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
608326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
609326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
610326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
611326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
612