10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/* 20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009-2012 The Android Open Source Project 30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License. 60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at 70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software 110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and 140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License. 150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */ 160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsContext.h" 180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsScriptC.h" 190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsMatrix4x4.h" 200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsMatrix3x3.h" 210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsMatrix2x2.h" 220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsgApiStructs.h" 230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "utils/Timers.h" 250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <time.h> 270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android; 290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesusing namespace android::renderscript; 300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android { 330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript { 340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines////////////////////////////////////////////////////////////////////////////// 370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// Math routines 380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines////////////////////////////////////////////////////////////////////////////// 390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#if 0 410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_sinf_fast(float x) { 420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const float A = 1.0f / (2.0f * M_PI); 430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const float B = -16.0f; 440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const float C = 8.0f; 450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // scale angle for easy argument reduction 470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines x *= A; 480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (fabsf(x) >= 0.5f) { 500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // argument reduction 510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines x = x - ceilf(x + 0.5f) + 1.0f; 520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const float y = B * x * fabsf(x) + C * x; 550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return 0.2215f * (y * fabsf(y) - y) + y; 560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesstatic float SC_cosf_fast(float x) { 590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines x += float(M_PI / 2); 600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const float A = 1.0f / (2.0f * M_PI); 620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const float B = -16.0f; 630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const float C = 8.0f; 640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // scale angle for easy argument reduction 660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines x *= A; 670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (fabsf(x) >= 0.5f) { 690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // argument reduction 700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines x = x - ceilf(x + 0.5f) + 1.0f; 710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const float y = B * x * fabsf(x) + C * x; 740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return 0.2215f * (y * fabsf(y) - y) + y; 750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif 770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines////////////////////////////////////////////////////////////////////////////// 790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// Time routines 800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines////////////////////////////////////////////////////////////////////////////// 810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinestime_t rsrTime(Context *rsc, Script *sc, time_t *timer) { 830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return time(timer); 840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinestm* rsrLocalTime(Context *rsc, Script *sc, tm *local, time_t *timer) { 870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (!local) { 880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return NULL; 890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // The native localtime function is not thread-safe, so we 920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // have to apply locking for proper behavior in RenderScript. 930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines pthread_mutex_lock(&rsc->gLibMutex); 940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines tm *tmp = localtime(timer); 950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines memcpy(local, tmp, sizeof(*tmp)); 960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines pthread_mutex_unlock(&rsc->gLibMutex); 970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return local; 980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesint64_t rsrUptimeMillis(Context *rsc, Script *sc) { 1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); 1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesint64_t rsrUptimeNanos(Context *rsc, Script *sc) { 1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return systemTime(SYSTEM_TIME_MONOTONIC); 1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesfloat rsrGetDt(Context *rsc, Script *sc) { 1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines int64_t l = sc->mEnviroment.mLastDtTime; 1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines sc->mEnviroment.mLastDtTime = systemTime(SYSTEM_TIME_MONOTONIC); 1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return ((float)(sc->mEnviroment.mLastDtTime - l)) / 1.0e9; 1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines////////////////////////////////////////////////////////////////////////////// 1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// 1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines////////////////////////////////////////////////////////////////////////////// 1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid rsrSetObject(const Context *rsc, const Script *sc, ObjectBase **dst, ObjectBase * src) { 1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines //ALOGE("rsiSetObject %p,%p %p", vdst, *vdst, vsrc); 1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (src) { 1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines CHECK_OBJ(src); 1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines src->incSysRef(); 1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (dst[0]) { 1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines CHECK_OBJ(dst[0]); 1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines dst[0]->decSysRef(); 1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *dst = src; 1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid rsrClearObject(const Context *rsc, const Script *sc, ObjectBase **dst) { 1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines //ALOGE("rsiClearObject %p,%p", vdst, *vdst); 1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (dst[0]) { 1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines CHECK_OBJ(dst[0]); 1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines dst[0]->decSysRef(); 1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines *dst = NULL; 1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesbool rsrIsObject(const Context *rsc, const Script *sc, const ObjectBase *src) { 1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return src != NULL; 1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesuint32_t rsrToClient(Context *rsc, Script *sc, int cmdID, void *data, int len) { 1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines //ALOGE("SC_toClient %i %i %i", cmdID, len); 1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, false); 1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesuint32_t rsrToClientBlocking(Context *rsc, Script *sc, int cmdID, void *data, int len) { 1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines //ALOGE("SC_toClientBlocking %i %i", cmdID, len); 1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, true); 1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid rsrForEach(Context *rsc, Script *sc, 1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Script *target, 1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Allocation *in, Allocation *out, 1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const void *usr, uint32_t usrBytes, 1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const RsScriptCall *call) { 1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines target->runForEach(rsc, /* root slot */ 0, in, out, usr, usrBytes, call); 1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid rsrAllocationSyncAll(Context *rsc, Script *sc, Allocation *a, RsAllocationUsageType usage) { 1650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines a->syncAll(rsc, usage); 1660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid rsrAllocationCopy1DRange(Context *rsc, Allocation *dstAlloc, 1690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t dstOff, 1700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t dstMip, 1710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t count, 1720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Allocation *srcAlloc, 1730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t srcOff, uint32_t srcMip) { 1740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines rsi_AllocationCopy2DRange(rsc, dstAlloc, dstOff, 0, 1750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines dstMip, 0, count, 1, 1760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines srcAlloc, srcOff, 0, srcMip, 0); 1770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesvoid rsrAllocationCopy2DRange(Context *rsc, Allocation *dstAlloc, 1800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t dstXoff, uint32_t dstYoff, 1810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t dstMip, uint32_t dstFace, 1820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t width, uint32_t height, 1830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Allocation *srcAlloc, 1840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t srcXoff, uint32_t srcYoff, 1850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines uint32_t srcMip, uint32_t srcFace) { 1860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines rsi_AllocationCopy2DRange(rsc, dstAlloc, dstXoff, dstYoff, 1870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines dstMip, dstFace, width, height, 1880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines srcAlloc, srcXoff, srcYoff, srcMip, srcFace); 1890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 195