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