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