Separate libRS.so into public and internal libs

Bug: 26546579

libRS_internal.so is not going to be whitelisted by the NDK linker,
therefore loadable only by the internal implementation, but not any
application code.

libRS is going to contain only publicly exported functions, i.e. the
functions declared in frameworks/rs/rs.h, including those in
rsApiFuncDecl.h (generated from rs.spec).

Change-Id: Iac58695316edc9aff87ade2bac3b4a44d1a68b23
(cherry picked from commit 85d0cb112010781ad07b5979f0824b7f0ae3987e)
diff --git a/Android.mk b/Android.mk
index 3488f73..3b4194d 100644
--- a/Android.mk
+++ b/Android.mk
@@ -45,7 +45,7 @@
 	driver/rsdVertexArray.cpp
 
 
-LOCAL_SHARED_LIBRARIES += libRS libRSCpuRef
+LOCAL_SHARED_LIBRARIES += libRS_internal libRSCpuRef
 LOCAL_SHARED_LIBRARIES += liblog libcutils libutils libEGL libGLESv1_CM libGLESv2
 LOCAL_SHARED_LIBRARIES += libui libgui libsync
 
@@ -88,7 +88,7 @@
 
 include $(CLEAR_VARS)
 LOCAL_CLANG := true
-LOCAL_MODULE := libRS
+LOCAL_MODULE := libRS_internal
 LOCAL_MODULE_TARGET_ARCH_WARN := arm mips mips64 x86 x86_64 arm64
 
 LOCAL_MODULE_CLASS := SHARED_LIBRARIES
@@ -114,7 +114,6 @@
 # Generate custom source files
 
 GEN := $(addprefix $(generated_sources)/, \
-            rsgApi.cpp \
             rsgApiReplay.cpp \
         )
 
@@ -190,6 +189,73 @@
 
 include $(BUILD_SHARED_LIBRARY)
 
+include $(CLEAR_VARS)
+LOCAL_CLANG := true
+LOCAL_MODULE := libRS
+LOCAL_MODULE_TARGET_ARCH_WARN := arm mips mips64 x86 x86_64 arm64
+
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+generated_sources:= $(local-generated-sources-dir)
+
+# Generate custom headers
+
+GEN := $(addprefix $(generated_sources)/, \
+            rsgApiStructs.h \
+            rsgApiFuncDecl.h \
+        )
+
+$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
+$(GEN) : PRIVATE_CUSTOM_TOOL = cat $(PRIVATE_PATH)/rs.spec $(PRIVATE_PATH)/rsg.spec | $(RSG_GENERATOR) $< $@
+$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec $(LOCAL_PATH)/rsg.spec
+$(GEN): $(generated_sources)/%.h : $(LOCAL_PATH)/%.h.rsg
+	$(transform-generated-source)
+
+# used in jni/Android.mk
+rs_generated_source += $(GEN)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+# Generate custom source files
+
+GEN := $(addprefix $(generated_sources)/, \
+            rsgApi.cpp \
+        )
+
+$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
+$(GEN) : PRIVATE_CUSTOM_TOOL = cat $(PRIVATE_PATH)/rs.spec $(PRIVATE_PATH)/rsg.spec | $(RSG_GENERATOR) $< $@
+$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec $(LOCAL_PATH)/rsg.spec
+$(GEN): $(generated_sources)/%.cpp : $(LOCAL_PATH)/%.cpp.rsg
+	$(transform-generated-source)
+
+# used in jni/Android.mk
+rs_generated_source += $(GEN)
+
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+LOCAL_SRC_FILES:= \
+	rsApiAllocation.cpp \
+	rsApiContext.cpp \
+	rsApiDevice.cpp \
+	rsApiElement.cpp \
+	rsApiFileA3D.cpp \
+	rsApiMesh.cpp \
+	rsApiType.cpp \
+
+LOCAL_SHARED_LIBRARIES += libRS_internal
+LOCAL_SHARED_LIBRARIES += liblog
+
+LOCAL_CFLAGS += $(rs_base_CFLAGS)
+# TODO: external/freetype still uses the register keyword
+# Bug: 17163086
+LOCAL_CFLAGS += -Wno-deprecated-register
+
+LOCAL_CPPFLAGS += -fno-exceptions
+
+LOCAL_LDFLAGS += -Wl,--version-script,${LOCAL_PATH}/libRS.map
+
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_SHARED_LIBRARY)
+
 # Now build a host version for serialization
 include $(CLEAR_VARS)
 LOCAL_MODULE:= libRS
