1709a0978ae141198018ca9769f8d96292a8928e6Jason Sams/*
2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2012 The Android Open Source Project
3709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
4709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * you may not use this file except in compliance with the License.
6709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * You may obtain a copy of the License at
7709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
8709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
10709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Unless required by applicable law or agreed to in writing, software
11709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * See the License for the specific language governing permissions and
14709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * limitations under the License.
15709a0978ae141198018ca9769f8d96292a8928e6Jason Sams */
16709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
17709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuIntrinsic.h"
19709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
20709a0978ae141198018ca9769f8d96292a8928e6Jason Samsusing namespace android;
21709a0978ae141198018ca9769f8d96292a8928e6Jason Samsusing namespace android::renderscript;
22709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
23709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsic::RsdCpuScriptIntrinsic(RsdCpuReferenceImpl *ctx, const Script *s,
24c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                             const Element *e, RsScriptIntrinsicID iid)
25709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        : RsdCpuScriptImpl(ctx, s) {
26709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
27709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mID = iid;
28c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    mElement.set(e);
29709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
31709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsic::~RsdCpuScriptIntrinsic() {
32709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
33709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
34709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsic::invokeFunction(uint32_t slot, const void *params, size_t paramLength) {
35709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->getContext()->setError(RS_ERROR_FATAL_DRIVER,
36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                 "Unexpected RsdCpuScriptIntrinsic::invokeFunction");
37709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
38709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
39709a0978ae141198018ca9769f8d96292a8928e6Jason Samsint RsdCpuScriptIntrinsic::invokeRoot() {
40709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->getContext()->setError(RS_ERROR_FATAL_DRIVER,
41709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                 "Unexpected RsdCpuScriptIntrinsic::invokeRoot");
42709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return 0;
43709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
44709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
45709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsic::invokeInit() {
46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->getContext()->setError(RS_ERROR_FATAL_DRIVER,
47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                 "Unexpected RsdCpuScriptIntrinsic::invokeInit");
48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
49709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
50709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsic::setGlobalVar(uint32_t slot, const void *data, size_t dataLength) {
51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->getContext()->setError(RS_ERROR_FATAL_DRIVER,
52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                 "Unexpected RsdCpuScriptIntrinsic::setGlobalVar");
53709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
55709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsic::setGlobalVarWithElemDims(uint32_t slot, const void *data,
56709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                                     size_t dataLength, const Element *e,
57ac8d146a41f18afad5314ac8af440d6aedbe20bfStephen Hines                                                     const uint32_t *dims, size_t dimLength) {
58709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->getContext()->setError(RS_ERROR_FATAL_DRIVER,
59709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                 "Unexpected RsdCpuScriptIntrinsic::setGlobalVarWithElemDims");
60709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
61709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
62709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsic::setGlobalBind(uint32_t slot, Allocation *data) {
63709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->getContext()->setError(RS_ERROR_FATAL_DRIVER,
64709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                 "Unexpected RsdCpuScriptIntrinsic::setGlobalBind");
65709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
66709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
67709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsic::setGlobalObj(uint32_t slot, ObjectBase *data) {
68709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->getContext()->setError(RS_ERROR_FATAL_DRIVER,
69709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                 "Unexpected RsdCpuScriptIntrinsic::setGlobalObj");
70709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
71709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
72709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsic::invokeFreeChildren() {
73709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
74709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
75709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
76f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailesvoid RsdCpuScriptIntrinsic::preLaunch(uint32_t slot, const Allocation ** ains,
77f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                      uint32_t inLen, Allocation * aout,
78f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                      const void * usr, uint32_t usrLen,
79f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                      const RsScriptCall *sc) {
802282e2816ac5f5de53f9bd4f3ecbdfd6d756d120Jason Sams}
812282e2816ac5f5de53f9bd4f3ecbdfd6d756d120Jason Sams
82f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailesvoid RsdCpuScriptIntrinsic::postLaunch(uint32_t slot, const Allocation ** ains,
83f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                       uint32_t inLen, Allocation * aout,
84f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                       const void * usr, uint32_t usrLen,
85f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                       const RsScriptCall *sc) {
862282e2816ac5f5de53f9bd4f3ecbdfd6d756d120Jason Sams}
872282e2816ac5f5de53f9bd4f3ecbdfd6d756d120Jason Sams
88709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsic::invokeForEach(uint32_t slot,
89f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                          const Allocation ** ains,
90f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                                          uint32_t inLen,
91709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                          Allocation * aout,
92709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                          const void * usr,
93709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                          uint32_t usrLen,
94709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                          const RsScriptCall *sc) {
95709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
9614ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    MTLaunchStructForEach mtls;
972282e2816ac5f5de53f9bd4f3ecbdfd6d756d120Jason Sams
98f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes    preLaunch(slot, ains, inLen, aout, usr, usrLen, sc);
994b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
100bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams    if (forEachMtlsSetup(ains, inLen, aout, usr, usrLen, sc, &mtls)) {
101bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams        mtls.script = this;
102bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams        mtls.fep.slot = slot;
1034b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
10414ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala        mtls.kernel = mRootPtr;
105bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams        mtls.fep.usr = this;
1064b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
107bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams        RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this);
10814ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala        mCtx->launchForEach(ains, inLen, aout, sc, &mtls);
109bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams        mCtx->setTLS(oldTLS);
110bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams    }
1114b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
112f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes    postLaunch(slot, ains, inLen, aout, usr, usrLen, sc);
1134b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes}
1144b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
11514ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Walavoid RsdCpuScriptIntrinsic::forEachKernelSetup(uint32_t slot, MTLaunchStructForEach *mtls) {
116709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
117709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->script = this;
118709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.slot = slot;
11914ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala    mtls->kernel = mRootPtr;
120709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.usr = this;
121709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
122