rsCpuExecutable.h revision 062c287f573ecc06c38ee4295e5627e12c52ac3d
12abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni/*
22abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * Copyright (C) 2015 The Android Open Source Project
32abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni *
42abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * Licensed under the Apache License, Version 2.0 (the "License");
52abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * you may not use this file except in compliance with the License.
62abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * You may obtain a copy of the License at
72abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni *
82abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni *      http://www.apache.org/licenses/LICENSE-2.0
92abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni *
102abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * Unless required by applicable law or agreed to in writing, software
112abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * distributed under the License is distributed on an "AS IS" BASIS,
122abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * See the License for the specific language governing permissions and
142abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni * limitations under the License.
152abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni */
162abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
172abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#ifndef ANDROID_RENDERSCRIPT_EXECUTABLE_H
182abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#define ANDROID_RENDERSCRIPT_EXECUTABLE_H
192abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
202abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#include <stdlib.h>
212abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
222abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#include "rsCpuScript.h"
232abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
242abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ninamespace android {
252abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ninamespace renderscript {
262abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
272abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass Context;
282abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
292abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass SharedLibraryUtils {
302abfcc6d129fe3defddef4540aa95cc445c03a7aYang Nipublic:
312abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#ifndef RS_COMPATIBILITY_LIB
322abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static bool createSharedLibrary(const char* cacheDir, const char* resName);
332abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#endif
342abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
352abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // Load the shared library referred to by cacheDir and resName. If we have
362abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // already loaded this library, we instead create a new copy (in the
372abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // cache dir) and then load that. We then immediately destroy the copy.
382abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // This is required behavior to implement script instancing for the support
392abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // library, since shared objects are loaded and de-duped by name only.
402abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
412abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // For 64bit RS Support Lib, the shared lib path cannot be constructed from
422abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // cacheDir, so nativeLibDir is needed to load shared libs.
432abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static void* loadSharedLibrary(const char *cacheDir, const char *resName,
442abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                                   const char *nativeLibDir = nullptr);
452abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
462abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niprivate:
472abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // Attempt to load the shared library from origName, but then fall back to
482abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // creating a copy of the shared library if necessary (to ensure instancing).
492abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    // This function returns the dlopen()-ed handle if successful.
502abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static void *loadSOHelper(const char *origName, const char *cacheDir,
512abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                              const char *resName);
522abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
532abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static const char* LD_EXE_PATH;
542abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static const char* RS_CACHE_DIR;
552abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni};
562abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
572abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niclass ScriptExecutable {
582abfcc6d129fe3defddef4540aa95cc445c03a7aYang Nipublic:
592abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ScriptExecutable(Context* RSContext,
60062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni                     void** fieldAddress, bool* fieldIsObject,
61062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni                     const char* const * fieldName, size_t varCount,
622abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     InvokeFunc_t* invokeFunctions, size_t funcCount,
632abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     ForEachFunc_t* forEachFunctions, uint32_t* forEachSignatures,
642abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     size_t forEachCount,
65062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni                     const char** pragmaKeys, const char** pragmaValues,
662abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                     size_t pragmaCount,
67aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar                     bool isThreadable, const char *buildChecksum) :
682abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        mFieldAddress(fieldAddress), mFieldIsObject(fieldIsObject),
69062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mFieldName(fieldName), mExportedVarCount(varCount),
70062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mInvokeFunctions(invokeFunctions), mFuncCount(funcCount),
71062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mForEachFunctions(forEachFunctions), mForEachSignatures(forEachSignatures),
72062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mForEachCount(forEachCount),
73062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mPragmaKeys(pragmaKeys), mPragmaValues(pragmaValues),
74062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mPragmaCount(pragmaCount), mIsThreadable(isThreadable),
75062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        mBuildChecksum(buildChecksum), mRS(RSContext) {
762abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    }
772abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
782abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ~ScriptExecutable() {
792abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        for (size_t i = 0; i < mExportedVarCount; ++i) {
802abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            if (mFieldIsObject[i]) {
812abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                if (mFieldAddress[i] != nullptr) {
822abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                    rs_object_base *obj_addr =
832abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                            reinterpret_cast<rs_object_base *>(mFieldAddress[i]);
842abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                    rsrClearObject(mRS, obj_addr);
852abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni                }
862abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            }
872abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        }
882abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
89aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar        delete[] mBuildChecksum;
902abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        for (size_t i = 0; i < mPragmaCount; ++i) {
912abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            delete [] mPragmaKeys[i];
922abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            delete [] mPragmaValues[i];
932abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        }
942abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mPragmaValues;
952abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mPragmaKeys;
96062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
972abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mForEachSignatures;
982abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mForEachFunctions;
99062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
1002abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mInvokeFunctions;
101062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
102062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        for (size_t i = 0; i < mExportedVarCount; i++) {
103062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni            delete[] mFieldName[i];
104062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        }
105062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni        delete[] mFieldName;
1062abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mFieldIsObject;
1072abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni        delete[] mFieldAddress;
1082abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    }
1092abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1102abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    static ScriptExecutable*
1112abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni            createFromSharedObject(Context* RSContext, void* sharedObj);
1122abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1132abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getExportedVariableCount() const { return mExportedVarCount; }
1142abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getExportedFunctionCount() const { return mFuncCount; }
1152abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getExportedForEachCount() const { return mForEachCount; }
1162abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t getPragmaCount() const { return mPragmaCount; }
1172abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1182abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    void* getFieldAddress(int slot) const { return mFieldAddress[slot]; }
119062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    void* getFieldAddress(const char* name) const;
1202abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool getFieldIsObject(int slot) const { return mFieldIsObject[slot]; }
121062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    const char* getFieldName(int slot) const { return mFieldName[slot]; }
122062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
1232abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    InvokeFunc_t getInvokeFunction(int slot) const { return mInvokeFunctions[slot]; }
124062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni
1252abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ForEachFunc_t getForEachFunction(int slot) const { return mForEachFunctions[slot]; }
1262abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    uint32_t getForEachSignature(int slot) const { return mForEachSignatures[slot]; }
1272abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1282abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** getPragmaKeys() const { return mPragmaKeys; }
1292abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** getPragmaValues() const { return mPragmaValues; }
1302abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1312abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool getThreadable() const { return mIsThreadable; }
1322abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
133aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar    const char *getBuildChecksum() const { return mBuildChecksum; }
134aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar    bool isChecksumValid(const char *checksum) const {
135aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar      return (mBuildChecksum != nullptr &&
136aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar              strcmp(checksum, mBuildChecksum) == 0);
137aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar    }
138aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar
1392abfcc6d129fe3defddef4540aa95cc445c03a7aYang Niprivate:
1402abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    void** mFieldAddress;
1412abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool* mFieldIsObject;
142062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni    const char* const * mFieldName;
1432abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mExportedVarCount;
1442abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1452abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    InvokeFunc_t* mInvokeFunctions;
1462abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mFuncCount;
1472abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1482abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    ForEachFunc_t* mForEachFunctions;
1492abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    uint32_t* mForEachSignatures;
1502abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mForEachCount;
1512abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1522abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** mPragmaKeys;
1532abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    const char ** mPragmaValues;
1542abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    size_t mPragmaCount;
1552abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1562abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    bool mIsThreadable;
157aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar    const char *mBuildChecksum;
1582abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1592abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni    Context* mRS;
1602abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni};
1612abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1622abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni}  // namespace renderscript
1632abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni}  // namespace android
1642abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni
1652abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#endif  // ANDROID_RENDERSCRIPT_EXECUTABLE_H
166