diff --git a/cpu_ref/Android.mk b/cpu_ref/Android.mk
index 750bf11..ad5d097 100644
--- a/cpu_ref/Android.mk
+++ b/cpu_ref/Android.mk
@@ -76,7 +76,7 @@
     rsCpuIntrinsics_x86.cpp
 endif
 
-LOCAL_SHARED_LIBRARIES += libRS libcutils libutils liblog libsync libc++ libdl libz
+LOCAL_SHARED_LIBRARIES += libRS_internal libcutils libutils liblog libsync libc++ libdl libz
 
 LOCAL_SHARED_LIBRARIES += libbcinfo libblas
 LOCAL_STATIC_LIBRARIES := libbnnmlowp
diff --git a/libRS.map b/libRS.map
new file mode 100644
index 0000000..4440ad9
--- /dev/null
+++ b/libRS.map
@@ -0,0 +1,121 @@
+libRS {
+  global:
+    rsaAllocationGetType;
+    rsaElementGetNativeData;
+    rsaElementGetSubElements;
+    rsaGetName;
+    rsAllocation1DData;
+    rsAllocation1DElementData;
+    rsAllocation1DRead;
+    rsAllocation2DData;
+    rsAllocation2DRead;
+    rsAllocation3DData;
+    rsAllocation3DRead;
+    rsAllocationAdapterCreate;
+    rsAllocationAdapterOffset;
+    rsAllocationCopy2DRange;
+    rsAllocationCopy3DRange;
+    rsAllocationCopyToBitmap;
+    rsAllocationCreateFromBitmap;
+    rsAllocationCreateTyped;
+    rsAllocationCubeCreateFromBitmap;
+    rsAllocationElementData;
+    rsAllocationElementRead;
+    rsAllocationGenerateMipmaps;
+    rsAllocationGetPointer;
+    rsAllocationGetSurface;
+    rsAllocationIoReceive;
+    rsAllocationIoSend;
+    rsAllocationRead;
+    rsAllocationResize1D;
+    rsAllocationSetSurface;
+    rsAllocationSetupBufferQueue;
+    rsAllocationShareBufferQueue;
+    rsAllocationSyncAll;
+    rsAssignName;
+    rsaTypeGetNativeData;
+    rsClosureCreate;
+    rsClosureSetArg;
+    rsClosureSetGlobal;
+    rsContextBindProgramFragment;
+    rsContextBindProgramRaster;
+    rsContextBindProgramStore;
+    rsContextBindProgramVertex;
+    rsContextBindRootScript;
+    rsContextCreate;
+    rsContextDeinitToClient;
+    rsContextDestroy;
+    rsContextDestroyWorker;
+    rsContextDump;
+    rsContextFinish;
+    rsContextGetMessage;
+    rsContextInitToClient;
+    rsContextPause;
+    rsContextPeekMessage;
+    rsContextResume;
+    rsContextSendMessage;
+    rsContextSetCacheDir;
+    rsContextSetPriority;
+    rsContextSetSurface;
+    rsDeviceCreate;
+    rsDeviceDestroy;
+    rsDeviceSetConfig;
+    rsElementCreate;
+    rsElementCreate2;
+    rsFontCreateFromFile;
+    rsFontCreateFromMemory;
+    rsInvokeClosureCreate;
+    rsMeshCreate;
+    rsObjDestroy;
+    rsProgramBindConstants;
+    rsProgramBindSampler;
+    rsProgramBindTexture;
+    rsProgramFragmentCreate;
+    rsProgramRasterCreate;
+    rsProgramStoreCreate;
+    rsProgramVertexCreate;
+    rsSamplerCreate;
+    rsScriptBindAllocation;
+    rsScriptCCreate;
+    rsScriptFieldIDCreate;
+    rsScriptForEach;
+    rsScriptForEachMulti;
+    rsScriptGetVarV;
+    rsScriptGroup2Create;
+    rsScriptGroup2Create;
+    rsScriptGroupCreate;
+    rsScriptGroupExecute;
+    rsScriptGroupSetInput;
+    rsScriptGroupSetOutput;
+    rsScriptIntrinsicCreate;
+    rsScriptInvoke;
+    rsScriptInvokeIDCreate;
+    rsScriptInvokeV;
+    rsScriptKernelIDCreate;
+    rsScriptReduce;
+    rsScriptReduceNew;
+    rsScriptSetTimeZone;
+    rsScriptSetVarD;
+    rsScriptSetVarF;
+    rsScriptSetVarI;
+    rsScriptSetVarJ;
+    rsScriptSetVarObj;
+    rsScriptSetVarV;
+    rsScriptSetVarVE;
+    rsTypeCreate;
+    rsTypeCreate2;
+    _Z24rsaFileA3DCreateFromFilePvPKc;
+    _Z25rsaFileA3DCreateFromAssetPvS_;
+    _Z25rsaFileA3DGetEntryByIndexPvjS_;
+    _Z25rsaFileA3DGetIndexEntriesPvP16RsFileIndexEntryjS_;
+    _Z26rsaFileA3DCreateFromMemoryPvPKvj;
+    _Z28rsaFileA3DGetNumIndexEntriesPvPiS_;
+    _Z17rsaMeshGetIndicesPvS_PS_Pjj;
+    _Z18rsaMeshGetVerticesPvS_PS_j;
+    _Z20rsaMeshGetIndexCountPvS_Pi;
+    _Z27rsaMeshGetVertexBufferCountPvS_Pi;
+    _Z17rsContextCreateGLPvjj15RsSurfaceConfigj;
+
+  local:
+    *;
+};
diff --git a/rsAllocation.cpp b/rsAllocation.cpp
index 13a3848..8b6de66 100644
--- a/rsAllocation.cpp
+++ b/rsAllocation.cpp
@@ -984,10 +984,3 @@
 
 }
 }
