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
24b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hines#if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB)
259c4e4ca9ff75a7fe18544c83fcf782e46c9b6ac2Joe Onorato#include "utils/Timers.h"
260b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
27e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
2898e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy#include <time.h>
2998e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
30e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsusing namespace android;
31e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Samsusing namespace android::renderscript;
32e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
3387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams
3487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace android {
3587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace renderscript {
36e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
37a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
38e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
39e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams// Math routines
40e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
41e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
42196c1112ec95a99b75bf9335f0a4e007150e6091Stephen Hines#if 0
43afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_sinf_fast(float x) {
442275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float A =   1.0f / (2.0f * M_PI);
452275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float B = -16.0f;
462275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float C =   8.0f;
47a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
482275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    // scale angle for easy argument reduction
492275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    x *= A;
50a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
512275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    if (fabsf(x) >= 0.5f) {
522275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        // argument reduction
532275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        x = x - ceilf(x + 0.5f) + 1.0f;
542275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    }
55a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
562275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float y = B * x * fabsf(x) + C * x;
572275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    return 0.2215f * (y * fabsf(y) - y) + y;
582275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy}
592275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy
60afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic float SC_cosf_fast(float x) {
612275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    x += float(M_PI / 2);
622275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy
632275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float A =   1.0f / (2.0f * M_PI);
642275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float B = -16.0f;
652275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float C =   8.0f;
66a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
672275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    // scale angle for easy argument reduction
682275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    x *= A;
69a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
702275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    if (fabsf(x) >= 0.5f) {
712275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        // argument reduction
722275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy        x = x - ceilf(x + 0.5f) + 1.0f;
732275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    }
74a57c0a72c3b3babc2757d081ff8146ebaa2caf4cJason Sams
752275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    const float y = B * x * fabsf(x) + C * x;
762275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy    return 0.2215f * (y * fabsf(y) - y) + y;
772275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy}
78196c1112ec95a99b75bf9335f0a4e007150e6091Stephen Hines#endif
792275d635bd1d1b716ae22ee7507583e5013d55f4Romain Guy
8098e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy//////////////////////////////////////////////////////////////////////////////
8198e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy// Time routines
8298e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy//////////////////////////////////////////////////////////////////////////////
8398e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
84709a0978ae141198018ca9769f8d96292a8928e6Jason Samstime_t rsrTime(Context *rsc, time_t *timer) {
85ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    return time(timer);
8639dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy}
8739dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy
88709a0978ae141198018ca9769f8d96292a8928e6Jason Samstm* rsrLocalTime(Context *rsc, tm *local, time_t *timer) {
89ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    if (!local) {
90ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines      return NULL;
91ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    }
92e5ffb879ae535a899a486285a23bea05e912480fJason Sams
93ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    // The native localtime function is not thread-safe, so we
94ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    // have to apply locking for proper behavior in RenderScript.
95ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    pthread_mutex_lock(&rsc->gLibMutex);
96ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    tm *tmp = localtime(timer);
97110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB
98ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    memcpy(local, tmp, sizeof(*tmp));
99110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else
100110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams    // WORKAROUND to struct rs_tm != struct tm
101110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams    memcpy(local, tmp, sizeof(int)*9);
102110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif
103ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    pthread_mutex_unlock(&rsc->gLibMutex);
104ca3f09c0924e9515901dfd47fa5f95385d53cf80Stephen Hines    return local;
10539dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy}
10639dbc8067ef613b84475c20306d1b9be71d61c16Romain Guy
107709a0978ae141198018ca9769f8d96292a8928e6Jason Samsint64_t rsrUptimeMillis(Context *rsc) {
1080b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER
10922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
1100b575de8ed0b628d84d256f5846500b0385979bdTim Murray#else
1110b575de8ed0b628d84d256f5846500b0385979bdTim Murray    return 0;
1120b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
11322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
11422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
115709a0978ae141198018ca9769f8d96292a8928e6Jason Samsint64_t rsrUptimeNanos(Context *rsc) {
1160b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER
1177349547db61d2d458b31c074b902d56d082e5d84Jason Sams    return systemTime(SYSTEM_TIME_MONOTONIC);
1180b575de8ed0b628d84d256f5846500b0385979bdTim Murray#else
1190b575de8ed0b628d84d256f5846500b0385979bdTim Murray    return 0;
1200b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
12122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams}
12222fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
123709a0978ae141198018ca9769f8d96292a8928e6Jason Samsfloat rsrGetDt(Context *rsc, const Script *sc) {
1240b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER
125ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    int64_t l = sc->mEnviroment.mLastDtTime;
126ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    sc->mEnviroment.mLastDtTime = systemTime(SYSTEM_TIME_MONOTONIC);
127ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    return ((float)(sc->mEnviroment.mLastDtTime - l)) / 1.0e9;
1280b575de8ed0b628d84d256f5846500b0385979bdTim Murray#else
1290b575de8ed0b628d84d256f5846500b0385979bdTim Murray    return 0.f;
1300b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
131e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
132e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
133e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
134e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//
135e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams//////////////////////////////////////////////////////////////////////////////
136e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams
137a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samsstatic void SetObjectRef(const Context *rsc, const ObjectBase *dst, const ObjectBase *src) {
138a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    //ALOGE("setObjectRef  %p,%p  %p", rsc, dst, src);
139bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (src) {
140bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        CHECK_OBJ(src);
141bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        src->incSysRef();
142f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    }
143a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    if (dst) {
144a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        CHECK_OBJ(dst);
145a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        dst->decSysRef();
146f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    }
147c093685672e54657d87b953d44e514803889486cJason Sams}
148afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
149f29edf80510d483b8663e9d8b859959e37361aeeJason Sams// Legacy, remove when drivers are updated
150a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samsvoid rsrSetObject(const Context *rsc, void *dst, ObjectBase *src) {
151a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    ObjectBase **odst = (ObjectBase **)dst;
152a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    //ALOGE("rsrSetObject (base) %p,%p  %p", dst, *odst, src);
153a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    SetObjectRef(rsc, odst[0], src);
154a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    if (src != NULL) {
155a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        src->callUpdateCacheObject(rsc, dst);
156f24d7d0eab1dce2cee0108a1d1952bba6d562349Jason Sams    }
157a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams}
158a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
159f29edf80510d483b8663e9d8b859959e37361aeeJason Samsvoid rsrSetObject(const Context *rsc, rs_object_base *dst, const ObjectBase *src) {
160f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    ObjectBase **odst = (ObjectBase **)dst;
161f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    //ALOGE("rsrSetObject (base) %p,%p  %p", dst, *odst, src);
162f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    SetObjectRef(rsc, odst[0], src);
163f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    if (src != NULL) {
164f29edf80510d483b8663e9d8b859959e37361aeeJason Sams        src->callUpdateCacheObject(rsc, dst);
165f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    }
166f29edf80510d483b8663e9d8b859959e37361aeeJason Sams}
167a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
168f29edf80510d483b8663e9d8b859959e37361aeeJason Sams// Legacy, remove when drivers are updated
169a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samsvoid rsrClearObject(const Context *rsc, void *dst) {
170a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    ObjectBase **odst = (ObjectBase **)dst;
171a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    //ALOGE("rsrClearObject  %p,%p", odst, *odst);
172a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    if (odst[0]) {
173a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        CHECK_OBJ(odst[0]);
174a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        odst[0]->decSysRef();
175a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    }
176a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    *odst = NULL;
177c093685672e54657d87b953d44e514803889486cJason Sams}
178afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk
179f29edf80510d483b8663e9d8b859959e37361aeeJason Samsvoid rsrClearObject(const Context *rsc, rs_object_base *dst) {
180f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    //ALOGE("rsrClearObject  %p,%p", odst, *odst);
181f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    if (dst->p) {
182f29edf80510d483b8663e9d8b859959e37361aeeJason Sams        CHECK_OBJ(dst->p);
183f29edf80510d483b8663e9d8b859959e37361aeeJason Sams        dst->p->decSysRef();
184f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    }
185f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    dst->p = NULL;
186f29edf80510d483b8663e9d8b859959e37361aeeJason Sams}
187f29edf80510d483b8663e9d8b859959e37361aeeJason Sams
188f29edf80510d483b8663e9d8b859959e37361aeeJason Sams// Legacy, remove when drivers are updated
1891aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murraybool rsrIsObject(const Context *, ObjectBase* src) {
190f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    ObjectBase **osrc = (ObjectBase **)src;
191f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    return osrc != NULL;
192f29edf80510d483b8663e9d8b859959e37361aeeJason Sams}
193f29edf80510d483b8663e9d8b859959e37361aeeJason Sams
194f29edf80510d483b8663e9d8b859959e37361aeeJason Samsbool rsrIsObject(const Context *rsc, rs_object_base o) {
195f29edf80510d483b8663e9d8b859959e37361aeeJason Sams    return o.p != NULL;
196c093685672e54657d87b953d44e514803889486cJason Sams}
197c093685672e54657d87b953d44e514803889486cJason Sams
1987bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams
1991aa9dfc002f6b763d34d75d9f47abb4aa70584a2Tim Murray
200276000a3673e639f9abc41db4709c1b0a96c1bf9Stephen Hinesuint32_t rsrToClient(Context *rsc, int cmdID, const void *data, int len) {
201af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("SC_toClient %i %i %i", cmdID, len);
202aad4bc5231dd7059fc5148b34a951117d9b5f4adJason Sams    return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, false);
203ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams}
204ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams
205276000a3673e639f9abc41db4709c1b0a96c1bf9Stephen Hinesuint32_t rsrToClientBlocking(Context *rsc, int cmdID, const void *data, int len) {
206af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("SC_toClientBlocking %i %i", cmdID, len);
207aad4bc5231dd7059fc5148b34a951117d9b5f4adJason Sams    return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, true);
208ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams}
209ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams
21070537f52bdc6e8702db03cc91fe511371fb31267Stephen Hines// Keep these two routines (using non-const void pointers) so that we can
21170537f52bdc6e8702db03cc91fe511371fb31267Stephen Hines// still use existing GPU drivers.
21270537f52bdc6e8702db03cc91fe511371fb31267Stephen Hinesuint32_t rsrToClient(Context *rsc, int cmdID, void *data, int len) {
21370537f52bdc6e8702db03cc91fe511371fb31267Stephen Hines    return rsrToClient(rsc, cmdID, (const void *)data, len);
21470537f52bdc6e8702db03cc91fe511371fb31267Stephen Hines}
21570537f52bdc6e8702db03cc91fe511371fb31267Stephen Hines
21670537f52bdc6e8702db03cc91fe511371fb31267Stephen Hinesuint32_t rsrToClientBlocking(Context *rsc, int cmdID, void *data, int len) {
21770537f52bdc6e8702db03cc91fe511371fb31267Stephen Hines    return rsrToClientBlocking(rsc, cmdID, (const void *)data, len);
21870537f52bdc6e8702db03cc91fe511371fb31267Stephen Hines}
21970537f52bdc6e8702db03cc91fe511371fb31267Stephen Hines
220ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsvoid rsrAllocationIoSend(Context *rsc, Allocation *src) {
221ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    src->ioSend(rsc);
222ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
223ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams
224ddceab9a001f07a3395226c5e06e3b420720af0fJason Samsvoid rsrAllocationIoReceive(Context *rsc, Allocation *src) {
225ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams    src->ioReceive(rsc);
226ddceab9a001f07a3395226c5e06e3b420720af0fJason Sams}
227711e7316c7bc274dd0ee9e4f3f043a85c1a706a8Stephen Hines
228709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrForEach(Context *rsc,
22987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                Script *target,
23087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                Allocation *in, Allocation *out,
23187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                const void *usr, uint32_t usrBytes,
232afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                const RsScriptCall *call) {
2334419977d78018a9933c7f455fe001f644f2d638bStephen Hines    target->runForEach(rsc, /* root slot */ 0, in, out, usr, usrBytes, call);
234693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams}
235693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams
236709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrAllocationSyncAll(Context *rsc, Allocation *a, RsAllocationUsageType usage) {
23787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    a->syncAll(rsc, usage);
238693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams}
239693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams
24074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukvoid rsrAllocationCopy1DRange(Context *rsc, Allocation *dstAlloc,
24174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              uint32_t dstOff,
24274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              uint32_t dstMip,
24374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              uint32_t count,
24474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              Allocation *srcAlloc,
24574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              uint32_t srcOff, uint32_t srcMip) {
24674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk    rsi_AllocationCopy2DRange(rsc, dstAlloc, dstOff, 0,
24774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              dstMip, 0, count, 1,
24874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              srcAlloc, srcOff, 0, srcMip, 0);
24974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
25074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
25174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukvoid rsrAllocationCopy2DRange(Context *rsc, Allocation *dstAlloc,
25274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              uint32_t dstXoff, uint32_t dstYoff,
25374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              uint32_t dstMip, uint32_t dstFace,
25474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              uint32_t width, uint32_t height,
25574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              Allocation *srcAlloc,
25674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              uint32_t srcXoff, uint32_t srcYoff,
25774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              uint32_t srcMip, uint32_t srcFace) {
25874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk    rsi_AllocationCopy2DRange(rsc, dstAlloc, dstXoff, dstYoff,
25974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              dstMip, dstFace, width, height,
26074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                              srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
26174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
26274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
263693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams
264693080efdafbf49d675fe5f959f0286f83b30c81Jason Sams}
265e45ac6e91864f2a6617b6a2c0aa87cdb62cf58fdJason Sams}
266