rsScript.cpp revision be36bf3a76481737a7fa606a04144ceef80eb4f2
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 19326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 20326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 22e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsScript::Script(Context *rsc) : ObjectBase(rsc) 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 24f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 25f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 26928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams memset(&mEnviroment, 0, sizeof(mEnviroment)); 27928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams mEnviroment.mClearColor[0] = 0; 28928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams mEnviroment.mClearColor[1] = 0; 29928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams mEnviroment.mClearColor[2] = 0; 30928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams mEnviroment.mClearColor[3] = 1; 31928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams mEnviroment.mClearDepth = 1; 328c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams mEnviroment.mClearStencil = 0; 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 35326e0ddf89e8df2837752fbfd7a014814b32082cJason SamsScript::~Script() 36326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 37326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 38326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 39be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid Script::setVar(uint32_t slot, const void *val, uint32_t len) 40be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{ 41be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams int32_t *destPtr = ((int32_t **)mEnviroment.mFieldAddress)[slot]; 42be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if (destPtr) { 43be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("setVar f1 %f", ((const float *)destPtr)[0]); 44be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("setVar %p %i", destPtr, len); 45be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams memcpy(destPtr, val, len); 46be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("setVar f2 %f", ((const float *)destPtr)[0]); 47be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams } else { 48be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("Calling setVar on slot = %i which is null", slot); 49be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams } 50be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams} 51be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 52326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 53326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 56326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsvoid rsi_ScriptBindAllocation(Context * rsc, RsScript vs, RsAllocation va, uint32_t slot) 57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams{ 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Script *s = static_cast<Script *>(vs); 59be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams Allocation *a = static_cast<Allocation *>(va); 60be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mSlots[slot].set(a); 61be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("rsi_ScriptBindAllocation %i %p %p", slot, a, a->getPtr()); 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 64d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsvoid rsi_ScriptSetClearColor(Context * rsc, RsScript vs, float r, float g, float b, float a) 65d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams{ 66d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams Script *s = static_cast<Script *>(vs); 67d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams s->mEnviroment.mClearColor[0] = r; 68d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams s->mEnviroment.mClearColor[1] = g; 69d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams s->mEnviroment.mClearColor[2] = b; 70d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams s->mEnviroment.mClearColor[3] = a; 71d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams} 72d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams 73d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsvoid rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, uint32_t length) 74d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams{ 75d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams Script *s = static_cast<Script *>(vs); 76d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams s->mEnviroment.mTimeZone = timeZone; 77d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams} 78d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams 79d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsvoid rsi_ScriptSetClearDepth(Context * rsc, RsScript vs, float v) 80d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams{ 81d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams Script *s = static_cast<Script *>(vs); 82d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams s->mEnviroment.mClearDepth = v; 83d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams} 84d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams 85d34b725ac1752f5a234c7643a0b65245591ea1ccJason Samsvoid rsi_ScriptSetClearStencil(Context * rsc, RsScript vs, uint32_t v) 86d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams{ 87d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams Script *s = static_cast<Script *>(vs); 88d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams s->mEnviroment.mClearStencil = v; 89d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams} 90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 9190b36a88cf0cc549b296ac15a249ea7786c6de9eJason Samsvoid rsi_ScriptSetType(Context * rsc, RsType vt, uint32_t slot, bool writable, const char *name) 92fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams{ 93fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams ScriptCState *ss = &rsc->mScriptC; 94fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams const Type *t = static_cast<const Type *>(vt); 95fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams ss->mConstantBufferTypes[slot].set(t); 9690b36a88cf0cc549b296ac15a249ea7786c6de9eJason Sams ss->mSlotWritable[slot] = writable; 97be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("rsi_ScriptSetType"); 98fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams} 99fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams 1008c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid rsi_ScriptSetInvoke(Context *rsc, const char *name, uint32_t slot) 1018c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams{ 102be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("rsi_ScriptSetInvoke"); 1038c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams} 1048c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams 105be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 1068c6bc6930d4996b897de8e5113da4a4efae2310cJason Samsvoid rsi_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot) 1078c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams{ 108be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("rsi_ScriptInvoke %i", slot); 1098c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams Script *s = static_cast<Script *>(vs); 110be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if ((slot >= s->mEnviroment.mInvokeFunctionCount) || 111be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams (s->mEnviroment.mInvokeFunctions[slot] == NULL)) { 112a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script"); 113a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams return; 114a2cf755a28a1e7ffff2955df656d714f40e4d715Jason Sams } 115ada7f272890d8791bc518c95989ad7d13050834dJason Sams s->setupScript(); 116be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("invoking %i %p", slot, s->mEnviroment.mInvokeFunctions[slot]); 117be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions[slot](); 118be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("invoke finished"); 1198c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams} 1208c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams 1218c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams 122be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptInvokeData(Context *rsc, RsScript vs, uint32_t slot, void *data) 123be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{ 124be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("rsi_ScriptInvoke %i", slot); 125be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams Script *s = static_cast<Script *>(vs); 126be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if ((slot >= s->mEnviroment.mInvokeFunctionCount) || 127be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams (s->mEnviroment.mInvokeFunctions[slot] == NULL)) { 128be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script"); 129be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams return; 130be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams } 131be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->setupScript(); 132be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("invoking %i %p", slot, s->mEnviroment.mInvokeFunctions[slot]); 133be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions[slot](); 134be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("invoke finished"); 135be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams} 136be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 137be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptInvokeV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len) 138be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{ 139be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams //LOGE("rsi_ScriptInvoke %i", slot); 140be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams Script *s = static_cast<Script *>(vs); 141be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams if ((slot >= s->mEnviroment.mInvokeFunctionCount) || 142be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams (s->mEnviroment.mInvokeFunctions[slot] == NULL)) { 143be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script"); 144be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams return; 145be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams } 146be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->setupScript(); 147be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 148be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("rsi_ScriptInvokeV, len=%i", len); 149be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams const uint32_t * dPtr = (const uint32_t *)data; 150be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams switch(len) { 151be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams case 0: 152be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions[slot](); 153be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams break; 154be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams case 4: 155be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams ((void (*)(uint32_t)) 156be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions[slot])(dPtr[0]); 157be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams break; 158be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams case 8: 159be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams ((void (*)(uint32_t, uint32_t)) 160be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1]); 161be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams break; 162be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams case 12: 163be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams ((void (*)(uint32_t, uint32_t, uint32_t)) 164be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2]); 165be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams break; 166be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams case 16: 167be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t)) 168be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3]); 169be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams break; 170be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams case 20: 171be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams ((void (*)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t)) 172be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->mEnviroment.mInvokeFunctions[slot])(dPtr[0], dPtr[1], dPtr[2], dPtr[3], dPtr[4]); 173be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams break; 174be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 175be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 176be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams } 177be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 178be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams} 179be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 180fa51719e6c1bd17b3f347477b4827face9ab647eJason Samsvoid rsi_ScriptSetRoot(Context * rsc, bool isRoot) 181fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams{ 182be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams LOGE("rsi_ScriptSetRoot"); 183be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams} 184be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 185be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value) 186be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{ 187be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams Script *s = static_cast<Script *>(vs); 188be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->setVar(slot, &value, sizeof(value)); 189be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams} 190be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 191be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptSetVarF(Context *rsc, RsScript vs, uint32_t slot, float value) 192be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{ 193be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams Script *s = static_cast<Script *>(vs); 194be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->setVar(slot, &value, sizeof(value)); 195be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams} 196be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams 197be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Samsvoid rsi_ScriptSetVarV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len) 198be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams{ 199be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams const float *fp = (const float *)data; 200be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams Script *s = static_cast<Script *>(vs); 201be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams s->setVar(slot, data, len); 202fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams} 203fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams 204fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 207326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 208