-
-extern "C" const void * rsaAllocationGetType(RsContext con, RsAllocation va) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->getType()->incUserRef();
-
-    return a->getType();
-}
diff --git a/rsApiAllocation.cpp b/rsApiAllocation.cpp
new file mode 100644
index 0000000..84d5692
--- /dev/null
+++ b/rsApiAllocation.cpp
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsContext.h"
+#include "rsAllocation.h"
+
+using namespace android;
+using namespace android::renderscript;
+
+extern "C" const void * rsaAllocationGetType(RsContext con, RsAllocation va) {
+    Allocation *a = static_cast<Allocation *>(va);
+    a->getType()->incUserRef();
+
+    return a->getType();
+}
diff --git a/rsApiContext.cpp b/rsApiContext.cpp
new file mode 100644
index 0000000..a5c7c3f
--- /dev/null
+++ b/rsApiContext.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsDevice.h"
+#include "rsContext.h"
+#include "rsThreadIO.h"
+#include "rsgApiStructs.h"
+#include "rsgApiFuncDecl.h"
+#include "rsFifo.h"
+
+using namespace android;
+using namespace android::renderscript;
+
+extern "C" RsContext rsContextCreate(RsDevice vdev, uint32_t version, uint32_t sdkVersion,
+                                      RsContextType ct, uint32_t flags) {
+    //ALOGV("rsContextCreate dev=%p", vdev);
+    Device * dev = static_cast<Device *>(vdev);
+    Context *rsc = Context::createContext(dev, nullptr, ct, flags);
+    if (rsc) {
+        rsc->setTargetSdkVersion(sdkVersion);
+    }
+    return rsc;
+}
+
+extern "C" void rsaContextSetNativeLibDir(RsContext con, char *libDir, size_t length) {
+#ifdef RS_COMPATIBILITY_LIB
+    Context *rsc = static_cast<Context *>(con);
+    rsc->setNativeLibDir(libDir, length);
+#endif
+}
+
+#ifndef RS_COMPATIBILITY_LIB
+RsContext rsContextCreateGL(RsDevice vdev, uint32_t version,
+                            uint32_t sdkVersion, RsSurfaceConfig sc,
+                            uint32_t dpi) {
+    //ALOGV("rsContextCreateGL dev=%p", vdev);
+    Device * dev = static_cast<Device *>(vdev);
+    Context *rsc = Context::createContext(dev, &sc);
+    if (rsc) {
+        rsc->setTargetSdkVersion(sdkVersion);
+        rsc->setDPI(dpi);
+    }
+    //ALOGV("%p rsContextCreateGL ret", rsc);
+    return rsc;
+}
+#endif
+
+// Only to be called at a3d load time, before object is visible to user
+// not thread safe
+extern "C" void rsaGetName(RsContext con, void * obj, const char **name) {
+    ObjectBase *ob = static_cast<ObjectBase *>(obj);
+    (*name) = ob->getName();
+}
diff --git a/rsApiDevice.cpp b/rsApiDevice.cpp
new file mode 100644
index 0000000..0dc1270
--- /dev/null
+++ b/rsApiDevice.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsDevice.h"
+#include "rsContext.h"
+#include "rsThreadIO.h"
+#include "rsgApiStructs.h"
+#include "rsgApiFuncDecl.h"
+#include "rsFifo.h"
+
+using namespace android;
+using namespace android::renderscript;
+
+extern "C" RsDevice rsDeviceCreate() {
+    Device * d = new Device();
+    return d;
+}
+
+extern "C" void rsDeviceDestroy(RsDevice dev) {
+    Device * d = static_cast<Device *>(dev);
+    delete d;
+}
+
+extern "C" void rsDeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value) {
+    Device * d = static_cast<Device *>(dev);
+    if (p == RS_DEVICE_PARAM_FORCE_SOFTWARE_GL) {
+        d->mForceSW = value != 0;
+        return;
+    }
+    rsAssert(0);
+}
diff --git a/rsApiElement.cpp b/rsApiElement.cpp
new file mode 100644
index 0000000..868716b
--- /dev/null
+++ b/rsApiElement.cpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsContext.h"
+
+using namespace android;
+using namespace android::renderscript;
+
+extern "C" void rsaElementGetNativeData(RsContext con, RsElement elem,
+                             uint32_t *elemData, uint32_t elemDataSize) {
+    rsAssert(elemDataSize == 5);
+    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
+    Element *e = static_cast<Element *>(elem);
+
+    (*elemData++) = (uint32_t)e->getType();
+    (*elemData++) = (uint32_t)e->getKind();
+    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
+    (*elemData++) = e->getComponent().getVectorSize();
+    (*elemData++) = e->getFieldCount();
+}
+
+extern "C" void rsaElementGetSubElements(RsContext con, RsElement elem, uintptr_t *ids,
+                              const char **names, size_t *arraySizes, uint32_t dataSize) {
+    Element *e = static_cast<Element *>(elem);
+    rsAssert(e->getFieldCount() == dataSize);
+
+    for (uint32_t i = 0; i < dataSize; i ++) {
+        e->getField(i)->incUserRef();
+        ids[i] = (uintptr_t)e->getField(i);
+        names[i] = e->getFieldName(i);
+        arraySizes[i] = e->getFieldArraySize(i);
+    }
+}
diff --git a/rsApiFileA3D.cpp b/rsApiFileA3D.cpp
new file mode 100644
index 0000000..d6eee8a
--- /dev/null
+++ b/rsApiFileA3D.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsContext.h"
+#include "rsFileA3D.h"
+
+using namespace android;
+using namespace android::renderscript;
+
+RsObjectBase rsaFileA3DGetEntryByIndex(RsContext con, uint32_t index, RsFile file) {
+    FileA3D *fa3d = static_cast<FileA3D *>(file);
+    if (!fa3d) {
+        ALOGE("Can't load entry. No valid file");
+        return nullptr;
+    }
+
+    ObjectBase *obj = fa3d->initializeFromEntry(index);
+    //ALOGV("Returning object with name %s", obj->getName());
+
+    return obj;
+}
+
+
+void rsaFileA3DGetNumIndexEntries(RsContext con, int32_t *numEntries, RsFile file) {
+    FileA3D *fa3d = static_cast<FileA3D *>(file);
+
+    if (fa3d) {
+        *numEntries = fa3d->getNumIndexEntries();
+    } else {
+        *numEntries = 0;
+    }
+}
+
+void rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uint32_t numEntries, RsFile file) {
+    FileA3D *fa3d = static_cast<FileA3D *>(file);
+
+    if (!fa3d) {
+        ALOGE("Can't load index entries. No valid file");
+        return;
+    }
+
+    uint32_t numFileEntries = fa3d->getNumIndexEntries();
+    if (numFileEntries != numEntries || numEntries == 0 || fileEntries == nullptr) {
+        ALOGE("Can't load index entries. Invalid number requested");
+        return;
+    }
+
+    for (uint32_t i = 0; i < numFileEntries; i ++) {
+        const FileA3D::A3DIndexEntry *entry = fa3d->getIndexEntry(i);
+        fileEntries[i].classID = entry->getType();
+        fileEntries[i].objectName = rsuCopyString(entry->getObjectName());
+    }
+}
+
+RsFile rsaFileA3DCreateFromMemory(RsContext con, const void *data, uint32_t len) {
+    if (data == nullptr) {
+        ALOGE("File load failed. Asset stream is nullptr");
+        return nullptr;
+    }
+
+    Context *rsc = static_cast<Context *>(con);
+    FileA3D *fa3d = new FileA3D(rsc);
+    fa3d->incUserRef();
+
+    fa3d->load(data, len);
+    return fa3d;
+}
+
+RsFile rsaFileA3DCreateFromAsset(RsContext con, void *_asset) {
+#if !defined(__RS_PDK__)
+    Context *rsc = static_cast<Context *>(con);
+    Asset *asset = static_cast<Asset *>(_asset);
+    FileA3D *fa3d = new FileA3D(rsc);
+    fa3d->incUserRef();
+
+    fa3d->load(asset);
+    return fa3d;
+#else
+    return nullptr;
+#endif
+}
+
+RsFile rsaFileA3DCreateFromFile(RsContext con, const char *path) {
+    if (path == nullptr) {
+        ALOGE("File load failed. Path is nullptr");
+        return nullptr;
+    }
+
+    Context *rsc = static_cast<Context *>(con);
+    FileA3D *fa3d = nullptr;
+
+    FILE *f = fopen(path, "rb");
+    if (f) {
+        fa3d = new FileA3D(rsc);
+        fa3d->incUserRef();
+        fa3d->load(f);
+        fclose(f);
+    } else {
+        ALOGE("Could not open file %s", path);
+    }
+
+    return fa3d;
+}
diff --git a/rsApiMesh.cpp b/rsApiMesh.cpp
new file mode 100644
index 0000000..a5ef5f1
--- /dev/null
+++ b/rsApiMesh.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsContext.h"
+#include "rsMesh.h"
+
+using namespace android;
+using namespace android::renderscript;
+
+void rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) {
+    Mesh *sm = static_cast<Mesh *>(mv);
+    *numVtx = sm->mHal.state.vertexBuffersCount;
+}
+
+void rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) {
+    Mesh *sm = static_cast<Mesh *>(mv);
+    *numIdx = sm->mHal.state.primitivesCount;
+}
+
+void rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) {
+    Mesh *sm = static_cast<Mesh *>(mv);
+    rsAssert(vtxDataCount == sm->mHal.state.vertexBuffersCount);
+
+    for (uint32_t ct = 0; ct < vtxDataCount; ct ++) {
+        vtxData[ct] = sm->mHal.state.vertexBuffers[ct];
+        sm->mHal.state.vertexBuffers[ct]->incUserRef();
+    }
+}
+
+void rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) {
+    Mesh *sm = static_cast<Mesh *>(mv);
+    rsAssert(idxDataCount == sm->mHal.state.primitivesCount);
+
+    for (uint32_t ct = 0; ct < idxDataCount; ct ++) {
+        va[ct] = sm->mHal.state.indexBuffers[ct];
+        primType[ct] = sm->mHal.state.primitives[ct];
+        if (sm->mHal.state.indexBuffers[ct]) {
+            sm->mHal.state.indexBuffers[ct]->incUserRef();
+        }
+    }
+}
diff --git a/rsApiType.cpp b/rsApiType.cpp
new file mode 100644
index 0000000..856a520
--- /dev/null
+++ b/rsApiType.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsContext.h"
+
+#if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB)
+#include "system/graphics.h"
+#endif
+
+#ifdef RS_COMPATIBILITY_LIB
+#include "rsCompatibilityLib.h"
+#endif
+
+using namespace android;
+using namespace android::renderscript;
+
+extern "C" void rsaTypeGetNativeData(RsContext con, RsType type, uintptr_t *typeData, uint32_t typeDataSize) {
+    rsAssert(typeDataSize == 6);
+    // Pack the data in the follofing way mHal.state.dimX; mHal.state.dimY; mHal.state.dimZ;
+    // mHal.state.lodCount; mHal.state.faces; mElement; into typeData
+    Type *t = static_cast<Type *>(type);
+
+    (*typeData++) = t->getDimX();
+    (*typeData++) = t->getDimY();
+    (*typeData++) = t->getDimZ();
+    (*typeData++) = t->getDimLOD() ? 1 : 0;
+    (*typeData++) = t->getDimFaces() ? 1 : 0;
+    (*typeData++) = (uintptr_t)t->getElement();
+    t->getElement()->incUserRef();
+}
diff --git a/rsContext.cpp b/rsContext.cpp
index dba9767..3eb7216 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -876,7 +876,7 @@
 
 void rsi_ContextDestroy(Context *rsc) {
     //ALOGE("%p rsContextDestroy", rsc);
-    rsContextDestroyWorker(rsc);
+    rsc->destroyWorkerThreadResources();
     delete rsc;
     //ALOGV("%p rsContextDestroy done", rsc);
 }
