rsScriptC.cpp revision 326e0ddf89e8df2837752fbfd7a014814b32082c
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
21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
25326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::ScriptC()
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mScript = NULL;
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
30326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptC::~ScriptC()
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixLoadIdentity(void *con, rsc_Matrix *mat)
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadIdentity();
38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
40326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixLoadFloat(void *con, rsc_Matrix *mat, const float *f)
41326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
42326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
43326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->load(f);
44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixLoadMat(void *con, rsc_Matrix *mat, const rsc_Matrix *newmat)
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->load(reinterpret_cast<const Matrix *>(newmat));
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixLoadRotate(void *con, rsc_Matrix *mat, float rot, float x, float y, float z)
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadRotate(rot, x, y, z);
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixLoadScale(void *con, rsc_Matrix *mat, float x, float y, float z)
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadScale(x, y, z);
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
64326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixLoadTranslate(void *con, rsc_Matrix *mat, float x, float y, float z)
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadTranslate(x, y, z);
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixLoadMultiply(void *con, rsc_Matrix *mat, const rsc_Matrix *lhs, const rsc_Matrix *rhs)
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->loadMultiply(reinterpret_cast<const Matrix *>(lhs),
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                    reinterpret_cast<const Matrix *>(rhs));
75326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
76326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixMultiply(void *con, rsc_Matrix *mat, const rsc_Matrix *rhs)
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->multiply(reinterpret_cast<const Matrix *>(rhs));
81326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
82326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
83326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixRotate(void *con, rsc_Matrix *mat, float rot, float x, float y, float z)
84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->rotate(rot, x, y, z);
87326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
88326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixScale(void *con, rsc_Matrix *mat, float x, float y, float z)
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->scale(x, y, z);
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void matrixTranslate(void *con, rsc_Matrix *mat, float x, float y, float z)
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Matrix *m = reinterpret_cast<Matrix *>(mat);
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    m->translate(x, y, z);
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic const void * loadVp(void *vp, uint32_t bank, uint32_t offset)
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return &static_cast<const uint8_t *>(env->mScript->mSlots[bank]->getPtr())[offset];
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
108326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic float loadF(void *vp, uint32_t bank, uint32_t offset)
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("bank %i, offset %i", bank, offset);
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("%p", env->mScript->mSlots[bank]->getPtr());
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return static_cast<const float *>(env->mScript->mSlots[bank]->getPtr())[offset];
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic int32_t loadI32(void *vp, uint32_t bank, uint32_t offset)
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
118326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
119326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return static_cast<const int32_t *>(env->mScript->mSlots[bank]->getPtr())[offset];
120326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic uint32_t loadU32(void *vp, uint32_t bank, uint32_t offset)
123326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
124326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
125326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return static_cast<const uint32_t *>(env->mScript->mSlots[bank]->getPtr())[offset];
126326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
127326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
128326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void loadEnvVec4(void *vp, uint32_t bank, uint32_t offset, rsc_Vector4 *v)
129326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
130326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
131326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    memcpy(v, &static_cast<const float *>(env->mScript->mSlots[bank]->getPtr())[offset], sizeof(rsc_Vector4));
132326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
133326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
134326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void loadEnvMatrix(void *vp, uint32_t bank, uint32_t offset, rsc_Matrix *m)
135326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
136326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
137326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    memcpy(m, &static_cast<const float *>(env->mScript->mSlots[bank]->getPtr())[offset], sizeof(rsc_Matrix));
138326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
139326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
140326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
141326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void storeF(void *vp, uint32_t bank, uint32_t offset, float v)
142326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
143326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
144326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    static_cast<float *>(env->mScript->mSlots[bank]->getPtr())[offset] = v;
145326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
146326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
147326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void storeI32(void *vp, uint32_t bank, uint32_t offset, int32_t v)
148326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
149326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
150326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    static_cast<int32_t *>(env->mScript->mSlots[bank]->getPtr())[offset] = v;
151326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
152326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
153326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void storeU32(void *vp, uint32_t bank, uint32_t offset, uint32_t v)
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    static_cast<uint32_t *>(env->mScript->mSlots[bank]->getPtr())[offset] = v;
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void storeEnvVec4(void *vp, uint32_t bank, uint32_t offset, const rsc_Vector4 *v)
160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    memcpy(&static_cast<float *>(env->mScript->mSlots[bank]->getPtr())[offset], v, sizeof(rsc_Vector4));
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void storeEnvMatrix(void *vp, uint32_t bank, uint32_t offset, const rsc_Matrix *m)
166326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
167326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    memcpy(&static_cast<float *>(env->mScript->mSlots[bank]->getPtr())[offset], m, sizeof(rsc_Matrix));
169326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
172326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void color(void *vp, float r, float g, float b, float a)
173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
174326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
175326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glColor4f(r, g, b, a);
176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
178326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void renderTriangleMesh(void *vp, RsTriangleMesh mesh)
179326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
180326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
181326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_TriangleMeshRender(env->mContext, mesh);
182326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
184326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void renderTriangleMeshRange(void *vp, RsTriangleMesh mesh, uint32_t start, uint32_t count)
185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
186326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
187326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_TriangleMeshRenderRange(env->mContext, mesh, start, count);
188326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
189326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
190326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void materialDiffuse(void *vp, float r, float g, float b, float a)
191326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
193326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    float v[] = {r, g, b, a};
194326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, v);
195326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
197326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void materialSpecular(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_SPECULAR, v);
202326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
203326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
204326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void lightPosition(void *vp, float x, float y, float z, float w)
205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    float v[] = {x, y, z, w};
208326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glLightfv(GL_LIGHT0, GL_POSITION, v);
209326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
211326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void materialShininess(void *vp, float s)
212326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
213326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
214326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &s);
215326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
216326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
217326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void uploadToTexture(void *vp, RsAllocation va, uint32_t baseMipLevel)
218326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
220326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_AllocationUploadToTexture(env->mContext, va, baseMipLevel);
221326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
222326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
223326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void enable(void *vp, uint32_t p)
224326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
225326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
226326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glEnable(p);
227326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
228326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
229326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void disable(void *vp, uint32_t p)
230326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
231326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
232326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glDisable(p);
233326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
234326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
235326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic uint32_t scriptRand(void *vp, uint32_t max)
236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return (uint32_t)(((float)rand()) * max / RAND_MAX);
238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// Assumes (GL_FIXED) x,y,z (GL_UNSIGNED_BYTE)r,g,b,a
241326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void drawTriangleArray(void *vp, RsAllocation alloc, uint32_t count)
242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const Allocation *a = (const Allocation *)alloc;
244326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const uint32_t *ptr = (const uint32_t *)a->getPtr();
245326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    env->mContext->setupCheck();
248326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
249326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glBindBuffer(GL_ARRAY_BUFFER, 0);
250326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tm->mBufferObjects[1]);
251326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
252326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glEnableClientState(GL_VERTEX_ARRAY);
253326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glDisableClientState(GL_NORMAL_ARRAY);
254326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
255326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glEnableClientState(GL_COLOR_ARRAY);
256326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
257326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glVertexPointer(2, GL_FIXED, 12, ptr + 1);
258326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //glTexCoordPointer(2, GL_FIXED, 24, ptr + 1);
259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glColorPointer(4, GL_UNSIGNED_BYTE, 12, ptr);
260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    glDrawArrays(GL_TRIANGLES, 0, count * 3);
262326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
263326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
264326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void pfBindTexture(void *vp, RsProgramFragment vpf, uint32_t slot, RsAllocation va)
265326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
266326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("pfBindTexture %p", vpf);
267326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
268326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_ProgramFragmentBindTexture(env->mContext,
269326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   static_cast<ProgramFragment *>(vpf),
270326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   slot,
271326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   static_cast<Allocation *>(va));
272326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
273326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
275326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void pfBindSampler(void *vp, RsProgramFragment vpf, uint32_t slot, RsSampler vs)
276326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_ProgramFragmentBindSampler(env->mContext,
279326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   static_cast<ProgramFragment *>(vpf),
280326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   slot,
281326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams                                   static_cast<Sampler *>(vs));
282326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
283326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
285326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void contextBindProgramFragmentStore(void *vp, RsProgramFragmentStore pfs)
286326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
287326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("contextBindProgramFragmentStore %p", pfs);
288326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
289326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_ContextBindProgramFragmentStore(env->mContext, pfs);
290326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
291326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
292326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
293326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic void contextBindProgramFragment(void *vp, RsProgramFragment pf)
294326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
295326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    //LOGE("contextBindProgramFragment %p", pf);
296326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC::Env * env = static_cast<ScriptC::Env *>(vp);
297326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsi_ContextBindProgramFragment(env->mContext, pf);
298326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
299326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
300326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
301326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
302326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsstatic rsc_FunctionTable scriptCPtrTable = {
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadVp,
304326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadF,
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadI32,
306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadU32,
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadEnvVec4,
308326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    loadEnvMatrix,
309326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
310326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeF,
311326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeI32,
312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeU32,
313326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeEnvVec4,
314326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    storeEnvMatrix,
315326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadIdentity,
317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadFloat,
318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadMat,
319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadRotate,
320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadScale,
321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadTranslate,
322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixLoadMultiply,
323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixMultiply,
324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixRotate,
325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixScale,
326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    matrixTranslate,
327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    color,
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    renderTriangleMesh,
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    renderTriangleMeshRange,
331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    pfBindTexture,
333326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    pfBindSampler,
334326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
335326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    materialDiffuse,
336326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    materialSpecular,
337326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    lightPosition,
338326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    materialShininess,
339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uploadToTexture,
340326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    enable,
341326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    disable,
342326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
343326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    scriptRand,
344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    drawTriangleArray,
345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    contextBindProgramFragment,
346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    contextBindProgramFragmentStore
347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams};
348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
350326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptC::run(Context *rsc, uint32_t launchID)
351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Env e = {rsc, this};
353326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mScript(&e, &scriptCPtrTable, launchID);
354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
356326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::ScriptCState()
357326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    clear();
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
361326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScriptCState::~ScriptCState()
362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
363326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
364326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
365326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid ScriptCState::clear()
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mConstantBufferTypes.clear();
368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mClearColor[0] = 0;
369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mClearColor[1] = 0;
370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mClearColor[2] = 0;
371326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mClearColor[3] = 1;
372326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mClearDepth = 1;
373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mClearStencil = 0;
374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mScript = NULL;
375326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mIsRoot = false;
376326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mIsOrtho = true;
377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
379326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
380326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
381326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
382326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCBegin(Context * rsc)
383326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
384326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
385326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->clear();
386326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
387326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
388326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetClearColor(Context * rsc, float r, float g, float b, float a)
389326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
390326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
391326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mClearColor[0] = r;
392326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mClearColor[1] = g;
393326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mClearColor[2] = b;
394326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mClearColor[3] = a;
395326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
396326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
397326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetClearDepth(Context * rsc, float v)
398326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
399326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
400326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mClearDepth = v;
401326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
402326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
403326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetClearStencil(Context * rsc, uint32_t v)
404326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
405326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
406326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mClearStencil = v;
407326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
408326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
409326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCAddType(Context * rsc, RsType vt)
410326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
411326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
412326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mConstantBufferTypes.add(static_cast<const Type *>(vt));
413326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
414326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
415326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetScript(Context * rsc, void *vp)
416326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
417326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
418326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mScript = reinterpret_cast<rsc_RunScript>(vp);
419326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
420326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
421326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetRoot(Context * rsc, bool isRoot)
422326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
423326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
424326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mIsRoot = isRoot;
425326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
426326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
427326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptCSetOrtho(Context * rsc, bool isOrtho)
428326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
429326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
430326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ss->mIsOrtho = isOrtho;
431326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
432326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
433326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsRsScript rsi_ScriptCCreate(Context * rsc)
434326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{
435326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptCState *ss = &rsc->mScriptC;
436326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
437326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ScriptC *s = new ScriptC();
438326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    s->mScript = ss->mScript;
439326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    s->mClearColor[0] = ss->mClearColor[0];
440326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    s->mClearColor[1] = ss->mClearColor[1];
441326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    s->mClearColor[2] = ss->mClearColor[2];
442326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    s->mClearColor[3] = ss->mClearColor[3];
443326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    s->mClearDepth = ss->mClearDepth;
444326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    s->mClearStencil = ss->mClearStencil;
445326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    s->mIsRoot = ss->mIsRoot;
446326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    s->mIsOrtho = ss->mIsOrtho;
447326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
448326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return s;
449326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
450326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
451326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
452326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
453326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
454326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
455