rsScript.cpp revision 0977c94a4b83dd8ef6d3808160710ebbaa1b1768
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "rsContext.h"
18
19using namespace android;
20using namespace android::renderscript;
21
22Script::Script(Context *rsc) : ObjectBase(rsc)
23{
24    mAllocFile = __FILE__;
25    mAllocLine = __LINE__;
26    memset(&mEnviroment, 0, sizeof(mEnviroment));
27
28    mSlots = NULL;
29    mTypes = NULL;
30}
31
32Script::~Script()
33{
34    if(mSlots) {
35        delete [] mSlots;
36        mSlots = NULL;
37    }
38    if(mTypes) {
39        delete [] mTypes;
40        mTypes = NULL;
41    }
42}
43
44void Script::initSlots() {
45    if(mEnviroment.mFieldCount > 0) {
46        mSlots = new ObjectBaseRef<Allocation>[mEnviroment.mFieldCount];
47        mTypes = new ObjectBaseRef<const Type>[mEnviroment.mFieldCount];
48    }
49}
50
51void Script::setSlot(uint32_t slot, Allocation *a) {
52    if(slot >= mEnviroment.mFieldCount) {
53        LOGE("Script::setSlot unable to set allocation, invalid slot index");
54        return;
55    }
56
57    mSlots[slot].set(a);
58}
59
60void Script::setVar(uint32_t slot, const void *val, uint32_t len)
61{
62    int32_t *destPtr = ((int32_t **)mEnviroment.mFieldAddress)[slot];
63    if (destPtr) {
64        //LOGE("setVar f1  %f", ((const float *)destPtr)[0]);
65        //LOGE("setVar %p %i", destPtr, len);
66        memcpy(destPtr, val, len);
67        //LOGE("setVar f2  %f", ((const float *)destPtr)[0]);
68    } else {
69        //if (rsc->props.mLogScripts) {
70            LOGV("Calling setVar on slot = %i which is null", slot);
71        //}
72    }
73}
74
75namespace android {
76namespace renderscript {
77
78
79void rsi_ScriptBindAllocation(Context * rsc, RsScript vs, RsAllocation va, uint32_t slot)
80{
81    Script *s = static_cast<Script *>(vs);
82    Allocation *a = static_cast<Allocation *>(va);
83    s->setSlot(slot, a);
84    //LOGE("rsi_ScriptBindAllocation %i  %p  %p", slot, a, a->getPtr());
85}
86
87void rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, uint32_t length)
88{
89    Script *s = static_cast<Script *>(vs);
90    s->mEnviroment.mTimeZone = timeZone;
91}
92
93void rsi_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot)
94{
95    Script *s = static_cast<Script *>(vs);
96    s->Invoke(rsc, slot, NULL, 0);
97}
98
99
100void rsi_ScriptInvokeData(Context *rsc, RsScript vs, uint32_t slot, void *data)
101{
102    Script *s = static_cast<Script *>(vs);
103    s->Invoke(rsc, slot, NULL, 0);
104}
105
106void rsi_ScriptInvokeV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len)
107{
108    Script *s = static_cast<Script *>(vs);
109    s->Invoke(rsc, slot, data, len);
110}
111
112void rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value)
113{
114    Script *s = static_cast<Script *>(vs);
115    s->setVar(slot, &value, sizeof(value));
116}
117
118void rsi_ScriptSetVarJ(Context *rsc, RsScript vs, uint32_t slot, long long value)
119{
120    Script *s = static_cast<Script *>(vs);
121    s->setVar(slot, &value, sizeof(value));
122}
123
124void rsi_ScriptSetVarF(Context *rsc, RsScript vs, uint32_t slot, float value)
125{
126    Script *s = static_cast<Script *>(vs);
127    s->setVar(slot, &value, sizeof(value));
128}
129
130void rsi_ScriptSetVarD(Context *rsc, RsScript vs, uint32_t slot, double value)
131{
132    Script *s = static_cast<Script *>(vs);
133    s->setVar(slot, &value, sizeof(value));
134}
135
136void rsi_ScriptSetVarV(Context *rsc, RsScript vs, uint32_t slot, const void *data, uint32_t len)
137{
138    const float *fp = (const float *)data;
139    Script *s = static_cast<Script *>(vs);
140    s->setVar(slot, data, len);
141}
142
143
144}
145}
146
147