@@ -935,44 +935,3 @@
 
 }
 }
-
-extern "C" RsContext rsContextCreate(RsDevice vdev, uint32_t version, uint32_t sdkVersion,
-                                     RsContextType ct, uint32_t flags) {
-    //ALOGV("rsContextCreate dev=%p", vdev);
-    Device * dev = static_cast<Device *>(vdev);
-    Context *rsc = Context::createContext(dev, nullptr, ct, flags);
-    if (rsc) {
-        rsc->setTargetSdkVersion(sdkVersion);
-    }
-    return rsc;
-}
-
-extern "C" void rsaContextSetNativeLibDir(RsContext con, char *libDir, size_t length) {
-#ifdef RS_COMPATIBILITY_LIB
-    Context *rsc = static_cast<Context *>(con);
-    rsc->setNativeLibDir(libDir, length);
-#endif
-}
-
-#ifndef RS_COMPATIBILITY_LIB
-RsContext rsContextCreateGL(RsDevice vdev, uint32_t version,
-                            uint32_t sdkVersion, RsSurfaceConfig sc,
-                            uint32_t dpi) {
-    //ALOGV("rsContextCreateGL dev=%p", vdev);
-    Device * dev = static_cast<Device *>(vdev);
-    Context *rsc = Context::createContext(dev, &sc);
-    if (rsc) {
-        rsc->setTargetSdkVersion(sdkVersion);
-        rsc->setDPI(dpi);
-    }
-    //ALOGV("%p rsContextCreateGL ret", rsc);
-    return rsc;
-}
-#endif
-
-// Only to be called at a3d load time, before object is visible to user
-// not thread safe
-void rsaGetName(RsContext con, void * obj, const char **name) {
-    ObjectBase *ob = static_cast<ObjectBase *>(obj);
-    (*name) = ob->getName();
-}
diff --git a/rsDevice.cpp b/rsDevice.cpp
index 2688890..cda71a4 100644
--- a/rsDevice.cpp
+++ b/rsDevice.cpp
@@ -39,23 +39,3 @@
         }
     }
 }
