1e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams/* 24419977d78018a9933c7f455fe001f644f2d638bStephen Hines * Copyright (C) 2009-2012 The Android Open Source Project 3e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * 4e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * you may not use this file except in compliance with the License. 6e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * You may obtain a copy of the License at 7e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * 8e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * 10e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * Unless required by applicable law or agreed to in writing, software 11e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * See the License for the specific language governing permissions and 14e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams * limitations under the License. 15e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams */ 16e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams 17e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams#include "rsContext.h" 18e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams#include "rsScriptC.h" 1987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix4x4.h" 2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix3x3.h" 2187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix2x2.h" 224edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsgApiStructs.h" 23e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams 249c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato#include "utils/Timers.h" 25e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams 2698e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy#include <time.h> 2798e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy 28e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsusing namespace android; 29e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsusing namespace android::renderscript; 30e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams 3187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 3287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace android { 3387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace renderscript { 34e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams 35a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams 36e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams////////////////////////////////////////////////////////////////////////////// 37e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams// Math routines 38e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams////////////////////////////////////////////////////////////////////////////// 39e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams 40196c1112ec95a99b75bf9335f0a4e007150e6091Stephen Hines#if 0 41afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_sinf_fast(float x) { 422275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy const float A = 1.0f / (2.0f * M_PI); 432275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy const float B = -16.0f; 442275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy const float C = 8.0f; 45a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams 462275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy // scale angle for easy argument reduction 472275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy x *= A; 48a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams 492275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy if (fabsf(x) >= 0.5f) { 502275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy // argument reduction 512275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy x = x - ceilf(x + 0.5f) + 1.0f; 522275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy } 53a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams 542275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy const float y = B * x * fabsf(x) + C * x; 552275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy return 0.2215f * (y * fabsf(y) - y) + y; 562275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy} 572275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy 58afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_cosf_fast(float x) { 592275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy x += float(M_PI / 2); 602275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy 612275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy const float A = 1.0f / (2.0f * M_PI); 622275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy const float B = -16.0f; 632275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy const float C = 8.0f; 64a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams 652275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy // scale angle for easy argument reduction 662275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy x *= A; 67a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams 682275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy if (fabsf(x) >= 0.5f) { 692275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy // argument reduction 702275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy x = x - ceilf(x + 0.5f) + 1.0f; 712275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy } 72a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams 732275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy const float y = B * x * fabsf(x) + C * x; 742275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy return 0.2215f * (y * fabsf(y) - y) + y; 752275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy} 76196c1112ec95a99b75bf9335f0a4e007150e6091Stephen Hines#endif 772275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy 7898e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy////////////////////////////////////////////////////////////////////////////// 7998e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy// Time routines 8098e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy////////////////////////////////////////////////////////////////////////////// 8198e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy 8287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samstime_t rsrTime(Context *rsc, Script *sc, time_t *timer) { 83ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines return time(timer); 8439dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy} 8539dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy 8687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samstm* rsrLocalTime(Context *rsc, Script *sc, tm *local, time_t *timer) { 87ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines if (!local) { 88ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines return NULL; 89ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines } 90e5ffb879ae535a899a486285a23bea05e912480fJason Sams 91ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines // The native localtime function is not thread-safe, so we 92ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines // have to apply locking for proper behavior in RenderScript. 93ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines pthread_mutex_lock(&rsc->gLibMutex); 94ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines tm *tmp = localtime(timer); 95ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines memcpy(local, tmp, sizeof(*tmp)); 96ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines pthread_mutex_unlock(&rsc->gLibMutex); 97ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines return local; 9839dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy} 9939dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy 10087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsint64_t rsrUptimeMillis(Context *rsc, Script *sc) { 10122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC)); 10222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams} 10322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 10487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsint64_t rsrUptimeNanos(Context *rsc, Script *sc) { 1057349547db61d2d458b31c074b902d56d082e5d84Jason Sams return systemTime(SYSTEM_TIME_MONOTONIC); 10622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams} 10722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams 10887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsfloat rsrGetDt(Context *rsc, Script *sc) { 109ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams int64_t l = sc->mEnviroment.mLastDtTime; 110ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams sc->mEnviroment.mLastDtTime = systemTime(SYSTEM_TIME_MONOTONIC); 111ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams return ((float)(sc->mEnviroment.mLastDtTime - l)) / 1.0e9; 112e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams} 113e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams 114e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams////////////////////////////////////////////////////////////////////////////// 115e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams// 116e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams////////////////////////////////////////////////////////////////////////////// 117e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams 11887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrSetObject(const Context *rsc, const Script *sc, ObjectBase **dst, ObjectBase * src) { 119af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("rsiSetObject %p,%p %p", vdst, *vdst, vsrc); 120bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (src) { 121bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams CHECK_OBJ(src); 122bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams src->incSysRef(); 123f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams } 124bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (dst[0]) { 125bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams CHECK_OBJ(dst[0]); 126bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams dst[0]->decSysRef(); 127f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams } 128bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *dst = src; 129c093685672e54657d87b953d44e514803889486cJason Sams} 130afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk 13187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearObject(const Context *rsc, const Script *sc, ObjectBase **dst) { 132af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("rsiClearObject %p,%p", vdst, *vdst); 133bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (dst[0]) { 134bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams CHECK_OBJ(dst[0]); 135bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams dst[0]->decSysRef(); 136f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams } 137bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *dst = NULL; 138c093685672e54657d87b953d44e514803889486cJason Sams} 139afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk 14087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsbool rsrIsObject(const Context *rsc, const Script *sc, const ObjectBase *src) { 141bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams return src != NULL; 142c093685672e54657d87b953d44e514803889486cJason Sams} 143c093685672e54657d87b953d44e514803889486cJason Sams 1447bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams 14587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrToClient(Context *rsc, Script *sc, int cmdID, void *data, int len) { 146af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("SC_toClient %i %i %i", cmdID, len); 147aad4bc5231dd7059fc5148b34a951117d9b5f4adJason Sams return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, false); 148ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams} 149ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams 15087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrToClientBlocking(Context *rsc, Script *sc, int cmdID, void *data, int len) { 151af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("SC_toClientBlocking %i %i", cmdID, len); 152aad4bc5231dd7059fc5148b34a951117d9b5f4adJason Sams return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, true); 153ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams} 154ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams 155711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines 15687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrForEach(Context *rsc, Script *sc, 15787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Script *target, 15887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams Allocation *in, Allocation *out, 15987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams const void *usr, uint32_t usrBytes, 160afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk const RsScriptCall *call) { 1614419977d78018a9933c7f455fe001f644f2d638bStephen Hines target->runForEach(rsc, /* root slot */ 0, in, out, usr, usrBytes, call); 162693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams} 163693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams 16487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrAllocationSyncAll(Context *rsc, Script *sc, Allocation *a, RsAllocationUsageType usage) { 16587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams a->syncAll(rsc, usage); 166693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams} 167693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams 16874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukvoid rsrAllocationCopy1DRange(Context *rsc, Allocation *dstAlloc, 16974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstOff, 17074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstMip, 17174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t count, 17274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk Allocation *srcAlloc, 17374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t srcOff, uint32_t srcMip) { 17474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk rsi_AllocationCopy2DRange(rsc, dstAlloc, dstOff, 0, 17574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk dstMip, 0, count, 1, 17674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk srcAlloc, srcOff, 0, srcMip, 0); 17774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk} 17874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk 17974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukvoid rsrAllocationCopy2DRange(Context *rsc, Allocation *dstAlloc, 18074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstXoff, uint32_t dstYoff, 18174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstMip, uint32_t dstFace, 18274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t width, uint32_t height, 18374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk Allocation *srcAlloc, 18474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t srcXoff, uint32_t srcYoff, 18574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t srcMip, uint32_t srcFace) { 18674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk rsi_AllocationCopy2DRange(rsc, dstAlloc, dstXoff, dstYoff, 18774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk dstMip, dstFace, width, height, 18874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk srcAlloc, srcXoff, srcYoff, srcMip, srcFace); 18974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk} 19074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk 191693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams 192693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams} 193e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams} 194bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams 195