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