-
-extern "C" RsDevice rsDeviceCreate() {
-    Device * d = new Device();
-    return d;
-}
-
-extern "C" void rsDeviceDestroy(RsDevice dev) {
-    Device * d = static_cast<Device *>(dev);
-    delete d;
-}
-
-extern "C" void rsDeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value) {
-    Device * d = static_cast<Device *>(dev);
-    if (p == RS_DEVICE_PARAM_FORCE_SOFTWARE_GL) {
-        d->mForceSW = value != 0;
-        return;
-    }
-    rsAssert(0);
-}
-
diff --git a/rsElement.cpp b/rsElement.cpp
index a734400..4d831ac 100644
--- a/rsElement.cpp
+++ b/rsElement.cpp
@@ -435,29 +435,3 @@
 
 }
 }
-
-extern "C" void rsaElementGetNativeData(RsContext con, RsElement elem,
-                             uint32_t *elemData, uint32_t elemDataSize) {
-    rsAssert(elemDataSize == 5);
-    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
-    Element *e = static_cast<Element *>(elem);
-
-    (*elemData++) = (uint32_t)e->getType();
-    (*elemData++) = (uint32_t)e->getKind();
-    (*elemData++) = e->getComponent().getIsNormalized() ? 1 : 0;
-    (*elemData++) = e->getComponent().getVectorSize();
-    (*elemData++) = e->getFieldCount();
-}
-
-extern "C" void rsaElementGetSubElements(RsContext con, RsElement elem, uintptr_t *ids,
-                              const char **names, size_t *arraySizes, uint32_t dataSize) {
-    Element *e = static_cast<Element *>(elem);
-    rsAssert(e->getFieldCount() == dataSize);
-
-    for (uint32_t i = 0; i < dataSize; i ++) {
-        e->getField(i)->incUserRef();
-        ids[i] = (uintptr_t)e->getField(i);
-        names[i] = e->getFieldName(i);
-        arraySizes[i] = e->getFieldArraySize(i);
-    }
-}
diff --git a/rsFileA3D.cpp b/rsFileA3D.cpp
index a7b1e27..91e92f1 100644
--- a/rsFileA3D.cpp
+++ b/rsFileA3D.cpp
@@ -391,97 +391,3 @@
     mWriteStream->align(4);
 }
 
