rsCpuScript.cpp revision a9139c724f8312b3634d213599f2d6b3b2505db2
1709a0978ae141198018ca9769f8d96292a8928e6Jason Sams/* 2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2011-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 79ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet * 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#include "rsCpuCore.h" 18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuScript.h" 192abfcc6d129fe3defddef4540aa95cc445c03a7aYang Ni#include "rsCpuExecutable.h" 20709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 21110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifdef RS_COMPATIBILITY_LIB 22110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <stdio.h> 23ee48c0bbf290a73e2cd4710b70d62fc203dac0dcStephen Hines #include <sys/stat.h> 24c2c11cc9037d5ddd55282c6dab82db542b398d9eStephen Hines #include <unistd.h> 25110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 262fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar #include "rsCppUtils.h" 272fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar 28110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/BCCContext.h> 2982e0a6779cb1006921153081fb33374197e7c9deStephen Hines #include <bcc/Config/Config.h> 30110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/Renderscript/RSCompilerDriver.h> 31b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines #include <bcinfo/MetadataExtractor.h> 32ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines #include <cutils/properties.h> 33b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines 34aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar #include <zlib.h> 35aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar #include <sys/file.h> 36b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines #include <sys/types.h> 37b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines #include <unistd.h> 38005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines 39005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines #include <string> 40005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines #include <vector> 41110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 42709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 43dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#include <set> 44dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#include <string> 45dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#include <dlfcn.h> 46dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#include <stdlib.h> 47dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#include <string.h> 48dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#include <iostream> 49dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar 50dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#ifdef __LP64__ 51dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#define SYSLIBPATH "/system/lib64" 52dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#else 53dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#define SYSLIBPATH "/system/lib" 54dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#endif 55dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar 56ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hinesnamespace { 57dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#ifndef RS_COMPATIBILITY_LIB 58dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar 59ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hinesstatic bool is_force_recompile() { 60ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines#ifdef RS_SERVER 61ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines return false; 62ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines#else 63ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines char buf[PROPERTY_VALUE_MAX]; 64ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines 65ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines // Re-compile if floating point precision has been overridden. 66ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines property_get("debug.rs.precision", buf, ""); 67ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines if (buf[0] != '\0') { 68ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines return true; 69ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } 70ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines 71ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines // Re-compile if debug.rs.forcerecompile is set. 72ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines property_get("debug.rs.forcerecompile", buf, "0"); 73ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines if ((::strcmp(buf, "1") == 0) || (::strcmp(buf, "true") == 0)) { 74ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines return true; 75ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } else { 76ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines return false; 77ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } 78ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines#endif // RS_SERVER 79ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines} 80b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines 816847e73314e13aa02231268cca245a81eb0539caChris Wailesstatic void setCompileArguments(std::vector<const char*>* args, 826847e73314e13aa02231268cca245a81eb0539caChris Wailes const std::string& bcFileName, 836847e73314e13aa02231268cca245a81eb0539caChris Wailes const char* cacheDir, const char* resName, 846847e73314e13aa02231268cca245a81eb0539caChris Wailes const char* core_lib, bool useRSDebugContext, 856847e73314e13aa02231268cca245a81eb0539caChris Wailes const char* bccPluginName) { 8640e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet rsAssert(cacheDir && resName && core_lib); 87da0f069871343119251d6b0586be356dc2146a62Yang Ni args->push_back(android::renderscript::RsdCpuScriptImpl::BCC_EXE_PATH); 88687cfe85c3cffb244a7e5daeb1231f441a1ed54dTim Murray args->push_back("-unroll-runtime"); 89687cfe85c3cffb244a7e5daeb1231f441a1ed54dTim Murray args->push_back("-scalarize-load-store"); 9040e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back("-o"); 9140e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back(resName); 9240e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back("-output_path"); 9340e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back(cacheDir); 9440e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back("-bclib"); 9540e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back(core_lib); 9640e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back("-mtriple"); 9740e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back(DEFAULT_TARGET_TRIPLE_STRING); 9840e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet 99358ffb84f56929cd2d61f6429a790a1606eaf865Tim Murray // Enable workaround for A53 codegen by default. 100358ffb84f56929cd2d61f6429a790a1606eaf865Tim Murray#if defined(__aarch64__) && !defined(DISABLE_A53_WORKAROUND) 101358ffb84f56929cd2d61f6429a790a1606eaf865Tim Murray args->push_back("-aarch64-fix-cortex-a53-835769"); 102358ffb84f56929cd2d61f6429a790a1606eaf865Tim Murray#endif 103358ffb84f56929cd2d61f6429a790a1606eaf865Tim Murray 10440e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet // Execute the bcc compiler. 10540e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet if (useRSDebugContext) { 10640e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back("-rs-debug-ctx"); 10740e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet } else { 10840e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet // Only load additional libraries for compiles that don't use 10940e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet // the debug context. 11040e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet if (bccPluginName && strlen(bccPluginName) > 0) { 11140e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back("-load"); 11240e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet args->push_back(bccPluginName); 11340e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet } 11440e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet } 11540e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet 11645e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines args->push_back("-fPIC"); 11745e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines args->push_back("-embedRSInfo"); 118dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar 1196847e73314e13aa02231268cca245a81eb0539caChris Wailes args->push_back(bcFileName.c_str()); 12044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes args->push_back(nullptr); 12140e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet} 12240e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet 1236847e73314e13aa02231268cca245a81eb0539caChris Wailesstatic bool compileBitcode(const std::string &bcFileName, 124b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines const char *bitcode, 125b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines size_t bitcodeSize, 1262fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar std::vector<const char *> &compileArguments) { 12740e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet rsAssert(bitcode && bitcodeSize); 12840e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet 1296847e73314e13aa02231268cca245a81eb0539caChris Wailes FILE *bcfile = fopen(bcFileName.c_str(), "w"); 130b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines if (!bcfile) { 1316847e73314e13aa02231268cca245a81eb0539caChris Wailes ALOGE("Could not write to %s", bcFileName.c_str()); 132b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines return false; 133b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines } 134b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines size_t nwritten = fwrite(bitcode, 1, bitcodeSize, bcfile); 135b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines fclose(bcfile); 136b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines if (nwritten != bitcodeSize) { 137b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines ALOGE("Could not write %zu bytes to %s", bitcodeSize, 1386847e73314e13aa02231268cca245a81eb0539caChris Wailes bcFileName.c_str()); 139b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines return false; 140b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines } 141b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines 1422fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar return android::renderscript::rsuExecuteCommand( 1432fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar android::renderscript::RsdCpuScriptImpl::BCC_EXE_PATH, 1442fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar compileArguments.size()-1, compileArguments.data()); 145b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines} 146b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines 147aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainarbool isChecksumNeeded() { 148aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar char buf[PROPERTY_VALUE_MAX]; 149aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar property_get("ro.debuggable", buf, ""); 150aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar return (buf[0] == '1'); 151aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar} 152aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 153aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainarchar *constructBuildChecksum(uint8_t const *bitcode, size_t bitcodeSize, 154aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar const char *commandLine, 155aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar const std::vector<const char *> &bccFiles) { 156aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar uint32_t checksum = adler32(0L, Z_NULL, 0); 157aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 158aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // include checksum of bitcode 159aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar checksum = adler32(checksum, bitcode, bitcodeSize); 160aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 161aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // include checksum of command line arguments 162aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar checksum = adler32(checksum, (const unsigned char *) commandLine, 163aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar strlen(commandLine)); 164aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 165aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // include checksum of bccFiles 166aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar for (auto bccFile : bccFiles) { 167f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni if (!android::renderscript::addFileToChecksum(bccFile, checksum)) { 168aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // return empty checksum instead of something partial/corrupt 169aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar return nullptr; 170aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar } 171aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar } 172aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 173aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar char *checksumStr = new char[9](); 174aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar sprintf(checksumStr, "%08x", checksum); 175aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar return checksumStr; 176aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar} 177aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 1781c44cb6b1133730cd18929d637e71e9326c70bd0Yang Ni#endif // !defined(RS_COMPATIBILITY_LIB) 1791c44cb6b1133730cd18929d637e71e9326c70bd0Yang Ni} // namespace 1801c44cb6b1133730cd18929d637e71e9326c70bd0Yang Ni 1811c44cb6b1133730cd18929d637e71e9326c70bd0Yang Ninamespace android { 1821c44cb6b1133730cd18929d637e71e9326c70bd0Yang Ninamespace renderscript { 1831c44cb6b1133730cd18929d637e71e9326c70bd0Yang Ni 184f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni#ifndef RS_COMPATIBILITY_LIB 185f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Nibool addFileToChecksum(const char *fileName, uint32_t &checksum) { 186f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni int FD = open(fileName, O_RDONLY); 187f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni if (FD == -1) { 188f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni ALOGE("Cannot open file \'%s\' to compute checksum", fileName); 189f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni return false; 190f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni } 191f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni 192f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni char buf[256]; 193f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni while (true) { 194f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni ssize_t nread = read(FD, buf, sizeof(buf)); 195f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni if (nread < 0) { // bail out on failed read 196f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni ALOGE("Error while computing checksum for file \'%s\'", fileName); 197f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni return false; 198f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni } 199f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni 200f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni checksum = adler32(checksum, (const unsigned char *) buf, nread); 201f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni if (static_cast<size_t>(nread) < sizeof(buf)) // EOF 202f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni break; 203f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni } 204f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni 205f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni if (TEMP_FAILURE_RETRY(close(FD)) != 0) { 206f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni ALOGE("Cannot close file \'%s\' after computing checksum", fileName); 207f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni return false; 208f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni } 209f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni return true; 210f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni} 211f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni#endif // !RS_COMPATIBILITY_LIB 212f02a2b0a2749d4a4f07edbc23eddff2e51d11b72Yang Ni 213709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl::RsdCpuScriptImpl(RsdCpuReferenceImpl *ctx, const Script *s) { 214709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx = ctx; 215709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mScript = s; 216709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 21744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mScriptSO = nullptr; 218dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar 219dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#ifndef RS_COMPATIBILITY_LIB 22044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mCompilerDriver = nullptr; 221110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 222110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 223e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray 22444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mRoot = nullptr; 22544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mRootExpand = nullptr; 22644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mInit = nullptr; 22744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mFreeChildren = nullptr; 228d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni mScriptExec = nullptr; 229709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 23044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mBoundAllocs = nullptr; 23144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mIntrinsicData = nullptr; 232709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mIsThreadable = true; 233aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 234aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mBuildChecksum = nullptr; 235aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mChecksumNeeded = false; 236709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 237709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 238dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainarbool RsdCpuScriptImpl::storeRSInfoFromSO() { 239aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // The shared object may have an invalid build checksum. 240aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // Validate and fail early. 241aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mScriptExec = ScriptExecutable::createFromSharedObject( 242aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mCtx->getContext(), mScriptSO); 243aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 244aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar if (mScriptExec == nullptr) { 245aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar return false; 246aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar } 247aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 248aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar if (mChecksumNeeded && !mScriptExec->isChecksumValid(mBuildChecksum)) { 249aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar ALOGE("Found invalid checksum. Expected %s, got %s\n", 250aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mBuildChecksum, mScriptExec->getBuildChecksum()); 251aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar delete mScriptExec; 252aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mScriptExec = nullptr; 253aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar return false; 254aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar } 255aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 256dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar mRoot = (RootFunc_t) dlsym(mScriptSO, "root"); 257dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar if (mRoot) { 258dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar //ALOGE("Found root(): %p", mRoot); 259dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar } 260dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar mRootExpand = (RootFunc_t) dlsym(mScriptSO, "root.expand"); 261dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar if (mRootExpand) { 262dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar //ALOGE("Found root.expand(): %p", mRootExpand); 263dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar } 264dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar mInit = (InvokeFunc_t) dlsym(mScriptSO, "init"); 265dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar if (mInit) { 266dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar //ALOGE("Found init(): %p", mInit); 267dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar } 268dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar mFreeChildren = (InvokeFunc_t) dlsym(mScriptSO, ".rs.dtor"); 269dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar if (mFreeChildren) { 270dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar //ALOGE("Found .rs.dtor(): %p", mFreeChildren); 271dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar } 272dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar 273d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni size_t varCount = mScriptExec->getExportedVariableCount(); 274d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni if (varCount > 0) { 275d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni mBoundAllocs = new Allocation *[varCount]; 276d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni memset(mBoundAllocs, 0, varCount * sizeof(*mBoundAllocs)); 277dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar } 278dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar 27968173de001c5d41c74828a426651e07cfd9e8710Pirama Arumuga Nainar mIsThreadable = mScriptExec->getThreadable(); 28068173de001c5d41c74828a426651e07cfd9e8710Pirama Arumuga Nainar //ALOGE("Script isThreadable? %d", mIsThreadable); 28168173de001c5d41c74828a426651e07cfd9e8710Pirama Arumuga Nainar 282d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni return true; 283d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni} 284d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni 285709a0978ae141198018ca9769f8d96292a8928e6Jason Samsbool RsdCpuScriptImpl::init(char const *resName, char const *cacheDir, 286709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint8_t const *bitcode, size_t bitcodeSize, 287005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines uint32_t flags, char const *bccPluginName) { 288e8f9fba78f0cb79fa8773373a635e30382113a75Yang Ni //ALOGE("rsdScriptCreate %p %p %p %p %i %i %p", rsc, resName, cacheDir, 289e8f9fba78f0cb79fa8773373a635e30382113a75Yang Ni // bitcode, bitcodeSize, flags, lookupFunc); 290709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("rsdScriptInit %p %p", rsc, script); 291709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 292709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->lockMutex(); 293110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 294005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines bool useRSDebugContext = false; 295709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 29644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mCompilerDriver = nullptr; 297709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 298709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerDriver = new bcc::RSCompilerDriver(); 29944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (mCompilerDriver == nullptr) { 300709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("bcc: FAILS to create compiler driver (out of memory)"); 301709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 302709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return false; 303709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 304709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 305b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines // Run any compiler setup functions we have been provided with. 306b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines RSSetupCompilerCallback setupCompilerCallback = 307b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines mCtx->getSetupCompilerCallback(); 30844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (setupCompilerCallback != nullptr) { 309b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines setupCompilerCallback(mCompilerDriver); 310b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines } 311b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines 31240e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet bcinfo::MetadataExtractor bitcodeMetadata((const char *) bitcode, bitcodeSize); 31340e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet if (!bitcodeMetadata.extract()) { 314b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines ALOGE("Could not extract metadata from bitcode"); 315f94e8db4232979b2fc93e8a77c42bfa57d3da56aStephen Hines mCtx->unlockMutex(); 316b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines return false; 317b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines } 318b58d9adf52f0216c0281c749023bdd5b52236875Stephen Hines 31940e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet const char* core_lib = findCoreLib(bitcodeMetadata, (const char*)bitcode, bitcodeSize); 320cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines 321cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines if (mCtx->getContext()->getContextType() == RS_CONTEXT_TYPE_DEBUG) { 322f47e8b4b86bf194e65398032f3f5f47a6da89f3fStephen Hines mCompilerDriver->setDebugContext(true); 323005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines useRSDebugContext = true; 324ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } 325ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines 3266847e73314e13aa02231268cca245a81eb0539caChris Wailes std::string bcFileName(cacheDir); 32740e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet bcFileName.append("/"); 32840e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet bcFileName.append(resName); 32940e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet bcFileName.append(".bc"); 33040e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet 33140e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet std::vector<const char*> compileArguments; 33240e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet setCompileArguments(&compileArguments, bcFileName, cacheDir, resName, core_lib, 33340e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet useRSDebugContext, bccPluginName); 334aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 335aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mChecksumNeeded = isChecksumNeeded(); 336aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar if (mChecksumNeeded) { 337aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar std::vector<const char *> bccFiles = { BCC_EXE_PATH, 338aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar core_lib, 339aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar }; 3402fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar 3412fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar // The last argument of compileArguments is a nullptr, so remove 1 from 3422fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar // the size. 3432fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar std::unique_ptr<const char> compileCommandLine( 3442fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar rsuJoinStrings(compileArguments.size()-1, compileArguments.data())); 3452fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar 346aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mBuildChecksum = constructBuildChecksum(bitcode, bitcodeSize, 347aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar compileCommandLine.get(), 348aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar bccFiles); 349aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 350aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar if (mBuildChecksum == nullptr) { 351aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // cannot compute checksum but verification is enabled 352aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mCtx->unlockMutex(); 353aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar return false; 354aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar } 355aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar } 356aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar else { 357aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // add a dummy/constant as a checksum if verification is disabled 358aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mBuildChecksum = new char[9](); 359aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar strcpy(const_cast<char *>(mBuildChecksum), "abadcafe"); 360aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar } 361aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 362aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // Append build checksum to commandline 363aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // Handle the terminal nullptr in compileArguments 364aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar compileArguments.pop_back(); 365aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar compileArguments.push_back("-build-checksum"); 366aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar compileArguments.push_back(mBuildChecksum); 367aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar compileArguments.push_back(nullptr); 368aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 369bf96a520e162b503b293f65ca9ca9be66d4a0036Tim Murray if (!is_force_recompile() && !useRSDebugContext) { 3701c44cb6b1133730cd18929d637e71e9326c70bd0Yang Ni mScriptSO = SharedLibraryUtils::loadSharedLibrary(cacheDir, resName); 371aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 372aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // Read RS info from the shared object to detect checksum mismatch 373aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar if (mScriptSO != nullptr && !storeRSInfoFromSO()) { 374aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar dlclose(mScriptSO); 375aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar mScriptSO = nullptr; 376aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar } 377cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines } 378709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 37940e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet // If we can't, it's either not there or out of date. We compile the bit code and try loading 38040e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet // again. 38145e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines if (mScriptSO == nullptr) { 38245e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines if (!compileBitcode(bcFileName, (const char*)bitcode, bitcodeSize, 3832fa8a238dd69afebdeb757adcb1d674043d78e32Pirama Arumuga Nainar compileArguments)) 38445e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines { 38540e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet ALOGE("bcc: FAILS to compile '%s'", resName); 38640e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet mCtx->unlockMutex(); 38740e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet return false; 38840e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet } 38945e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines 3901c44cb6b1133730cd18929d637e71e9326c70bd0Yang Ni if (!SharedLibraryUtils::createSharedLibrary(cacheDir, resName)) { 39145e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines ALOGE("Linker: Failed to link object file '%s'", resName); 39245e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines mCtx->unlockMutex(); 39345e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines return false; 39445e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines } 39545e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines 3961c44cb6b1133730cd18929d637e71e9326c70bd0Yang Ni mScriptSO = SharedLibraryUtils::loadSharedLibrary(cacheDir, resName); 39745e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines if (mScriptSO == nullptr) { 39845e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines ALOGE("Unable to load '%s'", resName); 39940e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet mCtx->unlockMutex(); 40040e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet return false; 40140e35cdbe217ec8bf9fc3c69873c7d62fc14158fJean-Luc Brouillet } 402aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 403aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar // Read RS symbol information from the .so. 404aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar if (!storeRSInfoFromSO()) { 405aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar goto error; 406aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar } 407709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 408709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 409c31585b8ca865bf2b35abc79c8a8ee42de27bee8Yang Ni mBitcodeFilePath.setTo(bcFileName.c_str()); 410da0f069871343119251d6b0586be356dc2146a62Yang Ni 411dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar#else // RS_COMPATIBILITY_LIB is defined 412f3213d7fd648da98bb3b03204eaf90f03c31926bMiao Wang const char *nativeLibDir = mCtx->getContext()->getNativeLibDir(); 413f3213d7fd648da98bb3b03204eaf90f03c31926bMiao Wang mScriptSO = SharedLibraryUtils::loadSharedLibrary(cacheDir, resName, nativeLibDir); 414110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 415dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar if (!mScriptSO) { 416dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar goto error; 417dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar } 418110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 419dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar if (!storeRSInfoFromSO()) { 420c2c11cc9037d5ddd55282c6dab82db542b398d9eStephen Hines goto error; 421110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 422110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 423709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 424709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return true; 425110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 426110f181b7966212a36ef18016f9b81c7322d0a2fJason Samserror: 427110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 428110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mCtx->unlockMutex(); 429110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO) { 430110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams dlclose(mScriptSO); 431eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni mScriptSO = nullptr; 432110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 433110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return false; 434709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 435709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 4369ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet#ifndef RS_COMPATIBILITY_LIB 4379ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet 4389ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouilletconst char* RsdCpuScriptImpl::findCoreLib(const bcinfo::MetadataExtractor& ME, const char* bitcode, 4399ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet size_t bitcodeSize) { 4409ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet const char* defaultLib = SYSLIBPATH"/libclcore.bc"; 4419ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet 4429ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet // If we're debugging, use the debug library. 4439ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet if (mCtx->getContext()->getContextType() == RS_CONTEXT_TYPE_DEBUG) { 4449ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet return SYSLIBPATH"/libclcore_debug.bc"; 4459ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet } 4469ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet 4479ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet // If a callback has been registered to specify a library, use that. 4489ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet RSSelectRTCallback selectRTCallback = mCtx->getSelectRTCallback(); 44944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (selectRTCallback != nullptr) { 4509ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet return selectRTCallback((const char*)bitcode, bitcodeSize); 4519ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet } 4529ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet 4539ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet // Check for a platform specific library 4549ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet#if defined(ARCH_ARM_HAVE_NEON) && !defined(DISABLE_CLCORE_NEON) 4559ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet enum bcinfo::RSFloatPrecision prec = ME.getRSFloatPrecision(); 456f4d3836c83097f57b62c235910fbf490c56ddf56Jean-Luc Brouillet if (prec == bcinfo::RS_FP_Relaxed) { 4579ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet // NEON-capable ARMv7a devices can use an accelerated math library 4589ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet // for all reduced precision scripts. 4599ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet // ARMv8 does not use NEON, as ASIMD can be used with all precision 4609ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet // levels. 4619ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet return SYSLIBPATH"/libclcore_neon.bc"; 4629ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet } else { 4639ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet return defaultLib; 4649ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet } 4659ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet#elif defined(__i386__) || defined(__x86_64__) 4669ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet // x86 devices will use an optimized library. 4679ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet return SYSLIBPATH"/libclcore_x86.bc"; 4689ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet#else 4699ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet return defaultLib; 4709ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet#endif 4719ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet} 4729ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet 4739ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet#endif 4749ab5094dd32352b33e251e540934f6e814c5fa5bJean-Luc Brouillet 475709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::populateScript(Script *script) { 476110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Copy info over to runtime 477d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni script->mHal.info.exportedFunctionCount = mScriptExec->getExportedFunctionCount(); 478d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni script->mHal.info.exportedVariableCount = mScriptExec->getExportedVariableCount(); 479577194ac9c2bf10f31e564de91371764b265929aPirama Arumuga Nainar script->mHal.info.exportedPragmaCount = mScriptExec->getPragmaCount();; 480e8f9fba78f0cb79fa8773373a635e30382113a75Yang Ni script->mHal.info.exportedPragmaKeyList = mScriptExec->getPragmaKeys(); 481e8f9fba78f0cb79fa8773373a635e30382113a75Yang Ni script->mHal.info.exportedPragmaValueList = mScriptExec->getPragmaValues(); 482110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 483110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Bug, need to stash in metadata 484110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mRootExpand) { 485110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.root = mRootExpand; 486110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } else { 487110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.root = mRoot; 488110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 489709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 490709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 491709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 492709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t); 493709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 494bf2111d3b3de310932099514f06924e48fa1d7b2Jason Samsbool RsdCpuScriptImpl::forEachMtlsSetup(const Allocation ** ains, 495f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes uint32_t inLen, 496f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes Allocation * aout, 497709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const void * usr, uint32_t usrLen, 498709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsScriptCall *sc, 499709a0978ae141198018ca9769f8d96292a8928e6Jason Sams MTLaunchStruct *mtls) { 500709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 501709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memset(mtls, 0, sizeof(MTLaunchStruct)); 502709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 503f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes for (int index = inLen; --index >= 0;) { 504f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes const Allocation* ain = ains[index]; 5054b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 506f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes // possible for this to occur if IO_OUTPUT/IO_INPUT with no bound surface 50744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (ain != nullptr && 50844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes (const uint8_t *)ain->mHal.drvState.lod[0].mallocPtr == nullptr) { 50944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes 5104b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, 511f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes "rsForEach called with null in allocations"); 512bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams return false; 5134b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5144b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5154b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 51644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (aout && 51744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes (const uint8_t *)aout->mHal.drvState.lod[0].mallocPtr == nullptr) { 51844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes 519f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, 520f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes "rsForEach called with null out allocations"); 521bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams return false; 5224b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5234b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 524f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes if (inLen > 0) { 5254b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes const Allocation *ain0 = ains[0]; 5264b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes const Type *inType = ain0->getType(); 5274b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 528c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.dim.x = inType->getDimX(); 529c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.dim.y = inType->getDimY(); 530c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.dim.z = inType->getDimZ(); 5314b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 5324b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes for (int Index = inLen; --Index >= 1;) { 5334b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes if (!ain0->hasSameDims(ains[Index])) { 5344b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, 535e8f9fba78f0cb79fa8773373a635e30382113a75Yang Ni "Failed to launch kernel; dimensions of input and output" 536e8f9fba78f0cb79fa8773373a635e30382113a75Yang Ni "allocations do not match."); 5374b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 538bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams return false; 5394b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5404b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5414b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 54244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes } else if (aout != nullptr) { 5434b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes const Type *outType = aout->getType(); 5444b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 545c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.dim.x = outType->getDimX(); 546c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.dim.y = outType->getDimY(); 547c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.dim.z = outType->getDimZ(); 5484b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 549a9139c724f8312b3634d213599f2d6b3b2505db2Jason Sams } else if (sc != nullptr) { 550a9139c724f8312b3634d213599f2d6b3b2505db2Jason Sams mtls->fep.dim.x = sc->xEnd; 551a9139c724f8312b3634d213599f2d6b3b2505db2Jason Sams mtls->fep.dim.y = sc->yEnd; 552a9139c724f8312b3634d213599f2d6b3b2505db2Jason Sams mtls->fep.dim.z = 0; 5534b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } else { 554f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, 555f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes "rsForEach called with null allocations"); 556bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams return false; 5574b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5584b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 55944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (inLen > 0 && aout != nullptr) { 5604b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes if (!ains[0]->hasSameDims(aout)) { 5614b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, 5624b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes "Failed to launch kernel; dimensions of input and output allocations do not match."); 5634b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 564bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams return false; 5654b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5664b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5674b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 5684b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes if (!sc || (sc->xEnd == 0)) { 569bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.x = mtls->fep.dim.x; 5704b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } else { 571bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->start.x = rsMin(mtls->fep.dim.x, sc->xStart); 572bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.x = rsMin(mtls->fep.dim.x, sc->xEnd); 573bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (mtls->start.x >= mtls->end.x) return false; 5744b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5754b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 5764b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes if (!sc || (sc->yEnd == 0)) { 577bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.y = mtls->fep.dim.y; 5784b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } else { 579bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->start.y = rsMin(mtls->fep.dim.y, sc->yStart); 580bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.y = rsMin(mtls->fep.dim.y, sc->yEnd); 581bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (mtls->start.y >= mtls->end.y) return false; 5824b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5834b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 5844b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes if (!sc || (sc->zEnd == 0)) { 585bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.z = mtls->fep.dim.z; 5864b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } else { 587bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->start.z = rsMin(mtls->fep.dim.z, sc->zStart); 588bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.z = rsMin(mtls->fep.dim.z, sc->zEnd); 589bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (mtls->start.z >= mtls->end.z) return false; 5904b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 5914b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 592bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (!sc || (sc->arrayEnd == 0)) { 593bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.array[0] = mtls->fep.dim.array[0]; 594bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams } else { 595bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->start.array[0] = rsMin(mtls->fep.dim.array[0], sc->arrayStart); 596bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.array[0] = rsMin(mtls->fep.dim.array[0], sc->arrayEnd); 597bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (mtls->start.array[0] >= mtls->end.array[0]) return false; 598bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams } 5994b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 600bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (!sc || (sc->array2End == 0)) { 601bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.array[1] = mtls->fep.dim.array[1]; 602bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams } else { 603bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->start.array[1] = rsMin(mtls->fep.dim.array[1], sc->array2Start); 604bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.array[1] = rsMin(mtls->fep.dim.array[1], sc->array2End); 605bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (mtls->start.array[1] >= mtls->end.array[1]) return false; 606bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams } 607bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams 608bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (!sc || (sc->array3End == 0)) { 609bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.array[2] = mtls->fep.dim.array[2]; 610bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams } else { 611bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->start.array[2] = rsMin(mtls->fep.dim.array[2], sc->array3Start); 612bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.array[2] = rsMin(mtls->fep.dim.array[2], sc->array3End); 613bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (mtls->start.array[2] >= mtls->end.array[2]) return false; 614bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams } 615bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams 616bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (!sc || (sc->array4End == 0)) { 617bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.array[3] = mtls->fep.dim.array[3]; 618bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams } else { 619bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->start.array[3] = rsMin(mtls->fep.dim.array[3], sc->array4Start); 620bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.array[3] = rsMin(mtls->fep.dim.array[3], sc->array4End); 621bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (mtls->start.array[3] >= mtls->end.array[3]) return false; 622bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams } 623bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams 624bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams 625bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams // The X & Y walkers always want 0-1 min even if dim is not present 626bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.x = rsMax((uint32_t)1, mtls->end.x); 627bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mtls->end.y = rsMax((uint32_t)1, mtls->end.y); 6284b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 6294b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes mtls->rsc = mCtx; 630c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams if (ains) { 631c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams memcpy(mtls->ains, ains, inLen * sizeof(ains[0])); 632c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams } 633c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->aout[0] = aout; 6344b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes mtls->fep.usr = usr; 6354b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes mtls->fep.usrLen = usrLen; 6364b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes mtls->mSliceSize = 1; 6374b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes mtls->mSliceNum = 0; 6384b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 6394b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes mtls->isThreadable = mIsThreadable; 6404b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 641f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes if (inLen > 0) { 642f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes mtls->fep.inLen = inLen; 6434b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes for (int index = inLen; --index >= 0;) { 644c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.inPtr[index] = (const uint8_t*)ains[index]->mHal.drvState.lod[0].mallocPtr; 645c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.inStride[index] = ains[index]->getType()->getElementSizeBytes(); 6464b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 6474b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 6484b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 64944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (aout != nullptr) { 650c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.outPtr[0] = (uint8_t *)aout->mHal.drvState.lod[0].mallocPtr; 651c0d68470b978a79ce024fde56f23ea3690603ccdJason Sams mtls->fep.outStride[0] = aout->getType()->getElementSizeBytes(); 6524b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes } 653bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams 654bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams // All validation passed, ok to launch threads 655bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams return true; 6564b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes} 6574b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 658709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 659709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeForEach(uint32_t slot, 660f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes const Allocation ** ains, 661f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes uint32_t inLen, 662709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Allocation * aout, 663709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const void * usr, 664709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t usrLen, 665709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsScriptCall *sc) { 666709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 667709a0978ae141198018ca9769f8d96292a8928e6Jason Sams MTLaunchStruct mtls; 6684b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 669bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams if (forEachMtlsSetup(ains, inLen, aout, usr, usrLen, sc, &mtls)) { 670bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams forEachKernelSetup(slot, &mtls); 6714b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 672bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); 673bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mCtx->launchThreads(ains, inLen, aout, sc, &mtls); 674bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams mCtx->setTLS(oldTLS); 675bf2111d3b3de310932099514f06924e48fa1d7b2Jason Sams } 6764b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes} 6774b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 678709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::forEachKernelSetup(uint32_t slot, MTLaunchStruct *mtls) { 679709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->script = this; 680709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.slot = slot; 681d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni mtls->kernel = mScriptExec->getForEachFunction(slot); 68244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes rsAssert(mtls->kernel != nullptr); 683d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni mtls->sig = mScriptExec->getForEachSignature(slot); 684709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 685709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 686709a0978ae141198018ca9769f8d96292a8928e6Jason Samsint RsdCpuScriptImpl::invokeRoot() { 687709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); 688709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int ret = mRoot(); 689709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->setTLS(oldTLS); 690709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return ret; 691709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 692709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 693709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeInit() { 694709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mInit) { 695709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mInit(); 696709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 697709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 698709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 699709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFreeChildren() { 700709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mFreeChildren) { 701709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mFreeChildren(); 702709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 703709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 704709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 705709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFunction(uint32_t slot, const void *params, 706709a0978ae141198018ca9769f8d96292a8928e6Jason Sams size_t paramLength) { 707dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar //ALOGE("invoke %i %p %zu", slot, params, paramLength); 708eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen void * ap = nullptr; 709eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen 710eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen#if defined(__x86_64__) 711eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen // The invoked function could have input parameter of vector type for example float4 which 712eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen // requires void* params to be 16 bytes aligned when using SSE instructions for x86_64 platform. 713eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen // So try to align void* params before passing them into RS exported function. 714eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen 715eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen if ((uint8_t)(uint64_t)params & 0x0F) { 716eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen if ((ap = (void*)memalign(16, paramLength)) != nullptr) { 717eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen memcpy(ap, params, paramLength); 718eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen } else { 719e8f9fba78f0cb79fa8773373a635e30382113a75Yang Ni ALOGE("x86_64: invokeFunction memalign error, still use params which" 720e8f9fba78f0cb79fa8773373a635e30382113a75Yang Ni " is not 16 bytes aligned."); 721eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen } 722eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen } 723eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen#endif 724709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 725709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); 726dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar reinterpret_cast<void (*)(const void *, uint32_t)>( 727d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni mScriptExec->getInvokeFunction(slot))(ap? (const void *) ap: params, paramLength); 728eaba5a3ca215729258dcf9ac6f0bb5f88c78f998Yong Chen 729709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->setTLS(oldTLS); 730709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 731709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 732709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVar(uint32_t slot, const void *data, size_t dataLength) { 733709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //rsAssert(!script->mFieldIsObject[slot]); 734dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar //ALOGE("setGlobalVar %i %p %zu", slot, data, dataLength); 735709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 736709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //if (mIntrinsicID) { 737709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //mIntrinsicFuncs.setVar(dc, script, drv->mIntrinsicData, slot, data, dataLength); 738709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //return; 739709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //} 740709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 741d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni int32_t *destPtr = reinterpret_cast<int32_t *>(mScriptExec->getFieldAddress(slot)); 742709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 743709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 744709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 745709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 746709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 747709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memcpy(destPtr, data, dataLength); 748709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 749709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 7509c64239ebbfa4170190ede812e69150035e008e0Tim Murrayvoid RsdCpuScriptImpl::getGlobalVar(uint32_t slot, void *data, size_t dataLength) { 7519c64239ebbfa4170190ede812e69150035e008e0Tim Murray //rsAssert(!script->mFieldIsObject[slot]); 752dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar //ALOGE("getGlobalVar %i %p %zu", slot, data, dataLength); 7539c64239ebbfa4170190ede812e69150035e008e0Tim Murray 754d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni int32_t *srcPtr = reinterpret_cast<int32_t *>(mScriptExec->getFieldAddress(slot)); 7559c64239ebbfa4170190ede812e69150035e008e0Tim Murray if (!srcPtr) { 7569c64239ebbfa4170190ede812e69150035e008e0Tim Murray //ALOGV("Calling setVar on slot = %i which is null", slot); 7579c64239ebbfa4170190ede812e69150035e008e0Tim Murray return; 7589c64239ebbfa4170190ede812e69150035e008e0Tim Murray } 7599c64239ebbfa4170190ede812e69150035e008e0Tim Murray memcpy(data, srcPtr, dataLength); 7609c64239ebbfa4170190ede812e69150035e008e0Tim Murray} 7619c64239ebbfa4170190ede812e69150035e008e0Tim Murray 7629c64239ebbfa4170190ede812e69150035e008e0Tim Murray 763709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength, 764709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const Element *elem, 765ac8d146a41f18afad5314ac8af440d6aedbe20bfStephen Hines const uint32_t *dims, size_t dimLength) { 766d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni int32_t *destPtr = reinterpret_cast<int32_t *>(mScriptExec->getFieldAddress(slot)); 767709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 768709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 769709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 770709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 771709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 772709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // We want to look at dimension in terms of integer components, 773709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // but dimLength is given in terms of bytes. 774709a0978ae141198018ca9769f8d96292a8928e6Jason Sams dimLength /= sizeof(int); 775709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 776709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // Only a single dimension is currently supported. 777709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(dimLength == 1); 778709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (dimLength == 1) { 779709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // First do the increment loop. 780709a0978ae141198018ca9769f8d96292a8928e6Jason Sams size_t stride = elem->getSizeBytes(); 781709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const char *cVal = reinterpret_cast<const char *>(data); 782ac8d146a41f18afad5314ac8af440d6aedbe20bfStephen Hines for (uint32_t i = 0; i < dims[0]; i++) { 783709a0978ae141198018ca9769f8d96292a8928e6Jason Sams elem->incRefs(cVal); 784709a0978ae141198018ca9769f8d96292a8928e6Jason Sams cVal += stride; 785709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 786709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 787709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // Decrement loop comes after (to prevent race conditions). 788709a0978ae141198018ca9769f8d96292a8928e6Jason Sams char *oldVal = reinterpret_cast<char *>(destPtr); 789ac8d146a41f18afad5314ac8af440d6aedbe20bfStephen Hines for (uint32_t i = 0; i < dims[0]; i++) { 790709a0978ae141198018ca9769f8d96292a8928e6Jason Sams elem->decRefs(oldVal); 791709a0978ae141198018ca9769f8d96292a8928e6Jason Sams oldVal += stride; 792709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 793709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 794709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 795709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memcpy(destPtr, data, dataLength); 796709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 797709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 798709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalBind(uint32_t slot, Allocation *data) { 799709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 800709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //rsAssert(!script->mFieldIsObject[slot]); 801dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar //ALOGE("setGlobalBind %i %p", slot, data); 802709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 803d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni int32_t *destPtr = reinterpret_cast<int32_t *>(mScriptExec->getFieldAddress(slot)); 804709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 805709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 806709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 807709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 808709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 80944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes void *ptr = nullptr; 810709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mBoundAllocs[slot] = data; 811dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar if (data) { 812709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ptr = data->mHal.drvState.lod[0].mallocPtr; 813709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 814709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memcpy(destPtr, &ptr, sizeof(void *)); 815709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 816709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 817709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalObj(uint32_t slot, ObjectBase *data) { 818709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 819709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //rsAssert(script->mFieldIsObject[slot]); 820dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar //ALOGE("setGlobalObj %i %p", slot, data); 821709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 822d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni int32_t *destPtr = reinterpret_cast<int32_t *>(mScriptExec->getFieldAddress(slot)); 823709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 824709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 825709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 826709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 827709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 82805ef73f2d934f1083cc3b8aeb33fe21de9d6e88fJason Sams rsrSetObject(mCtx->getContext(), (rs_object_base *)destPtr, data); 829709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 830709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 831062c287f573ecc06c38ee4295e5627e12c52ac3dYang Niconst char* RsdCpuScriptImpl::getFieldName(uint32_t slot) const { 832062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni return mScriptExec->getFieldName(slot); 833062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni} 834062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni 835709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl::~RsdCpuScriptImpl() { 836110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 837709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mCompilerDriver) { 838709a0978ae141198018ca9769f8d96292a8928e6Jason Sams delete mCompilerDriver; 839709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 84045e753a46e587c69b3b0d0c5138e88715a24a29aStephen Hines#endif 841dc0d8f7c0f1f43f25c34fbc04656ad578f6e953bPirama Arumuga Nainar 842d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni if (mScriptExec != nullptr) { 843d9bae689c1b8c3f2ed1a5f2b374dc9393584b8ddYang Ni delete mScriptExec; 844110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 845110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mBoundAllocs) delete[] mBoundAllocs; 846110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO) { 847110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams dlclose(mScriptSO); 848110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 849aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar 850aa6757ffc1b23d771566439c3179fdbc1e5ba569Pirama Arumuga Nainar delete[] mBuildChecksum; 851709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 852709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 853709a0978ae141198018ca9769f8d96292a8928e6Jason SamsAllocation * RsdCpuScriptImpl::getAllocationForPointer(const void *ptr) const { 854709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!ptr) { 85544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 856709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 857709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 858709a0978ae141198018ca9769f8d96292a8928e6Jason Sams for (uint32_t ct=0; ct < mScript->mHal.info.exportedVariableCount; ct++) { 859709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Allocation *a = mBoundAllocs[ct]; 860709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!a) continue; 861709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (a->mHal.drvState.lod[0].mallocPtr == ptr) { 862709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return a; 863709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 864709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 865709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("rsGetAllocation, failed to find %p", ptr); 86644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 867709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 868709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 869f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailesvoid RsdCpuScriptImpl::preLaunch(uint32_t slot, const Allocation ** ains, 870f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes uint32_t inLen, Allocation * aout, 871f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes const void * usr, uint32_t usrLen, 872f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes const RsScriptCall *sc) {} 87317e3cdc24776d8fdbf1ce16287b9b4dcd516708fJason Sams 874f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailesvoid RsdCpuScriptImpl::postLaunch(uint32_t slot, const Allocation ** ains, 875f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes uint32_t inLen, Allocation * aout, 876f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes const void * usr, uint32_t usrLen, 877f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes const RsScriptCall *sc) {} 87817e3cdc24776d8fdbf1ce16287b9b4dcd516708fJason Sams 879709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 880709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 881709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 882