-RsObjectBase rsaFileA3DGetEntryByIndex(RsContext con, uint32_t index, RsFile file) {
-    FileA3D *fa3d = static_cast<FileA3D *>(file);
-    if (!fa3d) {
-        ALOGE("Can't load entry. No valid file");
-        return nullptr;
-    }
-
-    ObjectBase *obj = fa3d->initializeFromEntry(index);
-    //ALOGV("Returning object with name %s", obj->getName());
-
-    return obj;
-}
-
-
-void rsaFileA3DGetNumIndexEntries(RsContext con, int32_t *numEntries, RsFile file) {
-    FileA3D *fa3d = static_cast<FileA3D *>(file);
-
-    if (fa3d) {
-        *numEntries = fa3d->getNumIndexEntries();
-    } else {
-        *numEntries = 0;
-    }
-}
-
-void rsaFileA3DGetIndexEntries(RsContext con, RsFileIndexEntry *fileEntries, uint32_t numEntries, RsFile file) {
-    FileA3D *fa3d = static_cast<FileA3D *>(file);
-
-    if (!fa3d) {
-        ALOGE("Can't load index entries. No valid file");
-        return;
-    }
-
-    uint32_t numFileEntries = fa3d->getNumIndexEntries();
-    if (numFileEntries != numEntries || numEntries == 0 || fileEntries == nullptr) {
-        ALOGE("Can't load index entries. Invalid number requested");
-        return;
-    }
-
-    for (uint32_t i = 0; i < numFileEntries; i ++) {
-        const FileA3D::A3DIndexEntry *entry = fa3d->getIndexEntry(i);
-        fileEntries[i].classID = entry->getType();
-        fileEntries[i].objectName = rsuCopyString(entry->getObjectName());
-    }
-}
-
-RsFile rsaFileA3DCreateFromMemory(RsContext con, const void *data, uint32_t len) {
-    if (data == nullptr) {
-        ALOGE("File load failed. Asset stream is nullptr");
-        return nullptr;
-    }
-
-    Context *rsc = static_cast<Context *>(con);
-    FileA3D *fa3d = new FileA3D(rsc);
-    fa3d->incUserRef();
-
-    fa3d->load(data, len);
-    return fa3d;
-}
-
-RsFile rsaFileA3DCreateFromAsset(RsContext con, void *_asset) {
-#if !defined(__RS_PDK__)
-    Context *rsc = static_cast<Context *>(con);
-    Asset *asset = static_cast<Asset *>(_asset);
-    FileA3D *fa3d = new FileA3D(rsc);
-    fa3d->incUserRef();
-
-    fa3d->load(asset);
-    return fa3d;
-#else
-    return nullptr;
-#endif
-}
-
-RsFile rsaFileA3DCreateFromFile(RsContext con, const char *path) {
-    if (path == nullptr) {
-        ALOGE("File load failed. Path is nullptr");
-        return nullptr;
-    }
-
-    Context *rsc = static_cast<Context *>(con);
-    FileA3D *fa3d = nullptr;
-
-    FILE *f = fopen(path, "rb");
-    if (f) {
-        fa3d = new FileA3D(rsc);
-        fa3d->incUserRef();
-        fa3d->load(f);
-        fclose(f);
-    } else {
-        ALOGE("Could not open file %s", path);
-    }
-
-    return fa3d;
-}
diff --git a/rsMesh.cpp b/rsMesh.cpp
index 08d85fb..f6fbaf6 100644
--- a/rsMesh.cpp
+++ b/rsMesh.cpp
@@ -288,36 +288,3 @@
 }
 
 }}
-
-void rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) {
-    Mesh *sm = static_cast<Mesh *>(mv);
-    *numVtx = sm->mHal.state.vertexBuffersCount;
-}
-
-void rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) {
-    Mesh *sm = static_cast<Mesh *>(mv);
-    *numIdx = sm->mHal.state.primitivesCount;
-}
-
-void rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) {
-    Mesh *sm = static_cast<Mesh *>(mv);
-    rsAssert(vtxDataCount == sm->mHal.state.vertexBuffersCount);
-
-    for (uint32_t ct = 0; ct < vtxDataCount; ct ++) {
-        vtxData[ct] = sm->mHal.state.vertexBuffers[ct];
-        sm->mHal.state.vertexBuffers[ct]->incUserRef();
-    }
-}
-
-void rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) {
-    Mesh *sm = static_cast<Mesh *>(mv);
-    rsAssert(idxDataCount == sm->mHal.state.primitivesCount);
-
-    for (uint32_t ct = 0; ct < idxDataCount; ct ++) {
-        va[ct] = sm->mHal.state.indexBuffers[ct];
-        primType[ct] = sm->mHal.state.primitives[ct];
-        if (sm->mHal.state.indexBuffers[ct]) {
-            sm->mHal.state.indexBuffers[ct]->incUserRef();
-        }
-    }
-}
diff --git a/rsType.cpp b/rsType.cpp
index d45de2d..25473eb 100644
--- a/rsType.cpp
+++ b/rsType.cpp
@@ -383,18 +383,3 @@
 
 }
 }
-
-extern "C" void rsaTypeGetNativeData(RsContext con, RsType type, uintptr_t *typeData, uint32_t typeDataSize) {
-    rsAssert(typeDataSize == 6);
-    // Pack the data in the follofing way mHal.state.dimX; mHal.state.dimY; mHal.state.dimZ;
-    // mHal.state.lodCount; mHal.state.faces; mElement; into typeData
-    Type *t = static_cast<Type *>(type);
-
-    (*typeData++) = t->getDimX();
-    (*typeData++) = t->getDimY();
-    (*typeData++) = t->getDimZ();
-    (*typeData++) = t->getDimLOD() ? 1 : 0;
-    (*typeData++) = t->getDimFaces() ? 1 : 0;
-    (*typeData++) = (uintptr_t)t->getElement();
-    t->getElement()->incUserRef();
-}