diff --git a/CleanSpec.mk b/CleanSpec.mk
index d74d7b1..1cd5d01 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -119,6 +119,13 @@
 $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/media/audio/)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/content)
 $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/src/android/content)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/*/src/renderscript)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/*/src/renderscript)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/*/src/RenderScript.stamp)
+$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/*/src/RenderScript.stamp)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libRS_intermediates)
+$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libRSDriver_intermediates)
+$(call add-clean-step, rm -rf $(OUT_DIR)/host/$(HOST_PREBUILT_TAG)/obj/STATIC_LIBRARIES/libRS_intermediates)
 # ************************************************
 # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
 # ************************************************
diff --git a/graphics/jni/Android.mk b/graphics/jni/Android.mk
index ca69e1e..e85a23c 100644
--- a/graphics/jni/Android.mk
+++ b/graphics/jni/Android.mk
@@ -21,7 +21,7 @@
 
 LOCAL_C_INCLUDES += \
 	$(JNI_H_INCLUDE) \
-	$(LOCAL_PATH)/../../libs/rs \
+	frameworks/rs \
 	$(rs_generated_include_dir) \
 	$(call include-path-for, corecg graphics)
 
diff --git a/libs/rs/Allocation.cpp b/libs/rs/Allocation.cpp
deleted file mode 100644
index e37d5de..0000000
--- a/libs/rs/Allocation.cpp
+++ /dev/null
@@ -1,468 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-#define LOG_TAG "libRS_cpp"
-
-#include <utils/Log.h>
-#include <malloc.h>
-
-#include "RenderScript.h"
-#include "Element.h"
-#include "Type.h"
-#include "Allocation.h"
-
-
-void * Allocation::getIDSafe() const {
-    //if (mAdaptedAllocation != NULL) {
-        //return mAdaptedAllocation.getID();
-    //}
-    return getID();
-}
-
-void Allocation::updateCacheInfo(const Type *t) {
-    mCurrentDimX = t->getX();
-    mCurrentDimY = t->getY();
-    mCurrentDimZ = t->getZ();
-    mCurrentCount = mCurrentDimX;
-    if (mCurrentDimY > 1) {
-        mCurrentCount *= mCurrentDimY;
-    }
-    if (mCurrentDimZ > 1) {
-        mCurrentCount *= mCurrentDimZ;
-    }
-}
-
-Allocation::Allocation(void *id, RenderScript *rs, const Type *t, uint32_t usage) : BaseObj(id, rs) {
-    if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT |
-                   RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
-                   RS_ALLOCATION_USAGE_GRAPHICS_VERTEX |
-                   RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS |
-                   RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET |
-                   RS_ALLOCATION_USAGE_IO_INPUT |
-                   RS_ALLOCATION_USAGE_IO_OUTPUT)) != 0) {
-        ALOGE("Unknown usage specified.");
-    }
-
-    if ((usage & RS_ALLOCATION_USAGE_IO_INPUT) != 0) {
-        mWriteAllowed = false;
-        if ((usage & ~(RS_ALLOCATION_USAGE_IO_INPUT |
-                       RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
-                       RS_ALLOCATION_USAGE_SCRIPT)) != 0) {
-            ALOGE("Invalid usage combination.");
-        }
-    }
-
-    mType = t;
-    mUsage = usage;
-
-    if (t != NULL) {
-        updateCacheInfo(t);
-    }
-}
-
-void Allocation::validateIsInt32() {
-    RsDataType dt = mType->getElement()->getDataType();
-    if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) {
-        return;
-    }
-    ALOGE("32 bit integer source does not match allocation type %i", dt);
-}
-
-void Allocation::validateIsInt16() {
-    RsDataType dt = mType->getElement()->getDataType();
-    if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) {
-        return;
-    }
-    ALOGE("16 bit integer source does not match allocation type %i", dt);
-}
-
-void Allocation::validateIsInt8() {
-    RsDataType dt = mType->getElement()->getDataType();
-    if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) {
-        return;
-    }
-    ALOGE("8 bit integer source does not match allocation type %i", dt);
-}
-
-void Allocation::validateIsFloat32() {
-    RsDataType dt = mType->getElement()->getDataType();
-    if (dt == RS_TYPE_FLOAT_32) {
-        return;
-    }
-    ALOGE("32 bit float source does not match allocation type %i", dt);
-}
-
-void Allocation::validateIsObject() {
-    RsDataType dt = mType->getElement()->getDataType();
-    if ((dt == RS_TYPE_ELEMENT) ||
-        (dt == RS_TYPE_TYPE) ||
-        (dt == RS_TYPE_ALLOCATION) ||
-        (dt == RS_TYPE_SAMPLER) ||
-        (dt == RS_TYPE_SCRIPT) ||
-        (dt == RS_TYPE_MESH) ||
-        (dt == RS_TYPE_PROGRAM_FRAGMENT) ||
-        (dt == RS_TYPE_PROGRAM_VERTEX) ||
-        (dt == RS_TYPE_PROGRAM_RASTER) ||
-        (dt == RS_TYPE_PROGRAM_STORE)) {
-        return;
-    }
-    ALOGE("Object source does not match allocation type %i", dt);
-}
-
-void Allocation::updateFromNative() {
-    BaseObj::updateFromNative();
-
-    const void *typeID = rsaAllocationGetType(mRS->mContext, getID());
-    if(typeID != NULL) {
-        const Type *old = mType;
-        Type *t = new Type((void *)typeID, mRS);
-        t->updateFromNative();
-        updateCacheInfo(t);
-        mType = t;
-        delete old;
-    }
-}
-
-void Allocation::syncAll(RsAllocationUsageType srcLocation) {
-    switch (srcLocation) {
-    case RS_ALLOCATION_USAGE_SCRIPT:
-    case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS:
-    case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE:
-    case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX:
-        break;
-    default:
-        ALOGE("Source must be exactly one usage type.");
-    }
-    rsAllocationSyncAll(mRS->mContext, getIDSafe(), srcLocation);
-}
-
-void Allocation::ioSendOutput() {
-    if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) {
-        ALOGE("Can only send buffer if IO_OUTPUT usage specified.");
-    }
-    rsAllocationIoSend(mRS->mContext, getID());
-}
-
-void Allocation::ioGetInput() {
-    if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) {
-        ALOGE("Can only send buffer if IO_OUTPUT usage specified.");
-    }
-    rsAllocationIoReceive(mRS->mContext, getID());
-}
-
-/*
-void copyFrom(BaseObj[] d) {
-    mRS.validate();
-    validateIsObject();
-    if (d.length != mCurrentCount) {
-        ALOGE("Array size mismatch, allocation sizeX = " +
-                                             mCurrentCount + ", array length = " + d.length);
-    }
-    int i[] = new int[d.length];
-    for (int ct=0; ct < d.length; ct++) {
-        i[ct] = d[ct].getID();
-    }
-    copy1DRangeFromUnchecked(0, mCurrentCount, i);
-}
-*/
-
-
-/*
-void Allocation::setFromFieldPacker(int xoff, FieldPacker fp) {
-    mRS.validate();
-    int eSize = mType.mElement.getSizeBytes();
-    final byte[] data = fp.getData();
-
-    int count = data.length / eSize;
-    if ((eSize * count) != data.length) {
-        ALOGE("Field packer length " + data.length +
-                                           " not divisible by element size " + eSize + ".");
-    }
-    copy1DRangeFromUnchecked(xoff, count, data);
-}
-
-void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) {
-    mRS.validate();
-    if (component_number >= mType.mElement.mElements.length) {
-        ALOGE("Component_number " + component_number + " out of range.");
-    }
-    if(xoff < 0) {
-        ALOGE("Offset must be >= 0.");
-    }
-
-    final byte[] data = fp.getData();
-    int eSize = mType.mElement.mElements[component_number].getSizeBytes();
-    eSize *= mType.mElement.mArraySizes[component_number];
-
-    if (data.length != eSize) {
-        ALOGE("Field packer sizelength " + data.length +
-                                           " does not match component size " + eSize + ".");
-    }
-
-    mRS.nAllocationElementData1D(getIDSafe(), xoff, mSelectedLOD,
-                                 component_number, data, data.length);
-}
-*/
-
-void Allocation::generateMipmaps() {
-    rsAllocationGenerateMipmaps(mRS->mContext, getID());
-}
-
-void Allocation::copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data, size_t dataLen) {
-    if(count < 1) {
-        ALOGE("Count must be >= 1.");
-        return;
-    }
-    if((off + count) > mCurrentCount) {
-        ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off);
-        return;
-    }
-    if((count * mType->getElement()->getSizeBytes()) > dataLen) {
-        ALOGE("Array too small for allocation type.");
-        return;
-    }
-
-    rsAllocation1DData(mRS->mContext, getIDSafe(), off, mSelectedLOD, count, data, dataLen);
-}
-
-void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int32_t *d, size_t dataLen) {
-    validateIsInt32();
-    copy1DRangeFromUnchecked(off, count, d, dataLen);
-}
-
-void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int16_t *d, size_t dataLen) {
-    validateIsInt16();
-    copy1DRangeFromUnchecked(off, count, d, dataLen);
-}
-
-void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int8_t *d, size_t dataLen) {
-    validateIsInt8();
-    copy1DRangeFromUnchecked(off, count, d, dataLen);
-}
-
-void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const float *d, size_t dataLen) {
-    validateIsFloat32();
-    copy1DRangeFromUnchecked(off, count, d, dataLen);
-}
-
-void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data, uint32_t dataOff) {
-    rsAllocationCopy2DRange(mRS->mContext, getIDSafe(), off, 0,
-                            mSelectedLOD, mSelectedFace,
-                            count, 1, data->getIDSafe(), dataOff, 0,
-                            data->mSelectedLOD, data->mSelectedFace);
-}
-
-void Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) {
-    if (mAdaptedAllocation != NULL) {
-
-    } else {
-        if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
-            ALOGE("Updated region larger than allocation.");
-        }
-    }
-}
-
-void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                                 const int8_t *data, size_t dataLen) {
-    validate2DRange(xoff, yoff, w, h);
-    rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
-                       w, h, data, dataLen);
-}
-
-void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                                 const int16_t *data, size_t dataLen) {
-    validate2DRange(xoff, yoff, w, h);
-    rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
-                       w, h, data, dataLen);
-}
-
-void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                                 const int32_t *data, size_t dataLen) {
-    validate2DRange(xoff, yoff, w, h);
-    rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
-                       w, h, data, dataLen);
-}
-
-void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                                 const float *data, size_t dataLen) {
-    validate2DRange(xoff, yoff, w, h);
-    rsAllocation2DData(mRS->mContext, getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
-                       w, h, data, dataLen);
-}
-
-void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                                 const Allocation *data, size_t dataLen,
-                                 uint32_t dataXoff, uint32_t dataYoff) {
-    validate2DRange(xoff, yoff, w, h);
-    rsAllocationCopy2DRange(mRS->mContext, getIDSafe(), xoff, yoff,
-                            mSelectedLOD, mSelectedFace,
-                            w, h, data->getIDSafe(), dataXoff, dataYoff,
-                            data->mSelectedLOD, data->mSelectedFace);
-}
-
-/*
-void copyTo(byte[] d) {
-    validateIsInt8();
-    mRS.validate();
-    mRS.nAllocationRead(getID(), d);
-}
-
-void copyTo(short[] d) {
-    validateIsInt16();
-    mRS.validate();
-    mRS.nAllocationRead(getID(), d);
-}
-
-void copyTo(int[] d) {
-    validateIsInt32();
-    mRS.validate();
-    mRS.nAllocationRead(getID(), d);
-}
-
-void copyTo(float[] d) {
-    validateIsFloat32();
-    mRS.validate();
-    mRS.nAllocationRead(getID(), d);
-}
-
-void resize(int dimX) {
-    if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
-        throw new RSInvalidStateException("Resize only support for 1D allocations at this time.");
-    }
-    mRS.nAllocationResize1D(getID(), dimX);
-    mRS.finish();  // Necessary because resize is fifoed and update is async.
-
-    int typeID = mRS.nAllocationGetType(getID());
-    mType = new Type(typeID, mRS);
-    mType.updateFromNative();
-    updateCacheInfo(mType);
-}
-
-void resize(int dimX, int dimY) {
-    if ((mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
-        throw new RSInvalidStateException(
-            "Resize only support for 2D allocations at this time.");
-    }
-    if (mType.getY() == 0) {
-        throw new RSInvalidStateException(
-            "Resize only support for 2D allocations at this time.");
-    }
-    mRS.nAllocationResize2D(getID(), dimX, dimY);
-    mRS.finish();  // Necessary because resize is fifoed and update is async.
-
-    int typeID = mRS.nAllocationGetType(getID());
-    mType = new Type(typeID, mRS);
-    mType.updateFromNative();
-    updateCacheInfo(mType);
-}
-*/
-
-
-Allocation *Allocation::createTyped(RenderScript *rs, const Type *type,
-                        RsAllocationMipmapControl mips, uint32_t usage) {
-    void *id = rsAllocationCreateTyped(rs->mContext, type->getID(), mips, usage, 0);
-    if (id == 0) {
-        ALOGE("Allocation creation failed.");
-        return NULL;
-    }
-    return new Allocation(id, rs, type, usage);
-}
-
-Allocation *Allocation::createTyped(RenderScript *rs, const Type *type,
-                                    RsAllocationMipmapControl mips, uint32_t usage, void *pointer) {
-    void *id = rsAllocationCreateTyped(rs->mContext, type->getID(), mips, usage, (uint32_t)pointer);
-    if (id == 0) {
-        ALOGE("Allocation creation failed.");
-    }
-    return new Allocation(id, rs, type, usage);
-}
-
-Allocation *Allocation::createTyped(RenderScript *rs, const Type *type, uint32_t usage) {
-    return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage);
-}
-
-Allocation *Allocation::createSized(RenderScript *rs, const Element *e, size_t count, uint32_t usage) {
-    Type::Builder b(rs, e);
-    b.setX(count);
-    const Type *t = b.create();
-
-    void *id = rsAllocationCreateTyped(rs->mContext, t->getID(), RS_ALLOCATION_MIPMAP_NONE, usage, 0);
-    if (id == 0) {
-        ALOGE("Allocation creation failed.");
-    }
-    return new Allocation(id, rs, t, usage);
-}
-
-
-/*
-SurfaceTexture getSurfaceTexture() {
-    if ((mUsage & USAGE_GRAPHICS_SURFACE_TEXTURE_INPUT_OPAQUE) == 0) {
-        throw new RSInvalidStateException("Allocation is not a surface texture.");
-    }
-
-    int id = mRS.nAllocationGetSurfaceTextureID(getID());
-    return new SurfaceTexture(id);
-
-}
-
-void setSurfaceTexture(SurfaceTexture sur) {
-    if ((mUsage & USAGE_IO_OUTPUT) == 0) {
-        throw new RSInvalidStateException("Allocation is not USAGE_IO_OUTPUT.");
-    }
-
-    mRS.validate();
-    mRS.nAllocationSetSurfaceTexture(getID(), sur);
-}
-
-
-static Allocation createFromBitmapResource(RenderScript rs,
-                                                  Resources res,
-                                                  int id,
-                                                  MipmapControl mips,
-                                                  int usage) {
-
-    rs.validate();
-    Bitmap b = BitmapFactory.decodeResource(res, id);
-    Allocation alloc = createFromBitmap(rs, b, mips, usage);
-    b.recycle();
-    return alloc;
-}
-
-static Allocation createFromBitmapResource(RenderScript rs,
-                                                  Resources res,
-                                                  int id) {
-    return createFromBitmapResource(rs, res, id,
-                                    MipmapControl.MIPMAP_NONE,
-                                    USAGE_GRAPHICS_TEXTURE);
-}
-
-static Allocation createFromString(RenderScript rs,
-                                          String str,
-                                          int usage) {
-    rs.validate();
-    byte[] allocArray = NULL;
-    try {
-        allocArray = str.getBytes("UTF-8");
-        Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length, usage);
-        alloc.copyFrom(allocArray);
-        return alloc;
-    }
-    catch (Exception e) {
-        throw new RSRuntimeException("Could not convert string to utf-8.");
-    }
-}
-*/
-
diff --git a/libs/rs/Allocation.h b/libs/rs/Allocation.h
deleted file mode 100644
index c9e00a4..0000000
--- a/libs/rs/Allocation.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#ifndef __ANDROID_ALLOCATION_H__
-#define __ANDROID_ALLOCATION_H__
-
-#include <pthread.h>
-#include <rs.h>
-
-#include "RenderScript.h"
-#include "Type.h"
-#include "Element.h"
-
-class Allocation : public BaseObj {
-protected:
-    const Type *mType;
-    uint32_t mUsage;
-    Allocation *mAdaptedAllocation;
-
-    bool mConstrainedLOD;
-    bool mConstrainedFace;
-    bool mConstrainedY;
-    bool mConstrainedZ;
-    bool mReadAllowed;
-    bool mWriteAllowed;
-    uint32_t mSelectedY;
-    uint32_t mSelectedZ;
-    uint32_t mSelectedLOD;
-    RsAllocationCubemapFace mSelectedFace;
-
-    uint32_t mCurrentDimX;
-    uint32_t mCurrentDimY;
-    uint32_t mCurrentDimZ;
-    uint32_t mCurrentCount;
-
-
-    void * getIDSafe() const;
-    void updateCacheInfo(const Type *t);
-
-    Allocation(void *id, RenderScript *rs, const Type *t, uint32_t usage);
-
-    void validateIsInt32();
-    void validateIsInt16();
-    void validateIsInt8();
-    void validateIsFloat32();
-    void validateIsObject();
-
-    virtual void updateFromNative();
-
-    void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h);
-
-public:
-    const Type * getType() {
-        return mType;
-    }
-
-    void syncAll(RsAllocationUsageType srcLocation);
-    void ioSendOutput();
-    void ioGetInput();
-
-    //void copyFrom(BaseObj[] d);
-    //void copyFromUnchecked(int[] d);
-    //void copyFromUnchecked(short[] d);
-    //void copyFromUnchecked(byte[] d);
-    //void copyFromUnchecked(float[] d);
-    //void copyFrom(int[] d);
-    //void copyFrom(short[] d);
-    //void copyFrom(byte[] d);
-    //void copyFrom(float[] d);
-    //void setFromFieldPacker(int xoff, FieldPacker fp);
-    //void setFromFieldPacker(int xoff, int component_number, FieldPacker fp);
-    void generateMipmaps();
-    void copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data, size_t dataLen);
-    void copy1DRangeFrom(uint32_t off, size_t count, const int32_t* d, size_t dataLen);
-    void copy1DRangeFrom(uint32_t off, size_t count, const int16_t* d, size_t dataLen);
-    void copy1DRangeFrom(uint32_t off, size_t count, const int8_t* d, size_t dataLen);
-    void copy1DRangeFrom(uint32_t off, size_t count, const float* d, size_t dataLen);
-    void copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data, uint32_t dataOff);
-
-    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                         const int32_t *data, size_t dataLen);
-    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                         const int16_t *data, size_t dataLen);
-    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                         const int8_t *data, size_t dataLen);
-    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                         const float *data, size_t dataLen);
-    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
-                         const Allocation *data, size_t dataLen,
-                         uint32_t dataXoff, uint32_t dataYoff);
-
-    //void copyTo(byte[] d);
-    //void copyTo(short[] d);
-    //void copyTo(int[] d);
-    //void copyTo(float[] d);
-    void resize(int dimX);
-    void resize(int dimX, int dimY);
-
-    static Allocation *createTyped(RenderScript *rs, const Type *type,
-                                   RsAllocationMipmapControl mips, uint32_t usage);
-    static Allocation *createTyped(RenderScript *rs, const Type *type,
-                                   RsAllocationMipmapControl mips, uint32_t usage, void * pointer);
-
-    static Allocation *createTyped(RenderScript *rs, const Type *type,
-                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
-    static Allocation *createSized(RenderScript *rs, const Element *e, size_t count,
-                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
-    //SurfaceTexture *getSurfaceTexture();
-    //void setSurfaceTexture(SurfaceTexture *sur);
-
-};
-
-#endif
diff --git a/libs/rs/Android.mk b/libs/rs/Android.mk
deleted file mode 100644
index f92741c..0000000
--- a/libs/rs/Android.mk
+++ /dev/null
@@ -1,238 +0,0 @@
-
-LOCAL_PATH:=$(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libRSDriver
-
-LOCAL_SRC_FILES:= \
-	driver/rsdAllocation.cpp \
-	driver/rsdBcc.cpp \
-	driver/rsdCore.cpp \
-	driver/rsdFrameBuffer.cpp \
-	driver/rsdFrameBufferObj.cpp \
-	driver/rsdGL.cpp \
-	driver/rsdMesh.cpp \
-	driver/rsdMeshObj.cpp \
-	driver/rsdPath.cpp \
-	driver/rsdProgram.cpp \
-	driver/rsdProgramRaster.cpp \
-	driver/rsdProgramStore.cpp \
-	driver/rsdRuntimeMath.cpp \
-	driver/rsdRuntimeStubs.cpp \
-	driver/rsdSampler.cpp \
-	driver/rsdShader.cpp \
-	driver/rsdShaderCache.cpp \
-	driver/rsdVertexArray.cpp
-
-LOCAL_SHARED_LIBRARIES += libz libcutils libutils libEGL libGLESv1_CM libGLESv2
-LOCAL_SHARED_LIBRARIES += libbcc libbcinfo libgui
-
-LOCAL_C_INCLUDES += external/zlib dalvik
-LOCAL_C_INCLUDES += frameworks/compile/libbcc/include
-
-LOCAL_CFLAGS += -Werror -Wall -Wno-unused-parameter -Wno-unused-variable
-
-LOCAL_LDLIBS := -lpthread -ldl
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_STATIC_LIBRARY)
-
-# Build rsg-generator ====================
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := rsg-generator
-
-# These symbols are normally defined by BUILD_XXX, but we need to define them
-# here so that local-intermediates-dir works.
-
-LOCAL_IS_HOST_MODULE := true
-LOCAL_MODULE_CLASS := EXECUTABLES
-intermediates := $(local-intermediates-dir)
-
-LOCAL_SRC_FILES:= \
-    spec.l \
-    rsg_generator.c
-
-include $(BUILD_HOST_EXECUTABLE)
-
-# TODO: This should go into build/core/config.mk
-RSG_GENERATOR:=$(LOCAL_BUILT_MODULE)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libRS
-
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-intermediates:= $(local-intermediates-dir)
-
-# Generate custom headers
-
-GEN := $(addprefix $(intermediates)/, \
-            rsgApiStructs.h \
-            rsgApiFuncDecl.h \
-        )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = $(RSG_GENERATOR) $< $@ <$(PRIVATE_PATH)/rs.spec
-$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec
-$(GEN): $(intermediates)/%.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 $(intermediates)/, \
-            rsgApi.cpp \
-            rsgApiReplay.cpp \
-        )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = $(RSG_GENERATOR) $< $@ <$(PRIVATE_PATH)/rs.spec
-$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec
-$(GEN): $(intermediates)/%.cpp : $(LOCAL_PATH)/%.cpp.rsg
-	$(transform-generated-source)
-
-# used in jni/Android.mk
-rs_generated_source += $(GEN)
-
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-LOCAL_SRC_FILES:= \
-	rsAdapter.cpp \
-	rsAllocation.cpp \
-	rsAnimation.cpp \
-	rsComponent.cpp \
-	rsContext.cpp \
-	rsDevice.cpp \
-	rsElement.cpp \
-	rsFBOCache.cpp \
-	rsFifoSocket.cpp \
-	rsFileA3D.cpp \
-	rsFont.cpp \
-	rsObjectBase.cpp \
-	rsMatrix2x2.cpp \
-	rsMatrix3x3.cpp \
-	rsMatrix4x4.cpp \
-	rsMesh.cpp \
-	rsMutex.cpp \
-	rsPath.cpp \
-	rsProgram.cpp \
-	rsProgramFragment.cpp \
-	rsProgramStore.cpp \
-	rsProgramRaster.cpp \
-	rsProgramVertex.cpp \
-	rsSampler.cpp \
-	rsScript.cpp \
-	rsScriptC.cpp \
-	rsScriptC_Lib.cpp \
-	rsScriptC_LibGL.cpp \
-	rsSignal.cpp \
-	rsStream.cpp \
-	rsThreadIO.cpp \
-	rsType.cpp \
-	RenderScript.cpp \
-	BaseObj.cpp \
-	Element.cpp \
-	Type.cpp \
-	Allocation.cpp \
-	Script.cpp \
-	ScriptC.cpp
-
-LOCAL_SHARED_LIBRARIES += libz libcutils libutils libEGL libGLESv1_CM libGLESv2 libbcc
-LOCAL_SHARED_LIBRARIES += libui libbcinfo libgui
-
-LOCAL_STATIC_LIBRARIES := libdex libft2 libRSDriver
-
-LOCAL_C_INCLUDES += external/freetype/include external/zlib dalvik
-LOCAL_C_INCLUDES += frameworks/compile/libbcc/include
-
-LOCAL_CFLAGS += -Werror -Wall -Wno-unused-parameter -Wno-unused-variable
-
-LOCAL_LDLIBS := -lpthread -ldl
-LOCAL_MODULE:= libRS
-LOCAL_MODULE_TAGS := optional
-
-include $(BUILD_SHARED_LIBRARY)
-
-# Now build a host version for serialization
-include $(CLEAR_VARS)
-LOCAL_MODULE:= libRS
-LOCAL_MODULE_TAGS := optional
-
-intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,HOST,)
-
-# Generate custom headers
-
-GEN := $(addprefix $(intermediates)/, \
-            rsgApiStructs.h \
-            rsgApiFuncDecl.h \
-        )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = $(RSG_GENERATOR) $< $@ <$(PRIVATE_PATH)/rs.spec
-$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec
-$(GEN): $(intermediates)/%.h : $(LOCAL_PATH)/%.h.rsg
-	$(transform-generated-source)
-
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-# Generate custom source files
-
-GEN := $(addprefix $(intermediates)/, \
-            rsgApi.cpp \
-            rsgApiReplay.cpp \
-        )
-
-$(GEN) : PRIVATE_PATH := $(LOCAL_PATH)
-$(GEN) : PRIVATE_CUSTOM_TOOL = $(RSG_GENERATOR) $< $@ <$(PRIVATE_PATH)/rs.spec
-$(GEN) : $(RSG_GENERATOR) $(LOCAL_PATH)/rs.spec
-$(GEN): $(intermediates)/%.cpp : $(LOCAL_PATH)/%.cpp.rsg
-	$(transform-generated-source)
-
-LOCAL_GENERATED_SOURCES += $(GEN)
-
-LOCAL_CFLAGS += -Werror -Wall -Wno-unused-parameter -Wno-unused-variable
-LOCAL_CFLAGS += -DANDROID_RS_SERIALIZE
-LOCAL_CFLAGS += -fPIC
-
-LOCAL_SRC_FILES:= \
-	rsAdapter.cpp \
-	rsAllocation.cpp \
-	rsAnimation.cpp \
-	rsComponent.cpp \
-	rsContext.cpp \
-	rsDevice.cpp \
-	rsElement.cpp \
-	rsFBOCache.cpp \
-	rsFifoSocket.cpp \
-	rsFileA3D.cpp \
-	rsFont.cpp \
-	rsObjectBase.cpp \
-	rsMatrix2x2.cpp \
-	rsMatrix3x3.cpp \
-	rsMatrix4x4.cpp \
-	rsMesh.cpp \
-	rsMutex.cpp \
-	rsPath.cpp \
-	rsProgram.cpp \
-	rsProgramFragment.cpp \
-	rsProgramStore.cpp \
-	rsProgramRaster.cpp \
-	rsProgramVertex.cpp \
-	rsSampler.cpp \
-	rsScript.cpp \
-	rsScriptC.cpp \
-	rsScriptC_Lib.cpp \
-	rsScriptC_LibGL.cpp \
-	rsSignal.cpp \
-	rsStream.cpp \
-	rsThreadIO.cpp \
-	rsType.cpp
-
-LOCAL_STATIC_LIBRARIES := libcutils libutils
-
-LOCAL_LDLIBS := -lpthread
-
-include $(BUILD_HOST_STATIC_LIBRARY)
diff --git a/libs/rs/BaseObj.cpp b/libs/rs/BaseObj.cpp
deleted file mode 100644
index 82e51e7..0000000
--- a/libs/rs/BaseObj.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#define LOG_TAG "libRS_cpp"
-
-#include <rs.h>
-
-#include "RenderScript.h"
-#include "BaseObj.h"
-
-void * BaseObj::getID() const {
-    if (mID == NULL) {
-        ALOGE("Internal error: Object id 0.");
-    }
-    return mID;
-}
-
-void * BaseObj::getObjID(const BaseObj *o) {
-    return o == NULL ? NULL : o->getID();
-}
-
-
-BaseObj::BaseObj(void *id, RenderScript *rs) {
-    mRS = rs;
-    mID = id;
-}
-
-void BaseObj::checkValid() {
-    if (mID == 0) {
-        ALOGE("Invalid object.");
-    }
-}
-
-BaseObj::~BaseObj() {
-    rsObjDestroy(mRS->mContext, mID);
-    mRS = NULL;
-    mID = NULL;
-}
-
-void BaseObj::updateFromNative() {
-    const char *name = NULL;
-    rsaGetName(mRS, mID, &name);
-    mName = name;
-}
-
-bool BaseObj::equals(const BaseObj *obj) {
-    // Early-out check to see if both BaseObjs are actually the same
-    if (this == obj)
-        return true;
-    return mID == obj->mID;
-}
-
-
-
diff --git a/libs/rs/BaseObj.h b/libs/rs/BaseObj.h
deleted file mode 100644
index 79761b1..0000000
--- a/libs/rs/BaseObj.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#ifndef __ANDROID_BASE_OBJ_H__
-#define __ANDROID_BASE_OBJ_H__
-
-
-#include <pthread.h>
-#include <rs.h>
-
-#include "RenderScript.h"
-
-class BaseObj {
-protected:
-    friend class Element;
-    friend class Type;
-    friend class Allocation;
-    friend class Script;
-    friend class ScriptC;
-
-    void *mID;
-    RenderScript *mRS;
-    android::String8 mName;
-
-    void * getID() const;
-
-    BaseObj(void *id, RenderScript *rs);
-    void checkValid();
-
-    static void * getObjID(const BaseObj *o);
-
-public:
-
-    virtual ~BaseObj();
-    virtual void updateFromNative();
-    virtual bool equals(const BaseObj *obj);
-};
-
-#endif
diff --git a/libs/rs/Element.cpp b/libs/rs/Element.cpp
deleted file mode 100644
index f318d40..0000000
--- a/libs/rs/Element.cpp
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#define LOG_TAG "libRS_cpp"
-
-#include <utils/Log.h>
-#include <malloc.h>
-#include <string.h>
-
-#include "RenderScript.h"
-#include "Element.h"
-
-
-const Element * Element::getSubElement(uint32_t index) {
-    if (!mVisibleElementMap.size()) {
-        mRS->throwError("Element contains no sub-elements");
-    }
-    if (index >= mVisibleElementMap.size()) {
-        mRS->throwError("Illegal sub-element index");
-    }
-    return mElements[mVisibleElementMap[index]];
-}
-
-const char * Element::getSubElementName(uint32_t index) {
-    if (!mVisibleElementMap.size()) {
-        mRS->throwError("Element contains no sub-elements");
-    }
-    if (index >= mVisibleElementMap.size()) {
-        mRS->throwError("Illegal sub-element index");
-    }
-    return mElementNames[mVisibleElementMap[index]];
-}
-
-size_t Element::getSubElementArraySize(uint32_t index) {
-    if (!mVisibleElementMap.size()) {
-        mRS->throwError("Element contains no sub-elements");
-    }
-    if (index >= mVisibleElementMap.size()) {
-        mRS->throwError("Illegal sub-element index");
-    }
-    return mArraySizes[mVisibleElementMap[index]];
-}
-
-uint32_t Element::getSubElementOffsetBytes(uint32_t index) {
-    if (mVisibleElementMap.size()) {
-        mRS->throwError("Element contains no sub-elements");
-    }
-    if (index >= mVisibleElementMap.size()) {
-        mRS->throwError("Illegal sub-element index");
-    }
-    return mOffsetInBytes[mVisibleElementMap[index]];
-}
-
-
-#define CREATE_USER(N, T) const Element * Element::N(RenderScript *rs) { \
-    return createUser(rs, RS_TYPE_##T); \
-}
-CREATE_USER(BOOLEAN, BOOLEAN);
-CREATE_USER(U8, UNSIGNED_8);
-CREATE_USER(I8, SIGNED_8);
-CREATE_USER(U16, UNSIGNED_16);
-CREATE_USER(I16, SIGNED_16);
-CREATE_USER(U32, UNSIGNED_32);
-CREATE_USER(I32, SIGNED_32);
-CREATE_USER(U64, UNSIGNED_64);
-CREATE_USER(I64, SIGNED_64);
-CREATE_USER(F32, FLOAT_32);
-CREATE_USER(F64, FLOAT_64);
-CREATE_USER(ELEMENT, ELEMENT);
-CREATE_USER(TYPE, TYPE);
-CREATE_USER(ALLOCATION, ALLOCATION);
-CREATE_USER(SAMPLER, SAMPLER);
-CREATE_USER(SCRIPT, SCRIPT);
-CREATE_USER(MESH, MESH);
-CREATE_USER(PROGRAM_FRAGMENT, PROGRAM_FRAGMENT);
-CREATE_USER(PROGRAM_VERTEX, PROGRAM_VERTEX);
-CREATE_USER(PROGRAM_RASTER, PROGRAM_RASTER);
-CREATE_USER(PROGRAM_STORE, PROGRAM_STORE);
-CREATE_USER(MATRIX_4X4, MATRIX_4X4);
-CREATE_USER(MATRIX_3X3, MATRIX_3X3);
-CREATE_USER(MATRIX_2X2, MATRIX_2X2);
-
-#define CREATE_PIXEL(N, T, K) const Element * Element::N(RenderScript *rs) { \
-    return createPixel(rs, RS_TYPE_##T, RS_KIND_##K); \
-}
-CREATE_PIXEL(A_8, UNSIGNED_8, PIXEL_A);
-CREATE_PIXEL(RGB_565, UNSIGNED_5_6_5, PIXEL_RGB);
-CREATE_PIXEL(RGB_888, UNSIGNED_8, PIXEL_RGB);
-CREATE_PIXEL(RGBA_4444, UNSIGNED_4_4_4_4, PIXEL_RGBA);
-CREATE_PIXEL(RGBA_8888, UNSIGNED_8, PIXEL_RGBA);
-
-#define CREATE_VECTOR(N, T) const Element * Element::N##_2(RenderScript *rs) { \
-    return createVector(rs, RS_TYPE_##T, 2); \
-} \
-const Element * Element::N##_3(RenderScript *rs) { \
-    return createVector(rs, RS_TYPE_##T, 3); \
-} \
-const Element * Element::N##_4(RenderScript *rs) { \
-    return createVector(rs, RS_TYPE_##T, 4); \
-}
-CREATE_VECTOR(U8, UNSIGNED_8);
-CREATE_VECTOR(I8, SIGNED_8);
-CREATE_VECTOR(U16, UNSIGNED_16);
-CREATE_VECTOR(I16, SIGNED_16);
-CREATE_VECTOR(U32, UNSIGNED_32);
-CREATE_VECTOR(I32, SIGNED_32);
-CREATE_VECTOR(U64, UNSIGNED_64);
-CREATE_VECTOR(I64, SIGNED_64);
-CREATE_VECTOR(F32, FLOAT_32);
-CREATE_VECTOR(F64, FLOAT_64);
-
-
-void Element::updateVisibleSubElements() {
-    if (!mElements.size()) {
-        return;
-    }
-    mVisibleElementMap.clear();
-
-    int noPaddingFieldCount = 0;
-    size_t fieldCount = mElementNames.size();
-    // Find out how many elements are not padding
-    for (size_t ct = 0; ct < fieldCount; ct ++) {
-        if (mElementNames[ct].string()[0] != '#') {
-            noPaddingFieldCount ++;
-        }
-    }
-
-    // Make a map that points us at non-padding elements
-    for (size_t ct = 0; ct < fieldCount; ct ++) {
-        if (mElementNames[ct].string()[0] != '#') {
-            mVisibleElementMap.push((uint32_t)ct);
-        }
-    }
-}
-
-Element::Element(void *id, RenderScript *rs,
-                 android::Vector<const Element *> &elements,
-                 android::Vector<android::String8> &elementNames,
-                 android::Vector<uint32_t> &arraySizes) : BaseObj(id, rs) {
-    mSizeBytes = 0;
-    mVectorSize = 1;
-    mElements = elements;
-    mArraySizes = arraySizes;
-    mElementNames = elementNames;
-
-    mType = RS_TYPE_NONE;
-    mKind = RS_KIND_USER;
-
-    for (size_t ct = 0; ct < mElements.size(); ct++ ) {
-        mOffsetInBytes.push(mSizeBytes);
-        mSizeBytes += mElements[ct]->mSizeBytes * mArraySizes[ct];
-    }
-    updateVisibleSubElements();
-}
-
-
-static uint32_t GetSizeInBytesForType(RsDataType dt) {
-    switch(dt) {
-    case RS_TYPE_NONE:
-        return 0;
-    case RS_TYPE_SIGNED_8:
-    case RS_TYPE_UNSIGNED_8:
-    case RS_TYPE_BOOLEAN:
-        return 1;
-
-    case RS_TYPE_FLOAT_16:
-    case RS_TYPE_SIGNED_16:
-    case RS_TYPE_UNSIGNED_16:
-    case RS_TYPE_UNSIGNED_5_6_5:
-    case RS_TYPE_UNSIGNED_5_5_5_1:
-    case RS_TYPE_UNSIGNED_4_4_4_4:
-        return 2;
-
-    case RS_TYPE_FLOAT_32:
-    case RS_TYPE_SIGNED_32:
-    case RS_TYPE_UNSIGNED_32:
-        return 4;
-
-    case RS_TYPE_FLOAT_64:
-    case RS_TYPE_SIGNED_64:
-    case RS_TYPE_UNSIGNED_64:
-        return 8;
-
-    case RS_TYPE_MATRIX_4X4:
-        return 16 * 4;
-    case RS_TYPE_MATRIX_3X3:
-        return 9 * 4;
-    case RS_TYPE_MATRIX_2X2:
-        return 4 * 4;
-
-    case RS_TYPE_TYPE:
-    case RS_TYPE_ALLOCATION:
-    case RS_TYPE_SAMPLER:
-    case RS_TYPE_SCRIPT:
-    case RS_TYPE_MESH:
-    case RS_TYPE_PROGRAM_FRAGMENT:
-    case RS_TYPE_PROGRAM_VERTEX:
-    case RS_TYPE_PROGRAM_RASTER:
-    case RS_TYPE_PROGRAM_STORE:
-        return 4;
-
-    default:
-        break;
-    }
-
-    ALOGE("Missing type %i", dt);
-    return 0;
-}
-
-Element::Element(void *id, RenderScript *rs,
-                 RsDataType dt, RsDataKind dk, bool norm, uint32_t size) :
-    BaseObj(id, rs)
-{
-    uint32_t tsize = GetSizeInBytesForType(dt);
-    if ((dt != RS_TYPE_UNSIGNED_5_6_5) &&
-        (dt != RS_TYPE_UNSIGNED_4_4_4_4) &&
-        (dt != RS_TYPE_UNSIGNED_5_5_5_1)) {
-        if (size == 3) {
-            mSizeBytes = tsize * 4;
-        } else {
-            mSizeBytes = tsize * size;
-        }
-    } else {
-        mSizeBytes = tsize;
-    }
-    mType = dt;
-    mKind = dk;
-    mNormalized = norm;
-    mVectorSize = size;
-}
-
-Element::~Element() {
-}
-
-   /*
-    Element(int id, RenderScript rs) {
-        super(id, rs);
-    }
-    */
-
-void Element::updateFromNative() {
-    BaseObj::updateFromNative();
-/*
-    // we will pack mType; mKind; mNormalized; mVectorSize; NumSubElements
-    int[] dataBuffer = new int[5];
-    mRS.nElementGetNativeData(getID(), dataBuffer);
-
-    mNormalized = dataBuffer[2] == 1 ? true : false;
-    mVectorSize = dataBuffer[3];
-    mSize = 0;
-    for (DataType dt: DataType.values()) {
-        if(dt.mID == dataBuffer[0]){
-            mType = dt;
-            mSize = mType.mSize * mVectorSize;
-        }
-    }
-    for (DataKind dk: DataKind.values()) {
-        if(dk.mID == dataBuffer[1]){
-            mKind = dk;
-        }
-    }
-
-    int numSubElements = dataBuffer[4];
-    if(numSubElements > 0) {
-        mElements = new Element[numSubElements];
-        mElementNames = new String[numSubElements];
-        mArraySizes = new int[numSubElements];
-        mOffsetInBytes = new int[numSubElements];
-
-        int[] subElementIds = new int[numSubElements];
-        mRS.nElementGetSubElements(getID(), subElementIds, mElementNames, mArraySizes);
-        for(int i = 0; i < numSubElements; i ++) {
-            mElements[i] = new Element(subElementIds[i], mRS);
-            mElements[i].updateFromNative();
-            mOffsetInBytes[i] = mSize;
-            mSize += mElements[i].mSize * mArraySizes[i];
-        }
-    }
-    */
-    updateVisibleSubElements();
-}
-
-const Element * Element::createUser(RenderScript *rs, RsDataType dt) {
-    void * id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, 1);
-    return new Element(id, rs, dt, RS_KIND_USER, false, 1);
-}
-
-const Element * Element::createVector(RenderScript *rs, RsDataType dt, uint32_t size) {
-    if (size < 2 || size > 4) {
-        rs->throwError("Vector size out of range 2-4.");
-    }
-    void *id = rsElementCreate(rs->mContext, dt, RS_KIND_USER, false, size);
-    return new Element(id, rs, dt, RS_KIND_USER, false, size);
-}
-
-const Element * Element::createPixel(RenderScript *rs, RsDataType dt, RsDataKind dk) {
-    if (!(dk == RS_KIND_PIXEL_L ||
-          dk == RS_KIND_PIXEL_A ||
-          dk == RS_KIND_PIXEL_LA ||
-          dk == RS_KIND_PIXEL_RGB ||
-          dk == RS_KIND_PIXEL_RGBA ||
-          dk == RS_KIND_PIXEL_DEPTH)) {
-        rs->throwError("Unsupported DataKind");
-    }
-    if (!(dt == RS_TYPE_UNSIGNED_8 ||
-          dt == RS_TYPE_UNSIGNED_16 ||
-          dt == RS_TYPE_UNSIGNED_5_6_5 ||
-          dt == RS_TYPE_UNSIGNED_4_4_4_4 ||
-          dt == RS_TYPE_UNSIGNED_5_5_5_1)) {
-        rs->throwError("Unsupported DataType");
-    }
-    if (dt == RS_TYPE_UNSIGNED_5_6_5 && dk != RS_KIND_PIXEL_RGB) {
-        rs->throwError("Bad kind and type combo");
-    }
-    if (dt == RS_TYPE_UNSIGNED_5_5_5_1 && dk != RS_KIND_PIXEL_RGBA) {
-        rs->throwError("Bad kind and type combo");
-    }
-    if (dt == RS_TYPE_UNSIGNED_4_4_4_4 && dk != RS_KIND_PIXEL_RGBA) {
-        rs->throwError("Bad kind and type combo");
-    }
-    if (dt == RS_TYPE_UNSIGNED_16 && dk != RS_KIND_PIXEL_DEPTH) {
-        rs->throwError("Bad kind and type combo");
-    }
-
-    int size = 1;
-    switch (dk) {
-    case RS_KIND_PIXEL_LA:
-        size = 2;
-        break;
-    case RS_KIND_PIXEL_RGB:
-        size = 3;
-        break;
-    case RS_KIND_PIXEL_RGBA:
-        size = 4;
-        break;
-    case RS_KIND_PIXEL_DEPTH:
-        size = 2;
-        break;
-    default:
-        break;
-    }
-
-    void * id = rsElementCreate(rs->mContext, dt, dk, true, size);
-    return new Element(id, rs, dt, dk, true, size);
-}
-
-bool Element::isCompatible(const Element *e) {
-    // Try strict BaseObj equality to start with.
-    if (this == e) {
-        return true;
-    }
-
-    // Ignore mKind because it is allowed to be different (user vs. pixel).
-    // We also ignore mNormalized because it can be different. The mType
-    // field must be non-null since we require name equivalence for
-    // user-created Elements.
-    return ((mSizeBytes == e->mSizeBytes) &&
-            (mType != NULL) &&
-            (mType == e->mType) &&
-            (mVectorSize == e->mVectorSize));
-}
-
-Element::Builder::Builder(RenderScript *rs) {
-    mRS = rs;
-    mSkipPadding = false;
-}
-
-void Element::Builder::add(const Element *e, android::String8 &name, uint32_t arraySize) {
-    // Skip padding fields after a vector 3 type.
-    if (mSkipPadding) {
-        const char *s1 = "#padding_";
-        const char *s2 = name;
-        size_t len = strlen(s1);
-        if (strlen(s2) >= len) {
-            if (!memcmp(s1, s2, len)) {
-                mSkipPadding = false;
-                return;
-            }
-        }
-    }
-
-    if (e->mVectorSize == 3) {
-        mSkipPadding = true;
-    } else {
-        mSkipPadding = false;
-    }
-
-    mElements.add(e);
-    mElementNames.add(name);
-    mArraySizes.add(arraySize);
-}
-
-const Element * Element::Builder::create() {
-    size_t fieldCount = mElements.size();
-    const char ** nameArray = (const char **)calloc(fieldCount, sizeof(char *));
-    size_t* sizeArray = (size_t*)calloc(fieldCount, sizeof(size_t));
-
-    for (size_t ct = 0; ct < fieldCount; ct++) {
-        nameArray[ct] = mElementNames[ct].string();
-        sizeArray[ct] = mElementNames[ct].length();
-    }
-
-    void *id = rsElementCreate2(mRS->mContext,
-                                (RsElement *)mElements.array(), fieldCount,
-                                nameArray, fieldCount * sizeof(size_t),  sizeArray,
-                                (const uint32_t *)mArraySizes.array(), fieldCount);
-
-
-    free(nameArray);
-    free(sizeArray);
-
-    Element *e = new Element(id, mRS, mElements, mElementNames, mArraySizes);
-    return e;
-}
-
diff --git a/libs/rs/Element.h b/libs/rs/Element.h
deleted file mode 100644
index a579dc3..0000000
--- a/libs/rs/Element.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#ifndef __ANDROID_ELEMENT_H__
-#define __ANDROID_ELEMENT_H__
-
-#include <rs.h>
-#include "RenderScript.h"
-#include "BaseObj.h"
-
-class Element : public BaseObj {
-public:
-    /**
-     * Return if a element is too complex for use as a data source for a Mesh or
-     * a Program.
-     *
-     * @return boolean
-     */
-    bool isComplex();
-
-    /**
-    * @hide
-    * @return number of sub-elements in this element
-    */
-    size_t getSubElementCount() {
-        return mVisibleElementMap.size();
-    }
-
-    /**
-    * @hide
-    * @param index index of the sub-element to return
-    * @return sub-element in this element at given index
-    */
-    const Element * getSubElement(uint32_t index);
-
-    /**
-    * @hide
-    * @param index index of the sub-element
-    * @return sub-element in this element at given index
-    */
-    const char * getSubElementName(uint32_t index);
-
-    /**
-    * @hide
-    * @param index index of the sub-element
-    * @return array size of sub-element in this element at given index
-    */
-    size_t getSubElementArraySize(uint32_t index);
-
-    /**
-    * @hide
-    * @param index index of the sub-element
-    * @return offset in bytes of sub-element in this element at given index
-    */
-    uint32_t getSubElementOffsetBytes(uint32_t index);
-
-    /**
-    * @hide
-    * @return element data type
-    */
-    RsDataType getDataType() const {
-        return mType;
-    }
-
-    /**
-    * @hide
-    * @return element data kind
-    */
-    RsDataKind getDataKind() const {
-        return mKind;
-    }
-
-    size_t getSizeBytes() const {
-        return mSizeBytes;
-    }
-
-
-    static const Element * BOOLEAN(RenderScript *rs);
-    static const Element * U8(RenderScript *rs);
-    static const Element * I8(RenderScript *rs);
-    static const Element * U16(RenderScript *rs);
-    static const Element * I16(RenderScript *rs);
-    static const Element * U32(RenderScript *rs);
-    static const Element * I32(RenderScript *rs);
-    static const Element * U64(RenderScript *rs);
-    static const Element * I64(RenderScript *rs);
-    static const Element * F32(RenderScript *rs);
-    static const Element * F64(RenderScript *rs);
-    static const Element * ELEMENT(RenderScript *rs);
-    static const Element * TYPE(RenderScript *rs);
-    static const Element * ALLOCATION(RenderScript *rs);
-    static const Element * SAMPLER(RenderScript *rs);
-    static const Element * SCRIPT(RenderScript *rs);
-    static const Element * MESH(RenderScript *rs);
-    static const Element * PROGRAM_FRAGMENT(RenderScript *rs);
-    static const Element * PROGRAM_VERTEX(RenderScript *rs);
-    static const Element * PROGRAM_RASTER(RenderScript *rs);
-    static const Element * PROGRAM_STORE(RenderScript *rs);
-
-    static const Element * A_8(RenderScript *rs);
-    static const Element * RGB_565(RenderScript *rs);
-    static const Element * RGB_888(RenderScript *rs);
-    static const Element * RGBA_5551(RenderScript *rs);
-    static const Element * RGBA_4444(RenderScript *rs);
-    static const Element * RGBA_8888(RenderScript *rs);
-
-    static const Element * F32_2(RenderScript *rs);
-    static const Element * F32_3(RenderScript *rs);
-    static const Element * F32_4(RenderScript *rs);
-    static const Element * F64_2(RenderScript *rs);
-    static const Element * F64_3(RenderScript *rs);
-    static const Element * F64_4(RenderScript *rs);
-    static const Element * U8_2(RenderScript *rs);
-    static const Element * U8_3(RenderScript *rs);
-    static const Element * U8_4(RenderScript *rs);
-    static const Element * I8_2(RenderScript *rs);
-    static const Element * I8_3(RenderScript *rs);
-    static const Element * I8_4(RenderScript *rs);
-    static const Element * U16_2(RenderScript *rs);
-    static const Element * U16_3(RenderScript *rs);
-    static const Element * U16_4(RenderScript *rs);
-    static const Element * I16_2(RenderScript *rs);
-    static const Element * I16_3(RenderScript *rs);
-    static const Element * I16_4(RenderScript *rs);
-    static const Element * U32_2(RenderScript *rs);
-    static const Element * U32_3(RenderScript *rs);
-    static const Element * U32_4(RenderScript *rs);
-    static const Element * I32_2(RenderScript *rs);
-    static const Element * I32_3(RenderScript *rs);
-    static const Element * I32_4(RenderScript *rs);
-    static const Element * U64_2(RenderScript *rs);
-    static const Element * U64_3(RenderScript *rs);
-    static const Element * U64_4(RenderScript *rs);
-    static const Element * I64_2(RenderScript *rs);
-    static const Element * I64_3(RenderScript *rs);
-    static const Element * I64_4(RenderScript *rs);
-    static const Element * MATRIX_4X4(RenderScript *rs);
-    static const Element * MATRIX_3X3(RenderScript *rs);
-    static const Element * MATRIX_2X2(RenderScript *rs);
-
-    Element(void *id, RenderScript *rs,
-            android::Vector<const Element *> &elements,
-            android::Vector<android::String8> &elementNames,
-            android::Vector<uint32_t> &arraySizes);
-    Element(void *id, RenderScript *rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
-    Element(RenderScript *rs);
-    virtual ~Element();
-
-    void updateFromNative();
-    static const Element * createUser(RenderScript *rs, RsDataType dt);
-    static const Element * createVector(RenderScript *rs, RsDataType dt, uint32_t size);
-    static const Element * createPixel(RenderScript *rs, RsDataType dt, RsDataKind dk);
-    bool isCompatible(const Element *e);
-
-    class Builder {
-    private:
-        RenderScript *mRS;
-        android::Vector<const Element *> mElements;
-        android::Vector<android::String8> mElementNames;
-        android::Vector<uint32_t> mArraySizes;
-        bool mSkipPadding;
-
-    public:
-        Builder(RenderScript *rs);
-        ~Builder();
-        void add(const Element *, android::String8 &name, uint32_t arraySize = 1);
-        const Element * create();
-    };
-
-private:
-    void updateVisibleSubElements();
-
-    android::Vector<const Element *> mElements;
-    android::Vector<android::String8> mElementNames;
-    android::Vector<uint32_t> mArraySizes;
-    android::Vector<uint32_t> mVisibleElementMap;
-    android::Vector<uint32_t> mOffsetInBytes;
-
-    RsDataType mType;
-    RsDataKind mKind;
-    bool mNormalized;
-    size_t mSizeBytes;
-    size_t mVectorSize;
-};
-
-#endif
diff --git a/libs/rs/RenderScript.cpp b/libs/rs/RenderScript.cpp
deleted file mode 100644
index 217b921..0000000
--- a/libs/rs/RenderScript.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#define LOG_TAG "libRS_cpp"
-
-#include <utils/Log.h>
-#include <malloc.h>
-#include <string.h>
-
-#include "RenderScript.h"
-#include "rs.h"
-
-bool RenderScript::gInitialized = false;
-pthread_mutex_t RenderScript::gInitMutex = PTHREAD_MUTEX_INITIALIZER;
-
-RenderScript::RenderScript() {
-    mDev = NULL;
-    mContext = NULL;
-    mErrorFunc = NULL;
-    mMessageFunc = NULL;
-    mMessageRun = false;
-
-    memset(&mElements, 0, sizeof(mElements));
-}
-
-RenderScript::~RenderScript() {
-    mMessageRun = false;
-
-    rsContextDeinitToClient(mContext);
-
-    void *res = NULL;
-    int status = pthread_join(mMessageThreadId, &res);
-
-    rsContextDestroy(mContext);
-    mContext = NULL;
-    rsDeviceDestroy(mDev);
-    mDev = NULL;
-}
-
-bool RenderScript::init(int targetApi) {
-    mDev = rsDeviceCreate();
-    if (mDev == 0) {
-        ALOGE("Device creation failed");
-        return false;
-    }
-
-    mContext = rsContextCreate(mDev, 0, targetApi);
-    if (mContext == 0) {
-        ALOGE("Context creation failed");
-        return false;
-    }
-
-
-    pid_t mNativeMessageThreadId;
-
-    int status = pthread_create(&mMessageThreadId, NULL, threadProc, this);
-    if (status) {
-        ALOGE("Failed to start RenderScript message thread.");
-        return false;
-    }
-    // Wait for the message thread to be active.
-    while (!mMessageRun) {
-        usleep(1000);
-    }
-
-    return true;
-}
-
-void RenderScript::throwError(const char *err) const {
-    ALOGE("RS CPP error: %s", err);
-    int * v = NULL;
-    v[0] = 0;
-}
-
-
-void * RenderScript::threadProc(void *vrsc) {
-    RenderScript *rs = static_cast<RenderScript *>(vrsc);
-    size_t rbuf_size = 256;
-    void * rbuf = malloc(rbuf_size);
-
-    rsContextInitToClient(rs->mContext);
-    rs->mMessageRun = true;
-
-    while (rs->mMessageRun) {
-        size_t receiveLen = 0;
-        uint32_t usrID = 0;
-        uint32_t subID = 0;
-        RsMessageToClientType r = rsContextPeekMessage(rs->mContext,
-                                                       &receiveLen, sizeof(receiveLen),
-                                                       &usrID, sizeof(usrID));
-
-        if (receiveLen >= rbuf_size) {
-            rbuf_size = receiveLen + 32;
-            rbuf = realloc(rbuf, rbuf_size);
-        }
-        if (!rbuf) {
-            ALOGE("RenderScript::message handler realloc error %zu", rbuf_size);
-            // No clean way to recover now?
-        }
-        rsContextGetMessage(rs->mContext, rbuf, rbuf_size, &receiveLen, sizeof(receiveLen),
-                            &subID, sizeof(subID));
-
-        switch(r) {
-        case RS_MESSAGE_TO_CLIENT_ERROR:
-            ALOGE("RS Error %s", (const char *)rbuf);
-
-            if(rs->mMessageFunc != NULL) {
-                rs->mErrorFunc(usrID, (const char *)rbuf);
-            }
-            break;
-        case RS_MESSAGE_TO_CLIENT_EXCEPTION:
-            // teardown. But we want to avoid starving other threads during
-            // teardown by yielding until the next line in the destructor can
-            // execute to set mRun = false
-            usleep(1000);
-            break;
-        case RS_MESSAGE_TO_CLIENT_USER:
-            if(rs->mMessageFunc != NULL) {
-                rs->mMessageFunc(usrID, rbuf, receiveLen);
-            } else {
-                ALOGE("Received a message from the script with no message handler installed.");
-            }
-            break;
-
-        default:
-            ALOGE("RenderScript unknown message type %i", r);
-        }
-    }
-
-    if (rbuf) {
-        free(rbuf);
-    }
-    ALOGE("RenderScript Message thread exiting.");
-    return NULL;
-}
-
-void RenderScript::setErrorHandler(ErrorHandlerFunc_t func) {
-    mErrorFunc = func;
-}
-
-void RenderScript::setMessageHandler(MessageHandlerFunc_t func) {
-    mMessageFunc  = func;
-}
-
-void RenderScript::contextDump() {
-}
-
-void RenderScript::finish() {
-
-}
-
-
diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
deleted file mode 100644
index 5ad76e2..0000000
--- a/libs/rs/RenderScript.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#ifndef ANDROID_RENDERSCRIPT_H
-#define ANDROID_RENDERSCRIPT_H
-
-
-#include <pthread.h>
-#include <utils/String8.h>
-#include <utils/Vector.h>
-
-#include "rsDefines.h"
-
-class Element;
-class Type;
-class Allocation;
-
-class RenderScript {
-    friend class BaseObj;
-    friend class Allocation;
-    friend class Element;
-    friend class Type;
-    friend class Script;
-    friend class ScriptC;
-
-public:
-    RenderScript();
-    virtual ~RenderScript();
-
-    typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText);
-    typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen);
-
-
-    void setErrorHandler(ErrorHandlerFunc_t func);
-    ErrorHandlerFunc_t getErrorHandler() {return mErrorFunc;}
-
-    void setMessageHandler(MessageHandlerFunc_t func);
-    MessageHandlerFunc_t getMessageHandler() {return mMessageFunc;}
-
-    bool init(int targetApi);
-    void contextDump();
-    void finish();
-
-private:
-    static bool gInitialized;
-    static pthread_mutex_t gInitMutex;
-
-    pthread_t mMessageThreadId;
-    pid_t mNativeMessageThreadId;
-    bool mMessageRun;
-
-    RsDevice mDev;
-    RsContext mContext;
-
-    ErrorHandlerFunc_t mErrorFunc;
-    MessageHandlerFunc_t mMessageFunc;
-
-    struct {
-        Element *U8;
-        Element *I8;
-        Element *U16;
-        Element *I16;
-        Element *U32;
-        Element *I32;
-        Element *U64;
-        Element *I64;
-        Element *F32;
-        Element *F64;
-        Element *BOOLEAN;
-
-        Element *ELEMENT;
-        Element *TYPE;
-        Element *ALLOCATION;
-        Element *SAMPLER;
-        Element *SCRIPT;
-        Element *MESH;
-        Element *PROGRAM_FRAGMENT;
-        Element *PROGRAM_VERTEX;
-        Element *PROGRAM_RASTER;
-        Element *PROGRAM_STORE;
-
-        Element *A_8;
-        Element *RGB_565;
-        Element *RGB_888;
-        Element *RGBA_5551;
-        Element *RGBA_4444;
-        Element *RGBA_8888;
-
-        Element *FLOAT_2;
-        Element *FLOAT_3;
-        Element *FLOAT_4;
-
-        Element *DOUBLE_2;
-        Element *DOUBLE_3;
-        Element *DOUBLE_4;
-
-        Element *UCHAR_2;
-        Element *UCHAR_3;
-        Element *UCHAR_4;
-
-        Element *CHAR_2;
-        Element *CHAR_3;
-        Element *CHAR_4;
-
-        Element *USHORT_2;
-        Element *USHORT_3;
-        Element *USHORT_4;
-
-        Element *SHORT_2;
-        Element *SHORT_3;
-        Element *SHORT_4;
-
-        Element *UINT_2;
-        Element *UINT_3;
-        Element *UINT_4;
-
-        Element *INT_2;
-        Element *INT_3;
-        Element *INT_4;
-
-        Element *ULONG_2;
-        Element *ULONG_3;
-        Element *ULONG_4;
-
-        Element *LONG_2;
-        Element *LONG_3;
-        Element *LONG_4;
-
-        Element *MATRIX_4X4;
-        Element *MATRIX_3X3;
-        Element *MATRIX_2X2;
-    } mElements;
-
-
-
-    void throwError(const char *err) const;
-
-    static void * threadProc(void *);
-
-};
-
-#endif
-
diff --git a/libs/rs/Script.cpp b/libs/rs/Script.cpp
deleted file mode 100644
index c87d460..0000000
--- a/libs/rs/Script.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#define LOG_TAG "libRS_cpp"
-
-#include <utils/Log.h>
-#include <malloc.h>
-
-#include "RenderScript.h"
-#include "Element.h"
-#include "Type.h"
-#include "Allocation.h"
-#include "Script.h"
-
-void Script::invoke(uint32_t slot, const void *v, size_t len) const {
-    rsScriptInvokeV(mRS->mContext, getID(), slot, v, len);
-}
-
-void Script::forEach(uint32_t slot, const Allocation *ain, const Allocation *aout,
-                       const void *usr, size_t usrLen) const {
-    if ((ain == NULL) && (aout == NULL)) {
-        mRS->throwError("At least one of ain or aout is required to be non-null.");
-    }
-    void *in_id = BaseObj::getObjID(ain);
-    void *out_id = BaseObj::getObjID(aout);
-    rsScriptForEach(mRS->mContext, getID(), slot, in_id, out_id, usr, usrLen);
-}
-
-
-Script::Script(void *id, RenderScript *rs) : BaseObj(id, rs) {
-}
-
-
-void Script::bindAllocation(const Allocation *va, uint32_t slot) const {
-    rsScriptBindAllocation(mRS->mContext, getID(), BaseObj::getObjID(va), slot);
-}
-
-
-void Script::setVar(uint32_t index, const BaseObj *o) const {
-    rsScriptSetVarObj(mRS->mContext, getID(), index, (o == NULL) ? 0 : o->getID());
-}
-
-void Script::setVar(uint32_t index, const void *v, size_t len) const {
-    rsScriptSetVarV(mRS->mContext, getID(), index, v, len);
-}
-
-
-
-void Script::FieldBase::init(RenderScript *rs, uint32_t dimx, uint32_t usages) {
-    mAllocation = Allocation::createSized(rs, mElement, dimx, RS_ALLOCATION_USAGE_SCRIPT | usages);
-}
-
-//Script::FieldBase::FieldBase() {
-//}
-
-
diff --git a/libs/rs/Script.h b/libs/rs/Script.h
deleted file mode 100644
index 0700898..0000000
--- a/libs/rs/Script.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#ifndef __ANDROID_SCRIPT_H__
-#define __ANDROID_SCRIPT_H__
-
-#include <pthread.h>
-#include <rs.h>
-
-#include "RenderScript.h"
-#include "Allocation.h"
-
-class Type;
-class Element;
-class Allocation;
-
-class Script : public BaseObj {
-protected:
-    Script(void *id, RenderScript *rs);
-    void forEach(uint32_t slot, const Allocation *in, const Allocation *out, const void *v, size_t) const;
-    void bindAllocation(const Allocation *va, uint32_t slot) const;
-    void setVar(uint32_t index, const void *, size_t len) const;
-    void setVar(uint32_t index, const BaseObj *o) const;
-    void invoke(uint32_t slot, const void *v, size_t len) const;
-
-
-    void invoke(uint32_t slot) const {
-        invoke(slot, NULL, 0);
-    }
-    void setVar(uint32_t index, float v) const {
-        setVar(index, &v, sizeof(v));
-    }
-    void setVar(uint32_t index, double v) const {
-        setVar(index, &v, sizeof(v));
-    }
-    void setVar(uint32_t index, int32_t v) const {
-        setVar(index, &v, sizeof(v));
-    }
-    void setVar(uint32_t index, int64_t v) const {
-        setVar(index, &v, sizeof(v));
-    }
-    void setVar(uint32_t index, bool v) const {
-        setVar(index, &v, sizeof(v));
-    }
-
-public:
-    class FieldBase {
-    protected:
-        const Element *mElement;
-        Allocation *mAllocation;
-
-        void init(RenderScript *rs, uint32_t dimx, uint32_t usages = 0);
-
-    public:
-        const Element *getElement() {
-            return mElement;
-        }
-
-        const Type *getType() {
-            return mAllocation->getType();
-        }
-
-        const Allocation *getAllocation() {
-            return mAllocation;
-        }
-
-        //void updateAllocation();
-    };
-};
-
-#endif
diff --git a/libs/rs/ScriptC.cpp b/libs/rs/ScriptC.cpp
deleted file mode 100644
index 80e8efc..0000000
--- a/libs/rs/ScriptC.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#define LOG_TAG "libRS_cpp"
-
-#include <utils/Log.h>
-#include <malloc.h>
-
-#include "ScriptC.h"
-
-ScriptC::ScriptC(RenderScript *rs,
-                 const void *codeTxt, size_t codeLength,
-                 const char *cachedName, size_t cachedNameLength,
-                 const char *cacheDir, size_t cacheDirLength)
-: Script(NULL, rs) {
-    mID = rsScriptCCreate(rs->mContext, cachedName, cachedNameLength,
-                          cacheDir, cacheDirLength, (const char *)codeTxt, codeLength);
-}
-
diff --git a/libs/rs/ScriptC.h b/libs/rs/ScriptC.h
deleted file mode 100644
index b68f61c..0000000
--- a/libs/rs/ScriptC.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2008-2012 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.
- */
-
-#ifndef __ANDROID_SCRIPTC_H__
-#define __ANDROID_SCRIPTC_H__
-
-#include <pthread.h>
-#include <rs.h>
-
-#include "Script.h"
-
-class ScriptC : public Script {
-protected:
-    ScriptC(RenderScript *rs,
-            const void *codeTxt, size_t codeLength,
-            const char *cachedName, size_t cachedNameLength,
-            const char *cacheDir, size_t cacheDirLength);
-
-};
-
-#endif
diff --git a/libs/rs/Type.cpp b/libs/rs/Type.cpp
deleted file mode 100644
index 1352bd7..0000000
--- a/libs/rs/Type.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2008 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.
- */
-
-#define LOG_TAG "libRS_cpp"
-
-#include <utils/Log.h>
-#include <malloc.h>
-#include <string.h>
-
-#include "RenderScript.h"
-#include "Element.h"
-#include "Type.h"
-
-void Type::calcElementCount() {
-    bool hasLod = hasMipmaps();
-    uint32_t x = getX();
-    uint32_t y = getY();
-    uint32_t z = getZ();
-    uint32_t faces = 1;
-    if (hasFaces()) {
-        faces = 6;
-    }
-    if (x == 0) {
-        x = 1;
-    }
-    if (y == 0) {
-        y = 1;
-    }
-    if (z == 0) {
-        z = 1;
-    }
-
-    uint32_t count = x * y * z * faces;
-    while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
-        if(x > 1) {
-            x >>= 1;
-        }
-        if(y > 1) {
-            y >>= 1;
-        }
-        if(z > 1) {
-            z >>= 1;
-        }
-
-        count += x * y * z * faces;
-    }
-    mElementCount = count;
-}
-
-
-Type::Type(void *id, RenderScript *rs) : BaseObj(id, rs) {
-    mDimX = 0;
-    mDimY = 0;
-    mDimZ = 0;
-    mDimMipmaps = false;
-    mDimFaces = false;
-    mElement = NULL;
-}
-
-void Type::updateFromNative() {
-    // We have 6 integer to obtain mDimX; mDimY; mDimZ;
-    // mDimLOD; mDimFaces; mElement;
-
-    /*
-    int[] dataBuffer = new int[6];
-    mRS.nTypeGetNativeData(getID(), dataBuffer);
-
-    mDimX = dataBuffer[0];
-    mDimY = dataBuffer[1];
-    mDimZ = dataBuffer[2];
-    mDimMipmaps = dataBuffer[3] == 1 ? true : false;
-    mDimFaces = dataBuffer[4] == 1 ? true : false;
-
-    int elementID = dataBuffer[5];
-    if(elementID != 0) {
-        mElement = new Element(elementID, mRS);
-        mElement.updateFromNative();
-    }
-    calcElementCount();
-    */
-}
-
-Type::Builder::Builder(RenderScript *rs, const Element *e) {
-    mRS = rs;
-    mElement = e;
-    mDimX = 0;
-    mDimY = 0;
-    mDimZ = 0;
-    mDimMipmaps = false;
-    mDimFaces = false;
-}
-
-void Type::Builder::setX(uint32_t value) {
-    if(value < 1) {
-        ALOGE("Values of less than 1 for Dimension X are not valid.");
-    }
-    mDimX = value;
-}
-
-void Type::Builder::setY(int value) {
-    if(value < 1) {
-        ALOGE("Values of less than 1 for Dimension Y are not valid.");
-    }
-    mDimY = value;
-}
-
-void Type::Builder::setMipmaps(bool value) {
-    mDimMipmaps = value;
-}
-
-void Type::Builder::setFaces(bool value) {
-    mDimFaces = value;
-}
-
-const Type * Type::Builder::create() {
-    if (mDimZ > 0) {
-        if ((mDimX < 1) || (mDimY < 1)) {
-            ALOGE("Both X and Y dimension required when Z is present.");
-        }
-        if (mDimFaces) {
-            ALOGE("Cube maps not supported with 3D types.");
-        }
-    }
-    if (mDimY > 0) {
-        if (mDimX < 1) {
-            ALOGE("X dimension required when Y is present.");
-        }
-    }
-    if (mDimFaces) {
-        if (mDimY < 1) {
-            ALOGE("Cube maps require 2D Types.");
-        }
-    }
-
-    void * id = rsTypeCreate(mRS->mContext, mElement->getID(), mDimX, mDimY, mDimZ, mDimMipmaps, mDimFaces);
-    Type *t = new Type(id, mRS);
-    t->mElement = mElement;
-    t->mDimX = mDimX;
-    t->mDimY = mDimY;
-    t->mDimZ = mDimZ;
-    t->mDimMipmaps = mDimMipmaps;
-    t->mDimFaces = mDimFaces;
-
-    t->calcElementCount();
-    return t;
-}
-
diff --git a/libs/rs/Type.h b/libs/rs/Type.h
deleted file mode 100644
index 53481c3..0000000
--- a/libs/rs/Type.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2008 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.
- */
-
-#ifndef __ANDROID_TYPE_H__
-#define __ANDROID_TYPE_H__
-
-#include <rs.h>
-#include "RenderScript.h"
-#include "Element.h"
-
-class Type : public BaseObj {
-protected:
-    friend class Allocation;
-
-    uint32_t mDimX;
-    uint32_t mDimY;
-    uint32_t mDimZ;
-    bool mDimMipmaps;
-    bool mDimFaces;
-    size_t mElementCount;
-    const Element *mElement;
-
-    void calcElementCount();
-    virtual void updateFromNative();
-
-public:
-
-    const Element* getElement() const {
-        return mElement;
-    }
-
-    uint32_t getX() const {
-        return mDimX;
-    }
-
-    uint32_t getY() const {
-        return mDimY;
-    }
-
-    uint32_t getZ() const {
-        return mDimZ;
-    }
-
-    bool hasMipmaps() const {
-        return mDimMipmaps;
-    }
-
-    bool hasFaces() const {
-        return mDimFaces;
-    }
-
-    size_t getCount() const {
-        return mElementCount;
-    }
-
-    size_t getSizeBytes() const {
-        return mElementCount * mElement->getSizeBytes();
-    }
-
-
-    Type(void *id, RenderScript *rs);
-
-
-    class Builder {
-    protected:
-        RenderScript *mRS;
-        uint32_t mDimX;
-        uint32_t mDimY;
-        uint32_t mDimZ;
-        bool mDimMipmaps;
-        bool mDimFaces;
-        const Element *mElement;
-
-    public:
-        Builder(RenderScript *rs, const Element *e);
-
-        void setX(uint32_t value);
-        void setY(int value);
-        void setMipmaps(bool value);
-        void setFaces(bool value);
-        const Type * create();
-    };
-
-};
-
-#endif
diff --git a/libs/rs/driver/rsdAllocation.cpp b/libs/rs/driver/rsdAllocation.cpp
deleted file mode 100644
index f358f93..0000000
--- a/libs/rs/driver/rsdAllocation.cpp
+++ /dev/null
@@ -1,648 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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 "rsdCore.h"
-#include "rsdBcc.h"
-#include "rsdRuntime.h"
-#include "rsdAllocation.h"
-#include "rsdFrameBufferObj.h"
-
-#include "rsAllocation.h"
-
-#include "system/window.h"
-#include "hardware/gralloc.h"
-#include "ui/Rect.h"
-#include "ui/GraphicBufferMapper.h"
-#include "gui/SurfaceTexture.h"
-
-#include <GLES/gl.h>
-#include <GLES2/gl2.h>
-#include <GLES/glext.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-
-
-const static GLenum gFaceOrder[] = {
-    GL_TEXTURE_CUBE_MAP_POSITIVE_X,
-    GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
-    GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
-    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
-    GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
-    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
-};
-
-
-GLenum rsdTypeToGLType(RsDataType t) {
-    switch (t) {
-    case RS_TYPE_UNSIGNED_5_6_5:    return GL_UNSIGNED_SHORT_5_6_5;
-    case RS_TYPE_UNSIGNED_5_5_5_1:  return GL_UNSIGNED_SHORT_5_5_5_1;
-    case RS_TYPE_UNSIGNED_4_4_4_4:  return GL_UNSIGNED_SHORT_4_4_4_4;
-
-    //case RS_TYPE_FLOAT_16:      return GL_HALF_FLOAT;
-    case RS_TYPE_FLOAT_32:      return GL_FLOAT;
-    case RS_TYPE_UNSIGNED_8:    return GL_UNSIGNED_BYTE;
-    case RS_TYPE_UNSIGNED_16:   return GL_UNSIGNED_SHORT;
-    case RS_TYPE_SIGNED_8:      return GL_BYTE;
-    case RS_TYPE_SIGNED_16:     return GL_SHORT;
-    default:    break;
-    }
-    return 0;
-}
-
-GLenum rsdKindToGLFormat(RsDataKind k) {
-    switch (k) {
-    case RS_KIND_PIXEL_L: return GL_LUMINANCE;
-    case RS_KIND_PIXEL_A: return GL_ALPHA;
-    case RS_KIND_PIXEL_LA: return GL_LUMINANCE_ALPHA;
-    case RS_KIND_PIXEL_RGB: return GL_RGB;
-    case RS_KIND_PIXEL_RGBA: return GL_RGBA;
-    case RS_KIND_PIXEL_DEPTH: return GL_DEPTH_COMPONENT16;
-    default: break;
-    }
-    return 0;
-}
-
-
-static void Update2DTexture(const Context *rsc, const Allocation *alloc, const void *ptr,
-                            uint32_t xoff, uint32_t yoff, uint32_t lod,
-                            RsAllocationCubemapFace face, uint32_t w, uint32_t h) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    rsAssert(drv->textureID);
-    RSD_CALL_GL(glBindTexture, drv->glTarget, drv->textureID);
-    RSD_CALL_GL(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
-    GLenum t = GL_TEXTURE_2D;
-    if (alloc->mHal.state.hasFaces) {
-        t = gFaceOrder[face];
-    }
-    RSD_CALL_GL(glTexSubImage2D, t, lod, xoff, yoff, w, h, drv->glFormat, drv->glType, ptr);
-}
-
-
-static void Upload2DTexture(const Context *rsc, const Allocation *alloc, bool isFirstUpload) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    RSD_CALL_GL(glBindTexture, drv->glTarget, drv->textureID);
-    RSD_CALL_GL(glPixelStorei, GL_UNPACK_ALIGNMENT, 1);
-
-    uint32_t faceCount = 1;
-    if (alloc->mHal.state.hasFaces) {
-        faceCount = 6;
-    }
-
-    rsdGLCheckError(rsc, "Upload2DTexture 1 ");
-    for (uint32_t face = 0; face < faceCount; face ++) {
-        for (uint32_t lod = 0; lod < alloc->mHal.state.type->getLODCount(); lod++) {
-            const uint8_t *p = (const uint8_t *)drv->mallocPtr;
-            p += alloc->mHal.state.type->getLODFaceOffset(lod, (RsAllocationCubemapFace)face, 0, 0);
-
-            GLenum t = GL_TEXTURE_2D;
-            if (alloc->mHal.state.hasFaces) {
-                t = gFaceOrder[face];
-            }
-
-            if (isFirstUpload) {
-                RSD_CALL_GL(glTexImage2D, t, lod, drv->glFormat,
-                             alloc->mHal.state.type->getLODDimX(lod),
-                             alloc->mHal.state.type->getLODDimY(lod),
-                             0, drv->glFormat, drv->glType, p);
-            } else {
-                RSD_CALL_GL(glTexSubImage2D, t, lod, 0, 0,
-                                alloc->mHal.state.type->getLODDimX(lod),
-                                alloc->mHal.state.type->getLODDimY(lod),
-                                drv->glFormat, drv->glType, p);
-            }
-        }
-    }
-
-    if (alloc->mHal.state.mipmapControl == RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE) {
-        RSD_CALL_GL(glGenerateMipmap, drv->glTarget);
-    }
-    rsdGLCheckError(rsc, "Upload2DTexture");
-}
-
-static void UploadToTexture(const Context *rsc, const Allocation *alloc) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_INPUT) {
-        if (!drv->textureID) {
-            RSD_CALL_GL(glGenTextures, 1, &drv->textureID);
-        }
-        return;
-    }
-
-    if (!drv->glType || !drv->glFormat) {
-        return;
-    }
-
-    if (!alloc->getPtr()) {
-        return;
-    }
-
-    bool isFirstUpload = false;
-
-    if (!drv->textureID) {
-        RSD_CALL_GL(glGenTextures, 1, &drv->textureID);
-        isFirstUpload = true;
-    }
-
-    Upload2DTexture(rsc, alloc, isFirstUpload);
-
-    if (!(alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT)) {
-        if (drv->mallocPtr) {
-            free(drv->mallocPtr);
-            drv->mallocPtr = NULL;
-        }
-    }
-    rsdGLCheckError(rsc, "UploadToTexture");
-}
-
-static void AllocateRenderTarget(const Context *rsc, const Allocation *alloc) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    if (!drv->glFormat) {
-        return;
-    }
-
-    if (!drv->renderTargetID) {
-        RSD_CALL_GL(glGenRenderbuffers, 1, &drv->renderTargetID);
-
-        if (!drv->renderTargetID) {
-            // This should generally not happen
-            ALOGE("allocateRenderTarget failed to gen mRenderTargetID");
-            rsc->dumpDebug();
-            return;
-        }
-        RSD_CALL_GL(glBindRenderbuffer, GL_RENDERBUFFER, drv->renderTargetID);
-        RSD_CALL_GL(glRenderbufferStorage, GL_RENDERBUFFER, drv->glFormat,
-                              alloc->mHal.state.dimensionX, alloc->mHal.state.dimensionY);
-    }
-    rsdGLCheckError(rsc, "AllocateRenderTarget");
-}
-
-static void UploadToBufferObject(const Context *rsc, const Allocation *alloc) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    rsAssert(!alloc->mHal.state.type->getDimY());
-    rsAssert(!alloc->mHal.state.type->getDimZ());
-
-    //alloc->mHal.state.usageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX;
-
-    if (!drv->bufferID) {
-        RSD_CALL_GL(glGenBuffers, 1, &drv->bufferID);
-    }
-    if (!drv->bufferID) {
-        ALOGE("Upload to buffer object failed");
-        drv->uploadDeferred = true;
-        return;
-    }
-    RSD_CALL_GL(glBindBuffer, drv->glTarget, drv->bufferID);
-    RSD_CALL_GL(glBufferData, drv->glTarget, alloc->mHal.state.type->getSizeBytes(),
-                 drv->mallocPtr, GL_DYNAMIC_DRAW);
-    RSD_CALL_GL(glBindBuffer, drv->glTarget, 0);
-    rsdGLCheckError(rsc, "UploadToBufferObject");
-}
-
-bool rsdAllocationInit(const Context *rsc, Allocation *alloc, bool forceZero) {
-    DrvAllocation *drv = (DrvAllocation *)calloc(1, sizeof(DrvAllocation));
-    if (!drv) {
-        return false;
-    }
-
-    void * ptr = alloc->mHal.state.usrPtr;
-    if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_IO_OUTPUT) {
-    } else {
-        ptr = malloc(alloc->mHal.state.type->getSizeBytes());
-        if (!ptr) {
-            free(drv);
-            return false;
-        }
-    }
-
-    drv->glTarget = GL_NONE;
-    if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) {
-        if (alloc->mHal.state.hasFaces) {
-            drv->glTarget = GL_TEXTURE_CUBE_MAP;
-        } else {
-            drv->glTarget = GL_TEXTURE_2D;
-        }
-    } else {
-        if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) {
-            drv->glTarget = GL_ARRAY_BUFFER;
-        }
-    }
-
-    drv->glType = rsdTypeToGLType(alloc->mHal.state.type->getElement()->getComponent().getType());
-    drv->glFormat = rsdKindToGLFormat(alloc->mHal.state.type->getElement()->getComponent().getKind());
-
-
-    alloc->mHal.drvState.mallocPtr = ptr;
-    drv->mallocPtr = (uint8_t *)ptr;
-    alloc->mHal.drv = drv;
-    if (forceZero && ptr) {
-        memset(ptr, 0, alloc->mHal.state.type->getSizeBytes());
-    }
-
-    if (alloc->mHal.state.usageFlags & ~RS_ALLOCATION_USAGE_SCRIPT) {
-        drv->uploadDeferred = true;
-    }
-
-    drv->readBackFBO = NULL;
-
-    return true;
-}
-
-void rsdAllocationDestroy(const Context *rsc, Allocation *alloc) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    if (drv->bufferID) {
-        // Causes a SW crash....
-        //ALOGV(" mBufferID %i", mBufferID);
-        //glDeleteBuffers(1, &mBufferID);
-        //mBufferID = 0;
-    }
-    if (drv->textureID) {
-        RSD_CALL_GL(glDeleteTextures, 1, &drv->textureID);
-        drv->textureID = 0;
-    }
-    if (drv->renderTargetID) {
-        RSD_CALL_GL(glDeleteRenderbuffers, 1, &drv->renderTargetID);
-        drv->renderTargetID = 0;
-    }
-
-    if (drv->mallocPtr && !alloc->mHal.state.usrPtr) {
-        free(drv->mallocPtr);
-        drv->mallocPtr = NULL;
-    }
-    if (drv->readBackFBO != NULL) {
-        delete drv->readBackFBO;
-        drv->readBackFBO = NULL;
-    }
-    free(drv);
-    alloc->mHal.drv = NULL;
-}
-
-void rsdAllocationResize(const Context *rsc, const Allocation *alloc,
-                         const Type *newType, bool zeroNew) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    drv->mallocPtr = (uint8_t *)realloc(drv->mallocPtr, newType->getSizeBytes());
-
-    // fixme
-    ((Allocation *)alloc)->mHal.drvState.mallocPtr = drv->mallocPtr;
-
-    const uint32_t oldDimX = alloc->mHal.state.dimensionX;
-    const uint32_t dimX = newType->getDimX();
-
-    if (dimX > oldDimX) {
-        const Element *e = alloc->mHal.state.type->getElement();
-        uint32_t stride = e->getSizeBytes();
-        memset(((uint8_t *)drv->mallocPtr) + stride * oldDimX, 0, stride * (dimX - oldDimX));
-    }
-}
-
-static void rsdAllocationSyncFromFBO(const Context *rsc, const Allocation *alloc) {
-    if (!alloc->getIsScript()) {
-        return; // nothing to sync
-    }
-
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-    RsdFrameBufferObj *lastFbo = dc->gl.currentFrameBuffer;
-
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-    if (!drv->textureID && !drv->renderTargetID) {
-        return; // nothing was rendered here yet, so nothing to sync
-    }
-    if (drv->readBackFBO == NULL) {
-        drv->readBackFBO = new RsdFrameBufferObj();
-        drv->readBackFBO->setColorTarget(drv, 0);
-        drv->readBackFBO->setDimensions(alloc->getType()->getDimX(),
-                                        alloc->getType()->getDimY());
-    }
-
-    // Bind the framebuffer object so we can read back from it
-    drv->readBackFBO->setActive(rsc);
-
-    // Do the readback
-    RSD_CALL_GL(glReadPixels, 0, 0, alloc->getType()->getDimX(), alloc->getType()->getDimY(),
-                 drv->glFormat, drv->glType, alloc->getPtr());
-
-    // Revert framebuffer to its original
-    lastFbo->setActive(rsc);
-}
-
-
-void rsdAllocationSyncAll(const Context *rsc, const Allocation *alloc,
-                         RsAllocationUsageType src) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    if (src == RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) {
-        if(!alloc->getIsRenderTarget()) {
-            rsc->setError(RS_ERROR_FATAL_DRIVER,
-                          "Attempting to sync allocation from render target, "
-                          "for non-render target allocation");
-        } else if (alloc->getType()->getElement()->getKind() != RS_KIND_PIXEL_RGBA) {
-            rsc->setError(RS_ERROR_FATAL_DRIVER, "Cannot only sync from RGBA"
-                                                 "render target");
-        } else {
-            rsdAllocationSyncFromFBO(rsc, alloc);
-        }
-        return;
-    }
-
-    rsAssert(src == RS_ALLOCATION_USAGE_SCRIPT);
-
-    if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) {
-        UploadToTexture(rsc, alloc);
-    } else {
-        if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) {
-            AllocateRenderTarget(rsc, alloc);
-        }
-    }
-    if (alloc->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) {
-        UploadToBufferObject(rsc, alloc);
-    }
-
-    drv->uploadDeferred = false;
-}
-
-void rsdAllocationMarkDirty(const Context *rsc, const Allocation *alloc) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-    drv->uploadDeferred = true;
-}
-
-int32_t rsdAllocationInitSurfaceTexture(const Context *rsc, const Allocation *alloc) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-    UploadToTexture(rsc, alloc);
-    return drv->textureID;
-}
-
-static bool IoGetBuffer(const Context *rsc, Allocation *alloc, ANativeWindow *nw) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    int32_t r = nw->dequeueBuffer(nw, &drv->wndBuffer);
-    if (r) {
-        rsc->setError(RS_ERROR_DRIVER, "Error getting next IO output buffer.");
-        return false;
-    }
-
-    // This lock is implicitly released by the queue buffer in IoSend
-    r = nw->lockBuffer(nw, drv->wndBuffer);
-    if (r) {
-        rsc->setError(RS_ERROR_DRIVER, "Error locking next IO output buffer.");
-        return false;
-    }
-
-    // Must lock the whole surface
-    GraphicBufferMapper &mapper = GraphicBufferMapper::get();
-    Rect bounds(drv->wndBuffer->width, drv->wndBuffer->height);
-
-    void *dst = NULL;
-    mapper.lock(drv->wndBuffer->handle,
-            GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_OFTEN,
-            bounds, &dst);
-    alloc->mHal.drvState.mallocPtr = dst;
-    return true;
-}
-
-void rsdAllocationSetSurfaceTexture(const Context *rsc, Allocation *alloc, ANativeWindow *nw) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    //ALOGE("rsdAllocationSetSurfaceTexture %p  %p", alloc, nw);
-
-    // Cleanup old surface if there is one.
-    if (alloc->mHal.state.wndSurface) {
-        ANativeWindow *old = alloc->mHal.state.wndSurface;
-        GraphicBufferMapper &mapper = GraphicBufferMapper::get();
-        mapper.unlock(drv->wndBuffer->handle);
-        old->queueBuffer(old, drv->wndBuffer);
-    }
-
-    if (nw != NULL) {
-        int32_t r;
-        r = native_window_set_usage(nw, GRALLOC_USAGE_SW_READ_RARELY |
-                                        GRALLOC_USAGE_SW_WRITE_OFTEN);
-        if (r) {
-            rsc->setError(RS_ERROR_DRIVER, "Error setting IO output buffer usage.");
-            return;
-        }
-
-        r = native_window_set_buffers_dimensions(nw, alloc->mHal.state.dimensionX,
-                                                 alloc->mHal.state.dimensionY);
-        if (r) {
-            rsc->setError(RS_ERROR_DRIVER, "Error setting IO output buffer dimensions.");
-            return;
-        }
-
-        r = native_window_set_buffer_count(nw, 3);
-        if (r) {
-            rsc->setError(RS_ERROR_DRIVER, "Error setting IO output buffer count.");
-            return;
-        }
-
-        IoGetBuffer(rsc, alloc, nw);
-    }
-}
-
-void rsdAllocationIoSend(const Context *rsc, Allocation *alloc) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-    ANativeWindow *nw = alloc->mHal.state.wndSurface;
-
-    GraphicBufferMapper &mapper = GraphicBufferMapper::get();
-    mapper.unlock(drv->wndBuffer->handle);
-    int32_t r = nw->queueBuffer(nw, drv->wndBuffer);
-    if (r) {
-        rsc->setError(RS_ERROR_DRIVER, "Error sending IO output buffer.");
-        return;
-    }
-
-    IoGetBuffer(rsc, alloc, nw);
-}
-
-void rsdAllocationIoReceive(const Context *rsc, Allocation *alloc) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-    alloc->mHal.state.surfaceTexture->updateTexImage();
-}
-
-
-void rsdAllocationData1D(const Context *rsc, const Allocation *alloc,
-                         uint32_t xoff, uint32_t lod, uint32_t count,
-                         const void *data, size_t sizeBytes) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    const uint32_t eSize = alloc->mHal.state.type->getElementSizeBytes();
-    uint8_t * ptr = drv->mallocPtr;
-    ptr += eSize * xoff;
-    uint32_t size = count * eSize;
-
-    if (alloc->mHal.state.hasReferences) {
-        alloc->incRefs(data, count);
-        alloc->decRefs(ptr, count);
-    }
-
-    memcpy(ptr, data, size);
-    drv->uploadDeferred = true;
-}
-
-void rsdAllocationData2D(const Context *rsc, const Allocation *alloc,
-                         uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
-                         uint32_t w, uint32_t h, const void *data, size_t sizeBytes) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    uint32_t eSize = alloc->mHal.state.elementSizeBytes;
-    uint32_t lineSize = eSize * w;
-    uint32_t destW = alloc->mHal.state.dimensionX;
-
-    if (drv->mallocPtr) {
-        const uint8_t *src = static_cast<const uint8_t *>(data);
-        uint8_t *dst = drv->mallocPtr;
-        dst += alloc->mHal.state.type->getLODFaceOffset(lod, face, xoff, yoff);
-
-        for (uint32_t line=yoff; line < (yoff+h); line++) {
-            if (alloc->mHal.state.hasReferences) {
-                alloc->incRefs(src, w);
-                alloc->decRefs(dst, w);
-            }
-            memcpy(dst, src, lineSize);
-            src += lineSize;
-            dst += destW * eSize;
-        }
-        drv->uploadDeferred = true;
-    } else {
-        Update2DTexture(rsc, alloc, data, xoff, yoff, lod, face, w, h);
-    }
-}
-
-void rsdAllocationData3D(const Context *rsc, const Allocation *alloc,
-                         uint32_t xoff, uint32_t yoff, uint32_t zoff,
-                         uint32_t lod, RsAllocationCubemapFace face,
-                         uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes) {
-
-}
-
-void rsdAllocationData1D_alloc(const android::renderscript::Context *rsc,
-                               const android::renderscript::Allocation *dstAlloc,
-                               uint32_t dstXoff, uint32_t dstLod, uint32_t count,
-                               const android::renderscript::Allocation *srcAlloc,
-                               uint32_t srcXoff, uint32_t srcLod) {
-}
-
-uint8_t *getOffsetPtr(const android::renderscript::Allocation *alloc,
-                      uint32_t xoff, uint32_t yoff, uint32_t lod,
-                      RsAllocationCubemapFace face) {
-    uint8_t *ptr = static_cast<uint8_t *>(alloc->getPtr());
-    ptr += alloc->getType()->getLODOffset(lod, xoff, yoff);
-
-    if (face != 0) {
-        uint32_t totalSizeBytes = alloc->getType()->getSizeBytes();
-        uint32_t faceOffset = totalSizeBytes / 6;
-        ptr += faceOffset * (uint32_t)face;
-    }
-    return ptr;
-}
-
-
-void rsdAllocationData2D_alloc_script(const android::renderscript::Context *rsc,
-                                      const android::renderscript::Allocation *dstAlloc,
-                                      uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
-                                      RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
-                                      const android::renderscript::Allocation *srcAlloc,
-                                      uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
-                                      RsAllocationCubemapFace srcFace) {
-    uint32_t elementSize = dstAlloc->getType()->getElementSizeBytes();
-    for (uint32_t i = 0; i < h; i ++) {
-        uint8_t *dstPtr = getOffsetPtr(dstAlloc, dstXoff, dstYoff + i, dstLod, dstFace);
-        uint8_t *srcPtr = getOffsetPtr(srcAlloc, srcXoff, srcYoff + i, srcLod, srcFace);
-        memcpy(dstPtr, srcPtr, w * elementSize);
-
-        //ALOGE("COPIED dstXoff(%u), dstYoff(%u), dstLod(%u), dstFace(%u), w(%u), h(%u), srcXoff(%u), srcYoff(%u), srcLod(%u), srcFace(%u)",
-        //     dstXoff, dstYoff, dstLod, dstFace, w, h, srcXoff, srcYoff, srcLod, srcFace);
-    }
-}
-
-void rsdAllocationData2D_alloc(const android::renderscript::Context *rsc,
-                               const android::renderscript::Allocation *dstAlloc,
-                               uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
-                               RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
-                               const android::renderscript::Allocation *srcAlloc,
-                               uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
-                               RsAllocationCubemapFace srcFace) {
-    if (!dstAlloc->getIsScript() && !srcAlloc->getIsScript()) {
-        rsc->setError(RS_ERROR_FATAL_DRIVER, "Non-script allocation copies not "
-                                             "yet implemented.");
-        return;
-    }
-    rsdAllocationData2D_alloc_script(rsc, dstAlloc, dstXoff, dstYoff,
-                                     dstLod, dstFace, w, h, srcAlloc,
-                                     srcXoff, srcYoff, srcLod, srcFace);
-}
-
-void rsdAllocationData3D_alloc(const android::renderscript::Context *rsc,
-                               const android::renderscript::Allocation *dstAlloc,
-                               uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
-                               uint32_t dstLod, RsAllocationCubemapFace dstFace,
-                               uint32_t w, uint32_t h, uint32_t d,
-                               const android::renderscript::Allocation *srcAlloc,
-                               uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
-                               uint32_t srcLod, RsAllocationCubemapFace srcFace) {
-}
-
-void rsdAllocationElementData1D(const Context *rsc, const Allocation *alloc,
-                                uint32_t x,
-                                const void *data, uint32_t cIdx, uint32_t sizeBytes) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    uint32_t eSize = alloc->mHal.state.elementSizeBytes;
-    uint8_t * ptr = drv->mallocPtr;
-    ptr += eSize * x;
-
-    const Element * e = alloc->mHal.state.type->getElement()->getField(cIdx);
-    ptr += alloc->mHal.state.type->getElement()->getFieldOffsetBytes(cIdx);
-
-    if (alloc->mHal.state.hasReferences) {
-        e->incRefs(data);
-        e->decRefs(ptr);
-    }
-
-    memcpy(ptr, data, sizeBytes);
-    drv->uploadDeferred = true;
-}
-
-void rsdAllocationElementData2D(const Context *rsc, const Allocation *alloc,
-                                uint32_t x, uint32_t y,
-                                const void *data, uint32_t cIdx, uint32_t sizeBytes) {
-    DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-
-    uint32_t eSize = alloc->mHal.state.elementSizeBytes;
-    uint8_t * ptr = drv->mallocPtr;
-    ptr += eSize * (x + y * alloc->mHal.state.dimensionX);
-
-    const Element * e = alloc->mHal.state.type->getElement()->getField(cIdx);
-    ptr += alloc->mHal.state.type->getElement()->getFieldOffsetBytes(cIdx);
-
-    if (alloc->mHal.state.hasReferences) {
-        e->incRefs(data);
-        e->decRefs(ptr);
-    }
-
-    memcpy(ptr, data, sizeBytes);
-    drv->uploadDeferred = true;
-}
-
-
diff --git a/libs/rs/driver/rsdAllocation.h b/libs/rs/driver/rsdAllocation.h
deleted file mode 100644
index e3a5126..0000000
--- a/libs/rs/driver/rsdAllocation.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_ALLOCATION_H
-#define RSD_ALLOCATION_H
-
-#include <rs_hal.h>
-#include <rsRuntime.h>
-
-#include <GLES/gl.h>
-#include <GLES2/gl2.h>
-
-class RsdFrameBufferObj;
-struct ANativeWindowBuffer;
-
-struct DrvAllocation {
-    // Is this a legal structure to be used as a texture source.
-    // Initially this will require 1D or 2D and color data
-    uint32_t textureID;
-
-    // Is this a legal structure to be used as a vertex source.
-    // Initially this will require 1D and x(yzw).  Additional per element data
-    // is allowed.
-    uint32_t bufferID;
-
-    // Is this a legal structure to be used as an FBO render target
-    uint32_t renderTargetID;
-
-    uint8_t * mallocPtr;
-
-    GLenum glTarget;
-    GLenum glType;
-    GLenum glFormat;
-
-    bool uploadDeferred;
-
-    RsdFrameBufferObj * readBackFBO;
-    ANativeWindowBuffer *wndBuffer;
-};
-
-GLenum rsdTypeToGLType(RsDataType t);
-GLenum rsdKindToGLFormat(RsDataKind k);
-
-
-bool rsdAllocationInit(const android::renderscript::Context *rsc,
-                       android::renderscript::Allocation *alloc,
-                       bool forceZero);
-void rsdAllocationDestroy(const android::renderscript::Context *rsc,
-                          android::renderscript::Allocation *alloc);
-
-void rsdAllocationResize(const android::renderscript::Context *rsc,
-                         const android::renderscript::Allocation *alloc,
-                         const android::renderscript::Type *newType, bool zeroNew);
-void rsdAllocationSyncAll(const android::renderscript::Context *rsc,
-                          const android::renderscript::Allocation *alloc,
-                          RsAllocationUsageType src);
-void rsdAllocationMarkDirty(const android::renderscript::Context *rsc,
-                            const android::renderscript::Allocation *alloc);
-int32_t rsdAllocationInitSurfaceTexture(const android::renderscript::Context *rsc,
-                                        const android::renderscript::Allocation *alloc);
-void rsdAllocationSetSurfaceTexture(const android::renderscript::Context *rsc,
-                                    android::renderscript::Allocation *alloc, ANativeWindow *nw);
-void rsdAllocationIoSend(const android::renderscript::Context *rsc,
-                         android::renderscript::Allocation *alloc);
-void rsdAllocationIoReceive(const android::renderscript::Context *rsc,
-                            android::renderscript::Allocation *alloc);
-
-void rsdAllocationData1D(const android::renderscript::Context *rsc,
-                         const android::renderscript::Allocation *alloc,
-                         uint32_t xoff, uint32_t lod, uint32_t count,
-                         const void *data, uint32_t sizeBytes);
-void rsdAllocationData2D(const android::renderscript::Context *rsc,
-                         const android::renderscript::Allocation *alloc,
-                         uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
-                         uint32_t w, uint32_t h,
-                         const void *data, uint32_t sizeBytes);
-void rsdAllocationData3D(const android::renderscript::Context *rsc,
-                         const android::renderscript::Allocation *alloc,
-                         uint32_t xoff, uint32_t yoff, uint32_t zoff,
-                         uint32_t lod, RsAllocationCubemapFace face,
-                         uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes);
-
-void rsdAllocationData1D_alloc(const android::renderscript::Context *rsc,
-                               const android::renderscript::Allocation *dstAlloc,
-                               uint32_t dstXoff, uint32_t dstLod, uint32_t count,
-                               const android::renderscript::Allocation *srcAlloc,
-                               uint32_t srcXoff, uint32_t srcLod);
-void rsdAllocationData2D_alloc(const android::renderscript::Context *rsc,
-                               const android::renderscript::Allocation *dstAlloc,
-                               uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
-                               RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
-                               const android::renderscript::Allocation *srcAlloc,
-                               uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
-                               RsAllocationCubemapFace srcFace);
-void rsdAllocationData3D_alloc(const android::renderscript::Context *rsc,
-                               const android::renderscript::Allocation *dstAlloc,
-                               uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
-                               uint32_t dstLod, RsAllocationCubemapFace dstFace,
-                               uint32_t w, uint32_t h, uint32_t d,
-                               const android::renderscript::Allocation *srcAlloc,
-                               uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
-                               uint32_t srcLod, RsAllocationCubemapFace srcFace);
-
-void rsdAllocationElementData1D(const android::renderscript::Context *rsc,
-                                const android::renderscript::Allocation *alloc,
-                                uint32_t x,
-                                const void *data, uint32_t elementOff, uint32_t sizeBytes);
-void rsdAllocationElementData2D(const android::renderscript::Context *rsc,
-                                const android::renderscript::Allocation *alloc,
-                                uint32_t x, uint32_t y,
-                                const void *data, uint32_t elementOff, uint32_t sizeBytes);
-
-
-
-
-#endif
diff --git a/libs/rs/driver/rsdBcc.cpp b/libs/rs/driver/rsdBcc.cpp
deleted file mode 100644
index dd78684..0000000
--- a/libs/rs/driver/rsdBcc.cpp
+++ /dev/null
@@ -1,541 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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 "rsdCore.h"
-#include "rsdBcc.h"
-#include "rsdRuntime.h"
-
-#include <bcinfo/MetadataExtractor.h>
-
-#include "rsContext.h"
-#include "rsScriptC.h"
-
-#include "utils/Timers.h"
-#include "utils/StopWatch.h"
-extern "C" {
-#include "libdex/ZipArchive.h"
-}
-
-using namespace android;
-using namespace android::renderscript;
-
-struct DrvScript {
-    int (*mRoot)();
-    int (*mRootExpand)();
-    void (*mInit)();
-    void (*mFreeChildren)();
-
-    BCCScriptRef mBccScript;
-
-    bcinfo::MetadataExtractor *ME;
-
-    InvokeFunc_t *mInvokeFunctions;
-    ForEachFunc_t *mForEachFunctions;
-    void ** mFieldAddress;
-    bool * mFieldIsObject;
-    const uint32_t *mExportForEachSignatureList;
-
-    const uint8_t * mScriptText;
-    uint32_t mScriptTextLength;
-};
-
-typedef void (*outer_foreach_t)(
-    const android::renderscript::RsForEachStubParamStruct *,
-    uint32_t x1, uint32_t x2,
-    uint32_t instep, uint32_t outstep);
-
-static Script * setTLS(Script *sc) {
-    ScriptTLSStruct * tls = (ScriptTLSStruct *)pthread_getspecific(rsdgThreadTLSKey);
-    rsAssert(tls);
-    Script *old = tls->mScript;
-    tls->mScript = sc;
-    return old;
-}
-
-
-bool rsdScriptInit(const Context *rsc,
-                     ScriptC *script,
-                     char const *resName,
-                     char const *cacheDir,
-                     uint8_t const *bitcode,
-                     size_t bitcodeSize,
-                     uint32_t flags) {
-    //ALOGE("rsdScriptCreate %p %p %p %p %i %i %p", rsc, resName, cacheDir, bitcode, bitcodeSize, flags, lookupFunc);
-
-    pthread_mutex_lock(&rsdgInitMutex);
-
-    size_t exportFuncCount = 0;
-    size_t exportVarCount = 0;
-    size_t objectSlotCount = 0;
-    size_t exportForEachSignatureCount = 0;
-
-    DrvScript *drv = (DrvScript *)calloc(1, sizeof(DrvScript));
-    if (drv == NULL) {
-        goto error;
-    }
-    script->mHal.drv = drv;
-
-    drv->mBccScript = bccCreateScript();
-    script->mHal.info.isThreadable = true;
-    drv->mScriptText = bitcode;
-    drv->mScriptTextLength = bitcodeSize;
-
-
-    drv->ME = new bcinfo::MetadataExtractor((const char*)drv->mScriptText,
-                                            drv->mScriptTextLength);
-    if (!drv->ME->extract()) {
-      ALOGE("bcinfo: failed to read script metadata");
-      goto error;
-    }
-
-    //ALOGE("mBccScript %p", script->mBccScript);
-
-    if (bccRegisterSymbolCallback(drv->mBccScript, &rsdLookupRuntimeStub, script) != 0) {
-        ALOGE("bcc: FAILS to register symbol callback");
-        goto error;
-    }
-
-    if (bccReadBC(drv->mBccScript,
-                  resName,
-                  (char const *)drv->mScriptText,
-                  drv->mScriptTextLength, 0) != 0) {
-        ALOGE("bcc: FAILS to read bitcode");
-        goto error;
-    }
-
-    if (bccLinkFile(drv->mBccScript, "/system/lib/libclcore.bc", 0) != 0) {
-        ALOGE("bcc: FAILS to link bitcode");
-        goto error;
-    }
-
-    if (bccPrepareExecutable(drv->mBccScript, cacheDir, resName, 0) != 0) {
-        ALOGE("bcc: FAILS to prepare executable");
-        goto error;
-    }
-
-    drv->mRoot = reinterpret_cast<int (*)()>(bccGetFuncAddr(drv->mBccScript, "root"));
-    drv->mRootExpand = reinterpret_cast<int (*)()>(bccGetFuncAddr(drv->mBccScript, "root.expand"));
-    drv->mInit = reinterpret_cast<void (*)()>(bccGetFuncAddr(drv->mBccScript, "init"));
-    drv->mFreeChildren = reinterpret_cast<void (*)()>(bccGetFuncAddr(drv->mBccScript, ".rs.dtor"));
-
-    exportFuncCount = drv->ME->getExportFuncCount();
-    if (exportFuncCount > 0) {
-        drv->mInvokeFunctions = (InvokeFunc_t*) calloc(exportFuncCount,
-                                                       sizeof(InvokeFunc_t));
-        bccGetExportFuncList(drv->mBccScript, exportFuncCount,
-                             (void **) drv->mInvokeFunctions);
-    } else {
-        drv->mInvokeFunctions = NULL;
-    }
-
-    exportVarCount = drv->ME->getExportVarCount();
-    if (exportVarCount > 0) {
-        drv->mFieldAddress = (void **) calloc(exportVarCount, sizeof(void*));
-        drv->mFieldIsObject = (bool *) calloc(exportVarCount, sizeof(bool));
-        bccGetExportVarList(drv->mBccScript, exportVarCount,
-                            (void **) drv->mFieldAddress);
-    } else {
-        drv->mFieldAddress = NULL;
-        drv->mFieldIsObject = NULL;
-    }
-
-    objectSlotCount = drv->ME->getObjectSlotCount();
-    if (objectSlotCount > 0) {
-        const uint32_t *objectSlotList = drv->ME->getObjectSlotList();
-        for (uint32_t ct=0; ct < objectSlotCount; ct++) {
-            drv->mFieldIsObject[objectSlotList[ct]] = true;
-        }
-    }
-
-    exportForEachSignatureCount = drv->ME->getExportForEachSignatureCount();
-    drv->mExportForEachSignatureList = drv->ME->getExportForEachSignatureList();
-    if (exportForEachSignatureCount > 0) {
-        drv->mForEachFunctions =
-            (ForEachFunc_t*) calloc(exportForEachSignatureCount,
-                                    sizeof(ForEachFunc_t));
-        bccGetExportForEachList(drv->mBccScript, exportForEachSignatureCount,
-                                (void **) drv->mForEachFunctions);
-    } else {
-        drv->mForEachFunctions = NULL;
-    }
-
-    // Copy info over to runtime
-    script->mHal.info.exportedFunctionCount = drv->ME->getExportFuncCount();
-    script->mHal.info.exportedVariableCount = drv->ME->getExportVarCount();
-    script->mHal.info.exportedPragmaCount = drv->ME->getPragmaCount();
-    script->mHal.info.exportedPragmaKeyList = drv->ME->getPragmaKeyList();
-    script->mHal.info.exportedPragmaValueList = drv->ME->getPragmaValueList();
-
-    if (drv->mRootExpand) {
-      script->mHal.info.root = drv->mRootExpand;
-    } else {
-      script->mHal.info.root = drv->mRoot;
-    }
-
-    pthread_mutex_unlock(&rsdgInitMutex);
-    return true;
-
-error:
-
-    pthread_mutex_unlock(&rsdgInitMutex);
-    if (drv->ME) {
-        delete drv->ME;
-        drv->ME = NULL;
-    }
-    free(drv);
-    return false;
-
-}
-
-typedef struct {
-    Context *rsc;
-    Script *script;
-    ForEachFunc_t kernel;
-    uint32_t sig;
-    const Allocation * ain;
-    Allocation * aout;
-    const void * usr;
-    size_t usrLen;
-
-    uint32_t mSliceSize;
-    volatile int mSliceNum;
-
-    const uint8_t *ptrIn;
-    uint32_t eStrideIn;
-    uint8_t *ptrOut;
-    uint32_t eStrideOut;
-
-    uint32_t xStart;
-    uint32_t xEnd;
-    uint32_t yStart;
-    uint32_t yEnd;
-    uint32_t zStart;
-    uint32_t zEnd;
-    uint32_t arrayStart;
-    uint32_t arrayEnd;
-
-    uint32_t dimX;
-    uint32_t dimY;
-    uint32_t dimZ;
-    uint32_t dimArray;
-} MTLaunchStruct;
-typedef void (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t);
-
-static void wc_xy(void *usr, uint32_t idx) {
-    MTLaunchStruct *mtls = (MTLaunchStruct *)usr;
-    RsForEachStubParamStruct p;
-    memset(&p, 0, sizeof(p));
-    p.usr = mtls->usr;
-    p.usr_len = mtls->usrLen;
-    RsdHal * dc = (RsdHal *)mtls->rsc->mHal.drv;
-    uint32_t sig = mtls->sig;
-
-    outer_foreach_t fn = (outer_foreach_t) mtls->kernel;
-    while (1) {
-        uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum);
-        uint32_t yStart = mtls->yStart + slice * mtls->mSliceSize;
-        uint32_t yEnd = yStart + mtls->mSliceSize;
-        yEnd = rsMin(yEnd, mtls->yEnd);
-        if (yEnd <= yStart) {
-            return;
-        }
-
-        //ALOGE("usr idx %i, x %i,%i  y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd);
-        //ALOGE("usr ptr in %p,  out %p", mtls->ptrIn, mtls->ptrOut);
-        for (p.y = yStart; p.y < yEnd; p.y++) {
-            uint32_t offset = mtls->dimX * p.y;
-            p.out = mtls->ptrOut + (mtls->eStrideOut * offset);
-            p.in = mtls->ptrIn + (mtls->eStrideIn * offset);
-            fn(&p, mtls->xStart, mtls->xEnd, mtls->eStrideIn, mtls->eStrideOut);
-        }
-    }
-}
-
-static void wc_x(void *usr, uint32_t idx) {
-    MTLaunchStruct *mtls = (MTLaunchStruct *)usr;
-    RsForEachStubParamStruct p;
-    memset(&p, 0, sizeof(p));
-    p.usr = mtls->usr;
-    p.usr_len = mtls->usrLen;
-    RsdHal * dc = (RsdHal *)mtls->rsc->mHal.drv;
-    uint32_t sig = mtls->sig;
-
-    outer_foreach_t fn = (outer_foreach_t) mtls->kernel;
-    while (1) {
-        uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum);
-        uint32_t xStart = mtls->xStart + slice * mtls->mSliceSize;
-        uint32_t xEnd = xStart + mtls->mSliceSize;
-        xEnd = rsMin(xEnd, mtls->xEnd);
-        if (xEnd <= xStart) {
-            return;
-        }
-
-        //ALOGE("usr slice %i idx %i, x %i,%i", slice, idx, xStart, xEnd);
-        //ALOGE("usr ptr in %p,  out %p", mtls->ptrIn, mtls->ptrOut);
-
-        p.out = mtls->ptrOut + (mtls->eStrideOut * xStart);
-        p.in = mtls->ptrIn + (mtls->eStrideIn * xStart);
-        fn(&p, xStart, xEnd, mtls->eStrideIn, mtls->eStrideOut);
-    }
-}
-
-void rsdScriptInvokeForEach(const Context *rsc,
-                            Script *s,
-                            uint32_t slot,
-                            const Allocation * ain,
-                            Allocation * aout,
-                            const void * usr,
-                            uint32_t usrLen,
-                            const RsScriptCall *sc) {
-
-    RsdHal * dc = (RsdHal *)rsc->mHal.drv;
-
-    MTLaunchStruct mtls;
-    memset(&mtls, 0, sizeof(mtls));
-
-    DrvScript *drv = (DrvScript *)s->mHal.drv;
-    mtls.kernel = drv->mForEachFunctions[slot];
-    rsAssert(mtls.kernel != NULL);
-    mtls.sig = 0x1f;  // temp fix for old apps, full table in slang_rs_export_foreach.cpp
-    if (drv->mExportForEachSignatureList) {
-        mtls.sig = drv->mExportForEachSignatureList[slot];
-    }
-    if (ain) {
-        mtls.dimX = ain->getType()->getDimX();
-        mtls.dimY = ain->getType()->getDimY();
-        mtls.dimZ = ain->getType()->getDimZ();
-        //mtls.dimArray = ain->getType()->getDimArray();
-    } else if (aout) {
-        mtls.dimX = aout->getType()->getDimX();
-        mtls.dimY = aout->getType()->getDimY();
-        mtls.dimZ = aout->getType()->getDimZ();
-        //mtls.dimArray = aout->getType()->getDimArray();
-    } else {
-        rsc->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations");
-        return;
-    }
-
-    if (!sc || (sc->xEnd == 0)) {
-        mtls.xEnd = mtls.dimX;
-    } else {
-        rsAssert(sc->xStart < mtls.dimX);
-        rsAssert(sc->xEnd <= mtls.dimX);
-        rsAssert(sc->xStart < sc->xEnd);
-        mtls.xStart = rsMin(mtls.dimX, sc->xStart);
-        mtls.xEnd = rsMin(mtls.dimX, sc->xEnd);
-        if (mtls.xStart >= mtls.xEnd) return;
-    }
-
-    if (!sc || (sc->yEnd == 0)) {
-        mtls.yEnd = mtls.dimY;
-    } else {
-        rsAssert(sc->yStart < mtls.dimY);
-        rsAssert(sc->yEnd <= mtls.dimY);
-        rsAssert(sc->yStart < sc->yEnd);
-        mtls.yStart = rsMin(mtls.dimY, sc->yStart);
-        mtls.yEnd = rsMin(mtls.dimY, sc->yEnd);
-        if (mtls.yStart >= mtls.yEnd) return;
-    }
-
-    mtls.xEnd = rsMax((uint32_t)1, mtls.xEnd);
-    mtls.yEnd = rsMax((uint32_t)1, mtls.yEnd);
-    mtls.zEnd = rsMax((uint32_t)1, mtls.zEnd);
-    mtls.arrayEnd = rsMax((uint32_t)1, mtls.arrayEnd);
-
-    rsAssert(!ain || (ain->getType()->getDimZ() == 0));
-
-    Context *mrsc = (Context *)rsc;
-    Script * oldTLS = setTLS(s);
-
-    mtls.rsc = mrsc;
-    mtls.ain = ain;
-    mtls.aout = aout;
-    mtls.script = s;
-    mtls.usr = usr;
-    mtls.usrLen = usrLen;
-    mtls.mSliceSize = 10;
-    mtls.mSliceNum = 0;
-
-    mtls.ptrIn = NULL;
-    mtls.eStrideIn = 0;
-    if (ain) {
-        mtls.ptrIn = (const uint8_t *)ain->getPtr();
-        mtls.eStrideIn = ain->getType()->getElementSizeBytes();
-    }
-
-    mtls.ptrOut = NULL;
-    mtls.eStrideOut = 0;
-    if (aout) {
-        mtls.ptrOut = (uint8_t *)aout->getPtr();
-        mtls.eStrideOut = aout->getType()->getElementSizeBytes();
-    }
-
-    if ((dc->mWorkers.mCount > 1) && s->mHal.info.isThreadable) {
-        if (mtls.dimY > 1) {
-            rsdLaunchThreads(mrsc, wc_xy, &mtls);
-        } else {
-            rsdLaunchThreads(mrsc, wc_x, &mtls);
-        }
-
-        //ALOGE("launch 1");
-    } else {
-        RsForEachStubParamStruct p;
-        memset(&p, 0, sizeof(p));
-        p.usr = mtls.usr;
-        p.usr_len = mtls.usrLen;
-        uint32_t sig = mtls.sig;
-
-        //ALOGE("launch 3");
-        outer_foreach_t fn = (outer_foreach_t) mtls.kernel;
-        for (p.ar[0] = mtls.arrayStart; p.ar[0] < mtls.arrayEnd; p.ar[0]++) {
-            for (p.z = mtls.zStart; p.z < mtls.zEnd; p.z++) {
-                for (p.y = mtls.yStart; p.y < mtls.yEnd; p.y++) {
-                    uint32_t offset = mtls.dimX * mtls.dimY * mtls.dimZ * p.ar[0] +
-                                      mtls.dimX * mtls.dimY * p.z +
-                                      mtls.dimX * p.y;
-                    p.out = mtls.ptrOut + (mtls.eStrideOut * offset);
-                    p.in = mtls.ptrIn + (mtls.eStrideIn * offset);
-                    fn(&p, mtls.xStart, mtls.xEnd, mtls.eStrideIn,
-                       mtls.eStrideOut);
-                }
-            }
-        }
-    }
-
-    setTLS(oldTLS);
-}
-
-
-int rsdScriptInvokeRoot(const Context *dc, Script *script) {
-    DrvScript *drv = (DrvScript *)script->mHal.drv;
-
-    Script * oldTLS = setTLS(script);
-    int ret = drv->mRoot();
-    setTLS(oldTLS);
-
-    return ret;
-}
-
-void rsdScriptInvokeInit(const Context *dc, Script *script) {
-    DrvScript *drv = (DrvScript *)script->mHal.drv;
-
-    if (drv->mInit) {
-        drv->mInit();
-    }
-}
-
-void rsdScriptInvokeFreeChildren(const Context *dc, Script *script) {
-    DrvScript *drv = (DrvScript *)script->mHal.drv;
-
-    if (drv->mFreeChildren) {
-        drv->mFreeChildren();
-    }
-}
-
-void rsdScriptInvokeFunction(const Context *dc, Script *script,
-                            uint32_t slot,
-                            const void *params,
-                            size_t paramLength) {
-    DrvScript *drv = (DrvScript *)script->mHal.drv;
-    //ALOGE("invoke %p %p %i %p %i", dc, script, slot, params, paramLength);
-
-    Script * oldTLS = setTLS(script);
-    ((void (*)(const void *, uint32_t))
-        drv->mInvokeFunctions[slot])(params, paramLength);
-    setTLS(oldTLS);
-}
-
-void rsdScriptSetGlobalVar(const Context *dc, const Script *script,
-                           uint32_t slot, void *data, size_t dataLength) {
-    DrvScript *drv = (DrvScript *)script->mHal.drv;
-    //rsAssert(!script->mFieldIsObject[slot]);
-    //ALOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength);
-
-    int32_t *destPtr = ((int32_t **)drv->mFieldAddress)[slot];
-    if (!destPtr) {
-        //ALOGV("Calling setVar on slot = %i which is null", slot);
-        return;
-    }
-
-    memcpy(destPtr, data, dataLength);
-}
-
-void rsdScriptSetGlobalBind(const Context *dc, const Script *script, uint32_t slot, void *data) {
-    DrvScript *drv = (DrvScript *)script->mHal.drv;
-    //rsAssert(!script->mFieldIsObject[slot]);
-    //ALOGE("setGlobalBind %p %p %i %p", dc, script, slot, data);
-
-    int32_t *destPtr = ((int32_t **)drv->mFieldAddress)[slot];
-    if (!destPtr) {
-        //ALOGV("Calling setVar on slot = %i which is null", slot);
-        return;
-    }
-
-    memcpy(destPtr, &data, sizeof(void *));
-}
-
-void rsdScriptSetGlobalObj(const Context *dc, const Script *script, uint32_t slot, ObjectBase *data) {
-    DrvScript *drv = (DrvScript *)script->mHal.drv;
-    //rsAssert(script->mFieldIsObject[slot]);
-    //ALOGE("setGlobalObj %p %p %i %p", dc, script, slot, data);
-
-    int32_t *destPtr = ((int32_t **)drv->mFieldAddress)[slot];
-    if (!destPtr) {
-        //ALOGV("Calling setVar on slot = %i which is null", slot);
-        return;
-    }
-
-    rsrSetObject(dc, script, (ObjectBase **)destPtr, data);
-}
-
-void rsdScriptDestroy(const Context *dc, Script *script) {
-    DrvScript *drv = (DrvScript *)script->mHal.drv;
-
-    if (drv->mFieldAddress) {
-        size_t exportVarCount = drv->ME->getExportVarCount();
-        for (size_t ct = 0; ct < exportVarCount; ct++) {
-            if (drv->mFieldIsObject[ct]) {
-                // The field address can be NULL if the script-side has
-                // optimized the corresponding global variable away.
-                if (drv->mFieldAddress[ct]) {
-                    rsrClearObject(dc, script, (ObjectBase **)drv->mFieldAddress[ct]);
-                }
-            }
-        }
-        free(drv->mFieldAddress);
-        drv->mFieldAddress = NULL;
-        free(drv->mFieldIsObject);
-        drv->mFieldIsObject = NULL;    }
-
-    if (drv->mInvokeFunctions) {
-        free(drv->mInvokeFunctions);
-        drv->mInvokeFunctions = NULL;
-    }
-
-    if (drv->mForEachFunctions) {
-        free(drv->mForEachFunctions);
-        drv->mForEachFunctions = NULL;
-    }
-
-    delete drv->ME;
-    drv->ME = NULL;
-
-    free(drv);
-    script->mHal.drv = NULL;
-
-}
-
-
diff --git a/libs/rs/driver/rsdBcc.h b/libs/rs/driver/rsdBcc.h
deleted file mode 100644
index 5f83ed2..0000000
--- a/libs/rs/driver/rsdBcc.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_BCC_H
-#define RSD_BCC_H
-
-#include <rs_hal.h>
-#include <rsRuntime.h>
-
-
-bool rsdScriptInit(const android::renderscript::Context *, android::renderscript::ScriptC *,
-                   char const *resName, char const *cacheDir,
-                   uint8_t const *bitcode, size_t bitcodeSize, uint32_t flags);
-void rsdScriptInvokeFunction(const android::renderscript::Context *dc,
-                             android::renderscript::Script *script,
-                             uint32_t slot,
-                             const void *params,
-                             size_t paramLength);
-
-void rsdScriptInvokeForEach(const android::renderscript::Context *rsc,
-                            android::renderscript::Script *s,
-                            uint32_t slot,
-                            const android::renderscript::Allocation * ain,
-                            android::renderscript::Allocation * aout,
-                            const void * usr,
-                            uint32_t usrLen,
-                            const RsScriptCall *sc);
-
-int rsdScriptInvokeRoot(const android::renderscript::Context *dc,
-                        android::renderscript::Script *script);
-void rsdScriptInvokeInit(const android::renderscript::Context *dc,
-                         android::renderscript::Script *script);
-void rsdScriptInvokeFreeChildren(const android::renderscript::Context *dc,
-                                 android::renderscript::Script *script);
-
-void rsdScriptSetGlobalVar(const android::renderscript::Context *,
-                           const android::renderscript::Script *,
-                           uint32_t slot, void *data, size_t dataLen);
-void rsdScriptSetGlobalBind(const android::renderscript::Context *,
-                            const android::renderscript::Script *,
-                            uint32_t slot, void *data);
-void rsdScriptSetGlobalObj(const android::renderscript::Context *,
-                           const android::renderscript::Script *,
-                           uint32_t slot, android::renderscript::ObjectBase *data);
-
-void rsdScriptSetGlobal(const android::renderscript::Context *dc,
-                        const android::renderscript::Script *script,
-                        uint32_t slot,
-                        void *data,
-                        size_t dataLength);
-void rsdScriptGetGlobal(const android::renderscript::Context *dc,
-                        const android::renderscript::Script *script,
-                        uint32_t slot,
-                        void *data,
-                        size_t dataLength);
-void rsdScriptDestroy(const android::renderscript::Context *dc,
-                      android::renderscript::Script *script);
-
-
-#endif
diff --git a/libs/rs/driver/rsdCore.cpp b/libs/rs/driver/rsdCore.cpp
deleted file mode 100644
index 6a532e9..0000000
--- a/libs/rs/driver/rsdCore.cpp
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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 "rsdCore.h"
-#include "rsdAllocation.h"
-#include "rsdBcc.h"
-#include "rsdGL.h"
-#include "rsdPath.h"
-#include "rsdProgramStore.h"
-#include "rsdProgramRaster.h"
-#include "rsdProgramVertex.h"
-#include "rsdProgramFragment.h"
-#include "rsdMesh.h"
-#include "rsdSampler.h"
-#include "rsdFrameBuffer.h"
-
-#include <malloc.h>
-#include "rsContext.h"
-
-#include <sys/types.h>
-#include <sys/resource.h>
-#include <sched.h>
-#include <cutils/properties.h>
-#include <sys/syscall.h>
-#include <string.h>
-#include <bcc/bcc.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-static void Shutdown(Context *rsc);
-static void SetPriority(const Context *rsc, int32_t priority);
-
-static RsdHalFunctions FunctionTable = {
-    rsdGLInit,
-    rsdGLShutdown,
-    rsdGLSetSurface,
-    rsdGLSwap,
-
-    Shutdown,
-    NULL,
-    SetPriority,
-    {
-        rsdScriptInit,
-        rsdScriptInvokeFunction,
-        rsdScriptInvokeRoot,
-        rsdScriptInvokeForEach,
-        rsdScriptInvokeInit,
-        rsdScriptInvokeFreeChildren,
-        rsdScriptSetGlobalVar,
-        rsdScriptSetGlobalBind,
-        rsdScriptSetGlobalObj,
-        rsdScriptDestroy
-    },
-
-    {
-        rsdAllocationInit,
-        rsdAllocationDestroy,
-        rsdAllocationResize,
-        rsdAllocationSyncAll,
-        rsdAllocationMarkDirty,
-        rsdAllocationInitSurfaceTexture,
-        rsdAllocationSetSurfaceTexture,
-        rsdAllocationIoSend,
-        rsdAllocationIoReceive,
-        rsdAllocationData1D,
-        rsdAllocationData2D,
-        rsdAllocationData3D,
-        rsdAllocationData1D_alloc,
-        rsdAllocationData2D_alloc,
-        rsdAllocationData3D_alloc,
-        rsdAllocationElementData1D,
-        rsdAllocationElementData2D
-    },
-
-
-    {
-        rsdProgramStoreInit,
-        rsdProgramStoreSetActive,
-        rsdProgramStoreDestroy
-    },
-
-    {
-        rsdProgramRasterInit,
-        rsdProgramRasterSetActive,
-        rsdProgramRasterDestroy
-    },
-
-    {
-        rsdProgramVertexInit,
-        rsdProgramVertexSetActive,
-        rsdProgramVertexDestroy
-    },
-
-    {
-        rsdProgramFragmentInit,
-        rsdProgramFragmentSetActive,
-        rsdProgramFragmentDestroy
-    },
-
-    {
-        rsdMeshInit,
-        rsdMeshDraw,
-        rsdMeshDestroy
-    },
-
-    {
-        rsdPathInitStatic,
-        rsdPathInitDynamic,
-        rsdPathDraw,
-        rsdPathDestroy
-    },
-
-    {
-        rsdSamplerInit,
-        rsdSamplerDestroy
-    },
-
-    {
-        rsdFrameBufferInit,
-        rsdFrameBufferSetActive,
-        rsdFrameBufferDestroy
-    },
-
-};
-
-pthread_key_t rsdgThreadTLSKey = 0;
-uint32_t rsdgThreadTLSKeyCount = 0;
-pthread_mutex_t rsdgInitMutex = PTHREAD_MUTEX_INITIALIZER;
-
-
-static void * HelperThreadProc(void *vrsc) {
-    Context *rsc = static_cast<Context *>(vrsc);
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-
-    uint32_t idx = (uint32_t)android_atomic_inc(&dc->mWorkers.mLaunchCount);
-
-    //ALOGV("RS helperThread starting %p idx=%i", rsc, idx);
-
-    dc->mWorkers.mLaunchSignals[idx].init();
-    dc->mWorkers.mNativeThreadId[idx] = gettid();
-
-    int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct);
-    if (status) {
-        ALOGE("pthread_setspecific %i", status);
-    }
-
-#if 0
-    typedef struct {uint64_t bits[1024 / 64]; } cpu_set_t;
-    cpu_set_t cpuset;
-    memset(&cpuset, 0, sizeof(cpuset));
-    cpuset.bits[idx / 64] |= 1ULL << (idx % 64);
-    int ret = syscall(241, rsc->mWorkers.mNativeThreadId[idx],
-              sizeof(cpuset), &cpuset);
-    ALOGE("SETAFFINITY ret = %i %s", ret, EGLUtils::strerror(ret));
-#endif
-
-    while (!dc->mExit) {
-        dc->mWorkers.mLaunchSignals[idx].wait();
-        if (dc->mWorkers.mLaunchCallback) {
-           dc->mWorkers.mLaunchCallback(dc->mWorkers.mLaunchData, idx);
-        }
-        android_atomic_dec(&dc->mWorkers.mRunningCount);
-        dc->mWorkers.mCompleteSignal.set();
-    }
-
-    //ALOGV("RS helperThread exited %p idx=%i", rsc, idx);
-    return NULL;
-}
-
-void rsdLaunchThreads(Context *rsc, WorkerCallback_t cbk, void *data) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    dc->mWorkers.mLaunchData = data;
-    dc->mWorkers.mLaunchCallback = cbk;
-    android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount);
-    for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) {
-        dc->mWorkers.mLaunchSignals[ct].set();
-    }
-    while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) {
-        dc->mWorkers.mCompleteSignal.wait();
-    }
-}
-
-bool rsdHalInit(Context *rsc, uint32_t version_major, uint32_t version_minor) {
-    rsc->mHal.funcs = FunctionTable;
-
-    RsdHal *dc = (RsdHal *)calloc(1, sizeof(RsdHal));
-    if (!dc) {
-        ALOGE("Calloc for driver hal failed.");
-        return false;
-    }
-    rsc->mHal.drv = dc;
-
-    pthread_mutex_lock(&rsdgInitMutex);
-    if (!rsdgThreadTLSKeyCount) {
-        int status = pthread_key_create(&rsdgThreadTLSKey, NULL);
-        if (status) {
-            ALOGE("Failed to init thread tls key.");
-            pthread_mutex_unlock(&rsdgInitMutex);
-            return false;
-        }
-    }
-    rsdgThreadTLSKeyCount++;
-    pthread_mutex_unlock(&rsdgInitMutex);
-
-    dc->mTlsStruct.mContext = rsc;
-    dc->mTlsStruct.mScript = NULL;
-    int status = pthread_setspecific(rsdgThreadTLSKey, &dc->mTlsStruct);
-    if (status) {
-        ALOGE("pthread_setspecific %i", status);
-    }
-
-
-    int cpu = sysconf(_SC_NPROCESSORS_ONLN);
-    if(rsc->props.mDebugMaxThreads && (cpu > (int)rsc->props.mDebugMaxThreads)) {
-        cpu = rsc->props.mDebugMaxThreads;
-    }
-    if (cpu < 2) {
-        cpu = 0;
-    }
-    ALOGV("%p Launching thread(s), CPUs %i", rsc, cpu);
-
-    dc->mWorkers.mCount = (uint32_t)cpu;
-    dc->mWorkers.mThreadId = (pthread_t *) calloc(dc->mWorkers.mCount, sizeof(pthread_t));
-    dc->mWorkers.mNativeThreadId = (pid_t *) calloc(dc->mWorkers.mCount, sizeof(pid_t));
-    dc->mWorkers.mLaunchSignals = new Signal[dc->mWorkers.mCount];
-    dc->mWorkers.mLaunchCallback = NULL;
-
-    dc->mWorkers.mCompleteSignal.init();
-
-    android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount);
-    android_atomic_release_store(0, &dc->mWorkers.mLaunchCount);
-
-    pthread_attr_t threadAttr;
-    status = pthread_attr_init(&threadAttr);
-    if (status) {
-        ALOGE("Failed to init thread attribute.");
-        return false;
-    }
-
-    for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) {
-        status = pthread_create(&dc->mWorkers.mThreadId[ct], &threadAttr, HelperThreadProc, rsc);
-        if (status) {
-            dc->mWorkers.mCount = ct;
-            ALOGE("Created fewer than expected number of RS threads.");
-            break;
-        }
-    }
-    while (android_atomic_acquire_load(&dc->mWorkers.mRunningCount) != 0) {
-        usleep(100);
-    }
-
-    pthread_attr_destroy(&threadAttr);
-    return true;
-}
-
-
-void SetPriority(const Context *rsc, int32_t priority) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-    for (uint32_t ct=0; ct < dc->mWorkers.mCount; ct++) {
-        setpriority(PRIO_PROCESS, dc->mWorkers.mNativeThreadId[ct], priority);
-    }
-    if (dc->mHasGraphics) {
-        rsdGLSetPriority(rsc, priority);
-    }
-}
-
-void Shutdown(Context *rsc) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    dc->mExit = true;
-    dc->mWorkers.mLaunchData = NULL;
-    dc->mWorkers.mLaunchCallback = NULL;
-    android_atomic_release_store(dc->mWorkers.mCount, &dc->mWorkers.mRunningCount);
-    for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) {
-        dc->mWorkers.mLaunchSignals[ct].set();
-    }
-    int status;
-    void *res;
-    for (uint32_t ct = 0; ct < dc->mWorkers.mCount; ct++) {
-        status = pthread_join(dc->mWorkers.mThreadId[ct], &res);
-    }
-    rsAssert(android_atomic_acquire_load(&dc->mWorkers.mRunningCount) == 0);
-
-    // Global structure cleanup.
-    pthread_mutex_lock(&rsdgInitMutex);
-    --rsdgThreadTLSKeyCount;
-    if (!rsdgThreadTLSKeyCount) {
-        pthread_key_delete(rsdgThreadTLSKey);
-    }
-    pthread_mutex_unlock(&rsdgInitMutex);
-
-}
-
diff --git a/libs/rs/driver/rsdCore.h b/libs/rs/driver/rsdCore.h
deleted file mode 100644
index 05ca13b..0000000
--- a/libs/rs/driver/rsdCore.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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.
- */
-
-#ifndef RSD_CORE_H
-#define RSD_CORE_H
-
-#include <rs_hal.h>
-
-#include "rsMutex.h"
-#include "rsSignal.h"
-
-#include "rsdGL.h"
-
-typedef void (* InvokeFunc_t)(void);
-typedef void (* ForEachFunc_t)(void);
-typedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
-
-typedef struct RsdSymbolTableRec {
-    const char * mName;
-    void * mPtr;
-    bool threadable;
-} RsdSymbolTable;
-
-typedef struct ScriptTLSStructRec {
-    android::renderscript::Context * mContext;
-    android::renderscript::Script * mScript;
-} ScriptTLSStruct;
-
-typedef struct RsdHalRec {
-    uint32_t version_major;
-    uint32_t version_minor;
-    bool mHasGraphics;
-
-    struct Workers {
-        volatile int mRunningCount;
-        volatile int mLaunchCount;
-        uint32_t mCount;
-        pthread_t *mThreadId;
-        pid_t *mNativeThreadId;
-        android::renderscript::Signal mCompleteSignal;
-
-        android::renderscript::Signal *mLaunchSignals;
-        WorkerCallback_t mLaunchCallback;
-        void *mLaunchData;
-    };
-    Workers mWorkers;
-    bool mExit;
-
-    ScriptTLSStruct mTlsStruct;
-
-    RsdGL gl;
-} RsdHal;
-
-extern pthread_key_t rsdgThreadTLSKey;
-extern uint32_t rsdgThreadTLSKeyCount;
-extern pthread_mutex_t rsdgInitMutex;
-
-
-void rsdLaunchThreads(android::renderscript::Context *rsc, WorkerCallback_t cbk, void *data);
-
-#endif
-
diff --git a/libs/rs/driver/rsdFrameBuffer.cpp b/libs/rs/driver/rsdFrameBuffer.cpp
deleted file mode 100644
index bb07d29..0000000
--- a/libs/rs/driver/rsdFrameBuffer.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsdCore.h"
-#include "rsdFrameBuffer.h"
-#include "rsdFrameBufferObj.h"
-#include "rsdAllocation.h"
-
-#include "rsContext.h"
-#include "rsFBOCache.h"
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-void setDepthAttachment(const Context *rsc, const FBOCache *fb) {
-    RsdFrameBufferObj *fbo = (RsdFrameBufferObj*)fb->mHal.drv;
-
-    DrvAllocation *depth = NULL;
-    if (fb->mHal.state.depthTarget != NULL) {
-        depth = (DrvAllocation *)fb->mHal.state.depthTarget->mHal.drv;
-
-        if (depth->uploadDeferred) {
-            rsdAllocationSyncAll(rsc, fb->mHal.state.depthTarget,
-                                 RS_ALLOCATION_USAGE_SCRIPT);
-        }
-    }
-    fbo->setDepthTarget(depth);
-}
-
-void setColorAttachment(const Context *rsc, const FBOCache *fb) {
-    RsdFrameBufferObj *fbo = (RsdFrameBufferObj*)fb->mHal.drv;
-    // Now attach color targets
-    for (uint32_t i = 0; i < fb->mHal.state.colorTargetsCount; i ++) {
-        DrvAllocation *color = NULL;
-        if (fb->mHal.state.colorTargets[i] != NULL) {
-            color = (DrvAllocation *)fb->mHal.state.colorTargets[i]->mHal.drv;
-
-            if (color->uploadDeferred) {
-                rsdAllocationSyncAll(rsc, fb->mHal.state.colorTargets[i],
-                                     RS_ALLOCATION_USAGE_SCRIPT);
-            }
-        }
-        fbo->setColorTarget(color, i);
-    }
-}
-
-bool rsdFrameBufferInit(const Context *rsc, const FBOCache *fb) {
-    RsdFrameBufferObj *fbo = new RsdFrameBufferObj();
-    if (fbo == NULL) {
-        return false;
-    }
-    fb->mHal.drv = fbo;
-
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-    dc->gl.currentFrameBuffer = fbo;
-
-    return true;
-}
-
-void rsdFrameBufferSetActive(const Context *rsc, const FBOCache *fb) {
-    setDepthAttachment(rsc, fb);
-    setColorAttachment(rsc, fb);
-
-    RsdFrameBufferObj *fbo = (RsdFrameBufferObj *)fb->mHal.drv;
-    if (fb->mHal.state.colorTargets[0]) {
-        fbo->setDimensions(fb->mHal.state.colorTargets[0]->getType()->getDimX(),
-                           fb->mHal.state.colorTargets[0]->getType()->getDimY());
-    } else if (fb->mHal.state.depthTarget) {
-        fbo->setDimensions(fb->mHal.state.depthTarget->getType()->getDimX(),
-                           fb->mHal.state.depthTarget->getType()->getDimY());
-    }
-
-    fbo->setActive(rsc);
-}
-
-void rsdFrameBufferDestroy(const Context *rsc, const FBOCache *fb) {
-    RsdFrameBufferObj *fbo = (RsdFrameBufferObj *)fb->mHal.drv;
-    delete fbo;
-    fb->mHal.drv = NULL;
-}
-
-
diff --git a/libs/rs/driver/rsdFrameBuffer.h b/libs/rs/driver/rsdFrameBuffer.h
deleted file mode 100644
index dec59fc..0000000
--- a/libs/rs/driver/rsdFrameBuffer.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_FRAME_BUFFER_H
-#define RSD_FRAME_BUFFER_H
-
-#include <rs_hal.h>
-
-bool rsdFrameBufferInit(const android::renderscript::Context *rsc,
-                         const android::renderscript::FBOCache *fb);
-void rsdFrameBufferSetActive(const android::renderscript::Context *rsc,
-                              const android::renderscript::FBOCache *fb);
-void rsdFrameBufferDestroy(const android::renderscript::Context *rsc,
-                            const android::renderscript::FBOCache *fb);
-
-
-#endif // RSD_FRAME_BUFFER_H
diff --git a/libs/rs/driver/rsdFrameBufferObj.cpp b/libs/rs/driver/rsdFrameBufferObj.cpp
deleted file mode 100644
index 91452b0..0000000
--- a/libs/rs/driver/rsdFrameBufferObj.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsdFrameBufferObj.h"
-#include "rsdAllocation.h"
-#include "rsdGL.h"
-
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-RsdFrameBufferObj::RsdFrameBufferObj() {
-    mFBOId = 0;
-    mWidth = 0;
-    mHeight = 0;
-    mColorTargetsCount = 1;
-    mColorTargets = new DrvAllocation*[mColorTargetsCount];
-    for (uint32_t i = 0; i < mColorTargetsCount; i ++) {
-        mColorTargets[i] = 0;
-    }
-    mDepthTarget = NULL;
-    mDirty = true;
-}
-
-RsdFrameBufferObj::~RsdFrameBufferObj() {
-    if(mFBOId != 0) {
-        glDeleteFramebuffers(1, &mFBOId);
-    }
-    delete [] mColorTargets;
-}
-
-void RsdFrameBufferObj::checkError(const Context *rsc) {
-    GLenum status;
-    status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
-    switch (status) {
-    case GL_FRAMEBUFFER_COMPLETE:
-        break;
-    case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
-        rsc->setError(RS_ERROR_BAD_VALUE,
-                      "Unable to set up render Target: RFRAMEBUFFER_INCOMPLETE_ATTACHMENT");
-        break;
-    case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
-        rsc->setError(RS_ERROR_BAD_VALUE,
-                      "Unable to set up render Target: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
-        break;
-    case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
-        rsc->setError(RS_ERROR_BAD_VALUE,
-                      "Unable to set up render Target: GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
-        break;
-    case GL_FRAMEBUFFER_UNSUPPORTED:
-        rsc->setError(RS_ERROR_BAD_VALUE,
-                      "Unable to set up render Target: GL_FRAMEBUFFER_UNSUPPORTED");
-        break;
-    }
-}
-
-
-void RsdFrameBufferObj::setDepthAttachment() {
-    if (mDepthTarget != NULL) {
-        if (mDepthTarget->textureID) {
-            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
-                                   GL_TEXTURE_2D, mDepthTarget->textureID, 0);
-        } else {
-            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
-                                      GL_RENDERBUFFER, mDepthTarget->renderTargetID);
-        }
-    } else {
-        // Reset last attachment
-        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
-        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
-    }
-}
-
-void RsdFrameBufferObj::setColorAttachment() {
-    // Now attach color targets
-    for (uint32_t i = 0; i < mColorTargetsCount; i ++) {
-        if (mColorTargets[i] != NULL) {
-            if (mColorTargets[i]->textureID) {
-                glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-                                       GL_TEXTURE_2D, mColorTargets[i]->textureID, 0);
-            } else {
-                glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-                                          GL_RENDERBUFFER, mColorTargets[i]->renderTargetID);
-            }
-        } else {
-            // Reset last attachment
-            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-                                      GL_RENDERBUFFER, 0);
-            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-                                   GL_TEXTURE_2D, 0, 0);
-        }
-    }
-}
-
-bool RsdFrameBufferObj::renderToFramebuffer() {
-    if (mDepthTarget != NULL) {
-        return false;
-    }
-
-    for (uint32_t i = 0; i < mColorTargetsCount; i ++) {
-        if (mColorTargets[i] != NULL) {
-            return false;
-        }
-    }
-    return true;
-}
-
-void RsdFrameBufferObj::setActive(const Context *rsc) {
-    bool framebuffer = renderToFramebuffer();
-    if (!framebuffer) {
-        if(mFBOId == 0) {
-            RSD_CALL_GL(glGenFramebuffers, 1, &mFBOId);
-        }
-        RSD_CALL_GL(glBindFramebuffer, GL_FRAMEBUFFER, mFBOId);
-
-        if (mDirty) {
-            setDepthAttachment();
-            setColorAttachment();
-            mDirty = false;
-        }
-
-        RSD_CALL_GL(glViewport, 0, 0, mWidth, mHeight);
-        checkError(rsc);
-    } else {
-        RSD_CALL_GL(glBindFramebuffer, GL_FRAMEBUFFER, 0);
-        RSD_CALL_GL(glViewport, 0, 0, rsc->getWidth(), rsc->getHeight());
-    }
-}
diff --git a/libs/rs/driver/rsdFrameBufferObj.h b/libs/rs/driver/rsdFrameBufferObj.h
deleted file mode 100644
index c6e7deb..0000000
--- a/libs/rs/driver/rsdFrameBufferObj.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef _RSD_FRAMEBUFFER_OBJ_H_
-#define _RSD_FRAMEBUFFER_OBJ_H_
-
-#include <rsContext.h>
-
-class DrvAllocation;
-
-class RsdFrameBufferObj {
-public:
-    RsdFrameBufferObj();
-    ~RsdFrameBufferObj();
-
-    void setActive(const android::renderscript::Context *rsc);
-    void setColorTarget(DrvAllocation *color, uint32_t index) {
-        mColorTargets[index] = color;
-        mDirty = true;
-    }
-    void setDepthTarget(DrvAllocation *depth) {
-        mDepthTarget = depth;
-        mDirty = true;
-    }
-    void setDimensions(uint32_t width, uint32_t height) {
-        mWidth = width;
-        mHeight = height;
-    }
-protected:
-    uint32_t mFBOId;
-    DrvAllocation **mColorTargets;
-    uint32_t mColorTargetsCount;
-    DrvAllocation *mDepthTarget;
-
-    uint32_t mWidth;
-    uint32_t mHeight;
-
-    bool mDirty;
-
-    bool renderToFramebuffer();
-    void checkError(const android::renderscript::Context *rsc);
-    void setColorAttachment();
-    void setDepthAttachment();
-};
-
-#endif //_RSD_FRAMEBUFFER_STATE_H_
diff --git a/libs/rs/driver/rsdGL.cpp b/libs/rs/driver/rsdGL.cpp
deleted file mode 100644
index 0860417..0000000
--- a/libs/rs/driver/rsdGL.cpp
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- * Copyright (C) 2011 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 <ui/FramebufferNativeWindow.h>
-#include <ui/PixelFormat.h>
-
-#include <system/window.h>
-
-#include <sys/types.h>
-#include <sys/resource.h>
-#include <sched.h>
-
-#include <cutils/properties.h>
-
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#include <string.h>
-
-#include "rsdCore.h"
-#include "rsdGL.h"
-
-#include <malloc.h>
-#include "rsContext.h"
-#include "rsDevice.h"
-#include "rsdShaderCache.h"
-#include "rsdVertexArray.h"
-#include "rsdFrameBufferObj.h"
-
-#include <gui/SurfaceTextureClient.h>
-#include <gui/DummyConsumer.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-static int32_t gGLContextCount = 0;
-
-static void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) {
-    struct EGLUtils {
-        static const char *strerror(EGLint err) {
-            switch (err){
-                case EGL_SUCCESS:           return "EGL_SUCCESS";
-                case EGL_NOT_INITIALIZED:   return "EGL_NOT_INITIALIZED";
-                case EGL_BAD_ACCESS:        return "EGL_BAD_ACCESS";
-                case EGL_BAD_ALLOC:         return "EGL_BAD_ALLOC";
-                case EGL_BAD_ATTRIBUTE:     return "EGL_BAD_ATTRIBUTE";
-                case EGL_BAD_CONFIG:        return "EGL_BAD_CONFIG";
-                case EGL_BAD_CONTEXT:       return "EGL_BAD_CONTEXT";
-                case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE";
-                case EGL_BAD_DISPLAY:       return "EGL_BAD_DISPLAY";
-                case EGL_BAD_MATCH:         return "EGL_BAD_MATCH";
-                case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP";
-                case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW";
-                case EGL_BAD_PARAMETER:     return "EGL_BAD_PARAMETER";
-                case EGL_BAD_SURFACE:       return "EGL_BAD_SURFACE";
-                case EGL_CONTEXT_LOST:      return "EGL_CONTEXT_LOST";
-                default: return "UNKNOWN";
-            }
-        }
-    };
-
-    if (returnVal != EGL_TRUE) {
-        fprintf(stderr, "%s() returned %d\n", op, returnVal);
-    }
-
-    for (EGLint error = eglGetError(); error != EGL_SUCCESS; error
-            = eglGetError()) {
-        fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error),
-                error);
-    }
-}
-
-static void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) {
-
-#define X(VAL) {VAL, #VAL}
-    struct {EGLint attribute; const char* name;} names[] = {
-    X(EGL_BUFFER_SIZE),
-    X(EGL_ALPHA_SIZE),
-    X(EGL_BLUE_SIZE),
-    X(EGL_GREEN_SIZE),
-    X(EGL_RED_SIZE),
-    X(EGL_DEPTH_SIZE),
-    X(EGL_STENCIL_SIZE),
-    X(EGL_CONFIG_CAVEAT),
-    X(EGL_CONFIG_ID),
-    X(EGL_LEVEL),
-    X(EGL_MAX_PBUFFER_HEIGHT),
-    X(EGL_MAX_PBUFFER_PIXELS),
-    X(EGL_MAX_PBUFFER_WIDTH),
-    X(EGL_NATIVE_RENDERABLE),
-    X(EGL_NATIVE_VISUAL_ID),
-    X(EGL_NATIVE_VISUAL_TYPE),
-    X(EGL_SAMPLES),
-    X(EGL_SAMPLE_BUFFERS),
-    X(EGL_SURFACE_TYPE),
-    X(EGL_TRANSPARENT_TYPE),
-    X(EGL_TRANSPARENT_RED_VALUE),
-    X(EGL_TRANSPARENT_GREEN_VALUE),
-    X(EGL_TRANSPARENT_BLUE_VALUE),
-    X(EGL_BIND_TO_TEXTURE_RGB),
-    X(EGL_BIND_TO_TEXTURE_RGBA),
-    X(EGL_MIN_SWAP_INTERVAL),
-    X(EGL_MAX_SWAP_INTERVAL),
-    X(EGL_LUMINANCE_SIZE),
-    X(EGL_ALPHA_MASK_SIZE),
-    X(EGL_COLOR_BUFFER_TYPE),
-    X(EGL_RENDERABLE_TYPE),
-    X(EGL_CONFORMANT),
-   };
-#undef X
-
-    for (size_t j = 0; j < sizeof(names) / sizeof(names[0]); j++) {
-        EGLint value = -1;
-        EGLBoolean returnVal = eglGetConfigAttrib(dpy, config, names[j].attribute, &value);
-        if (returnVal) {
-            ALOGV(" %s: %d (0x%x)", names[j].name, value, value);
-        }
-    }
-}
-
-static void DumpDebug(RsdHal *dc) {
-    ALOGE(" EGL ver %i %i", dc->gl.egl.majorVersion, dc->gl.egl.minorVersion);
-    ALOGE(" EGL context %p  surface %p,  Display=%p", dc->gl.egl.context, dc->gl.egl.surface,
-         dc->gl.egl.display);
-    ALOGE(" GL vendor: %s", dc->gl.gl.vendor);
-    ALOGE(" GL renderer: %s", dc->gl.gl.renderer);
-    ALOGE(" GL Version: %s", dc->gl.gl.version);
-    ALOGE(" GL Extensions: %s", dc->gl.gl.extensions);
-    ALOGE(" GL int Versions %i %i", dc->gl.gl.majorVersion, dc->gl.gl.minorVersion);
-
-    ALOGV("MAX Textures %i, %i  %i", dc->gl.gl.maxVertexTextureUnits,
-         dc->gl.gl.maxFragmentTextureImageUnits, dc->gl.gl.maxTextureImageUnits);
-    ALOGV("MAX Attribs %i", dc->gl.gl.maxVertexAttribs);
-    ALOGV("MAX Uniforms %i, %i", dc->gl.gl.maxVertexUniformVectors,
-         dc->gl.gl.maxFragmentUniformVectors);
-    ALOGV("MAX Varyings %i", dc->gl.gl.maxVaryingVectors);
-}
-
-void rsdGLShutdown(const Context *rsc) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    dc->gl.shaderCache->cleanupAll();
-    delete dc->gl.shaderCache;
-    delete dc->gl.vertexArrayState;
-
-    if (dc->gl.egl.context != EGL_NO_CONTEXT) {
-        RSD_CALL_GL(eglMakeCurrent, dc->gl.egl.display,
-                    EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-        RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surfaceDefault);
-        if (dc->gl.egl.surface != EGL_NO_SURFACE) {
-            RSD_CALL_GL(eglDestroySurface, dc->gl.egl.display, dc->gl.egl.surface);
-        }
-        RSD_CALL_GL(eglDestroyContext, dc->gl.egl.display, dc->gl.egl.context);
-        checkEglError("eglDestroyContext");
-    }
-
-    gGLContextCount--;
-    if (!gGLContextCount) {
-        RSD_CALL_GL(eglTerminate, dc->gl.egl.display);
-    }
-}
-
-void getConfigData(const Context *rsc,
-                   EGLint *configAttribs, size_t configAttribsLen,
-                   uint32_t numSamples) {
-    memset(configAttribs, 0, configAttribsLen*sizeof(*configAttribs));
-
-    EGLint *configAttribsPtr = configAttribs;
-
-    configAttribsPtr[0] = EGL_SURFACE_TYPE;
-    configAttribsPtr[1] = EGL_WINDOW_BIT;
-    configAttribsPtr += 2;
-
-    configAttribsPtr[0] = EGL_RENDERABLE_TYPE;
-    configAttribsPtr[1] = EGL_OPENGL_ES2_BIT;
-    configAttribsPtr += 2;
-
-    configAttribsPtr[0] = EGL_RED_SIZE;
-    configAttribsPtr[1] = 8;
-    configAttribsPtr += 2;
-
-    configAttribsPtr[0] = EGL_GREEN_SIZE;
-    configAttribsPtr[1] = 8;
-    configAttribsPtr += 2;
-
-    configAttribsPtr[0] = EGL_BLUE_SIZE;
-    configAttribsPtr[1] = 8;
-    configAttribsPtr += 2;
-
-    if (rsc->mUserSurfaceConfig.alphaMin > 0) {
-        configAttribsPtr[0] = EGL_ALPHA_SIZE;
-        configAttribsPtr[1] = rsc->mUserSurfaceConfig.alphaMin;
-        configAttribsPtr += 2;
-    }
-
-    if (rsc->mUserSurfaceConfig.depthMin > 0) {
-        configAttribsPtr[0] = EGL_DEPTH_SIZE;
-        configAttribsPtr[1] = rsc->mUserSurfaceConfig.depthMin;
-        configAttribsPtr += 2;
-    }
-
-    if (rsc->mDev->mForceSW) {
-        configAttribsPtr[0] = EGL_CONFIG_CAVEAT;
-        configAttribsPtr[1] = EGL_SLOW_CONFIG;
-        configAttribsPtr += 2;
-    }
-
-    if (numSamples > 1) {
-        configAttribsPtr[0] = EGL_SAMPLE_BUFFERS;
-        configAttribsPtr[1] = 1;
-        configAttribsPtr[2] = EGL_SAMPLES;
-        configAttribsPtr[3] = numSamples;
-        configAttribsPtr += 4;
-    }
-
-    configAttribsPtr[0] = EGL_NONE;
-    rsAssert(configAttribsPtr < (configAttribs + configAttribsLen));
-}
-
-bool rsdGLInit(const Context *rsc) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    dc->gl.egl.numConfigs = -1;
-
-    EGLint configAttribs[128];
-    EGLint context_attribs2[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
-
-    ALOGV("%p initEGL start", rsc);
-    rsc->setWatchdogGL("eglGetDisplay", __LINE__, __FILE__);
-    dc->gl.egl.display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-    checkEglError("eglGetDisplay");
-
-    RSD_CALL_GL(eglInitialize, dc->gl.egl.display,
-                &dc->gl.egl.majorVersion, &dc->gl.egl.minorVersion);
-    checkEglError("eglInitialize");
-
-    EGLBoolean ret;
-
-    EGLint numConfigs = -1, n = 0;
-    rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
-
-    // Try minding a multisample config that matches the user request
-    uint32_t minSample = rsc->mUserSurfaceConfig.samplesMin;
-    uint32_t prefSample = rsc->mUserSurfaceConfig.samplesPref;
-    for (uint32_t sampleCount = prefSample; sampleCount >= minSample; sampleCount--) {
-        getConfigData(rsc, configAttribs, (sizeof(configAttribs) / sizeof(EGLint)), sampleCount);
-        ret = eglChooseConfig(dc->gl.egl.display, configAttribs, 0, 0, &numConfigs);
-        checkEglError("eglGetConfigs", ret);
-        if (numConfigs > 0) {
-            break;
-        }
-    }
-
-    eglSwapInterval(dc->gl.egl.display, 0);
-
-    if (numConfigs) {
-        EGLConfig* const configs = new EGLConfig[numConfigs];
-
-        rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
-        ret = eglChooseConfig(dc->gl.egl.display,
-                configAttribs, configs, numConfigs, &n);
-        if (!ret || !n) {
-            checkEglError("eglChooseConfig", ret);
-            ALOGE("%p, couldn't find an EGLConfig matching the screen format\n", rsc);
-        }
-
-        // The first config is guaranteed to over-satisfy the constraints
-        dc->gl.egl.config = configs[0];
-
-        // go through the list and skip configs that over-satisfy our needs
-        for (int i=0 ; i<n ; i++) {
-            if (rsc->mUserSurfaceConfig.alphaMin <= 0) {
-                EGLint alphaSize;
-                eglGetConfigAttrib(dc->gl.egl.display,
-                        configs[i], EGL_ALPHA_SIZE, &alphaSize);
-                if (alphaSize > 0) {
-                    continue;
-                }
-            }
-
-            if (rsc->mUserSurfaceConfig.depthMin <= 0) {
-                EGLint depthSize;
-                eglGetConfigAttrib(dc->gl.egl.display,
-                        configs[i], EGL_DEPTH_SIZE, &depthSize);
-                if (depthSize > 0) {
-                    continue;
-                }
-            }
-
-            // Found one!
-            dc->gl.egl.config = configs[i];
-            break;
-        }
-
-        delete [] configs;
-    }
-
-    //if (props.mLogVisual) {
-    if (0) {
-        printEGLConfiguration(dc->gl.egl.display, dc->gl.egl.config);
-    }
-    //}
-
-    rsc->setWatchdogGL("eglCreateContext", __LINE__, __FILE__);
-    dc->gl.egl.context = eglCreateContext(dc->gl.egl.display, dc->gl.egl.config,
-                                          EGL_NO_CONTEXT, context_attribs2);
-    checkEglError("eglCreateContext");
-    if (dc->gl.egl.context == EGL_NO_CONTEXT) {
-        ALOGE("%p, eglCreateContext returned EGL_NO_CONTEXT", rsc);
-        rsc->setWatchdogGL(NULL, 0, NULL);
-        return false;
-    }
-    gGLContextCount++;
-
-    // Create a BufferQueue with a fake consumer
-    sp<BufferQueue> bq = new BufferQueue();
-    sp<DummyConsumer> dummy = new DummyConsumer(bq);
-    sp<SurfaceTextureClient> stc(new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >(bq)));
-
-    dc->gl.egl.surfaceDefault = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config,
-                                                       static_cast<ANativeWindow*>(stc.get()),
-                                                       NULL);
-
-    checkEglError("eglCreateWindowSurface");
-    if (dc->gl.egl.surfaceDefault == EGL_NO_SURFACE) {
-        ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
-        rsdGLShutdown(rsc);
-        rsc->setWatchdogGL(NULL, 0, NULL);
-        return false;
-    }
-
-    rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
-    ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
-                         dc->gl.egl.surfaceDefault, dc->gl.egl.context);
-    if (ret == EGL_FALSE) {
-        ALOGE("eglMakeCurrent returned EGL_FALSE");
-        checkEglError("eglMakeCurrent", ret);
-        rsdGLShutdown(rsc);
-        rsc->setWatchdogGL(NULL, 0, NULL);
-        return false;
-    }
-
-    dc->gl.gl.version = glGetString(GL_VERSION);
-    dc->gl.gl.vendor = glGetString(GL_VENDOR);
-    dc->gl.gl.renderer = glGetString(GL_RENDERER);
-    dc->gl.gl.extensions = glGetString(GL_EXTENSIONS);
-
-    //ALOGV("EGL Version %i %i", mEGL.mMajorVersion, mEGL.mMinorVersion);
-    //ALOGV("GL Version %s", mGL.mVersion);
-    //ALOGV("GL Vendor %s", mGL.mVendor);
-    //ALOGV("GL Renderer %s", mGL.mRenderer);
-    //ALOGV("GL Extensions %s", mGL.mExtensions);
-
-    const char *verptr = NULL;
-    if (strlen((const char *)dc->gl.gl.version) > 9) {
-        if (!memcmp(dc->gl.gl.version, "OpenGL ES-CM", 12)) {
-            verptr = (const char *)dc->gl.gl.version + 12;
-        }
-        if (!memcmp(dc->gl.gl.version, "OpenGL ES ", 10)) {
-            verptr = (const char *)dc->gl.gl.version + 9;
-        }
-    }
-
-    if (!verptr) {
-        ALOGE("Error, OpenGL ES Lite not supported");
-        rsdGLShutdown(rsc);
-        rsc->setWatchdogGL(NULL, 0, NULL);
-        return false;
-    } else {
-        sscanf(verptr, " %i.%i", &dc->gl.gl.majorVersion, &dc->gl.gl.minorVersion);
-    }
-
-    glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &dc->gl.gl.maxVertexAttribs);
-    glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &dc->gl.gl.maxVertexUniformVectors);
-    glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxVertexTextureUnits);
-
-    glGetIntegerv(GL_MAX_VARYING_VECTORS, &dc->gl.gl.maxVaryingVectors);
-    glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxTextureImageUnits);
-
-    glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &dc->gl.gl.maxFragmentTextureImageUnits);
-    glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_VECTORS, &dc->gl.gl.maxFragmentUniformVectors);
-
-    dc->gl.gl.OES_texture_npot = NULL != strstr((const char *)dc->gl.gl.extensions,
-                                                "GL_OES_texture_npot");
-    dc->gl.gl.IMG_texture_npot = NULL != strstr((const char *)dc->gl.gl.extensions,
-                                                   "GL_IMG_texture_npot");
-    dc->gl.gl.NV_texture_npot_2D_mipmap = NULL != strstr((const char *)dc->gl.gl.extensions,
-                                                            "GL_NV_texture_npot_2D_mipmap");
-    dc->gl.gl.EXT_texture_max_aniso = 1.0f;
-    bool hasAniso = NULL != strstr((const char *)dc->gl.gl.extensions,
-                                   "GL_EXT_texture_filter_anisotropic");
-    if (hasAniso) {
-        glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &dc->gl.gl.EXT_texture_max_aniso);
-    }
-
-    if (0) {
-        DumpDebug(dc);
-    }
-
-    dc->gl.shaderCache = new RsdShaderCache();
-    dc->gl.vertexArrayState = new RsdVertexArrayState();
-    dc->gl.vertexArrayState->init(dc->gl.gl.maxVertexAttribs);
-    dc->gl.currentFrameBuffer = NULL;
-    dc->mHasGraphics = true;
-
-    ALOGV("%p initGLThread end", rsc);
-    rsc->setWatchdogGL(NULL, 0, NULL);
-    return true;
-}
-
-
-bool rsdGLSetSurface(const Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    EGLBoolean ret;
-    // WAR: Some drivers fail to handle 0 size surfaces correcntly.
-    // Use the pbuffer to avoid this pitfall.
-    if ((dc->gl.egl.surface != NULL) || (w == 0) || (h == 0)) {
-        rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
-        ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surfaceDefault,
-                             dc->gl.egl.surfaceDefault, dc->gl.egl.context);
-        checkEglError("eglMakeCurrent", ret);
-
-        rsc->setWatchdogGL("eglDestroySurface", __LINE__, __FILE__);
-        ret = eglDestroySurface(dc->gl.egl.display, dc->gl.egl.surface);
-        checkEglError("eglDestroySurface", ret);
-
-        dc->gl.egl.surface = NULL;
-        dc->gl.width = 1;
-        dc->gl.height = 1;
-    }
-
-    if (dc->gl.wndSurface != NULL) {
-        dc->gl.wndSurface->decStrong(NULL);
-    }
-
-    dc->gl.wndSurface = (ANativeWindow *)sur;
-    if (dc->gl.wndSurface != NULL) {
-        dc->gl.wndSurface->incStrong(NULL);
-        dc->gl.width = w;
-        dc->gl.height = h;
-
-        rsc->setWatchdogGL("eglCreateWindowSurface", __LINE__, __FILE__);
-        dc->gl.egl.surface = eglCreateWindowSurface(dc->gl.egl.display, dc->gl.egl.config,
-                                                    dc->gl.wndSurface, NULL);
-        checkEglError("eglCreateWindowSurface");
-        if (dc->gl.egl.surface == EGL_NO_SURFACE) {
-            ALOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
-        }
-
-        rsc->setWatchdogGL("eglMakeCurrent", __LINE__, __FILE__);
-        ret = eglMakeCurrent(dc->gl.egl.display, dc->gl.egl.surface,
-                             dc->gl.egl.surface, dc->gl.egl.context);
-        checkEglError("eglMakeCurrent", ret);
-    }
-    rsc->setWatchdogGL(NULL, 0, NULL);
-    return true;
-}
-
-void rsdGLSwap(const android::renderscript::Context *rsc) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-    RSD_CALL_GL(eglSwapBuffers, dc->gl.egl.display, dc->gl.egl.surface);
-}
-
-void rsdGLSetPriority(const Context *rsc, int32_t priority) {
-    if (priority > 0) {
-        // Mark context as low priority.
-        ALOGV("low pri");
-    } else {
-        ALOGV("normal pri");
-    }
-}
-
-void rsdGLCheckError(const android::renderscript::Context *rsc,
-                     const char *msg, bool isFatal) {
-    GLenum err = glGetError();
-    if (err != GL_NO_ERROR) {
-        char buf[1024];
-        snprintf(buf, sizeof(buf), "GL Error = 0x%08x, from: %s", err, msg);
-
-        if (isFatal) {
-            rsc->setError(RS_ERROR_FATAL_DRIVER, buf);
-        } else {
-            switch (err) {
-            case GL_OUT_OF_MEMORY:
-                rsc->setError(RS_ERROR_OUT_OF_MEMORY, buf);
-                break;
-            default:
-                rsc->setError(RS_ERROR_DRIVER, buf);
-                break;
-            }
-        }
-
-        ALOGE("%p, %s", rsc, buf);
-    }
-
-}
-
-void rsdGLClearColor(const android::renderscript::Context *rsc,
-                     float r, float g, float b, float a) {
-    RSD_CALL_GL(glClearColor, r, g, b, a);
-    RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
-}
-
-void rsdGLClearDepth(const android::renderscript::Context *rsc, float v) {
-    RSD_CALL_GL(glClearDepthf, v);
-    RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
-}
-
-void rsdGLFinish(const android::renderscript::Context *rsc) {
-    RSD_CALL_GL(glFinish);
-}
-
-void rsdGLDrawQuadTexCoords(const android::renderscript::Context *rsc,
-                            float x1, float y1, float z1, float u1, float v1,
-                            float x2, float y2, float z2, float u2, float v2,
-                            float x3, float y3, float z3, float u3, float v3,
-                            float x4, float y4, float z4, float u4, float v4) {
-
-    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
-    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
-
-    RsdVertexArray::Attrib attribs[2];
-    attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
-    attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
-
-    RsdVertexArray va(attribs, 2);
-    va.setup(rsc);
-
-    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
-}
diff --git a/libs/rs/driver/rsdGL.h b/libs/rs/driver/rsdGL.h
deleted file mode 100644
index 1e5b40f..0000000
--- a/libs/rs/driver/rsdGL.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_GL_H
-#define RSD_GL_H
-
-#include <rs_hal.h>
-#include <EGL/egl.h>
-
-#define RSD_CALL_GL(x, ...) rsc->setWatchdogGL(#x, __LINE__, __FILE__); x(__VA_ARGS__); rsc->setWatchdogGL(NULL, 0, NULL)
-
-class RsdShaderCache;
-class RsdVertexArrayState;
-class RsdFrameBufferObj;
-
-typedef void (* InvokeFunc_t)(void);
-typedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
-
-typedef struct RsdGLRec {
-    struct {
-        EGLint numConfigs;
-        EGLint majorVersion;
-        EGLint minorVersion;
-        EGLConfig config;
-        EGLContext context;
-        EGLSurface surface;
-        EGLSurface surfaceDefault;
-        EGLDisplay display;
-    } egl;
-
-    struct {
-        const uint8_t * vendor;
-        const uint8_t * renderer;
-        const uint8_t * version;
-        const uint8_t * extensions;
-
-        uint32_t majorVersion;
-        uint32_t minorVersion;
-
-        int32_t maxVaryingVectors;
-        int32_t maxTextureImageUnits;
-
-        int32_t maxFragmentTextureImageUnits;
-        int32_t maxFragmentUniformVectors;
-
-        int32_t maxVertexAttribs;
-        int32_t maxVertexUniformVectors;
-        int32_t maxVertexTextureUnits;
-
-        bool OES_texture_npot;
-        bool IMG_texture_npot;
-        bool NV_texture_npot_2D_mipmap;
-        float EXT_texture_max_aniso;
-    } gl;
-
-    ANativeWindow *wndSurface;
-    uint32_t width;
-    uint32_t height;
-    RsdShaderCache *shaderCache;
-    RsdVertexArrayState *vertexArrayState;
-    RsdFrameBufferObj *currentFrameBuffer;
-} RsdGL;
-
-
-bool rsdGLInit(const android::renderscript::Context *rsc);
-void rsdGLShutdown(const android::renderscript::Context *rsc);
-bool rsdGLSetSurface(const android::renderscript::Context *rsc,
-                     uint32_t w, uint32_t h, RsNativeWindow sur);
-void rsdGLSwap(const android::renderscript::Context *rsc);
-void rsdGLCheckError(const android::renderscript::Context *rsc,
-                     const char *msg, bool isFatal = false);
-void rsdGLSetPriority(const android::renderscript::Context *rsc,
-                      int32_t priority);
-void rsdGLClearColor(const android::renderscript::Context *rsc,
-                     float r, float g, float b, float a);
-void rsdGLClearDepth(const android::renderscript::Context *rsc, float v);
-void rsdGLFinish(const android::renderscript::Context *rsc);
-void rsdGLDrawQuadTexCoords(const android::renderscript::Context *rsc,
-                            float x1, float y1, float z1, float u1, float v1,
-                            float x2, float y2, float z2, float u2, float v2,
-                            float x3, float y3, float z3, float u3, float v3,
-                            float x4, float y4, float z4, float u4, float v4);
-
-#endif
-
diff --git a/libs/rs/driver/rsdMesh.cpp b/libs/rs/driver/rsdMesh.cpp
deleted file mode 100644
index 50daf3e..0000000
--- a/libs/rs/driver/rsdMesh.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2011 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 <rs_hal.h>
-#include <rsContext.h>
-#include <rsMesh.h>
-
-#include "rsdCore.h"
-#include "rsdMesh.h"
-#include "rsdMeshObj.h"
-#include "rsdShaderCache.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-bool rsdMeshInit(const Context *rsc, const Mesh *m) {
-    RsdMeshObj *drv = NULL;
-    if(m->mHal.drv) {
-        drv = (RsdMeshObj*)m->mHal.drv;
-        delete drv;
-    }
-    drv = new RsdMeshObj(rsc, m);
-    m->mHal.drv = drv;
-    return drv->init(rsc);
-}
-
-void rsdMeshDraw(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) {
-    if(m->mHal.drv) {
-        RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-        if (!dc->gl.shaderCache->setup(rsc)) {
-            return;
-        }
-
-        RsdMeshObj *drv = (RsdMeshObj*)m->mHal.drv;
-        drv->renderPrimitiveRange(rsc, primIndex, start, len);
-    }
-}
-
-void rsdMeshDestroy(const Context *rsc, const Mesh *m) {
-    if(m->mHal.drv) {
-        RsdMeshObj *drv = (RsdMeshObj*)m->mHal.drv;
-        delete drv;
-    }
-}
-
-
diff --git a/libs/rs/driver/rsdMesh.h b/libs/rs/driver/rsdMesh.h
deleted file mode 100644
index d2714fd..0000000
--- a/libs/rs/driver/rsdMesh.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_MESH_H
-#define RSD_MESH_H
-
-#include <rs_hal.h>
-
-
-bool rsdMeshInit(const android::renderscript::Context *rsc,
-                 const android::renderscript::Mesh *m);
-void rsdMeshDraw(const android::renderscript::Context *rsc,
-                 const android::renderscript::Mesh *m,
-                 uint32_t primIndex, uint32_t start, uint32_t len);
-void rsdMeshDestroy(const android::renderscript::Context *rsc,
-                    const android::renderscript::Mesh *m);
-
-
-#endif
diff --git a/libs/rs/driver/rsdMeshObj.cpp b/libs/rs/driver/rsdMeshObj.cpp
deleted file mode 100644
index 893f046..0000000
--- a/libs/rs/driver/rsdMeshObj.cpp
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (C) 2011 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 <GLES/gl.h>
-#include <GLES2/gl2.h>
-#include <GLES/glext.h>
-
-#include <rs_hal.h>
-#include <rsContext.h>
-#include <rsMesh.h>
-
-#include "rsdAllocation.h"
-#include "rsdMeshObj.h"
-#include "rsdGL.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-RsdMeshObj::RsdMeshObj(const Context *rsc, const Mesh *rsMesh) {
-    mRSMesh = rsMesh;
-
-    mAttribs = NULL;
-    mAttribAllocationIndex = NULL;
-    mGLPrimitives = NULL;
-
-    mAttribCount = 0;
-}
-
-RsdMeshObj::~RsdMeshObj() {
-    if (mAttribs) {
-        delete[] mAttribs;
-        delete[] mAttribAllocationIndex;
-    }
-    if (mGLPrimitives) {
-        delete[] mGLPrimitives;
-    }
-}
-
-bool RsdMeshObj::isValidGLComponent(const Element *elem, uint32_t fieldIdx) {
-    // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted.
-    // Filter rs types accordingly
-    RsDataType dt = elem->mHal.state.fields[fieldIdx]->mHal.state.dataType;
-    if (dt != RS_TYPE_FLOAT_32 && dt != RS_TYPE_UNSIGNED_8 &&
-        dt != RS_TYPE_UNSIGNED_16 && dt != RS_TYPE_SIGNED_8 &&
-        dt != RS_TYPE_SIGNED_16) {
-        return false;
-    }
-
-    // Now make sure they are not arrays
-    uint32_t arraySize = elem->mHal.state.fieldArraySizes[fieldIdx];
-    if (arraySize != 1) {
-        return false;
-    }
-
-    return true;
-}
-
-bool RsdMeshObj::init(const Context *rsc) {
-
-    updateGLPrimitives(rsc);
-
-    // Count the number of gl attrs to initialize
-    mAttribCount = 0;
-    for (uint32_t ct=0; ct < mRSMesh->mHal.state.vertexBuffersCount; ct++) {
-        const Element *elem = mRSMesh->mHal.state.vertexBuffers[ct]->getType()->getElement();
-        for (uint32_t ct=0; ct < elem->mHal.state.fieldsCount; ct++) {
-            if (isValidGLComponent(elem, ct)) {
-                mAttribCount ++;
-            }
-        }
-    }
-
-    if (mAttribs) {
-        delete [] mAttribs;
-        delete [] mAttribAllocationIndex;
-        mAttribs = NULL;
-        mAttribAllocationIndex = NULL;
-    }
-    if (!mAttribCount) {
-        return false;
-    }
-
-    mAttribs = new RsdVertexArray::Attrib[mAttribCount];
-    mAttribAllocationIndex = new uint32_t[mAttribCount];
-
-    uint32_t userNum = 0;
-    for (uint32_t ct=0; ct < mRSMesh->mHal.state.vertexBuffersCount; ct++) {
-        const Element *elem = mRSMesh->mHal.state.vertexBuffers[ct]->getType()->getElement();
-        uint32_t stride = elem->mHal.state.elementSizeBytes;
-        for (uint32_t fieldI=0; fieldI < elem->mHal.state.fieldsCount; fieldI++) {
-            const Element *f = elem->mHal.state.fields[fieldI];
-
-            if (!isValidGLComponent(elem, fieldI)) {
-                continue;
-            }
-
-            mAttribs[userNum].size = f->mHal.state.vectorSize;
-            mAttribs[userNum].offset = elem->mHal.state.fieldOffsetBytes[fieldI];
-            mAttribs[userNum].type = rsdTypeToGLType(f->mHal.state.dataType);
-            mAttribs[userNum].normalized = f->mHal.state.dataType != RS_TYPE_FLOAT_32;
-            mAttribs[userNum].stride = stride;
-            String8 tmp(RS_SHADER_ATTR);
-            tmp.append(elem->mHal.state.fieldNames[fieldI]);
-            mAttribs[userNum].name.setTo(tmp.string());
-
-            // Remember which allocation this attribute came from
-            mAttribAllocationIndex[userNum] = ct;
-            userNum ++;
-        }
-    }
-
-    return true;
-}
-
-void RsdMeshObj::renderPrimitiveRange(const Context *rsc, uint32_t primIndex,
-                                      uint32_t start, uint32_t len) const {
-    if (len < 1 || primIndex >= mRSMesh->mHal.state.primitivesCount || mAttribCount == 0) {
-        rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid mesh or parameters");
-        return;
-    }
-
-    for (uint32_t ct=0; ct < mRSMesh->mHal.state.vertexBuffersCount; ct++) {
-        const Allocation *alloc = mRSMesh->mHal.state.vertexBuffers[ct];
-        DrvAllocation *drv = (DrvAllocation *)alloc->mHal.drv;
-        if (drv->uploadDeferred) {
-            rsdAllocationSyncAll(rsc, alloc, RS_ALLOCATION_USAGE_SCRIPT);
-        }
-    }
-
-    // update attributes with either buffer information or data ptr based on their current state
-    for (uint32_t ct=0; ct < mAttribCount; ct++) {
-        uint32_t allocIndex = mAttribAllocationIndex[ct];
-        Allocation *alloc = mRSMesh->mHal.state.vertexBuffers[allocIndex];
-        DrvAllocation *drvAlloc = (DrvAllocation *)alloc->mHal.drv;
-
-        if (drvAlloc->bufferID) {
-            mAttribs[ct].buffer = drvAlloc->bufferID;
-            mAttribs[ct].ptr = NULL;
-        } else {
-            mAttribs[ct].buffer = 0;
-            mAttribs[ct].ptr = (const uint8_t*)drvAlloc->mallocPtr;
-        }
-    }
-
-    RsdVertexArray va(mAttribs, mAttribCount);
-    va.setup(rsc);
-
-    const Allocation *idxAlloc = mRSMesh->mHal.state.indexBuffers[primIndex];
-    if (idxAlloc) {
-        DrvAllocation *drvAlloc = (DrvAllocation *)idxAlloc->mHal.drv;
-        if (drvAlloc->uploadDeferred) {
-            rsdAllocationSyncAll(rsc, idxAlloc, RS_ALLOCATION_USAGE_SCRIPT);
-        }
-
-        if (drvAlloc->bufferID) {
-            RSD_CALL_GL(glBindBuffer, GL_ELEMENT_ARRAY_BUFFER, drvAlloc->bufferID);
-            RSD_CALL_GL(glDrawElements, mGLPrimitives[primIndex], len, GL_UNSIGNED_SHORT,
-                        (uint16_t *)(start * 2));
-        } else {
-            RSD_CALL_GL(glBindBuffer, GL_ELEMENT_ARRAY_BUFFER, 0);
-            RSD_CALL_GL(glDrawElements, mGLPrimitives[primIndex], len, GL_UNSIGNED_SHORT,
-                        drvAlloc->mallocPtr);
-        }
-    } else {
-        RSD_CALL_GL(glDrawArrays, mGLPrimitives[primIndex], start, len);
-    }
-
-    rsdGLCheckError(rsc, "Mesh::renderPrimitiveRange");
-}
-
-void RsdMeshObj::updateGLPrimitives(const Context *rsc) {
-    mGLPrimitives = new uint32_t[mRSMesh->mHal.state.primitivesCount];
-    for (uint32_t i = 0; i < mRSMesh->mHal.state.primitivesCount; i ++) {
-        switch (mRSMesh->mHal.state.primitives[i]) {
-            case RS_PRIMITIVE_POINT:          mGLPrimitives[i] = GL_POINTS; break;
-            case RS_PRIMITIVE_LINE:           mGLPrimitives[i] = GL_LINES; break;
-            case RS_PRIMITIVE_LINE_STRIP:     mGLPrimitives[i] = GL_LINE_STRIP; break;
-            case RS_PRIMITIVE_TRIANGLE:       mGLPrimitives[i] = GL_TRIANGLES; break;
-            case RS_PRIMITIVE_TRIANGLE_STRIP: mGLPrimitives[i] = GL_TRIANGLE_STRIP; break;
-            case RS_PRIMITIVE_TRIANGLE_FAN:   mGLPrimitives[i] = GL_TRIANGLE_FAN; break;
-            default: rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid mesh primitive"); break;
-        }
-    }
-}
diff --git a/libs/rs/driver/rsdMeshObj.h b/libs/rs/driver/rsdMeshObj.h
deleted file mode 100644
index 1370f01..0000000
--- a/libs/rs/driver/rsdMeshObj.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RSD_MESH_OBJ_H
-#define ANDROID_RSD_MESH_OBJ_H
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-    class Context;
-    class Mesh;
-    class Element;
-
-}
-}
-
-#include "driver/rsdVertexArray.h"
-
-// An element is a group of Components that occupies one cell in a structure.
-class RsdMeshObj {
-public:
-    RsdMeshObj(const android::renderscript::Context *,
-            const android::renderscript::Mesh *);
-    ~RsdMeshObj();
-
-    void renderPrimitiveRange(const android::renderscript::Context *,
-                              uint32_t primIndex, uint32_t start, uint32_t len) const;
-
-    bool init(const android::renderscript::Context *rsc);
-
-protected:
-    const android::renderscript::Mesh *mRSMesh;
-
-    uint32_t *mGLPrimitives;
-    void updateGLPrimitives(const android::renderscript::Context *rsc);
-
-    bool isValidGLComponent(const android::renderscript::Element *elem, uint32_t fieldIdx);
-    // Attribues that allow us to map to GL
-    RsdVertexArray::Attrib *mAttribs;
-    // This allows us to figure out which allocation the attribute
-    // belongs to. In the event the allocation is uploaded to GL
-    // buffer, it lets us properly map it
-    uint32_t *mAttribAllocationIndex;
-    uint32_t mAttribCount;
-};
-
-#endif //ANDROID_RSD_MESH_OBJ_H
-
-
-
diff --git a/libs/rs/driver/rsdPath.cpp b/libs/rs/driver/rsdPath.cpp
deleted file mode 100644
index e04bc02..0000000
--- a/libs/rs/driver/rsdPath.cpp
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2011 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 <GLES/gl.h>
-#include <GLES2/gl2.h>
-#include <GLES/glext.h>
-
-#include <rs_hal.h>
-#include <rsContext.h>
-#include <rsPath.h>
-
-#include "rsdCore.h"
-#include "rsdPath.h"
-#include "rsdAllocation.h"
-#include "rsdGL.h"
-#include "rsdVertexArray.h"
-#include "rsdShaderCache.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-class DrvPath {
-protected:
-    DrvPath();
-public:
-    virtual ~DrvPath();
-    virtual void draw(Context *) = 0;
-};
-
-class DrvPathStatic : public DrvPath {
-public:
-    typedef struct {
-        float x1, xc, x2;
-        float y1, yc, y2;
-    } segment_t;
-
-    segment_t *mSegments;
-    uint32_t mSegmentCount;
-
-    DrvPathStatic(const Allocation *vtx, const Allocation *loops);
-    virtual ~DrvPathStatic();
-
-    virtual void draw(Context *);
-};
-
-class DrvPathDynamic : public DrvPath {
-public:
-    DrvPathDynamic();
-    virtual ~DrvPathDynamic();
-};
-
-static void cleanup(const Context *rsc, const Path *m) {
-    DrvPath *dp = (DrvPath *)m->mHal.drv;
-    if (dp) {
-        delete dp;
-    }
-}
-
-bool rsdPathInitStatic(const Context *rsc, const Path *m,
-                       const Allocation *vtx, const Allocation *loops) {
-    DrvPathStatic *drv = NULL;
-    cleanup(rsc, m);
-
-    DrvPathStatic *dps = new DrvPathStatic(vtx, loops);
-    //LOGE("init path m %p,  %p", m, dps);
-    m->mHal.drv = dps;
-    return dps != NULL;
-}
-
-bool rsdPathInitDynamic(const Context *rsc, const Path *m) {
-    return false;
-}
-
-
-void rsdPathDraw(const Context *rsc, const Path *m) {
-    //LOGE("render m=%p", m);
-
-    DrvPath *drv = (DrvPath *)m->mHal.drv;
-    if(drv) {
-        //LOGE("render 2 drv=%p", drv);
-        drv->draw((Context *)rsc);
-    }
-}
-
-void rsdPathDestroy(const Context *rsc, const Path *m) {
-    cleanup(rsc, m);
-    m->mHal.drv = NULL;
-}
-
-
-
-
-DrvPath::DrvPath() {
-}
-
-DrvPath::~DrvPath() {
-}
-
-DrvPathStatic::DrvPathStatic(const Allocation *vtx, const Allocation *loops) {
-    mSegmentCount = vtx->getType()->getDimX() / 3;
-    mSegments = new segment_t[mSegmentCount];
-
-    const float *fin = (const float *)vtx->getPtr();
-    for (uint32_t ct=0; ct < mSegmentCount; ct++) {
-        segment_t *s = &mSegments[ct];
-        s->x1 = fin[0];
-        s->y1 = fin[1];
-
-        s->xc = fin[2];
-        s->yc = fin[3];
-
-        s->x2 = fin[4];
-        s->y2 = fin[5];
-        fin += 6;
-    }
-}
-
-DrvPathStatic::~DrvPathStatic() {
-}
-
-void DrvPathStatic::draw(Context *rsc) {
-    const static float color[24] = {
-        1.f, 0.f, 0.f, 1.f,  0.5f, 0.f, 0.f, 1.f,
-        1.f, 0.f, 0.f, 1.f,  0.5f, 0.f, 0.f, 1.f,
-        1.f, 1.f, 1.f, 1.f,  1.f, 1.f, 1.f, 1.f};
-    float vtx[12];
-
-    //LOGE("draw");
-    if (!rsc->setupCheck()) {
-        return;
-    }
-
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-    if (!dc->gl.shaderCache->setup(rsc)) {
-        return;
-    }
-
-    RsdVertexArray::Attrib attribs[2];
-    attribs[0].set(GL_FLOAT, 2, 8, false, (uint32_t)vtx, "ATTRIB_position");
-    attribs[1].set(GL_FLOAT, 4, 16, false, (uint32_t)color, "ATTRIB_color");
-    RsdVertexArray va(attribs, 2);
-    va.setup(rsc);
-
-    //LOGE("mSegmentCount %i", mSegmentCount);
-    for (uint32_t ct=0; ct < mSegmentCount; ct++) {
-        segment_t *s = &mSegments[ct];
-
-        vtx[0] = s->x1;
-        vtx[1] = s->y1;
-        vtx[2] = s->xc;
-        vtx[3] = s->yc;
-
-        vtx[4] = s->x2;
-        vtx[5] = s->y2;
-        vtx[6] = s->xc;
-        vtx[7] = s->yc;
-
-        vtx[8] = s->x1;
-        vtx[9] = s->y1;
-        vtx[10] = s->x2;
-        vtx[11] = s->y2;
-
-        RSD_CALL_GL(glDrawArrays, GL_LINES, 0, 6);
-    }
-
-}
-
-DrvPathDynamic::DrvPathDynamic() {
-}
-
-DrvPathDynamic::~DrvPathDynamic() {
-}
diff --git a/libs/rs/driver/rsdPath.h b/libs/rs/driver/rsdPath.h
deleted file mode 100644
index fa00972..0000000
--- a/libs/rs/driver/rsdPath.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_PATH_H
-#define RSD_PATH_H
-
-#include <rs_hal.h>
-
-
-bool rsdPathInitStatic(const android::renderscript::Context *rsc,
-                       const android::renderscript::Path *m,
-                       const android::renderscript::Allocation *vertex,
-                       const android::renderscript::Allocation *loops);
-bool rsdPathInitDynamic(const android::renderscript::Context *rsc,
-                        const android::renderscript::Path *m);
-void rsdPathDraw(const android::renderscript::Context *rsc,
-                 const android::renderscript::Path *m);
-void rsdPathDestroy(const android::renderscript::Context *rsc,
-                    const android::renderscript::Path *m);
-
-
-#endif
diff --git a/libs/rs/driver/rsdProgram.cpp b/libs/rs/driver/rsdProgram.cpp
deleted file mode 100644
index a96a5f9..0000000
--- a/libs/rs/driver/rsdProgram.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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 "rsdCore.h"
-#include "rsdAllocation.h"
-#include "rsdProgramVertex.h"
-#include "rsdShader.h"
-#include "rsdShaderCache.h"
-
-#include "rsContext.h"
-#include "rsProgramVertex.h"
-#include "rsProgramFragment.h"
-
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-bool rsdProgramVertexInit(const Context *rsc, const ProgramVertex *pv,
-                          const char* shader, size_t shaderLen,
-                          const char** textureNames, size_t textureNamesCount,
-                          const size_t *textureNamesLength) {
-    RsdShader *drv = new RsdShader(pv, GL_VERTEX_SHADER, shader, shaderLen,
-                                   textureNames, textureNamesCount, textureNamesLength);
-    pv->mHal.drv = drv;
-
-    return true;
-}
-
-static void SyncProgramConstants(const Context *rsc, const Program *p) {
-    for (uint32_t ct=0; ct < p->mHal.state.texturesCount; ct++) {
-        const Allocation *a = p->mHal.state.textures[ct];
-        if (!a) {
-            continue;
-        }
-        DrvAllocation *drvAlloc = (DrvAllocation *)a->mHal.drv;
-        if (drvAlloc->uploadDeferred) {
-            rsdAllocationSyncAll(rsc, a, RS_ALLOCATION_USAGE_SCRIPT);
-        }
-    }
-}
-
-void rsdProgramVertexSetActive(const Context *rsc, const ProgramVertex *pv) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    SyncProgramConstants(rsc, pv);
-    dc->gl.shaderCache->setActiveVertex((RsdShader*)pv->mHal.drv);
-}
-
-void rsdProgramVertexDestroy(const Context *rsc, const ProgramVertex *pv) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    RsdShader *drv = NULL;
-    if(pv->mHal.drv) {
-        drv = (RsdShader*)pv->mHal.drv;
-        if (rsc->props.mLogShaders) {
-            ALOGV("Destroying vertex shader with ID %u", (uint32_t)pv);
-        }
-        if (drv->getStateBasedIDCount()) {
-            dc->gl.shaderCache->cleanupVertex(drv);
-        }
-        delete drv;
-    }
-}
-
-bool rsdProgramFragmentInit(const Context *rsc, const ProgramFragment *pf,
-                            const char* shader, size_t shaderLen,
-                            const char** textureNames, size_t textureNamesCount,
-                            const size_t *textureNamesLength) {
-    RsdShader *drv = new RsdShader(pf, GL_FRAGMENT_SHADER, shader, shaderLen,
-                                   textureNames, textureNamesCount, textureNamesLength);
-    pf->mHal.drv = drv;
-
-    return true;
-}
-
-void rsdProgramFragmentSetActive(const Context *rsc, const ProgramFragment *pf) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    SyncProgramConstants(rsc, pf);
-    dc->gl.shaderCache->setActiveFragment((RsdShader*)pf->mHal.drv);
-}
-
-void rsdProgramFragmentDestroy(const Context *rsc, const ProgramFragment *pf) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    RsdShader *drv = NULL;
-    if(pf->mHal.drv) {
-        drv = (RsdShader*)pf->mHal.drv;
-        if (rsc->props.mLogShaders) {
-            ALOGV("Destroying fragment shader with ID %u", (uint32_t)pf);
-        }
-        if (drv->getStateBasedIDCount()) {
-            dc->gl.shaderCache->cleanupFragment(drv);
-        }
-        delete drv;
-    }
-}
-
-
diff --git a/libs/rs/driver/rsdProgramFragment.h b/libs/rs/driver/rsdProgramFragment.h
deleted file mode 100644
index b03a9fe..0000000
--- a/libs/rs/driver/rsdProgramFragment.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_PROGRAM_FRAGMENT_H
-#define RSD_PROGRAM_FRAGMENT_H
-
-#include <rs_hal.h>
-
-
-bool rsdProgramFragmentInit(const android::renderscript::Context *rsc,
-                            const android::renderscript::ProgramFragment *,
-                            const char* shader, size_t shaderLen,
-                            const char** textureNames, size_t textureNamesCount,
-                            const size_t *textureNamesLength);
-void rsdProgramFragmentSetActive(const android::renderscript::Context *rsc,
-                                 const android::renderscript::ProgramFragment *);
-void rsdProgramFragmentDestroy(const android::renderscript::Context *rsc,
-                               const android::renderscript::ProgramFragment *);
-
-
-#endif //RSD_PROGRAM_Fragment_H
diff --git a/libs/rs/driver/rsdProgramRaster.cpp b/libs/rs/driver/rsdProgramRaster.cpp
deleted file mode 100644
index e5a0291..0000000
--- a/libs/rs/driver/rsdProgramRaster.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsdCore.h"
-#include "rsdProgramStore.h"
-
-#include "rsContext.h"
-#include "rsProgramStore.h"
-
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-
-
-using namespace android;
-using namespace android::renderscript;
-
-bool rsdProgramRasterInit(const Context *, const ProgramRaster *) {
-    return true;
-}
-
-void rsdProgramRasterSetActive(const Context *rsc, const ProgramRaster *pr) {
-    switch (pr->mHal.state.cull) {
-        case RS_CULL_BACK:
-            RSD_CALL_GL(glEnable, GL_CULL_FACE);
-            RSD_CALL_GL(glCullFace, GL_BACK);
-            break;
-        case RS_CULL_FRONT:
-            RSD_CALL_GL(glEnable, GL_CULL_FACE);
-            RSD_CALL_GL(glCullFace, GL_FRONT);
-            break;
-        case RS_CULL_NONE:
-            RSD_CALL_GL(glDisable, GL_CULL_FACE);
-            break;
-        default:
-            rsc->setError(RS_ERROR_FATAL_DRIVER, "Invalid cull type");
-            break;
-    }
-
-}
-
-void rsdProgramRasterDestroy(const Context *, const ProgramRaster *) {
-}
-
-
diff --git a/libs/rs/driver/rsdProgramRaster.h b/libs/rs/driver/rsdProgramRaster.h
deleted file mode 100644
index 20adaad..0000000
--- a/libs/rs/driver/rsdProgramRaster.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_PROGRAM_RASTER_H
-#define RSD_PROGRAM_RASTER_H
-
-#include <rs_hal.h>
-
-
-bool rsdProgramRasterInit(const android::renderscript::Context *rsc,
-                         const android::renderscript::ProgramRaster *);
-void rsdProgramRasterSetActive(const android::renderscript::Context *rsc,
-                              const android::renderscript::ProgramRaster *);
-void rsdProgramRasterDestroy(const android::renderscript::Context *rsc,
-                            const android::renderscript::ProgramRaster *);
-
-
-#endif
diff --git a/libs/rs/driver/rsdProgramStore.cpp b/libs/rs/driver/rsdProgramStore.cpp
deleted file mode 100644
index c1295e8..0000000
--- a/libs/rs/driver/rsdProgramStore.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsdCore.h"
-#include "rsdProgramStore.h"
-
-#include "rsContext.h"
-#include "rsProgramStore.h"
-
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-
-
-using namespace android;
-using namespace android::renderscript;
-
-struct DrvProgramStore {
-    GLenum blendSrc;
-    GLenum blendDst;
-    bool blendEnable;
-
-    GLenum depthFunc;
-    bool depthTestEnable;
-};
-
-bool rsdProgramStoreInit(const Context *rsc, const ProgramStore *ps) {
-    DrvProgramStore *drv = (DrvProgramStore *)calloc(1, sizeof(DrvProgramStore));
-    if (drv == NULL) {
-        return false;
-    }
-
-    ps->mHal.drv = drv;
-    drv->depthTestEnable = true;
-
-    switch (ps->mHal.state.depthFunc) {
-    case RS_DEPTH_FUNC_ALWAYS:
-        drv->depthTestEnable = false;
-        drv->depthFunc = GL_ALWAYS;
-        break;
-    case RS_DEPTH_FUNC_LESS:
-        drv->depthFunc = GL_LESS;
-        break;
-    case RS_DEPTH_FUNC_LEQUAL:
-        drv->depthFunc = GL_LEQUAL;
-        break;
-    case RS_DEPTH_FUNC_GREATER:
-        drv->depthFunc = GL_GREATER;
-        break;
-    case RS_DEPTH_FUNC_GEQUAL:
-        drv->depthFunc = GL_GEQUAL;
-        break;
-    case RS_DEPTH_FUNC_EQUAL:
-        drv->depthFunc = GL_EQUAL;
-        break;
-    case RS_DEPTH_FUNC_NOTEQUAL:
-        drv->depthFunc = GL_NOTEQUAL;
-        break;
-    default:
-        ALOGE("Unknown depth function.");
-        goto error;
-    }
-
-
-
-    drv->blendEnable = true;
-    if ((ps->mHal.state.blendSrc == RS_BLEND_SRC_ONE) &&
-        (ps->mHal.state.blendDst == RS_BLEND_DST_ZERO)) {
-        drv->blendEnable = false;
-    }
-
-    switch (ps->mHal.state.blendSrc) {
-    case RS_BLEND_SRC_ZERO:
-        drv->blendSrc = GL_ZERO;
-        break;
-    case RS_BLEND_SRC_ONE:
-        drv->blendSrc = GL_ONE;
-        break;
-    case RS_BLEND_SRC_DST_COLOR:
-        drv->blendSrc = GL_DST_COLOR;
-        break;
-    case RS_BLEND_SRC_ONE_MINUS_DST_COLOR:
-        drv->blendSrc = GL_ONE_MINUS_DST_COLOR;
-        break;
-    case RS_BLEND_SRC_SRC_ALPHA:
-        drv->blendSrc = GL_SRC_ALPHA;
-        break;
-    case RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA:
-        drv->blendSrc = GL_ONE_MINUS_SRC_ALPHA;
-        break;
-    case RS_BLEND_SRC_DST_ALPHA:
-        drv->blendSrc = GL_DST_ALPHA;
-        break;
-    case RS_BLEND_SRC_ONE_MINUS_DST_ALPHA:
-        drv->blendSrc = GL_ONE_MINUS_DST_ALPHA;
-        break;
-    case RS_BLEND_SRC_SRC_ALPHA_SATURATE:
-        drv->blendSrc = GL_SRC_ALPHA_SATURATE;
-        break;
-    default:
-        rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend src mode.");
-        goto error;
-    }
-
-    switch (ps->mHal.state.blendDst) {
-    case RS_BLEND_DST_ZERO:
-        drv->blendDst = GL_ZERO;
-        break;
-    case RS_BLEND_DST_ONE:
-        drv->blendDst = GL_ONE;
-        break;
-    case RS_BLEND_DST_SRC_COLOR:
-        drv->blendDst = GL_SRC_COLOR;
-        break;
-    case RS_BLEND_DST_ONE_MINUS_SRC_COLOR:
-        drv->blendDst = GL_ONE_MINUS_SRC_COLOR;
-        break;
-    case RS_BLEND_DST_SRC_ALPHA:
-        drv->blendDst = GL_SRC_ALPHA;
-        break;
-    case RS_BLEND_DST_ONE_MINUS_SRC_ALPHA:
-        drv->blendDst = GL_ONE_MINUS_SRC_ALPHA;
-        break;
-    case RS_BLEND_DST_DST_ALPHA:
-        drv->blendDst = GL_DST_ALPHA;
-        break;
-    case RS_BLEND_DST_ONE_MINUS_DST_ALPHA:
-        drv->blendDst = GL_ONE_MINUS_DST_ALPHA;
-        break;
-    default:
-        rsc->setError(RS_ERROR_FATAL_DRIVER, "Unknown blend dst mode.");
-        goto error;
-    }
-
-    return true;
-
-error:
-    free(drv);
-    ps->mHal.drv = NULL;
-    return false;
-}
-
-void rsdProgramStoreSetActive(const Context *rsc, const ProgramStore *ps) {
-    DrvProgramStore *drv = (DrvProgramStore *)ps->mHal.drv;
-
-    RSD_CALL_GL(glColorMask, ps->mHal.state.colorRWriteEnable,
-                ps->mHal.state.colorGWriteEnable,
-                ps->mHal.state.colorBWriteEnable,
-                ps->mHal.state.colorAWriteEnable);
-
-    if (drv->blendEnable) {
-        RSD_CALL_GL(glEnable, GL_BLEND);
-        RSD_CALL_GL(glBlendFunc, drv->blendSrc, drv->blendDst);
-    } else {
-        RSD_CALL_GL(glDisable, GL_BLEND);
-    }
-
-    if (rsc->mUserSurfaceConfig.depthMin > 0) {
-        RSD_CALL_GL(glDepthMask, ps->mHal.state.depthWriteEnable);
-        if (drv->depthTestEnable || ps->mHal.state.depthWriteEnable) {
-            RSD_CALL_GL(glEnable, GL_DEPTH_TEST);
-            RSD_CALL_GL(glDepthFunc, drv->depthFunc);
-        } else {
-            RSD_CALL_GL(glDisable, GL_DEPTH_TEST);
-        }
-    } else {
-        RSD_CALL_GL(glDepthMask, false);
-        RSD_CALL_GL(glDisable, GL_DEPTH_TEST);
-    }
-
-    /*
-    if (rsc->mUserSurfaceConfig.stencilMin > 0) {
-    } else {
-        glStencilMask(0);
-        glDisable(GL_STENCIL_TEST);
-    }
-    */
-
-    if (ps->mHal.state.ditherEnable) {
-        RSD_CALL_GL(glEnable, GL_DITHER);
-    } else {
-        RSD_CALL_GL(glDisable, GL_DITHER);
-    }
-}
-
-void rsdProgramStoreDestroy(const Context *rsc, const ProgramStore *ps) {
-    free(ps->mHal.drv);
-    ps->mHal.drv = NULL;
-}
-
-
diff --git a/libs/rs/driver/rsdProgramStore.h b/libs/rs/driver/rsdProgramStore.h
deleted file mode 100644
index 217a0ce..0000000
--- a/libs/rs/driver/rsdProgramStore.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_PROGRAM_STORE_H
-#define RSD_PROGRAM_STORE_H
-
-#include <rs_hal.h>
-
-
-bool rsdProgramStoreInit(const android::renderscript::Context *rsc,
-                         const android::renderscript::ProgramStore *ps);
-void rsdProgramStoreSetActive(const android::renderscript::Context *rsc,
-                              const android::renderscript::ProgramStore *ps);
-void rsdProgramStoreDestroy(const android::renderscript::Context *rsc,
-                            const android::renderscript::ProgramStore *ps);
-
-
-#endif
diff --git a/libs/rs/driver/rsdProgramVertex.h b/libs/rs/driver/rsdProgramVertex.h
deleted file mode 100644
index f917a41..0000000
--- a/libs/rs/driver/rsdProgramVertex.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_PROGRAM_VERTEX_H
-#define RSD_PROGRAM_VERTEX_H
-
-#include <rs_hal.h>
-
-bool rsdProgramVertexInit(const android::renderscript::Context *rsc,
-                          const android::renderscript::ProgramVertex *,
-                          const char* shader, size_t shaderLen,
-                          const char** textureNames, size_t textureNamesCount,
-                          const size_t *textureNamesLength);
-void rsdProgramVertexSetActive(const android::renderscript::Context *rsc,
-                               const android::renderscript::ProgramVertex *);
-void rsdProgramVertexDestroy(const android::renderscript::Context *rsc,
-                             const android::renderscript::ProgramVertex *);
-
-
-#endif //RSD_PROGRAM_VERTEX_H
diff --git a/libs/rs/driver/rsdRuntime.h b/libs/rs/driver/rsdRuntime.h
deleted file mode 100644
index 840eced..0000000
--- a/libs/rs/driver/rsdRuntime.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_RUNTIME_STUBS_H
-#define RSD_RUNTIME_STUBS_H
-
-#include <rs_hal.h>
-#include <bcc/bcc.h>
-
-#include "rsMutex.h"
-
-const RsdSymbolTable * rsdLookupSymbolMath(const char *sym);
-
-void* rsdLookupRuntimeStub(void* pContext, char const* name);
-
-#endif
diff --git a/libs/rs/driver/rsdRuntimeMath.cpp b/libs/rs/driver/rsdRuntimeMath.cpp
deleted file mode 100644
index 753ef73..0000000
--- a/libs/rs/driver/rsdRuntimeMath.cpp
+++ /dev/null
@@ -1,567 +0,0 @@
-/*
- * Copyright (C) 2011 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 <cutils/compiler.h>
-
-#include "rsContext.h"
-#include "rsScriptC.h"
-#include "rsMatrix4x4.h"
-#include "rsMatrix3x3.h"
-#include "rsMatrix2x2.h"
-
-#include "rsdCore.h"
-#include "rsdRuntime.h"
-
-
-using namespace android;
-using namespace android::renderscript;
-
-
-static float SC_exp10(float v) {
-    return pow(10.f, v);
-}
-
-static float SC_fract(float v, int *iptr) {
-    int i = (int)floor(v);
-    iptr[0] = i;
-    return fmin(v - i, 0x1.fffffep-1f);
-}
-
-static float SC_log2(float v) {
-    return log10(v) / log10(2.f);
-}
-
-static float SC_mad(float v1, float v2, float v3) {
-    return v1 * v2 + v3;
-}
-
-#if 0
-static float SC_pown(float v, int p) {
-    return powf(v, (float)p);
-}
-
-static float SC_powr(float v, float p) {
-    return powf(v, p);
-}
-#endif
-
-float SC_rootn(float v, int r) {
-    return pow(v, 1.f / r);
-}
-
-float SC_rsqrt(float v) {
-    return 1.f / sqrtf(v);
-}
-
-float SC_sincos(float v, float *cosptr) {
-    *cosptr = cosf(v);
-    return sinf(v);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// Integer
-//////////////////////////////////////////////////////////////////////////////
-
-
-static uint32_t SC_abs_i32(int32_t v) {return abs(v);}
-static uint16_t SC_abs_i16(int16_t v) {return (uint16_t)abs(v);}
-static uint8_t SC_abs_i8(int8_t v) {return (uint8_t)abs(v);}
-
-static uint32_t SC_clz_u32(uint32_t v) {return __builtin_clz(v);}
-static uint16_t SC_clz_u16(uint16_t v) {return (uint16_t)__builtin_clz(v);}
-static uint8_t SC_clz_u8(uint8_t v) {return (uint8_t)__builtin_clz(v);}
-static int32_t SC_clz_i32(int32_t v) {return (int32_t)__builtin_clz((uint32_t)v);}
-static int16_t SC_clz_i16(int16_t v) {return (int16_t)__builtin_clz(v);}
-static int8_t SC_clz_i8(int8_t v) {return (int8_t)__builtin_clz(v);}
-
-static uint32_t SC_max_u32(uint32_t v, uint32_t v2) {return rsMax(v, v2);}
-static uint16_t SC_max_u16(uint16_t v, uint16_t v2) {return rsMax(v, v2);}
-static uint8_t SC_max_u8(uint8_t v, uint8_t v2) {return rsMax(v, v2);}
-static int32_t SC_max_i32(int32_t v, int32_t v2) {return rsMax(v, v2);}
-static int16_t SC_max_i16(int16_t v, int16_t v2) {return rsMax(v, v2);}
-static int8_t SC_max_i8(int8_t v, int8_t v2) {return rsMax(v, v2);}
-
-static uint32_t SC_min_u32(uint32_t v, uint32_t v2) {return rsMin(v, v2);}
-static uint16_t SC_min_u16(uint16_t v, uint16_t v2) {return rsMin(v, v2);}
-static uint8_t SC_min_u8(uint8_t v, uint8_t v2) {return rsMin(v, v2);}
-static int32_t SC_min_i32(int32_t v, int32_t v2) {return rsMin(v, v2);}
-static int16_t SC_min_i16(int16_t v, int16_t v2) {return rsMin(v, v2);}
-static int8_t SC_min_i8(int8_t v, int8_t v2) {return rsMin(v, v2);}
-
-//////////////////////////////////////////////////////////////////////////////
-// Float util
-//////////////////////////////////////////////////////////////////////////////
-
-static float SC_clamp_f32(float amount, float low, float high) {
-    return amount < low ? low : (amount > high ? high : amount);
-}
-
-static float SC_degrees(float radians) {
-    return radians * (180.f / M_PI);
-}
-
-static float SC_max_f32(float v, float v2) {
-    return rsMax(v, v2);
-}
-
-static float SC_min_f32(float v, float v2) {
-    return rsMin(v, v2);
-}
-
-static float SC_mix_f32(float start, float stop, float amount) {
-    //ALOGE("lerpf %f  %f  %f", start, stop, amount);
-    return start + (stop - start) * amount;
-}
-
-static float SC_radians(float degrees) {
-    return degrees * (M_PI / 180.f);
-}
-
-static float SC_step_f32(float edge, float v) {
-    if (v < edge) return 0.f;
-    return 1.f;
-}
-
-static float SC_sign_f32(float value) {
-    if (value > 0) return 1.f;
-    if (value < 0) return -1.f;
-    return value;
-}
-
-static void SC_MatrixLoadIdentity_4x4(Matrix4x4 *m) {
-    m->loadIdentity();
-}
-static void SC_MatrixLoadIdentity_3x3(Matrix3x3 *m) {
-    m->loadIdentity();
-}
-static void SC_MatrixLoadIdentity_2x2(Matrix2x2 *m) {
-    m->loadIdentity();
-}
-
-static void SC_MatrixLoad_4x4_f(Matrix4x4 *m, const float *f) {
-    m->load(f);
-}
-static void SC_MatrixLoad_3x3_f(Matrix3x3 *m, const float *f) {
-    m->load(f);
-}
-static void SC_MatrixLoad_2x2_f(Matrix2x2 *m, const float *f) {
-    m->load(f);
-}
-
-static void SC_MatrixLoad_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *s) {
-    m->load(s);
-}
-static void SC_MatrixLoad_4x4_3x3(Matrix4x4 *m, const Matrix3x3 *s) {
-    m->load(s);
-}
-static void SC_MatrixLoad_4x4_2x2(Matrix4x4 *m, const Matrix2x2 *s) {
-    m->load(s);
-}
-static void SC_MatrixLoad_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *s) {
-    m->load(s);
-}
-static void SC_MatrixLoad_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *s) {
-    m->load(s);
-}
-
-static void SC_MatrixLoadRotate(Matrix4x4 *m, float rot, float x, float y, float z) {
-    m->loadRotate(rot, x, y, z);
-}
-static void SC_MatrixLoadScale(Matrix4x4 *m, float x, float y, float z) {
-    m->loadScale(x, y, z);
-}
-static void SC_MatrixLoadTranslate(Matrix4x4 *m, float x, float y, float z) {
-    m->loadTranslate(x, y, z);
-}
-static void SC_MatrixRotate(Matrix4x4 *m, float rot, float x, float y, float z) {
-    m->rotate(rot, x, y, z);
-}
-static void SC_MatrixScale(Matrix4x4 *m, float x, float y, float z) {
-    m->scale(x, y, z);
-}
-static void SC_MatrixTranslate(Matrix4x4 *m, float x, float y, float z) {
-    m->translate(x, y, z);
-}
-
-static void SC_MatrixLoadMultiply_4x4_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *lhs, const Matrix4x4 *rhs) {
-    m->loadMultiply(lhs, rhs);
-}
-static void SC_MatrixLoadMultiply_3x3_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *lhs, const Matrix3x3 *rhs) {
-    m->loadMultiply(lhs, rhs);
-}
-static void SC_MatrixLoadMultiply_2x2_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *lhs, const Matrix2x2 *rhs) {
-    m->loadMultiply(lhs, rhs);
-}
-
-static void SC_MatrixMultiply_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *rhs) {
-    m->multiply(rhs);
-}
-static void SC_MatrixMultiply_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *rhs) {
-    m->multiply(rhs);
-}
-static void SC_MatrixMultiply_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *rhs) {
-    m->multiply(rhs);
-}
-
-static void SC_MatrixLoadOrtho(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) {
-    m->loadOrtho(l, r, b, t, n, f);
-}
-static void SC_MatrixLoadFrustum(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) {
-    m->loadFrustum(l, r, b, t, n, f);
-}
-static void SC_MatrixLoadPerspective(Matrix4x4 *m, float fovy, float aspect, float near, float far) {
-    m->loadPerspective(fovy, aspect, near, far);
-}
-
-static bool SC_MatrixInverse_4x4(Matrix4x4 *m) {
-    return m->inverse();
-}
-static bool SC_MatrixInverseTranspose_4x4(Matrix4x4 *m) {
-    return m->inverseTranspose();
-}
-static void SC_MatrixTranspose_4x4(Matrix4x4 *m) {
-    m->transpose();
-}
-static void SC_MatrixTranspose_3x3(Matrix3x3 *m) {
-    m->transpose();
-}
-static void SC_MatrixTranspose_2x2(Matrix2x2 *m) {
-    m->transpose();
-}
-
-static float SC_randf(float max) {
-    float r = (float)rand();
-    r *= max;
-    r /= RAND_MAX;
-    return r;
-}
-
-static float SC_randf2(float min, float max) {
-    float r = (float)rand();
-    r /= RAND_MAX;
-    r = r * (max - min) + min;
-    return r;
-}
-
-static int SC_randi(int max) {
-    return (int)SC_randf(max);
-}
-
-static int SC_randi2(int min, int max) {
-    return (int)SC_randf2(min, max);
-}
-
-static float SC_frac(float v) {
-    int i = (int)floor(v);
-    return fmin(v - i, 0x1.fffffep-1f);
-}
-
-
-static int32_t SC_AtomicCas(volatile int32_t *ptr, int32_t expectedValue, int32_t newValue) {
-    int32_t prev;
-
-    do {
-        int32_t ret = android_atomic_release_cas(expectedValue, newValue, ptr);
-        if (!ret) {
-            // The android cas return 0 if it wrote the value.  This means the
-            // previous value was the expected value and we can return.
-            return expectedValue;
-        }
-        // We didn't write the value and need to load the "previous" value.
-        prev = *ptr;
-
-        // A race condition exists where the expected value could appear after our cas failed
-        // above.  In this case loop until we have a legit previous value or the
-        // write passes.
-        } while (prev == expectedValue);
-    return prev;
-}
-
-
-static int32_t SC_AtomicInc(volatile int32_t *ptr) {
-    return android_atomic_inc(ptr);
-}
-
-static int32_t SC_AtomicDec(volatile int32_t *ptr) {
-    return android_atomic_dec(ptr);
-}
-
-static int32_t SC_AtomicAdd(volatile int32_t *ptr, int32_t value) {
-    return android_atomic_add(value, ptr);
-}
-
-static int32_t SC_AtomicSub(volatile int32_t *ptr, int32_t value) {
-    int32_t prev, status;
-    do {
-        prev = *ptr;
-        status = android_atomic_release_cas(prev, prev - value, ptr);
-    } while (CC_UNLIKELY(status != 0));
-    return prev;
-}
-
-static int32_t SC_AtomicAnd(volatile int32_t *ptr, int32_t value) {
-    return android_atomic_and(value, ptr);
-}
-
-static int32_t SC_AtomicOr(volatile int32_t *ptr, int32_t value) {
-    return android_atomic_or(value, ptr);
-}
-
-static int32_t SC_AtomicXor(volatile int32_t *ptr, int32_t value) {
-    int32_t prev, status;
-    do {
-        prev = *ptr;
-        status = android_atomic_release_cas(prev, prev ^ value, ptr);
-    } while (CC_UNLIKELY(status != 0));
-    return prev;
-}
-
-static uint32_t SC_AtomicUMin(volatile uint32_t *ptr, uint32_t value) {
-    uint32_t prev, status;
-    do {
-        prev = *ptr;
-        uint32_t n = rsMin(value, prev);
-        status = android_atomic_release_cas((int32_t) prev, (int32_t)n, (volatile int32_t*) ptr);
-    } while (CC_UNLIKELY(status != 0));
-    return prev;
-}
-
-static int32_t SC_AtomicMin(volatile int32_t *ptr, int32_t value) {
-    int32_t prev, status;
-    do {
-        prev = *ptr;
-        int32_t n = rsMin(value, prev);
-        status = android_atomic_release_cas(prev, n, ptr);
-    } while (CC_UNLIKELY(status != 0));
-    return prev;
-}
-
-static uint32_t SC_AtomicUMax(volatile uint32_t *ptr, uint32_t value) {
-    uint32_t prev, status;
-    do {
-        prev = *ptr;
-        uint32_t n = rsMax(value, prev);
-        status = android_atomic_release_cas((int32_t) prev, (int32_t) n, (volatile int32_t*) ptr);
-    } while (CC_UNLIKELY(status != 0));
-    return prev;
-}
-
-static int32_t SC_AtomicMax(volatile int32_t *ptr, int32_t value) {
-    int32_t prev, status;
-    do {
-        prev = *ptr;
-        int32_t n = rsMax(value, prev);
-        status = android_atomic_release_cas(prev, n, ptr);
-    } while (CC_UNLIKELY(status != 0));
-    return prev;
-}
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Class implementation
-//////////////////////////////////////////////////////////////////////////////
-
-// llvm name mangling ref
-//  <builtin-type> ::= v  # void
-//                 ::= b  # bool
-//                 ::= c  # char
-//                 ::= a  # signed char
-//                 ::= h  # unsigned char
-//                 ::= s  # short
-//                 ::= t  # unsigned short
-//                 ::= i  # int
-//                 ::= j  # unsigned int
-//                 ::= l  # long
-//                 ::= m  # unsigned long
-//                 ::= x  # long long, __int64
-//                 ::= y  # unsigned long long, __int64
-//                 ::= f  # float
-//                 ::= d  # double
-
-static RsdSymbolTable gSyms[] = {
-    { "_Z4acosf", (void *)&acosf, true },
-    { "_Z5acoshf", (void *)&acoshf, true },
-    { "_Z4asinf", (void *)&asinf, true },
-    { "_Z5asinhf", (void *)&asinhf, true },
-    { "_Z4atanf", (void *)&atanf, true },
-    { "_Z5atan2ff", (void *)&atan2f, true },
-    { "_Z5atanhf", (void *)&atanhf, true },
-    { "_Z4cbrtf", (void *)&cbrtf, true },
-    { "_Z4ceilf", (void *)&ceilf, true },
-    { "_Z8copysignff", (void *)&copysignf, true },
-    { "_Z3cosf", (void *)&cosf, true },
-    { "_Z4coshf", (void *)&coshf, true },
-    { "_Z4erfcf", (void *)&erfcf, true },
-    { "_Z3erff", (void *)&erff, true },
-    { "_Z3expf", (void *)&expf, true },
-    { "_Z4exp2f", (void *)&exp2f, true },
-    { "_Z5exp10f", (void *)&SC_exp10, true },
-    { "_Z5expm1f", (void *)&expm1f, true },
-    { "_Z4fabsf", (void *)&fabsf, true },
-    { "_Z4fdimff", (void *)&fdimf, true },
-    { "_Z5floorf", (void *)&floorf, true },
-    { "_Z3fmafff", (void *)&fmaf, true },
-    { "_Z4fmaxff", (void *)&fmaxf, true },
-    { "_Z4fminff", (void *)&fminf, true },  // float fmin(float, float)
-    { "_Z4fmodff", (void *)&fmodf, true },
-    { "_Z5fractfPf", (void *)&SC_fract, true },
-    { "_Z5frexpfPi", (void *)&frexpf, true },
-    { "_Z5hypotff", (void *)&hypotf, true },
-    { "_Z5ilogbf", (void *)&ilogbf, true },
-    { "_Z5ldexpfi", (void *)&ldexpf, true },
-    { "_Z6lgammaf", (void *)&lgammaf, true },
-    { "_Z6lgammafPi", (void *)&lgammaf_r, true },
-    { "_Z3logf", (void *)&logf, true },
-    { "_Z4log2f", (void *)&SC_log2, true },
-    { "_Z5log10f", (void *)&log10f, true },
-    { "_Z5log1pf", (void *)&log1pf, true },
-    { "_Z4logbf", (void *)&logbf, true },
-    { "_Z3madfff", (void *)&SC_mad, true },
-    { "_Z4modffPf", (void *)&modff, true },
-    //{ "_Z3nanj", (void *)&SC_nan, true },
-    { "_Z9nextafterff", (void *)&nextafterf, true },
-    { "_Z3powff", (void *)&powf, true },
-    { "_Z9remainderff", (void *)&remainderf, true },
-    { "_Z6remquoffPi", (void *)&remquof, true },
-    { "_Z4rintf", (void *)&rintf, true },
-    { "_Z5rootnfi", (void *)&SC_rootn, true },
-    { "_Z5roundf", (void *)&roundf, true },
-    { "_Z5rsqrtf", (void *)&SC_rsqrt, true },
-    { "_Z3sinf", (void *)&sinf, true },
-    { "_Z6sincosfPf", (void *)&SC_sincos, true },
-    { "_Z4sinhf", (void *)&sinhf, true },
-    { "_Z4sqrtf", (void *)&sqrtf, true },
-    { "_Z3tanf", (void *)&tanf, true },
-    { "_Z4tanhf", (void *)&tanhf, true },
-    { "_Z6tgammaf", (void *)&tgammaf, true },
-    { "_Z5truncf", (void *)&truncf, true },
-
-    { "_Z3absi", (void *)&SC_abs_i32, true },
-    { "_Z3abss", (void *)&SC_abs_i16, true },
-    { "_Z3absc", (void *)&SC_abs_i8, true },
-    { "_Z3clzj", (void *)&SC_clz_u32, true },
-    { "_Z3clzt", (void *)&SC_clz_u16, true },
-    { "_Z3clzh", (void *)&SC_clz_u8, true },
-    { "_Z3clzi", (void *)&SC_clz_i32, true },
-    { "_Z3clzs", (void *)&SC_clz_i16, true },
-    { "_Z3clzc", (void *)&SC_clz_i8, true },
-    { "_Z3maxjj", (void *)&SC_max_u32, true },
-    { "_Z3maxtt", (void *)&SC_max_u16, true },
-    { "_Z3maxhh", (void *)&SC_max_u8, true },
-    { "_Z3maxii", (void *)&SC_max_i32, true },
-    { "_Z3maxss", (void *)&SC_max_i16, true },
-    { "_Z3maxcc", (void *)&SC_max_i8, true },
-    { "_Z3minjj", (void *)&SC_min_u32, true },
-    { "_Z3mintt", (void *)&SC_min_u16, true },
-    { "_Z3minhh", (void *)&SC_min_u8, true },
-    { "_Z3minii", (void *)&SC_min_i32, true },
-    { "_Z3minss", (void *)&SC_min_i16, true },
-    { "_Z3mincc", (void *)&SC_min_i8, true },
-
-    { "_Z5clampfff", (void *)&SC_clamp_f32, true },
-    { "_Z7degreesf", (void *)&SC_degrees, true },
-    { "_Z3maxff", (void *)&SC_max_f32, true },
-    { "_Z3minff", (void *)&SC_min_f32, true },
-    { "_Z3mixfff", (void *)&SC_mix_f32, true },
-    { "_Z7radiansf", (void *)&SC_radians, true },
-    { "_Z4stepff", (void *)&SC_step_f32, true },
-    //{ "smoothstep", (void *)&, true },
-    { "_Z4signf", (void *)&SC_sign_f32, true },
-
-    // matrix
-    { "_Z20rsMatrixLoadIdentityP12rs_matrix4x4", (void *)&SC_MatrixLoadIdentity_4x4, true },
-    { "_Z20rsMatrixLoadIdentityP12rs_matrix3x3", (void *)&SC_MatrixLoadIdentity_3x3, true },
-    { "_Z20rsMatrixLoadIdentityP12rs_matrix2x2", (void *)&SC_MatrixLoadIdentity_2x2, true },
-
-    { "_Z12rsMatrixLoadP12rs_matrix4x4PKf", (void *)&SC_MatrixLoad_4x4_f, true },
-    { "_Z12rsMatrixLoadP12rs_matrix3x3PKf", (void *)&SC_MatrixLoad_3x3_f, true },
-    { "_Z12rsMatrixLoadP12rs_matrix2x2PKf", (void *)&SC_MatrixLoad_2x2_f, true },
-
-    { "_Z12rsMatrixLoadP12rs_matrix4x4PKS_", (void *)&SC_MatrixLoad_4x4_4x4, true },
-    { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix3x3", (void *)&SC_MatrixLoad_4x4_3x3, true },
-    { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix2x2", (void *)&SC_MatrixLoad_4x4_2x2, true },
-    { "_Z12rsMatrixLoadP12rs_matrix3x3PKS_", (void *)&SC_MatrixLoad_3x3_3x3, true },
-    { "_Z12rsMatrixLoadP12rs_matrix2x2PKS_", (void *)&SC_MatrixLoad_2x2_2x2, true },
-
-    { "_Z18rsMatrixLoadRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadRotate, true },
-    { "_Z17rsMatrixLoadScaleP12rs_matrix4x4fff", (void *)&SC_MatrixLoadScale, true },
-    { "_Z21rsMatrixLoadTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixLoadTranslate, true },
-    { "_Z14rsMatrixRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixRotate, true },
-    { "_Z13rsMatrixScaleP12rs_matrix4x4fff", (void *)&SC_MatrixScale, true },
-    { "_Z17rsMatrixTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixTranslate, true },
-
-    { "_Z20rsMatrixLoadMultiplyP12rs_matrix4x4PKS_S2_", (void *)&SC_MatrixLoadMultiply_4x4_4x4_4x4, true },
-    { "_Z16rsMatrixMultiplyP12rs_matrix4x4PKS_", (void *)&SC_MatrixMultiply_4x4_4x4, true },
-    { "_Z20rsMatrixLoadMultiplyP12rs_matrix3x3PKS_S2_", (void *)&SC_MatrixLoadMultiply_3x3_3x3_3x3, true },
-    { "_Z16rsMatrixMultiplyP12rs_matrix3x3PKS_", (void *)&SC_MatrixMultiply_3x3_3x3, true },
-    { "_Z20rsMatrixLoadMultiplyP12rs_matrix2x2PKS_S2_", (void *)&SC_MatrixLoadMultiply_2x2_2x2_2x2, true },
-    { "_Z16rsMatrixMultiplyP12rs_matrix2x2PKS_", (void *)&SC_MatrixMultiply_2x2_2x2, true },
-
-    { "_Z17rsMatrixLoadOrthoP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadOrtho, true },
-    { "_Z19rsMatrixLoadFrustumP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadFrustum, true },
-    { "_Z23rsMatrixLoadPerspectiveP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadPerspective, true },
-
-    { "_Z15rsMatrixInverseP12rs_matrix4x4", (void *)&SC_MatrixInverse_4x4, true },
-    { "_Z24rsMatrixInverseTransposeP12rs_matrix4x4", (void *)&SC_MatrixInverseTranspose_4x4, true },
-    { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_4x4, true },
-    { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_3x3, true },
-    { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_2x2, true },
-
-    // RS Math
-    { "_Z6rsRandi", (void *)&SC_randi, true },
-    { "_Z6rsRandii", (void *)&SC_randi2, true },
-    { "_Z6rsRandf", (void *)&SC_randf, true },
-    { "_Z6rsRandff", (void *)&SC_randf2, true },
-    { "_Z6rsFracf", (void *)&SC_frac, true },
-
-    // Atomics
-    { "_Z11rsAtomicIncPVi", (void *)&SC_AtomicInc, true },
-    { "_Z11rsAtomicIncPVj", (void *)&SC_AtomicInc, true },
-    { "_Z11rsAtomicDecPVi", (void *)&SC_AtomicDec, true },
-    { "_Z11rsAtomicDecPVj", (void *)&SC_AtomicDec, true },
-    { "_Z11rsAtomicAddPVii", (void *)&SC_AtomicAdd, true },
-    { "_Z11rsAtomicAddPVjj", (void *)&SC_AtomicAdd, true },
-    { "_Z11rsAtomicSubPVii", (void *)&SC_AtomicSub, true },
-    { "_Z11rsAtomicSubPVjj", (void *)&SC_AtomicSub, true },
-    { "_Z11rsAtomicAndPVii", (void *)&SC_AtomicAnd, true },
-    { "_Z11rsAtomicAndPVjj", (void *)&SC_AtomicAnd, true },
-    { "_Z10rsAtomicOrPVii", (void *)&SC_AtomicOr, true },
-    { "_Z10rsAtomicOrPVjj", (void *)&SC_AtomicOr, true },
-    { "_Z11rsAtomicXorPVii", (void *)&SC_AtomicXor, true },
-    { "_Z11rsAtomicXorPVjj", (void *)&SC_AtomicXor, true },
-    { "_Z11rsAtomicMinPVii", (void *)&SC_AtomicMin, true },
-    { "_Z11rsAtomicMinPVjj", (void *)&SC_AtomicUMin, true },
-    { "_Z11rsAtomicMaxPVii", (void *)&SC_AtomicMax, true },
-    { "_Z11rsAtomicMaxPVjj", (void *)&SC_AtomicUMax, true },
-    { "_Z11rsAtomicCasPViii", (void *)&SC_AtomicCas, true },
-    { "_Z11rsAtomicCasPVjjj", (void *)&SC_AtomicCas, true },
-
-    { NULL, NULL, false }
-};
-
-const RsdSymbolTable * rsdLookupSymbolMath(const char *sym) {
-    const RsdSymbolTable *syms = gSyms;
-
-    while (syms->mPtr) {
-        if (!strcmp(syms->mName, sym)) {
-            return syms;
-        }
-        syms++;
-    }
-    return NULL;
-}
-
diff --git a/libs/rs/driver/rsdRuntimeStubs.cpp b/libs/rs/driver/rsdRuntimeStubs.cpp
deleted file mode 100644
index aa9f159..0000000
--- a/libs/rs/driver/rsdRuntimeStubs.cpp
+++ /dev/null
@@ -1,720 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsScriptC.h"
-#include "rsMatrix4x4.h"
-#include "rsMatrix3x3.h"
-#include "rsMatrix2x2.h"
-#include "rsRuntime.h"
-
-#include "utils/Timers.h"
-#include "rsdCore.h"
-
-#include "rsdRuntime.h"
-#include "rsdPath.h"
-
-#include <time.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-#define GET_TLS()  ScriptTLSStruct * tls = \
-    (ScriptTLSStruct *)pthread_getspecific(rsdgThreadTLSKey); \
-    Context * rsc = tls->mContext; \
-    ScriptC * sc = (ScriptC *) tls->mScript
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Allocation
-//////////////////////////////////////////////////////////////////////////////
-
-
-static void SC_AllocationSyncAll2(Allocation *a, RsAllocationUsageType source) {
-    GET_TLS();
-    rsrAllocationSyncAll(rsc, sc, a, source);
-}
-
-static void SC_AllocationSyncAll(Allocation *a) {
-    GET_TLS();
-    rsrAllocationSyncAll(rsc, sc, a, RS_ALLOCATION_USAGE_SCRIPT);
-}
-
-static void SC_AllocationCopy1DRange(Allocation *dstAlloc,
-                                     uint32_t dstOff,
-                                     uint32_t dstMip,
-                                     uint32_t count,
-                                     Allocation *srcAlloc,
-                                     uint32_t srcOff, uint32_t srcMip) {
-    GET_TLS();
-    rsrAllocationCopy1DRange(rsc, dstAlloc, dstOff, dstMip, count,
-                             srcAlloc, srcOff, srcMip);
-}
-
-static void SC_AllocationCopy2DRange(Allocation *dstAlloc,
-                                     uint32_t dstXoff, uint32_t dstYoff,
-                                     uint32_t dstMip, uint32_t dstFace,
-                                     uint32_t width, uint32_t height,
-                                     Allocation *srcAlloc,
-                                     uint32_t srcXoff, uint32_t srcYoff,
-                                     uint32_t srcMip, uint32_t srcFace) {
-    GET_TLS();
-    rsrAllocationCopy2DRange(rsc, dstAlloc,
-                             dstXoff, dstYoff, dstMip, dstFace,
-                             width, height,
-                             srcAlloc,
-                             srcXoff, srcYoff, srcMip, srcFace);
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Context
-//////////////////////////////////////////////////////////////////////////////
-
-static void SC_BindTexture(ProgramFragment *pf, uint32_t slot, Allocation *a) {
-    GET_TLS();
-    rsrBindTexture(rsc, sc, pf, slot, a);
-}
-
-static void SC_BindVertexConstant(ProgramVertex *pv, uint32_t slot, Allocation *a) {
-    GET_TLS();
-    rsrBindConstant(rsc, sc, pv, slot, a);
-}
-
-static void SC_BindFragmentConstant(ProgramFragment *pf, uint32_t slot, Allocation *a) {
-    GET_TLS();
-    rsrBindConstant(rsc, sc, pf, slot, a);
-}
-
-static void SC_BindSampler(ProgramFragment *pf, uint32_t slot, Sampler *s) {
-    GET_TLS();
-    rsrBindSampler(rsc, sc, pf, slot, s);
-}
-
-static void SC_BindProgramStore(ProgramStore *ps) {
-    GET_TLS();
-    rsrBindProgramStore(rsc, sc, ps);
-}
-
-static void SC_BindProgramFragment(ProgramFragment *pf) {
-    GET_TLS();
-    rsrBindProgramFragment(rsc, sc, pf);
-}
-
-static void SC_BindProgramVertex(ProgramVertex *pv) {
-    GET_TLS();
-    rsrBindProgramVertex(rsc, sc, pv);
-}
-
-static void SC_BindProgramRaster(ProgramRaster *pr) {
-    GET_TLS();
-    rsrBindProgramRaster(rsc, sc, pr);
-}
-
-static void SC_BindFrameBufferObjectColorTarget(Allocation *a, uint32_t slot) {
-    GET_TLS();
-    rsrBindFrameBufferObjectColorTarget(rsc, sc, a, slot);
-}
-
-static void SC_BindFrameBufferObjectDepthTarget(Allocation *a) {
-    GET_TLS();
-    rsrBindFrameBufferObjectDepthTarget(rsc, sc, a);
-}
-
-static void SC_ClearFrameBufferObjectColorTarget(uint32_t slot) {
-    GET_TLS();
-    rsrClearFrameBufferObjectColorTarget(rsc, sc, slot);
-}
-
-static void SC_ClearFrameBufferObjectDepthTarget(Context *, Script *) {
-    GET_TLS();
-    rsrClearFrameBufferObjectDepthTarget(rsc, sc);
-}
-
-static void SC_ClearFrameBufferObjectTargets(Context *, Script *) {
-    GET_TLS();
-    rsrClearFrameBufferObjectTargets(rsc, sc);
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-// VP
-//////////////////////////////////////////////////////////////////////////////
-
-static void SC_VpLoadProjectionMatrix(const rsc_Matrix *m) {
-    GET_TLS();
-    rsrVpLoadProjectionMatrix(rsc, sc, m);
-}
-
-static void SC_VpLoadModelMatrix(const rsc_Matrix *m) {
-    GET_TLS();
-    rsrVpLoadModelMatrix(rsc, sc, m);
-}
-
-static void SC_VpLoadTextureMatrix(const rsc_Matrix *m) {
-    GET_TLS();
-    rsrVpLoadTextureMatrix(rsc, sc, m);
-}
-
-static void SC_PfConstantColor(ProgramFragment *pf, float r, float g, float b, float a) {
-    GET_TLS();
-    rsrPfConstantColor(rsc, sc, pf, r, g, b, a);
-}
-
-static void SC_VpGetProjectionMatrix(rsc_Matrix *m) {
-    GET_TLS();
-    rsrVpGetProjectionMatrix(rsc, sc, m);
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Drawing
-//////////////////////////////////////////////////////////////////////////////
-
-static void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
-                                 float x2, float y2, float z2, float u2, float v2,
-                                 float x3, float y3, float z3, float u3, float v3,
-                                 float x4, float y4, float z4, float u4, float v4) {
-    GET_TLS();
-    rsrDrawQuadTexCoords(rsc, sc,
-                         x1, y1, z1, u1, v1,
-                         x2, y2, z2, u2, v2,
-                         x3, y3, z3, u3, v3,
-                         x4, y4, z4, u4, v4);
-}
-
-static void SC_DrawQuad(float x1, float y1, float z1,
-                        float x2, float y2, float z2,
-                        float x3, float y3, float z3,
-                        float x4, float y4, float z4) {
-    GET_TLS();
-    rsrDrawQuad(rsc, sc, x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4);
-}
-
-static void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
-    GET_TLS();
-    rsrDrawSpriteScreenspace(rsc, sc, x, y, z, w, h);
-}
-
-static void SC_DrawRect(float x1, float y1, float x2, float y2, float z) {
-    GET_TLS();
-    rsrDrawRect(rsc, sc, x1, y1, x2, y2, z);
-}
-
-static void SC_DrawPath(Path *p) {
-    GET_TLS();
-    //rsrDrawPath(rsc, sc, p);
-    rsdPathDraw(rsc, p);
-}
-
-static void SC_DrawMesh(Mesh *m) {
-    GET_TLS();
-    rsrDrawMesh(rsc, sc, m);
-}
-
-static void SC_DrawMeshPrimitive(Mesh *m, uint32_t primIndex) {
-    GET_TLS();
-    rsrDrawMeshPrimitive(rsc, sc, m, primIndex);
-}
-
-static void SC_DrawMeshPrimitiveRange(Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) {
-    GET_TLS();
-    rsrDrawMeshPrimitiveRange(rsc, sc, m, primIndex, start, len);
-}
-
-static void SC_MeshComputeBoundingBox(Mesh *m,
-                               float *minX, float *minY, float *minZ,
-                               float *maxX, float *maxY, float *maxZ) {
-    GET_TLS();
-    rsrMeshComputeBoundingBox(rsc, sc, m, minX, minY, minZ, maxX, maxY, maxZ);
-}
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//////////////////////////////////////////////////////////////////////////////
-
-
-static void SC_Color(float r, float g, float b, float a) {
-    GET_TLS();
-    rsrColor(rsc, sc, r, g, b, a);
-}
-
-static void SC_Finish() {
-    GET_TLS();
-    rsdGLFinish(rsc);
-}
-
-static void SC_ClearColor(float r, float g, float b, float a) {
-    GET_TLS();
-    rsrPrepareClear(rsc, sc);
-    rsdGLClearColor(rsc, r, g, b, a);
-}
-
-static void SC_ClearDepth(float v) {
-    GET_TLS();
-    rsrPrepareClear(rsc, sc);
-    rsdGLClearDepth(rsc, v);
-}
-
-static uint32_t SC_GetWidth() {
-    GET_TLS();
-    return rsrGetWidth(rsc, sc);
-}
-
-static uint32_t SC_GetHeight() {
-    GET_TLS();
-    return rsrGetHeight(rsc, sc);
-}
-
-static void SC_DrawTextAlloc(Allocation *a, int x, int y) {
-    GET_TLS();
-    rsrDrawTextAlloc(rsc, sc, a, x, y);
-}
-
-static void SC_DrawText(const char *text, int x, int y) {
-    GET_TLS();
-    rsrDrawText(rsc, sc, text, x, y);
-}
-
-static void SC_MeasureTextAlloc(Allocation *a,
-                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
-    GET_TLS();
-    rsrMeasureTextAlloc(rsc, sc, a, left, right, top, bottom);
-}
-
-static void SC_MeasureText(const char *text,
-                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
-    GET_TLS();
-    rsrMeasureText(rsc, sc, text, left, right, top, bottom);
-}
-
-static void SC_BindFont(Font *f) {
-    GET_TLS();
-    rsrBindFont(rsc, sc, f);
-}
-
-static void SC_FontColor(float r, float g, float b, float a) {
-    GET_TLS();
-    rsrFontColor(rsc, sc, r, g, b, a);
-}
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//////////////////////////////////////////////////////////////////////////////
-
-static void SC_SetObject(ObjectBase **dst, ObjectBase * src) {
-    GET_TLS();
-    rsrSetObject(rsc, sc, dst, src);
-}
-
-static void SC_ClearObject(ObjectBase **dst) {
-    GET_TLS();
-    rsrClearObject(rsc, sc, dst);
-}
-
-static bool SC_IsObject(const ObjectBase *src) {
-    GET_TLS();
-    return rsrIsObject(rsc, sc, src);
-}
-
-
-
-
-static const Allocation * SC_GetAllocation(const void *ptr) {
-    GET_TLS();
-    return rsrGetAllocation(rsc, sc, ptr);
-}
-
-static void SC_ForEach_SAA(Script *target,
-                            Allocation *in,
-                            Allocation *out) {
-    GET_TLS();
-    rsrForEach(rsc, sc, target, in, out, NULL, 0, NULL);
-}
-
-static void SC_ForEach_SAAU(Script *target,
-                            Allocation *in,
-                            Allocation *out,
-                            const void *usr) {
-    GET_TLS();
-    rsrForEach(rsc, sc, target, in, out, usr, 0, NULL);
-}
-
-static void SC_ForEach_SAAUS(Script *target,
-                             Allocation *in,
-                             Allocation *out,
-                             const void *usr,
-                             const RsScriptCall *call) {
-    GET_TLS();
-    rsrForEach(rsc, sc, target, in, out, usr, 0, call);
-}
-
-static void SC_ForEach_SAAUL(Script *target,
-                             Allocation *in,
-                             Allocation *out,
-                             const void *usr,
-                             uint32_t usrLen) {
-    GET_TLS();
-    rsrForEach(rsc, sc, target, in, out, usr, usrLen, NULL);
-}
-
-static void SC_ForEach_SAAULS(Script *target,
-                              Allocation *in,
-                              Allocation *out,
-                              const void *usr,
-                              uint32_t usrLen,
-                              const RsScriptCall *call) {
-    GET_TLS();
-    rsrForEach(rsc, sc, target, in, out, usr, usrLen, call);
-}
-
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Time routines
-//////////////////////////////////////////////////////////////////////////////
-
-static float SC_GetDt() {
-    GET_TLS();
-    return rsrGetDt(rsc, sc);
-}
-
-time_t SC_Time(time_t *timer) {
-    GET_TLS();
-    return rsrTime(rsc, sc, timer);
-}
-
-tm* SC_LocalTime(tm *local, time_t *timer) {
-    GET_TLS();
-    return rsrLocalTime(rsc, sc, local, timer);
-}
-
-int64_t SC_UptimeMillis() {
-    GET_TLS();
-    return rsrUptimeMillis(rsc, sc);
-}
-
-int64_t SC_UptimeNanos() {
-    GET_TLS();
-    return rsrUptimeNanos(rsc, sc);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// Message routines
-//////////////////////////////////////////////////////////////////////////////
-
-static uint32_t SC_ToClient2(int cmdID, void *data, int len) {
-    GET_TLS();
-    return rsrToClient(rsc, sc, cmdID, data, len);
-}
-
-static uint32_t SC_ToClient(int cmdID) {
-    GET_TLS();
-    return rsrToClient(rsc, sc, cmdID, NULL, 0);
-}
-
-static uint32_t SC_ToClientBlocking2(int cmdID, void *data, int len) {
-    GET_TLS();
-    return rsrToClientBlocking(rsc, sc, cmdID, data, len);
-}
-
-static uint32_t SC_ToClientBlocking(int cmdID) {
-    GET_TLS();
-    return rsrToClientBlocking(rsc, sc, cmdID, NULL, 0);
-}
-
-int SC_divsi3(int a, int b) {
-    return a / b;
-}
-
-int SC_modsi3(int a, int b) {
-    return a % b;
-}
-
-unsigned int SC_udivsi3(unsigned int a, unsigned int b) {
-    return a / b;
-}
-
-unsigned int SC_umodsi3(unsigned int a, unsigned int b) {
-    return a % b;
-}
-
-static void SC_debugF(const char *s, float f) {
-    ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
-}
-static void SC_debugFv2(const char *s, float f1, float f2) {
-    ALOGD("%s {%f, %f}", s, f1, f2);
-}
-static void SC_debugFv3(const char *s, float f1, float f2, float f3) {
-    ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
-}
-static void SC_debugFv4(const char *s, float f1, float f2, float f3, float f4) {
-    ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
-}
-static void SC_debugD(const char *s, double d) {
-    ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
-}
-static void SC_debugFM4v4(const char *s, const float *f) {
-    ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
-    ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
-    ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
-    ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
-}
-static void SC_debugFM3v3(const char *s, const float *f) {
-    ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
-    ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
-    ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
-}
-static void SC_debugFM2v2(const char *s, const float *f) {
-    ALOGD("%s {%f, %f", s, f[0], f[2]);
-    ALOGD("%s  %f, %f}",s, f[1], f[3]);
-}
-
-static void SC_debugI32(const char *s, int32_t i) {
-    ALOGD("%s %i  0x%x", s, i, i);
-}
-static void SC_debugU32(const char *s, uint32_t i) {
-    ALOGD("%s %u  0x%x", s, i, i);
-}
-static void SC_debugLL64(const char *s, long long ll) {
-    ALOGD("%s %lld  0x%llx", s, ll, ll);
-}
-static void SC_debugULL64(const char *s, unsigned long long ll) {
-    ALOGD("%s %llu  0x%llx", s, ll, ll);
-}
-
-static void SC_debugP(const char *s, const void *p) {
-    ALOGD("%s %p", s, p);
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Stub implementation
-//////////////////////////////////////////////////////////////////////////////
-
-// llvm name mangling ref
-//  <builtin-type> ::= v  # void
-//                 ::= b  # bool
-//                 ::= c  # char
-//                 ::= a  # signed char
-//                 ::= h  # unsigned char
-//                 ::= s  # short
-//                 ::= t  # unsigned short
-//                 ::= i  # int
-//                 ::= j  # unsigned int
-//                 ::= l  # long
-//                 ::= m  # unsigned long
-//                 ::= x  # long long, __int64
-//                 ::= y  # unsigned long long, __int64
-//                 ::= f  # float
-//                 ::= d  # double
-
-static RsdSymbolTable gSyms[] = {
-    { "memset", (void *)&memset, true },
-    { "memcpy", (void *)&memcpy, true },
-
-    // Refcounting
-    { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP10rs_element", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP7rs_type", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP7rs_pathS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP7rs_path", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject7rs_path", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject17rs_program_raster", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject16rs_program_store", (void *)&SC_IsObject, true },
-
-    { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_SetObject, true },
-    { "_Z13rsClearObjectP7rs_font", (void *)&SC_ClearObject, true },
-    { "_Z10rsIsObject7rs_font", (void *)&SC_IsObject, true },
-
-    // Allocation ops
-    { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_AllocationSyncAll, true },
-    { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_AllocationSyncAll, false },
-    { "_Z20rsgAllocationSyncAll13rs_allocationj", (void *)&SC_AllocationSyncAll2, false },
-    { "_Z20rsgAllocationSyncAll13rs_allocation24rs_allocation_usage_type", (void *)&SC_AllocationSyncAll2, false },
-    { "_Z15rsGetAllocationPKv", (void *)&SC_GetAllocation, true },
-
-    { "_Z23rsAllocationCopy1DRange13rs_allocationjjjS_jj", (void *)&SC_AllocationCopy1DRange, false },
-    { "_Z23rsAllocationCopy2DRange13rs_allocationjjj26rs_allocation_cubemap_facejjS_jjjS0_", (void *)&SC_AllocationCopy2DRange, false },
-
-    // Messaging
-
-    { "_Z14rsSendToClienti", (void *)&SC_ToClient, false },
-    { "_Z14rsSendToClientiPKvj", (void *)&SC_ToClient2, false },
-    { "_Z22rsSendToClientBlockingi", (void *)&SC_ToClientBlocking, false },
-    { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_ToClientBlocking2, false },
-
-    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_BindProgramFragment, false },
-    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_BindProgramStore, false },
-    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_BindProgramVertex, false },
-    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_BindProgramRaster, false },
-    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_BindSampler, false },
-    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_BindTexture, false },
-    { "_Z15rsgBindConstant19rs_program_fragmentj13rs_allocation", (void *)&SC_BindFragmentConstant, false },
-    { "_Z15rsgBindConstant17rs_program_vertexj13rs_allocation", (void *)&SC_BindVertexConstant, false },
-
-    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadProjectionMatrix, false },
-    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadModelMatrix, false },
-    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadTextureMatrix, false },
-
-    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_VpGetProjectionMatrix, false },
-
-    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_PfConstantColor, false },
-
-    { "_Z11rsgGetWidthv", (void *)&SC_GetWidth, false },
-    { "_Z12rsgGetHeightv", (void *)&SC_GetHeight, false },
-
-
-    { "_Z11rsgDrawRectfffff", (void *)&SC_DrawRect, false },
-    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_DrawQuad, false },
-    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_DrawQuadTexCoords, false },
-    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_DrawSpriteScreenspace, false },
-
-    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_DrawMesh, false },
-    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_DrawMeshPrimitive, false },
-    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false },
-    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false },
-
-    { "_Z11rsgDrawPath7rs_path", (void *)&SC_DrawPath, false },
-
-    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false },
-    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false },
-
-    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false },
-    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false },
-    { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false },
-    { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false },
-
-    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false },
-    { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false },
-
-    { "_Z18rsgBindColorTarget13rs_allocationj", (void *)&SC_BindFrameBufferObjectColorTarget, false },
-    { "_Z18rsgBindDepthTarget13rs_allocation", (void *)&SC_BindFrameBufferObjectDepthTarget, false },
-    { "_Z19rsgClearColorTargetj", (void *)&SC_ClearFrameBufferObjectColorTarget, false },
-    { "_Z19rsgClearDepthTargetv", (void *)&SC_ClearFrameBufferObjectDepthTarget, false },
-    { "_Z24rsgClearAllRenderTargetsv", (void *)&SC_ClearFrameBufferObjectTargets, false },
-
-    { "_Z9rsForEach9rs_script13rs_allocationS0_", (void *)&SC_ForEach_SAA, false },
-    { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach_SAAU, false },
-    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvPK16rs_script_call_t", (void *)&SC_ForEach_SAAUS, false },
-    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvj", (void *)&SC_ForEach_SAAUL, false },
-    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvjPK16rs_script_call_t", (void *)&SC_ForEach_SAAULS, false },
-
-    // time
-    { "_Z6rsTimePi", (void *)&SC_Time, true },
-    { "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_LocalTime, true },
-    { "_Z14rsUptimeMillisv", (void*)&SC_UptimeMillis, true },
-    { "_Z13rsUptimeNanosv", (void*)&SC_UptimeNanos, true },
-    { "_Z7rsGetDtv", (void*)&SC_GetDt, false },
-
-    // misc
-    { "_Z5colorffff", (void *)&SC_Color, false },
-    { "_Z9rsgFinishv", (void *)&SC_Finish, false },
-
-    // Debug
-    { "_Z7rsDebugPKcf", (void *)&SC_debugF, true },
-    { "_Z7rsDebugPKcff", (void *)&SC_debugFv2, true },
-    { "_Z7rsDebugPKcfff", (void *)&SC_debugFv3, true },
-    { "_Z7rsDebugPKcffff", (void *)&SC_debugFv4, true },
-    { "_Z7rsDebugPKcd", (void *)&SC_debugD, true },
-    { "_Z7rsDebugPKcPK12rs_matrix4x4", (void *)&SC_debugFM4v4, true },
-    { "_Z7rsDebugPKcPK12rs_matrix3x3", (void *)&SC_debugFM3v3, true },
-    { "_Z7rsDebugPKcPK12rs_matrix2x2", (void *)&SC_debugFM2v2, true },
-    { "_Z7rsDebugPKci", (void *)&SC_debugI32, true },
-    { "_Z7rsDebugPKcj", (void *)&SC_debugU32, true },
-    // Both "long" and "unsigned long" need to be redirected to their
-    // 64-bit counterparts, since we have hacked Slang to use 64-bit
-    // for "long" on Arm (to be similar to Java).
-    { "_Z7rsDebugPKcl", (void *)&SC_debugLL64, true },
-    { "_Z7rsDebugPKcm", (void *)&SC_debugULL64, true },
-    { "_Z7rsDebugPKcx", (void *)&SC_debugLL64, true },
-    { "_Z7rsDebugPKcy", (void *)&SC_debugULL64, true },
-    { "_Z7rsDebugPKcPKv", (void *)&SC_debugP, true },
-
-    { NULL, NULL, false }
-};
-
-
-void* rsdLookupRuntimeStub(void* pContext, char const* name) {
-    ScriptC *s = (ScriptC *)pContext;
-    if (!strcmp(name, "__isThreadable")) {
-      return (void*) s->mHal.info.isThreadable;
-    } else if (!strcmp(name, "__clearThreadable")) {
-      s->mHal.info.isThreadable = false;
-      return NULL;
-    }
-
-    RsdSymbolTable *syms = gSyms;
-    const RsdSymbolTable *sym = rsdLookupSymbolMath(name);
-
-    if (!sym) {
-        while (syms->mPtr) {
-            if (!strcmp(syms->mName, name)) {
-                sym = syms;
-            }
-            syms++;
-        }
-    }
-
-    if (sym) {
-        s->mHal.info.isThreadable &= sym->threadable;
-        return sym->mPtr;
-    }
-    ALOGE("ScriptC sym lookup failed for %s", name);
-    return NULL;
-}
-
-
diff --git a/libs/rs/driver/rsdSampler.cpp b/libs/rs/driver/rsdSampler.cpp
deleted file mode 100644
index af48c61..0000000
--- a/libs/rs/driver/rsdSampler.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsdCore.h"
-#include "rsdSampler.h"
-
-#include "rsContext.h"
-#include "rsSampler.h"
-#include "rsProgramVertex.h"
-#include "rsProgramFragment.h"
-
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-
-
-using namespace android;
-using namespace android::renderscript;
-
-bool rsdSamplerInit(const android::renderscript::Context *,
-                    const android::renderscript::Sampler *) {
-    return true;
-}
-
-void rsdSamplerDestroy(const android::renderscript::Context *rsc,
-                       const android::renderscript::Sampler *s) {
-}
diff --git a/libs/rs/driver/rsdSampler.h b/libs/rs/driver/rsdSampler.h
deleted file mode 100644
index 3a64e9e..0000000
--- a/libs/rs/driver/rsdSampler.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RSD_SAMPLER_H
-#define RSD_SAMPLER_H
-
-#include <rs_hal.h>
-
-
-bool rsdSamplerInit(const android::renderscript::Context *rsc,
-                    const android::renderscript::Sampler *);
-
-void rsdSamplerDestroy(const android::renderscript::Context *rsc,
-                       const android::renderscript::Sampler *);
-
-
-#endif // RSD_SAMPLER_H
diff --git a/libs/rs/driver/rsdShader.cpp b/libs/rs/driver/rsdShader.cpp
deleted file mode 100644
index 6d9fa90..0000000
--- a/libs/rs/driver/rsdShader.cpp
+++ /dev/null
@@ -1,604 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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 <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#include <rs_hal.h>
-#include <rsContext.h>
-#include <rsProgram.h>
-
-#include "rsdCore.h"
-#include "rsdAllocation.h"
-#include "rsdShader.h"
-#include "rsdShaderCache.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-RsdShader::RsdShader(const Program *p, uint32_t type,
-                     const char * shaderText, size_t shaderLength,
-                     const char** textureNames, size_t textureNamesCount,
-                     const size_t *textureNamesLength) {
-    mUserShader.setTo(shaderText, shaderLength);
-    mRSProgram = p;
-    mType = type;
-    initMemberVars();
-    initAttribAndUniformArray();
-    init(textureNames, textureNamesCount, textureNamesLength);
-
-    for(size_t i=0; i < textureNamesCount; i++) {
-        mTextureNames.push(String8(textureNames[i], textureNamesLength[i]));
-    }
-}
-
-RsdShader::~RsdShader() {
-    for (uint32_t i = 0; i < mStateBasedShaders.size(); i ++) {
-        StateBasedKey *state = mStateBasedShaders.itemAt(i);
-        if (state->mShaderID) {
-            glDeleteShader(state->mShaderID);
-        }
-        delete state;
-    }
-
-    delete[] mAttribNames;
-    delete[] mUniformNames;
-    delete[] mUniformArraySizes;
-}
-
-void RsdShader::initMemberVars() {
-    mDirty = true;
-    mAttribCount = 0;
-    mUniformCount = 0;
-
-    mAttribNames = NULL;
-    mUniformNames = NULL;
-    mUniformArraySizes = NULL;
-    mCurrentState = NULL;
-
-    mIsValid = false;
-}
-
-RsdShader::StateBasedKey *RsdShader::getExistingState() {
-    RsdShader::StateBasedKey *returnKey = NULL;
-
-    for (uint32_t i = 0; i < mStateBasedShaders.size(); i ++) {
-        returnKey = mStateBasedShaders.itemAt(i);
-
-        for (uint32_t ct = 0; ct < mRSProgram->mHal.state.texturesCount; ct ++) {
-            uint32_t texType = 0;
-            if (mRSProgram->mHal.state.textureTargets[ct] == RS_TEXTURE_2D) {
-                Allocation *a = mRSProgram->mHal.state.textures[ct];
-                if (a && a->mHal.state.surfaceTextureID) {
-                    texType = GL_TEXTURE_EXTERNAL_OES;
-                } else {
-                    texType = GL_TEXTURE_2D;
-                }
-            } else {
-                texType = GL_TEXTURE_CUBE_MAP;
-            }
-            if (texType != returnKey->mTextureTargets[ct]) {
-                returnKey = NULL;
-                break;
-            }
-        }
-    }
-    return returnKey;
-}
-
-uint32_t RsdShader::getStateBasedShaderID(const Context *rsc) {
-    StateBasedKey *state = getExistingState();
-    if (state != NULL) {
-        mCurrentState = state;
-        return mCurrentState->mShaderID;
-    }
-    // We have not created a shader for this particular state yet
-    state = new StateBasedKey(mTextureCount);
-    mCurrentState = state;
-    mStateBasedShaders.add(state);
-    createShader();
-    loadShader(rsc);
-    return mCurrentState->mShaderID;
-}
-
-void RsdShader::init(const char** textureNames, size_t textureNamesCount,
-                     const size_t *textureNamesLength) {
-    uint32_t attribCount = 0;
-    uint32_t uniformCount = 0;
-    for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) {
-        initAddUserElement(mRSProgram->mHal.state.inputElements[ct], mAttribNames,
-                           NULL, &attribCount, RS_SHADER_ATTR);
-    }
-    for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) {
-        initAddUserElement(mRSProgram->mHal.state.constantTypes[ct]->getElement(),
-                           mUniformNames, mUniformArraySizes, &uniformCount, RS_SHADER_UNI);
-    }
-
-    mTextureUniformIndexStart = uniformCount;
-    for (uint32_t ct=0; ct < mRSProgram->mHal.state.texturesCount; ct++) {
-        mUniformNames[uniformCount].setTo("UNI_");
-        mUniformNames[uniformCount].append(textureNames[ct], textureNamesLength[ct]);
-        mUniformArraySizes[uniformCount] = 1;
-        uniformCount++;
-    }
-}
-
-String8 RsdShader::getGLSLInputString() const {
-    String8 s;
-    for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) {
-        const Element *e = mRSProgram->mHal.state.inputElements[ct];
-        for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) {
-            const Element *f = e->mHal.state.fields[field];
-
-            // Cannot be complex
-            rsAssert(!f->mHal.state.fieldsCount);
-            switch (f->mHal.state.vectorSize) {
-            case 1: s.append("attribute float ATTRIB_"); break;
-            case 2: s.append("attribute vec2 ATTRIB_"); break;
-            case 3: s.append("attribute vec3 ATTRIB_"); break;
-            case 4: s.append("attribute vec4 ATTRIB_"); break;
-            default:
-                rsAssert(0);
-            }
-
-            s.append(e->mHal.state.fieldNames[field]);
-            s.append(";\n");
-        }
-    }
-    return s;
-}
-
-void RsdShader::appendAttributes() {
-    for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) {
-        const Element *e = mRSProgram->mHal.state.inputElements[ct];
-        for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) {
-            const Element *f = e->mHal.state.fields[field];
-            const char *fn = e->mHal.state.fieldNames[field];
-
-            // Cannot be complex
-            rsAssert(!f->mHal.state.fieldsCount);
-            switch (f->mHal.state.vectorSize) {
-            case 1: mShader.append("attribute float ATTRIB_"); break;
-            case 2: mShader.append("attribute vec2 ATTRIB_"); break;
-            case 3: mShader.append("attribute vec3 ATTRIB_"); break;
-            case 4: mShader.append("attribute vec4 ATTRIB_"); break;
-            default:
-                rsAssert(0);
-            }
-
-            mShader.append(fn);
-            mShader.append(";\n");
-        }
-    }
-}
-
-void RsdShader::appendTextures() {
-
-    // TODO: this does not yet handle cases where the texture changes between IO
-    // input and local
-    bool appendUsing = true;
-    for (uint32_t ct = 0; ct < mRSProgram->mHal.state.texturesCount; ct ++) {
-        if (mRSProgram->mHal.state.textureTargets[ct] == RS_TEXTURE_2D) {
-            Allocation *a = mRSProgram->mHal.state.textures[ct];
-            if (a && a->mHal.state.surfaceTextureID) {
-                if(appendUsing) {
-                    mShader.append("#extension GL_OES_EGL_image_external : require\n");
-                    appendUsing = false;
-                }
-                mShader.append("uniform samplerExternalOES UNI_");
-                mCurrentState->mTextureTargets[ct] = GL_TEXTURE_EXTERNAL_OES;
-            } else {
-                mShader.append("uniform sampler2D UNI_");
-                mCurrentState->mTextureTargets[ct] = GL_TEXTURE_2D;
-            }
-        } else {
-            mShader.append("uniform samplerCube UNI_");
-            mCurrentState->mTextureTargets[ct] = GL_TEXTURE_CUBE_MAP;
-        }
-
-        mShader.append(mTextureNames[ct]);
-        mShader.append(";\n");
-    }
-}
-
-bool RsdShader::createShader() {
-    mShader.clear();
-    if (mType == GL_FRAGMENT_SHADER) {
-        mShader.append("precision mediump float;\n");
-    }
-    appendUserConstants();
-    appendAttributes();
-    appendTextures();
-    mShader.append(mUserShader);
-
-    return true;
-}
-
-bool RsdShader::loadShader(const Context *rsc) {
-    mCurrentState->mShaderID = glCreateShader(mType);
-    rsAssert(mCurrentState->mShaderID);
-
-    if(!mShader.length()) {
-        createShader();
-    }
-
-    if (rsc->props.mLogShaders) {
-        ALOGV("Loading shader type %x, ID %i", mType, mCurrentState->mShaderID);
-        ALOGV("%s", mShader.string());
-    }
-
-    if (mCurrentState->mShaderID) {
-        const char * ss = mShader.string();
-        RSD_CALL_GL(glShaderSource, mCurrentState->mShaderID, 1, &ss, NULL);
-        RSD_CALL_GL(glCompileShader, mCurrentState->mShaderID);
-
-        GLint compiled = 0;
-        RSD_CALL_GL(glGetShaderiv, mCurrentState->mShaderID, GL_COMPILE_STATUS, &compiled);
-        if (!compiled) {
-            GLint infoLen = 0;
-            RSD_CALL_GL(glGetShaderiv, mCurrentState->mShaderID, GL_INFO_LOG_LENGTH, &infoLen);
-            if (infoLen) {
-                char* buf = (char*) malloc(infoLen);
-                if (buf) {
-                    RSD_CALL_GL(glGetShaderInfoLog, mCurrentState->mShaderID, infoLen, NULL, buf);
-                    rsc->setError(RS_ERROR_FATAL_PROGRAM_LINK, buf);
-                    free(buf);
-                }
-                RSD_CALL_GL(glDeleteShader, mCurrentState->mShaderID);
-                mCurrentState->mShaderID = 0;
-                return false;
-            }
-        }
-    }
-
-    if (rsc->props.mLogShaders) {
-        ALOGV("--Shader load result %x ", glGetError());
-    }
-    mIsValid = true;
-    return true;
-}
-
-void RsdShader::appendUserConstants() {
-    for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) {
-        const Element *e = mRSProgram->mHal.state.constantTypes[ct]->getElement();
-        for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) {
-            const Element *f = e->mHal.state.fields[field];
-            const char *fn = e->mHal.state.fieldNames[field];
-
-            // Cannot be complex
-            rsAssert(!f->mHal.state.fieldsCount);
-            if (f->mHal.state.dataType == RS_TYPE_MATRIX_4X4) {
-                mShader.append("uniform mat4 UNI_");
-            } else if (f->mHal.state.dataType == RS_TYPE_MATRIX_3X3) {
-                mShader.append("uniform mat3 UNI_");
-            } else if (f->mHal.state.dataType == RS_TYPE_MATRIX_2X2) {
-                mShader.append("uniform mat2 UNI_");
-            } else {
-                switch (f->mHal.state.vectorSize) {
-                case 1: mShader.append("uniform float UNI_"); break;
-                case 2: mShader.append("uniform vec2 UNI_"); break;
-                case 3: mShader.append("uniform vec3 UNI_"); break;
-                case 4: mShader.append("uniform vec4 UNI_"); break;
-                default:
-                    rsAssert(0);
-                }
-            }
-
-            mShader.append(fn);
-            if (e->mHal.state.fieldArraySizes[field] > 1) {
-                mShader.appendFormat("[%d]", e->mHal.state.fieldArraySizes[field]);
-            }
-            mShader.append(";\n");
-        }
-    }
-}
-
-void RsdShader::logUniform(const Element *field, const float *fd, uint32_t arraySize ) {
-    RsDataType dataType = field->mHal.state.dataType;
-    uint32_t elementSize = field->mHal.state.elementSizeBytes / sizeof(float);
-    for (uint32_t i = 0; i < arraySize; i ++) {
-        if (arraySize > 1) {
-            ALOGV("Array Element [%u]", i);
-        }
-        if (dataType == RS_TYPE_MATRIX_4X4) {
-            ALOGV("Matrix4x4");
-            ALOGV("{%f, %f, %f, %f",  fd[0], fd[4], fd[8], fd[12]);
-            ALOGV(" %f, %f, %f, %f",  fd[1], fd[5], fd[9], fd[13]);
-            ALOGV(" %f, %f, %f, %f",  fd[2], fd[6], fd[10], fd[14]);
-            ALOGV(" %f, %f, %f, %f}", fd[3], fd[7], fd[11], fd[15]);
-        } else if (dataType == RS_TYPE_MATRIX_3X3) {
-            ALOGV("Matrix3x3");
-            ALOGV("{%f, %f, %f",  fd[0], fd[3], fd[6]);
-            ALOGV(" %f, %f, %f",  fd[1], fd[4], fd[7]);
-            ALOGV(" %f, %f, %f}", fd[2], fd[5], fd[8]);
-        } else if (dataType == RS_TYPE_MATRIX_2X2) {
-            ALOGV("Matrix2x2");
-            ALOGV("{%f, %f",  fd[0], fd[2]);
-            ALOGV(" %f, %f}", fd[1], fd[3]);
-        } else {
-            switch (field->mHal.state.vectorSize) {
-            case 1:
-                ALOGV("Uniform 1 = %f", fd[0]);
-                break;
-            case 2:
-                ALOGV("Uniform 2 = %f %f", fd[0], fd[1]);
-                break;
-            case 3:
-                ALOGV("Uniform 3 = %f %f %f", fd[0], fd[1], fd[2]);
-                break;
-            case 4:
-                ALOGV("Uniform 4 = %f %f %f %f", fd[0], fd[1], fd[2], fd[3]);
-                break;
-            default:
-                rsAssert(0);
-            }
-        }
-        ALOGE("Element size %u data=%p", elementSize, fd);
-        fd += elementSize;
-        ALOGE("New data=%p", fd);
-    }
-}
-
-void RsdShader::setUniform(const Context *rsc, const Element *field, const float *fd,
-                         int32_t slot, uint32_t arraySize ) {
-    RsDataType dataType = field->mHal.state.dataType;
-    if (dataType == RS_TYPE_MATRIX_4X4) {
-        RSD_CALL_GL(glUniformMatrix4fv, slot, arraySize, GL_FALSE, fd);
-    } else if (dataType == RS_TYPE_MATRIX_3X3) {
-        RSD_CALL_GL(glUniformMatrix3fv, slot, arraySize, GL_FALSE, fd);
-    } else if (dataType == RS_TYPE_MATRIX_2X2) {
-        RSD_CALL_GL(glUniformMatrix2fv, slot, arraySize, GL_FALSE, fd);
-    } else {
-        switch (field->mHal.state.vectorSize) {
-        case 1:
-            RSD_CALL_GL(glUniform1fv, slot, arraySize, fd);
-            break;
-        case 2:
-            RSD_CALL_GL(glUniform2fv, slot, arraySize, fd);
-            break;
-        case 3:
-            RSD_CALL_GL(glUniform3fv, slot, arraySize, fd);
-            break;
-        case 4:
-            RSD_CALL_GL(glUniform4fv, slot, arraySize, fd);
-            break;
-        default:
-            rsAssert(0);
-        }
-    }
-}
-
-void RsdShader::setupSampler(const Context *rsc, const Sampler *s, const Allocation *tex) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    GLenum trans[] = {
-        GL_NEAREST, //RS_SAMPLER_NEAREST,
-        GL_LINEAR, //RS_SAMPLER_LINEAR,
-        GL_LINEAR_MIPMAP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
-        GL_REPEAT, //RS_SAMPLER_WRAP,
-        GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
-        GL_LINEAR_MIPMAP_NEAREST, //RS_SAMPLER_LINEAR_MIP_NEAREST
-    };
-
-    GLenum transNP[] = {
-        GL_NEAREST, //RS_SAMPLER_NEAREST,
-        GL_LINEAR, //RS_SAMPLER_LINEAR,
-        GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
-        GL_CLAMP_TO_EDGE, //RS_SAMPLER_WRAP,
-        GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
-        GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_NEAREST,
-    };
-
-    // This tells us the correct texture type
-    DrvAllocation *drvTex = (DrvAllocation *)tex->mHal.drv;
-    const GLenum target = drvTex->glTarget;
-
-    if (!dc->gl.gl.OES_texture_npot && tex->getType()->getIsNp2()) {
-        if (tex->getHasGraphicsMipmaps() &&
-            (dc->gl.gl.NV_texture_npot_2D_mipmap || dc->gl.gl.IMG_texture_npot)) {
-            if (dc->gl.gl.NV_texture_npot_2D_mipmap) {
-                RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
-                            trans[s->mHal.state.minFilter]);
-            } else {
-                switch (trans[s->mHal.state.minFilter]) {
-                case GL_LINEAR_MIPMAP_LINEAR:
-                    RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
-                                GL_LINEAR_MIPMAP_NEAREST);
-                    break;
-                default:
-                    RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
-                                trans[s->mHal.state.minFilter]);
-                    break;
-                }
-            }
-        } else {
-            RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
-                        transNP[s->mHal.state.minFilter]);
-        }
-        RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MAG_FILTER,
-                    transNP[s->mHal.state.magFilter]);
-        RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_S, transNP[s->mHal.state.wrapS]);
-        RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_T, transNP[s->mHal.state.wrapT]);
-    } else {
-        if (tex->getHasGraphicsMipmaps()) {
-            RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
-                        trans[s->mHal.state.minFilter]);
-        } else {
-            RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MIN_FILTER,
-                        transNP[s->mHal.state.minFilter]);
-        }
-        RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_MAG_FILTER, trans[s->mHal.state.magFilter]);
-        RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_S, trans[s->mHal.state.wrapS]);
-        RSD_CALL_GL(glTexParameteri, target, GL_TEXTURE_WRAP_T, trans[s->mHal.state.wrapT]);
-    }
-
-    float anisoValue = rsMin(dc->gl.gl.EXT_texture_max_aniso, s->mHal.state.aniso);
-    if (dc->gl.gl.EXT_texture_max_aniso > 1.0f) {
-        RSD_CALL_GL(glTexParameterf, target, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoValue);
-    }
-
-    rsdGLCheckError(rsc, "Sampler::setup tex env");
-}
-
-void RsdShader::setupTextures(const Context *rsc, RsdShaderCache *sc) {
-    if (mRSProgram->mHal.state.texturesCount == 0) {
-        return;
-    }
-
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-
-    uint32_t numTexturesToBind = mRSProgram->mHal.state.texturesCount;
-    uint32_t numTexturesAvailable = dc->gl.gl.maxFragmentTextureImageUnits;
-    if (numTexturesToBind >= numTexturesAvailable) {
-        ALOGE("Attempting to bind %u textures on shader id %u, but only %u are available",
-             mRSProgram->mHal.state.texturesCount, (uint32_t)this, numTexturesAvailable);
-        rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind more textuers than available");
-        numTexturesToBind = numTexturesAvailable;
-    }
-
-    for (uint32_t ct=0; ct < numTexturesToBind; ct++) {
-        RSD_CALL_GL(glActiveTexture, GL_TEXTURE0 + ct);
-        RSD_CALL_GL(glUniform1i, sc->fragUniformSlot(mTextureUniformIndexStart + ct), ct);
-
-        if (!mRSProgram->mHal.state.textures[ct]) {
-            // if nothing is bound, reset to default GL texture
-            RSD_CALL_GL(glBindTexture, mCurrentState->mTextureTargets[ct], 0);
-            continue;
-        }
-
-        DrvAllocation *drvTex = (DrvAllocation *)mRSProgram->mHal.state.textures[ct]->mHal.drv;
-        if (drvTex->glTarget != GL_TEXTURE_2D &&
-            drvTex->glTarget != GL_TEXTURE_CUBE_MAP &&
-            drvTex->glTarget != GL_TEXTURE_EXTERNAL_OES) {
-            ALOGE("Attempting to bind unknown texture to shader id %u, texture unit %u",
-                  (uint)this, ct);
-            rsc->setError(RS_ERROR_BAD_SHADER, "Non-texture allocation bound to a shader");
-        }
-        RSD_CALL_GL(glBindTexture, drvTex->glTarget, drvTex->textureID);
-        rsdGLCheckError(rsc, "ProgramFragment::setup tex bind");
-        if (mRSProgram->mHal.state.samplers[ct]) {
-            setupSampler(rsc, mRSProgram->mHal.state.samplers[ct],
-                         mRSProgram->mHal.state.textures[ct]);
-        } else {
-            RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-            RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-            RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-            RSD_CALL_GL(glTexParameteri, drvTex->glTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-            rsdGLCheckError(rsc, "ProgramFragment::setup tex env");
-        }
-        rsdGLCheckError(rsc, "ProgramFragment::setup uniforms");
-    }
-
-    RSD_CALL_GL(glActiveTexture, GL_TEXTURE0);
-    mDirty = false;
-    rsdGLCheckError(rsc, "ProgramFragment::setup");
-}
-
-void RsdShader::setupUserConstants(const Context *rsc, RsdShaderCache *sc, bool isFragment) {
-    uint32_t uidx = 0;
-    for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) {
-        Allocation *alloc = mRSProgram->mHal.state.constants[ct];
-        if (!alloc) {
-            ALOGE("Attempting to set constants on shader id %u, but alloc at slot %u is not set",
-                 (uint32_t)this, ct);
-            rsc->setError(RS_ERROR_BAD_SHADER, "No constant allocation bound");
-            continue;
-        }
-
-        const uint8_t *data = static_cast<const uint8_t *>(alloc->getPtr());
-        const Element *e = mRSProgram->mHal.state.constantTypes[ct]->getElement();
-        for (uint32_t field=0; field < e->mHal.state.fieldsCount; field++) {
-            const Element *f = e->mHal.state.fields[field];
-            const char *fieldName = e->mHal.state.fieldNames[field];
-
-            uint32_t offset = e->mHal.state.fieldOffsetBytes[field];
-            const float *fd = reinterpret_cast<const float *>(&data[offset]);
-
-            int32_t slot = -1;
-            uint32_t arraySize = 1;
-            if (!isFragment) {
-                slot = sc->vtxUniformSlot(uidx);
-                arraySize = sc->vtxUniformSize(uidx);
-            } else {
-                slot = sc->fragUniformSlot(uidx);
-                arraySize = sc->fragUniformSize(uidx);
-            }
-            if (rsc->props.mLogShadersUniforms) {
-                ALOGV("Uniform  slot=%i, offset=%i, constant=%i, field=%i, uidx=%i, name=%s",
-                     slot, offset, ct, field, uidx, fieldName);
-            }
-            uidx ++;
-            if (slot < 0) {
-                continue;
-            }
-
-            if (rsc->props.mLogShadersUniforms) {
-                logUniform(f, fd, arraySize);
-            }
-            setUniform(rsc, f, fd, slot, arraySize);
-        }
-    }
-}
-
-void RsdShader::setup(const android::renderscript::Context *rsc, RsdShaderCache *sc) {
-
-    setupUserConstants(rsc, sc, mType == GL_FRAGMENT_SHADER);
-    setupTextures(rsc, sc);
-}
-
-void RsdShader::initAttribAndUniformArray() {
-    mAttribCount = 0;
-    for (uint32_t ct=0; ct < mRSProgram->mHal.state.inputElementsCount; ct++) {
-        const Element *elem = mRSProgram->mHal.state.inputElements[ct];
-        mAttribCount += elem->mHal.state.fieldsCount;
-    }
-
-    mUniformCount = 0;
-    for (uint32_t ct=0; ct < mRSProgram->mHal.state.constantsCount; ct++) {
-        const Element *elem = mRSProgram->mHal.state.constantTypes[ct]->getElement();
-        mUniformCount += elem->mHal.state.fieldsCount;
-    }
-    mUniformCount += mRSProgram->mHal.state.texturesCount;
-
-    if (mAttribCount) {
-        mAttribNames = new String8[mAttribCount];
-    }
-    if (mUniformCount) {
-        mUniformNames = new String8[mUniformCount];
-        mUniformArraySizes = new uint32_t[mUniformCount];
-    }
-
-    mTextureCount = mRSProgram->mHal.state.texturesCount;
-}
-
-void RsdShader::initAddUserElement(const Element *e, String8 *names, uint32_t *arrayLengths,
-                                   uint32_t *count, const char *prefix) {
-    rsAssert(e->mHal.state.fieldsCount);
-    for (uint32_t ct=0; ct < e->mHal.state.fieldsCount; ct++) {
-        const Element *ce = e->mHal.state.fields[ct];
-        if (ce->mHal.state.fieldsCount) {
-            initAddUserElement(ce, names, arrayLengths, count, prefix);
-        } else {
-            String8 tmp(prefix);
-            tmp.append(e->mHal.state.fieldNames[ct]);
-            names[*count].setTo(tmp.string());
-            if (arrayLengths) {
-                arrayLengths[*count] = e->mHal.state.fieldArraySizes[ct];
-            }
-            (*count)++;
-        }
-    }
-}
diff --git a/libs/rs/driver/rsdShader.h b/libs/rs/driver/rsdShader.h
deleted file mode 100644
index 2680b3e..0000000
--- a/libs/rs/driver/rsdShader.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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.
- */
-
-#ifndef ANDROID_RSD_SHADER_H
-#define ANDROID_RSD_SHADER_H
-
-#include <utils/String8.h>
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class Element;
-class Context;
-class Program;
-
-}
-}
-
-class RsdShaderCache;
-
-#define RS_SHADER_ATTR "ATTRIB_"
-#define RS_SHADER_UNI "UNI_"
-
-class RsdShader {
-public:
-
-    RsdShader(const android::renderscript::Program *p, uint32_t type,
-              const char * shaderText, uint32_t shaderLength,
-              const char** textureNames, size_t textureNamesCount,
-              const size_t *textureNamesLength);
-    virtual ~RsdShader();
-
-    uint32_t getStateBasedShaderID(const android::renderscript::Context *);
-
-    // Add ability to get all ID's to clean up the cached program objects
-    uint32_t getStateBasedIDCount() const { return mStateBasedShaders.size(); }
-    uint32_t getStateBasedID(uint32_t index) const {
-        return mStateBasedShaders.itemAt(index)->mShaderID;
-    }
-
-    uint32_t getAttribCount() const {return mAttribCount;}
-    uint32_t getUniformCount() const {return mUniformCount;}
-    const android::String8 & getAttribName(uint32_t i) const {return mAttribNames[i];}
-    const android::String8 & getUniformName(uint32_t i) const {return mUniformNames[i];}
-    uint32_t getUniformArraySize(uint32_t i) const {return mUniformArraySizes[i];}
-
-    android::String8 getGLSLInputString() const;
-
-    bool isValid() const {return mIsValid;}
-    void forceDirty() const {mDirty = true;}
-
-    bool loadShader(const android::renderscript::Context *);
-    void setup(const android::renderscript::Context *, RsdShaderCache *sc);
-
-protected:
-
-    class StateBasedKey {
-    public:
-        StateBasedKey(uint32_t texCount) : mShaderID(0) {
-            mTextureTargets = new uint32_t[texCount];
-        }
-        ~StateBasedKey() {
-            delete[] mTextureTargets;
-        }
-        uint32_t mShaderID;
-        uint32_t *mTextureTargets;
-    };
-
-    bool createShader();
-    StateBasedKey *getExistingState();
-
-    const android::renderscript::Program *mRSProgram;
-    bool mIsValid;
-
-    // Applies to vertex and fragment shaders only
-    void appendUserConstants();
-    void setupUserConstants(const android::renderscript::Context *rsc,
-                            RsdShaderCache *sc, bool isFragment);
-    void initAddUserElement(const android::renderscript::Element *e,
-                            android::String8 *names, uint32_t *arrayLengths,
-                            uint32_t *count, const char *prefix);
-    void setupTextures(const android::renderscript::Context *rsc, RsdShaderCache *sc);
-    void setupSampler(const android::renderscript::Context *rsc,
-                      const android::renderscript::Sampler *s,
-                      const android::renderscript::Allocation *tex);
-
-    void appendAttributes();
-    void appendTextures();
-
-    void initAttribAndUniformArray();
-
-    mutable bool mDirty;
-    android::String8 mShader;
-    android::String8 mUserShader;
-    uint32_t mType;
-
-    uint32_t mTextureCount;
-    StateBasedKey *mCurrentState;
-    uint32_t mAttribCount;
-    uint32_t mUniformCount;
-    android::String8 *mAttribNames;
-    android::String8 *mUniformNames;
-    uint32_t *mUniformArraySizes;
-
-    android::Vector<android::String8> mTextureNames;
-
-    android::Vector<StateBasedKey*> mStateBasedShaders;
-
-    int32_t mTextureUniformIndexStart;
-
-    void logUniform(const android::renderscript::Element *field,
-                    const float *fd, uint32_t arraySize);
-    void setUniform(const android::renderscript::Context *rsc,
-                    const android::renderscript::Element *field,
-                    const float *fd, int32_t slot, uint32_t arraySize );
-    void initMemberVars();
-    void init(const char** textureNames, size_t textureNamesCount,
-              const size_t *textureNamesLength);
-};
-
-#endif //ANDROID_RSD_SHADER_H
-
-
-
-
diff --git a/libs/rs/driver/rsdShaderCache.cpp b/libs/rs/driver/rsdShaderCache.cpp
deleted file mode 100644
index 69b43fc..0000000
--- a/libs/rs/driver/rsdShaderCache.cpp
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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 <rs_hal.h>
-#include <rsContext.h>
-
-#include "rsdShader.h"
-#include "rsdShaderCache.h"
-#include "rsdGL.h"
-
-#include <GLES/gl.h>
-#include <GLES2/gl2.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-
-RsdShaderCache::RsdShaderCache() {
-    mEntries.setCapacity(16);
-    mVertexDirty = true;
-    mFragmentDirty = true;
-}
-
-RsdShaderCache::~RsdShaderCache() {
-    cleanupAll();
-}
-
-void RsdShaderCache::updateUniformArrayData(const Context *rsc, RsdShader *prog, uint32_t linkedID,
-                                         UniformData *data, const char* logTag,
-                                         UniformQueryData **uniformList, uint32_t uniListSize) {
-
-    for (uint32_t ct=0; ct < prog->getUniformCount(); ct++) {
-        if (data[ct].slot >= 0 && data[ct].arraySize > 1) {
-            //Iterate over the list of active GL uniforms and find highest array index
-            for (uint32_t ui = 0; ui < uniListSize; ui ++) {
-                if (prog->getUniformName(ct) == uniformList[ui]->name) {
-                    data[ct].arraySize = (uint32_t)uniformList[ui]->arraySize;
-                    break;
-                }
-            }
-        }
-
-        if (rsc->props.mLogShaders) {
-             ALOGV("%s U, %s = %d, arraySize = %d\n", logTag,
-                  prog->getUniformName(ct).string(), data[ct].slot, data[ct].arraySize);
-        }
-    }
-}
-
-void RsdShaderCache::populateUniformData(RsdShader *prog, uint32_t linkedID, UniformData *data) {
-    for (uint32_t ct=0; ct < prog->getUniformCount(); ct++) {
-       data[ct].slot = glGetUniformLocation(linkedID, prog->getUniformName(ct));
-       data[ct].arraySize = prog->getUniformArraySize(ct);
-    }
-}
-
-bool RsdShaderCache::hasArrayUniforms(RsdShader *vtx, RsdShader *frag) {
-    UniformData *data = mCurrent->vtxUniforms;
-    for (uint32_t ct=0; ct < vtx->getUniformCount(); ct++) {
-        if (data[ct].slot >= 0 && data[ct].arraySize > 1) {
-            return true;
-        }
-    }
-    data = mCurrent->fragUniforms;
-    for (uint32_t ct=0; ct < frag->getUniformCount(); ct++) {
-        if (data[ct].slot >= 0 && data[ct].arraySize > 1) {
-            return true;
-        }
-    }
-    return false;
-}
-
-bool RsdShaderCache::setup(const Context *rsc) {
-    if (!mVertexDirty && !mFragmentDirty) {
-        return true;
-    }
-
-    if (!link(rsc)) {
-        return false;
-    }
-
-    if (mFragmentDirty) {
-        mFragment->setup(rsc, this);
-        mFragmentDirty = false;
-    }
-    if (mVertexDirty) {
-        mVertex->setup(rsc, this);
-        mVertexDirty = false;
-    }
-
-    return true;
-}
-
-bool RsdShaderCache::link(const Context *rsc) {
-
-    RsdShader *vtx = mVertex;
-    RsdShader *frag = mFragment;
-
-    uint32_t vID = vtx->getStateBasedShaderID(rsc);
-    uint32_t fID = frag->getStateBasedShaderID(rsc);
-
-    // Don't try to cache if shaders failed to load
-    if (!vID || !fID) {
-        return false;
-    }
-    uint32_t entryCount = mEntries.size();
-    for (uint32_t ct = 0; ct < entryCount; ct ++) {
-        if ((mEntries[ct]->vtx == vID) && (mEntries[ct]->frag == fID)) {
-
-            //ALOGV("SC using program %i", mEntries[ct]->program);
-            glUseProgram(mEntries[ct]->program);
-            mCurrent = mEntries[ct];
-            //ALOGV("RsdShaderCache hit, using %i", ct);
-            rsdGLCheckError(rsc, "RsdShaderCache::link (hit)");
-            return true;
-        }
-    }
-
-    ProgramEntry *e = new ProgramEntry(vtx->getAttribCount(),
-                                       vtx->getUniformCount(),
-                                       frag->getUniformCount());
-    mEntries.push(e);
-    mCurrent = e;
-    e->vtx = vID;
-    e->frag = fID;
-    e->program = glCreateProgram();
-    if (e->program) {
-        GLuint pgm = e->program;
-        glAttachShader(pgm, vID);
-        //ALOGE("e1 %x", glGetError());
-        glAttachShader(pgm, fID);
-
-        glBindAttribLocation(pgm, 0, "ATTRIB_position");
-        glBindAttribLocation(pgm, 1, "ATTRIB_color");
-        glBindAttribLocation(pgm, 2, "ATTRIB_normal");
-        glBindAttribLocation(pgm, 3, "ATTRIB_texture0");
-
-        //ALOGE("e2 %x", glGetError());
-        glLinkProgram(pgm);
-        //ALOGE("e3 %x", glGetError());
-        GLint linkStatus = GL_FALSE;
-        glGetProgramiv(pgm, GL_LINK_STATUS, &linkStatus);
-        if (linkStatus != GL_TRUE) {
-            GLint bufLength = 0;
-            glGetProgramiv(pgm, GL_INFO_LOG_LENGTH, &bufLength);
-            if (bufLength) {
-                char* buf = (char*) malloc(bufLength);
-                if (buf) {
-                    glGetProgramInfoLog(pgm, bufLength, NULL, buf);
-                    rsc->setError(RS_ERROR_FATAL_PROGRAM_LINK, buf);
-                    free(buf);
-                }
-            }
-            glDeleteProgram(pgm);
-            return false;
-        }
-
-        for (uint32_t ct=0; ct < e->vtxAttrCount; ct++) {
-            e->vtxAttrs[ct].slot = glGetAttribLocation(pgm, vtx->getAttribName(ct));
-            e->vtxAttrs[ct].name = vtx->getAttribName(ct).string();
-            if (rsc->props.mLogShaders) {
-                ALOGV("vtx A %i, %s = %d\n", ct, vtx->getAttribName(ct).string(), e->vtxAttrs[ct].slot);
-            }
-        }
-
-        populateUniformData(vtx, pgm, e->vtxUniforms);
-        populateUniformData(frag, pgm, e->fragUniforms);
-
-        // Only populate this list if we have arrays in our uniforms
-        UniformQueryData **uniformList = NULL;
-        GLint numUniforms = 0;
-        bool hasArrays = hasArrayUniforms(vtx, frag);
-        if (hasArrays) {
-            // Get the number of active uniforms and the length of the longest name
-            glGetProgramiv(pgm, GL_ACTIVE_UNIFORMS, &numUniforms);
-            GLint maxNameLength = 0;
-            glGetProgramiv(pgm, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxNameLength);
-            if (numUniforms > 0 && maxNameLength > 0) {
-                uniformList = new UniformQueryData*[numUniforms];
-                // Iterate over all the uniforms and build the list we
-                // can later use to match our uniforms to
-                for (uint32_t ct = 0; ct < (uint32_t)numUniforms; ct++) {
-                    uniformList[ct] = new UniformQueryData(maxNameLength);
-                    glGetActiveUniform(pgm, ct, maxNameLength, &uniformList[ct]->writtenLength,
-                                       &uniformList[ct]->arraySize, &uniformList[ct]->type,
-                                       uniformList[ct]->name);
-                    //ALOGE("GL UNI idx=%u, arraySize=%u, name=%s", ct,
-                    //     uniformList[ct]->arraySize, uniformList[ct]->name);
-                }
-            }
-        }
-
-        // We now know the highest index of all of the array uniforms
-        // and we need to update our cache to reflect that
-        // we may have declared [n], but only m < n elements are used
-        updateUniformArrayData(rsc, vtx, pgm, e->vtxUniforms, "vtx",
-                               uniformList, (uint32_t)numUniforms);
-        updateUniformArrayData(rsc, frag, pgm, e->fragUniforms, "frag",
-                               uniformList, (uint32_t)numUniforms);
-
-        // Clean up the uniform data from GL
-        if (uniformList != NULL) {
-            for (uint32_t ct = 0; ct < (uint32_t)numUniforms; ct++) {
-                delete uniformList[ct];
-            }
-            delete[] uniformList;
-            uniformList = NULL;
-        }
-    }
-
-    //ALOGV("SC made program %i", e->program);
-    glUseProgram(e->program);
-    rsdGLCheckError(rsc, "RsdShaderCache::link (miss)");
-
-    return true;
-}
-
-int32_t RsdShaderCache::vtxAttribSlot(const String8 &attrName) const {
-    for (uint32_t ct=0; ct < mCurrent->vtxAttrCount; ct++) {
-        if (attrName == mCurrent->vtxAttrs[ct].name) {
-            return mCurrent->vtxAttrs[ct].slot;
-        }
-    }
-    return -1;
-}
-
-void RsdShaderCache::cleanupVertex(RsdShader *s) {
-    int32_t numEntries = (int32_t)mEntries.size();
-    uint32_t numShaderIDs = s->getStateBasedIDCount();
-    for (uint32_t sId = 0; sId < numShaderIDs; sId ++) {
-        uint32_t id = s->getStateBasedID(sId);
-        for (int32_t ct = 0; ct < numEntries; ct ++) {
-            if (mEntries[ct]->vtx == id) {
-                glDeleteProgram(mEntries[ct]->program);
-
-                delete mEntries[ct];
-                mEntries.removeAt(ct);
-                numEntries = (int32_t)mEntries.size();
-                ct --;
-            }
-        }
-    }
-}
-
-void RsdShaderCache::cleanupFragment(RsdShader *s) {
-    int32_t numEntries = (int32_t)mEntries.size();
-    uint32_t numShaderIDs = s->getStateBasedIDCount();
-    for (uint32_t sId = 0; sId < numShaderIDs; sId ++) {
-        uint32_t id = s->getStateBasedID(sId);
-        for (int32_t ct = 0; ct < numEntries; ct ++) {
-            if (mEntries[ct]->frag == id) {
-                glDeleteProgram(mEntries[ct]->program);
-
-                delete mEntries[ct];
-                mEntries.removeAt(ct);
-                numEntries = (int32_t)mEntries.size();
-                ct --;
-            }
-        }
-    }
-}
-
-void RsdShaderCache::cleanupAll() {
-    for (uint32_t ct=0; ct < mEntries.size(); ct++) {
-        glDeleteProgram(mEntries[ct]->program);
-        free(mEntries[ct]);
-    }
-    mEntries.clear();
-}
-
diff --git a/libs/rs/driver/rsdShaderCache.h b/libs/rs/driver/rsdShaderCache.h
deleted file mode 100644
index 88aa32d..0000000
--- a/libs/rs/driver/rsdShaderCache.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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.
- */
-
-#ifndef ANDROID_RSD_SHADER_CACHE_H
-#define ANDROID_RSD_SHADER_CACHE_H
-
-namespace android {
-namespace renderscript {
-
-class Context;
-
-}
-}
-
-#include <utils/String8.h>
-#include <utils/Vector.h>
-class RsdShader;
-
-// ---------------------------------------------------------------------------
-
-// An element is a group of Components that occupies one cell in a structure.
-class RsdShaderCache {
-public:
-    RsdShaderCache();
-    virtual ~RsdShaderCache();
-
-    void setActiveVertex(RsdShader *pv) {
-        mVertexDirty = true;
-        mVertex = pv;
-    }
-
-    void setActiveFragment(RsdShader *pf) {
-        mFragmentDirty = true;
-        mFragment = pf;
-    }
-
-    bool setup(const android::renderscript::Context *rsc);
-
-    void cleanupVertex(RsdShader *s);
-    void cleanupFragment(RsdShader *s);
-
-    void cleanupAll();
-
-    int32_t vtxAttribSlot(const android::String8 &attrName) const;
-    int32_t vtxUniformSlot(uint32_t a) const {return mCurrent->vtxUniforms[a].slot;}
-    uint32_t vtxUniformSize(uint32_t a) const {return mCurrent->vtxUniforms[a].arraySize;}
-    int32_t fragUniformSlot(uint32_t a) const {return mCurrent->fragUniforms[a].slot;}
-    uint32_t fragUniformSize(uint32_t a) const {return mCurrent->fragUniforms[a].arraySize;}
-
-protected:
-    bool link(const android::renderscript::Context *rsc);
-    bool mFragmentDirty;
-    bool mVertexDirty;
-    RsdShader *mVertex;
-    RsdShader *mFragment;
-
-    struct UniformQueryData {
-        char *name;
-        uint32_t nameLength;
-        int32_t writtenLength;
-        int32_t arraySize;
-        uint32_t type;
-        UniformQueryData(uint32_t maxName) {
-            name = NULL;
-            nameLength = maxName;
-            if (nameLength > 0 ) {
-                name = new char[nameLength];
-            }
-        }
-        ~UniformQueryData() {
-            if (name != NULL) {
-                delete[] name;
-                name = NULL;
-            }
-        }
-    };
-    struct UniformData {
-        int32_t slot;
-        uint32_t arraySize;
-    };
-    struct AttrData {
-        int32_t slot;
-        const char* name;
-    };
-    struct ProgramEntry {
-        ProgramEntry(uint32_t numVtxAttr, uint32_t numVtxUnis,
-                     uint32_t numFragUnis) : vtx(0), frag(0), program(0), vtxAttrCount(0),
-                                             vtxAttrs(0), vtxUniforms(0), fragUniforms(0),
-                                             fragUniformIsSTO(0) {
-            vtxAttrCount = numVtxAttr;
-            if (numVtxAttr) {
-                vtxAttrs = new AttrData[numVtxAttr];
-            }
-            if (numVtxUnis) {
-                vtxUniforms = new UniformData[numVtxUnis];
-            }
-            if (numFragUnis) {
-                fragUniforms = new UniformData[numFragUnis];
-                fragUniformIsSTO = new bool[numFragUnis];
-            }
-        }
-        ~ProgramEntry() {
-            if (vtxAttrs) {
-                delete[] vtxAttrs;
-                vtxAttrs = NULL;
-            }
-            if (vtxUniforms) {
-                delete[] vtxUniforms;
-                vtxUniforms = NULL;
-            }
-            if (fragUniforms) {
-                delete[] fragUniforms;
-                fragUniforms = NULL;
-            }
-            if (fragUniformIsSTO) {
-                delete[] fragUniformIsSTO;
-                fragUniformIsSTO = NULL;
-            }
-        }
-        uint32_t vtx;
-        uint32_t frag;
-        uint32_t program;
-        uint32_t vtxAttrCount;
-        AttrData *vtxAttrs;
-        UniformData *vtxUniforms;
-        UniformData *fragUniforms;
-        bool *fragUniformIsSTO;
-    };
-    android::Vector<ProgramEntry*> mEntries;
-    ProgramEntry *mCurrent;
-
-    bool hasArrayUniforms(RsdShader *vtx, RsdShader *frag);
-    void populateUniformData(RsdShader *prog, uint32_t linkedID, UniformData *data);
-    void updateUniformArrayData(const android::renderscript::Context *rsc,
-                                RsdShader *prog, uint32_t linkedID,
-                                UniformData *data, const char* logTag,
-                                UniformQueryData **uniformList, uint32_t uniListSize);
-};
-
-
-#endif //ANDROID_RSD_SHADER_CACHE_H
-
-
-
-
diff --git a/libs/rs/driver/rsdVertexArray.cpp b/libs/rs/driver/rsdVertexArray.cpp
deleted file mode 100644
index 1836e67..0000000
--- a/libs/rs/driver/rsdVertexArray.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2011 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 <rs_hal.h>
-#include <rsContext.h>
-
-#include <GLES/gl.h>
-#include <GLES2/gl2.h>
-
-#include "rsdGL.h"
-#include "rsdCore.h"
-#include "rsdVertexArray.h"
-#include "rsdShaderCache.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-RsdVertexArray::RsdVertexArray(const Attrib *attribs, uint32_t numAttribs) {
-    mAttribs = attribs;
-    mCount = numAttribs;
-}
-
-RsdVertexArray::~RsdVertexArray() {
-}
-
-RsdVertexArray::Attrib::Attrib() {
-    clear();
-}
-
-void RsdVertexArray::Attrib::clear() {
-    buffer = 0;
-    offset = 0;
-    type = 0;
-    size = 0;
-    stride = 0;
-    ptr = NULL;
-    normalized = false;
-    name.setTo("");
-}
-
-void RsdVertexArray::Attrib::set(uint32_t type, uint32_t size, uint32_t stride,
-                              bool normalized, uint32_t offset,
-                              const char *name) {
-    clear();
-    this->type = type;
-    this->size = size;
-    this->offset = offset;
-    this->normalized = normalized;
-    this->stride = stride;
-    this->name.setTo(name);
-}
-
-void RsdVertexArray::logAttrib(uint32_t idx, uint32_t slot) const {
-    if (idx == 0) {
-        ALOGV("Starting vertex attribute binding");
-    }
-    ALOGV("va %i: slot=%i name=%s buf=%i ptr=%p size=%i  type=0x%x  stride=0x%x  norm=%i  offset=0x%x",
-         idx, slot,
-         mAttribs[idx].name.string(),
-         mAttribs[idx].buffer,
-         mAttribs[idx].ptr,
-         mAttribs[idx].size,
-         mAttribs[idx].type,
-         mAttribs[idx].stride,
-         mAttribs[idx].normalized,
-         mAttribs[idx].offset);
-}
-
-void RsdVertexArray::setup(const Context *rsc) const {
-
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-    RsdVertexArrayState *state = dc->gl.vertexArrayState;
-    RsdShaderCache *sc = dc->gl.shaderCache;
-
-    rsdGLCheckError(rsc, "RsdVertexArray::setup start");
-    uint32_t maxAttrs = state->mAttrsEnabledSize;
-
-    for (uint32_t ct=1; ct < maxAttrs; ct++) {
-        if(state->mAttrsEnabled[ct]) {
-            glDisableVertexAttribArray(ct);
-            state->mAttrsEnabled[ct] = false;
-        }
-    }
-
-    rsdGLCheckError(rsc, "RsdVertexArray::setup disabled");
-    for (uint32_t ct=0; ct < mCount; ct++) {
-        int32_t slot = sc->vtxAttribSlot(mAttribs[ct].name);
-        if (rsc->props.mLogShadersAttr) {
-            logAttrib(ct, slot);
-        }
-        if (slot < 0 || slot >= (int32_t)maxAttrs) {
-            continue;
-        }
-        glEnableVertexAttribArray(slot);
-        state->mAttrsEnabled[slot] = true;
-        glBindBuffer(GL_ARRAY_BUFFER, mAttribs[ct].buffer);
-        glVertexAttribPointer(slot,
-                              mAttribs[ct].size,
-                              mAttribs[ct].type,
-                              mAttribs[ct].normalized,
-                              mAttribs[ct].stride,
-                              mAttribs[ct].ptr + mAttribs[ct].offset);
-    }
-    rsdGLCheckError(rsc, "RsdVertexArray::setup done");
-}
-////////////////////////////////////////////
-RsdVertexArrayState::RsdVertexArrayState() {
-    mAttrsEnabled = NULL;
-    mAttrsEnabledSize = 0;
-}
-
-RsdVertexArrayState::~RsdVertexArrayState() {
-    if (mAttrsEnabled) {
-        delete[] mAttrsEnabled;
-        mAttrsEnabled = NULL;
-    }
-}
-void RsdVertexArrayState::init(uint32_t maxAttrs) {
-    mAttrsEnabledSize = maxAttrs;
-    mAttrsEnabled = new bool[mAttrsEnabledSize];
-    for (uint32_t ct = 0; ct < mAttrsEnabledSize; ct++) {
-        mAttrsEnabled[ct] = false;
-    }
-}
-
diff --git a/libs/rs/driver/rsdVertexArray.h b/libs/rs/driver/rsdVertexArray.h
deleted file mode 100644
index 3e807a3..0000000
--- a/libs/rs/driver/rsdVertexArray.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RSD_VERTEX_ARRAY_H
-#define ANDROID_RSD_VERTEX_ARRAY_H
-
-namespace android {
-namespace renderscript {
-
-class Context;
-
-}
-}
-
-#include <utils/String8.h>
-
-// An element is a group of Components that occupies one cell in a structure.
-class RsdVertexArray {
-public:
-    class Attrib {
-    public:
-        uint32_t buffer;
-        const uint8_t * ptr;
-        uint32_t offset;
-        uint32_t type;
-        uint32_t size;
-        uint32_t stride;
-        bool normalized;
-        android::String8 name;
-
-        Attrib();
-        void clear();
-        void set(uint32_t type, uint32_t size, uint32_t stride, bool normalized, uint32_t offset, const char *name);
-    };
-
-    RsdVertexArray(const Attrib *attribs, uint32_t numAttribs);
-    virtual ~RsdVertexArray();
-
-    void setup(const android::renderscript::Context *rsc) const;
-    void logAttrib(uint32_t idx, uint32_t slot) const;
-
-protected:
-    void clear(uint32_t index);
-    uint32_t mActiveBuffer;
-    const uint8_t * mActivePointer;
-    uint32_t mCount;
-
-    const Attrib *mAttribs;
-};
-
-
-class RsdVertexArrayState {
-public:
-    RsdVertexArrayState();
-    ~RsdVertexArrayState();
-    void init(uint32_t maxAttrs);
-
-    bool *mAttrsEnabled;
-    uint32_t mAttrsEnabledSize;
-};
-
-
-#endif //ANDROID_RSD_VERTEX_ARRAY_H
-
-
-
diff --git a/libs/rs/rs.h b/libs/rs/rs.h
deleted file mode 100644
index 825b9b8..0000000
--- a/libs/rs/rs.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-#ifndef RENDER_SCRIPT_H
-#define RENDER_SCRIPT_H
-
-#include <stdint.h>
-#include <sys/types.h>
-
-#include "rsDefines.h"
-
-//
-// A3D loading and object update code.
-// Should only be called at object creation, not thread safe
-RsObjectBase rsaFileA3DGetEntryByIndex(RsContext, uint32_t idx, RsFile);
-RsFile rsaFileA3DCreateFromMemory(RsContext, const void *data, uint32_t len);
-RsFile rsaFileA3DCreateFromAsset(RsContext, void *asset);
-RsFile rsaFileA3DCreateFromFile(RsContext, const char *path);
-void rsaFileA3DGetNumIndexEntries(RsContext, int32_t *numEntries, RsFile);
-void rsaFileA3DGetIndexEntries(RsContext, RsFileIndexEntry *fileEntries,
-                               uint32_t numEntries, RsFile);
-void rsaGetName(RsContext, void * obj, const char **name);
-// Mesh update functions
-void rsaMeshGetVertexBufferCount(RsContext, RsMesh, int32_t *vtxCount);
-void rsaMeshGetIndexCount(RsContext, RsMesh, int32_t *idxCount);
-void rsaMeshGetVertices(RsContext, RsMesh, RsAllocation *vtxData, uint32_t vtxDataCount);
-void rsaMeshGetIndices(RsContext, RsMesh, RsAllocation *va,
-                       uint32_t *primType, uint32_t idxDataCount);
-// Allocation update
-const void* rsaAllocationGetType(RsContext con, RsAllocation va);
-// Type update
-void rsaTypeGetNativeData(RsContext, RsType, uint32_t *typeData, uint32_t typeDataSize);
-// Element update
-void rsaElementGetNativeData(RsContext, RsElement, uint32_t *elemData, uint32_t elemDataSize);
-void rsaElementGetSubElements(RsContext, RsElement, uint32_t *ids, const char **names,
-                              uint32_t *arraySizes, uint32_t dataSize);
-
-RsDevice rsDeviceCreate();
-void rsDeviceDestroy(RsDevice dev);
-void rsDeviceSetConfig(RsDevice dev, RsDeviceParam p, int32_t value);
-RsContext rsContextCreate(RsDevice dev, uint32_t version, uint32_t sdkVersion);
-RsContext rsContextCreateGL(RsDevice dev, uint32_t version, uint32_t sdkVersion,
-                            RsSurfaceConfig sc, uint32_t dpi);
-
-#include "rsgApiFuncDecl.h"
-
-#endif // RENDER_SCRIPT_H
-
-
-
diff --git a/libs/rs/rs.spec b/libs/rs/rs.spec
deleted file mode 100644
index b373056..0000000
--- a/libs/rs/rs.spec
+++ /dev/null
@@ -1,427 +0,0 @@
-
-ContextDestroy {
-    direct
-}
-
-ContextGetMessage {
-    direct
-    param void *data
-    param size_t *receiveLen
-    param uint32_t *usrID
-    ret RsMessageToClientType
-}
-
-ContextPeekMessage {
-    direct
-    param size_t *receiveLen
-    param uint32_t *usrID
-    ret RsMessageToClientType
-}
-
-ContextInitToClient {
-    direct
-}
-
-ContextDeinitToClient {
-    direct
-}
-
-TypeCreate {
-    direct
-    param RsElement e
-    param uint32_t dimX
-    param uint32_t dimY
-    param uint32_t dimZ
-    param bool mips
-    param bool faces
-    ret RsType
-}
-
-AllocationCreateTyped {
-    direct
-    param RsType vtype
-    param RsAllocationMipmapControl mips
-    param uint32_t usages
-    param uint32_t ptr
-    ret RsAllocation
-}
-
-AllocationCreateFromBitmap {
-    direct
-    param RsType vtype
-    param RsAllocationMipmapControl mips
-    param const void *data
-    param uint32_t usages
-    ret RsAllocation
-}
-
-AllocationCubeCreateFromBitmap {
-    direct
-    param RsType vtype
-    param RsAllocationMipmapControl mips
-    param const void *data
-    param uint32_t usages
-    ret RsAllocation
-}
-
-AllocationGetSurfaceTextureID {
-    param RsAllocation alloc
-    ret int32_t
-}
-
-AllocationGetSurfaceTextureID2 {
-    param RsAllocation alloc
-    param void *st
-    sync
-}
-
-AllocationSetSurface {
-    param RsAllocation alloc
-    param RsNativeWindow sur
-    sync
-    }
-
-AllocationIoSend {
-    param RsAllocation alloc
-    }
-
-AllocationIoReceive {
-    param RsAllocation alloc
-    }
-
-
-ContextFinish {
-    sync
-    }
-
-ContextBindRootScript {
-    param RsScript sampler
-    }
-
-ContextBindProgramStore {
-    param RsProgramStore pgm
-    }
-
-ContextBindProgramFragment {
-    param RsProgramFragment pgm
-    }
-
-ContextBindProgramVertex {
-    param RsProgramVertex pgm
-    }
-
-ContextBindProgramRaster {
-    param RsProgramRaster pgm
-    }
-
-ContextBindFont {
-    param RsFont pgm
-    }
-
-ContextPause {
-    }
-
-ContextResume {
-    }
-
-ContextSetSurface {
-    param uint32_t width
-    param uint32_t height
-    param RsNativeWindow sur
-        sync
-    }
-
-ContextDump {
-    param int32_t bits
-}
-
-ContextSetPriority {
-    param int32_t priority
-    }
-
-ContextDestroyWorker {
-        sync
-}
-
-AssignName {
-    param RsObjectBase obj
-    param const char *name
-    }
-
-ObjDestroy {
-    param RsAsyncVoidPtr objPtr
-    }
-
-ElementCreate {
-        direct
-    param RsDataType mType
-    param RsDataKind mKind
-    param bool mNormalized
-    param uint32_t mVectorSize
-    ret RsElement
-    }
-
-ElementCreate2 {
-        direct
-    param const RsElement * elements
-    param const char ** names
-    param const uint32_t * arraySize
-    ret RsElement
-    }
-
-AllocationCopyToBitmap {
-    param RsAllocation alloc
-    param void * data
-    }
-
-
-Allocation1DData {
-    param RsAllocation va
-    param uint32_t xoff
-    param uint32_t lod
-    param uint32_t count
-    param const void *data
-    }
-
-Allocation1DElementData {
-    param RsAllocation va
-    param uint32_t x
-    param uint32_t lod
-    param const void *data
-    param size_t comp_offset
-    }
-
-Allocation2DData {
-    param RsAllocation va
-    param uint32_t xoff
-    param uint32_t yoff
-    param uint32_t lod
-    param RsAllocationCubemapFace face
-    param uint32_t w
-    param uint32_t h
-    param const void *data
-    }
-
-Allocation2DElementData {
-    param RsAllocation va
-    param uint32_t x
-    param uint32_t y
-    param uint32_t lod
-    param RsAllocationCubemapFace face
-    param const void *data
-    param size_t element_offset
-    }
-
-AllocationGenerateMipmaps {
-    param RsAllocation va
-}
-
-AllocationRead {
-    param RsAllocation va
-    param void * data
-    }
-
-AllocationSyncAll {
-    param RsAllocation va
-    param RsAllocationUsageType src
-}
-
-
-AllocationResize1D {
-    param RsAllocation va
-    param uint32_t dimX
-    }
-
-AllocationResize2D {
-    param RsAllocation va
-    param uint32_t dimX
-    param uint32_t dimY
-    }
-
-AllocationCopy2DRange {
-    param RsAllocation dest
-    param uint32_t destXoff
-    param uint32_t destYoff
-    param uint32_t destMip
-    param uint32_t destFace
-    param uint32_t width
-    param uint32_t height
-    param RsAllocation src
-    param uint32_t srcXoff
-    param uint32_t srcYoff
-    param uint32_t srcMip
-    param uint32_t srcFace
-    }
-
-SamplerCreate {
-    direct
-    param RsSamplerValue magFilter
-    param RsSamplerValue minFilter
-    param RsSamplerValue wrapS
-    param RsSamplerValue wrapT
-    param RsSamplerValue wrapR
-    param float mAniso
-    ret RsSampler
-}
-
-ScriptBindAllocation {
-    param RsScript vtm
-    param RsAllocation va
-    param uint32_t slot
-    }
-
-ScriptSetTimeZone {
-    param RsScript s
-    param const char * timeZone
-    }
-
-ScriptInvoke {
-    param RsScript s
-    param uint32_t slot
-    }
-
-ScriptInvokeV {
-    param RsScript s
-    param uint32_t slot
-    param const void * data
-    }
-
-ScriptForEach {
-    param RsScript s
-    param uint32_t slot
-    param RsAllocation ain
-    param RsAllocation aout
-    param const void * usr
-}
-
-ScriptSetVarI {
-    param RsScript s
-    param uint32_t slot
-    param int value
-    }
-
-ScriptSetVarObj {
-    param RsScript s
-    param uint32_t slot
-    param RsObjectBase value
-    }
-
-ScriptSetVarJ {
-    param RsScript s
-    param uint32_t slot
-    param int64_t value
-    }
-
-ScriptSetVarF {
-    param RsScript s
-    param uint32_t slot
-    param float value
-    }
-
-ScriptSetVarD {
-    param RsScript s
-    param uint32_t slot
-    param double value
-    }
-
-ScriptSetVarV {
-    param RsScript s
-    param uint32_t slot
-    param const void * data
-    }
-
-
-ScriptCCreate {
-        param const char * resName
-        param const char * cacheDir
-    param const char * text
-    ret RsScript
-    }
-
-
-ProgramStoreCreate {
-    direct
-    param bool colorMaskR
-    param bool colorMaskG
-    param bool colorMaskB
-    param bool colorMaskA
-        param bool depthMask
-        param bool ditherEnable
-    param RsBlendSrcFunc srcFunc
-    param RsBlendDstFunc destFunc
-        param RsDepthFunc depthFunc
-    ret RsProgramStore
-    }
-
-ProgramRasterCreate {
-    direct
-    param bool pointSprite
-    param RsCullMode cull
-    ret RsProgramRaster
-}
-
-ProgramBindConstants {
-    param RsProgram vp
-    param uint32_t slot
-    param RsAllocation constants
-    }
-
-
-ProgramBindTexture {
-    param RsProgramFragment pf
-    param uint32_t slot
-    param RsAllocation a
-    }
-
-ProgramBindSampler {
-    param RsProgramFragment pf
-    param uint32_t slot
-    param RsSampler s
-    }
-
-ProgramFragmentCreate {
-    direct
-    param const char * shaderText
-    param const char ** textureNames
-    param const uint32_t * params
-    ret RsProgramFragment
-    }
-
-ProgramVertexCreate {
-    direct
-    param const char * shaderText
-    param const char ** textureNames
-    param const uint32_t * params
-    ret RsProgramVertex
-    }
-
-FontCreateFromFile {
-    param const char *name
-    param float fontSize
-    param uint32_t dpi
-    ret RsFont
-    }
-
-FontCreateFromMemory {
-    param const char *name
-    param float fontSize
-    param uint32_t dpi
-    param const void *data
-    ret RsFont
-    }
-
-MeshCreate {
-    param RsAllocation *vtx
-    param RsAllocation *idx
-    param uint32_t *primType
-    ret RsMesh
-    }
-
-PathCreate {
-    param RsPathPrimitive pp
-    param bool isStatic
-    param RsAllocation vertex
-    param RsAllocation loops
-    param float quality
-    ret RsPath
-    }
diff --git a/libs/rs/rsAdapter.cpp b/libs/rs/rsAdapter.cpp
deleted file mode 100644
index 41811ae..0000000
--- a/libs/rs/rsAdapter.cpp
+++ /dev/null
@@ -1,238 +0,0 @@
-
-/*
- * Copyright (C) 2009 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 "rsAdapter.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-Adapter1D::Adapter1D(Context *rsc) : ObjectBase(rsc) {
-    reset();
-}
-
-Adapter1D::Adapter1D(Context *rsc, Allocation *a) : ObjectBase(rsc) {
-    reset();
-    setAllocation(a);
-}
-
-void Adapter1D::reset() {
-    mY = 0;
-    mZ = 0;
-    mLOD = 0;
-    mFace = 0;
-}
-
-void * Adapter1D::getElement(uint32_t x) {
-    rsAssert(mAllocation.get());
-    rsAssert(mAllocation->getPtr());
-    rsAssert(mAllocation->getType());
-    uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr());
-    ptr += mAllocation->getType()->getLODOffset(mLOD, x, mY);
-    return ptr;
-}
-
-void Adapter1D::subData(uint32_t xoff, uint32_t count, const void *data) {
-    if (mAllocation.get() && mAllocation.get()->getType()) {
-        void *ptr = getElement(xoff);
-        count *= mAllocation.get()->getType()->getElementSizeBytes();
-        memcpy(ptr, data, count);
-    }
-}
-
-void Adapter1D::data(const void *data) {
-    memcpy(getElement(0),
-           data,
-           mAllocation.get()->getType()->getSizeBytes());
-}
-
-void Adapter1D::serialize(OStream *stream) const {
-}
-
-Adapter1D *Adapter1D::createFromStream(Context *rsc, IStream *stream) {
-    return NULL;
-}
-
-namespace android {
-namespace renderscript {
-
-RsAdapter1D rsi_Adapter1DCreate(Context *rsc) {
-    Adapter1D *a = new Adapter1D(rsc);
-    a->incUserRef();
-    return a;
-}
-
-void rsi_Adapter1DBindAllocation(Context *rsc, RsAdapter1D va, RsAllocation valloc) {
-    Adapter1D * a = static_cast<Adapter1D *>(va);
-    Allocation * alloc = static_cast<Allocation *>(valloc);
-    a->setAllocation(alloc);
-}
-
-void rsi_Adapter1DSetConstraint(Context *rsc, RsAdapter1D va, RsDimension dim, uint32_t value) {
-    Adapter1D * a = static_cast<Adapter1D *>(va);
-    switch (dim) {
-    case RS_DIMENSION_X:
-        rsAssert(!"Cannot contrain X in an 1D adapter");
-        return;
-    case RS_DIMENSION_Y:
-        a->setY(value);
-        break;
-    case RS_DIMENSION_Z:
-        a->setZ(value);
-        break;
-    case RS_DIMENSION_LOD:
-        a->setLOD(value);
-        break;
-    case RS_DIMENSION_FACE:
-        a->setFace(value);
-        break;
-    default:
-        rsAssert(!"Unimplemented constraint");
-        return;
-    }
-}
-
-void rsi_Adapter1DSubData(Context *rsc, RsAdapter1D va, uint32_t xoff, uint32_t count, const void *data) {
-    Adapter1D * a = static_cast<Adapter1D *>(va);
-    a->subData(xoff, count, data);
-}
-
-void rsi_Adapter1DData(Context *rsc, RsAdapter1D va, const void *data) {
-    Adapter1D * a = static_cast<Adapter1D *>(va);
-    a->data(data);
-}
-
-}
-}
-
-//////////////////////////
-
-Adapter2D::Adapter2D(Context *rsc) : ObjectBase(rsc) {
-    reset();
-}
-
-Adapter2D::Adapter2D(Context *rsc, Allocation *a) : ObjectBase(rsc) {
-    reset();
-    setAllocation(a);
-}
-
-void Adapter2D::reset() {
-    mZ = 0;
-    mLOD = 0;
-    mFace = 0;
-}
-
-void * Adapter2D::getElement(uint32_t x, uint32_t y) const {
-    rsAssert(mAllocation.get());
-    rsAssert(mAllocation->getPtr());
-    rsAssert(mAllocation->getType());
-    if (mFace != 0 && !mAllocation->getType()->getDimFaces()) {
-        ALOGE("Adapter wants cubemap face, but allocation has none");
-        return NULL;
-    }
-
-    uint8_t * ptr = static_cast<uint8_t *>(mAllocation->getPtr());
-    ptr += mAllocation->getType()->getLODOffset(mLOD, x, y);
-
-    if (mFace != 0) {
-        uint32_t totalSizeBytes = mAllocation->getType()->getSizeBytes();
-        uint32_t faceOffset = totalSizeBytes / 6;
-        ptr += faceOffset * mFace;
-    }
-    return ptr;
-}
-
-void Adapter2D::subData(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data) {
-    rsAssert(mAllocation.get());
-    rsAssert(mAllocation->getPtr());
-    rsAssert(mAllocation->getType());
-
-    uint32_t eSize = mAllocation.get()->getType()->getElementSizeBytes();
-    uint32_t lineSize = eSize * w;
-
-    const uint8_t *src = static_cast<const uint8_t *>(data);
-    for (uint32_t line=yoff; line < (yoff+h); line++) {
-        memcpy(getElement(xoff, line), src, lineSize);
-        src += lineSize;
-    }
-}
-
-void Adapter2D::data(const void *data) {
-    memcpy(getElement(0,0),
-           data,
-           mAllocation.get()->getType()->getSizeBytes());
-}
-
-void Adapter2D::serialize(OStream *stream) const {
-}
-
-Adapter2D *Adapter2D::createFromStream(Context *rsc, IStream *stream) {
-    return NULL;
-}
-
-
-namespace android {
-namespace renderscript {
-
-RsAdapter2D rsi_Adapter2DCreate(Context *rsc) {
-    Adapter2D *a = new Adapter2D(rsc);
-    a->incUserRef();
-    return a;
-}
-
-void rsi_Adapter2DBindAllocation(Context *rsc, RsAdapter2D va, RsAllocation valloc) {
-    Adapter2D * a = static_cast<Adapter2D *>(va);
-    Allocation * alloc = static_cast<Allocation *>(valloc);
-    a->setAllocation(alloc);
-}
-
-void rsi_Adapter2DSetConstraint(Context *rsc, RsAdapter2D va, RsDimension dim, uint32_t value) {
-    Adapter2D * a = static_cast<Adapter2D *>(va);
-    switch (dim) {
-    case RS_DIMENSION_X:
-        rsAssert(!"Cannot contrain X in an 2D adapter");
-        return;
-    case RS_DIMENSION_Y:
-        rsAssert(!"Cannot contrain Y in an 2D adapter");
-        break;
-    case RS_DIMENSION_Z:
-        a->setZ(value);
-        break;
-    case RS_DIMENSION_LOD:
-        a->setLOD(value);
-        break;
-    case RS_DIMENSION_FACE:
-        a->setFace(value);
-        break;
-    default:
-        rsAssert(!"Unimplemented constraint");
-        return;
-    }
-}
-
-void rsi_Adapter2DData(Context *rsc, RsAdapter2D va, const void *data) {
-    Adapter2D * a = static_cast<Adapter2D *>(va);
-    a->data(data);
-}
-
-void rsi_Adapter2DSubData(Context *rsc, RsAdapter2D va, uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data) {
-    Adapter2D * a = static_cast<Adapter2D *>(va);
-    a->subData(xoff, yoff, w, h, data);
-}
-
-}
-}
diff --git a/libs/rs/rsAdapter.h b/libs/rs/rsAdapter.h
deleted file mode 100644
index d150789..0000000
--- a/libs/rs/rsAdapter.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_ADAPTER_H
-#define ANDROID_RS_ADAPTER_H
-
-#include "rsAllocation.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-
-class Adapter1D : public ObjectBase {
-
-public:
-    // By policy this allocation will hold a pointer to the type
-    // but will not destroy it on destruction.
-    Adapter1D(Context *);
-    Adapter1D(Context *, Allocation *);
-    void reset();
-    void * getElement(uint32_t x);
-
-    void setAllocation(Allocation *a) {mAllocation.set(a);}
-
-    uint32_t getDimX() const {return mAllocation->getType()->getLODDimX(mLOD);}
-
-    const Type * getBaseType() const {return mAllocation->getType();}
-
-    inline void setY(uint32_t y) {mY = y;}
-    inline void setZ(uint32_t z) {mZ = z;}
-    inline void setLOD(uint32_t lod) {mLOD = lod;}
-    inline void setFace(uint32_t face) {mFace = face;}
-    //void setArray(uint32_t num, uint32_t value);
-
-    void subData(uint32_t xoff, uint32_t count, const void *data);
-    void data(const void *data);
-
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ADAPTER_1D; }
-    static Adapter1D *createFromStream(Context *rsc, IStream *stream);
-
-protected:
-    ObjectBaseRef<Allocation> mAllocation;
-    uint32_t mY;
-    uint32_t mZ;
-    uint32_t mLOD;
-    uint32_t mFace;
-};
-
-class Adapter2D : public ObjectBase {
-
-public:
-    // By policy this allocation will hold a pointer to the type
-    // but will not destroy it on destruction.
-    Adapter2D(Context *);
-    Adapter2D(Context *, Allocation *);
-    void reset();
-    void * getElement(uint32_t x, uint32_t y) const;
-
-    uint32_t getDimX() const {return mAllocation->getType()->getLODDimX(mLOD);}
-    uint32_t getDimY() const {return mAllocation->getType()->getLODDimY(mLOD);}
-    const Type * getBaseType() const {return mAllocation->getType();}
-
-    void setAllocation(Allocation *a) {mAllocation.set(a);}
-    inline void setZ(uint32_t z) {mZ = z;}
-    inline void setLOD(uint32_t lod) {mLOD = lod;}
-    inline void setFace(uint32_t face) {mFace = face;}
-    //void setArray(uint32_t num, uint32_t value);
-
-    void data(const void *data);
-    void subData(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data);
-
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ADAPTER_2D; }
-    static Adapter2D *createFromStream(Context *rsc, IStream *stream);
-
-protected:
-    ObjectBaseRef<Allocation> mAllocation;
-    uint32_t mZ;
-    uint32_t mLOD;
-    uint32_t mFace;
-};
-
-}
-}
-#endif
-
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
deleted file mode 100644
index cdff49c..0000000
--- a/libs/rs/rsAllocation.cpp
+++ /dev/null
@@ -1,741 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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"
-#include "rsAdapter.h"
-#include "rs_hal.h"
-
-#include "system/window.h"
-#include "gui/SurfaceTexture.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-Allocation::Allocation(Context *rsc, const Type *type, uint32_t usages,
-                       RsAllocationMipmapControl mc, void * ptr)
-    : ObjectBase(rsc) {
-
-    memset(&mHal, 0, sizeof(mHal));
-    mHal.state.mipmapControl = RS_ALLOCATION_MIPMAP_NONE;
-    mHal.state.usageFlags = usages;
-    mHal.state.mipmapControl = mc;
-    mHal.state.usrPtr = ptr;
-
-    setType(type);
-    updateCache();
-}
-
-Allocation * Allocation::createAllocation(Context *rsc, const Type *type, uint32_t usages,
-                              RsAllocationMipmapControl mc, void * ptr) {
-    Allocation *a = new Allocation(rsc, type, usages, mc, ptr);
-
-    if (!rsc->mHal.funcs.allocation.init(rsc, a, type->getElement()->getHasReferences())) {
-        rsc->setError(RS_ERROR_FATAL_DRIVER, "Allocation::Allocation, alloc failure");
-        delete a;
-        return NULL;
-    }
-
-    return a;
-}
-
-void Allocation::updateCache() {
-    const Type *type = mHal.state.type;
-    mHal.state.dimensionX = type->getDimX();
-    mHal.state.dimensionY = type->getDimY();
-    mHal.state.dimensionZ = type->getDimZ();
-    mHal.state.hasFaces = type->getDimFaces();
-    mHal.state.hasMipmaps = type->getDimLOD();
-    mHal.state.elementSizeBytes = type->getElementSizeBytes();
-    mHal.state.hasReferences = mHal.state.type->getElement()->getHasReferences();
-}
-
-Allocation::~Allocation() {
-    freeChildrenUnlocked();
-    setSurfaceTexture(mRSC, NULL);
-    mRSC->mHal.funcs.allocation.destroy(mRSC, this);
-}
-
-void Allocation::syncAll(Context *rsc, RsAllocationUsageType src) {
-    rsc->mHal.funcs.allocation.syncAll(rsc, this, src);
-}
-
-void Allocation::read(void *data) {
-    memcpy(data, getPtr(), mHal.state.type->getSizeBytes());
-}
-
-void Allocation::data(Context *rsc, uint32_t xoff, uint32_t lod,
-                         uint32_t count, const void *data, size_t sizeBytes) {
-    const size_t eSize = mHal.state.type->getElementSizeBytes();
-
-    if ((count * eSize) != sizeBytes) {
-        ALOGE("Allocation::subData called with mismatched size expected %zu, got %zu",
-             (count * eSize), sizeBytes);
-        mHal.state.type->dumpLOGV("type info");
-        return;
-    }
-
-    rsc->mHal.funcs.allocation.data1D(rsc, this, xoff, lod, count, data, sizeBytes);
-    sendDirty(rsc);
-}
-
-void Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
-             uint32_t w, uint32_t h, const void *data, size_t sizeBytes) {
-    const size_t eSize = mHal.state.elementSizeBytes;
-    const size_t lineSize = eSize * w;
-
-    //ALOGE("data2d %p,  %i %i %i %i %i %i %p %i", this, xoff, yoff, lod, face, w, h, data, sizeBytes);
-
-    if ((lineSize * h) != sizeBytes) {
-        ALOGE("Allocation size mismatch, expected %zu, got %zu", (lineSize * h), sizeBytes);
-        rsAssert(!"Allocation::subData called with mismatched size");
-        return;
-    }
-
-    rsc->mHal.funcs.allocation.data2D(rsc, this, xoff, yoff, lod, face, w, h, data, sizeBytes);
-    sendDirty(rsc);
-}
-
-void Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff,
-                      uint32_t lod, RsAllocationCubemapFace face,
-                      uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes) {
-}
-
-void Allocation::elementData(Context *rsc, uint32_t x, const void *data,
-                                uint32_t cIdx, size_t sizeBytes) {
-    size_t eSize = mHal.state.elementSizeBytes;
-
-    if (cIdx >= mHal.state.type->getElement()->getFieldCount()) {
-        ALOGE("Error Allocation::subElementData component %i out of range.", cIdx);
-        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
-        return;
-    }
-
-    if (x >= mHal.state.dimensionX) {
-        ALOGE("Error Allocation::subElementData X offset %i out of range.", x);
-        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
-        return;
-    }
-
-    const Element * e = mHal.state.type->getElement()->getField(cIdx);
-    uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx);
-    if (sizeBytes != e->getSizeBytes() * elemArraySize) {
-        ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes());
-        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
-        return;
-    }
-
-    rsc->mHal.funcs.allocation.elementData1D(rsc, this, x, data, cIdx, sizeBytes);
-    sendDirty(rsc);
-}
-
-void Allocation::elementData(Context *rsc, uint32_t x, uint32_t y,
-                                const void *data, uint32_t cIdx, size_t sizeBytes) {
-    size_t eSize = mHal.state.elementSizeBytes;
-
-    if (x >= mHal.state.dimensionX) {
-        ALOGE("Error Allocation::subElementData X offset %i out of range.", x);
-        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
-        return;
-    }
-
-    if (y >= mHal.state.dimensionY) {
-        ALOGE("Error Allocation::subElementData X offset %i out of range.", x);
-        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
-        return;
-    }
-
-    if (cIdx >= mHal.state.type->getElement()->getFieldCount()) {
-        ALOGE("Error Allocation::subElementData component %i out of range.", cIdx);
-        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
-        return;
-    }
-
-    const Element * e = mHal.state.type->getElement()->getField(cIdx);
-    uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx);
-    if (sizeBytes != e->getSizeBytes() * elemArraySize) {
-        ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes());
-        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
-        return;
-    }
-
-    rsc->mHal.funcs.allocation.elementData2D(rsc, this, x, y, data, cIdx, sizeBytes);
-    sendDirty(rsc);
-}
-
-void Allocation::addProgramToDirty(const Program *p) {
-    mToDirtyList.push(p);
-}
-
-void Allocation::removeProgramToDirty(const Program *p) {
-    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
-        if (mToDirtyList[ct] == p) {
-            mToDirtyList.removeAt(ct);
-            return;
-        }
-    }
-    rsAssert(0);
-}
-
-void Allocation::dumpLOGV(const char *prefix) const {
-    ObjectBase::dumpLOGV(prefix);
-
-    String8 s(prefix);
-    s.append(" type ");
-    if (mHal.state.type) {
-        mHal.state.type->dumpLOGV(s.string());
-    }
-
-    ALOGV("%s allocation ptr=%p  mUsageFlags=0x04%x, mMipmapControl=0x%04x",
-         prefix, getPtr(), mHal.state.usageFlags, mHal.state.mipmapControl);
-}
-
-uint32_t Allocation::getPackedSize() const {
-    uint32_t numItems = mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes();
-    return numItems * mHal.state.type->getElement()->getSizeBytesUnpadded();
-}
-
-void Allocation::writePackedData(const Type *type,
-                                 uint8_t *dst, const uint8_t *src, bool dstPadded) {
-    const Element *elem = type->getElement();
-    uint32_t unpaddedBytes = elem->getSizeBytesUnpadded();
-    uint32_t paddedBytes = elem->getSizeBytes();
-    uint32_t numItems = type->getSizeBytes() / paddedBytes;
-
-    uint32_t srcInc = !dstPadded ? paddedBytes : unpaddedBytes;
-    uint32_t dstInc =  dstPadded ? paddedBytes : unpaddedBytes;
-
-    // no sub-elements
-    uint32_t fieldCount = elem->getFieldCount();
-    if (fieldCount == 0) {
-        for (uint32_t i = 0; i < numItems; i ++) {
-            memcpy(dst, src, unpaddedBytes);
-            src += srcInc;
-            dst += dstInc;
-        }
-        return;
-    }
-
-    // Cache offsets
-    uint32_t *offsetsPadded = new uint32_t[fieldCount];
-    uint32_t *offsetsUnpadded = new uint32_t[fieldCount];
-    uint32_t *sizeUnpadded = new uint32_t[fieldCount];
-
-    for (uint32_t i = 0; i < fieldCount; i++) {
-        offsetsPadded[i] = elem->getFieldOffsetBytes(i);
-        offsetsUnpadded[i] = elem->getFieldOffsetBytesUnpadded(i);
-        sizeUnpadded[i] = elem->getField(i)->getSizeBytesUnpadded();
-    }
-
-    uint32_t *srcOffsets = !dstPadded ? offsetsPadded : offsetsUnpadded;
-    uint32_t *dstOffsets =  dstPadded ? offsetsPadded : offsetsUnpadded;
-
-    // complex elements, need to copy subelem after subelem
-    for (uint32_t i = 0; i < numItems; i ++) {
-        for (uint32_t fI = 0; fI < fieldCount; fI++) {
-            memcpy(dst + dstOffsets[fI], src + srcOffsets[fI], sizeUnpadded[fI]);
-        }
-        src += srcInc;
-        dst += dstInc;
-    }
-
-    delete[] offsetsPadded;
-    delete[] offsetsUnpadded;
-    delete[] sizeUnpadded;
-}
-
-void Allocation::unpackVec3Allocation(const void *data, size_t dataSize) {
-    const uint8_t *src = (const uint8_t*)data;
-    uint8_t *dst = (uint8_t*)getPtr();
-
-    writePackedData(getType(), dst, src, true);
-}
-
-void Allocation::packVec3Allocation(OStream *stream) const {
-    uint32_t paddedBytes = getType()->getElement()->getSizeBytes();
-    uint32_t unpaddedBytes = getType()->getElement()->getSizeBytesUnpadded();
-    uint32_t numItems = mHal.state.type->getSizeBytes() / paddedBytes;
-
-    const uint8_t *src = (const uint8_t*)getPtr();
-    uint8_t *dst = new uint8_t[numItems * unpaddedBytes];
-
-    writePackedData(getType(), dst, src, false);
-    stream->addByteArray(dst, getPackedSize());
-
-    delete[] dst;
-}
-
-void Allocation::serialize(OStream *stream) const {
-    // Need to identify ourselves
-    stream->addU32((uint32_t)getClassId());
-
-    String8 name(getName());
-    stream->addString(&name);
-
-    // First thing we need to serialize is the type object since it will be needed
-    // to initialize the class
-    mHal.state.type->serialize(stream);
-
-    uint32_t dataSize = mHal.state.type->getSizeBytes();
-    // 3 element vectors are padded to 4 in memory, but padding isn't serialized
-    uint32_t packedSize = getPackedSize();
-    // Write how much data we are storing
-    stream->addU32(packedSize);
-    if (dataSize == packedSize) {
-        // Now write the data
-        stream->addByteArray(getPtr(), dataSize);
-    } else {
-        // Now write the data
-        packVec3Allocation(stream);
-    }
-}
-
-Allocation *Allocation::createFromStream(Context *rsc, IStream *stream) {
-    // First make sure we are reading the correct object
-    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
-    if (classID != RS_A3D_CLASS_ID_ALLOCATION) {
-        ALOGE("allocation loading skipped due to invalid class id\n");
-        return NULL;
-    }
-
-    String8 name;
-    stream->loadString(&name);
-
-    Type *type = Type::createFromStream(rsc, stream);
-    if (!type) {
-        return NULL;
-    }
-    type->compute();
-
-    Allocation *alloc = Allocation::createAllocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT);
-    type->decUserRef();
-
-    // Number of bytes we wrote out for this allocation
-    uint32_t dataSize = stream->loadU32();
-    // 3 element vectors are padded to 4 in memory, but padding isn't serialized
-    uint32_t packedSize = alloc->getPackedSize();
-    if (dataSize != type->getSizeBytes() &&
-        dataSize != packedSize) {
-        ALOGE("failed to read allocation because numbytes written is not the same loaded type wants\n");
-        ObjectBase::checkDelete(alloc);
-        ObjectBase::checkDelete(type);
-        return NULL;
-    }
-
-    alloc->setName(name.string(), name.size());
-
-    if (dataSize == type->getSizeBytes()) {
-        uint32_t count = dataSize / type->getElementSizeBytes();
-        // Read in all of our allocation data
-        alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize);
-    } else {
-        alloc->unpackVec3Allocation(stream->getPtr() + stream->getPos(), dataSize);
-    }
-    stream->reset(stream->getPos() + dataSize);
-
-    return alloc;
-}
-
-void Allocation::sendDirty(const Context *rsc) const {
-    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
-        mToDirtyList[ct]->forceDirty();
-    }
-    mRSC->mHal.funcs.allocation.markDirty(rsc, this);
-}
-
-void Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const {
-    const uint8_t *p = static_cast<const uint8_t *>(ptr);
-    const Element *e = mHal.state.type->getElement();
-    uint32_t stride = e->getSizeBytes();
-
-    p += stride * startOff;
-    while (ct > 0) {
-        e->incRefs(p);
-        ct --;
-        p += stride;
-    }
-}
-
-void Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const {
-    if (!mHal.state.hasReferences || !getIsScript()) {
-        return;
-    }
-    const uint8_t *p = static_cast<const uint8_t *>(ptr);
-    const Element *e = mHal.state.type->getElement();
-    uint32_t stride = e->getSizeBytes();
-
-    p += stride * startOff;
-    while (ct > 0) {
-        e->decRefs(p);
-        ct --;
-        p += stride;
-    }
-}
-
-void Allocation::freeChildrenUnlocked () {
-    decRefs(getPtr(), mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes(), 0);
-}
-
-bool Allocation::freeChildren() {
-    if (mHal.state.hasReferences) {
-        incSysRef();
-        freeChildrenUnlocked();
-        return decSysRef();
-    }
-    return false;
-}
-
-void Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) {
-}
-
-void Allocation::resize1D(Context *rsc, uint32_t dimX) {
-    uint32_t oldDimX = mHal.state.dimensionX;
-    if (dimX == oldDimX) {
-        return;
-    }
-
-    ObjectBaseRef<Type> t = mHal.state.type->cloneAndResize1D(rsc, dimX);
-    if (dimX < oldDimX) {
-        decRefs(getPtr(), oldDimX - dimX, dimX);
-    }
-    rsc->mHal.funcs.allocation.resize(rsc, this, t.get(), mHal.state.hasReferences);
-    setType(t.get());
-    updateCache();
-}
-
-void Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) {
-    ALOGE("not implemented");
-}
-
-int32_t Allocation::getSurfaceTextureID(const Context *rsc) {
-    int32_t id = rsc->mHal.funcs.allocation.initSurfaceTexture(rsc, this);
-    mHal.state.surfaceTextureID = id;
-    return id;
-}
-
-void Allocation::setSurfaceTexture(const Context *rsc, SurfaceTexture *st) {
-    if(st != mHal.state.surfaceTexture) {
-        if(mHal.state.surfaceTexture != NULL) {
-            mHal.state.surfaceTexture->decStrong(NULL);
-        }
-        mHal.state.surfaceTexture = st;
-        if(mHal.state.surfaceTexture != NULL) {
-            mHal.state.surfaceTexture->incStrong(NULL);
-        }
-    }
-}
-
-void Allocation::setSurface(const Context *rsc, RsNativeWindow sur) {
-    ANativeWindow *nw = (ANativeWindow *)sur;
-    ANativeWindow *old = mHal.state.wndSurface;
-    if (nw) {
-        nw->incStrong(NULL);
-    }
-    rsc->mHal.funcs.allocation.setSurfaceTexture(rsc, this, nw);
-    mHal.state.wndSurface = nw;
-    if (old) {
-        old->decStrong(NULL);
-    }
-}
-
-void Allocation::ioSend(const Context *rsc) {
-    rsc->mHal.funcs.allocation.ioSend(rsc, this);
-}
-
-void Allocation::ioReceive(const Context *rsc) {
-    rsc->mHal.funcs.allocation.ioReceive(rsc, this);
-}
-
-
-/////////////////
-//
-
-namespace android {
-namespace renderscript {
-
-static void AllocationGenerateScriptMips(RsContext con, RsAllocation va);
-
-static void mip565(const Adapter2D &out, const Adapter2D &in) {
-    uint32_t w = out.getDimX();
-    uint32_t h = out.getDimY();
-
-    for (uint32_t y=0; y < h; y++) {
-        uint16_t *oPtr = static_cast<uint16_t *>(out.getElement(0, y));
-        const uint16_t *i1 = static_cast<uint16_t *>(in.getElement(0, y*2));
-        const uint16_t *i2 = static_cast<uint16_t *>(in.getElement(0, y*2+1));
-
-        for (uint32_t x=0; x < w; x++) {
-            *oPtr = rsBoxFilter565(i1[0], i1[1], i2[0], i2[1]);
-            oPtr ++;
-            i1 += 2;
-            i2 += 2;
-        }
-    }
-}
-
-static void mip8888(const Adapter2D &out, const Adapter2D &in) {
-    uint32_t w = out.getDimX();
-    uint32_t h = out.getDimY();
-
-    for (uint32_t y=0; y < h; y++) {
-        uint32_t *oPtr = static_cast<uint32_t *>(out.getElement(0, y));
-        const uint32_t *i1 = static_cast<uint32_t *>(in.getElement(0, y*2));
-        const uint32_t *i2 = static_cast<uint32_t *>(in.getElement(0, y*2+1));
-
-        for (uint32_t x=0; x < w; x++) {
-            *oPtr = rsBoxFilter8888(i1[0], i1[1], i2[0], i2[1]);
-            oPtr ++;
-            i1 += 2;
-            i2 += 2;
-        }
-    }
-}
-
-static void mip8(const Adapter2D &out, const Adapter2D &in) {
-    uint32_t w = out.getDimX();
-    uint32_t h = out.getDimY();
-
-    for (uint32_t y=0; y < h; y++) {
-        uint8_t *oPtr = static_cast<uint8_t *>(out.getElement(0, y));
-        const uint8_t *i1 = static_cast<uint8_t *>(in.getElement(0, y*2));
-        const uint8_t *i2 = static_cast<uint8_t *>(in.getElement(0, y*2+1));
-
-        for (uint32_t x=0; x < w; x++) {
-            *oPtr = (uint8_t)(((uint32_t)i1[0] + i1[1] + i2[0] + i2[1]) * 0.25f);
-            oPtr ++;
-            i1 += 2;
-            i2 += 2;
-        }
-    }
-}
-
-static void mip(const Adapter2D &out, const Adapter2D &in) {
-    switch (out.getBaseType()->getElement()->getSizeBits()) {
-    case 32:
-        mip8888(out, in);
-        break;
-    case 16:
-        mip565(out, in);
-        break;
-    case 8:
-        mip8(out, in);
-        break;
-    }
-}
-
-void rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->sendDirty(rsc);
-    a->syncAll(rsc, src);
-}
-
-void rsi_AllocationGenerateMipmaps(Context *rsc, RsAllocation va) {
-    Allocation *texAlloc = static_cast<Allocation *>(va);
-    AllocationGenerateScriptMips(rsc, texAlloc);
-}
-
-void rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t dataLen) {
-    Allocation *texAlloc = static_cast<Allocation *>(va);
-    const Type * t = texAlloc->getType();
-
-    size_t s = t->getDimX() * t->getDimY() * t->getElementSizeBytes();
-    if (s != dataLen) {
-        rsc->setError(RS_ERROR_BAD_VALUE, "Bitmap size didn't match allocation size");
-        return;
-    }
-
-    memcpy(data, texAlloc->getPtr(), s);
-}
-
-void rsi_Allocation1DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod,
-                          uint32_t count, const void *data, size_t sizeBytes) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->data(rsc, xoff, lod, count, data, sizeBytes);
-}
-
-void rsi_Allocation2DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, uint32_t lod, RsAllocationCubemapFace face,
-                                 const void *data, size_t sizeBytes, size_t eoff) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->elementData(rsc, x, y, data, eoff, sizeBytes);
-}
-
-void rsi_Allocation1DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t lod,
-                                 const void *data, size_t sizeBytes, size_t eoff) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->elementData(rsc, x, data, eoff, sizeBytes);
-}
-
-void rsi_Allocation2DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
-                          uint32_t w, uint32_t h, const void *data, size_t sizeBytes) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes);
-}
-
-void rsi_AllocationRead(Context *rsc, RsAllocation va, void *data, size_t data_length) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->read(data);
-}
-
-void rsi_AllocationResize1D(Context *rsc, RsAllocation va, uint32_t dimX) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->resize1D(rsc, dimX);
-}
-
-void rsi_AllocationResize2D(Context *rsc, RsAllocation va, uint32_t dimX, uint32_t dimY) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->resize2D(rsc, dimX, dimY);
-}
-
-static void AllocationGenerateScriptMips(RsContext con, RsAllocation va) {
-    Context *rsc = static_cast<Context *>(con);
-    Allocation *texAlloc = static_cast<Allocation *>(va);
-    uint32_t numFaces = texAlloc->getType()->getDimFaces() ? 6 : 1;
-    for (uint32_t face = 0; face < numFaces; face ++) {
-        Adapter2D adapt(rsc, texAlloc);
-        Adapter2D adapt2(rsc, texAlloc);
-        adapt.setFace(face);
-        adapt2.setFace(face);
-        for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) {
-            adapt.setLOD(lod);
-            adapt2.setLOD(lod + 1);
-            mip(adapt2, adapt);
-        }
-    }
-}
-
-RsAllocation rsi_AllocationCreateTyped(Context *rsc, RsType vtype,
-                                       RsAllocationMipmapControl mips,
-                                       uint32_t usages, uint32_t ptr) {
-    Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips, (void *)ptr);
-    if (!alloc) {
-        return NULL;
-    }
-    alloc->incUserRef();
-    return alloc;
-}
-
-RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype,
-                                            RsAllocationMipmapControl mips,
-                                            const void *data, size_t data_length, uint32_t usages) {
-    Type *t = static_cast<Type *>(vtype);
-
-    RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0);
-    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
-    if (texAlloc == NULL) {
-        ALOGE("Memory allocation failure");
-        return NULL;
-    }
-
-    memcpy(texAlloc->getPtr(), data, t->getDimX() * t->getDimY() * t->getElementSizeBytes());
-    if (mips == RS_ALLOCATION_MIPMAP_FULL) {
-        AllocationGenerateScriptMips(rsc, texAlloc);
-    }
-
-    texAlloc->sendDirty(rsc);
-    return texAlloc;
-}
-
-RsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype,
-                                                RsAllocationMipmapControl mips,
-                                                const void *data, size_t data_length, uint32_t usages) {
-    Type *t = static_cast<Type *>(vtype);
-
-    // Cubemap allocation's faces should be Width by Width each.
-    // Source data should have 6 * Width by Width pixels
-    // Error checking is done in the java layer
-    RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0);
-    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
-    if (texAlloc == NULL) {
-        ALOGE("Memory allocation failure");
-        return NULL;
-    }
-
-    uint32_t faceSize = t->getDimX();
-    uint32_t strideBytes = faceSize * 6 * t->getElementSizeBytes();
-    uint32_t copySize = faceSize * t->getElementSizeBytes();
-
-    uint8_t *sourcePtr = (uint8_t*)data;
-    for (uint32_t face = 0; face < 6; face ++) {
-        Adapter2D faceAdapter(rsc, texAlloc);
-        faceAdapter.setFace(face);
-
-        for (uint32_t dI = 0; dI < faceSize; dI ++) {
-            memcpy(faceAdapter.getElement(0, dI), sourcePtr + strideBytes * dI, copySize);
-        }
-
-        // Move the data pointer to the next cube face
-        sourcePtr += copySize;
-    }
-
-    if (mips == RS_ALLOCATION_MIPMAP_FULL) {
-        AllocationGenerateScriptMips(rsc, texAlloc);
-    }
-
-    texAlloc->sendDirty(rsc);
-    return texAlloc;
-}
-
-void rsi_AllocationCopy2DRange(Context *rsc,
-                               RsAllocation dstAlloc,
-                               uint32_t dstXoff, uint32_t dstYoff,
-                               uint32_t dstMip, uint32_t dstFace,
-                               uint32_t width, uint32_t height,
-                               RsAllocation srcAlloc,
-                               uint32_t srcXoff, uint32_t srcYoff,
-                               uint32_t srcMip, uint32_t srcFace) {
-    Allocation *dst = static_cast<Allocation *>(dstAlloc);
-    Allocation *src= static_cast<Allocation *>(srcAlloc);
-    rsc->mHal.funcs.allocation.allocData2D(rsc, dst, dstXoff, dstYoff, dstMip,
-                                           (RsAllocationCubemapFace)dstFace,
-                                           width, height,
-                                           src, srcXoff, srcYoff,srcMip,
-                                           (RsAllocationCubemapFace)srcFace);
-}
-
-int32_t rsi_AllocationGetSurfaceTextureID(Context *rsc, RsAllocation valloc) {
-    Allocation *alloc = static_cast<Allocation *>(valloc);
-    return alloc->getSurfaceTextureID(rsc);
-}
-
-void rsi_AllocationGetSurfaceTextureID2(Context *rsc, RsAllocation valloc, void *vst, size_t len) {
-    Allocation *alloc = static_cast<Allocation *>(valloc);
-    alloc->setSurfaceTexture(rsc, static_cast<SurfaceTexture *>(vst));
-}
-
-void rsi_AllocationSetSurface(Context *rsc, RsAllocation valloc, RsNativeWindow sur) {
-    Allocation *alloc = static_cast<Allocation *>(valloc);
-    alloc->setSurface(rsc, sur);
-}
-
-void rsi_AllocationIoSend(Context *rsc, RsAllocation valloc) {
-    Allocation *alloc = static_cast<Allocation *>(valloc);
-    alloc->ioSend(rsc);
-}
-
-void rsi_AllocationIoReceive(Context *rsc, RsAllocation valloc) {
-    Allocation *alloc = static_cast<Allocation *>(valloc);
-    alloc->ioReceive(rsc);
-}
-
-}
-}
-
-const void * rsaAllocationGetType(RsContext con, RsAllocation va) {
-    Allocation *a = static_cast<Allocation *>(va);
-    a->getType()->incUserRef();
-
-    return a->getType();
-}
diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h
deleted file mode 100644
index e2783d2..0000000
--- a/libs/rs/rsAllocation.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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.
- */
-
-#ifndef ANDROID_STRUCTURED_ALLOCATION_H
-#define ANDROID_STRUCTURED_ALLOCATION_H
-
-#include "rsType.h"
-
-struct ANativeWindow;
-
-// ---------------------------------------------------------------------------
-namespace android {
-class SurfaceTexture;
-
-namespace renderscript {
-
-class Program;
-
-/*****************************************************************************
- * CAUTION
- *
- * Any layout changes for this class may require a corresponding change to be
- * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
- * a partial copy of the information below.
- *
- *****************************************************************************/
-class Allocation : public ObjectBase {
-    // The graphics equivalent of malloc.  The allocation contains a structure of elements.
-
-public:
-    struct Hal {
-        void * drv;
-
-        struct State {
-            const Type * type;
-
-            uint32_t usageFlags;
-            RsAllocationMipmapControl mipmapControl;
-
-            // Cached fields from the Type and Element
-            // to prevent pointer chasing in critical loops.
-            uint32_t dimensionX;
-            uint32_t dimensionY;
-            uint32_t dimensionZ;
-            uint32_t elementSizeBytes;
-            bool hasMipmaps;
-            bool hasFaces;
-            bool hasReferences;
-            void * usrPtr;
-            int32_t surfaceTextureID;
-            ANativeWindow *wndSurface;
-            SurfaceTexture *surfaceTexture;
-        };
-        State state;
-
-        struct DrvState {
-            void * mallocPtr;
-        } drvState;
-
-    };
-    Hal mHal;
-
-    static Allocation * createAllocation(Context *rsc, const Type *, uint32_t usages,
-                                         RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE,
-                                         void *ptr = 0);
-    virtual ~Allocation();
-    void updateCache();
-
-    void * getPtr() const {return mHal.drvState.mallocPtr;}
-    const Type * getType() const {return mHal.state.type;}
-
-    void syncAll(Context *rsc, RsAllocationUsageType src);
-
-    void copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len);
-
-    void resize1D(Context *rsc, uint32_t dimX);
-    void resize2D(Context *rsc, uint32_t dimX, uint32_t dimY);
-
-    void data(Context *rsc, uint32_t xoff, uint32_t lod, uint32_t count, const void *data, size_t sizeBytes);
-    void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
-                 uint32_t w, uint32_t h, const void *data, size_t sizeBytes);
-    void data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, RsAllocationCubemapFace face,
-                 uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes);
-
-    void elementData(Context *rsc, uint32_t x,
-                     const void *data, uint32_t elementOff, size_t sizeBytes);
-    void elementData(Context *rsc, uint32_t x, uint32_t y,
-                     const void *data, uint32_t elementOff, size_t sizeBytes);
-
-    void read(void *data);
-
-    void addProgramToDirty(const Program *);
-    void removeProgramToDirty(const Program *);
-
-    virtual void dumpLOGV(const char *prefix) const;
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ALLOCATION; }
-    static Allocation *createFromStream(Context *rsc, IStream *stream);
-
-    bool getIsScript() const {
-        return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_SCRIPT) != 0;
-    }
-    bool getIsTexture() const {
-        return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE) != 0;
-    }
-    bool getIsRenderTarget() const {
-        return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET) != 0;
-    }
-    bool getIsBufferObject() const {
-        return (mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_VERTEX) != 0;
-    }
-
-    void incRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
-    void decRefs(const void *ptr, size_t ct, size_t startOff = 0) const;
-    virtual bool freeChildren();
-
-    void sendDirty(const Context *rsc) const;
-    bool getHasGraphicsMipmaps() const {
-        return mHal.state.mipmapControl != RS_ALLOCATION_MIPMAP_NONE;
-    }
-
-    int32_t getSurfaceTextureID(const Context *rsc);
-    void setSurfaceTexture(const Context *rsc, SurfaceTexture *st);
-    void setSurface(const Context *rsc, RsNativeWindow sur);
-    void ioSend(const Context *rsc);
-    void ioReceive(const Context *rsc);
-
-protected:
-    Vector<const Program *> mToDirtyList;
-    ObjectBaseRef<const Type> mType;
-    void setType(const Type *t) {
-        mType.set(t);
-        mHal.state.type = t;
-    }
-
-private:
-    void freeChildrenUnlocked();
-    Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc, void *ptr);
-
-    uint32_t getPackedSize() const;
-    static void writePackedData(const Type *type, uint8_t *dst, const uint8_t *src, bool dstPadded);
-    void unpackVec3Allocation(const void *data, size_t dataSize);
-    void packVec3Allocation(OStream *stream) const;
-};
-
-}
-}
-#endif
-
diff --git a/libs/rs/rsAnimation.cpp b/libs/rs/rsAnimation.cpp
deleted file mode 100644
index a4093d9..0000000
--- a/libs/rs/rsAnimation.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsAnimation.h"
-
-
-using namespace android;
-using namespace android::renderscript;
-
-void Animation::serialize(OStream *stream) const {
-}
-
-Animation *Animation::createFromStream(Context *rsc, IStream *stream) {
-    return NULL;
-}
-
-/*
-Animation::Animation(Context *rsc) : ObjectBase(rsc)
-{
-    mAllocFile = __FILE__;
-    mAllocLine = __LINE__;
-
-    mValuesInput = NULL;
-    mValuesOutput = NULL;
-    mValueCount = 0;
-    mInterpolation = RS_ANIMATION_INTERPOLATION_STEP;
-    mEdgePre = RS_ANIMATION_EDGE_UNDEFINED;
-    mEdgePost = RS_ANIMATION_EDGE_UNDEFINED;
-    mInputMin = 0;
-    mInputMax = 0;
-}
-
-Animation * Animation::create(Context *rsc,
-                              const float *inValues, const float *outValues,
-                              uint32_t valueCount, RsAnimationInterpolation interp,
-                              RsAnimationEdge pre, RsAnimationEdge post)
-{
-    if (valueCount < 2) {
-        rsc->setError(RS_ERROR_BAD_VALUE, "Animations require more than 2 values.");
-        return NULL;
-    }
-    Animation *a = new Animation(rsc);
-    if (!a) {
-        rsc->setError(RS_ERROR_OUT_OF_MEMORY);
-        return NULL;
-    }
-
-    float *vin = (float *)malloc(valueCount * sizeof(float));
-    float *vout = (float *)malloc(valueCount * sizeof(float));
-    a->mValuesInput = vin;
-    a->mValuesOutput = vout;
-    if (a->mValuesInput == NULL || a->mValuesOutput == NULL) {
-        delete a;
-        rsc->setError(RS_ERROR_OUT_OF_MEMORY);
-        return NULL;
-    }
-
-    a->mEdgePre = pre;
-    a->mEdgePost = post;
-    a->mInterpolation = interp;
-    a->mValueCount = valueCount;
-
-    memcpy(vin, inValues, valueCount * sizeof(float));
-    memcpy(vout, outValues, valueCount * sizeof(float));
-    a->mInputMin = inValues[0];
-    a->mInputMax = inValues[0];
-
-    bool needSort = false;
-    for (uint32_t ct=1; ct < valueCount; ct++) {
-        if (a->mInputMin > vin[ct]) {
-            needSort = true;
-            a->mInputMin = vin[ct];
-        }
-        if (a->mInputMax < vin[ct]) {
-            a->mInputMax = vin[ct];
-        } else {
-            needSort = true;
-        }
-    }
-
-    while (1) {
-        bool changed = false;
-        for (uint32_t ct=1; ct < valueCount; ct++) {
-            if (vin[ct-1] > vin[ct]) {
-                float t = vin[ct-1];
-                vin[ct-1] = vin[ct];
-                vin[ct] = t;
-                t = vout[ct-1];
-                vout[ct-1] = vout[ct];
-                vout[ct] = t;
-                changed = true;
-            }
-        }
-        if (!changed) break;
-    }
-
-    return a;
-}
-*/
-
-
-/////////////////////////////////////////
-//
-
-namespace android {
-namespace renderscript {
-
-RsAnimation rsi_AnimationCreate(Context *rsc,
-                                const float *inValues,
-                                const float *outValues,
-                                uint32_t valueCount,
-                                RsAnimationInterpolation interp,
-                                RsAnimationEdge pre,
-                                RsAnimationEdge post) {
-    //ALOGE("rsi_ElementCreate %i %i %i %i", dt, dk, norm, vecSize);
-    Animation *a = NULL;//Animation::create(rsc, inValues, outValues, valueCount, interp, pre, post);
-    if (a != NULL) {
-        a->incUserRef();
-    }
-    return (RsAnimation)a;
-}
-
-
-}
-}
-
diff --git a/libs/rs/rsAnimation.h b/libs/rs/rsAnimation.h
deleted file mode 100644
index 526a081..0000000
--- a/libs/rs/rsAnimation.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_ANIMATION_H
-#define ANDROID_RS_ANIMATION_H
-
-#include "rsUtils.h"
-#include "rsObjectBase.h"
-#include "rsDefines.h"
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-
-class Animation : public ObjectBase {
-public:
-    ~Animation();
-
-    static Animation * create(Context *rsc,
-                              const float *inValues, const float *outValues,
-                              uint32_t valueCount, RsAnimationInterpolation,
-                              RsAnimationEdge pre, RsAnimationEdge post);
-
-    float eval(float) const;
-
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ANIMATION; }
-    static Animation *createFromStream(Context *rsc, IStream *stream);
-
-protected:
-    Animation(Context *rsc);
-
-
-
-    float evalInRange(float) const;
-
-
-
-    const float *mValuesInput;
-    const float *mValuesOutput;
-    uint32_t mValueCount;
-    RsAnimationInterpolation mInterpolation;
-    RsAnimationEdge mEdgePre;
-    RsAnimationEdge mEdgePost;
-
-    // derived
-    float mInputMin;
-    float mInputMax;
-};
-
-}
-}
-#endif //ANDROID_STRUCTURED_ELEMENT_H
-
diff --git a/libs/rs/rsComponent.cpp b/libs/rs/rsComponent.cpp
deleted file mode 100644
index 9c2c200..0000000
--- a/libs/rs/rsComponent.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsComponent.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-Component::Component() {
-    set(RS_TYPE_NONE, RS_KIND_USER, false, 1);
-}
-
-Component::~Component() {
-}
-
-void Component::set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize) {
-    mType = dt;
-    mKind = dk;
-    mNormalized = norm;
-    mVectorSize = vecSize;
-    rsAssert(vecSize <= 4);
-
-    mBits = 0;
-    mTypeBits = 0;
-    mIsFloat = false;
-    mIsSigned = false;
-    mIsPixel = false;
-
-    switch (mKind) {
-    case RS_KIND_PIXEL_L:
-    case RS_KIND_PIXEL_A:
-        mIsPixel = true;
-        rsAssert(mVectorSize == 1);
-        rsAssert(mNormalized == true);
-        break;
-    case RS_KIND_PIXEL_LA:
-        mIsPixel = true;
-        rsAssert(mVectorSize == 2);
-        rsAssert(mNormalized == true);
-        break;
-    case RS_KIND_PIXEL_RGB:
-        mIsPixel = true;
-        rsAssert(mVectorSize == 3);
-        rsAssert(mNormalized == true);
-        break;
-    case RS_KIND_PIXEL_RGBA:
-        mIsPixel = true;
-        rsAssert(mVectorSize == 4);
-        rsAssert(mNormalized == true);
-        break;
-    default:
-        rsAssert(mKind != RS_KIND_INVALID);
-        break;
-    }
-
-    switch (mType) {
-    case RS_TYPE_NONE:
-        return;
-    case RS_TYPE_UNSIGNED_5_6_5:
-        mVectorSize = 3;
-        mBits = 16;
-        mNormalized = true;
-        rsAssert(mKind == RS_KIND_PIXEL_RGB);
-        return;
-    case RS_TYPE_UNSIGNED_5_5_5_1:
-        mVectorSize = 4;
-        mBits = 16;
-        mNormalized = true;
-        rsAssert(mKind == RS_KIND_PIXEL_RGBA);
-        return;
-    case RS_TYPE_UNSIGNED_4_4_4_4:
-        mVectorSize = 4;
-        mBits = 16;
-        mNormalized = true;
-        rsAssert(mKind == RS_KIND_PIXEL_RGBA);
-        return;
-
-    case RS_TYPE_MATRIX_4X4:
-        mTypeBits = 16 * 32;
-        rsAssert(mVectorSize == 1);
-        rsAssert(mNormalized == false);
-        rsAssert(mKind == RS_KIND_USER);
-        break;
-    case RS_TYPE_MATRIX_3X3:
-        mTypeBits = 9 * 32;
-        rsAssert(mVectorSize == 1);
-        rsAssert(mNormalized == false);
-        rsAssert(mKind == RS_KIND_USER);
-        break;
-    case RS_TYPE_MATRIX_2X2:
-        mTypeBits = 4 * 32;
-        rsAssert(mVectorSize == 1);
-        rsAssert(mNormalized == false);
-        rsAssert(mKind == RS_KIND_USER);
-        break;
-
-    case RS_TYPE_ELEMENT:
-    case RS_TYPE_TYPE:
-    case RS_TYPE_ALLOCATION:
-    case RS_TYPE_SAMPLER:
-    case RS_TYPE_SCRIPT:
-    case RS_TYPE_MESH:
-    case RS_TYPE_PROGRAM_FRAGMENT:
-    case RS_TYPE_PROGRAM_VERTEX:
-    case RS_TYPE_PROGRAM_RASTER:
-    case RS_TYPE_PROGRAM_STORE:
-        rsAssert(mVectorSize == 1);
-        rsAssert(mNormalized == false);
-        rsAssert(mKind == RS_KIND_USER);
-        mBits = 32;
-        mTypeBits = 32;
-        return;
-
-    case RS_TYPE_FLOAT_16:
-        mTypeBits = 16;
-        mIsFloat = true;
-        break;
-    case RS_TYPE_FLOAT_32:
-        mTypeBits = 32;
-        mIsFloat = true;
-        break;
-    case RS_TYPE_FLOAT_64:
-        mTypeBits = 64;
-        mIsFloat = true;
-        break;
-    case RS_TYPE_SIGNED_8:
-        mTypeBits = 8;
-        mIsSigned = true;
-        break;
-    case RS_TYPE_SIGNED_16:
-        mTypeBits = 16;
-        mIsSigned = true;
-        break;
-    case RS_TYPE_SIGNED_32:
-        mTypeBits = 32;
-        mIsSigned = true;
-        break;
-    case RS_TYPE_SIGNED_64:
-        mTypeBits = 64;
-        mIsSigned = true;
-        break;
-    case RS_TYPE_UNSIGNED_8:
-        mTypeBits = 8;
-        break;
-    case RS_TYPE_UNSIGNED_16:
-        mTypeBits = 16;
-        break;
-    case RS_TYPE_UNSIGNED_32:
-        mTypeBits = 32;
-        break;
-    case RS_TYPE_UNSIGNED_64:
-        mTypeBits = 64;
-        break;
-
-    case RS_TYPE_BOOLEAN:
-        mTypeBits = 8;
-        break;
-    default:
-        rsAssert(mType != RS_TYPE_INVALID);
-        break;
-    }
-
-    mBitsUnpadded = mTypeBits * mVectorSize;
-    mBits = mTypeBits * rsHigherPow2(mVectorSize);
-}
-
-bool Component::isReference() const {
-    return (mType >= RS_TYPE_ELEMENT);
-}
-
-static const char * gTypeBasicStrings[] = {
-    "NONE",
-    "F16",
-    "F32",
-    "F64",
-    "S8",
-    "S16",
-    "S32",
-    "S64",
-    "U8",
-    "U16",
-    "U32",
-    "U64",
-    "BOOLEAN",
-    "UP_565",
-    "UP_5551",
-    "UP_4444",
-    "MATRIX_4X4",
-    "MATRIX_3X3",
-    "MATRIX_2X2",
-};
-
-static const char * gTypeObjStrings[] = {
-    "ELEMENT",
-    "TYPE",
-    "ALLOCATION",
-    "SAMPLER",
-    "SCRIPT",
-    "MESH",
-    "PROGRAM_FRAGMENT",
-    "PROGRAM_VERTEX",
-    "PROGRAM_RASTER",
-    "PROGRAM_STORE",
-};
-
-static const char * gKindStrings[] = {
-    "USER",
-    "COLOR",
-    "POSITION",
-    "TEXTURE",
-    "NORMAL",
-    "INDEX",
-    "POINT_SIZE",
-    "PIXEL_L",
-    "PIXEL_A",
-    "PIXEL_LA",
-    "PIXEL_RGB",
-    "PIXEL_RGBA",
-};
-
-void Component::dumpLOGV(const char *prefix) const {
-    if (mType >= RS_TYPE_ELEMENT) {
-        ALOGV("%s   Component: %s, %s, vectorSize=%i, bits=%i",
-             prefix, gTypeObjStrings[mType - RS_TYPE_ELEMENT], gKindStrings[mKind], mVectorSize, mBits);
-    } else {
-        ALOGV("%s   Component: %s, %s, vectorSize=%i, bits=%i",
-             prefix, gTypeBasicStrings[mType], gKindStrings[mKind], mVectorSize, mBits);
-    }
-}
-
-void Component::serialize(OStream *stream) const {
-    stream->addU8((uint8_t)mType);
-    stream->addU8((uint8_t)mKind);
-    stream->addU8((uint8_t)(mNormalized ? 1 : 0));
-    stream->addU32(mVectorSize);
-}
-
-void Component::loadFromStream(IStream *stream) {
-    mType = (RsDataType)stream->loadU8();
-    mKind = (RsDataKind)stream->loadU8();
-    uint8_t temp = stream->loadU8();
-    mNormalized = temp != 0;
-    mVectorSize = stream->loadU32();
-
-    set(mType, mKind, mNormalized, mVectorSize);
-}
-
-
-
-
diff --git a/libs/rs/rsComponent.h b/libs/rs/rsComponent.h
deleted file mode 100644
index a2e8c0f..0000000
--- a/libs/rs/rsComponent.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_COMPONENT_H
-#define ANDROID_COMPONENT_H
-
-#include "rsUtils.h"
-#include "rsDefines.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-
-// An element is a group of Components that occupies one cell in a structure.
-class Component {
-public:
-    Component();
-    ~Component();
-
-    void set(RsDataType dt, RsDataKind dk, bool norm, uint32_t vecSize=1);
-
-    void dumpLOGV(const char *prefix) const;
-
-    RsDataType getType() const {return mType;}
-    RsDataKind getKind() const {return mKind;}
-    bool getIsNormalized() const {return mNormalized;}
-    uint32_t getVectorSize() const {return mVectorSize;}
-    bool getIsFloat() const {return mIsFloat;}
-    bool getIsSigned() const {return mIsSigned;}
-    uint32_t getBits() const {return mBits;}
-    uint32_t getBitsUnpadded() const {return mBitsUnpadded;}
-
-    // Helpers for reading / writing this class out
-    void serialize(OStream *stream) const;
-    void loadFromStream(IStream *stream);
-
-    bool isReference() const;
-
-protected:
-    RsDataType mType;
-    RsDataKind mKind;
-    bool mNormalized;
-    uint32_t mVectorSize;
-
-    // derived
-    uint32_t mBits;
-    uint32_t mBitsUnpadded;
-    uint32_t mTypeBits;
-    bool mIsFloat;
-    bool mIsSigned;
-    bool mIsPixel;
-};
-
-}
-}
-
-#endif
-
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
deleted file mode 100644
index 5e21763..0000000
--- a/libs/rs/rsContext.cpp
+++ /dev/null
@@ -1,770 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rs.h"
-#include "rsDevice.h"
-#include "rsContext.h"
-#include "rsThreadIO.h"
-#include "rsMesh.h"
-#include <ui/FramebufferNativeWindow.h>
-#include <gui/DisplayEventReceiver.h>
-
-#include <sys/types.h>
-#include <sys/resource.h>
-#include <sched.h>
-
-#include <cutils/properties.h>
-
-#include <sys/syscall.h>
-#include <string.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-pthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER;
-pthread_mutex_t Context::gLibMutex = PTHREAD_MUTEX_INITIALIZER;
-
-bool Context::initGLThread() {
-    pthread_mutex_lock(&gInitMutex);
-
-    if (!mHal.funcs.initGraphics(this)) {
-        pthread_mutex_unlock(&gInitMutex);
-        ALOGE("%p initGraphics failed", this);
-        return false;
-    }
-
-    pthread_mutex_unlock(&gInitMutex);
-    return true;
-}
-
-void Context::deinitEGL() {
-    mHal.funcs.shutdownGraphics(this);
-}
-
-Context::PushState::PushState(Context *con) {
-    mRsc = con;
-    if (con->mIsGraphicsContext) {
-        mFragment.set(con->getProgramFragment());
-        mVertex.set(con->getProgramVertex());
-        mStore.set(con->getProgramStore());
-        mRaster.set(con->getProgramRaster());
-        mFont.set(con->getFont());
-    }
-}
-
-Context::PushState::~PushState() {
-    if (mRsc->mIsGraphicsContext) {
-        mRsc->setProgramFragment(mFragment.get());
-        mRsc->setProgramVertex(mVertex.get());
-        mRsc->setProgramStore(mStore.get());
-        mRsc->setProgramRaster(mRaster.get());
-        mRsc->setFont(mFont.get());
-    }
-}
-
-
-uint32_t Context::runScript(Script *s) {
-    PushState(this);
-
-    uint32_t ret = s->run(this);
-    return ret;
-}
-
-uint32_t Context::runRootScript() {
-    timerSet(RS_TIMER_SCRIPT);
-    mStateFragmentStore.mLast.clear();
-    watchdog.inRoot = true;
-    uint32_t ret = runScript(mRootScript.get());
-    watchdog.inRoot = false;
-
-    return ret;
-}
-
-uint64_t Context::getTime() const {
-#ifndef ANDROID_RS_SERIALIZE
-    struct timespec t;
-    clock_gettime(CLOCK_MONOTONIC, &t);
-    return t.tv_nsec + ((uint64_t)t.tv_sec * 1000 * 1000 * 1000);
-#else
-    return 0;
-#endif //ANDROID_RS_SERIALIZE
-}
-
-void Context::timerReset() {
-    for (int ct=0; ct < _RS_TIMER_TOTAL; ct++) {
-        mTimers[ct] = 0;
-    }
-}
-
-void Context::timerInit() {
-    mTimeLast = getTime();
-    mTimeFrame = mTimeLast;
-    mTimeLastFrame = mTimeLast;
-    mTimerActive = RS_TIMER_INTERNAL;
-    mAverageFPSFrameCount = 0;
-    mAverageFPSStartTime = mTimeLast;
-    mAverageFPS = 0;
-    timerReset();
-}
-
-void Context::timerFrame() {
-    mTimeLastFrame = mTimeFrame;
-    mTimeFrame = getTime();
-    // Update average fps
-    const uint64_t averageFramerateInterval = 1000 * 1000000;
-    mAverageFPSFrameCount ++;
-    uint64_t inverval = mTimeFrame - mAverageFPSStartTime;
-    if (inverval >= averageFramerateInterval) {
-        inverval = inverval / 1000000;
-        mAverageFPS = (mAverageFPSFrameCount * 1000) / inverval;
-        mAverageFPSFrameCount = 0;
-        mAverageFPSStartTime = mTimeFrame;
-    }
-}
-
-void Context::timerSet(Timers tm) {
-    uint64_t last = mTimeLast;
-    mTimeLast = getTime();
-    mTimers[mTimerActive] += mTimeLast - last;
-    mTimerActive = tm;
-}
-
-void Context::timerPrint() {
-    double total = 0;
-    for (int ct = 0; ct < _RS_TIMER_TOTAL; ct++) {
-        total += mTimers[ct];
-    }
-    uint64_t frame = mTimeFrame - mTimeLastFrame;
-    mTimeMSLastFrame = frame / 1000000;
-    mTimeMSLastScript = mTimers[RS_TIMER_SCRIPT] / 1000000;
-    mTimeMSLastSwap = mTimers[RS_TIMER_CLEAR_SWAP] / 1000000;
-
-
-    if (props.mLogTimes) {
-        ALOGV("RS: Frame (%i),   Script %2.1f%% (%i),  Swap %2.1f%% (%i),  Idle %2.1f%% (%lli),  Internal %2.1f%% (%lli), Avg fps: %u",
-             mTimeMSLastFrame,
-             100.0 * mTimers[RS_TIMER_SCRIPT] / total, mTimeMSLastScript,
-             100.0 * mTimers[RS_TIMER_CLEAR_SWAP] / total, mTimeMSLastSwap,
-             100.0 * mTimers[RS_TIMER_IDLE] / total, mTimers[RS_TIMER_IDLE] / 1000000,
-             100.0 * mTimers[RS_TIMER_INTERNAL] / total, mTimers[RS_TIMER_INTERNAL] / 1000000,
-             mAverageFPS);
-    }
-}
-
-bool Context::setupCheck() {
-
-    mFragmentStore->setup(this, &mStateFragmentStore);
-    mFragment->setup(this, &mStateFragment);
-    mRaster->setup(this, &mStateRaster);
-    mVertex->setup(this, &mStateVertex);
-    mFBOCache.setup(this);
-    return true;
-}
-
-void Context::setupProgramStore() {
-    mFragmentStore->setup(this, &mStateFragmentStore);
-}
-
-static uint32_t getProp(const char *str) {
-    char buf[PROPERTY_VALUE_MAX];
-    property_get(str, buf, "0");
-    return atoi(buf);
-}
-
-void Context::displayDebugStats() {
-    char buffer[128];
-    sprintf(buffer, "Avg fps %u, Frame %i ms, Script %i ms", mAverageFPS, mTimeMSLastFrame, mTimeMSLastScript);
-    float oldR, oldG, oldB, oldA;
-    mStateFont.getFontColor(&oldR, &oldG, &oldB, &oldA);
-    uint32_t bufferLen = strlen(buffer);
-
-    ObjectBaseRef<Font> lastFont(getFont());
-    setFont(NULL);
-    float shadowCol = 0.1f;
-    mStateFont.setFontColor(shadowCol, shadowCol, shadowCol, 1.0f);
-    mStateFont.renderText(buffer, bufferLen, 5, getHeight() - 6);
-
-    mStateFont.setFontColor(1.0f, 0.7f, 0.0f, 1.0f);
-    mStateFont.renderText(buffer, bufferLen, 4, getHeight() - 7);
-
-    setFont(lastFont.get());
-    mStateFont.setFontColor(oldR, oldG, oldB, oldA);
-}
-
-void * Context::threadProc(void *vrsc) {
-    Context *rsc = static_cast<Context *>(vrsc);
-#ifndef ANDROID_RS_SERIALIZE
-    rsc->mNativeThreadId = gettid();
-    setpriority(PRIO_PROCESS, rsc->mNativeThreadId, ANDROID_PRIORITY_DISPLAY);
-    rsc->mThreadPriority = ANDROID_PRIORITY_DISPLAY;
-#endif //ANDROID_RS_SERIALIZE
-    rsc->props.mLogTimes = getProp("debug.rs.profile") != 0;
-    rsc->props.mLogScripts = getProp("debug.rs.script") != 0;
-    rsc->props.mLogObjects = getProp("debug.rs.object") != 0;
-    rsc->props.mLogShaders = getProp("debug.rs.shader") != 0;
-    rsc->props.mLogShadersAttr = getProp("debug.rs.shader.attributes") != 0;
-    rsc->props.mLogShadersUniforms = getProp("debug.rs.shader.uniforms") != 0;
-    rsc->props.mLogVisual = getProp("debug.rs.visual") != 0;
-    rsc->props.mDebugMaxThreads = getProp("debug.rs.max-threads");
-
-    if (!rsdHalInit(rsc, 0, 0)) {
-        rsc->setError(RS_ERROR_FATAL_DRIVER, "Failed initializing GL");
-        ALOGE("Hal init failed");
-        return NULL;
-    }
-    rsc->mHal.funcs.setPriority(rsc, rsc->mThreadPriority);
-
-    if (rsc->mIsGraphicsContext) {
-        if (!rsc->initGLThread()) {
-            rsc->setError(RS_ERROR_OUT_OF_MEMORY, "Failed initializing GL");
-            return NULL;
-        }
-
-        rsc->mStateRaster.init(rsc);
-        rsc->setProgramRaster(NULL);
-        rsc->mStateVertex.init(rsc);
-        rsc->setProgramVertex(NULL);
-        rsc->mStateFragment.init(rsc);
-        rsc->setProgramFragment(NULL);
-        rsc->mStateFragmentStore.init(rsc);
-        rsc->setProgramStore(NULL);
-        rsc->mStateFont.init(rsc);
-        rsc->setFont(NULL);
-        rsc->mStateSampler.init(rsc);
-        rsc->mFBOCache.init(rsc);
-    }
-
-    rsc->mRunning = true;
-    if (!rsc->mIsGraphicsContext) {
-        while (!rsc->mExit) {
-            rsc->mIO.playCoreCommands(rsc, -1);
-        }
-    } else {
-#ifndef ANDROID_RS_SERIALIZE
-        DisplayEventReceiver displayEvent;
-        DisplayEventReceiver::Event eventBuffer[1];
-#endif
-        int vsyncRate = 0;
-        int targetRate = 0;
-
-        bool drawOnce = false;
-        while (!rsc->mExit) {
-            rsc->timerSet(RS_TIMER_IDLE);
-
-#ifndef ANDROID_RS_SERIALIZE
-            if (!rsc->mRootScript.get() || !rsc->mHasSurface || rsc->mPaused) {
-                targetRate = 0;
-            }
-
-            if (vsyncRate != targetRate) {
-                displayEvent.setVsyncRate(targetRate);
-                vsyncRate = targetRate;
-            }
-            if (targetRate) {
-                drawOnce |= rsc->mIO.playCoreCommands(rsc, displayEvent.getFd());
-                while (displayEvent.getEvents(eventBuffer, 1) != 0) {
-                    //ALOGE("vs2 time past %lld", (rsc->getTime() - eventBuffer[0].header.timestamp) / 1000000);
-                }
-            } else
-#endif
-            {
-                drawOnce |= rsc->mIO.playCoreCommands(rsc, -1);
-            }
-
-            if ((rsc->mRootScript.get() != NULL) && rsc->mHasSurface &&
-                (targetRate || drawOnce) && !rsc->mPaused) {
-
-                drawOnce = false;
-                targetRate = ((rsc->runRootScript() + 15) / 16);
-
-                if (rsc->props.mLogVisual) {
-                    rsc->displayDebugStats();
-                }
-
-                rsc->timerSet(RS_TIMER_CLEAR_SWAP);
-                rsc->mHal.funcs.swap(rsc);
-                rsc->timerFrame();
-                rsc->timerSet(RS_TIMER_INTERNAL);
-                rsc->timerPrint();
-                rsc->timerReset();
-            }
-        }
-    }
-
-    ALOGV("%p RS Thread exiting", rsc);
-
-    if (rsc->mIsGraphicsContext) {
-        pthread_mutex_lock(&gInitMutex);
-        rsc->deinitEGL();
-        pthread_mutex_unlock(&gInitMutex);
-    }
-
-    ALOGV("%p RS Thread exited", rsc);
-    return NULL;
-}
-
-void Context::destroyWorkerThreadResources() {
-    //ALOGV("destroyWorkerThreadResources 1");
-    ObjectBase::zeroAllUserRef(this);
-    if (mIsGraphicsContext) {
-         mRaster.clear();
-         mFragment.clear();
-         mVertex.clear();
-         mFragmentStore.clear();
-         mFont.clear();
-         mRootScript.clear();
-         mStateRaster.deinit(this);
-         mStateVertex.deinit(this);
-         mStateFragment.deinit(this);
-         mStateFragmentStore.deinit(this);
-         mStateFont.deinit(this);
-         mStateSampler.deinit(this);
-         mFBOCache.deinit(this);
-    }
-    ObjectBase::freeAllChildren(this);
-    mExit = true;
-    //ALOGV("destroyWorkerThreadResources 2");
-}
-
-void Context::printWatchdogInfo(void *ctx) {
-    Context *rsc = (Context *)ctx;
-    if (rsc->watchdog.command && rsc->watchdog.file) {
-        ALOGE("RS watchdog timeout: %i  %s  line %i %s", rsc->watchdog.inRoot,
-             rsc->watchdog.command, rsc->watchdog.line, rsc->watchdog.file);
-    } else {
-        ALOGE("RS watchdog timeout: %i", rsc->watchdog.inRoot);
-    }
-}
-
-
-void Context::setPriority(int32_t p) {
-    // Note: If we put this in the proper "background" policy
-    // the wallpapers can become completly unresponsive at times.
-    // This is probably not what we want for something the user is actively
-    // looking at.
-    mThreadPriority = p;
-    setpriority(PRIO_PROCESS, mNativeThreadId, p);
-    mHal.funcs.setPriority(this, mThreadPriority);
-}
-
-Context::Context() {
-    mDev = NULL;
-    mRunning = false;
-    mExit = false;
-    mPaused = false;
-    mObjHead = NULL;
-    mError = RS_ERROR_NONE;
-    mTargetSdkVersion = 14;
-    mDPI = 96;
-    mIsContextLite = false;
-    memset(&watchdog, 0, sizeof(watchdog));
-}
-
-Context * Context::createContext(Device *dev, const RsSurfaceConfig *sc) {
-    Context * rsc = new Context();
-
-    if (!rsc->initContext(dev, sc)) {
-        delete rsc;
-        return NULL;
-    }
-    return rsc;
-}
-
-Context * Context::createContextLite() {
-    Context * rsc = new Context();
-    rsc->mIsContextLite = true;
-    return rsc;
-}
-
-bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) {
-    pthread_mutex_lock(&gInitMutex);
-
-    mIO.init();
-    mIO.setTimeoutCallback(printWatchdogInfo, this, 2e9);
-
-    dev->addContext(this);
-    mDev = dev;
-    if (sc) {
-        mUserSurfaceConfig = *sc;
-    } else {
-        memset(&mUserSurfaceConfig, 0, sizeof(mUserSurfaceConfig));
-    }
-
-    mIsGraphicsContext = sc != NULL;
-
-    int status;
-    pthread_attr_t threadAttr;
-
-    pthread_mutex_unlock(&gInitMutex);
-
-    // Global init done at this point.
-
-    status = pthread_attr_init(&threadAttr);
-    if (status) {
-        ALOGE("Failed to init thread attribute.");
-        return false;
-    }
-
-    mHasSurface = false;
-
-    timerInit();
-    timerSet(RS_TIMER_INTERNAL);
-
-    status = pthread_create(&mThreadId, &threadAttr, threadProc, this);
-    if (status) {
-        ALOGE("Failed to start rs context thread.");
-        return false;
-    }
-    while (!mRunning && (mError == RS_ERROR_NONE)) {
-        usleep(100);
-    }
-
-    if (mError != RS_ERROR_NONE) {
-        ALOGE("Errors during thread init");
-        return false;
-    }
-
-    pthread_attr_destroy(&threadAttr);
-    return true;
-}
-
-Context::~Context() {
-    ALOGV("%p Context::~Context", this);
-
-    if (!mIsContextLite) {
-        mPaused = false;
-        void *res;
-
-        mIO.shutdown();
-        int status = pthread_join(mThreadId, &res);
-        rsAssert(mExit);
-
-        if (mHal.funcs.shutdownDriver) {
-            mHal.funcs.shutdownDriver(this);
-        }
-
-        // Global structure cleanup.
-        pthread_mutex_lock(&gInitMutex);
-        if (mDev) {
-            mDev->removeContext(this);
-            mDev = NULL;
-        }
-        pthread_mutex_unlock(&gInitMutex);
-    }
-    ALOGV("%p Context::~Context done", this);
-}
-
-void Context::setSurface(uint32_t w, uint32_t h, RsNativeWindow sur) {
-    rsAssert(mIsGraphicsContext);
-    mHal.funcs.setSurface(this, w, h, sur);
-
-    mHasSurface = sur != NULL;
-    mWidth = w;
-    mHeight = h;
-
-    if (mWidth && mHeight) {
-        mStateVertex.updateSize(this);
-        mFBOCache.updateSize();
-    }
-}
-
-uint32_t Context::getCurrentSurfaceWidth() const {
-    for (uint32_t i = 0; i < mFBOCache.mHal.state.colorTargetsCount; i ++) {
-        if (mFBOCache.mHal.state.colorTargets[i] != NULL) {
-            return mFBOCache.mHal.state.colorTargets[i]->getType()->getDimX();
-        }
-    }
-    if (mFBOCache.mHal.state.depthTarget != NULL) {
-        return mFBOCache.mHal.state.depthTarget->getType()->getDimX();
-    }
-    return mWidth;
-}
-
-uint32_t Context::getCurrentSurfaceHeight() const {
-    for (uint32_t i = 0; i < mFBOCache.mHal.state.colorTargetsCount; i ++) {
-        if (mFBOCache.mHal.state.colorTargets[i] != NULL) {
-            return mFBOCache.mHal.state.colorTargets[i]->getType()->getDimY();
-        }
-    }
-    if (mFBOCache.mHal.state.depthTarget != NULL) {
-        return mFBOCache.mHal.state.depthTarget->getType()->getDimY();
-    }
-    return mHeight;
-}
-
-void Context::pause() {
-    rsAssert(mIsGraphicsContext);
-    mPaused = true;
-}
-
-void Context::resume() {
-    rsAssert(mIsGraphicsContext);
-    mPaused = false;
-}
-
-void Context::setRootScript(Script *s) {
-    rsAssert(mIsGraphicsContext);
-    mRootScript.set(s);
-}
-
-void Context::setProgramStore(ProgramStore *pfs) {
-    rsAssert(mIsGraphicsContext);
-    if (pfs == NULL) {
-        mFragmentStore.set(mStateFragmentStore.mDefault);
-    } else {
-        mFragmentStore.set(pfs);
-    }
-}
-
-void Context::setProgramFragment(ProgramFragment *pf) {
-    rsAssert(mIsGraphicsContext);
-    if (pf == NULL) {
-        mFragment.set(mStateFragment.mDefault);
-    } else {
-        mFragment.set(pf);
-    }
-}
-
-void Context::setProgramRaster(ProgramRaster *pr) {
-    rsAssert(mIsGraphicsContext);
-    if (pr == NULL) {
-        mRaster.set(mStateRaster.mDefault);
-    } else {
-        mRaster.set(pr);
-    }
-}
-
-void Context::setProgramVertex(ProgramVertex *pv) {
-    rsAssert(mIsGraphicsContext);
-    if (pv == NULL) {
-        mVertex.set(mStateVertex.mDefault);
-    } else {
-        mVertex.set(pv);
-    }
-}
-
-void Context::setFont(Font *f) {
-    rsAssert(mIsGraphicsContext);
-    if (f == NULL) {
-        mFont.set(mStateFont.mDefault);
-    } else {
-        mFont.set(f);
-    }
-}
-
-void Context::assignName(ObjectBase *obj, const char *name, uint32_t len) {
-    rsAssert(!obj->getName());
-    obj->setName(name, len);
-    mNames.add(obj);
-}
-
-void Context::removeName(ObjectBase *obj) {
-    for (size_t ct=0; ct < mNames.size(); ct++) {
-        if (obj == mNames[ct]) {
-            mNames.removeAt(ct);
-            return;
-        }
-    }
-}
-
-RsMessageToClientType Context::peekMessageToClient(size_t *receiveLen, uint32_t *subID) {
-    return (RsMessageToClientType)mIO.getClientHeader(receiveLen, subID);
-}
-
-RsMessageToClientType Context::getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen) {
-    return (RsMessageToClientType)mIO.getClientPayload(data, receiveLen, subID, bufferLen);
-}
-
-bool Context::sendMessageToClient(const void *data, RsMessageToClientType cmdID,
-                                  uint32_t subID, size_t len, bool waitForSpace) const {
-
-    return mIO.sendToClient(cmdID, subID, data, len, waitForSpace);
-}
-
-void Context::initToClient() {
-    while (!mRunning) {
-        usleep(100);
-    }
-}
-
-void Context::deinitToClient() {
-    mIO.clientShutdown();
-}
-
-void Context::setError(RsError e, const char *msg) const {
-    mError = e;
-    sendMessageToClient(msg, RS_MESSAGE_TO_CLIENT_ERROR, e, strlen(msg) + 1, true);
-}
-
-
-void Context::dumpDebug() const {
-    ALOGE("RS Context debug %p", this);
-    ALOGE("RS Context debug");
-
-    ALOGE(" RS width %i, height %i", mWidth, mHeight);
-    ALOGE(" RS running %i, exit %i, paused %i", mRunning, mExit, mPaused);
-    ALOGE(" RS pThreadID %li, nativeThreadID %i", (long int)mThreadId, mNativeThreadId);
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////
-//
-
-namespace android {
-namespace renderscript {
-
-void rsi_ContextFinish(Context *rsc) {
-}
-
-void rsi_ContextBindRootScript(Context *rsc, RsScript vs) {
-    Script *s = static_cast<Script *>(vs);
-    rsc->setRootScript(s);
-}
-
-void rsi_ContextBindSampler(Context *rsc, uint32_t slot, RsSampler vs) {
-    Sampler *s = static_cast<Sampler *>(vs);
-
-    if (slot > RS_MAX_SAMPLER_SLOT) {
-        ALOGE("Invalid sampler slot");
-        return;
-    }
-
-    s->bindToContext(&rsc->mStateSampler, slot);
-}
-
-void rsi_ContextBindProgramStore(Context *rsc, RsProgramStore vpfs) {
-    ProgramStore *pfs = static_cast<ProgramStore *>(vpfs);
-    rsc->setProgramStore(pfs);
-}
-
-void rsi_ContextBindProgramFragment(Context *rsc, RsProgramFragment vpf) {
-    ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
-    rsc->setProgramFragment(pf);
-}
-
-void rsi_ContextBindProgramRaster(Context *rsc, RsProgramRaster vpr) {
-    ProgramRaster *pr = static_cast<ProgramRaster *>(vpr);
-    rsc->setProgramRaster(pr);
-}
-
-void rsi_ContextBindProgramVertex(Context *rsc, RsProgramVertex vpv) {
-    ProgramVertex *pv = static_cast<ProgramVertex *>(vpv);
-    rsc->setProgramVertex(pv);
-}
-
-void rsi_ContextBindFont(Context *rsc, RsFont vfont) {
-    Font *font = static_cast<Font *>(vfont);
-    rsc->setFont(font);
-}
-
-void rsi_AssignName(Context *rsc, RsObjectBase obj, const char *name, size_t name_length) {
-    ObjectBase *ob = static_cast<ObjectBase *>(obj);
-    rsc->assignName(ob, name, name_length);
-}
-
-void rsi_ObjDestroy(Context *rsc, void *optr) {
-    ObjectBase *ob = static_cast<ObjectBase *>(optr);
-    rsc->removeName(ob);
-    ob->decUserRef();
-}
-
-void rsi_ContextPause(Context *rsc) {
-    rsc->pause();
-}
-
-void rsi_ContextResume(Context *rsc) {
-    rsc->resume();
-}
-
-void rsi_ContextSetSurface(Context *rsc, uint32_t w, uint32_t h, RsNativeWindow sur) {
-    rsc->setSurface(w, h, sur);
-}
-
-void rsi_ContextSetPriority(Context *rsc, int32_t p) {
-    rsc->setPriority(p);
-}
-
-void rsi_ContextDump(Context *rsc, int32_t bits) {
-    ObjectBase::dumpAll(rsc);
-}
-
-void rsi_ContextDestroyWorker(Context *rsc) {
-    rsc->destroyWorkerThreadResources();
-}
-
-void rsi_ContextDestroy(Context *rsc) {
-    ALOGV("%p rsContextDestroy", rsc);
-    rsContextDestroyWorker(rsc);
-    delete rsc;
-    ALOGV("%p rsContextDestroy done", rsc);
-}
-
-
-RsMessageToClientType rsi_ContextPeekMessage(Context *rsc,
-                                           size_t * receiveLen, size_t receiveLen_length,
-                                           uint32_t * subID, size_t subID_length) {
-    return rsc->peekMessageToClient(receiveLen, subID);
-}
-
-RsMessageToClientType rsi_ContextGetMessage(Context *rsc, void * data, size_t data_length,
-                                          size_t * receiveLen, size_t receiveLen_length,
-                                          uint32_t * subID, size_t subID_length) {
-    rsAssert(subID_length == sizeof(uint32_t));
-    rsAssert(receiveLen_length == sizeof(size_t));
-    return rsc->getMessageToClient(data, receiveLen, subID, data_length);
-}
-
-void rsi_ContextInitToClient(Context *rsc) {
-    rsc->initToClient();
-}
-
-void rsi_ContextDeinitToClient(Context *rsc) {
-    rsc->deinitToClient();
-}
-
-}
-}
-
-RsContext rsContextCreate(RsDevice vdev, uint32_t version,
-                          uint32_t sdkVersion) {
-    ALOGV("rsContextCreate dev=%p", vdev);
-    Device * dev = static_cast<Device *>(vdev);
-    Context *rsc = Context::createContext(dev, NULL);
-    if (rsc) {
-        rsc->setTargetSdkVersion(sdkVersion);
-    }
-    return rsc;
-}
-
-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;
-}
-
-// 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/libs/rs/rsContext.h b/libs/rs/rsContext.h
deleted file mode 100644
index de110c6..0000000
--- a/libs/rs/rsContext.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_CONTEXT_H
-#define ANDROID_RS_CONTEXT_H
-
-#include "rsUtils.h"
-#include "rs_hal.h"
-
-#include "rsThreadIO.h"
-#include "rsScriptC.h"
-#include "rsSampler.h"
-#include "rsFont.h"
-#include "rsPath.h"
-#include "rsProgramFragment.h"
-#include "rsProgramStore.h"
-#include "rsProgramRaster.h"
-#include "rsProgramVertex.h"
-#include "rsFBOCache.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-
-namespace renderscript {
-
-class Device;
-
-#if 0
-#define CHECK_OBJ(o) { \
-    GET_TLS(); \
-    if (!ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
-        ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
-    } \
-}
-#define CHECK_OBJ_OR_NULL(o) { \
-    GET_TLS(); \
-    if (o && !ObjectBase::isValid(rsc, (const ObjectBase *)o)) {  \
-        ALOGE("Bad object %p at %s, %i", o, __FILE__, __LINE__);  \
-    } \
-}
-#else
-#define CHECK_OBJ(o)
-#define CHECK_OBJ_OR_NULL(o)
-#endif
-
-class Context {
-public:
-    struct Hal {
-        void * drv;
-
-        RsdHalFunctions funcs;
-    };
-    Hal mHal;
-
-    static Context * createContext(Device *, const RsSurfaceConfig *sc);
-    static Context * createContextLite();
-    ~Context();
-
-    static pthread_mutex_t gInitMutex;
-    // Library mutex (for providing thread-safe calls from the runtime)
-    static pthread_mutex_t gLibMutex;
-
-    class PushState {
-    public:
-        PushState(Context *);
-        ~PushState();
-
-    private:
-        ObjectBaseRef<ProgramFragment> mFragment;
-        ObjectBaseRef<ProgramVertex> mVertex;
-        ObjectBaseRef<ProgramStore> mStore;
-        ObjectBaseRef<ProgramRaster> mRaster;
-        ObjectBaseRef<Font> mFont;
-        Context *mRsc;
-    };
-
-    RsSurfaceConfig mUserSurfaceConfig;
-
-    ElementState mStateElement;
-    TypeState mStateType;
-    SamplerState mStateSampler;
-    ProgramFragmentState mStateFragment;
-    ProgramStoreState mStateFragmentStore;
-    ProgramRasterState mStateRaster;
-    ProgramVertexState mStateVertex;
-    FontState mStateFont;
-
-    ScriptCState mScriptC;
-    FBOCache mFBOCache;
-
-    void swapBuffers();
-    void setRootScript(Script *);
-    void setProgramRaster(ProgramRaster *);
-    void setProgramVertex(ProgramVertex *);
-    void setProgramFragment(ProgramFragment *);
-    void setProgramStore(ProgramStore *);
-    void setFont(Font *);
-
-    void updateSurface(void *sur);
-
-    ProgramFragment * getProgramFragment() {return mFragment.get();}
-    ProgramStore * getProgramStore() {return mFragmentStore.get();}
-    ProgramRaster * getProgramRaster() {return mRaster.get();}
-    ProgramVertex * getProgramVertex() {return mVertex.get();}
-    Font * getFont() {return mFont.get();}
-
-    bool setupCheck();
-    void setupProgramStore();
-
-    void pause();
-    void resume();
-    void setSurface(uint32_t w, uint32_t h, RsNativeWindow sur);
-    void setPriority(int32_t p);
-    void destroyWorkerThreadResources();
-
-    void assignName(ObjectBase *obj, const char *name, uint32_t len);
-    void removeName(ObjectBase *obj);
-
-    RsMessageToClientType peekMessageToClient(size_t *receiveLen, uint32_t *subID);
-    RsMessageToClientType getMessageToClient(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
-    bool sendMessageToClient(const void *data, RsMessageToClientType cmdID, uint32_t subID, size_t len, bool waitForSpace) const;
-    uint32_t runScript(Script *s);
-
-    void initToClient();
-    void deinitToClient();
-
-    ProgramFragment * getDefaultProgramFragment() const {
-        return mStateFragment.mDefault.get();
-    }
-    ProgramVertex * getDefaultProgramVertex() const {
-        return mStateVertex.mDefault.get();
-    }
-    ProgramStore * getDefaultProgramStore() const {
-        return mStateFragmentStore.mDefault.get();
-    }
-    ProgramRaster * getDefaultProgramRaster() const {
-        return mStateRaster.mDefault.get();
-    }
-    Font* getDefaultFont() const {
-        return mStateFont.mDefault.get();
-    }
-
-    uint32_t getWidth() const {return mWidth;}
-    uint32_t getHeight() const {return mHeight;}
-
-    uint32_t getCurrentSurfaceWidth() const;
-    uint32_t getCurrentSurfaceHeight() const;
-
-    mutable ThreadIO mIO;
-
-    // Timers
-    enum Timers {
-        RS_TIMER_IDLE,
-        RS_TIMER_INTERNAL,
-        RS_TIMER_SCRIPT,
-        RS_TIMER_CLEAR_SWAP,
-        _RS_TIMER_TOTAL
-    };
-    uint64_t getTime() const;
-    void timerInit();
-    void timerReset();
-    void timerSet(Timers);
-    void timerPrint();
-    void timerFrame();
-
-    struct {
-        bool mLogTimes;
-        bool mLogScripts;
-        bool mLogObjects;
-        bool mLogShaders;
-        bool mLogShadersAttr;
-        bool mLogShadersUniforms;
-        bool mLogVisual;
-        uint32_t mDebugMaxThreads;
-    } props;
-
-    mutable struct {
-        bool inRoot;
-        const char *command;
-        const char *file;
-        uint32_t line;
-    } watchdog;
-    static void printWatchdogInfo(void *ctx);
-    void setWatchdogGL(const char *cmd, uint32_t line, const char *file) const {
-        watchdog.command = cmd;
-        watchdog.file = file;
-        watchdog.line = line;
-    }
-
-    void dumpDebug() const;
-    void setError(RsError e, const char *msg = NULL) const;
-
-    mutable const ObjectBase * mObjHead;
-
-    uint32_t getDPI() const {return mDPI;}
-    void setDPI(uint32_t dpi) {mDPI = dpi;}
-
-    uint32_t getTargetSdkVersion() const {return mTargetSdkVersion;}
-    void setTargetSdkVersion(uint32_t sdkVer) {mTargetSdkVersion = sdkVer;}
-
-    Device *mDev;
-protected:
-
-    uint32_t mTargetSdkVersion;
-    uint32_t mDPI;
-    uint32_t mWidth;
-    uint32_t mHeight;
-    int32_t mThreadPriority;
-    bool mIsGraphicsContext;
-
-    bool mRunning;
-    bool mExit;
-    bool mPaused;
-    mutable RsError mError;
-
-    pthread_t mThreadId;
-    pid_t mNativeThreadId;
-
-    ObjectBaseRef<Script> mRootScript;
-    ObjectBaseRef<ProgramFragment> mFragment;
-    ObjectBaseRef<ProgramVertex> mVertex;
-    ObjectBaseRef<ProgramStore> mFragmentStore;
-    ObjectBaseRef<ProgramRaster> mRaster;
-    ObjectBaseRef<Font> mFont;
-
-    void displayDebugStats();
-
-private:
-    Context();
-    bool initContext(Device *, const RsSurfaceConfig *sc);
-
-
-    bool initGLThread();
-    void deinitEGL();
-
-    uint32_t runRootScript();
-
-    static void * threadProc(void *);
-    static void * helperThreadProc(void *);
-
-    bool mHasSurface;
-    bool mIsContextLite;
-
-    Vector<ObjectBase *> mNames;
-
-    uint64_t mTimers[_RS_TIMER_TOTAL];
-    Timers mTimerActive;
-    uint64_t mTimeLast;
-    uint64_t mTimeFrame;
-    uint64_t mTimeLastFrame;
-    uint32_t mTimeMSLastFrame;
-    uint32_t mTimeMSLastScript;
-    uint32_t mTimeMSLastSwap;
-    uint32_t mAverageFPSFrameCount;
-    uint64_t mAverageFPSStartTime;
-    uint32_t mAverageFPS;
-};
-
-} // renderscript
-} // android
-#endif
diff --git a/libs/rs/rsDefines.h b/libs/rs/rsDefines.h
deleted file mode 100644
index 0e0cd8d..0000000
--- a/libs/rs/rsDefines.h
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * Copyright (C) 2007-2012 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.
- */
-
-#ifndef RENDER_SCRIPT_DEFINES_H
-#define RENDER_SCRIPT_DEFINES_H
-
-#include <stdint.h>
-#include <sys/types.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-//////////////////////////////////////////////////////
-//
-
-typedef void * RsAsyncVoidPtr;
-
-typedef void * RsAdapter1D;
-typedef void * RsAdapter2D;
-typedef void * RsAllocation;
-typedef void * RsAnimation;
-typedef void * RsContext;
-typedef void * RsDevice;
-typedef void * RsElement;
-typedef void * RsFile;
-typedef void * RsFont;
-typedef void * RsSampler;
-typedef void * RsScript;
-typedef void * RsMesh;
-typedef void * RsPath;
-typedef void * RsType;
-typedef void * RsObjectBase;
-
-typedef void * RsProgram;
-typedef void * RsProgramVertex;
-typedef void * RsProgramFragment;
-typedef void * RsProgramStore;
-typedef void * RsProgramRaster;
-
-typedef void * RsNativeWindow;
-
-typedef void (* RsBitmapCallback_t)(void *);
-
-typedef struct {
-    float m[16];
-} rs_matrix4x4;
-
-typedef struct {
-    float m[9];
-} rs_matrix3x3;
-
-typedef struct {
-    float m[4];
-} rs_matrix2x2;
-
-enum RsDeviceParam {
-    RS_DEVICE_PARAM_FORCE_SOFTWARE_GL,
-    RS_DEVICE_PARAM_COUNT
-};
-
-typedef struct {
-    uint32_t colorMin;
-    uint32_t colorPref;
-    uint32_t alphaMin;
-    uint32_t alphaPref;
-    uint32_t depthMin;
-    uint32_t depthPref;
-    uint32_t stencilMin;
-    uint32_t stencilPref;
-    uint32_t samplesMin;
-    uint32_t samplesPref;
-    float samplesQ;
-} RsSurfaceConfig;
-
-enum RsMessageToClientType {
-    RS_MESSAGE_TO_CLIENT_NONE = 0,
-    RS_MESSAGE_TO_CLIENT_EXCEPTION = 1,
-    RS_MESSAGE_TO_CLIENT_RESIZE = 2,
-    RS_MESSAGE_TO_CLIENT_ERROR = 3,
-    RS_MESSAGE_TO_CLIENT_USER = 4
-};
-
-enum RsAllocationUsageType {
-    RS_ALLOCATION_USAGE_SCRIPT = 0x0001,
-    RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE = 0x0002,
-    RS_ALLOCATION_USAGE_GRAPHICS_VERTEX = 0x0004,
-    RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS = 0x0008,
-    RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET = 0x0010,
-    RS_ALLOCATION_USAGE_IO_INPUT = 0x0020,
-    RS_ALLOCATION_USAGE_IO_OUTPUT = 0x0040,
-
-    RS_ALLOCATION_USAGE_ALL = 0x00FF
-};
-
-enum RsAllocationMipmapControl {
-    RS_ALLOCATION_MIPMAP_NONE = 0,
-    RS_ALLOCATION_MIPMAP_FULL = 1,
-    RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE = 2
-};
-
-enum RsAllocationCubemapFace {
-    RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X = 0,
-    RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_X = 1,
-    RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Y = 2,
-    RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Y = 3,
-    RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Z = 4,
-    RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Z = 5
-};
-
-enum RsDataType {
-    RS_TYPE_NONE,
-    RS_TYPE_FLOAT_16,
-    RS_TYPE_FLOAT_32,
-    RS_TYPE_FLOAT_64,
-    RS_TYPE_SIGNED_8,
-    RS_TYPE_SIGNED_16,
-    RS_TYPE_SIGNED_32,
-    RS_TYPE_SIGNED_64,
-    RS_TYPE_UNSIGNED_8,
-    RS_TYPE_UNSIGNED_16,
-    RS_TYPE_UNSIGNED_32,
-    RS_TYPE_UNSIGNED_64,
-
-    RS_TYPE_BOOLEAN,
-
-    RS_TYPE_UNSIGNED_5_6_5,
-    RS_TYPE_UNSIGNED_5_5_5_1,
-    RS_TYPE_UNSIGNED_4_4_4_4,
-
-    RS_TYPE_MATRIX_4X4,
-    RS_TYPE_MATRIX_3X3,
-    RS_TYPE_MATRIX_2X2,
-
-    RS_TYPE_ELEMENT = 1000,
-    RS_TYPE_TYPE,
-    RS_TYPE_ALLOCATION,
-    RS_TYPE_SAMPLER,
-    RS_TYPE_SCRIPT,
-    RS_TYPE_MESH,
-    RS_TYPE_PROGRAM_FRAGMENT,
-    RS_TYPE_PROGRAM_VERTEX,
-    RS_TYPE_PROGRAM_RASTER,
-    RS_TYPE_PROGRAM_STORE,
-
-    RS_TYPE_INVALID = 10000,
-};
-
-enum RsDataKind {
-    RS_KIND_USER,
-
-    RS_KIND_PIXEL_L = 7,
-    RS_KIND_PIXEL_A,
-    RS_KIND_PIXEL_LA,
-    RS_KIND_PIXEL_RGB,
-    RS_KIND_PIXEL_RGBA,
-    RS_KIND_PIXEL_DEPTH,
-
-    RS_KIND_INVALID = 100,
-};
-
-enum RsSamplerParam {
-    RS_SAMPLER_MIN_FILTER,
-    RS_SAMPLER_MAG_FILTER,
-    RS_SAMPLER_WRAP_S,
-    RS_SAMPLER_WRAP_T,
-    RS_SAMPLER_WRAP_R,
-    RS_SAMPLER_ANISO
-};
-
-enum RsSamplerValue {
-    RS_SAMPLER_NEAREST,
-    RS_SAMPLER_LINEAR,
-    RS_SAMPLER_LINEAR_MIP_LINEAR,
-    RS_SAMPLER_WRAP,
-    RS_SAMPLER_CLAMP,
-    RS_SAMPLER_LINEAR_MIP_NEAREST,
-
-    RS_SAMPLER_INVALID = 100,
-};
-
-enum RsTextureTarget {
-    RS_TEXTURE_2D,
-    RS_TEXTURE_CUBE
-};
-
-enum RsDimension {
-    RS_DIMENSION_X,
-    RS_DIMENSION_Y,
-    RS_DIMENSION_Z,
-    RS_DIMENSION_LOD,
-    RS_DIMENSION_FACE,
-
-    RS_DIMENSION_ARRAY_0 = 100,
-    RS_DIMENSION_ARRAY_1,
-    RS_DIMENSION_ARRAY_2,
-    RS_DIMENSION_ARRAY_3,
-    RS_DIMENSION_MAX = RS_DIMENSION_ARRAY_3
-};
-
-enum RsDepthFunc {
-    RS_DEPTH_FUNC_ALWAYS,
-    RS_DEPTH_FUNC_LESS,
-    RS_DEPTH_FUNC_LEQUAL,
-    RS_DEPTH_FUNC_GREATER,
-    RS_DEPTH_FUNC_GEQUAL,
-    RS_DEPTH_FUNC_EQUAL,
-    RS_DEPTH_FUNC_NOTEQUAL
-};
-
-enum RsBlendSrcFunc {
-    RS_BLEND_SRC_ZERO,                  // 0
-    RS_BLEND_SRC_ONE,                   // 1
-    RS_BLEND_SRC_DST_COLOR,             // 2
-    RS_BLEND_SRC_ONE_MINUS_DST_COLOR,   // 3
-    RS_BLEND_SRC_SRC_ALPHA,             // 4
-    RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA,   // 5
-    RS_BLEND_SRC_DST_ALPHA,             // 6
-    RS_BLEND_SRC_ONE_MINUS_DST_ALPHA,   // 7
-    RS_BLEND_SRC_SRC_ALPHA_SATURATE,    // 8
-    RS_BLEND_SRC_INVALID = 100,
-};
-
-enum RsBlendDstFunc {
-    RS_BLEND_DST_ZERO,                  // 0
-    RS_BLEND_DST_ONE,                   // 1
-    RS_BLEND_DST_SRC_COLOR,             // 2
-    RS_BLEND_DST_ONE_MINUS_SRC_COLOR,   // 3
-    RS_BLEND_DST_SRC_ALPHA,             // 4
-    RS_BLEND_DST_ONE_MINUS_SRC_ALPHA,   // 5
-    RS_BLEND_DST_DST_ALPHA,             // 6
-    RS_BLEND_DST_ONE_MINUS_DST_ALPHA,   // 7
-
-    RS_BLEND_DST_INVALID = 100,
-};
-
-enum RsTexEnvMode {
-    RS_TEX_ENV_MODE_NONE,
-    RS_TEX_ENV_MODE_REPLACE,
-    RS_TEX_ENV_MODE_MODULATE,
-    RS_TEX_ENV_MODE_DECAL
-};
-
-enum RsProgramParam {
-    RS_PROGRAM_PARAM_INPUT,
-    RS_PROGRAM_PARAM_OUTPUT,
-    RS_PROGRAM_PARAM_CONSTANT,
-    RS_PROGRAM_PARAM_TEXTURE_TYPE,
-};
-
-enum RsPrimitive {
-    RS_PRIMITIVE_POINT,
-    RS_PRIMITIVE_LINE,
-    RS_PRIMITIVE_LINE_STRIP,
-    RS_PRIMITIVE_TRIANGLE,
-    RS_PRIMITIVE_TRIANGLE_STRIP,
-    RS_PRIMITIVE_TRIANGLE_FAN,
-
-    RS_PRIMITIVE_INVALID = 100,
-};
-
-enum RsPathPrimitive {
-    RS_PATH_PRIMITIVE_QUADRATIC_BEZIER,
-    RS_PATH_PRIMITIVE_CUBIC_BEZIER
-};
-
-enum RsError {
-    RS_ERROR_NONE = 0,
-    RS_ERROR_BAD_SHADER = 1,
-    RS_ERROR_BAD_SCRIPT = 2,
-    RS_ERROR_BAD_VALUE = 3,
-    RS_ERROR_OUT_OF_MEMORY = 4,
-    RS_ERROR_DRIVER = 5,
-
-    RS_ERROR_FATAL_UNKNOWN = 0x1000,
-    RS_ERROR_FATAL_DRIVER = 0x1001,
-    RS_ERROR_FATAL_PROGRAM_LINK = 0x1002
-};
-
-enum RsAnimationInterpolation {
-    RS_ANIMATION_INTERPOLATION_STEP,
-    RS_ANIMATION_INTERPOLATION_LINEAR,
-    RS_ANIMATION_INTERPOLATION_BEZIER,
-    RS_ANIMATION_INTERPOLATION_CARDINAL,
-    RS_ANIMATION_INTERPOLATION_HERMITE,
-    RS_ANIMATION_INTERPOLATION_BSPLINE
-};
-
-enum RsAnimationEdge {
-    RS_ANIMATION_EDGE_UNDEFINED,
-    RS_ANIMATION_EDGE_CONSTANT,
-    RS_ANIMATION_EDGE_GRADIENT,
-    RS_ANIMATION_EDGE_CYCLE,
-    RS_ANIMATION_EDGE_OSCILLATE,
-    RS_ANIMATION_EDGE_CYLE_RELATIVE
-};
-
-enum RsA3DClassID {
-    RS_A3D_CLASS_ID_UNKNOWN,
-    RS_A3D_CLASS_ID_MESH,
-    RS_A3D_CLASS_ID_TYPE,
-    RS_A3D_CLASS_ID_ELEMENT,
-    RS_A3D_CLASS_ID_ALLOCATION,
-    RS_A3D_CLASS_ID_PROGRAM_VERTEX,
-    RS_A3D_CLASS_ID_PROGRAM_RASTER,
-    RS_A3D_CLASS_ID_PROGRAM_FRAGMENT,
-    RS_A3D_CLASS_ID_PROGRAM_STORE,
-    RS_A3D_CLASS_ID_SAMPLER,
-    RS_A3D_CLASS_ID_ANIMATION,
-    RS_A3D_CLASS_ID_ADAPTER_1D,
-    RS_A3D_CLASS_ID_ADAPTER_2D,
-    RS_A3D_CLASS_ID_SCRIPT_C
-};
-
-enum RsCullMode {
-    RS_CULL_BACK,
-    RS_CULL_FRONT,
-    RS_CULL_NONE,
-    RS_CULL_INVALID = 100,
-};
-
-typedef struct {
-    RsA3DClassID classID;
-    const char* objectName;
-} RsFileIndexEntry;
-
-// Script to Script
-typedef struct {
-    uint32_t xStart;
-    uint32_t xEnd;
-    uint32_t yStart;
-    uint32_t yEnd;
-    uint32_t zStart;
-    uint32_t zEnd;
-    uint32_t arrayStart;
-    uint32_t arrayEnd;
-
-} RsScriptCall;
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif // RENDER_SCRIPT_DEFINES_H
-
-
-
-
diff --git a/libs/rs/rsDevice.cpp b/libs/rs/rsDevice.cpp
deleted file mode 100644
index d7d03f6..0000000
--- a/libs/rs/rsDevice.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2009 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"
-
-using namespace android;
-using namespace android::renderscript;
-
-Device::Device() {
-    mForceSW = false;
-}
-
-Device::~Device() {
-}
-
-void Device::addContext(Context *rsc) {
-    mContexts.push(rsc);
-}
-
-void Device::removeContext(Context *rsc) {
-    for (size_t idx=0; idx < mContexts.size(); idx++) {
-        if (mContexts[idx] == rsc) {
-            mContexts.removeAt(idx);
-            break;
-        }
-    }
-}
-
-RsDevice rsDeviceCreate() {
-    Device * d = new Device();
-    return d;
-}
-
-void rsDeviceDestroy(RsDevice dev) {
-    Device * d = static_cast<Device *>(dev);
-    delete d;
-}
-
-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/libs/rs/rsDevice.h b/libs/rs/rsDevice.h
deleted file mode 100644
index ffb514b..0000000
--- a/libs/rs/rsDevice.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_DEVICE_H
-#define ANDROID_RS_DEVICE_H
-
-#include "rsUtils.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class Context;
-
-class Device {
-public:
-    Device();
-    ~Device();
-
-    void addContext(Context *);
-    void removeContext(Context *);
-
-    bool mForceSW;
-
-protected:
-    Vector<Context *> mContexts;
-};
-
-}
-}
-#endif
diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp
deleted file mode 100644
index fb2892c..0000000
--- a/libs/rs/rsElement.cpp
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- * Copyright (C) 2009 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;
-
-
-Element::Element(Context *rsc) : ObjectBase(rsc) {
-    mBits = 0;
-    mBitsUnpadded = 0;
-    mFields = NULL;
-    mFieldCount = 0;
-    mHasReference = false;
-    memset(&mHal, 0, sizeof(mHal));
-}
-
-Element::~Element() {
-    clear();
-}
-
-void Element::preDestroy() const {
-    for (uint32_t ct = 0; ct < mRSC->mStateElement.mElements.size(); ct++) {
-        if (mRSC->mStateElement.mElements[ct] == this) {
-            mRSC->mStateElement.mElements.removeAt(ct);
-            break;
-        }
-    }
-}
-
-void Element::clear() {
-    delete [] mFields;
-    mFields = NULL;
-    mFieldCount = 0;
-    mHasReference = false;
-
-    delete [] mHal.state.fields;
-    delete [] mHal.state.fieldArraySizes;
-    delete [] mHal.state.fieldNames;
-    delete [] mHal.state.fieldNameLengths;
-    delete [] mHal.state.fieldOffsetBytes;
-}
-
-size_t Element::getSizeBits() const {
-    if (!mFieldCount) {
-        return mBits;
-    }
-
-    size_t total = 0;
-    for (size_t ct=0; ct < mFieldCount; ct++) {
-        total += mFields[ct].e->mBits * mFields[ct].arraySize;
-    }
-    return total;
-}
-
-size_t Element::getSizeBitsUnpadded() const {
-    if (!mFieldCount) {
-        return mBitsUnpadded;
-    }
-
-    size_t total = 0;
-    for (size_t ct=0; ct < mFieldCount; ct++) {
-        total += mFields[ct].e->mBitsUnpadded * mFields[ct].arraySize;
-    }
-    return total;
-}
-
-void Element::dumpLOGV(const char *prefix) const {
-    ObjectBase::dumpLOGV(prefix);
-    ALOGV("%s Element: fieldCount: %zu,  size bytes: %zu", prefix, mFieldCount, getSizeBytes());
-    mComponent.dumpLOGV(prefix);
-    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
-        ALOGV("%s Element field index: %u ------------------", prefix, ct);
-        ALOGV("%s name: %s, offsetBits: %u, arraySize: %u",
-             prefix, mFields[ct].name.string(), mFields[ct].offsetBits, mFields[ct].arraySize);
-        mFields[ct].e->dumpLOGV(prefix);
-    }
-}
-
-void Element::serialize(OStream *stream) const {
-    // Need to identify ourselves
-    stream->addU32((uint32_t)getClassId());
-
-    String8 name(getName());
-    stream->addString(&name);
-
-    mComponent.serialize(stream);
-
-    // Now serialize all the fields
-    stream->addU32(mFieldCount);
-    for (uint32_t ct = 0; ct < mFieldCount; ct++) {
-        stream->addString(&mFields[ct].name);
-        stream->addU32(mFields[ct].arraySize);
-        mFields[ct].e->serialize(stream);
-    }
-}
-
-Element *Element::createFromStream(Context *rsc, IStream *stream) {
-    // First make sure we are reading the correct object
-    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
-    if (classID != RS_A3D_CLASS_ID_ELEMENT) {
-        ALOGE("element loading skipped due to invalid class id\n");
-        return NULL;
-    }
-
-    String8 name;
-    stream->loadString(&name);
-
-    Component component;
-    component.loadFromStream(stream);
-
-    uint32_t fieldCount = stream->loadU32();
-    if (!fieldCount) {
-        return (Element *)Element::create(rsc,
-                                          component.getType(),
-                                          component.getKind(),
-                                          component.getIsNormalized(),
-                                          component.getVectorSize());;
-    }
-
-    const Element **subElems = new const Element *[fieldCount];
-    const char **subElemNames = new const char *[fieldCount];
-    size_t *subElemNamesLengths = new size_t[fieldCount];
-    uint32_t *arraySizes = new uint32_t[fieldCount];
-
-    String8 elemName;
-    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
-        stream->loadString(&elemName);
-        subElemNamesLengths[ct] = elemName.length();
-        char *tmpName = new char[subElemNamesLengths[ct]];
-        memcpy(tmpName, elemName.string(), subElemNamesLengths[ct]);
-        subElemNames[ct] = tmpName;
-        arraySizes[ct] = stream->loadU32();
-        subElems[ct] = Element::createFromStream(rsc, stream);
-    }
-
-    const Element *elem = Element::create(rsc, fieldCount, subElems, subElemNames,
-                                          subElemNamesLengths, arraySizes);
-    for (uint32_t ct = 0; ct < fieldCount; ct ++) {
-        delete [] subElemNames[ct];
-        subElems[ct]->decUserRef();
-    }
-    delete[] subElems;
-    delete[] subElemNames;
-    delete[] subElemNamesLengths;
-    delete[] arraySizes;
-
-    return (Element *)elem;
-}
-
-void Element::compute() {
-    mHal.state.dataType = mComponent.getType();
-    mHal.state.dataKind = mComponent.getKind();
-    mHal.state.vectorSize = mComponent.getVectorSize();
-
-    if (mFieldCount == 0) {
-        mBits = mComponent.getBits();
-        mBitsUnpadded = mComponent.getBitsUnpadded();
-        mHasReference = mComponent.isReference();
-
-        mHal.state.elementSizeBytes = getSizeBytes();
-        return;
-    }
-
-    uint32_t noPaddingFieldCount = 0;
-    for (uint32_t ct = 0; ct < mFieldCount; ct ++) {
-        if (mFields[ct].name.string()[0] != '#') {
-            noPaddingFieldCount ++;
-        }
-    }
-
-    mHal.state.fields = new const Element*[noPaddingFieldCount];
-    mHal.state.fieldArraySizes = new uint32_t[noPaddingFieldCount];
-    mHal.state.fieldNames = new const char*[noPaddingFieldCount];
-    mHal.state.fieldNameLengths = new uint32_t[noPaddingFieldCount];
-    mHal.state.fieldOffsetBytes = new uint32_t[noPaddingFieldCount];
-    mHal.state.fieldsCount = noPaddingFieldCount;
-
-    size_t bits = 0;
-    size_t bitsUnpadded = 0;
-    for (size_t ct = 0, ctNoPadding = 0; ct < mFieldCount; ct++) {
-        mFields[ct].offsetBits = bits;
-        mFields[ct].offsetBitsUnpadded = bitsUnpadded;
-        bits += mFields[ct].e->getSizeBits() * mFields[ct].arraySize;
-        bitsUnpadded += mFields[ct].e->getSizeBitsUnpadded() * mFields[ct].arraySize;
-
-        if (mFields[ct].e->mHasReference) {
-            mHasReference = true;
-        }
-
-        if (mFields[ct].name.string()[0] == '#') {
-            continue;
-        }
-
-        mHal.state.fields[ctNoPadding] = mFields[ct].e.get();
-        mHal.state.fieldArraySizes[ctNoPadding] = mFields[ct].arraySize;
-        mHal.state.fieldNames[ctNoPadding] = mFields[ct].name.string();
-        mHal.state.fieldNameLengths[ctNoPadding] = mFields[ct].name.length() + 1; // to include 0
-        mHal.state.fieldOffsetBytes[ctNoPadding] = mFields[ct].offsetBits >> 3;
-
-        ctNoPadding ++;
-    }
-
-    mHal.state.elementSizeBytes = getSizeBytes();
-}
-
-ObjectBaseRef<const Element> Element::createRef(Context *rsc, RsDataType dt, RsDataKind dk,
-                                bool isNorm, uint32_t vecSize) {
-    ObjectBaseRef<const Element> returnRef;
-    // Look for an existing match.
-    ObjectBase::asyncLock();
-    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
-        const Element *ee = rsc->mStateElement.mElements[ct];
-        if (!ee->getFieldCount() &&
-            (ee->getComponent().getType() == dt) &&
-            (ee->getComponent().getKind() == dk) &&
-            (ee->getComponent().getIsNormalized() == isNorm) &&
-            (ee->getComponent().getVectorSize() == vecSize)) {
-            // Match
-            returnRef.set(ee);
-            ObjectBase::asyncUnlock();
-            return ee;
-        }
-    }
-    ObjectBase::asyncUnlock();
-
-    Element *e = new Element(rsc);
-    returnRef.set(e);
-    e->mComponent.set(dt, dk, isNorm, vecSize);
-    e->compute();
-
-    ObjectBase::asyncLock();
-    rsc->mStateElement.mElements.push(e);
-    ObjectBase::asyncUnlock();
-
-    return returnRef;
-}
-
-ObjectBaseRef<const Element> Element::createRef(Context *rsc, size_t count, const Element **ein,
-                            const char **nin, const size_t * lengths, const uint32_t *asin) {
-
-    ObjectBaseRef<const Element> returnRef;
-    // Look for an existing match.
-    ObjectBase::asyncLock();
-    for (uint32_t ct=0; ct < rsc->mStateElement.mElements.size(); ct++) {
-        const Element *ee = rsc->mStateElement.mElements[ct];
-        if (ee->getFieldCount() == count) {
-            bool match = true;
-            for (uint32_t i=0; i < count; i++) {
-                if ((ee->mFields[i].e.get() != ein[i]) ||
-                    (ee->mFields[i].name.length() != lengths[i]) ||
-                    (ee->mFields[i].name != nin[i]) ||
-                    (ee->mFields[i].arraySize != asin[i])) {
-                    match = false;
-                    break;
-                }
-            }
-            if (match) {
-                returnRef.set(ee);
-                ObjectBase::asyncUnlock();
-                return returnRef;
-            }
-        }
-    }
-    ObjectBase::asyncUnlock();
-
-    Element *e = new Element(rsc);
-    returnRef.set(e);
-    e->mFields = new ElementField_t [count];
-    e->mFieldCount = count;
-    for (size_t ct=0; ct < count; ct++) {
-        e->mFields[ct].e.set(ein[ct]);
-        e->mFields[ct].name.setTo(nin[ct], lengths[ct]);
-        e->mFields[ct].arraySize = asin[ct];
-    }
-    e->compute();
-
-    ObjectBase::asyncLock();
-    rsc->mStateElement.mElements.push(e);
-    ObjectBase::asyncUnlock();
-
-    return returnRef;
-}
-
-void Element::incRefs(const void *ptr) const {
-    if (!mFieldCount) {
-        if (mComponent.isReference()) {
-            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
-            ObjectBase *ob = obp[0];
-            if (ob) ob->incSysRef();
-        }
-        return;
-    }
-
-    const uint8_t *p = static_cast<const uint8_t *>(ptr);
-    for (uint32_t i=0; i < mFieldCount; i++) {
-        if (mFields[i].e->mHasReference) {
-            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
-            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
-                mFields[i].e->incRefs(p2);
-                p2 += mFields[i].e->getSizeBytes();
-            }
-        }
-    }
-}
-
-void Element::decRefs(const void *ptr) const {
-    if (!mFieldCount) {
-        if (mComponent.isReference()) {
-            ObjectBase *const*obp = static_cast<ObjectBase *const*>(ptr);
-            ObjectBase *ob = obp[0];
-            if (ob) ob->decSysRef();
-        }
-        return;
-    }
-
-    const uint8_t *p = static_cast<const uint8_t *>(ptr);
-    for (uint32_t i=0; i < mFieldCount; i++) {
-        if (mFields[i].e->mHasReference) {
-            const uint8_t *p2 = &p[mFields[i].offsetBits >> 3];
-            for (uint32_t ct=0; ct < mFields[i].arraySize; ct++) {
-                mFields[i].e->decRefs(p2);
-                p2 += mFields[i].e->getSizeBytes();
-            }
-        }
-    }
-}
-
-Element::Builder::Builder() {
-    const uint32_t initialCapacity = 32;
-    mBuilderElementRefs.setCapacity(initialCapacity);
-    mBuilderElements.setCapacity(initialCapacity);
-    mBuilderNameStrings.setCapacity(initialCapacity);
-    mBuilderNameLengths.setCapacity(initialCapacity);
-    mBuilderArrays.setCapacity(initialCapacity);
-}
-
-void Element::Builder::add(const Element *e, const char *nameStr, uint32_t arraySize) {
-    mBuilderElementRefs.push(ObjectBaseRef<const Element>(e));
-    mBuilderElements.push(e);
-    mBuilderNameStrings.push(nameStr);
-    mBuilderNameLengths.push(strlen(nameStr));
-    mBuilderArrays.push(arraySize);
-
-}
-
-ObjectBaseRef<const Element> Element::Builder::create(Context *rsc) {
-    return Element::createRef(rsc, mBuilderElements.size(),
-                              &(mBuilderElements.editArray()[0]),
-                              &(mBuilderNameStrings.editArray()[0]),
-                              mBuilderNameLengths.editArray(),
-                              mBuilderArrays.editArray());
-}
-
-
-ElementState::ElementState() {
-}
-
-ElementState::~ElementState() {
-    rsAssert(!mElements.size());
-}
-
-/////////////////////////////////////////
-//
-
-namespace android {
-namespace renderscript {
-
-RsElement rsi_ElementCreate(Context *rsc,
-                            RsDataType dt,
-                            RsDataKind dk,
-                            bool norm,
-                            uint32_t vecSize) {
-    return (RsElement)Element::create(rsc, dt, dk, norm, vecSize);
-}
-
-
-RsElement rsi_ElementCreate2(Context *rsc,
-                             const RsElement * ein,
-                             size_t ein_length,
-
-                             const char ** names,
-                             size_t nameLengths_length,
-                             const size_t * nameLengths,
-
-                             const uint32_t * arraySizes,
-                             size_t arraySizes_length) {
-    return (RsElement)Element::create(rsc, ein_length, (const Element **)ein,
-                                      names, nameLengths, arraySizes);
-}
-
-}
-}
-
-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();
-}
-
-void rsaElementGetSubElements(RsContext con, RsElement elem, uint32_t *ids,
-                              const char **names, uint32_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] = (uint32_t)e->getField(i);
-        names[i] = e->getFieldName(i);
-        arraySizes[i] = e->getFieldArraySize(i);
-    }
-}
diff --git a/libs/rs/rsElement.h b/libs/rs/rsElement.h
deleted file mode 100644
index b86d3bc..0000000
--- a/libs/rs/rsElement.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_STRUCTURED_ELEMENT_H
-#define ANDROID_STRUCTURED_ELEMENT_H
-
-#include "rsComponent.h"
-#include "rsUtils.h"
-#include "rsDefines.h"
-#include "rsObjectBase.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-/*****************************************************************************
- * CAUTION
- *
- * Any layout changes for this class may require a corresponding change to be
- * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
- * a partial copy of the information below.
- *
- *****************************************************************************/
-// An element is a group of Components that occupies one cell in a structure.
-class Element : public ObjectBase {
-public:
-    struct Hal {
-        mutable void *drv;
-
-        struct State {
-            RsDataType dataType;
-            RsDataKind dataKind;
-            uint32_t vectorSize;
-            uint32_t elementSizeBytes;
-
-            // Subelements
-            const Element **fields;
-            uint32_t *fieldArraySizes;
-            const char **fieldNames;
-            uint32_t *fieldNameLengths;
-            uint32_t *fieldOffsetBytes;
-            uint32_t fieldsCount;
-        };
-        State state;
-    };
-    Hal mHal;
-
-    class Builder {
-    public:
-        Builder();
-        void add(const Element *e, const char *nameStr, uint32_t arraySize);
-        ObjectBaseRef<const Element> create(Context *rsc);
-    private:
-        Vector<ObjectBaseRef<const Element> > mBuilderElementRefs;
-        Vector<const Element *> mBuilderElements;
-        Vector<const char*> mBuilderNameStrings;
-        Vector<size_t> mBuilderNameLengths;
-        Vector<uint32_t> mBuilderArrays;
-    };
-    uint32_t getGLType() const;
-    uint32_t getGLFormat() const;
-
-    size_t getSizeBitsUnpadded() const;
-    size_t getSizeBytesUnpadded() const {
-        return (getSizeBitsUnpadded() + 7) >> 3;
-    }
-
-    size_t getSizeBits() const;
-    size_t getSizeBytes() const {
-        return (getSizeBits() + 7) >> 3;
-    }
-
-    size_t getFieldOffsetBits(uint32_t componentNumber) const {
-        return mFields[componentNumber].offsetBits;
-    }
-    size_t getFieldOffsetBytes(uint32_t componentNumber) const {
-        return mFields[componentNumber].offsetBits >> 3;
-    }
-
-    size_t getFieldOffsetBytesUnpadded(uint32_t componentNumber) const {
-        return mFields[componentNumber].offsetBitsUnpadded >> 3;
-    }
-
-    uint32_t getFieldCount() const {return mFieldCount;}
-    const Element * getField(uint32_t idx) const {return mFields[idx].e.get();}
-    const char * getFieldName(uint32_t idx) const {return mFields[idx].name.string();}
-    uint32_t getFieldArraySize(uint32_t idx) const {return mFields[idx].arraySize;}
-
-    const Component & getComponent() const {return mComponent;}
-    RsDataType getType() const {return mComponent.getType();}
-    RsDataKind getKind() const {return mComponent.getKind();}
-    uint32_t getBits() const {return mBits;}
-    uint32_t getBitsUnpadded() const {return mBitsUnpadded;}
-
-    void dumpLOGV(const char *prefix) const;
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; }
-    static Element *createFromStream(Context *rsc, IStream *stream);
-
-    static ObjectBaseRef<const Element> createRef(Context *rsc,
-                                                  RsDataType dt,
-                                                  RsDataKind dk,
-                                                  bool isNorm,
-                                                  uint32_t vecSize);
-    static ObjectBaseRef<const Element> createRef(Context *rsc, size_t count,
-                                                  const Element **,
-                                                  const char **,
-                                                  const size_t * lengths,
-                                                  const uint32_t *asin);
-
-    static const Element* create(Context *rsc,
-                                 RsDataType dt,
-                                 RsDataKind dk,
-                                 bool isNorm,
-                                 uint32_t vecSize) {
-        ObjectBaseRef<const Element> elem = createRef(rsc, dt, dk, isNorm, vecSize);
-        elem->incUserRef();
-        return elem.get();
-    }
-    static const Element* create(Context *rsc, size_t count,
-                                 const Element **ein,
-                                 const char **nin,
-                                 const size_t * lengths,
-                                 const uint32_t *asin) {
-        ObjectBaseRef<const Element> elem = createRef(rsc, count, ein, nin, lengths, asin);
-        elem->incUserRef();
-        return elem.get();
-    }
-
-    void incRefs(const void *) const;
-    void decRefs(const void *) const;
-    bool getHasReferences() const {return mHasReference;}
-
-protected:
-    // deallocate any components that are part of this element.
-    void clear();
-
-    typedef struct {
-        String8 name;
-        ObjectBaseRef<const Element> e;
-        uint32_t offsetBits;
-        uint32_t offsetBitsUnpadded;
-        uint32_t arraySize;
-    } ElementField_t;
-    ElementField_t *mFields;
-    size_t mFieldCount;
-    bool mHasReference;
-
-
-    virtual ~Element();
-    Element(Context *);
-
-    Component mComponent;
-    uint32_t mBitsUnpadded;
-    uint32_t mBits;
-
-    void compute();
-
-    virtual void preDestroy() const;
-};
-
-
-class ElementState {
-public:
-    ElementState();
-    ~ElementState();
-
-    // Cache of all existing elements.
-    Vector<Element *> mElements;
-};
-
-
-}
-}
-#endif //ANDROID_STRUCTURED_ELEMENT_H
diff --git a/libs/rs/rsEnv.h b/libs/rs/rsEnv.h
deleted file mode 100644
index b82eaf1..0000000
--- a/libs/rs/rsEnv.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#include <stdint.h>
-
-
-typedef void * RsAdapter1D;
-typedef void * RsAdapter2D;
-typedef void * RsAllocation;
-typedef void * RsContext;
-typedef void * RsDevice;
-typedef void * RsElement;
-typedef void * RsSampler;
-typedef void * RsScript;
-typedef void * RsMesh;
-typedef void * RsType;
-typedef void * RsProgramFragment;
-typedef void * RsProgramStore;
-
-typedef struct {
-    float m[16];
-} rsc_Matrix;
-
-
-typedef struct {
-    float v[4];
-} rsc_Vector4;
-
-#define RS_PROGRAM_VERTEX_MODELVIEW_OFFSET 0
-#define RS_PROGRAM_VERTEX_PROJECTION_OFFSET 16
-#define RS_PROGRAM_VERTEX_TEXTURE_OFFSET 32
-#define RS_PROGRAM_VERTEX_MVP_OFFSET 48
diff --git a/libs/rs/rsFBOCache.cpp b/libs/rs/rsFBOCache.cpp
deleted file mode 100644
index d50f3e0..0000000
--- a/libs/rs/rsFBOCache.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsFBOCache.h"
-
-#include "rsContext.h"
-#include "rsAllocation.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-
-FBOCache::FBOCache() {
-    mDirty = true;
-    mHal.state.colorTargetsCount = 1;
-    mHal.state.colorTargets = new Allocation*[mHal.state.colorTargetsCount];
-    mColorTargets = new ObjectBaseRef<Allocation>[mHal.state.colorTargetsCount];
-    resetAll(NULL);
-}
-
-FBOCache::~FBOCache() {
-    delete[] mHal.state.colorTargets;
-    delete[] mColorTargets;
-}
-
-void FBOCache::init(Context *rsc) {
-    rsc->mHal.funcs.framebuffer.init(rsc, this);
-}
-
-void FBOCache::deinit(Context *rsc) {
-    rsc->mHal.funcs.framebuffer.destroy(rsc, this);
-}
-
-void FBOCache::bindColorTarget(Context *rsc, Allocation *a, uint32_t slot) {
-    if (slot >= mHal.state.colorTargetsCount) {
-        ALOGE("Invalid render target index");
-        return;
-    }
-    if (a != NULL) {
-        if (!a->getIsTexture()) {
-            ALOGE("Invalid Color Target");
-            return;
-        }
-    }
-    mColorTargets[slot].set(a);
-    mHal.state.colorTargets[slot] = a;
-    mDirty = true;
-}
-
-void FBOCache::bindDepthTarget(Context *rsc, Allocation *a) {
-    if (a != NULL) {
-        if (!a->getIsRenderTarget()) {
-            ALOGE("Invalid Depth Target");
-            return;
-        }
-    }
-    mDepthTarget.set(a);
-    mHal.state.depthTarget = a;
-    mDirty = true;
-}
-
-void FBOCache::resetAll(Context *) {
-    for (uint32_t i = 0; i < mHal.state.colorTargetsCount; i ++) {
-        mColorTargets[i].set(NULL);
-        mHal.state.colorTargets[i] = NULL;
-    }
-    mDepthTarget.set(NULL);
-    mHal.state.depthTarget = NULL;
-    mDirty = true;
-}
-
-void FBOCache::setup(Context *rsc) {
-    if (!mDirty) {
-        return;
-    }
-
-    rsc->mHal.funcs.framebuffer.setActive(rsc, this);
-
-    mDirty = false;
-}
diff --git a/libs/rs/rsFBOCache.h b/libs/rs/rsFBOCache.h
deleted file mode 100644
index abb84de..0000000
--- a/libs/rs/rsFBOCache.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_FRAME_BUFFER_OBJECT_CACHE_H
-#define ANDROID_FRAME_BUFFER_OBJECT_CACHE_H
-
-#include "rsObjectBase.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class Allocation;
-
-class FBOCache {
-public:
-    FBOCache();
-    ~FBOCache();
-
-    void init(Context *rsc);
-    void deinit(Context *rsc);
-
-    void bindColorTarget(Context *rsc, Allocation *a, uint32_t slot);
-    void bindDepthTarget(Context *, Allocation *a);
-    void resetAll(Context *);
-
-    void setup(Context *);
-    void updateSize() { mDirty = true; }
-
-    struct Hal {
-        mutable void *drv;
-
-        struct State {
-            Allocation **colorTargets;
-            uint32_t colorTargetsCount;
-            Allocation *depthTarget;
-        };
-        State state;
-    };
-    Hal mHal;
-
-protected:
-    ObjectBaseRef<Allocation> *mColorTargets;
-    ObjectBaseRef<Allocation> mDepthTarget;
-    bool mDirty;
-    void checkError(Context *);
-    void setColorAttachment(Context *rsc);
-    void setDepthAttachment(Context *rsc);
-    bool renderToFramebuffer();
-
-};
-
-} // renderscript
-} // android
-
-#endif //ANDROID_FRAME_BUFFER_OBJECT_CACHE_H
diff --git a/libs/rs/rsFifo.h b/libs/rs/rsFifo.h
deleted file mode 100644
index 911f446..0000000
--- a/libs/rs/rsFifo.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_FIFO_H
-#define ANDROID_RS_FIFO_H
-
-
-#include "rsUtils.h"
-
-namespace android {
-namespace renderscript {
-
-
-// A simple FIFO to be used as a producer / consumer between two
-// threads.  One is writer and one is reader.  The common cases
-// will not require locking.  It is not threadsafe for multiple
-// readers or writers by design.
-
-class Fifo {
-protected:
-    Fifo();
-    virtual ~Fifo();
-
-public:
-    bool virtual writeAsync(const void *data, size_t bytes, bool waitForSpace = true) = 0;
-    void virtual writeWaitReturn(void *ret, size_t retSize) = 0;
-    size_t virtual read(void *data, size_t bytes, bool doWait = true, uint64_t timeToWait = 0) = 0;
-    void virtual readReturn(const void *data, size_t bytes) = 0;
-
-    void virtual flush() = 0;
-
-};
-
-}
-}
-#endif
diff --git a/libs/rs/rsFifoSocket.cpp b/libs/rs/rsFifoSocket.cpp
deleted file mode 100644
index bd511cf..0000000
--- a/libs/rs/rsFifoSocket.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsFifoSocket.h"
-#include "utils/Timers.h"
-#include "utils/StopWatch.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <poll.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-FifoSocket::FifoSocket() {
-    mShutdown = false;
-}
-
-FifoSocket::~FifoSocket() {
-
-}
-
-bool FifoSocket::init(bool supportNonBlocking, bool supportReturnValues, size_t maxDataSize) {
-    int ret = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
-    return false;
-}
-
-void FifoSocket::shutdown() {
-    mShutdown = true;
-    uint64_t d = 0;
-    ::send(sv[0], &d, sizeof(d), 0);
-    ::send(sv[1], &d, sizeof(d), 0);
-    close(sv[0]);
-    close(sv[1]);
-}
-
-bool FifoSocket::writeAsync(const void *data, size_t bytes, bool waitForSpace) {
-    if (bytes == 0) {
-        return true;
-    }
-    //ALOGE("writeAsync %p %i", data, bytes);
-    size_t ret = ::send(sv[0], data, bytes, 0);
-    //ALOGE("writeAsync ret %i", ret);
-    rsAssert(ret == bytes);
-    return true;
-}
-
-void FifoSocket::writeWaitReturn(void *retData, size_t retBytes) {
-    if (mShutdown) {
-        return;
-    }
-
-    //ALOGE("writeWaitReturn %p %i", retData, retBytes);
-    size_t ret = ::recv(sv[0], retData, retBytes, MSG_WAITALL);
-    //ALOGE("writeWaitReturn %i", ret);
-    rsAssert(ret == retBytes);
-}
-
-size_t FifoSocket::read(void *data, size_t bytes) {
-    if (mShutdown) {
-        return 0;
-    }
-
-    //ALOGE("read %p %i", data, bytes);
-    size_t ret = ::recv(sv[1], data, bytes, MSG_WAITALL);
-    rsAssert(ret == bytes || mShutdown);
-    //ALOGE("read ret %i  bytes %i", ret, bytes);
-    if (mShutdown) {
-        ret = 0;
-    }
-    return ret;
-}
-
-bool FifoSocket::isEmpty() {
-    struct pollfd p;
-    p.fd = sv[1];
-    p.events = POLLIN;
-    int r = poll(&p, 1, 0);
-    //ALOGE("poll r=%i", r);
-    return r == 0;
-}
-
-
-void FifoSocket::readReturn(const void *data, size_t bytes) {
-    //ALOGE("readReturn %p %Zu", data, bytes);
-    size_t ret = ::send(sv[1], data, bytes, 0);
-    //ALOGE("readReturn %Zu", ret);
-    //rsAssert(ret == bytes);
-}
-
-
diff --git a/libs/rs/rsFifoSocket.h b/libs/rs/rsFifoSocket.h
deleted file mode 100644
index cac0a75..0000000
--- a/libs/rs/rsFifoSocket.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_FIFO_SOCKET_H
-#define ANDROID_RS_FIFO_SOCKET_H
-
-
-#include "rsFifo.h"
-
-namespace android {
-namespace renderscript {
-
-
-class FifoSocket {
-public:
-    FifoSocket();
-    virtual ~FifoSocket();
-
-    bool init(bool supportNonBlocking = true,
-              bool supportReturnValues = true,
-              size_t maxDataSize = 0);
-    void shutdown();
-
-    bool writeAsync(const void *data, size_t bytes, bool waitForSpace = true);
-    void writeWaitReturn(void *ret, size_t retSize);
-    size_t read(void *data, size_t bytes);
-    void readReturn(const void *data, size_t bytes);
-    bool isEmpty();
-
-    int getWriteFd() {return sv[0];}
-    int getReadFd() {return sv[1];}
-
-protected:
-    int sv[2];
-    bool mShutdown;
-};
-
-}
-}
-
-#endif
diff --git a/libs/rs/rsFileA3D.cpp b/libs/rs/rsFileA3D.cpp
deleted file mode 100644
index 173b9a5..0000000
--- a/libs/rs/rsFileA3D.cpp
+++ /dev/null
@@ -1,453 +0,0 @@
-
-/*
- * Copyright (C) 2009 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"
-
-#include "rsMesh.h"
-#include "rsAnimation.h"
-#include "rs.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-FileA3D::FileA3D(Context *rsc) : ObjectBase(rsc) {
-    mAlloc = NULL;
-    mData = NULL;
-    mWriteStream = NULL;
-    mReadStream = NULL;
-    mAsset = NULL;
-
-    mMajorVersion = 0;
-    mMinorVersion = 1;
-    mDataSize = 0;
-}
-
-FileA3D::~FileA3D() {
-    for (size_t i = 0; i < mIndex.size(); i ++) {
-        delete mIndex[i];
-    }
-    for (size_t i = 0; i < mWriteIndex.size(); i ++) {
-        delete mWriteIndex[i];
-    }
-    if (mWriteStream) {
-        delete mWriteStream;
-    }
-    if (mReadStream) {
-        delete mWriteStream;
-    }
-    if (mAlloc) {
-        free(mAlloc);
-    }
-    if (mAsset) {
-        delete mAsset;
-    }
-}
-
-void FileA3D::parseHeader(IStream *headerStream) {
-    mMajorVersion = headerStream->loadU32();
-    mMinorVersion = headerStream->loadU32();
-    uint32_t flags = headerStream->loadU32();
-    mUse64BitOffsets = (flags & 1) != 0;
-
-    uint32_t numIndexEntries = headerStream->loadU32();
-    for (uint32_t i = 0; i < numIndexEntries; i ++) {
-        A3DIndexEntry *entry = new A3DIndexEntry();
-        headerStream->loadString(&entry->mObjectName);
-        //ALOGV("Header data, entry name = %s", entry->mObjectName.string());
-        entry->mType = (RsA3DClassID)headerStream->loadU32();
-        if (mUse64BitOffsets){
-            entry->mOffset = headerStream->loadOffset();
-            entry->mLength = headerStream->loadOffset();
-        } else {
-            entry->mOffset = headerStream->loadU32();
-            entry->mLength = headerStream->loadU32();
-        }
-        entry->mRsObj = NULL;
-        mIndex.push(entry);
-    }
-}
-
-bool FileA3D::load(Asset *asset) {
-    mAsset = asset;
-    return load(asset->getBuffer(false), asset->getLength());
-}
-
-bool FileA3D::load(const void *data, size_t length) {
-    const uint8_t *localData = (const uint8_t *)data;
-
-    size_t lengthRemaining = length;
-    size_t magicStrLen = 12;
-    if ((length < magicStrLen) ||
-        memcmp(data, "Android3D_ff", magicStrLen)) {
-        return false;
-    }
-
-    localData += magicStrLen;
-    lengthRemaining -= magicStrLen;
-
-    // Next we get our header size
-    uint64_t headerSize = 0;
-    if (lengthRemaining < sizeof(headerSize)) {
-        return false;
-    }
-
-    memcpy(&headerSize, localData, sizeof(headerSize));
-    localData += sizeof(headerSize);
-    lengthRemaining -= sizeof(headerSize);
-
-    if (lengthRemaining < headerSize) {
-        return false;
-    }
-
-    // Now open the stream to parse the header
-    IStream headerStream(localData, false);
-    parseHeader(&headerStream);
-
-    localData += headerSize;
-    lengthRemaining -= headerSize;
-
-    if (lengthRemaining < sizeof(mDataSize)) {
-        return false;
-    }
-
-    // Read the size of the data
-    memcpy(&mDataSize, localData, sizeof(mDataSize));
-    localData += sizeof(mDataSize);
-    lengthRemaining -= sizeof(mDataSize);
-
-    if (lengthRemaining < mDataSize) {
-        return false;
-    }
-
-    // We should know enough to read the file in at this point.
-    mData = (uint8_t *)localData;
-    mReadStream = new IStream(mData, mUse64BitOffsets);
-
-    return true;
-}
-
-bool FileA3D::load(FILE *f) {
-    char magicString[12];
-    size_t len;
-
-    ALOGV("file open 1");
-    len = fread(magicString, 1, 12, f);
-    if ((len != 12) ||
-        memcmp(magicString, "Android3D_ff", 12)) {
-        return false;
-    }
-
-    // Next thing is the size of the header
-    uint64_t headerSize = 0;
-    len = fread(&headerSize, 1, sizeof(headerSize), f);
-    if (len != sizeof(headerSize) || headerSize == 0) {
-        return false;
-    }
-
-    uint8_t *headerData = (uint8_t *)malloc(headerSize);
-    if (!headerData) {
-        return false;
-    }
-
-    len = fread(headerData, 1, headerSize, f);
-    if (len != headerSize) {
-        return false;
-    }
-
-    // Now open the stream to parse the header
-    IStream headerStream(headerData, false);
-    parseHeader(&headerStream);
-
-    free(headerData);
-
-    // Next thing is the size of the header
-    len = fread(&mDataSize, 1, sizeof(mDataSize), f);
-    if (len != sizeof(mDataSize) || mDataSize == 0) {
-        return false;
-    }
-
-    ALOGV("file open size = %lli", mDataSize);
-
-    // We should know enough to read the file in at this point.
-    mAlloc = malloc(mDataSize);
-    if (!mAlloc) {
-        return false;
-    }
-    mData = (uint8_t *)mAlloc;
-    len = fread(mAlloc, 1, mDataSize, f);
-    if (len != mDataSize) {
-        return false;
-    }
-
-    mReadStream = new IStream(mData, mUse64BitOffsets);
-
-    ALOGV("Header is read an stream initialized");
-    return true;
-}
-
-size_t FileA3D::getNumIndexEntries() const {
-    return mIndex.size();
-}
-
-const FileA3D::A3DIndexEntry *FileA3D::getIndexEntry(size_t index) const {
-    if (index < mIndex.size()) {
-        return mIndex[index];
-    }
-    return NULL;
-}
-
-ObjectBase *FileA3D::initializeFromEntry(size_t index) {
-    if (index >= mIndex.size()) {
-        return NULL;
-    }
-
-    FileA3D::A3DIndexEntry *entry = mIndex[index];
-    if (!entry) {
-        return NULL;
-    }
-
-    if (entry->mRsObj) {
-        entry->mRsObj->incUserRef();
-        return entry->mRsObj;
-    }
-
-    // Seek to the beginning of object
-    mReadStream->reset(entry->mOffset);
-    switch (entry->mType) {
-        case RS_A3D_CLASS_ID_UNKNOWN:
-            return NULL;
-        case RS_A3D_CLASS_ID_MESH:
-            entry->mRsObj = Mesh::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_TYPE:
-            entry->mRsObj = Type::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_ELEMENT:
-            entry->mRsObj = Element::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_ALLOCATION:
-            entry->mRsObj = Allocation::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_PROGRAM_VERTEX:
-            //entry->mRsObj = ProgramVertex::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_PROGRAM_RASTER:
-            //entry->mRsObj = ProgramRaster::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_PROGRAM_FRAGMENT:
-            //entry->mRsObj = ProgramFragment::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_PROGRAM_STORE:
-            //entry->mRsObj = ProgramStore::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_SAMPLER:
-            //entry->mRsObj = Sampler::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_ANIMATION:
-            //entry->mRsObj = Animation::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_ADAPTER_1D:
-            //entry->mRsObj = Adapter1D::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_ADAPTER_2D:
-            //entry->mRsObj = Adapter2D::createFromStream(mRSC, mReadStream);
-            break;
-        case RS_A3D_CLASS_ID_SCRIPT_C:
-            break;
-    }
-    if (entry->mRsObj) {
-        entry->mRsObj->incUserRef();
-    }
-    return entry->mRsObj;
-}
-
-bool FileA3D::writeFile(const char *filename) {
-    if (!mWriteStream) {
-        ALOGE("No objects to write\n");
-        return false;
-    }
-    if (mWriteStream->getPos() == 0) {
-        ALOGE("No objects to write\n");
-        return false;
-    }
-
-    FILE *writeHandle = fopen(filename, "wb");
-    if (!writeHandle) {
-        ALOGE("Couldn't open the file for writing\n");
-        return false;
-    }
-
-    // Open a new stream to make writing the header easier
-    OStream headerStream(5*1024, false);
-    headerStream.addU32(mMajorVersion);
-    headerStream.addU32(mMinorVersion);
-    uint32_t is64Bit = 0;
-    headerStream.addU32(is64Bit);
-
-    uint32_t writeIndexSize = mWriteIndex.size();
-    headerStream.addU32(writeIndexSize);
-    for (uint32_t i = 0; i < writeIndexSize; i ++) {
-        headerStream.addString(&mWriteIndex[i]->mObjectName);
-        headerStream.addU32((uint32_t)mWriteIndex[i]->mType);
-        if (mUse64BitOffsets){
-            headerStream.addOffset(mWriteIndex[i]->mOffset);
-            headerStream.addOffset(mWriteIndex[i]->mLength);
-        } else {
-            uint32_t offset = (uint32_t)mWriteIndex[i]->mOffset;
-            headerStream.addU32(offset);
-            offset = (uint32_t)mWriteIndex[i]->mLength;
-            headerStream.addU32(offset);
-        }
-    }
-
-    // Write our magic string so we know we are reading the right file
-    String8 magicString(A3D_MAGIC_KEY);
-    fwrite(magicString.string(), sizeof(char), magicString.size(), writeHandle);
-
-    // Store the size of the header to make it easier to parse when we read it
-    uint64_t headerSize = headerStream.getPos();
-    fwrite(&headerSize, sizeof(headerSize), 1, writeHandle);
-
-    // Now write our header
-    fwrite(headerStream.getPtr(), sizeof(uint8_t), headerStream.getPos(), writeHandle);
-
-    // Now write the size of the data part of the file for easier parsing later
-    uint64_t fileDataSize = mWriteStream->getPos();
-    fwrite(&fileDataSize, sizeof(fileDataSize), 1, writeHandle);
-
-    fwrite(mWriteStream->getPtr(), sizeof(uint8_t), mWriteStream->getPos(), writeHandle);
-
-    int status = fclose(writeHandle);
-
-    if (status != 0) {
-        ALOGE("Couldn't close file\n");
-        return false;
-    }
-
-    return true;
-}
-
-void FileA3D::appendToFile(ObjectBase *obj) {
-    if (!obj) {
-        return;
-    }
-    if (!mWriteStream) {
-        const uint64_t initialStreamSize = 256*1024;
-        mWriteStream = new OStream(initialStreamSize, false);
-    }
-    A3DIndexEntry *indexEntry = new A3DIndexEntry();
-    indexEntry->mObjectName.setTo(obj->getName());
-    indexEntry->mType = obj->getClassId();
-    indexEntry->mOffset = mWriteStream->getPos();
-    indexEntry->mRsObj = obj;
-    mWriteIndex.push(indexEntry);
-    obj->serialize(mWriteStream);
-    indexEntry->mLength = mWriteStream->getPos() - indexEntry->mOffset;
-    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 NULL;
-    }
-
-    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 == NULL) {
-        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 = entry->getObjectName().string();
-    }
-}
-
-RsFile rsaFileA3DCreateFromMemory(RsContext con, const void *data, uint32_t len) {
-    if (data == NULL) {
-        ALOGE("File load failed. Asset stream is NULL");
-        return NULL;
-    }
-
-    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) {
-    Context *rsc = static_cast<Context *>(con);
-    Asset *asset = static_cast<Asset *>(_asset);
-    FileA3D *fa3d = new FileA3D(rsc);
-    fa3d->incUserRef();
-
-    fa3d->load(asset);
-    return fa3d;
-}
-
-RsFile rsaFileA3DCreateFromFile(RsContext con, const char *path) {
-    if (path == NULL) {
-        ALOGE("File load failed. Path is NULL");
-        return NULL;
-    }
-
-    Context *rsc = static_cast<Context *>(con);
-    FileA3D *fa3d = NULL;
-
-    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/libs/rs/rsFileA3D.h b/libs/rs/rsFileA3D.h
deleted file mode 100644
index 08062c6..0000000
--- a/libs/rs/rsFileA3D.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_FILE_A3D_H
-#define ANDROID_RS_FILE_A3D_H
-
-#include "rsMesh.h"
-
-#include <androidfw/Asset.h>
-#include <utils/String8.h>
-#include "rsStream.h"
-#include <stdio.h>
-
-#define A3D_MAGIC_KEY "Android3D_ff"
-
-// ---------------------------------------------------------------------------
-namespace android {
-
-namespace renderscript {
-
-class FileA3D : public ObjectBase {
-public:
-    FileA3D(Context *rsc);
-    ~FileA3D();
-
-    uint32_t mMajorVersion;
-    uint32_t mMinorVersion;
-    uint64_t mIndexOffset;
-    uint64_t mStringTableOffset;
-    bool mUse64BitOffsets;
-
-    class A3DIndexEntry {
-        String8 mObjectName;
-        RsA3DClassID mType;
-        uint64_t mOffset;
-        uint64_t mLength;
-        ObjectBase *mRsObj;
-    public:
-        friend class FileA3D;
-        const String8 &getObjectName() const {
-            return mObjectName;
-        }
-        RsA3DClassID getType() const {
-            return mType;
-        }
-    };
-
-    bool load(FILE *f);
-    bool load(Asset *asset);
-    bool load(const void *data, size_t length);
-
-    size_t getNumIndexEntries() const;
-    const A3DIndexEntry* getIndexEntry(size_t index) const;
-    ObjectBase *initializeFromEntry(size_t index);
-
-    void appendToFile(ObjectBase *obj);
-    bool writeFile(const char *filename);
-
-    // Currently files do not get serialized,
-    // but we need to inherit from ObjectBase for ref tracking
-    virtual void serialize(OStream *stream) const {
-    }
-    virtual RsA3DClassID getClassId() const {
-        return RS_A3D_CLASS_ID_UNKNOWN;
-    }
-
-protected:
-
-    void parseHeader(IStream *headerStream);
-
-    const uint8_t * mData;
-    void * mAlloc;
-    uint64_t mDataSize;
-    Asset *mAsset;
-
-    OStream *mWriteStream;
-    Vector<A3DIndexEntry*> mWriteIndex;
-
-    IStream *mReadStream;
-    Vector<A3DIndexEntry*> mIndex;
-};
-
-
-}
-}
-#endif //ANDROID_RS_FILE_A3D_H
-
-
diff --git a/libs/rs/rsFont.cpp b/libs/rs/rsFont.cpp
deleted file mode 100644
index 1f53c79..0000000
--- a/libs/rs/rsFont.cpp
+++ /dev/null
@@ -1,873 +0,0 @@
-
-/*
- * Copyright (C) 2009 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 "rs.h"
-#include "rsFont.h"
-#include "rsProgramFragment.h"
-#include "rsMesh.h"
-#include <cutils/properties.h>
-
-#ifndef ANDROID_RS_SERIALIZE
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_BITMAP_H
-#endif //ANDROID_RS_SERIALIZE
-
-using namespace android;
-using namespace android::renderscript;
-
-Font::Font(Context *rsc) : ObjectBase(rsc), mCachedGlyphs(NULL) {
-    mInitialized = false;
-    mHasKerning = false;
-    mFace = NULL;
-}
-
-bool Font::init(const char *name, float fontSize, uint32_t dpi, const void *data, uint32_t dataLen) {
-#ifndef ANDROID_RS_SERIALIZE
-    if (mInitialized) {
-        ALOGE("Reinitialization of fonts not supported");
-        return false;
-    }
-
-    FT_Error error = 0;
-    if (data != NULL && dataLen > 0) {
-        error = FT_New_Memory_Face(mRSC->mStateFont.getLib(), (const FT_Byte*)data, dataLen, 0, &mFace);
-    } else {
-        error = FT_New_Face(mRSC->mStateFont.getLib(), name, 0, &mFace);
-    }
-
-    if (error) {
-        ALOGE("Unable to initialize font %s", name);
-        return false;
-    }
-
-    mFontName = name;
-    mFontSize = fontSize;
-    mDpi = dpi;
-
-    error = FT_Set_Char_Size(mFace, (FT_F26Dot6)(fontSize * 64.0f), 0, dpi, 0);
-    if (error) {
-        ALOGE("Unable to set font size on %s", name);
-        return false;
-    }
-
-    mHasKerning = FT_HAS_KERNING(mFace);
-
-    mInitialized = true;
-#endif //ANDROID_RS_SERIALIZE
-    return true;
-}
-
-void Font::preDestroy() const {
-    for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) {
-        if (mRSC->mStateFont.mActiveFonts[ct] == this) {
-            mRSC->mStateFont.mActiveFonts.removeAt(ct);
-            break;
-        }
-    }
-}
-
-void Font::invalidateTextureCache() {
-    for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) {
-        mCachedGlyphs.valueAt(i)->mIsValid = false;
-    }
-}
-
-void Font::drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y) {
-    FontState *state = &mRSC->mStateFont;
-
-    int32_t nPenX = x + glyph->mBitmapLeft;
-    int32_t nPenY = y - glyph->mBitmapTop + glyph->mBitmapHeight;
-
-    float u1 = glyph->mBitmapMinU;
-    float u2 = glyph->mBitmapMaxU;
-    float v1 = glyph->mBitmapMinV;
-    float v2 = glyph->mBitmapMaxV;
-
-    int32_t width = (int32_t) glyph->mBitmapWidth;
-    int32_t height = (int32_t) glyph->mBitmapHeight;
-
-    state->appendMeshQuad(nPenX, nPenY, 0, u1, v2,
-                          nPenX + width, nPenY, 0, u2, v2,
-                          nPenX + width, nPenY - height, 0, u2, v1,
-                          nPenX, nPenY - height, 0, u1, v1);
-}
-
-void Font::drawCachedGlyph(CachedGlyphInfo* glyph, int32_t x, int32_t y,
-                           uint8_t* bitmap, uint32_t bitmapW, uint32_t bitmapH) {
-    int32_t nPenX = x + glyph->mBitmapLeft;
-    int32_t nPenY = y + glyph->mBitmapTop;
-
-    uint32_t endX = glyph->mBitmapMinX + glyph->mBitmapWidth;
-    uint32_t endY = glyph->mBitmapMinY + glyph->mBitmapHeight;
-
-    FontState *state = &mRSC->mStateFont;
-    uint32_t cacheWidth = state->getCacheTextureType()->getDimX();
-    const uint8_t* cacheBuffer = state->getTextTextureData();
-
-    uint32_t cacheX = 0, cacheY = 0;
-    int32_t bX = 0, bY = 0;
-    for (cacheX = glyph->mBitmapMinX, bX = nPenX; cacheX < endX; cacheX++, bX++) {
-        for (cacheY = glyph->mBitmapMinY, bY = nPenY; cacheY < endY; cacheY++, bY++) {
-            if (bX < 0 || bY < 0 || bX >= (int32_t) bitmapW || bY >= (int32_t) bitmapH) {
-                ALOGE("Skipping invalid index");
-                continue;
-            }
-            uint8_t tempCol = cacheBuffer[cacheY * cacheWidth + cacheX];
-            bitmap[bY * bitmapW + bX] = tempCol;
-        }
-    }
-}
-
-void Font::measureCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, Rect *bounds) {
-    int32_t nPenX = x + glyph->mBitmapLeft;
-    int32_t nPenY = y - glyph->mBitmapTop + glyph->mBitmapHeight;
-
-    int32_t width = (int32_t) glyph->mBitmapWidth;
-    int32_t height = (int32_t) glyph->mBitmapHeight;
-
-    // 0, 0 is top left, so bottom is a positive number
-    if (bounds->bottom < nPenY) {
-        bounds->bottom = nPenY;
-    }
-    if (bounds->left > nPenX) {
-        bounds->left = nPenX;
-    }
-    if (bounds->right < nPenX + width) {
-        bounds->right = nPenX + width;
-    }
-    if (bounds->top > nPenY - height) {
-        bounds->top = nPenY - height;
-    }
-}
-
-void Font::renderUTF(const char *text, uint32_t len, int32_t x, int32_t y,
-                     uint32_t start, int32_t numGlyphs,
-                     RenderMode mode, Rect *bounds,
-                     uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH) {
-    if (!mInitialized || numGlyphs == 0 || text == NULL || len == 0) {
-        return;
-    }
-
-    if (mode == Font::MEASURE) {
-        if (bounds == NULL) {
-            ALOGE("No return rectangle provided to measure text");
-            return;
-        }
-        // Reset min and max of the bounding box to something large
-        bounds->set(1e6, -1e6, 1e6, -1e6);
-    }
-
-    int32_t penX = x, penY = y;
-    int32_t glyphsLeft = 1;
-    if (numGlyphs > 0) {
-        glyphsLeft = numGlyphs;
-    }
-
-    size_t index = start;
-    size_t nextIndex = 0;
-
-    while (glyphsLeft > 0) {
-
-        int32_t utfChar = utf32_from_utf8_at(text, len, index, &nextIndex);
-
-        // Reached the end of the string or encountered
-        if (utfChar < 0) {
-            break;
-        }
-
-        // Move to the next character in the array
-        index = nextIndex;
-
-        CachedGlyphInfo *cachedGlyph = getCachedUTFChar(utfChar);
-
-        // If it's still not valid, we couldn't cache it, so we shouldn't draw garbage
-        if (cachedGlyph->mIsValid) {
-            switch (mode) {
-            case FRAMEBUFFER:
-                drawCachedGlyph(cachedGlyph, penX, penY);
-                break;
-            case BITMAP:
-                drawCachedGlyph(cachedGlyph, penX, penY, bitmap, bitmapW, bitmapH);
-                break;
-            case MEASURE:
-                measureCachedGlyph(cachedGlyph, penX, penY, bounds);
-                break;
-            }
-        }
-
-        penX += (cachedGlyph->mAdvanceX >> 6);
-
-        // If we were given a specific number of glyphs, decrement
-        if (numGlyphs > 0) {
-            glyphsLeft --;
-        }
-    }
-}
-
-Font::CachedGlyphInfo* Font::getCachedUTFChar(int32_t utfChar) {
-
-    CachedGlyphInfo *cachedGlyph = mCachedGlyphs.valueFor((uint32_t)utfChar);
-    if (cachedGlyph == NULL) {
-        cachedGlyph = cacheGlyph((uint32_t)utfChar);
-    }
-    // Is the glyph still in texture cache?
-    if (!cachedGlyph->mIsValid) {
-        updateGlyphCache(cachedGlyph);
-    }
-
-    return cachedGlyph;
-}
-
-void Font::updateGlyphCache(CachedGlyphInfo *glyph) {
-#ifndef ANDROID_RS_SERIALIZE
-    FT_Error error = FT_Load_Glyph( mFace, glyph->mGlyphIndex, FT_LOAD_RENDER );
-    if (error) {
-        ALOGE("Couldn't load glyph.");
-        return;
-    }
-
-    glyph->mAdvanceX = mFace->glyph->advance.x;
-    glyph->mAdvanceY = mFace->glyph->advance.y;
-    glyph->mBitmapLeft = mFace->glyph->bitmap_left;
-    glyph->mBitmapTop = mFace->glyph->bitmap_top;
-
-    FT_Bitmap *bitmap = &mFace->glyph->bitmap;
-
-    // Now copy the bitmap into the cache texture
-    uint32_t startX = 0;
-    uint32_t startY = 0;
-
-    // Let the font state figure out where to put the bitmap
-    FontState *state = &mRSC->mStateFont;
-    glyph->mIsValid = state->cacheBitmap(bitmap, &startX, &startY);
-
-    if (!glyph->mIsValid) {
-        return;
-    }
-
-    uint32_t endX = startX + bitmap->width;
-    uint32_t endY = startY + bitmap->rows;
-
-    glyph->mBitmapMinX = startX;
-    glyph->mBitmapMinY = startY;
-    glyph->mBitmapWidth = bitmap->width;
-    glyph->mBitmapHeight = bitmap->rows;
-
-    uint32_t cacheWidth = state->getCacheTextureType()->getDimX();
-    uint32_t cacheHeight = state->getCacheTextureType()->getDimY();
-
-    glyph->mBitmapMinU = (float)startX / (float)cacheWidth;
-    glyph->mBitmapMinV = (float)startY / (float)cacheHeight;
-    glyph->mBitmapMaxU = (float)endX / (float)cacheWidth;
-    glyph->mBitmapMaxV = (float)endY / (float)cacheHeight;
-#endif //ANDROID_RS_SERIALIZE
-}
-
-Font::CachedGlyphInfo *Font::cacheGlyph(uint32_t glyph) {
-    CachedGlyphInfo *newGlyph = new CachedGlyphInfo();
-    mCachedGlyphs.add(glyph, newGlyph);
-#ifndef ANDROID_RS_SERIALIZE
-    newGlyph->mGlyphIndex = FT_Get_Char_Index(mFace, glyph);
-    newGlyph->mIsValid = false;
-#endif //ANDROID_RS_SERIALIZE
-    updateGlyphCache(newGlyph);
-
-    return newGlyph;
-}
-
-Font * Font::create(Context *rsc, const char *name, float fontSize, uint32_t dpi,
-                    const void *data, uint32_t dataLen) {
-    rsc->mStateFont.checkInit();
-    Vector<Font*> &activeFonts = rsc->mStateFont.mActiveFonts;
-
-    for (uint32_t i = 0; i < activeFonts.size(); i ++) {
-        Font *ithFont = activeFonts[i];
-        if (ithFont->mFontName == name && ithFont->mFontSize == fontSize && ithFont->mDpi == dpi) {
-            return ithFont;
-        }
-    }
-
-    Font *newFont = new Font(rsc);
-    bool isInitialized = newFont->init(name, fontSize, dpi, data, dataLen);
-    if (isInitialized) {
-        activeFonts.push(newFont);
-        rsc->mStateFont.precacheLatin(newFont);
-        return newFont;
-    }
-
-    ObjectBase::checkDelete(newFont);
-    return NULL;
-}
-
-Font::~Font() {
-#ifndef ANDROID_RS_SERIALIZE
-    if (mFace) {
-        FT_Done_Face(mFace);
-    }
-#endif
-
-    for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) {
-        CachedGlyphInfo *glyph = mCachedGlyphs.valueAt(i);
-        delete glyph;
-    }
-}
-
-FontState::FontState() {
-    mInitialized = false;
-    mMaxNumberOfQuads = 1024;
-    mCurrentQuadIndex = 0;
-    mRSC = NULL;
-#ifndef ANDROID_RS_SERIALIZE
-    mLibrary = NULL;
-#endif //ANDROID_RS_SERIALIZE
-
-    // Get the renderer properties
-    char property[PROPERTY_VALUE_MAX];
-
-    // Get the gamma
-    float gamma = DEFAULT_TEXT_GAMMA;
-    if (property_get(PROPERTY_TEXT_GAMMA, property, NULL) > 0) {
-        gamma = atof(property);
-    }
-
-    // Get the black gamma threshold
-    int32_t blackThreshold = DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD;
-    if (property_get(PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD, property, NULL) > 0) {
-        blackThreshold = atoi(property);
-    }
-    mBlackThreshold = (float)(blackThreshold) / 255.0f;
-
-    // Get the white gamma threshold
-    int32_t whiteThreshold = DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD;
-    if (property_get(PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD, property, NULL) > 0) {
-        whiteThreshold = atoi(property);
-    }
-    mWhiteThreshold = (float)(whiteThreshold) / 255.0f;
-
-    // Compute the gamma tables
-    mBlackGamma = gamma;
-    mWhiteGamma = 1.0f / gamma;
-
-    setFontColor(0.1f, 0.1f, 0.1f, 1.0f);
-}
-
-FontState::~FontState() {
-    for (uint32_t i = 0; i < mCacheLines.size(); i ++) {
-        delete mCacheLines[i];
-    }
-
-    rsAssert(!mActiveFonts.size());
-}
-#ifndef ANDROID_RS_SERIALIZE
-FT_Library FontState::getLib() {
-    if (!mLibrary) {
-        FT_Error error = FT_Init_FreeType(&mLibrary);
-        if (error) {
-            ALOGE("Unable to initialize freetype");
-            return NULL;
-        }
-    }
-
-    return mLibrary;
-}
-#endif //ANDROID_RS_SERIALIZE
-
-
-void FontState::init(Context *rsc) {
-    mRSC = rsc;
-}
-
-void FontState::flushAllAndInvalidate() {
-    if (mCurrentQuadIndex != 0) {
-        issueDrawCommand();
-        mCurrentQuadIndex = 0;
-    }
-    for (uint32_t i = 0; i < mActiveFonts.size(); i ++) {
-        mActiveFonts[i]->invalidateTextureCache();
-    }
-    for (uint32_t i = 0; i < mCacheLines.size(); i ++) {
-        mCacheLines[i]->mCurrentCol = 0;
-    }
-}
-
-#ifndef ANDROID_RS_SERIALIZE
-bool FontState::cacheBitmap(FT_Bitmap *bitmap, uint32_t *retOriginX, uint32_t *retOriginY) {
-    // If the glyph is too tall, don't cache it
-    if ((uint32_t)bitmap->rows > mCacheLines[mCacheLines.size()-1]->mMaxHeight) {
-        ALOGE("Font size to large to fit in cache. width, height = %i, %i", (int)bitmap->width, (int)bitmap->rows);
-        return false;
-    }
-
-    // Now copy the bitmap into the cache texture
-    uint32_t startX = 0;
-    uint32_t startY = 0;
-
-    bool bitmapFit = false;
-    for (uint32_t i = 0; i < mCacheLines.size(); i ++) {
-        bitmapFit = mCacheLines[i]->fitBitmap(bitmap, &startX, &startY);
-        if (bitmapFit) {
-            break;
-        }
-    }
-
-    // If the new glyph didn't fit, flush the state so far and invalidate everything
-    if (!bitmapFit) {
-        flushAllAndInvalidate();
-
-        // Try to fit it again
-        for (uint32_t i = 0; i < mCacheLines.size(); i ++) {
-            bitmapFit = mCacheLines[i]->fitBitmap(bitmap, &startX, &startY);
-            if (bitmapFit) {
-                break;
-            }
-        }
-
-        // if we still don't fit, something is wrong and we shouldn't draw
-        if (!bitmapFit) {
-            ALOGE("Bitmap doesn't fit in cache. width, height = %i, %i", (int)bitmap->width, (int)bitmap->rows);
-            return false;
-        }
-    }
-
-    *retOriginX = startX;
-    *retOriginY = startY;
-
-    uint32_t endX = startX + bitmap->width;
-    uint32_t endY = startY + bitmap->rows;
-
-    uint32_t cacheWidth = getCacheTextureType()->getDimX();
-
-    uint8_t *cacheBuffer = (uint8_t*)mTextTexture->getPtr();
-    uint8_t *bitmapBuffer = bitmap->buffer;
-
-    uint32_t cacheX = 0, bX = 0, cacheY = 0, bY = 0;
-    for (cacheX = startX, bX = 0; cacheX < endX; cacheX ++, bX ++) {
-        for (cacheY = startY, bY = 0; cacheY < endY; cacheY ++, bY ++) {
-            uint8_t tempCol = bitmapBuffer[bY * bitmap->width + bX];
-            cacheBuffer[cacheY*cacheWidth + cacheX] = tempCol;
-        }
-    }
-
-    // This will dirty the texture and the shader so next time
-    // we draw it will upload the data
-
-    mTextTexture->sendDirty(mRSC);
-    mFontShaderF->bindTexture(mRSC, 0, mTextTexture.get());
-
-    // Some debug code
-    /*for (uint32_t i = 0; i < mCacheLines.size(); i ++) {
-        ALOGE("Cache Line: H: %u Empty Space: %f",
-             mCacheLines[i]->mMaxHeight,
-              (1.0f - (float)mCacheLines[i]->mCurrentCol/(float)mCacheLines[i]->mMaxWidth)*100.0f);
-
-    }*/
-
-    return true;
-}
-#endif //ANDROID_RS_SERIALIZE
-
-void FontState::initRenderState() {
-    String8 shaderString("varying vec2 varTex0;\n");
-    shaderString.append("void main() {\n");
-    shaderString.append("  lowp vec4 col = UNI_Color;\n");
-    shaderString.append("  col.a = texture2D(UNI_Tex0, varTex0.xy).a;\n");
-    shaderString.append("  col.a = pow(col.a, UNI_Gamma);\n");
-    shaderString.append("  gl_FragColor = col;\n");
-    shaderString.append("}\n");
-
-    const char *textureNames[] = { "Tex0" };
-    const size_t textureNamesLengths[] = { 4 };
-    size_t numTextures = sizeof(textureNamesLengths)/sizeof(*textureNamesLengths);
-
-    ObjectBaseRef<const Element> colorElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32,
-                                                                RS_KIND_USER, false, 4);
-    ObjectBaseRef<const Element> gammaElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32,
-                                                                RS_KIND_USER, false, 1);
-    Element::Builder builder;
-    builder.add(colorElem.get(), "Color", 1);
-    builder.add(gammaElem.get(), "Gamma", 1);
-    ObjectBaseRef<const Element> constInput = builder.create(mRSC);
-
-    ObjectBaseRef<Type> inputType = Type::getTypeRef(mRSC, constInput.get(), 1, 0, 0, false, false);
-
-    uint32_t tmp[4];
-    tmp[0] = RS_PROGRAM_PARAM_CONSTANT;
-    tmp[1] = (uint32_t)inputType.get();
-    tmp[2] = RS_PROGRAM_PARAM_TEXTURE_TYPE;
-    tmp[3] = RS_TEXTURE_2D;
-
-    mFontShaderFConstant.set(Allocation::createAllocation(mRSC, inputType.get(),
-                                                          RS_ALLOCATION_USAGE_SCRIPT |
-                                                          RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS));
-    ProgramFragment *pf = new ProgramFragment(mRSC, shaderString.string(), shaderString.length(),
-                                              textureNames, numTextures, textureNamesLengths,
-                                              tmp, 4);
-    mFontShaderF.set(pf);
-    mFontShaderF->bindAllocation(mRSC, mFontShaderFConstant.get(), 0);
-
-    mFontSampler.set(Sampler::getSampler(mRSC, RS_SAMPLER_NEAREST, RS_SAMPLER_NEAREST,
-                                         RS_SAMPLER_CLAMP, RS_SAMPLER_CLAMP,
-                                         RS_SAMPLER_CLAMP).get());
-    mFontShaderF->bindSampler(mRSC, 0, mFontSampler.get());
-
-    mFontProgramStore.set(ProgramStore::getProgramStore(mRSC, true, true, true, true,
-                                                        false, false,
-                                                        RS_BLEND_SRC_SRC_ALPHA,
-                                                        RS_BLEND_DST_ONE_MINUS_SRC_ALPHA,
-                                                        RS_DEPTH_FUNC_ALWAYS).get());
-    mFontProgramStore->init();
-}
-
-void FontState::initTextTexture() {
-    ObjectBaseRef<const Element> alphaElem = Element::createRef(mRSC, RS_TYPE_UNSIGNED_8,
-                                                                RS_KIND_PIXEL_A, true, 1);
-
-    // We will allocate a texture to initially hold 32 character bitmaps
-    ObjectBaseRef<Type> texType = Type::getTypeRef(mRSC, alphaElem.get(),
-                                                   1024, 256, 0, false, false);
-
-    Allocation *cacheAlloc = Allocation::createAllocation(mRSC, texType.get(),
-                                RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE);
-    mTextTexture.set(cacheAlloc);
-    mTextTexture->syncAll(mRSC, RS_ALLOCATION_USAGE_SCRIPT);
-
-    // Split up our cache texture into lines of certain widths
-    int32_t nextLine = 0;
-    mCacheLines.push(new CacheTextureLine(16, texType->getDimX(), nextLine, 0));
-    nextLine += mCacheLines.top()->mMaxHeight;
-    mCacheLines.push(new CacheTextureLine(24, texType->getDimX(), nextLine, 0));
-    nextLine += mCacheLines.top()->mMaxHeight;
-    mCacheLines.push(new CacheTextureLine(24, texType->getDimX(), nextLine, 0));
-    nextLine += mCacheLines.top()->mMaxHeight;
-    mCacheLines.push(new CacheTextureLine(32, texType->getDimX(), nextLine, 0));
-    nextLine += mCacheLines.top()->mMaxHeight;
-    mCacheLines.push(new CacheTextureLine(32, texType->getDimX(), nextLine, 0));
-    nextLine += mCacheLines.top()->mMaxHeight;
-    mCacheLines.push(new CacheTextureLine(40, texType->getDimX(), nextLine, 0));
-    nextLine += mCacheLines.top()->mMaxHeight;
-    mCacheLines.push(new CacheTextureLine(texType->getDimY() - nextLine, texType->getDimX(), nextLine, 0));
-}
-
-// Avoid having to reallocate memory and render quad by quad
-void FontState::initVertexArrayBuffers() {
-    // Now lets write index data
-    ObjectBaseRef<const Element> indexElem = Element::createRef(mRSC, RS_TYPE_UNSIGNED_16, RS_KIND_USER, false, 1);
-    uint32_t numIndicies = mMaxNumberOfQuads * 6;
-    ObjectBaseRef<Type> indexType = Type::getTypeRef(mRSC, indexElem.get(), numIndicies, 0, 0, false, false);
-
-    Allocation *indexAlloc = Allocation::createAllocation(mRSC, indexType.get(),
-                                                          RS_ALLOCATION_USAGE_SCRIPT |
-                                                          RS_ALLOCATION_USAGE_GRAPHICS_VERTEX);
-    uint16_t *indexPtr = (uint16_t*)indexAlloc->getPtr();
-
-    // Four verts, two triangles , six indices per quad
-    for (uint32_t i = 0; i < mMaxNumberOfQuads; i ++) {
-        int32_t i6 = i * 6;
-        int32_t i4 = i * 4;
-
-        indexPtr[i6 + 0] = i4 + 0;
-        indexPtr[i6 + 1] = i4 + 1;
-        indexPtr[i6 + 2] = i4 + 2;
-
-        indexPtr[i6 + 3] = i4 + 0;
-        indexPtr[i6 + 4] = i4 + 2;
-        indexPtr[i6 + 5] = i4 + 3;
-    }
-
-    indexAlloc->sendDirty(mRSC);
-
-    ObjectBaseRef<const Element> posElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 3);
-    ObjectBaseRef<const Element> texElem = Element::createRef(mRSC, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 2);
-
-    Element::Builder builder;
-    builder.add(posElem.get(), "position", 1);
-    builder.add(texElem.get(), "texture0", 1);
-    ObjectBaseRef<const Element> vertexDataElem = builder.create(mRSC);
-
-    ObjectBaseRef<Type> vertexDataType = Type::getTypeRef(mRSC, vertexDataElem.get(),
-                                                          mMaxNumberOfQuads * 4,
-                                                          0, 0, false, false);
-
-    Allocation *vertexAlloc = Allocation::createAllocation(mRSC, vertexDataType.get(),
-                                                           RS_ALLOCATION_USAGE_SCRIPT);
-    mTextMeshPtr = (float*)vertexAlloc->getPtr();
-
-    mMesh.set(new Mesh(mRSC, 1, 1));
-    mMesh->setVertexBuffer(vertexAlloc, 0);
-    mMesh->setPrimitive(indexAlloc, RS_PRIMITIVE_TRIANGLE, 0);
-    mMesh->init();
-}
-
-// We don't want to allocate anything unless we actually draw text
-void FontState::checkInit() {
-    if (mInitialized) {
-        return;
-    }
-
-    initTextTexture();
-    initRenderState();
-
-    initVertexArrayBuffers();
-
-    // We store a string with letters in a rough frequency of occurrence
-    mLatinPrecache = String8(" eisarntolcdugpmhbyfvkwzxjq");
-    mLatinPrecache += String8("EISARNTOLCDUGPMHBYFVKWZXJQ");
-    mLatinPrecache += String8(",.?!()-+@;:`'");
-    mLatinPrecache += String8("0123456789");
-
-    mInitialized = true;
-}
-
-void FontState::issueDrawCommand() {
-    Context::PushState ps(mRSC);
-
-    mRSC->setProgramVertex(mRSC->getDefaultProgramVertex());
-    mRSC->setProgramRaster(mRSC->getDefaultProgramRaster());
-    mRSC->setProgramFragment(mFontShaderF.get());
-    mRSC->setProgramStore(mFontProgramStore.get());
-
-    if (mConstantsDirty) {
-        mFontShaderFConstant->data(mRSC, 0, 0, 1, &mConstants, sizeof(mConstants));
-        mConstantsDirty = false;
-    }
-
-    if (!mRSC->setupCheck()) {
-        return;
-    }
-
-    mMesh->renderPrimitiveRange(mRSC, 0, 0, mCurrentQuadIndex * 6);
-}
-
-void FontState::appendMeshQuad(float x1, float y1, float z1,
-                               float u1, float v1,
-                               float x2, float y2, float z2,
-                               float u2, float v2,
-                               float x3, float y3, float z3,
-                               float u3, float v3,
-                               float x4, float y4, float z4,
-                               float u4, float v4) {
-    const uint32_t vertsPerQuad = 4;
-    const uint32_t floatsPerVert = 6;
-    float *currentPos = mTextMeshPtr + mCurrentQuadIndex * vertsPerQuad * floatsPerVert;
-
-    if (x1 > mSurfaceWidth || y1 < 0.0f || x2 < 0 || y4 > mSurfaceHeight) {
-        return;
-    }
-
-    /*LOGE("V0 x: %f y: %f z: %f", x1, y1, z1);
-    ALOGE("V1 x: %f y: %f z: %f", x2, y2, z2);
-    ALOGE("V2 x: %f y: %f z: %f", x3, y3, z3);
-    ALOGE("V3 x: %f y: %f z: %f", x4, y4, z4);*/
-
-    (*currentPos++) = x1;
-    (*currentPos++) = y1;
-    (*currentPos++) = z1;
-    (*currentPos++) = 0;
-    (*currentPos++) = u1;
-    (*currentPos++) = v1;
-
-    (*currentPos++) = x2;
-    (*currentPos++) = y2;
-    (*currentPos++) = z2;
-    (*currentPos++) = 0;
-    (*currentPos++) = u2;
-    (*currentPos++) = v2;
-
-    (*currentPos++) = x3;
-    (*currentPos++) = y3;
-    (*currentPos++) = z3;
-    (*currentPos++) = 0;
-    (*currentPos++) = u3;
-    (*currentPos++) = v3;
-
-    (*currentPos++) = x4;
-    (*currentPos++) = y4;
-    (*currentPos++) = z4;
-    (*currentPos++) = 0;
-    (*currentPos++) = u4;
-    (*currentPos++) = v4;
-
-    mCurrentQuadIndex ++;
-
-    if (mCurrentQuadIndex == mMaxNumberOfQuads) {
-        issueDrawCommand();
-        mCurrentQuadIndex = 0;
-    }
-}
-
-uint32_t FontState::getRemainingCacheCapacity() {
-    uint32_t remainingCapacity = 0;
-    uint32_t totalPixels = 0;
-    for (uint32_t i = 0; i < mCacheLines.size(); i ++) {
-         remainingCapacity += (mCacheLines[i]->mMaxWidth - mCacheLines[i]->mCurrentCol);
-         totalPixels += mCacheLines[i]->mMaxWidth;
-    }
-    remainingCapacity = (remainingCapacity * 100) / totalPixels;
-    return remainingCapacity;
-}
-
-void FontState::precacheLatin(Font *font) {
-    // Remaining capacity is measured in %
-    uint32_t remainingCapacity = getRemainingCacheCapacity();
-    uint32_t precacheIdx = 0;
-    while (remainingCapacity > 25 && precacheIdx < mLatinPrecache.size()) {
-        font->getCachedUTFChar((int32_t)mLatinPrecache[precacheIdx]);
-        remainingCapacity = getRemainingCacheCapacity();
-        precacheIdx ++;
-    }
-}
-
-
-void FontState::renderText(const char *text, uint32_t len, int32_t x, int32_t y,
-                           uint32_t startIndex, int32_t numGlyphs,
-                           Font::RenderMode mode,
-                           Font::Rect *bounds,
-                           uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH) {
-    checkInit();
-
-    // Render code here
-    Font *currentFont = mRSC->getFont();
-    if (!currentFont) {
-        if (!mDefault.get()) {
-            String8 fontsDir("/fonts/Roboto-Regular.ttf");
-            String8 fullPath(getenv("ANDROID_ROOT"));
-            fullPath += fontsDir;
-
-            mDefault.set(Font::create(mRSC, fullPath.string(), 8, mRSC->getDPI()));
-        }
-        currentFont = mDefault.get();
-    }
-    if (!currentFont) {
-        ALOGE("Unable to initialize any fonts");
-        return;
-    }
-
-    // Cull things that are off the screen
-    mSurfaceWidth = (float)mRSC->getCurrentSurfaceWidth();
-    mSurfaceHeight = (float)mRSC->getCurrentSurfaceHeight();
-
-    currentFont->renderUTF(text, len, x, y, startIndex, numGlyphs,
-                           mode, bounds, bitmap, bitmapW, bitmapH);
-
-    if (mCurrentQuadIndex != 0) {
-        issueDrawCommand();
-        mCurrentQuadIndex = 0;
-    }
-}
-
-void FontState::measureText(const char *text, uint32_t len, Font::Rect *bounds) {
-    renderText(text, len, 0, 0, 0, -1, Font::MEASURE, bounds);
-    bounds->bottom = - bounds->bottom;
-    bounds->top = - bounds->top;
-}
-
-void FontState::setFontColor(float r, float g, float b, float a) {
-    mConstants.mFontColor[0] = r;
-    mConstants.mFontColor[1] = g;
-    mConstants.mFontColor[2] = b;
-    mConstants.mFontColor[3] = a;
-
-    mConstants.mGamma = 1.0f;
-    const float luminance = (r * 2.0f + g * 5.0f + b) / 8.0f;
-    if (luminance <= mBlackThreshold) {
-        mConstants.mGamma = mBlackGamma;
-    } else if (luminance >= mWhiteThreshold) {
-        mConstants.mGamma = mWhiteGamma;
-    }
-
-    mConstantsDirty = true;
-}
-
-void FontState::getFontColor(float *r, float *g, float *b, float *a) const {
-    *r = mConstants.mFontColor[0];
-    *g = mConstants.mFontColor[1];
-    *b = mConstants.mFontColor[2];
-    *a = mConstants.mFontColor[3];
-}
-
-void FontState::deinit(Context *rsc) {
-    mInitialized = false;
-
-    mFontShaderFConstant.clear();
-
-    mMesh.clear();
-
-    mFontShaderF.clear();
-    mFontSampler.clear();
-    mFontProgramStore.clear();
-
-    mTextTexture.clear();
-    for (uint32_t i = 0; i < mCacheLines.size(); i ++) {
-        delete mCacheLines[i];
-    }
-    mCacheLines.clear();
-
-    mDefault.clear();
-#ifndef ANDROID_RS_SERIALIZE
-    if (mLibrary) {
-        FT_Done_FreeType( mLibrary );
-        mLibrary = NULL;
-    }
-#endif //ANDROID_RS_SERIALIZE
-}
-
-#ifndef ANDROID_RS_SERIALIZE
-bool FontState::CacheTextureLine::fitBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY) {
-    if ((uint32_t)bitmap->rows > mMaxHeight) {
-        return false;
-    }
-
-    if (mCurrentCol + (uint32_t)bitmap->width < mMaxWidth) {
-        *retOriginX = mCurrentCol;
-        *retOriginY = mCurrentRow;
-        mCurrentCol += bitmap->width;
-        mDirty = true;
-       return true;
-    }
-
-    return false;
-}
-#endif //ANDROID_RS_SERIALIZE
-
-namespace android {
-namespace renderscript {
-
-RsFont rsi_FontCreateFromFile(Context *rsc,
-                              char const *name, size_t name_length,
-                              float fontSize, uint32_t dpi) {
-    Font *newFont = Font::create(rsc, name, fontSize, dpi);
-    if (newFont) {
-        newFont->incUserRef();
-    }
-    return newFont;
-}
-
-RsFont rsi_FontCreateFromMemory(Context *rsc,
-                                char const *name, size_t name_length,
-                                float fontSize, uint32_t dpi,
-                                const void *data, size_t data_length) {
-    Font *newFont = Font::create(rsc, name, fontSize, dpi, data, data_length);
-    if (newFont) {
-        newFont->incUserRef();
-    }
-    return newFont;
-}
-
-} // renderscript
-} // android
diff --git a/libs/rs/rsFont.h b/libs/rs/rsFont.h
deleted file mode 100644
index 2bd30b7..0000000
--- a/libs/rs/rsFont.h
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_FONT_H
-#define ANDROID_RS_FONT_H
-
-#include "rsStream.h"
-#include <utils/String8.h>
-#include <utils/Vector.h>
-#include <utils/KeyedVector.h>
-
-struct FT_LibraryRec_;
-struct FT_FaceRec_;
-struct FT_Bitmap_;
-
-// ---------------------------------------------------------------------------
-namespace android {
-
-namespace renderscript {
-
-// Gamma (>= 1.0, <= 10.0)
-#define PROPERTY_TEXT_GAMMA "ro.text_gamma"
-#define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "ro.text_gamma.black_threshold"
-#define PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD "ro.text_gamma.white_threshold"
-
-#define DEFAULT_TEXT_GAMMA 1.4f
-#define DEFAULT_TEXT_BLACK_GAMMA_THRESHOLD 64
-#define DEFAULT_TEXT_WHITE_GAMMA_THRESHOLD 192
-
-class FontState;
-
-class Font : public ObjectBase {
-public:
-    enum RenderMode {
-        FRAMEBUFFER,
-        BITMAP,
-        MEASURE,
-    };
-
-    struct Rect {
-        int32_t left;
-        int32_t top;
-        int32_t right;
-        int32_t bottom;
-        void set(int32_t l, int32_t r, int32_t t, int32_t b) {
-            left = l;
-            right = r;
-            top = t;
-            bottom = b;
-        }
-    };
-
-    ~Font();
-
-    // Currently files do not get serialized,
-    // but we need to inherit from ObjectBase for ref tracking
-    virtual void serialize(OStream *stream) const {
-    }
-    virtual RsA3DClassID getClassId() const {
-        return RS_A3D_CLASS_ID_UNKNOWN;
-    }
-
-    static Font * create(Context *rsc, const char *name, float fontSize, uint32_t dpi,
-                         const void *data = NULL, uint32_t dataLen = 0);
-
-protected:
-
-    friend class FontState;
-
-    // Pointer to the utf data, length of data, where to start, number of glyphs ot read
-    // (each glyph may be longer than a char because we are dealing with utf data)
-    // Last two variables are the initial pen position
-    void renderUTF(const char *text, uint32_t len, int32_t x, int32_t y,
-                   uint32_t start, int32_t numGlyphs,
-                   RenderMode mode = FRAMEBUFFER, Rect *bounds = NULL,
-                   uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
-
-    void invalidateTextureCache();
-    struct CachedGlyphInfo
-    {
-        // Has the cache been invalidated?
-        bool mIsValid;
-        // Location of the cached glyph in the bitmap
-        // in case we need to resize the texture
-        uint32_t mBitmapMinX;
-        uint32_t mBitmapMinY;
-        uint32_t mBitmapWidth;
-        uint32_t mBitmapHeight;
-        // Also cache texture coords for the quad
-        float mBitmapMinU;
-        float mBitmapMinV;
-        float mBitmapMaxU;
-        float mBitmapMaxV;
-        // Minimize how much we call freetype
-        int32_t mGlyphIndex;
-        int32_t mAdvanceX;
-        int32_t mAdvanceY;
-        // Values below contain a glyph's origin in the bitmap
-        int32_t mBitmapLeft;
-        int32_t mBitmapTop;
-    };
-
-    String8 mFontName;
-    float mFontSize;
-    uint32_t mDpi;
-
-    Font(Context *rsc);
-    bool init(const char *name, float fontSize, uint32_t dpi, const void *data = NULL, uint32_t dataLen = 0);
-
-    virtual void preDestroy() const;
-    FT_FaceRec_ *mFace;
-    bool mInitialized;
-    bool mHasKerning;
-
-    DefaultKeyedVector<uint32_t, CachedGlyphInfo* > mCachedGlyphs;
-    CachedGlyphInfo* getCachedUTFChar(int32_t utfChar);
-
-    CachedGlyphInfo *cacheGlyph(uint32_t glyph);
-    void updateGlyphCache(CachedGlyphInfo *glyph);
-    void measureCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y, Rect *bounds);
-    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y);
-    void drawCachedGlyph(CachedGlyphInfo *glyph, int32_t x, int32_t y,
-                         uint8_t *bitmap, uint32_t bitmapW, uint32_t bitmapH);
-};
-
-class FontState {
-public:
-    FontState();
-    ~FontState();
-
-    void init(Context *rsc);
-    void deinit(Context *rsc);
-
-    ObjectBaseRef<Font> mDefault;
-
-    void renderText(const char *text, uint32_t len, int32_t x, int32_t y,
-                    uint32_t startIndex = 0, int numGlyphs = -1,
-                    Font::RenderMode mode = Font::FRAMEBUFFER,
-                    Font::Rect *bounds = NULL,
-                    uint8_t *bitmap = NULL, uint32_t bitmapW = 0, uint32_t bitmapH = 0);
-
-    void measureText(const char *text, uint32_t len, Font::Rect *bounds);
-
-    void setFontColor(float r, float g, float b, float a);
-    void getFontColor(float *r, float *g, float *b, float *a) const;
-
-protected:
-
-    float mSurfaceWidth;
-    float mSurfaceHeight;
-
-    friend class Font;
-
-    struct CacheTextureLine {
-        uint32_t mMaxHeight;
-        uint32_t mMaxWidth;
-        uint32_t mCurrentRow;
-        uint32_t mCurrentCol;
-        bool mDirty;
-
-        CacheTextureLine(uint32_t maxHeight, uint32_t maxWidth, uint32_t currentRow, uint32_t currentCol)
-            : mMaxHeight(maxHeight), mMaxWidth(maxWidth), mCurrentRow(currentRow),
-              mCurrentCol(currentCol), mDirty(false)  {
-        }
-
-        bool fitBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
-    };
-
-    Vector<CacheTextureLine*> mCacheLines;
-    uint32_t getRemainingCacheCapacity();
-
-    void precacheLatin(Font *font);
-    String8 mLatinPrecache;
-
-    Context *mRSC;
-
-    struct {
-        float mFontColor[4];
-        float mGamma;
-    } mConstants;
-    bool mConstantsDirty;
-
-    float mBlackGamma;
-    float mWhiteGamma;
-
-    float mBlackThreshold;
-    float mWhiteThreshold;
-
-    // Free type library, we only need one copy
-#ifndef ANDROID_RS_SERIALIZE
-    FT_LibraryRec_ *mLibrary;
-    FT_LibraryRec_ *getLib();
-#endif //ANDROID_RS_SERIALIZE
-    Vector<Font*> mActiveFonts;
-
-    // Render state for the font
-    ObjectBaseRef<Allocation> mFontShaderFConstant;
-    ObjectBaseRef<ProgramFragment> mFontShaderF;
-    ObjectBaseRef<Sampler> mFontSampler;
-    ObjectBaseRef<ProgramStore> mFontProgramStore;
-    void initRenderState();
-
-    // Texture to cache glyph bitmaps
-    ObjectBaseRef<Allocation> mTextTexture;
-    void initTextTexture();
-    const uint8_t* getTextTextureData() const {
-        return (uint8_t*)mTextTexture->getPtr();
-    }
-
-#ifndef ANDROID_RS_SERIALIZE
-    bool cacheBitmap(FT_Bitmap_ *bitmap, uint32_t *retOriginX, uint32_t *retOriginY);
-#endif //ANDROID_RS_SERIALIZE
-    const Type* getCacheTextureType() {
-        return mTextTexture->getType();
-    }
-
-    void flushAllAndInvalidate();
-
-    // Pointer to vertex data to speed up frame to frame work
-    float *mTextMeshPtr;
-    uint32_t mCurrentQuadIndex;
-    uint32_t mMaxNumberOfQuads;
-
-    void initVertexArrayBuffers();
-    ObjectBaseRef<Mesh> mMesh;
-
-    bool mInitialized;
-
-    void checkInit();
-
-    void issueDrawCommand();
-
-    void appendMeshQuad(float x1, float y1, float z1,
-                        float u1, float v1,
-                        float x2, float y2, float z2,
-                        float u2, float v2,
-                        float x3, float y3, float z3,
-                        float u3, float v3,
-                        float x4, float y4, float z4,
-                        float u4, float v4);
-};
-
-}
-}
-
-#endif
diff --git a/libs/rs/rsMatrix2x2.cpp b/libs/rs/rsMatrix2x2.cpp
deleted file mode 100644
index 622113c..0000000
--- a/libs/rs/rsMatrix2x2.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsMatrix2x2.h"
-#include "rsMatrix3x3.h"
-#include "rsMatrix4x4.h"
-
-#include "stdlib.h"
-#include "string.h"
-#include "math.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-
-void Matrix2x2::loadIdentity() {
-    m[0] = 1.f;
-    m[1] = 0.f;
-    m[2] = 0.f;
-    m[3] = 1.f;
-}
-
-void Matrix2x2::load(const float *v) {
-    memcpy(m, v, sizeof(m));
-}
-
-void Matrix2x2::load(const rs_matrix2x2 *v) {
-    memcpy(m, v->m, sizeof(m));
-}
-
-void Matrix2x2::loadMultiply(const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) {
-    for (int i=0 ; i<2 ; i++) {
-        float ri0 = 0;
-        float ri1 = 0;
-        for (int j=0 ; j<2 ; j++) {
-            const float rhs_ij = ((const Matrix2x2 *)rhs)->get(i, j);
-            ri0 += ((const Matrix2x2 *)lhs)->get(j, 0) * rhs_ij;
-            ri1 += ((const Matrix2x2 *)lhs)->get(j, 1) * rhs_ij;
-        }
-        set(i, 0, ri0);
-        set(i, 1, ri1);
-    }
-}
-
-void Matrix2x2::transpose() {
-    float temp = m[1];
-    m[1] = m[2];
-    m[2] = temp;
-}
-
diff --git a/libs/rs/rsMatrix2x2.h b/libs/rs/rsMatrix2x2.h
deleted file mode 100644
index 4dcb84a..0000000
--- a/libs/rs/rsMatrix2x2.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_MATRIX_2x2_H
-#define ANDROID_RS_MATRIX_2x2_H
-
-#include "rsType.h"
-
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-struct Matrix2x2 : public rs_matrix2x2 {
-    inline float get(uint32_t row, uint32_t col) const {
-        return m[row*2 + col];
-    }
-
-    inline void set(uint32_t row, uint32_t col, float v) {
-        m[row*2 + col] = v;
-    }
-
-    void loadIdentity();
-    void load(const float *);
-    void load(const rs_matrix2x2 *);
-
-    void loadMultiply(const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs);
-
-    void transpose();
-
-    void multiply(const rs_matrix2x2 *rhs) {
-        Matrix2x2 tmp;
-        tmp.loadMultiply(this, rhs);
-        load(&tmp);
-    }
-};
-
-}
-}
-
-
-
-
-#endif
-
-
-
-
-
diff --git a/libs/rs/rsMatrix3x3.cpp b/libs/rs/rsMatrix3x3.cpp
deleted file mode 100644
index 3f9a2d1..0000000
--- a/libs/rs/rsMatrix3x3.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsMatrix2x2.h"
-#include "rsMatrix3x3.h"
-#include "rsMatrix4x4.h"
-
-#include "stdlib.h"
-#include "string.h"
-#include "math.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-void Matrix3x3::loadIdentity() {
-    m[0] = 1.f;
-    m[1] = 0.f;
-    m[2] = 0.f;
-    m[3] = 0.f;
-    m[4] = 1.f;
-    m[5] = 0.f;
-    m[6] = 0.f;
-    m[7] = 0.f;
-    m[8] = 1.f;
-}
-
-void Matrix3x3::load(const float *v) {
-    memcpy(m, v, sizeof(m));
-}
-
-void Matrix3x3::load(const rs_matrix3x3 *v) {
-    memcpy(m, v->m, sizeof(m));
-}
-
-void Matrix3x3::loadMultiply(const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) {
-    for (int i=0 ; i<3 ; i++) {
-        float ri0 = 0;
-        float ri1 = 0;
-        float ri2 = 0;
-        for (int j=0 ; j<3 ; j++) {
-            const float rhs_ij = ((const Matrix3x3 *)rhs)->get(i, j);
-            ri0 += ((const Matrix3x3 *)lhs)->get(j, 0) * rhs_ij;
-            ri1 += ((const Matrix3x3 *)lhs)->get(j, 1) * rhs_ij;
-            ri2 += ((const Matrix3x3 *)lhs)->get(j, 2) * rhs_ij;
-        }
-        set(i, 0, ri0);
-        set(i, 1, ri1);
-        set(i, 2, ri2);
-    }
-}
-
-void Matrix3x3::transpose() {
-    int i, j;
-    float temp;
-    for (i = 0; i < 2; ++i) {
-        for (j = i + 1; j < 3; ++j) {
-            temp = get(i, j);
-            set(i, j, get(j, i));
-            set(j, i, temp);
-        }
-    }
-}
-
diff --git a/libs/rs/rsMatrix3x3.h b/libs/rs/rsMatrix3x3.h
deleted file mode 100644
index f96d270..0000000
--- a/libs/rs/rsMatrix3x3.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_MATRIX_3x3_H
-#define ANDROID_RS_MATRIX_3x3_H
-
-#include "rsType.h"
-
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-struct Matrix3x3 : public rs_matrix3x3 {
-    inline float get(uint32_t row, uint32_t col) const {
-        return m[row*3 + col];
-    }
-
-    inline void set(uint32_t row, uint32_t col, float v) {
-        m[row*3 + col] = v;
-    }
-
-    void loadIdentity();
-    void load(const float *);
-    void load(const rs_matrix3x3 *);
-
-    void loadMultiply(const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs);
-
-    void transpose();
-
-    void multiply(const rs_matrix3x3 *rhs) {
-        Matrix3x3 tmp;
-        tmp.loadMultiply(this, rhs);
-        load(&tmp);
-    }
-};
-
-}
-}
-
-
-
-
-#endif
-
-
-
-
-
diff --git a/libs/rs/rsMatrix4x4.cpp b/libs/rs/rsMatrix4x4.cpp
deleted file mode 100644
index c6f96d8..0000000
--- a/libs/rs/rsMatrix4x4.cpp
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsMatrix2x2.h"
-#include "rsMatrix3x3.h"
-#include "rsMatrix4x4.h"
-
-#include "stdlib.h"
-#include "string.h"
-#include "math.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-//////////////////////////////////////////////////////////////////////////////
-// Heavy math functions
-//////////////////////////////////////////////////////////////////////////////
-
-
-
-
-
-// Returns true if the matrix was successfully inversed
-bool Matrix4x4::inverse() {
-    rs_matrix4x4 result;
-
-    int i, j;
-    for (i = 0; i < 4; ++i) {
-        for (j = 0; j < 4; ++j) {
-            // computeCofactor for int i, int j
-            int c0 = (i+1) % 4;
-            int c1 = (i+2) % 4;
-            int c2 = (i+3) % 4;
-            int r0 = (j+1) % 4;
-            int r1 = (j+2) % 4;
-            int r2 = (j+3) % 4;
-
-            float minor =
-                (m[c0 + 4*r0] * (m[c1 + 4*r1] * m[c2 + 4*r2] - m[c1 + 4*r2] * m[c2 + 4*r1]))
-                - (m[c0 + 4*r1] * (m[c1 + 4*r0] * m[c2 + 4*r2] - m[c1 + 4*r2] * m[c2 + 4*r0]))
-                + (m[c0 + 4*r2] * (m[c1 + 4*r0] * m[c2 + 4*r1] - m[c1 + 4*r1] * m[c2 + 4*r0]));
-
-            float cofactor = (i+j) & 1 ? -minor : minor;
-
-            result.m[4*i + j] = cofactor;
-        }
-    }
-
-    // Dot product of 0th column of source and 0th row of result
-    float det = m[0]*result.m[0] + m[4]*result.m[1] +
-                 m[8]*result.m[2] + m[12]*result.m[3];
-
-    if (fabs(det) < 1e-6) {
-        return false;
-    }
-
-    det = 1.0f / det;
-    for (i = 0; i < 16; ++i) {
-        m[i] = result.m[i] * det;
-    }
-
-    return true;
-}
-
-// Returns true if the matrix was successfully inversed
-bool Matrix4x4::inverseTranspose() {
-    rs_matrix4x4 result;
-
-    int i, j;
-    for (i = 0; i < 4; ++i) {
-        for (j = 0; j < 4; ++j) {
-            // computeCofactor for int i, int j
-            int c0 = (i+1) % 4;
-            int c1 = (i+2) % 4;
-            int c2 = (i+3) % 4;
-            int r0 = (j+1) % 4;
-            int r1 = (j+2) % 4;
-            int r2 = (j+3) % 4;
-
-            float minor = (m[c0 + 4*r0] * (m[c1 + 4*r1] * m[c2 + 4*r2] - m[c1 + 4*r2] * m[c2 + 4*r1]))
-                         - (m[c0 + 4*r1] * (m[c1 + 4*r0] * m[c2 + 4*r2] - m[c1 + 4*r2] * m[c2 + 4*r0]))
-                         + (m[c0 + 4*r2] * (m[c1 + 4*r0] * m[c2 + 4*r1] - m[c1 + 4*r1] * m[c2 + 4*r0]));
-
-            float cofactor = (i+j) & 1 ? -minor : minor;
-
-            result.m[4*j + i] = cofactor;
-        }
-    }
-
-    // Dot product of 0th column of source and 0th column of result
-    float det = m[0]*result.m[0] + m[4]*result.m[4] +
-                 m[8]*result.m[8] + m[12]*result.m[12];
-
-    if (fabs(det) < 1e-6) {
-        return false;
-    }
-
-    det = 1.0f / det;
-    for (i = 0; i < 16; ++i) {
-        m[i] = result.m[i] * det;
-    }
-
-    return true;
-}
-
-void Matrix4x4::transpose() {
-    int i, j;
-    float temp;
-    for (i = 0; i < 3; ++i) {
-        for (j = i + 1; j < 4; ++j) {
-            temp = m[i*4 + j];
-            m[i*4 + j] = m[j*4 + i];
-            m[j*4 + i] = temp;
-        }
-    }
-}
-
-
-///////////////////////////////////////////////////////////////////////////////////
-
-void Matrix4x4::loadIdentity() {
-    m[0] = 1.f;
-    m[1] = 0.f;
-    m[2] = 0.f;
-    m[3] = 0.f;
-    m[4] = 0.f;
-    m[5] = 1.f;
-    m[6] = 0.f;
-    m[7] = 0.f;
-    m[8] = 0.f;
-    m[9] = 0.f;
-    m[10] = 1.f;
-    m[11] = 0.f;
-    m[12] = 0.f;
-    m[13] = 0.f;
-    m[14] = 0.f;
-    m[15] = 1.f;
-}
-
-void Matrix4x4::load(const float *v) {
-    memcpy(m, v, sizeof(m));
-}
-
-void Matrix4x4::load(const rs_matrix4x4 *v) {
-    memcpy(m, v->m, sizeof(m));
-}
-
-void Matrix4x4::load(const rs_matrix3x3 *v) {
-    m[0] = v->m[0];
-    m[1] = v->m[1];
-    m[2] = v->m[2];
-    m[3] = 0.f;
-    m[4] = v->m[3];
-    m[5] = v->m[4];
-    m[6] = v->m[5];
-    m[7] = 0.f;
-    m[8] = v->m[6];
-    m[9] = v->m[7];
-    m[10] = v->m[8];
-    m[11] = 0.f;
-    m[12] = 0.f;
-    m[13] = 0.f;
-    m[14] = 0.f;
-    m[15] = 1.f;
-}
-
-void Matrix4x4::load(const rs_matrix2x2 *v) {
-    m[0] = v->m[0];
-    m[1] = v->m[1];
-    m[2] = 0.f;
-    m[3] = 0.f;
-    m[4] = v->m[2];
-    m[5] = v->m[3];
-    m[6] = 0.f;
-    m[7] = 0.f;
-    m[8] = 0.f;
-    m[9] = 0.f;
-    m[10] = 1.f;
-    m[11] = 0.f;
-    m[12] = 0.f;
-    m[13] = 0.f;
-    m[14] = 0.f;
-    m[15] = 1.f;
-}
-
-
-void Matrix4x4::loadRotate(float rot, float x, float y, float z) {
-    float c, s;
-    m[3] = 0;
-    m[7] = 0;
-    m[11]= 0;
-    m[12]= 0;
-    m[13]= 0;
-    m[14]= 0;
-    m[15]= 1;
-    rot *= float(M_PI / 180.0f);
-    c = cosf(rot);
-    s = sinf(rot);
-
-    const float len = x*x + y*y + z*z;
-    if (len != 1) {
-        const float recipLen = 1.f / sqrtf(len);
-        x *= recipLen;
-        y *= recipLen;
-        z *= recipLen;
-    }
-    const float nc = 1.0f - c;
-    const float xy = x * y;
-    const float yz = y * z;
-    const float zx = z * x;
-    const float xs = x * s;
-    const float ys = y * s;
-    const float zs = z * s;
-    m[ 0] = x*x*nc +  c;
-    m[ 4] =  xy*nc - zs;
-    m[ 8] =  zx*nc + ys;
-    m[ 1] =  xy*nc + zs;
-    m[ 5] = y*y*nc +  c;
-    m[ 9] =  yz*nc - xs;
-    m[ 2] =  zx*nc - ys;
-    m[ 6] =  yz*nc + xs;
-    m[10] = z*z*nc +  c;
-}
-
-void Matrix4x4::loadScale(float x, float y, float z) {
-    loadIdentity();
-    set(0, 0, x);
-    set(1, 1, y);
-    set(2, 2, z);
-}
-
-void Matrix4x4::loadTranslate(float x, float y, float z) {
-    loadIdentity();
-    m[12] = x;
-    m[13] = y;
-    m[14] = z;
-}
-
-void Matrix4x4::loadMultiply(const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) {
-    for (int i=0 ; i<4 ; i++) {
-        float ri0 = 0;
-        float ri1 = 0;
-        float ri2 = 0;
-        float ri3 = 0;
-        for (int j=0 ; j<4 ; j++) {
-            const float rhs_ij = ((const Matrix4x4 *)rhs)->get(i,j);
-            ri0 += ((const Matrix4x4 *)lhs)->get(j,0) * rhs_ij;
-            ri1 += ((const Matrix4x4 *)lhs)->get(j,1) * rhs_ij;
-            ri2 += ((const Matrix4x4 *)lhs)->get(j,2) * rhs_ij;
-            ri3 += ((const Matrix4x4 *)lhs)->get(j,3) * rhs_ij;
-        }
-        set(i,0, ri0);
-        set(i,1, ri1);
-        set(i,2, ri2);
-        set(i,3, ri3);
-    }
-}
-
-void Matrix4x4::loadOrtho(float left, float right, float bottom, float top, float near, float far) {
-    loadIdentity();
-    m[0] = 2.f / (right - left);
-    m[5] = 2.f / (top - bottom);
-    m[10]= -2.f / (far - near);
-    m[12]= -(right + left) / (right - left);
-    m[13]= -(top + bottom) / (top - bottom);
-    m[14]= -(far + near) / (far - near);
-}
-
-void Matrix4x4::loadFrustum(float left, float right, float bottom, float top, float near, float far) {
-    loadIdentity();
-    m[0] = 2.f * near / (right - left);
-    m[5] = 2.f * near / (top - bottom);
-    m[8] = (right + left) / (right - left);
-    m[9] = (top + bottom) / (top - bottom);
-    m[10]= -(far + near) / (far - near);
-    m[11]= -1.f;
-    m[14]= -2.f * far * near / (far - near);
-    m[15]= 0.f;
-}
-
-void Matrix4x4::loadPerspective(float fovy, float aspect, float near, float far) {
-    float top = near * tan((float) (fovy * M_PI / 360.0f));
-    float bottom = -top;
-    float left = bottom * aspect;
-    float right = top * aspect;
-    loadFrustum(left, right, bottom, top, near, far);
-}
-
-void Matrix4x4::vectorMultiply(float *out, const float *in) const {
-    out[0] = (m[0] * in[0]) + (m[4] * in[1]) + (m[8] * in[2]) + m[12];
-    out[1] = (m[1] * in[0]) + (m[5] * in[1]) + (m[9] * in[2]) + m[13];
-    out[2] = (m[2] * in[0]) + (m[6] * in[1]) + (m[10] * in[2]) + m[14];
-    out[3] = (m[3] * in[0]) + (m[7] * in[1]) + (m[11] * in[2]) + m[15];
-}
-
-void Matrix4x4::logv(const char *s) const {
-    ALOGV("%s {%f, %f, %f, %f",  s, m[0], m[4], m[8], m[12]);
-    ALOGV("%s  %f, %f, %f, %f",  s, m[1], m[5], m[9], m[13]);
-    ALOGV("%s  %f, %f, %f, %f",  s, m[2], m[6], m[10], m[14]);
-    ALOGV("%s  %f, %f, %f, %f}", s, m[3], m[7], m[11], m[15]);
-}
diff --git a/libs/rs/rsMatrix4x4.h b/libs/rs/rsMatrix4x4.h
deleted file mode 100644
index d30184f..0000000
--- a/libs/rs/rsMatrix4x4.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_MATRIX_4x4_H
-#define ANDROID_RS_MATRIX_4x4_H
-
-#include "rsType.h"
-
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-struct Matrix4x4 : public rs_matrix4x4 {
-    float get(uint32_t row, uint32_t col) const {
-        return m[row*4 + col];
-    }
-
-    void set(uint32_t row, uint32_t col, float v) {
-        m[row*4 + col] = v;
-    }
-
-    void loadIdentity();
-    void load(const float *);
-    void load(const rs_matrix4x4 *);
-    void load(const rs_matrix3x3 *);
-    void load(const rs_matrix2x2 *);
-
-    void loadRotate(float rot, float x, float y, float z);
-    void loadScale(float x, float y, float z);
-    void loadTranslate(float x, float y, float z);
-    void loadMultiply(const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs);
-
-    void loadOrtho(float l, float r, float b, float t, float n, float f);
-    void loadFrustum(float l, float r, float b, float t, float n, float f);
-    void loadPerspective(float fovy, float aspect, float near, float far);
-
-    void vectorMultiply(float *v4out, const float *v3in) const;
-
-    bool inverse();
-    bool inverseTranspose();
-    void transpose();
-
-    void logv(const char *s) const;
-
-
-    void multiply(const rs_matrix4x4 *rhs) {
-        Matrix4x4 tmp;
-        tmp.loadMultiply(this, rhs);
-        load(&tmp);
-    }
-    void rotate(float rot, float x, float y, float z) {
-        Matrix4x4 tmp;
-        tmp.loadRotate(rot, x, y, z);
-        multiply(&tmp);
-    }
-    void scale(float x, float y, float z) {
-        Matrix4x4 tmp;
-        tmp.loadScale(x, y, z);
-        multiply(&tmp);
-    }
-    void translate(float x, float y, float z) {
-        Matrix4x4 tmp;
-        tmp.loadTranslate(x, y, z);
-        multiply(&tmp);
-    }
-};
-
-}
-}
-
-
-
-
-#endif
-
-
-
-
diff --git a/libs/rs/rsMesh.cpp b/libs/rs/rsMesh.cpp
deleted file mode 100644
index 399a52b..0000000
--- a/libs/rs/rsMesh.cpp
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Copyright (C) 2011 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"
-#include "rs.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-Mesh::Mesh(Context *rsc) : ObjectBase(rsc) {
-    mHal.drv = NULL;
-    mHal.state.primitives = NULL;
-    mHal.state.primitivesCount = 0;
-    mHal.state.indexBuffers = NULL;
-    mHal.state.indexBuffersCount = 0;
-    mHal.state.vertexBuffers = NULL;
-    mHal.state.vertexBuffersCount = 0;
-    mInitialized = false;
-
-    mVertexBuffers = NULL;
-    mIndexBuffers = NULL;
-}
-
-Mesh::Mesh(Context *rsc,
-           uint32_t vertexBuffersCount,
-           uint32_t primitivesCount) : ObjectBase(rsc) {
-    mHal.drv = NULL;
-    mHal.state.primitivesCount = primitivesCount;
-    mHal.state.indexBuffersCount = primitivesCount;
-    mHal.state.primitives = new RsPrimitive[mHal.state.primitivesCount];
-    mHal.state.indexBuffers = new Allocation *[mHal.state.indexBuffersCount];
-    for (uint32_t i = 0; i < mHal.state.primitivesCount; i ++) {
-        mHal.state.primitives[i] = RS_PRIMITIVE_POINT;
-    }
-    for (uint32_t i = 0; i < mHal.state.indexBuffersCount; i ++) {
-        mHal.state.indexBuffers[i] = NULL;
-    }
-    mHal.state.vertexBuffersCount = vertexBuffersCount;
-    mHal.state.vertexBuffers = new Allocation *[mHal.state.vertexBuffersCount];
-    for (uint32_t i = 0; i < mHal.state.vertexBuffersCount; i ++) {
-        mHal.state.vertexBuffers[i] = NULL;
-    }
-
-    mVertexBuffers = new ObjectBaseRef<Allocation>[mHal.state.vertexBuffersCount];
-    mIndexBuffers = new ObjectBaseRef<Allocation>[mHal.state.primitivesCount];
-}
-
-Mesh::~Mesh() {
-#ifndef ANDROID_RS_SERIALIZE
-    mRSC->mHal.funcs.mesh.destroy(mRSC, this);
-#endif
-
-    delete[] mHal.state.vertexBuffers;
-    delete[] mHal.state.primitives;
-    delete[] mHal.state.indexBuffers;
-
-    delete[] mVertexBuffers;
-    delete[] mIndexBuffers;
-}
-
-void Mesh::init() {
-#ifndef ANDROID_RS_SERIALIZE
-    mRSC->mHal.funcs.mesh.init(mRSC, this);
-#endif
-}
-
-void Mesh::serialize(OStream *stream) const {
-    // Need to identify ourselves
-    stream->addU32((uint32_t)getClassId());
-
-    String8 name(getName());
-    stream->addString(&name);
-
-    // Store number of vertex streams
-    stream->addU32(mHal.state.vertexBuffersCount);
-    for (uint32_t vCount = 0; vCount < mHal.state.vertexBuffersCount; vCount ++) {
-        mHal.state.vertexBuffers[vCount]->serialize(stream);
-    }
-
-    stream->addU32(mHal.state.primitivesCount);
-    // Store the primitives
-    for (uint32_t pCount = 0; pCount < mHal.state.primitivesCount; pCount ++) {
-        stream->addU8((uint8_t)mHal.state.primitives[pCount]);
-
-        if (mHal.state.indexBuffers[pCount]) {
-            stream->addU32(1);
-            mHal.state.indexBuffers[pCount]->serialize(stream);
-        } else {
-            stream->addU32(0);
-        }
-    }
-}
-
-Mesh *Mesh::createFromStream(Context *rsc, IStream *stream) {
-    // First make sure we are reading the correct object
-    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
-    if (classID != RS_A3D_CLASS_ID_MESH) {
-        ALOGE("mesh loading skipped due to invalid class id");
-        return NULL;
-    }
-
-    String8 name;
-    stream->loadString(&name);
-
-    uint32_t vertexBuffersCount = stream->loadU32();
-    ObjectBaseRef<Allocation> *vertexBuffers = NULL;
-    if (vertexBuffersCount) {
-        vertexBuffers = new ObjectBaseRef<Allocation>[vertexBuffersCount];
-
-        for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) {
-            Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream);
-            vertexBuffers[vCount].set(vertexAlloc);
-        }
-    }
-
-    uint32_t primitivesCount = stream->loadU32();
-    ObjectBaseRef<Allocation> *indexBuffers = NULL;
-    RsPrimitive *primitives = NULL;
-    if (primitivesCount) {
-        indexBuffers = new ObjectBaseRef<Allocation>[primitivesCount];
-        primitives = new RsPrimitive[primitivesCount];
-
-        // load all primitives
-        for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) {
-            primitives[pCount] = (RsPrimitive)stream->loadU8();
-
-            // Check to see if the index buffer was stored
-            uint32_t isIndexPresent = stream->loadU32();
-            if (isIndexPresent) {
-                Allocation *indexAlloc = Allocation::createFromStream(rsc, stream);
-                indexBuffers[pCount].set(indexAlloc);
-            }
-        }
-    }
-
-    Mesh *mesh = new Mesh(rsc, vertexBuffersCount, primitivesCount);
-    mesh->setName(name.string(), name.size());
-    for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) {
-        mesh->setVertexBuffer(vertexBuffers[vCount].get(), vCount);
-    }
-    for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) {
-        mesh->setPrimitive(indexBuffers[pCount].get(), primitives[pCount], pCount);
-    }
-
-    // Cleanup
-    if (vertexBuffersCount) {
-        delete[] vertexBuffers;
-    }
-    if (primitivesCount) {
-        delete[] indexBuffers;
-        delete[] primitives;
-    }
-
-#ifndef ANDROID_RS_SERIALIZE
-    mesh->init();
-    mesh->uploadAll(rsc);
-#endif
-    return mesh;
-}
-
-void Mesh::render(Context *rsc) const {
-    for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) {
-        renderPrimitive(rsc, ct);
-    }
-}
-
-void Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const {
-    if (primIndex >= mHal.state.primitivesCount) {
-        ALOGE("Invalid primitive index");
-        return;
-    }
-
-    if (mHal.state.indexBuffers[primIndex]) {
-        renderPrimitiveRange(rsc, primIndex, 0, mHal.state.indexBuffers[primIndex]->getType()->getDimX());
-        return;
-    }
-
-    renderPrimitiveRange(rsc, primIndex, 0, mHal.state.vertexBuffers[0]->getType()->getDimX());
-}
-
-void Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const {
-    if (len < 1 || primIndex >= mHal.state.primitivesCount) {
-        ALOGE("Invalid mesh or parameters");
-        return;
-    }
-
-    mRSC->mHal.funcs.mesh.draw(mRSC, this, primIndex, start, len);
-}
-
-void Mesh::uploadAll(Context *rsc) {
-    for (uint32_t ct = 0; ct < mHal.state.vertexBuffersCount; ct ++) {
-        if (mHal.state.vertexBuffers[ct]) {
-            rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.vertexBuffers[ct]);
-        }
-    }
-
-    for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) {
-        if (mHal.state.indexBuffers[ct]) {
-            rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.indexBuffers[ct]);
-        }
-    }
-}
-
-void Mesh::computeBBox() {
-    float *posPtr = NULL;
-    uint32_t vectorSize = 0;
-    uint32_t stride = 0;
-    uint32_t numVerts = 0;
-    // First we need to find the position ptr and stride
-    for (uint32_t ct=0; ct < mHal.state.vertexBuffersCount; ct++) {
-        const Type *bufferType = mHal.state.vertexBuffers[ct]->getType();
-        const Element *bufferElem = bufferType->getElement();
-
-        for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) {
-            if (strcmp(bufferElem->getFieldName(ct), "position") == 0) {
-                vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize();
-                stride = bufferElem->getSizeBytes() / sizeof(float);
-                uint32_t offset = bufferElem->getFieldOffsetBytes(ct);
-                posPtr = (float*)((uint8_t*)mHal.state.vertexBuffers[ct]->getPtr() + offset);
-                numVerts = bufferType->getDimX();
-                break;
-            }
-        }
-        if (posPtr) {
-            break;
-        }
-    }
-
-    mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6;
-    mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6;
-    if (!posPtr) {
-        ALOGE("Unable to compute bounding box");
-        mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f;
-        mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f;
-        return;
-    }
-
-    for (uint32_t i = 0; i < numVerts; i ++) {
-        for (uint32_t v = 0; v < vectorSize; v ++) {
-            mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]);
-            mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]);
-        }
-        posPtr += stride;
-    }
-}
-
-namespace android {
-namespace renderscript {
-
-RsMesh rsi_MeshCreate(Context *rsc,
-                      RsAllocation * vtx, size_t vtxCount,
-                      RsAllocation * idx, size_t idxCount,
-                      uint32_t * primType, size_t primTypeCount) {
-    rsAssert(idxCount == primTypeCount);
-    Mesh *sm = new Mesh(rsc, vtxCount, idxCount);
-    sm->incUserRef();
-
-    for (uint32_t i = 0; i < vtxCount; i ++) {
-        sm->setVertexBuffer((Allocation*)vtx[i], i);
-    }
-
-    for (uint32_t i = 0; i < idxCount; i ++) {
-        sm->setPrimitive((Allocation*)idx[i], (RsPrimitive)primType[i], i);
-    }
-
-    sm->init();
-
-    return sm;
-}
-
-}}
-
-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/libs/rs/rsMesh.h b/libs/rs/rsMesh.h
deleted file mode 100644
index 7ca63cf..0000000
--- a/libs/rs/rsMesh.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_MESH_H
-#define ANDROID_RS_MESH_H
-
-
-#include "rsObjectBase.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-/*****************************************************************************
- * CAUTION
- *
- * Any layout changes for this class may require a corresponding change to be
- * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
- * a partial copy of the information below.
- *
- *****************************************************************************/
-
-// An element is a group of Components that occupies one cell in a structure.
-class Mesh : public ObjectBase {
-public:
-    struct Hal {
-        mutable void *drv;
-
-        struct State {
-            // Contains vertex data
-            // Position, normal, texcoord, etc could either be strided in one allocation
-            // of provided separetely in multiple ones
-            Allocation **vertexBuffers;
-            uint32_t vertexBuffersCount;
-
-            // indexBuffers[i] could be NULL, in which case only primitives[i] is used
-            Allocation **indexBuffers;
-            uint32_t indexBuffersCount;
-            RsPrimitive *primitives;
-            uint32_t primitivesCount;
-        };
-        State state;
-    };
-    Hal mHal;
-
-    Mesh(Context *);
-    Mesh(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount);
-    ~Mesh();
-
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; }
-    static Mesh *createFromStream(Context *rsc, IStream *stream);
-    void init();
-
-    void setVertexBuffer(Allocation *vb, uint32_t index) {
-        mVertexBuffers[index].set(vb);
-        mHal.state.vertexBuffers[index] = vb;
-    }
-
-    void setPrimitive(Allocation *idx, RsPrimitive prim, uint32_t index) {
-        mIndexBuffers[index].set(idx);
-        mHal.state.indexBuffers[index] = idx;
-        mHal.state.primitives[index] = prim;
-    }
-
-    void render(Context *) const;
-    void renderPrimitive(Context *, uint32_t primIndex) const;
-    void renderPrimitiveRange(Context *, uint32_t primIndex, uint32_t start, uint32_t len) const;
-    void uploadAll(Context *);
-
-    // Bounding volumes
-    float mBBoxMin[3];
-    float mBBoxMax[3];
-    void computeBBox();
-protected:
-    ObjectBaseRef<Allocation> *mVertexBuffers;
-    ObjectBaseRef<Allocation> *mIndexBuffers;
-    bool mInitialized;
-};
-
-class MeshContext {
-public:
-    MeshContext() {
-    }
-    ~MeshContext() {
-    }
-};
-
-}
-}
-#endif //ANDROID_RS_MESH_H
-
-
-
diff --git a/libs/rs/rsMutex.cpp b/libs/rs/rsMutex.cpp
deleted file mode 100644
index 6512372..0000000
--- a/libs/rs/rsMutex.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsMutex.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-
-Mutex::Mutex() {
-}
-
-Mutex::~Mutex() {
-    pthread_mutex_destroy(&mMutex);
-}
-
-bool Mutex::init() {
-    int status = pthread_mutex_init(&mMutex, NULL);
-    if (status) {
-        ALOGE("Mutex::Mutex init failure");
-        return false;
-    }
-    return true;
-}
-
-bool Mutex::lock() {
-    int status;
-    status = pthread_mutex_lock(&mMutex);
-    if (status) {
-        ALOGE("Mutex: error %i locking.", status);
-        return false;
-    }
-    return true;
-}
-
-bool Mutex::unlock() {
-    int status;
-    status = pthread_mutex_unlock(&mMutex);
-    if (status) {
-        ALOGE("Mutex error %i unlocking.", status);
-        return false;
-    }
-    return true;
-}
-
-
diff --git a/libs/rs/rsMutex.h b/libs/rs/rsMutex.h
deleted file mode 100644
index 47725d7..0000000
--- a/libs/rs/rsMutex.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_MUTEX_H
-#define ANDROID_RS_MUTEX_H
-
-
-#include "rsUtils.h"
-
-namespace android {
-namespace renderscript {
-
-class Mutex {
-public:
-    Mutex();
-    ~Mutex();
-
-    bool init();
-    bool lock();
-    bool unlock();
-
-protected:
-    pthread_mutex_t mMutex;
-};
-
-}
-}
-
-#endif
-
diff --git a/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp
deleted file mode 100644
index 6a64582..0000000
--- a/libs/rs/rsObjectBase.cpp
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsObjectBase.h"
-#include "rsContext.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-pthread_mutex_t ObjectBase::gObjectInitMutex = PTHREAD_MUTEX_INITIALIZER;
-
-ObjectBase::ObjectBase(Context *rsc) {
-    mUserRefCount = 0;
-    mSysRefCount = 0;
-    mRSC = rsc;
-    mNext = NULL;
-    mPrev = NULL;
-
-#if RS_OBJECT_DEBUG
-    mStack.update(2);
-#endif
-
-    rsAssert(rsc);
-    add();
-    //ALOGV("ObjectBase %p con", this);
-}
-
-ObjectBase::~ObjectBase() {
-    //ALOGV("~ObjectBase %p  ref %i,%i", this, mUserRefCount, mSysRefCount);
-#if RS_OBJECT_DEBUG
-    mStack.dump();
-#endif
-
-    if (mPrev || mNext) {
-        // While the normal practice is to call remove before we call
-        // delete.  Its possible for objects without a re-use list
-        // for avoiding duplication to be created on the stack.  In those
-        // cases we need to remove ourself here.
-        asyncLock();
-        remove();
-        asyncUnlock();
-    }
-
-    rsAssert(!mUserRefCount);
-    rsAssert(!mSysRefCount);
-}
-
-void ObjectBase::dumpLOGV(const char *op) const {
-    if (mName.size()) {
-        ALOGV("%s RSobj %p, name %s, refs %i,%i  links %p,%p,%p",
-             op, this, mName.string(), mUserRefCount, mSysRefCount, mNext, mPrev, mRSC);
-    } else {
-        ALOGV("%s RSobj %p, no-name, refs %i,%i  links %p,%p,%p",
-             op, this, mUserRefCount, mSysRefCount, mNext, mPrev, mRSC);
-    }
-}
-
-void ObjectBase::incUserRef() const {
-    android_atomic_inc(&mUserRefCount);
-    //ALOGV("ObjectBase %p incU ref %i, %i", this, mUserRefCount, mSysRefCount);
-}
-
-void ObjectBase::incSysRef() const {
-    android_atomic_inc(&mSysRefCount);
-    //ALOGV("ObjectBase %p incS ref %i, %i", this, mUserRefCount, mSysRefCount);
-}
-
-void ObjectBase::preDestroy() const {
-}
-
-bool ObjectBase::freeChildren() {
-    return false;
-}
-
-bool ObjectBase::checkDelete(const ObjectBase *ref) {
-    if (!ref) {
-        return false;
-    }
-
-    asyncLock();
-    // This lock protects us against the non-RS threads changing
-    // the ref counts.  At this point we should be the only thread
-    // working on them.
-    if (ref->mUserRefCount || ref->mSysRefCount) {
-        asyncUnlock();
-        return false;
-    }
-
-    ref->remove();
-    // At this point we can unlock because there should be no possible way
-    // for another thread to reference this object.
-    ref->preDestroy();
-    asyncUnlock();
-    delete ref;
-    return true;
-}
-
-bool ObjectBase::decUserRef() const {
-    rsAssert(mUserRefCount > 0);
-#if RS_OBJECT_DEBUG
-    ALOGV("ObjectBase %p decU ref %i, %i", this, mUserRefCount, mSysRefCount);
-    if (mUserRefCount <= 0) {
-        mStack.dump();
-    }
-#endif
-
-
-    if ((android_atomic_dec(&mUserRefCount) <= 1) &&
-        (android_atomic_acquire_load(&mSysRefCount) <= 0)) {
-        return checkDelete(this);
-    }
-    return false;
-}
-
-bool ObjectBase::zeroUserRef() const {
-    //ALOGV("ObjectBase %p zeroU ref %i, %i", this, mUserRefCount, mSysRefCount);
-    android_atomic_acquire_store(0, &mUserRefCount);
-    if (android_atomic_acquire_load(&mSysRefCount) <= 0) {
-        return checkDelete(this);
-    }
-    return false;
-}
-
-bool ObjectBase::decSysRef() const {
-    //ALOGV("ObjectBase %p decS ref %i, %i", this, mUserRefCount, mSysRefCount);
-    rsAssert(mSysRefCount > 0);
-    if ((android_atomic_dec(&mSysRefCount) <= 1) &&
-        (android_atomic_acquire_load(&mUserRefCount) <= 0)) {
-        return checkDelete(this);
-    }
-    return false;
-}
-
-void ObjectBase::setName(const char *name) {
-    mName.setTo(name);
-}
-
-void ObjectBase::setName(const char *name, uint32_t len) {
-    mName.setTo(name, len);
-}
-
-void ObjectBase::asyncLock() {
-    pthread_mutex_lock(&gObjectInitMutex);
-}
-
-void ObjectBase::asyncUnlock() {
-    pthread_mutex_unlock(&gObjectInitMutex);
-}
-
-void ObjectBase::add() const {
-    asyncLock();
-
-    rsAssert(!mNext);
-    rsAssert(!mPrev);
-    //ALOGV("calling add  rsc %p", mRSC);
-    mNext = mRSC->mObjHead;
-    if (mRSC->mObjHead) {
-        mRSC->mObjHead->mPrev = this;
-    }
-    mRSC->mObjHead = this;
-
-    asyncUnlock();
-}
-
-void ObjectBase::remove() const {
-    //ALOGV("calling remove  rsc %p", mRSC);
-    if (!mRSC) {
-        rsAssert(!mPrev);
-        rsAssert(!mNext);
-        return;
-    }
-
-    if (mRSC->mObjHead == this) {
-        mRSC->mObjHead = mNext;
-    }
-    if (mPrev) {
-        mPrev->mNext = mNext;
-    }
-    if (mNext) {
-        mNext->mPrev = mPrev;
-    }
-    mPrev = NULL;
-    mNext = NULL;
-}
-
-void ObjectBase::zeroAllUserRef(Context *rsc) {
-    if (rsc->props.mLogObjects) {
-        ALOGV("Forcing release of all outstanding user refs.");
-    }
-
-    // This operation can be slow, only to be called during context cleanup.
-    const ObjectBase * o = rsc->mObjHead;
-    while (o) {
-        //ALOGE("o %p", o);
-        if (o->zeroUserRef()) {
-            // deleted the object and possibly others, restart from head.
-            o = rsc->mObjHead;
-            //ALOGE("o head %p", o);
-        } else {
-            o = o->mNext;
-            //ALOGE("o next %p", o);
-        }
-    }
-
-    if (rsc->props.mLogObjects) {
-        ALOGV("Objects remaining.");
-        dumpAll(rsc);
-    }
-}
-
-void ObjectBase::freeAllChildren(Context *rsc) {
-    if (rsc->props.mLogObjects) {
-        ALOGV("Forcing release of all child objects.");
-    }
-
-    // This operation can be slow, only to be called during context cleanup.
-    ObjectBase * o = (ObjectBase *)rsc->mObjHead;
-    while (o) {
-        if (o->freeChildren()) {
-            // deleted ref to self and possibly others, restart from head.
-            o = (ObjectBase *)rsc->mObjHead;
-        } else {
-            o = (ObjectBase *)o->mNext;
-        }
-    }
-
-    if (rsc->props.mLogObjects) {
-        ALOGV("Objects remaining.");
-        dumpAll(rsc);
-    }
-}
-
-void ObjectBase::dumpAll(Context *rsc) {
-    asyncLock();
-
-    ALOGV("Dumping all objects");
-    const ObjectBase * o = rsc->mObjHead;
-    while (o) {
-        ALOGV(" Object %p", o);
-        o->dumpLOGV("  ");
-        o = o->mNext;
-    }
-
-    asyncUnlock();
-}
-
-bool ObjectBase::isValid(const Context *rsc, const ObjectBase *obj) {
-    asyncLock();
-
-    const ObjectBase * o = rsc->mObjHead;
-    while (o) {
-        if (o == obj) {
-            asyncUnlock();
-            return true;
-        }
-        o = o->mNext;
-    }
-    asyncUnlock();
-    return false;
-}
-
diff --git a/libs/rs/rsObjectBase.h b/libs/rs/rsObjectBase.h
deleted file mode 100644
index 586da19..0000000
--- a/libs/rs/rsObjectBase.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_OBJECT_BASE_H
-#define ANDROID_RS_OBJECT_BASE_H
-
-#include "rsUtils.h"
-#include "rsDefines.h"
-
-#define RS_OBJECT_DEBUG 0
-
-#include <utils/CallStack.h>
-
-namespace android {
-namespace renderscript {
-
-class Context;
-class OStream;
-
-// An element is a group of Components that occupies one cell in a structure.
-class ObjectBase {
-public:
-    ObjectBase(Context *rsc);
-
-    void incSysRef() const;
-    bool decSysRef() const;
-
-    void incUserRef() const;
-    bool decUserRef() const;
-    bool zeroUserRef() const;
-
-    static bool checkDelete(const ObjectBase *);
-
-    const char * getName() const {
-        return mName.string();
-    }
-    void setName(const char *);
-    void setName(const char *, uint32_t len);
-
-    Context * getContext() const {return mRSC;}
-    virtual bool freeChildren();
-
-    static void zeroAllUserRef(Context *rsc);
-    static void freeAllChildren(Context *rsc);
-    static void dumpAll(Context *rsc);
-
-    virtual void dumpLOGV(const char *prefix) const;
-    virtual void serialize(OStream *stream) const = 0;
-    virtual RsA3DClassID getClassId() const = 0;
-
-    static bool isValid(const Context *rsc, const ObjectBase *obj);
-
-    // The async lock is taken during object creation in non-rs threads
-    // and object deletion in the rs thread.
-    static void asyncLock();
-    static void asyncUnlock();
-
-protected:
-    // Called inside the async lock for any object list management that is
-    // necessary in derived classes.
-    virtual void preDestroy() const;
-
-    Context *mRSC;
-    virtual ~ObjectBase();
-
-private:
-    static pthread_mutex_t gObjectInitMutex;
-
-    void add() const;
-    void remove() const;
-
-    String8 mName;
-    mutable int32_t mSysRefCount;
-    mutable int32_t mUserRefCount;
-
-    mutable const ObjectBase * mPrev;
-    mutable const ObjectBase * mNext;
-
-#if RS_OBJECT_DEBUG
-    CallStack mStack;
-#endif
-
-};
-
-template<class T>
-class ObjectBaseRef {
-public:
-    ObjectBaseRef() {
-        mRef = NULL;
-    }
-
-    ObjectBaseRef(const ObjectBaseRef &ref) {
-        mRef = ref.get();
-        if (mRef) {
-            mRef->incSysRef();
-        }
-    }
-
-    ObjectBaseRef(T *ref) {
-        mRef = ref;
-        if (mRef) {
-            ref->incSysRef();
-        }
-    }
-
-    ObjectBaseRef & operator= (const ObjectBaseRef &ref) {
-        if (&ref != this) {
-            set(ref);
-        }
-        return *this;
-    }
-
-    ~ObjectBaseRef() {
-        clear();
-    }
-
-    void set(T *ref) {
-        if (mRef != ref) {
-            clear();
-            mRef = ref;
-            if (mRef) {
-                ref->incSysRef();
-            }
-        }
-    }
-
-    void set(const ObjectBaseRef &ref) {
-        set(ref.mRef);
-    }
-
-    void clear() {
-        if (mRef) {
-            mRef->decSysRef();
-        }
-        mRef = NULL;
-    }
-
-    inline T * get() const {
-        return mRef;
-    }
-
-    inline T * operator-> () const {
-        return mRef;
-    }
-
-protected:
-    T * mRef;
-};
-
-}
-}
-
-#endif //ANDROID_RS_OBJECT_BASE_H
-
diff --git a/libs/rs/rsPath.cpp b/libs/rs/rsPath.cpp
deleted file mode 100644
index 055bb86..0000000
--- a/libs/rs/rsPath.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rs.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-
-Path::Path(Context *rsc) : ObjectBase(rsc) {
-}
-
-Path::Path(Context *rsc, RsPathPrimitive pp, bool isStatic,
-                      Allocation *vtx, Allocation *loops, float quality)
-: ObjectBase(rsc) {
-
-    memset(&mHal, 0, sizeof(mHal));
-    mHal.state.quality = quality;
-    mHal.state.primitive = pp;
-
-    //LOGE("i1");
-    rsc->mHal.funcs.path.initStatic(rsc, this, vtx, loops);
-
-    //LOGE("i2");
-}
-
-Path::Path(Context *rsc, uint32_t vertexBuffersCount, uint32_t primitivesCount)
-: ObjectBase(rsc) {
-
-}
-
-Path::~Path() {
-
-}
-
-
-void Path::rasterize(const BezierSegment_t *s, uint32_t num, Allocation *alloc) {
-
-    for (uint32_t i=0; i < num; i++) {
-
-    }
-
-}
-
-void Path::render(Context *rsc) {
-}
-
-void Path::serialize(OStream *stream) const {
-
-}
-
-RsA3DClassID Path::getClassId() const {
-    return RS_A3D_CLASS_ID_UNKNOWN;
-}
-
-namespace android {
-namespace renderscript {
-
-RsPath rsi_PathCreate(Context *rsc, RsPathPrimitive pp, bool isStatic,
-                      RsAllocation vtx, RsAllocation loops, float quality) {
-    return new Path(rsc, pp, isStatic, (Allocation *)vtx, (Allocation *)loops, quality);
-}
-
-}
-}
diff --git a/libs/rs/rsPath.h b/libs/rs/rsPath.h
deleted file mode 100644
index 1abfc9a..0000000
--- a/libs/rs/rsPath.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_PATH_H
-#define ANDROID_RS_PATH_H
-
-
-#include "rsObjectBase.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class Path : public ObjectBase {
-public:
-    struct {
-        mutable void * drv;
-
-        struct State {
-            RsPathPrimitive primitive;
-            float quality;
-        };
-        State state;
-    } mHal;
-
-    Path(Context *);
-    Path(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount);
-    Path(Context *, RsPathPrimitive pp, bool isStatic, Allocation *vtx, Allocation *loop, float q);
-
-    ~Path();
-
-    void render(Context *);
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const;
-
-private:
-
-
-    typedef struct {
-        float x[4];
-        float y[4];
-    } BezierSegment_t;
-
-    bool subdivideCheck(const BezierSegment_t *s, float u1, float u2);
-
-    void rasterize(const BezierSegment_t *s, uint32_t num, Allocation *alloc);
-
-
-};
-
-}
-}
-#endif //ANDROID_RS_PATH_H
-
-
-
diff --git a/libs/rs/rsProgram.cpp b/libs/rs/rsProgram.cpp
deleted file mode 100644
index 7114f29..0000000
--- a/libs/rs/rsProgram.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsProgram.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-Program::Program(Context *rsc, const char * shaderText, size_t shaderLength,
-                 const uint32_t * params, size_t paramLength)
-    : ProgramBase(rsc) {
-
-    initMemberVars();
-    for (uint32_t ct=0; ct < paramLength; ct+=2) {
-        if (params[ct] == RS_PROGRAM_PARAM_INPUT) {
-            mHal.state.inputElementsCount++;
-        }
-        if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) {
-            mHal.state.constantsCount++;
-        }
-        if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_TYPE) {
-            mHal.state.texturesCount++;
-        }
-    }
-
-    mTextures = new ObjectBaseRef<Allocation>[mHal.state.texturesCount];
-    mSamplers = new ObjectBaseRef<Sampler>[mHal.state.texturesCount];
-    mInputElements = new ObjectBaseRef<Element>[mHal.state.inputElementsCount];
-    mConstantTypes = new ObjectBaseRef<Type>[mHal.state.constantsCount];
-    mConstants = new ObjectBaseRef<Allocation>[mHal.state.constantsCount];
-
-    mHal.state.textures = new Allocation*[mHal.state.texturesCount];
-    mHal.state.samplers = new Sampler*[mHal.state.texturesCount];
-    mHal.state.textureTargets = new RsTextureTarget[mHal.state.texturesCount];
-    mHal.state.inputElements = new Element*[mHal.state.inputElementsCount];
-    mHal.state.constantTypes = new Type*[mHal.state.constantsCount];
-    mHal.state.constants = new Allocation*[mHal.state.constantsCount];
-
-    // Will initialize everything
-    freeChildren();
-
-    uint32_t input = 0;
-    uint32_t constant = 0;
-    uint32_t texture = 0;
-    for (uint32_t ct=0; ct < paramLength; ct+=2) {
-        if (params[ct] == RS_PROGRAM_PARAM_INPUT) {
-            mInputElements[input].set(reinterpret_cast<Element *>(params[ct+1]));
-            mHal.state.inputElements[input++] = reinterpret_cast<Element *>(params[ct+1]);
-        }
-        if (params[ct] == RS_PROGRAM_PARAM_CONSTANT) {
-            mConstantTypes[constant].set(reinterpret_cast<Type *>(params[ct+1]));
-            mHal.state.constantTypes[constant++] = reinterpret_cast<Type *>(params[ct+1]);
-        }
-        if (params[ct] == RS_PROGRAM_PARAM_TEXTURE_TYPE) {
-            mHal.state.textureTargets[texture++] = (RsTextureTarget)params[ct+1];
-        }
-    }
-    mIsInternal = false;
-    uint32_t internalTokenLen = strlen(RS_SHADER_INTERNAL);
-    if (shaderLength > internalTokenLen &&
-       strncmp(RS_SHADER_INTERNAL, shaderText, internalTokenLen) == 0) {
-        mIsInternal = true;
-        shaderText += internalTokenLen;
-        shaderLength -= internalTokenLen;
-    }
-    mUserShader.setTo(shaderText, shaderLength);
-}
-
-Program::~Program() {
-    freeChildren();
-
-    delete[] mTextures;
-    delete[] mSamplers;
-    delete[] mInputElements;
-    delete[] mConstantTypes;
-    delete[] mConstants;
-
-    delete[] mHal.state.textures;
-    delete[] mHal.state.samplers;
-    delete[] mHal.state.textureTargets;
-    delete[] mHal.state.inputElements;
-    delete[] mHal.state.constantTypes;
-    delete[] mHal.state.constants;
-    mHal.state.inputElementsCount = 0;
-    mHal.state.constantsCount = 0;
-    mHal.state.texturesCount = 0;
-}
-
-bool Program::freeChildren() {
-    for (uint32_t ct=0; ct < mHal.state.constantsCount; ct++) {
-        bindAllocation(NULL, NULL, ct);
-    }
-
-    for (uint32_t ct=0; ct < mHal.state.texturesCount; ct++) {
-        bindTexture(NULL, ct, NULL);
-        bindSampler(NULL, ct, NULL);
-    }
-    return false;
-}
-
-void Program::initMemberVars() {
-    mDirty = true;
-
-    mHal.drv = NULL;
-    mHal.state.textures = NULL;
-    mHal.state.samplers = NULL;
-    mHal.state.textureTargets = NULL;
-    mHal.state.inputElements = NULL;
-    mHal.state.constantTypes = NULL;
-    mHal.state.constants = NULL;
-
-    mHal.state.inputElementsCount = 0;
-    mHal.state.constantsCount = 0;
-    mHal.state.texturesCount = 0;
-
-    mTextures = NULL;
-    mSamplers = NULL;
-    mInputElements = NULL;
-    mConstantTypes = NULL;
-    mConstants = NULL;
-
-    mIsInternal = false;
-}
-
-void Program::bindAllocation(Context *rsc, Allocation *alloc, uint32_t slot) {
-    if (alloc != NULL) {
-        if (slot >= mHal.state.constantsCount) {
-            ALOGE("Attempt to bind alloc at slot %u, on shader id %u, but const count is %u",
-                 slot, (uint32_t)this, mHal.state.constantsCount);
-            rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind allocation");
-            return;
-        }
-        if (alloc->getType() != mConstantTypes[slot].get()) {
-            ALOGE("Attempt to bind alloc at slot %u, on shader id %u, but types mismatch",
-                 slot, (uint32_t)this);
-            rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind allocation");
-            return;
-        }
-    }
-    if (mConstants[slot].get() == alloc) {
-        return;
-    }
-    if (mConstants[slot].get()) {
-        mConstants[slot]->removeProgramToDirty(this);
-    }
-    mConstants[slot].set(alloc);
-    mHal.state.constants[slot] = alloc;
-    if (alloc) {
-        alloc->addProgramToDirty(this);
-    }
-    mDirty = true;
-}
-
-void Program::bindTexture(Context *rsc, uint32_t slot, Allocation *a) {
-    if (slot >= mHal.state.texturesCount) {
-        ALOGE("Attempt to bind texture to slot %u but tex count is %u", slot, mHal.state.texturesCount);
-        rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind texture");
-        return;
-    }
-
-    if (a && a->getType()->getDimFaces() && mHal.state.textureTargets[slot] != RS_TEXTURE_CUBE) {
-        ALOGE("Attempt to bind cubemap to slot %u but 2d texture needed", slot);
-        rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind cubemap to 2d texture slot");
-        return;
-    }
-
-    mTextures[slot].set(a);
-    mHal.state.textures[slot] = a;
-
-    mDirty = true;
-}
-
-void Program::bindSampler(Context *rsc, uint32_t slot, Sampler *s) {
-    if (slot >= mHal.state.texturesCount) {
-        ALOGE("Attempt to bind sampler to slot %u but tex count is %u", slot, mHal.state.texturesCount);
-        rsc->setError(RS_ERROR_BAD_SHADER, "Cannot bind sampler");
-        return;
-    }
-
-    mSamplers[slot].set(s);
-    mHal.state.samplers[slot] = s;
-    mDirty = true;
-}
-
-namespace android {
-namespace renderscript {
-
-void rsi_ProgramBindConstants(Context *rsc, RsProgram vp, uint32_t slot, RsAllocation constants) {
-    Program *p = static_cast<Program *>(vp);
-    p->bindAllocation(rsc, static_cast<Allocation *>(constants), slot);
-}
-
-void rsi_ProgramBindTexture(Context *rsc, RsProgram vpf, uint32_t slot, RsAllocation a) {
-    Program *p = static_cast<Program *>(vpf);
-    p->bindTexture(rsc, slot, static_cast<Allocation *>(a));
-}
-
-void rsi_ProgramBindSampler(Context *rsc, RsProgram vpf, uint32_t slot, RsSampler s) {
-    Program *p = static_cast<Program *>(vpf);
-    p->bindSampler(rsc, slot, static_cast<Sampler *>(s));
-}
-
-}
-}
-
diff --git a/libs/rs/rsProgram.h b/libs/rs/rsProgram.h
deleted file mode 100644
index d032930..0000000
--- a/libs/rs/rsProgram.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_PROGRAM_H
-#define ANDROID_RS_PROGRAM_H
-
-#include "rsProgramBase.h"
-#include "rsElement.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-#define RS_SHADER_INTERNAL "//rs_shader_internal\n"
-#define RS_SHADER_ATTR "ATTRIB_"
-#define RS_SHADER_UNI "UNI_"
-
-class Program : public ProgramBase {
-public:
-    struct Hal {
-        mutable void *drv;
-
-        struct State {
-            // The difference between Textures and Constants is how they are accessed
-            // Texture lookups go though a sampler which in effect converts normalized
-            // coordinates into type specific.  Multiple samples may also be taken
-            // and filtered.
-            //
-            // Constants are strictly accessed by the shader code
-            Allocation **textures;
-            RsTextureTarget *textureTargets;
-            uint32_t texturesCount;
-
-            Sampler **samplers;
-            uint32_t samplersCount;
-
-            Allocation **constants;
-            Type **constantTypes;
-            uint32_t constantsCount;
-
-            Element **inputElements;
-            uint32_t inputElementsCount;
-        };
-        State state;
-    };
-    Hal mHal;
-
-    Program(Context *, const char * shaderText, size_t shaderLength,
-            const uint32_t * params, size_t paramLength);
-    virtual ~Program();
-    virtual bool freeChildren();
-
-    void bindAllocation(Context *, Allocation *, uint32_t slot);
-
-    bool isUserProgram() const {return !mIsInternal;}
-
-    void bindTexture(Context *, uint32_t slot, Allocation *);
-    void bindSampler(Context *, uint32_t slot, Sampler *);
-
-protected:
-    ObjectBaseRef<Allocation> *mTextures;
-    ObjectBaseRef<Sampler> *mSamplers;
-    ObjectBaseRef<Allocation> *mConstants;
-    ObjectBaseRef<Type> *mConstantTypes;
-    ObjectBaseRef<Element> *mInputElements;
-
-    bool mIsInternal;
-    String8 mUserShader;
-    void initMemberVars();
-};
-
-}
-}
-#endif // ANDROID_RS_PROGRAM_H
-
-
-
diff --git a/libs/rs/rsProgramBase.h b/libs/rs/rsProgramBase.h
deleted file mode 100644
index 80da453..0000000
--- a/libs/rs/rsProgramBase.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_PROGRAM_BASE_H
-#define ANDROID_RS_PROGRAM_BASE_H
-
-#include "rsObjectBase.h"
-#include "rsElement.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class ProgramBase : public ObjectBase {
-public:
-    ProgramBase(Context *rsc) : ObjectBase(rsc) {
-        mDirty = true;
-    }
-
-    void forceDirty() const {mDirty = true;}
-
-protected:
-    mutable bool mDirty;
-};
-
-}
-}
-#endif // ANDROID_RS_PROGRAM_BASE_H
-
-
-
diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp
deleted file mode 100644
index bebde1e..0000000
--- a/libs/rs/rsProgramFragment.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsProgramFragment.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-ProgramFragment::ProgramFragment(Context *rsc, const char * shaderText, size_t shaderLength,
-                                 const char** textureNames, size_t textureNamesCount, const size_t *textureNamesLength,
-
-                                 const uint32_t * params, size_t paramLength)
-    : Program(rsc, shaderText, shaderLength, params, paramLength) {
-    mConstantColor[0] = 1.f;
-    mConstantColor[1] = 1.f;
-    mConstantColor[2] = 1.f;
-    mConstantColor[3] = 1.f;
-
-    mRSC->mHal.funcs.fragment.init(mRSC, this, mUserShader.string(), mUserShader.length(),
-                                   textureNames, textureNamesCount, textureNamesLength);
-}
-
-ProgramFragment::~ProgramFragment() {
-    mRSC->mHal.funcs.fragment.destroy(mRSC, this);
-}
-
-void ProgramFragment::setConstantColor(Context *rsc, float r, float g, float b, float a) {
-    if (isUserProgram()) {
-        ALOGE("Attempting to set fixed function emulation color on user program");
-        rsc->setError(RS_ERROR_BAD_SHADER, "Cannot  set fixed function emulation color on user program");
-        return;
-    }
-    if (mHal.state.constants[0] == NULL) {
-        ALOGE("Unable to set fixed function emulation color because allocation is missing");
-        rsc->setError(RS_ERROR_BAD_SHADER, "Unable to set fixed function emulation color because allocation is missing");
-        return;
-    }
-    mConstantColor[0] = r;
-    mConstantColor[1] = g;
-    mConstantColor[2] = b;
-    mConstantColor[3] = a;
-    memcpy(mHal.state.constants[0]->getPtr(), mConstantColor, 4*sizeof(float));
-    mDirty = true;
-}
-
-void ProgramFragment::setup(Context *rsc, ProgramFragmentState *state) {
-    if ((state->mLast.get() == this) && !mDirty) {
-        return;
-    }
-    state->mLast.set(this);
-
-    for (uint32_t ct=0; ct < mHal.state.texturesCount; ct++) {
-        if (!mHal.state.textures[ct]) {
-            ALOGE("No texture bound for shader id %u, texture unit %u", (uint)this, ct);
-            rsc->setError(RS_ERROR_BAD_SHADER, "No texture bound");
-            continue;
-        }
-    }
-
-    rsc->mHal.funcs.fragment.setActive(rsc, this);
-}
-
-void ProgramFragment::serialize(OStream *stream) const {
-}
-
-ProgramFragment *ProgramFragment::createFromStream(Context *rsc, IStream *stream) {
-    return NULL;
-}
-
-ProgramFragmentState::ProgramFragmentState() {
-    mPF = NULL;
-}
-
-ProgramFragmentState::~ProgramFragmentState() {
-    ObjectBase::checkDelete(mPF);
-    mPF = NULL;
-}
-
-void ProgramFragmentState::init(Context *rsc) {
-    String8 shaderString(RS_SHADER_INTERNAL);
-    shaderString.append("varying lowp vec4 varColor;\n");
-    shaderString.append("varying vec2 varTex0;\n");
-    shaderString.append("void main() {\n");
-    shaderString.append("  lowp vec4 col = UNI_Color;\n");
-    shaderString.append("  gl_FragColor = col;\n");
-    shaderString.append("}\n");
-
-    ObjectBaseRef<const Element> colorElem = Element::createRef(rsc, RS_TYPE_FLOAT_32, RS_KIND_USER, false, 4);
-    Element::Builder builder;
-    builder.add(colorElem.get(), "Color", 1);
-    ObjectBaseRef<const Element> constInput = builder.create(rsc);
-
-    ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false);
-
-    uint32_t tmp[2];
-    tmp[0] = RS_PROGRAM_PARAM_CONSTANT;
-    tmp[1] = (uint32_t)inputType.get();
-
-    Allocation *constAlloc = Allocation::createAllocation(rsc, inputType.get(),
-                              RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS);
-    ProgramFragment *pf = new ProgramFragment(rsc, shaderString.string(), shaderString.length(),
-                                              NULL, 0, NULL, tmp, 2);
-    pf->bindAllocation(rsc, constAlloc, 0);
-    pf->setConstantColor(rsc, 1.0f, 1.0f, 1.0f, 1.0f);
-
-    mDefault.set(pf);
-}
-
-void ProgramFragmentState::deinit(Context *rsc) {
-    mDefault.clear();
-    mLast.clear();
-}
-
-namespace android {
-namespace renderscript {
-
-RsProgramFragment rsi_ProgramFragmentCreate(Context *rsc, const char * shaderText,
-                                            size_t shaderLength,
-                                            const char** textureNames,
-                                            size_t textureNamesCount,
-                                            const size_t *textureNamesLength,
-                                            const uint32_t * params, size_t paramLength) {
-    ProgramFragment *pf = new ProgramFragment(rsc, shaderText, shaderLength,
-                                              textureNames, textureNamesCount, textureNamesLength,
-                                              params, paramLength);
-    pf->incUserRef();
-    //ALOGE("rsi_ProgramFragmentCreate %p", pf);
-    return pf;
-}
-
-}
-}
-
diff --git a/libs/rs/rsProgramFragment.h b/libs/rs/rsProgramFragment.h
deleted file mode 100644
index 4eb28e7..0000000
--- a/libs/rs/rsProgramFragment.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_PROGRAM_FRAGMENT_H
-#define ANDROID_RS_PROGRAM_FRAGMENT_H
-
-#include "rsProgram.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class ProgramFragmentState;
-
-class ProgramFragment : public Program {
-public:
-    ProgramFragment(Context *rsc, const char * shaderText, size_t shaderLength,
-                    const char** textureNames, size_t textureNamesCount, const size_t *textureNamesLength,
-                     const uint32_t * params, size_t paramLength);
-    virtual ~ProgramFragment();
-
-    virtual void setup(Context *, ProgramFragmentState *);
-
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_FRAGMENT; }
-    static ProgramFragment *createFromStream(Context *rsc, IStream *stream);
-
-    void setConstantColor(Context *, float, float, float, float);
-
-protected:
-    float mConstantColor[4];
-    int32_t mTextureUniformIndexStart;
-};
-
-class ProgramFragmentState {
-public:
-    ProgramFragmentState();
-    ~ProgramFragmentState();
-
-    ProgramFragment *mPF;
-    void init(Context *rsc);
-    void deinit(Context *rsc);
-
-    ObjectBaseRef<ProgramFragment> mDefault;
-    Vector<ProgramFragment *> mPrograms;
-
-    ObjectBaseRef<ProgramFragment> mLast;
-};
-
-}
-}
-#endif
-
-
-
-
diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp
deleted file mode 100644
index 94bfe42..0000000
--- a/libs/rs/rsProgramRaster.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsProgramRaster.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-
-ProgramRaster::ProgramRaster(Context *rsc, bool pointSprite, RsCullMode cull)
-    : ProgramBase(rsc) {
-
-    memset(&mHal, 0, sizeof(mHal));
-    mHal.state.pointSprite = pointSprite;
-    mHal.state.cull = cull;
-    rsc->mHal.funcs.raster.init(rsc, this);
-}
-
-void ProgramRaster::preDestroy() const {
-    for (uint32_t ct = 0; ct < mRSC->mStateRaster.mRasterPrograms.size(); ct++) {
-        if (mRSC->mStateRaster.mRasterPrograms[ct] == this) {
-            mRSC->mStateRaster.mRasterPrograms.removeAt(ct);
-            break;
-        }
-    }
-}
-
-ProgramRaster::~ProgramRaster() {
-    mRSC->mHal.funcs.raster.destroy(mRSC, this);
-}
-
-void ProgramRaster::setup(const Context *rsc, ProgramRasterState *state) {
-    if (state->mLast.get() == this && !mDirty) {
-        return;
-    }
-    state->mLast.set(this);
-    mDirty = false;
-
-    rsc->mHal.funcs.raster.setActive(rsc, this);
-}
-
-void ProgramRaster::serialize(OStream *stream) const {
-}
-
-ProgramRaster *ProgramRaster::createFromStream(Context *rsc, IStream *stream) {
-    return NULL;
-}
-
-ProgramRasterState::ProgramRasterState() {
-}
-
-ProgramRasterState::~ProgramRasterState() {
-}
-
-void ProgramRasterState::init(Context *rsc) {
-    mDefault.set(ProgramRaster::getProgramRaster(rsc, false, RS_CULL_BACK).get());
-}
-
-void ProgramRasterState::deinit(Context *rsc) {
-    mDefault.clear();
-    mLast.clear();
-}
-
-ObjectBaseRef<ProgramRaster> ProgramRaster::getProgramRaster(Context *rsc,
-                                                             bool pointSprite,
-                                                             RsCullMode cull) {
-    ObjectBaseRef<ProgramRaster> returnRef;
-    ObjectBase::asyncLock();
-    for (uint32_t ct = 0; ct < rsc->mStateRaster.mRasterPrograms.size(); ct++) {
-        ProgramRaster *existing = rsc->mStateRaster.mRasterPrograms[ct];
-        if (existing->mHal.state.pointSprite != pointSprite) continue;
-        if (existing->mHal.state.cull != cull) continue;
-        returnRef.set(existing);
-        ObjectBase::asyncUnlock();
-        return returnRef;
-    }
-    ObjectBase::asyncUnlock();
-
-    ProgramRaster *pr = new ProgramRaster(rsc, pointSprite, cull);
-    returnRef.set(pr);
-
-    ObjectBase::asyncLock();
-    rsc->mStateRaster.mRasterPrograms.push(pr);
-    ObjectBase::asyncUnlock();
-
-    return returnRef;
-}
-
-namespace android {
-namespace renderscript {
-
-RsProgramRaster rsi_ProgramRasterCreate(Context * rsc, bool pointSprite, RsCullMode cull) {
-    ObjectBaseRef<ProgramRaster> pr = ProgramRaster::getProgramRaster(rsc, pointSprite, cull);
-    pr->incUserRef();
-    return pr.get();
-}
-
-}
-}
-
diff --git a/libs/rs/rsProgramRaster.h b/libs/rs/rsProgramRaster.h
deleted file mode 100644
index c552ea3..0000000
--- a/libs/rs/rsProgramRaster.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2009-2011 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.
- */
-
-#ifndef ANDROID_RS_PROGRAM_RASTER_H
-#define ANDROID_RS_PROGRAM_RASTER_H
-
-#include "rsProgramBase.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class ProgramRasterState;
-/*****************************************************************************
- * CAUTION
- *
- * Any layout changes for this class may require a corresponding change to be
- * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
- * a partial copy of the information below.
- *
- *****************************************************************************/
-class ProgramRaster : public ProgramBase {
-public:
-    struct Hal {
-        mutable void *drv;
-
-        struct State {
-            bool pointSprite;
-            RsCullMode cull;
-        };
-        State state;
-    };
-    Hal mHal;
-
-    virtual void setup(const Context *, ProgramRasterState *);
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_RASTER; }
-    static ProgramRaster *createFromStream(Context *rsc, IStream *stream);
-
-    static ObjectBaseRef<ProgramRaster> getProgramRaster(Context *rsc,
-                                                         bool pointSprite,
-                                                         RsCullMode cull);
-protected:
-    virtual void preDestroy() const;
-    virtual ~ProgramRaster();
-
-private:
-    ProgramRaster(Context *rsc,
-                  bool pointSprite,
-                  RsCullMode cull);
-
-};
-
-class ProgramRasterState {
-public:
-    ProgramRasterState();
-    ~ProgramRasterState();
-    void init(Context *rsc);
-    void deinit(Context *rsc);
-
-    ObjectBaseRef<ProgramRaster> mDefault;
-    ObjectBaseRef<ProgramRaster> mLast;
-
-    // Cache of all existing raster programs.
-    Vector<ProgramRaster *> mRasterPrograms;
-};
-
-
-}
-}
-#endif
-
-
-
-
diff --git a/libs/rs/rsProgramStore.cpp b/libs/rs/rsProgramStore.cpp
deleted file mode 100644
index 7e25a22..0000000
--- a/libs/rs/rsProgramStore.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsProgramStore.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-
-ProgramStore::ProgramStore(Context *rsc,
-                           bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA,
-                           bool depthMask, bool ditherEnable,
-                           RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc,
-                           RsDepthFunc depthFunc) : ProgramBase(rsc) {
-    memset(&mHal, 0, sizeof(mHal));
-
-    mHal.state.ditherEnable = ditherEnable;
-
-    mHal.state.colorRWriteEnable = colorMaskR;
-    mHal.state.colorGWriteEnable = colorMaskG;
-    mHal.state.colorBWriteEnable = colorMaskB;
-    mHal.state.colorAWriteEnable = colorMaskA;
-    mHal.state.blendSrc = srcFunc;
-    mHal.state.blendDst = destFunc;
-
-    mHal.state.depthWriteEnable = depthMask;
-    mHal.state.depthFunc = depthFunc;
-}
-
-void ProgramStore::preDestroy() const {
-    for (uint32_t ct = 0; ct < mRSC->mStateFragmentStore.mStorePrograms.size(); ct++) {
-        if (mRSC->mStateFragmentStore.mStorePrograms[ct] == this) {
-            mRSC->mStateFragmentStore.mStorePrograms.removeAt(ct);
-            break;
-        }
-    }
-}
-
-ProgramStore::~ProgramStore() {
-    mRSC->mHal.funcs.store.destroy(mRSC, this);
-}
-
-void ProgramStore::setup(const Context *rsc, ProgramStoreState *state) {
-    if (state->mLast.get() == this) {
-        return;
-    }
-    state->mLast.set(this);
-
-    rsc->mHal.funcs.store.setActive(rsc, this);
-}
-
-void ProgramStore::serialize(OStream *stream) const {
-}
-
-ProgramStore *ProgramStore::createFromStream(Context *rsc, IStream *stream) {
-    return NULL;
-}
-
-void ProgramStore::init() {
-    mRSC->mHal.funcs.store.init(mRSC, this);
-}
-
-ProgramStoreState::ProgramStoreState() {
-}
-
-ProgramStoreState::~ProgramStoreState() {
-}
-
-ObjectBaseRef<ProgramStore> ProgramStore::getProgramStore(Context *rsc,
-                                                          bool colorMaskR,
-                                                          bool colorMaskG,
-                                                          bool colorMaskB,
-                                                          bool colorMaskA,
-                                                          bool depthMask, bool ditherEnable,
-                                                          RsBlendSrcFunc srcFunc,
-                                                          RsBlendDstFunc destFunc,
-                                                          RsDepthFunc depthFunc) {
-    ObjectBaseRef<ProgramStore> returnRef;
-    ObjectBase::asyncLock();
-    for (uint32_t ct = 0; ct < rsc->mStateFragmentStore.mStorePrograms.size(); ct++) {
-        ProgramStore *existing = rsc->mStateFragmentStore.mStorePrograms[ct];
-        if (existing->mHal.state.ditherEnable != ditherEnable) continue;
-        if (existing->mHal.state.colorRWriteEnable != colorMaskR) continue;
-        if (existing->mHal.state.colorGWriteEnable != colorMaskG) continue;
-        if (existing->mHal.state.colorBWriteEnable != colorMaskB) continue;
-        if (existing->mHal.state.colorAWriteEnable != colorMaskA) continue;
-        if (existing->mHal.state.blendSrc != srcFunc) continue;
-        if (existing->mHal.state.blendDst != destFunc) continue;
-        if (existing->mHal.state.depthWriteEnable != depthMask) continue;
-        if (existing->mHal.state.depthFunc != depthFunc) continue;
-
-        returnRef.set(existing);
-        ObjectBase::asyncUnlock();
-        return returnRef;
-    }
-    ObjectBase::asyncUnlock();
-
-    ProgramStore *pfs = new ProgramStore(rsc,
-                                         colorMaskR, colorMaskG, colorMaskB, colorMaskA,
-                                         depthMask, ditherEnable,
-                                         srcFunc, destFunc, depthFunc);
-    returnRef.set(pfs);
-
-    pfs->init();
-
-    ObjectBase::asyncLock();
-    rsc->mStateFragmentStore.mStorePrograms.push(pfs);
-    ObjectBase::asyncUnlock();
-
-    return returnRef;
-}
-
-
-
-void ProgramStoreState::init(Context *rsc) {
-    mDefault.set(ProgramStore::getProgramStore(rsc,
-                                               true, true, true, true,
-                                               true, true,
-                                               RS_BLEND_SRC_ONE, RS_BLEND_DST_ZERO,
-                                               RS_DEPTH_FUNC_LESS).get());
-}
-
-void ProgramStoreState::deinit(Context *rsc) {
-    mDefault.clear();
-    mLast.clear();
-}
-
-
-namespace android {
-namespace renderscript {
-
-RsProgramStore rsi_ProgramStoreCreate(Context *rsc,
-                                      bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA,
-                                      bool depthMask, bool ditherEnable,
-                                      RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc,
-                                      RsDepthFunc depthFunc) {
-
-
-    ObjectBaseRef<ProgramStore> ps = ProgramStore::getProgramStore(rsc,
-                                                                   colorMaskR, colorMaskG,
-                                                                   colorMaskB, colorMaskA,
-                                                                   depthMask, ditherEnable,
-                                                                   srcFunc, destFunc, depthFunc);
-    ps->incUserRef();
-    return ps.get();
-}
-
-}
-}
diff --git a/libs/rs/rsProgramStore.h b/libs/rs/rsProgramStore.h
deleted file mode 100644
index 9bb2795..0000000
--- a/libs/rs/rsProgramStore.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_RS_PROGRAM_FRAGMENT_STORE_H
-#define ANDROID_RS_PROGRAM_FRAGMENT_STORE_H
-
-#include "rsProgramBase.h"
-#include "rsStream.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class ProgramStoreState;
-/*****************************************************************************
- * CAUTION
- *
- * Any layout changes for this class may require a corresponding change to be
- * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
- * a partial copy of the information below.
- *
- *****************************************************************************/
-class ProgramStore : public ProgramBase {
-public:
-    struct Hal {
-        mutable void *drv;
-
-        struct State {
-            bool ditherEnable;
-
-            //bool blendEnable;
-            bool colorRWriteEnable;
-            bool colorGWriteEnable;
-            bool colorBWriteEnable;
-            bool colorAWriteEnable;
-            RsBlendSrcFunc blendSrc;
-            RsBlendDstFunc blendDst;
-
-            //bool depthTestEnable;
-            bool depthWriteEnable;
-            RsDepthFunc depthFunc;
-        };
-        State state;
-    };
-    Hal mHal;
-
-    virtual void setup(const Context *, ProgramStoreState *);
-
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_STORE; }
-    static ProgramStore *createFromStream(Context *rsc, IStream *stream);
-    static ObjectBaseRef<ProgramStore> getProgramStore(Context *,
-                                                       bool colorMaskR, bool colorMaskG,
-                                                       bool colorMaskB, bool colorMaskA,
-                                                       bool depthMask, bool ditherEnable,
-                                                       RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc,
-                                                       RsDepthFunc depthFunc);
-    void init();
-protected:
-    virtual void preDestroy() const;
-    virtual ~ProgramStore();
-
-private:
-    ProgramStore(Context *,
-                 bool colorMaskR, bool colorMaskG, bool colorMaskB, bool colorMaskA,
-                 bool depthMask, bool ditherEnable,
-                 RsBlendSrcFunc srcFunc, RsBlendDstFunc destFunc,
-                 RsDepthFunc depthFunc);
-};
-
-class ProgramStoreState {
-public:
-    ProgramStoreState();
-    ~ProgramStoreState();
-    void init(Context *rsc);
-    void deinit(Context *rsc);
-
-    ObjectBaseRef<ProgramStore> mDefault;
-    ObjectBaseRef<ProgramStore> mLast;
-
-    // Cache of all existing store programs.
-    Vector<ProgramStore *> mStorePrograms;
-};
-
-}
-}
-#endif
-
-
-
diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp
deleted file mode 100644
index 23fcbe7..0000000
--- a/libs/rs/rsProgramVertex.cpp
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsProgramVertex.h"
-#include "rsMatrix4x4.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-
-ProgramVertex::ProgramVertex(Context *rsc, const char * shaderText, size_t shaderLength,
-                             const char** textureNames, size_t textureNamesCount, const size_t *textureNamesLength,
-
-                             const uint32_t * params, size_t paramLength)
-    : Program(rsc, shaderText, shaderLength, params, paramLength) {
-    mRSC->mHal.funcs.vertex.init(mRSC, this, mUserShader.string(), mUserShader.length(),
-                                 textureNames, textureNamesCount, textureNamesLength);
-}
-
-ProgramVertex::~ProgramVertex() {
-    mRSC->mHal.funcs.vertex.destroy(mRSC, this);
-}
-
-void ProgramVertex::setup(Context *rsc, ProgramVertexState *state) {
-    if ((state->mLast.get() == this) && !mDirty) {
-        return;
-    }
-
-    if (!isUserProgram()) {
-        if (mHal.state.constants[0] == NULL) {
-            rsc->setError(RS_ERROR_FATAL_UNKNOWN,
-                          "Unable to set fixed function emulation matrices because allocation is missing");
-            return;
-        }
-        float *f = static_cast<float *>(mHal.state.constants[0]->getPtr());
-        Matrix4x4 mvp;
-        mvp.load(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
-        Matrix4x4 t;
-        t.load(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET]);
-        mvp.multiply(&t);
-        for (uint32_t i = 0; i < 16; i ++) {
-            f[RS_PROGRAM_VERTEX_MVP_OFFSET + i] = mvp.m[i];
-        }
-    }
-
-    state->mLast.set(this);
-
-    rsc->mHal.funcs.vertex.setActive(rsc, this);
-}
-
-void ProgramVertex::setProjectionMatrix(Context *rsc, const rsc_Matrix *m) const {
-    if (isUserProgram()) {
-        rsc->setError(RS_ERROR_FATAL_UNKNOWN,
-                      "Attempting to set fixed function emulation matrix projection on user program");
-        return;
-    }
-    if (mHal.state.constants[0] == NULL) {
-        rsc->setError(RS_ERROR_FATAL_UNKNOWN,
-                      "Unable to set fixed function emulation matrix projection because allocation is missing");
-        return;
-    }
-    float *f = static_cast<float *>(mHal.state.constants[0]->getPtr());
-    memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m, sizeof(rsc_Matrix));
-    mDirty = true;
-}
-
-void ProgramVertex::setModelviewMatrix(Context *rsc, const rsc_Matrix *m) const {
-    if (isUserProgram()) {
-        rsc->setError(RS_ERROR_FATAL_UNKNOWN,
-                      "Attempting to set fixed function emulation matrix modelview on user program");
-        return;
-    }
-    if (mHal.state.constants[0] == NULL) {
-        rsc->setError(RS_ERROR_FATAL_UNKNOWN,
-                      "Unable to set fixed function emulation matrix modelview because allocation is missing");
-        return;
-    }
-    float *f = static_cast<float *>(mHal.state.constants[0]->getPtr());
-    memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m, sizeof(rsc_Matrix));
-    mDirty = true;
-}
-
-void ProgramVertex::setTextureMatrix(Context *rsc, const rsc_Matrix *m) const {
-    if (isUserProgram()) {
-        rsc->setError(RS_ERROR_FATAL_UNKNOWN,
-                      "Attempting to set fixed function emulation matrix texture on user program");
-        return;
-    }
-    if (mHal.state.constants[0] == NULL) {
-        rsc->setError(RS_ERROR_FATAL_UNKNOWN,
-                      "Unable to set fixed function emulation matrix texture because allocation is missing");
-        return;
-    }
-    float *f = static_cast<float *>(mHal.state.constants[0]->getPtr());
-    memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m, sizeof(rsc_Matrix));
-    mDirty = true;
-}
-
-void ProgramVertex::getProjectionMatrix(Context *rsc, rsc_Matrix *m) const {
-    if (isUserProgram()) {
-        rsc->setError(RS_ERROR_FATAL_UNKNOWN,
-                      "Attempting to get fixed function emulation matrix projection on user program");
-        return;
-    }
-    if (mHal.state.constants[0] == NULL) {
-        rsc->setError(RS_ERROR_FATAL_UNKNOWN,
-                      "Unable to get fixed function emulation matrix projection because allocation is missing");
-        return;
-    }
-    float *f = static_cast<float *>(mHal.state.constants[0]->getPtr());
-    memcpy(m, &f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], sizeof(rsc_Matrix));
-}
-
-void ProgramVertex::transformToScreen(Context *rsc, float *v4out, const float *v3in) const {
-    if (isUserProgram()) {
-        return;
-    }
-    float *f = static_cast<float *>(mHal.state.constants[0]->getPtr());
-    Matrix4x4 mvp;
-    mvp.loadMultiply((Matrix4x4 *)&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET],
-                     (Matrix4x4 *)&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET]);
-    mvp.vectorMultiply(v4out, v3in);
-}
-
-void ProgramVertex::serialize(OStream *stream) const {
-}
-
-ProgramVertex *ProgramVertex::createFromStream(Context *rsc, IStream *stream) {
-    return NULL;
-}
-
-
-///////////////////////////////////////////////////////////////////////
-
-ProgramVertexState::ProgramVertexState() {
-}
-
-ProgramVertexState::~ProgramVertexState() {
-}
-
-void ProgramVertexState::init(Context *rsc) {
-    ObjectBaseRef<const Element> matrixElem = Element::createRef(rsc, RS_TYPE_MATRIX_4X4,
-                                                                 RS_KIND_USER, false, 1);
-    ObjectBaseRef<const Element> f2Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32,
-                                                             RS_KIND_USER, false, 2);
-    ObjectBaseRef<const Element> f3Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32,
-                                                             RS_KIND_USER, false, 3);
-    ObjectBaseRef<const Element> f4Elem = Element::createRef(rsc, RS_TYPE_FLOAT_32,
-                                                             RS_KIND_USER, false, 4);
-
-    Element::Builder constBuilder;
-    constBuilder.add(matrixElem.get(), "MV", 1);
-    constBuilder.add(matrixElem.get(), "P", 1);
-    constBuilder.add(matrixElem.get(), "TexMatrix", 1);
-    constBuilder.add(matrixElem.get(), "MVP", 1);
-    ObjectBaseRef<const Element> constInput = constBuilder.create(rsc);
-
-    Element::Builder inputBuilder;
-    inputBuilder.add(f4Elem.get(), "position", 1);
-    inputBuilder.add(f4Elem.get(), "color", 1);
-    inputBuilder.add(f3Elem.get(), "normal", 1);
-    inputBuilder.add(f2Elem.get(), "texture0", 1);
-    ObjectBaseRef<const Element> attrElem = inputBuilder.create(rsc);
-
-    ObjectBaseRef<Type> inputType = Type::getTypeRef(rsc, constInput.get(), 1, 0, 0, false, false);
-
-    String8 shaderString(RS_SHADER_INTERNAL);
-    shaderString.append("varying vec4 varColor;\n");
-    shaderString.append("varying vec2 varTex0;\n");
-    shaderString.append("void main() {\n");
-    shaderString.append("  gl_Position = UNI_MVP * ATTRIB_position;\n");
-    shaderString.append("  gl_PointSize = 1.0;\n");
-    shaderString.append("  varColor = ATTRIB_color;\n");
-    shaderString.append("  varTex0 = ATTRIB_texture0;\n");
-    shaderString.append("}\n");
-
-    uint32_t tmp[4];
-    tmp[0] = RS_PROGRAM_PARAM_CONSTANT;
-    tmp[1] = (uint32_t)inputType.get();
-    tmp[2] = RS_PROGRAM_PARAM_INPUT;
-    tmp[3] = (uint32_t)attrElem.get();
-
-    ProgramVertex *pv = new ProgramVertex(rsc, shaderString.string(), shaderString.length(),
-                                          NULL, 0, NULL, tmp, 4);
-    Allocation *alloc = Allocation::createAllocation(rsc, inputType.get(),
-                              RS_ALLOCATION_USAGE_SCRIPT | RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS);
-    pv->bindAllocation(rsc, alloc, 0);
-
-    mDefaultAlloc.set(alloc);
-    mDefault.set(pv);
-
-    updateSize(rsc);
-}
-
-void ProgramVertexState::updateSize(Context *rsc) {
-    float *f = static_cast<float *>(mDefaultAlloc->getPtr());
-
-    float surfaceWidth = (float)rsc->getCurrentSurfaceWidth();
-    float surfaceHeight = (float)rsc->getCurrentSurfaceHeight();
-
-    Matrix4x4 m;
-    m.loadOrtho(0, surfaceWidth, surfaceHeight, 0, -1, 1);
-    memcpy(&f[RS_PROGRAM_VERTEX_PROJECTION_OFFSET], m.m, sizeof(m));
-    memcpy(&f[RS_PROGRAM_VERTEX_MVP_OFFSET], m.m, sizeof(m));
-
-    m.loadIdentity();
-    memcpy(&f[RS_PROGRAM_VERTEX_MODELVIEW_OFFSET], m.m, sizeof(m));
-    memcpy(&f[RS_PROGRAM_VERTEX_TEXTURE_OFFSET], m.m, sizeof(m));
-}
-
-void ProgramVertexState::deinit(Context *rsc) {
-    mDefaultAlloc.clear();
-    mDefault.clear();
-    mLast.clear();
-}
-
-
-namespace android {
-namespace renderscript {
-
-RsProgramVertex rsi_ProgramVertexCreate(Context *rsc, const char * shaderText, size_t shaderLength,
-                                        const char** textureNames, size_t textureNamesCount,
-                                        const size_t *textureNamesLength,
-                                        const uint32_t * params, size_t paramLength) {
-    ProgramVertex *pv = new ProgramVertex(rsc, shaderText, shaderLength,
-                                          textureNames, textureNamesCount, textureNamesLength,
-                                          params, paramLength);
-    pv->incUserRef();
-    return pv;
-}
-
-}
-}
diff --git a/libs/rs/rsProgramVertex.h b/libs/rs/rsProgramVertex.h
deleted file mode 100644
index 67c2a88..0000000
--- a/libs/rs/rsProgramVertex.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_PROGRAM_VERTEX_H
-#define ANDROID_RS_PROGRAM_VERTEX_H
-
-#include "rsProgram.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class ProgramVertexState;
-
-class ProgramVertex : public Program {
-public:
-    ProgramVertex(Context *,const char * shaderText, size_t shaderLength,
-                  const char** textureNames, size_t textureNamesCount, const size_t *textureNamesLength,
-                  const uint32_t * params, size_t paramLength);
-    virtual ~ProgramVertex();
-
-    virtual void setup(Context *rsc, ProgramVertexState *state);
-
-    void setProjectionMatrix(Context *, const rsc_Matrix *) const;
-    void getProjectionMatrix(Context *, rsc_Matrix *) const;
-    void setModelviewMatrix(Context *, const rsc_Matrix *) const;
-    void setTextureMatrix(Context *, const rsc_Matrix *) const;
-
-    void transformToScreen(Context *, float *v4out, const float *v3in) const;
-
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_VERTEX; }
-    static ProgramVertex *createFromStream(Context *rsc, IStream *stream);
-};
-
-class ProgramVertexState {
-public:
-    ProgramVertexState();
-    ~ProgramVertexState();
-
-    void init(Context *rsc);
-    void deinit(Context *rsc);
-    void updateSize(Context *rsc);
-
-    ObjectBaseRef<ProgramVertex> mDefault;
-    ObjectBaseRef<ProgramVertex> mLast;
-    ObjectBaseRef<Allocation> mDefaultAlloc;
-};
-
-}
-}
-#endif
-
-
diff --git a/libs/rs/rsRuntime.h b/libs/rs/rsRuntime.h
deleted file mode 100644
index 64f2de8..0000000
--- a/libs/rs/rsRuntime.h
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsScriptC.h"
-
-#include "utils/Timers.h"
-
-#include <time.h>
-
-namespace android {
-namespace renderscript {
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Context
-//////////////////////////////////////////////////////////////////////////////
-
-void rsrBindTexture(Context *, Script *, ProgramFragment *, uint32_t slot, Allocation *);
-void rsrBindConstant(Context *, Script *, ProgramFragment *, uint32_t slot, Allocation *);
-void rsrBindConstant(Context *, Script *, ProgramVertex*, uint32_t slot, Allocation *);
-void rsrBindSampler(Context *, Script *, ProgramFragment *, uint32_t slot, Sampler *);
-void rsrBindProgramStore(Context *, Script *, ProgramStore *);
-void rsrBindProgramFragment(Context *, Script *, ProgramFragment *);
-void rsrBindProgramVertex(Context *, Script *, ProgramVertex *);
-void rsrBindProgramRaster(Context *, Script *, ProgramRaster *);
-void rsrBindFrameBufferObjectColorTarget(Context *, Script *, Allocation *, uint32_t slot);
-void rsrBindFrameBufferObjectDepthTarget(Context *, Script *, Allocation *);
-void rsrClearFrameBufferObjectColorTarget(Context *, Script *, uint32_t slot);
-void rsrClearFrameBufferObjectDepthTarget(Context *, Script *);
-void rsrClearFrameBufferObjectTargets(Context *, Script *);
-
-//////////////////////////////////////////////////////////////////////////////
-// VP
-//////////////////////////////////////////////////////////////////////////////
-
-void rsrVpLoadProjectionMatrix(Context *, Script *, const rsc_Matrix *m);
-void rsrVpLoadModelMatrix(Context *, Script *, const rsc_Matrix *m);
-void rsrVpLoadTextureMatrix(Context *, Script *, const rsc_Matrix *m);
-void rsrPfConstantColor(Context *, Script *, ProgramFragment *, float r, float g, float b, float a);
-void rsrVpGetProjectionMatrix(Context *, Script *, rsc_Matrix *m);
-
-//////////////////////////////////////////////////////////////////////////////
-// Drawing
-//////////////////////////////////////////////////////////////////////////////
-
-void rsrDrawQuadTexCoords(Context *, Script *,
-                          float x1, float y1, float z1, float u1, float v1,
-                          float x2, float y2, float z2, float u2, float v2,
-                          float x3, float y3, float z3, float u3, float v3,
-                          float x4, float y4, float z4, float u4, float v4);
-void rsrDrawQuad(Context *, Script *,
-                 float x1, float y1, float z1,
-                 float x2, float y2, float z2,
-                 float x3, float y3, float z3,
-                 float x4, float y4, float z4);
-void rsrDrawSpriteScreenspace(Context *, Script *,
-                              float x, float y, float z, float w, float h);
-void rsrDrawRect(Context *, Script *, float x1, float y1, float x2, float y2, float z);
-void rsrDrawPath(Context *, Script *, Path *);
-void rsrDrawMesh(Context *, Script *, Mesh *);
-void rsrDrawMeshPrimitive(Context *, Script *, Mesh *, uint32_t primIndex);
-void rsrDrawMeshPrimitiveRange(Context *, Script *, Mesh *,
-                               uint32_t primIndex, uint32_t start, uint32_t len);
-void rsrMeshComputeBoundingBox(Context *, Script *, Mesh *,
-                               float *minX, float *minY, float *minZ,
-                               float *maxX, float *maxY, float *maxZ);
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//////////////////////////////////////////////////////////////////////////////
-
-
-void rsrColor(Context *, Script *, float r, float g, float b, float a);
-void rsrAllocationSyncAll(Context *, Script *, Allocation *);
-
-void rsrAllocationCopy1DRange(Context *, Allocation *dstAlloc,
-                              uint32_t dstOff,
-                              uint32_t dstMip,
-                              uint32_t count,
-                              Allocation *srcAlloc,
-                              uint32_t srcOff, uint32_t srcMip);
-void rsrAllocationCopy2DRange(Context *, Allocation *dstAlloc,
-                              uint32_t dstXoff, uint32_t dstYoff,
-                              uint32_t dstMip, uint32_t dstFace,
-                              uint32_t width, uint32_t height,
-                              Allocation *srcAlloc,
-                              uint32_t srcXoff, uint32_t srcYoff,
-                              uint32_t srcMip, uint32_t srcFace);
-
-void rsrPrepareClear(Context *, Script *);
-uint32_t rsrGetWidth(Context *, Script *);
-uint32_t rsrGetHeight(Context *, Script *);
-void rsrDrawTextAlloc(Context *, Script *, Allocation *, int x, int y);
-void rsrDrawText(Context *, Script *, const char *text, int x, int y);
-void rsrSetMetrics(Context *, Script *, Font::Rect *metrics,
-                   int32_t *left, int32_t *right, int32_t *top, int32_t *bottom);
-void rsrMeasureTextAlloc(Context *, Script *, Allocation *,
-                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom);
-void rsrMeasureText(Context *, Script *, const char *text,
-                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom);
-void rsrBindFont(Context *, Script *, Font *);
-void rsrFontColor(Context *, Script *, float r, float g, float b, float a);
-
-//////////////////////////////////////////////////////////////////////////////
-// Time routines
-//////////////////////////////////////////////////////////////////////////////
-
-float rsrGetDt(Context *, Script *);
-time_t rsrTime(Context *, Script *, time_t *timer);
-tm* rsrLocalTime(Context *, Script *, tm *local, time_t *timer);
-int64_t rsrUptimeMillis(Context *, Script *);
-int64_t rsrUptimeNanos(Context *, Script *);
-
-//////////////////////////////////////////////////////////////////////////////
-// Message routines
-//////////////////////////////////////////////////////////////////////////////
-
-uint32_t rsrToClient(Context *, Script *, int cmdID, void *data, int len);
-uint32_t rsrToClientBlocking(Context *, Script *, int cmdID, void *data, int len);
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//////////////////////////////////////////////////////////////////////////////
-
-void rsrSetObject(const Context *, const Script *, ObjectBase **dst, ObjectBase * src);
-void rsrClearObject(const Context *, const Script *, ObjectBase **dst);
-bool rsrIsObject(const Context *, const Script *, const ObjectBase *src);
-
-void rsrAllocationIncRefs(const Context *, const Allocation *, void *ptr,
-                          size_t elementCount, size_t startOffset);
-void rsrAllocationDecRefs(const Context *, const Allocation *, void *ptr,
-                          size_t elementCount, size_t startOffset);
-
-
-uint32_t rsrToClient(Context *, Script *, int cmdID, void *data, int len);
-uint32_t rsrToClientBlocking(Context *, Script *, int cmdID, void *data, int len);
-const Allocation * rsrGetAllocation(Context *, Script *, const void *ptr);
-
-void rsrAllocationMarkDirty(Context *, Script *, RsAllocation a);
-void rsrAllocationSyncAll(Context *, Script *, Allocation *a, RsAllocationUsageType source);
-
-
-void rsrForEach(Context *, Script *, Script *target,
-                Allocation *in,
-                Allocation *out,
-                const void *usr,
-                 uint32_t usrBytes,
-                const RsScriptCall *call);
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Heavy math functions
-//////////////////////////////////////////////////////////////////////////////
-
-
-void rsrMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v);
-float rsrMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col);
-void rsrMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v);
-float rsrMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col);
-void rsrMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v);
-float rsrMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col);
-void rsrMatrixLoadIdentity_4x4(rs_matrix4x4 *m);
-void rsrMatrixLoadIdentity_3x3(rs_matrix3x3 *m);
-void rsrMatrixLoadIdentity_2x2(rs_matrix2x2 *m);
-void rsrMatrixLoad_4x4_f(rs_matrix4x4 *m, const float *v);
-void rsrMatrixLoad_3x3_f(rs_matrix3x3 *m, const float *v);
-void rsrMatrixLoad_2x2_f(rs_matrix2x2 *m, const float *v);
-void rsrMatrixLoad_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *v);
-void rsrMatrixLoad_4x4_3x3(rs_matrix4x4 *m, const rs_matrix3x3 *v);
-void rsrMatrixLoad_4x4_2x2(rs_matrix4x4 *m, const rs_matrix2x2 *v);
-void rsrMatrixLoad_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *v);
-void rsrMatrixLoad_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *v);
-void rsrMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
-void rsrMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z);
-void rsrMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z);
-void rsrMatrixLoadMultiply_4x4_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *lhs,
-                                       const rs_matrix4x4 *rhs);
-void rsrMatrixMultiply_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *rhs);
-void rsrMatrixLoadMultiply_3x3_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *lhs,
-                                       const rs_matrix3x3 *rhs);
-void rsrMatrixMultiply_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *rhs);
-void rsrMatrixLoadMultiply_2x2_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *lhs,
-                                       const rs_matrix2x2 *rhs);
-void rsrMatrixMultiply_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *rhs);
-void rsrMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
-void rsrMatrixScale(rs_matrix4x4 *m, float x, float y, float z);
-void rsrMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z);
-void rsrMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right,
-                        float bottom, float top, float near, float far);
-void rsrMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right,
-                          float bottom, float top, float near, float far);
-void rsrMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
-
-// Returns true if the matrix was successfully inversed
-bool rsrMatrixInverse_4x4(rs_matrix4x4 *m);
-// Returns true if the matrix was successfully inversed
-bool rsrMatrixInverseTranspose_4x4(rs_matrix4x4 *m);
-
-void rsrMatrixTranspose_4x4(rs_matrix4x4 *m);
-void rsrMatrixTranspose_3x3(rs_matrix3x3 *m);
-void rsrMatrixTranspose_2x2(rs_matrix2x2 *m);
-
-}
-}
diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp
deleted file mode 100644
index c7180bd..0000000
--- a/libs/rs/rsSampler.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsSampler.h"
-#include "rs.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-
-Sampler::Sampler(Context *rsc) : ObjectBase(rsc) {
-    // Should not get called.
-    rsAssert(0);
-}
-
-Sampler::Sampler(Context *rsc,
-                 RsSamplerValue magFilter,
-                 RsSamplerValue minFilter,
-                 RsSamplerValue wrapS,
-                 RsSamplerValue wrapT,
-                 RsSamplerValue wrapR,
-                 float aniso) : ObjectBase(rsc) {
-    mHal.state.magFilter = magFilter;
-    mHal.state.minFilter = minFilter;
-    mHal.state.wrapS = wrapS;
-    mHal.state.wrapT = wrapT;
-    mHal.state.wrapR = wrapR;
-    mHal.state.aniso = aniso;
-
-    mRSC->mHal.funcs.sampler.init(mRSC, this);
-}
-
-Sampler::~Sampler() {
-    mRSC->mHal.funcs.sampler.destroy(mRSC, this);
-}
-
-void Sampler::preDestroy() const {
-    for (uint32_t ct = 0; ct < mRSC->mStateSampler.mAllSamplers.size(); ct++) {
-        if (mRSC->mStateSampler.mAllSamplers[ct] == this) {
-            mRSC->mStateSampler.mAllSamplers.removeAt(ct);
-            break;
-        }
-    }
-}
-
-void Sampler::bindToContext(SamplerState *ss, uint32_t slot) {
-    ss->mSamplers[slot].set(this);
-    mBoundSlot = slot;
-}
-
-void Sampler::unbindFromContext(SamplerState *ss) {
-    int32_t slot = mBoundSlot;
-    mBoundSlot = -1;
-    ss->mSamplers[slot].clear();
-}
-
-void Sampler::serialize(OStream *stream) const {
-}
-
-Sampler *Sampler::createFromStream(Context *rsc, IStream *stream) {
-    return NULL;
-}
-
-ObjectBaseRef<Sampler> Sampler::getSampler(Context *rsc,
-                                           RsSamplerValue magFilter,
-                                           RsSamplerValue minFilter,
-                                           RsSamplerValue wrapS,
-                                           RsSamplerValue wrapT,
-                                           RsSamplerValue wrapR,
-                                           float aniso) {
-    ObjectBaseRef<Sampler> returnRef;
-    ObjectBase::asyncLock();
-    for (uint32_t ct = 0; ct < rsc->mStateSampler.mAllSamplers.size(); ct++) {
-        Sampler *existing = rsc->mStateSampler.mAllSamplers[ct];
-        if (existing->mHal.state.magFilter != magFilter) continue;
-        if (existing->mHal.state.minFilter != minFilter ) continue;
-        if (existing->mHal.state.wrapS != wrapS) continue;
-        if (existing->mHal.state.wrapT != wrapT) continue;
-        if (existing->mHal.state.wrapR != wrapR) continue;
-        if (existing->mHal.state.aniso != aniso) continue;
-        returnRef.set(existing);
-        ObjectBase::asyncUnlock();
-        return returnRef;
-    }
-    ObjectBase::asyncUnlock();
-
-    Sampler *s = new Sampler(rsc, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
-    returnRef.set(s);
-
-    ObjectBase::asyncLock();
-    rsc->mStateSampler.mAllSamplers.push(s);
-    ObjectBase::asyncUnlock();
-
-    return returnRef;
-}
-
-////////////////////////////////
-
-namespace android {
-namespace renderscript {
-
-RsSampler rsi_SamplerCreate(Context * rsc,
-                            RsSamplerValue magFilter,
-                            RsSamplerValue minFilter,
-                            RsSamplerValue wrapS,
-                            RsSamplerValue wrapT,
-                            RsSamplerValue wrapR,
-                            float aniso) {
-    ObjectBaseRef<Sampler> s = Sampler::getSampler(rsc, magFilter, minFilter,
-                                                   wrapS, wrapT, wrapR, aniso);
-    s->incUserRef();
-    return s.get();
-}
-
-}}
diff --git a/libs/rs/rsSampler.h b/libs/rs/rsSampler.h
deleted file mode 100644
index dea4cb6..0000000
--- a/libs/rs/rsSampler.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_SAMPLER_H
-#define ANDROID_RS_SAMPLER_H
-
-#include "rsAllocation.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-const static uint32_t RS_MAX_SAMPLER_SLOT = 16;
-
-class SamplerState;
-/*****************************************************************************
- * CAUTION
- *
- * Any layout changes for this class may require a corresponding change to be
- * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
- * a partial copy of the information below.
- *
- *****************************************************************************/
-class Sampler : public ObjectBase {
-public:
-    struct Hal {
-        mutable void *drv;
-
-        struct State {
-            RsSamplerValue magFilter;
-            RsSamplerValue minFilter;
-            RsSamplerValue wrapS;
-            RsSamplerValue wrapT;
-            RsSamplerValue wrapR;
-            float aniso;
-        };
-        State state;
-    };
-    Hal mHal;
-
-    static ObjectBaseRef<Sampler> getSampler(Context *,
-                                             RsSamplerValue magFilter,
-                                             RsSamplerValue minFilter,
-                                             RsSamplerValue wrapS,
-                                             RsSamplerValue wrapT,
-                                             RsSamplerValue wrapR,
-                                             float aniso = 1.0f);
-    void bindToContext(SamplerState *, uint32_t slot);
-    void unbindFromContext(SamplerState *);
-
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_SAMPLER; }
-    static Sampler *createFromStream(Context *rsc, IStream *stream);
-
-protected:
-    int32_t mBoundSlot;
-
-    virtual void preDestroy() const;
-    virtual ~Sampler();
-
-private:
-    Sampler(Context *);
-    Sampler(Context *,
-            RsSamplerValue magFilter,
-            RsSamplerValue minFilter,
-            RsSamplerValue wrapS,
-            RsSamplerValue wrapT,
-            RsSamplerValue wrapR,
-            float aniso = 1.0f);
-};
-
-
-class SamplerState {
-public:
-    ObjectBaseRef<Sampler> mSamplers[RS_MAX_SAMPLER_SLOT];
-    void init(Context *rsc) {
-    }
-    void deinit(Context *rsc) {
-        for (uint32_t i = 0; i < RS_MAX_SAMPLER_SLOT; i ++) {
-            mSamplers[i].clear();
-        }
-    }
-    // Cache of all existing raster programs.
-    Vector<Sampler *> mAllSamplers;
-};
-
-}
-}
-#endif //ANDROID_RS_SAMPLER_H
-
-
-
diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp
deleted file mode 100644
index 6a3bd4b..0000000
--- a/libs/rs/rsScript.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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 <time.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-Script::Script(Context *rsc) : ObjectBase(rsc) {
-    memset(&mEnviroment, 0, sizeof(mEnviroment));
-    memset(&mHal, 0, sizeof(mHal));
-
-    mSlots = NULL;
-    mTypes = NULL;
-    mInitialized = false;
-}
-
-Script::~Script() {
-    if (mSlots) {
-        delete [] mSlots;
-        mSlots = NULL;
-    }
-    if (mTypes) {
-        delete [] mTypes;
-        mTypes = NULL;
-    }
-}
-
-void Script::setSlot(uint32_t slot, Allocation *a) {
-    //ALOGE("setSlot %i %p", slot, a);
-    if (slot >= mHal.info.exportedVariableCount) {
-        ALOGE("Script::setSlot unable to set allocation, invalid slot index");
-        return;
-    }
-
-    mSlots[slot].set(a);
-    if (a != NULL) {
-        mRSC->mHal.funcs.script.setGlobalBind(mRSC, this, slot, a->getPtr());
-    } else {
-        mRSC->mHal.funcs.script.setGlobalBind(mRSC, this, slot, NULL);
-    }
-}
-
-void Script::setVar(uint32_t slot, const void *val, size_t len) {
-    //ALOGE("setVar %i %p %i", slot, val, len);
-    if (slot >= mHal.info.exportedVariableCount) {
-        ALOGE("Script::setVar unable to set allocation, invalid slot index");
-        return;
-    }
-    mRSC->mHal.funcs.script.setGlobalVar(mRSC, this, slot, (void *)val, len);
-}
-
-void Script::setVarObj(uint32_t slot, ObjectBase *val) {
-    //ALOGE("setVarObj %i %p", slot, val);
-    if (slot >= mHal.info.exportedVariableCount) {
-        ALOGE("Script::setVarObj unable to set allocation, invalid slot index");
-        return;
-    }
-    //ALOGE("setvarobj  %i %p", slot, val);
-    mRSC->mHal.funcs.script.setGlobalObj(mRSC, this, slot, val);
-}
-
-bool Script::freeChildren() {
-    incSysRef();
-    mRSC->mHal.funcs.script.invokeFreeChildren(mRSC, this);
-    return decSysRef();
-}
-
-namespace android {
-namespace renderscript {
-
-void rsi_ScriptBindAllocation(Context * rsc, RsScript vs, RsAllocation va, uint32_t slot) {
-    Script *s = static_cast<Script *>(vs);
-    Allocation *a = static_cast<Allocation *>(va);
-    s->setSlot(slot, a);
-    //ALOGE("rsi_ScriptBindAllocation %i  %p  %p", slot, a, a->getPtr());
-}
-
-void rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, size_t length) {
-    // We unfortunately need to make a new copy of the string, since it is
-    // not NULL-terminated. We then use setenv(), which properly handles
-    // freeing/duplicating the actual string for the environment.
-    char *tz = (char *) malloc(length + 1);
-    if (!tz) {
-        ALOGE("Couldn't allocate memory for timezone buffer");
-        return;
-    }
-    strncpy(tz, timeZone, length);
-    tz[length] = '\0';
-    if (setenv("TZ", tz, 1) == 0) {
-        tzset();
-    } else {
-        ALOGE("Error setting timezone");
-    }
-    free(tz);
-}
-
-void rsi_ScriptForEach(Context *rsc, RsScript vs, uint32_t slot,
-                       RsAllocation vain, RsAllocation vaout,
-                       const void *params, size_t paramLen) {
-    Script *s = static_cast<Script *>(vs);
-    s->runForEach(rsc, slot,
-                  static_cast<const Allocation *>(vain), static_cast<Allocation *>(vaout),
-                  params, paramLen);
-
-}
-
-void rsi_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot) {
-    Script *s = static_cast<Script *>(vs);
-    s->Invoke(rsc, slot, NULL, 0);
-}
-
-
-void rsi_ScriptInvokeData(Context *rsc, RsScript vs, uint32_t slot, void *data) {
-    Script *s = static_cast<Script *>(vs);
-    s->Invoke(rsc, slot, NULL, 0);
-}
-
-void rsi_ScriptInvokeV(Context *rsc, RsScript vs, uint32_t slot, const void *data, size_t len) {
-    Script *s = static_cast<Script *>(vs);
-    s->Invoke(rsc, slot, data, len);
-}
-
-void rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value) {
-    Script *s = static_cast<Script *>(vs);
-    s->setVar(slot, &value, sizeof(value));
-}
-
-void rsi_ScriptSetVarObj(Context *rsc, RsScript vs, uint32_t slot, RsObjectBase value) {
-    Script *s = static_cast<Script *>(vs);
-    ObjectBase *o = static_cast<ObjectBase *>(value);
-    s->setVarObj(slot, o);
-}
-
-void rsi_ScriptSetVarJ(Context *rsc, RsScript vs, uint32_t slot, long long value) {
-    Script *s = static_cast<Script *>(vs);
-    s->setVar(slot, &value, sizeof(value));
-}
-
-void rsi_ScriptSetVarF(Context *rsc, RsScript vs, uint32_t slot, float value) {
-    Script *s = static_cast<Script *>(vs);
-    s->setVar(slot, &value, sizeof(value));
-}
-
-void rsi_ScriptSetVarD(Context *rsc, RsScript vs, uint32_t slot, double value) {
-    Script *s = static_cast<Script *>(vs);
-    s->setVar(slot, &value, sizeof(value));
-}
-
-void rsi_ScriptSetVarV(Context *rsc, RsScript vs, uint32_t slot, const void *data, size_t len) {
-    Script *s = static_cast<Script *>(vs);
-    s->setVar(slot, data, len);
-}
-
-}
-}
-
diff --git a/libs/rs/rsScript.h b/libs/rs/rsScript.h
deleted file mode 100644
index 7879ea6..0000000
--- a/libs/rs/rsScript.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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.
- */
-
-#ifndef ANDROID_RS_SCRIPT_H
-#define ANDROID_RS_SCRIPT_H
-
-#include "rsAllocation.h"
-
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class ProgramVertex;
-class ProgramFragment;
-class ProgramRaster;
-class ProgramStore;
-
-class Script : public ObjectBase {
-public:
-    struct Hal {
-        void * drv;
-
-        struct DriverInfo {
-            int mVersionMajor;
-            int mVersionMinor;
-
-            size_t exportedVariableCount;
-            size_t exportedFunctionCount;
-            size_t exportedPragmaCount;
-            char const **exportedPragmaKeyList;
-            char const **exportedPragmaValueList;
-
-            int (* root)();
-            bool isThreadable;
-        };
-        DriverInfo info;
-    };
-    Hal mHal;
-
-    typedef void (* InvokeFunc_t)(void);
-
-    Script(Context *);
-    virtual ~Script();
-
-    struct Enviroment_t {
-        int64_t mStartTimeMillis;
-        int64_t mLastDtTime;
-
-        ObjectBaseRef<ProgramVertex> mVertex;
-        ObjectBaseRef<ProgramFragment> mFragment;
-        ObjectBaseRef<ProgramRaster> mRaster;
-        ObjectBaseRef<ProgramStore> mFragmentStore;
-    };
-    Enviroment_t mEnviroment;
-
-    void setSlot(uint32_t slot, Allocation *a);
-    void setVar(uint32_t slot, const void *val, size_t len);
-    void setVarObj(uint32_t slot, ObjectBase *val);
-
-    virtual bool freeChildren();
-
-    virtual void runForEach(Context *rsc,
-                            uint32_t slot,
-                            const Allocation * ain,
-                            Allocation * aout,
-                            const void * usr,
-                            size_t usrBytes,
-                            const RsScriptCall *sc = NULL) = 0;
-
-    virtual void Invoke(Context *rsc, uint32_t slot, const void *data, size_t len) = 0;
-    virtual void setupScript(Context *rsc) = 0;
-    virtual uint32_t run(Context *) = 0;
-protected:
-    bool mInitialized;
-    ObjectBaseRef<Allocation> *mSlots;
-    ObjectBaseRef<const Type> *mTypes;
-
-};
-
-
-}
-}
-#endif
-
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
deleted file mode 100644
index 79725b97..0000000
--- a/libs/rs/rsScriptC.cpp
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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 "rsScriptC.h"
-#include "utils/Timers.h"
-#include "utils/StopWatch.h"
-
-#ifndef ANDROID_RS_SERIALIZE
-#include <bcinfo/BitcodeTranslator.h>
-#include <bcinfo/BitcodeWrapper.h>
-#endif
-
-using namespace android;
-using namespace android::renderscript;
-
-#define GET_TLS()  Context::ScriptTLSStruct * tls = \
-    (Context::ScriptTLSStruct *)pthread_getspecific(Context::gThreadTLSKey); \
-    Context * rsc = tls->mContext; \
-    ScriptC * sc = (ScriptC *) tls->mScript
-
-ScriptC::ScriptC(Context *rsc) : Script(rsc) {
-#ifndef ANDROID_RS_SERIALIZE
-    BT = NULL;
-#endif
-}
-
-ScriptC::~ScriptC() {
-#ifndef ANDROID_RS_SERIALIZE
-    if (BT) {
-        delete BT;
-        BT = NULL;
-    }
-#endif
-    if (mInitialized) {
-        mRSC->mHal.funcs.script.invokeFreeChildren(mRSC, this);
-        mRSC->mHal.funcs.script.destroy(mRSC, this);
-    }
-}
-
-void ScriptC::setupScript(Context *rsc) {
-    mEnviroment.mStartTimeMillis
-                = nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
-
-    for (uint32_t ct=0; ct < mHal.info.exportedVariableCount; ct++) {
-        if (mSlots[ct].get() && !mTypes[ct].get()) {
-            mTypes[ct].set(mSlots[ct]->getType());
-        }
-
-        if (!mTypes[ct].get())
-            continue;
-        void *ptr = NULL;
-        if (mSlots[ct].get()) {
-            ptr = mSlots[ct]->getPtr();
-        }
-
-        rsc->mHal.funcs.script.setGlobalBind(rsc, this, ct, ptr);
-    }
-}
-
-const Allocation *ScriptC::ptrToAllocation(const void *ptr) const {
-    //ALOGE("ptr to alloc %p", ptr);
-    if (!ptr) {
-        return NULL;
-    }
-    for (uint32_t ct=0; ct < mHal.info.exportedVariableCount; ct++) {
-        if (!mSlots[ct].get())
-            continue;
-        if (mSlots[ct]->getPtr() == ptr) {
-            return mSlots[ct].get();
-        }
-    }
-    ALOGE("ScriptC::ptrToAllocation, failed to find %p", ptr);
-    return NULL;
-}
-
-void ScriptC::setupGLState(Context *rsc) {
-    if (mEnviroment.mFragmentStore.get()) {
-        rsc->setProgramStore(mEnviroment.mFragmentStore.get());
-    }
-    if (mEnviroment.mFragment.get()) {
-        rsc->setProgramFragment(mEnviroment.mFragment.get());
-    }
-    if (mEnviroment.mVertex.get()) {
-        rsc->setProgramVertex(mEnviroment.mVertex.get());
-    }
-    if (mEnviroment.mRaster.get()) {
-        rsc->setProgramRaster(mEnviroment.mRaster.get());
-    }
-}
-
-uint32_t ScriptC::run(Context *rsc) {
-    if (mHal.info.root == NULL) {
-        rsc->setError(RS_ERROR_BAD_SCRIPT, "Attempted to run bad script");
-        return 0;
-    }
-
-    setupGLState(rsc);
-    setupScript(rsc);
-
-    uint32_t ret = 0;
-
-    if (rsc->props.mLogScripts) {
-        ALOGV("%p ScriptC::run invoking root,  ptr %p", rsc, mHal.info.root);
-    }
-
-    ret = rsc->mHal.funcs.script.invokeRoot(rsc, this);
-
-    if (rsc->props.mLogScripts) {
-        ALOGV("%p ScriptC::run invoking complete, ret=%i", rsc, ret);
-    }
-
-    return ret;
-}
-
-
-void ScriptC::runForEach(Context *rsc,
-                         uint32_t slot,
-                         const Allocation * ain,
-                         Allocation * aout,
-                         const void * usr,
-                         size_t usrBytes,
-                         const RsScriptCall *sc) {
-
-    Context::PushState ps(rsc);
-
-    setupGLState(rsc);
-    setupScript(rsc);
-    rsc->mHal.funcs.script.invokeForEach(rsc, this, slot, ain, aout, usr, usrBytes, sc);
-}
-
-void ScriptC::Invoke(Context *rsc, uint32_t slot, const void *data, size_t len) {
-    if (slot >= mHal.info.exportedFunctionCount) {
-        rsc->setError(RS_ERROR_BAD_SCRIPT, "Calling invoke on bad script");
-        return;
-    }
-    setupScript(rsc);
-
-    if (rsc->props.mLogScripts) {
-        ALOGV("%p ScriptC::Invoke invoking slot %i,  ptr %p", rsc, slot, this);
-    }
-    rsc->mHal.funcs.script.invokeFunction(rsc, this, slot, data, len);
-}
-
-ScriptCState::ScriptCState() {
-}
-
-ScriptCState::~ScriptCState() {
-}
-
-/*
-static void* symbolLookup(void* pContext, char const* name) {
-    const ScriptCState::SymbolTable_t *sym;
-    ScriptC *s = (ScriptC *)pContext;
-    if (!strcmp(name, "__isThreadable")) {
-      return (void*) s->mHal.info.isThreadable;
-    } else if (!strcmp(name, "__clearThreadable")) {
-      s->mHal.info.isThreadable = false;
-      return NULL;
-    }
-    sym = ScriptCState::lookupSymbol(name);
-    if (!sym) {
-        sym = ScriptCState::lookupSymbolCL(name);
-    }
-    if (!sym) {
-        sym = ScriptCState::lookupSymbolGL(name);
-    }
-    if (sym) {
-        s->mHal.info.isThreadable &= sym->threadable;
-        return sym->mPtr;
-    }
-    ALOGE("ScriptC sym lookup failed for %s", name);
-    return NULL;
-}
-*/
-
-#if 0
-extern const char rs_runtime_lib_bc[];
-extern unsigned rs_runtime_lib_bc_size;
-#endif
-
-bool ScriptC::runCompiler(Context *rsc,
-                          const char *resName,
-                          const char *cacheDir,
-                          const uint8_t *bitcode,
-                          size_t bitcodeLen) {
-
-    //ALOGE("runCompiler %p %p %p %p %p %i", rsc, this, resName, cacheDir, bitcode, bitcodeLen);
-#ifndef ANDROID_RS_SERIALIZE
-    uint32_t sdkVersion = 0;
-    bcinfo::BitcodeWrapper bcWrapper((const char *)bitcode, bitcodeLen);
-    if (!bcWrapper.unwrap()) {
-        ALOGE("Bitcode is not in proper container format (raw or wrapper)");
-        return false;
-    }
-
-    if (bcWrapper.getBCFileType() == bcinfo::BC_WRAPPER) {
-        sdkVersion = bcWrapper.getTargetAPI();
-    }
-
-    if (sdkVersion == 0) {
-        // This signals that we didn't have a wrapper containing information
-        // about the bitcode.
-        sdkVersion = rsc->getTargetSdkVersion();
-    }
-
-    if (BT) {
-        delete BT;
-    }
-    BT = new bcinfo::BitcodeTranslator((const char *)bitcode, bitcodeLen,
-                                       sdkVersion);
-    if (!BT->translate()) {
-        ALOGE("Failed to translate bitcode from version: %u", sdkVersion);
-        delete BT;
-        BT = NULL;
-        return false;
-    }
-    bitcode = (const uint8_t *) BT->getTranslatedBitcode();
-    bitcodeLen = BT->getTranslatedBitcodeSize();
-#endif
-
-    if (!rsc->mHal.funcs.script.init(rsc, this, resName, cacheDir, bitcode, bitcodeLen, 0)) {
-        return false;
-    }
-
-    mInitialized = true;
-    mEnviroment.mFragment.set(rsc->getDefaultProgramFragment());
-    mEnviroment.mVertex.set(rsc->getDefaultProgramVertex());
-    mEnviroment.mFragmentStore.set(rsc->getDefaultProgramStore());
-    mEnviroment.mRaster.set(rsc->getDefaultProgramRaster());
-
-    rsc->mHal.funcs.script.invokeInit(rsc, this);
-
-    for (size_t i=0; i < mHal.info.exportedPragmaCount; ++i) {
-        const char * key = mHal.info.exportedPragmaKeyList[i];
-        const char * value = mHal.info.exportedPragmaValueList[i];
-        //ALOGE("pragma %s %s", keys[i], values[i]);
-        if (!strcmp(key, "version")) {
-            if (!strcmp(value, "1")) {
-                continue;
-            }
-            ALOGE("Invalid version pragma value: %s\n", value);
-            return false;
-        }
-
-        if (!strcmp(key, "stateVertex")) {
-            if (!strcmp(value, "default")) {
-                continue;
-            }
-            if (!strcmp(value, "parent")) {
-                mEnviroment.mVertex.clear();
-                continue;
-            }
-            ALOGE("Unrecognized value %s passed to stateVertex", value);
-            return false;
-        }
-
-        if (!strcmp(key, "stateRaster")) {
-            if (!strcmp(value, "default")) {
-                continue;
-            }
-            if (!strcmp(value, "parent")) {
-                mEnviroment.mRaster.clear();
-                continue;
-            }
-            ALOGE("Unrecognized value %s passed to stateRaster", value);
-            return false;
-        }
-
-        if (!strcmp(key, "stateFragment")) {
-            if (!strcmp(value, "default")) {
-                continue;
-            }
-            if (!strcmp(value, "parent")) {
-                mEnviroment.mFragment.clear();
-                continue;
-            }
-            ALOGE("Unrecognized value %s passed to stateFragment", value);
-            return false;
-        }
-
-        if (!strcmp(key, "stateStore")) {
-            if (!strcmp(value, "default")) {
-                continue;
-            }
-            if (!strcmp(value, "parent")) {
-                mEnviroment.mFragmentStore.clear();
-                continue;
-            }
-            ALOGE("Unrecognized value %s passed to stateStore", value);
-            return false;
-        }
-    }
-
-    mSlots = new ObjectBaseRef<Allocation>[mHal.info.exportedVariableCount];
-    mTypes = new ObjectBaseRef<const Type>[mHal.info.exportedVariableCount];
-
-    return true;
-}
-
-namespace android {
-namespace renderscript {
-
-RsScript rsi_ScriptCCreate(Context *rsc,
-                           const char *resName, size_t resName_length,
-                           const char *cacheDir, size_t cacheDir_length,
-                           const char *text, size_t text_length)
-{
-    ScriptC *s = new ScriptC(rsc);
-
-    if (!s->runCompiler(rsc, resName, cacheDir, (uint8_t *)text, text_length)) {
-        // Error during compile, destroy s and return null.
-        ObjectBase::checkDelete(s);
-        return NULL;
-    }
-
-    s->incUserRef();
-    return s;
-}
-
-}
-}
diff --git a/libs/rs/rsScriptC.h b/libs/rs/rsScriptC.h
deleted file mode 100644
index 92e1f4f..0000000
--- a/libs/rs/rsScriptC.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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.
- */
-
-#ifndef ANDROID_RS_SCRIPT_C_H
-#define ANDROID_RS_SCRIPT_C_H
-
-#include "rsScript.h"
-
-#include "rsEnv.h"
-
-#ifndef ANDROID_RS_SERIALIZE
-#include "bcinfo/BitcodeTranslator.h"
-#endif
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-
-class ScriptC : public Script {
-public:
-    typedef int (*RunScript_t)();
-    typedef void (*VoidFunc_t)();
-
-    ScriptC(Context *);
-    virtual ~ScriptC();
-
-
-    const Allocation *ptrToAllocation(const void *) const;
-
-
-    virtual void Invoke(Context *rsc, uint32_t slot, const void *data, size_t len);
-
-    virtual uint32_t run(Context *);
-
-    virtual void runForEach(Context *rsc,
-                            uint32_t slot,
-                            const Allocation * ain,
-                            Allocation * aout,
-                            const void * usr,
-                            size_t usrBytes,
-                            const RsScriptCall *sc = NULL);
-
-    virtual void serialize(OStream *stream) const {    }
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_SCRIPT_C; }
-    static Type *createFromStream(Context *rsc, IStream *stream) { return NULL; }
-
-    bool runCompiler(Context *rsc, const char *resName, const char *cacheDir,
-                     const uint8_t *bitcode, size_t bitcodeLen);
-
-//protected:
-    void setupScript(Context *);
-    void setupGLState(Context *);
-    Script * setTLS(Script *);
-  private:
-#ifndef ANDROID_RS_SERIALIZE
-    bcinfo::BitcodeTranslator *BT;
-#endif
-};
-
-class ScriptCState {
-public:
-    ScriptCState();
-    ~ScriptCState();
-
-    char * mScriptText;
-    size_t mScriptLen;
-
-    struct SymbolTable_t {
-        const char * mName;
-        void * mPtr;
-        bool threadable;
-    };
-    static const SymbolTable_t * lookupSymbol(const char *);
-    static const SymbolTable_t * lookupSymbolCL(const char *);
-    static const SymbolTable_t * lookupSymbolGL(const char *);
-};
-
-
-}
-}
-#endif
diff --git a/libs/rs/rsScriptC_Lib.cpp b/libs/rs/rsScriptC_Lib.cpp
deleted file mode 100644
index 749495d..0000000
--- a/libs/rs/rsScriptC_Lib.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2009-2012 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 "rsScriptC.h"
-#include "rsMatrix4x4.h"
-#include "rsMatrix3x3.h"
-#include "rsMatrix2x2.h"
-#include "rsgApiStructs.h"
-
-#include "utils/Timers.h"
-
-#include <time.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-
-namespace android {
-namespace renderscript {
-
-
-//////////////////////////////////////////////////////////////////////////////
-// Math routines
-//////////////////////////////////////////////////////////////////////////////
-
-#if 0
-static float SC_sinf_fast(float x) {
-    const float A =   1.0f / (2.0f * M_PI);
-    const float B = -16.0f;
-    const float C =   8.0f;
-
-    // scale angle for easy argument reduction
-    x *= A;
-
-    if (fabsf(x) >= 0.5f) {
-        // argument reduction
-        x = x - ceilf(x + 0.5f) + 1.0f;
-    }
-
-    const float y = B * x * fabsf(x) + C * x;
-    return 0.2215f * (y * fabsf(y) - y) + y;
-}
-
-static float SC_cosf_fast(float x) {
-    x += float(M_PI / 2);
-
-    const float A =   1.0f / (2.0f * M_PI);
-    const float B = -16.0f;
-    const float C =   8.0f;
-
-    // scale angle for easy argument reduction
-    x *= A;
-
-    if (fabsf(x) >= 0.5f) {
-        // argument reduction
-        x = x - ceilf(x + 0.5f) + 1.0f;
-    }
-
-    const float y = B * x * fabsf(x) + C * x;
-    return 0.2215f * (y * fabsf(y) - y) + y;
-}
-#endif
-
-//////////////////////////////////////////////////////////////////////////////
-// Time routines
-//////////////////////////////////////////////////////////////////////////////
-
-time_t rsrTime(Context *rsc, Script *sc, time_t *timer) {
-    return time(timer);
-}
-
-tm* rsrLocalTime(Context *rsc, Script *sc, tm *local, time_t *timer) {
-    if (!local) {
-      return NULL;
-    }
-
-    // The native localtime function is not thread-safe, so we
-    // have to apply locking for proper behavior in RenderScript.
-    pthread_mutex_lock(&rsc->gLibMutex);
-    tm *tmp = localtime(timer);
-    memcpy(local, tmp, sizeof(*tmp));
-    pthread_mutex_unlock(&rsc->gLibMutex);
-    return local;
-}
-
-int64_t rsrUptimeMillis(Context *rsc, Script *sc) {
-    return nanoseconds_to_milliseconds(systemTime(SYSTEM_TIME_MONOTONIC));
-}
-
-int64_t rsrUptimeNanos(Context *rsc, Script *sc) {
-    return systemTime(SYSTEM_TIME_MONOTONIC);
-}
-
-float rsrGetDt(Context *rsc, Script *sc) {
-    int64_t l = sc->mEnviroment.mLastDtTime;
-    sc->mEnviroment.mLastDtTime = systemTime(SYSTEM_TIME_MONOTONIC);
-    return ((float)(sc->mEnviroment.mLastDtTime - l)) / 1.0e9;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//////////////////////////////////////////////////////////////////////////////
-
-void rsrSetObject(const Context *rsc, const Script *sc, ObjectBase **dst, ObjectBase * src) {
-    //ALOGE("rsiSetObject  %p,%p  %p", vdst, *vdst, vsrc);
-    if (src) {
-        CHECK_OBJ(src);
-        src->incSysRef();
-    }
-    if (dst[0]) {
-        CHECK_OBJ(dst[0]);
-        dst[0]->decSysRef();
-    }
-    *dst = src;
-}
-
-void rsrClearObject(const Context *rsc, const Script *sc, ObjectBase **dst) {
-    //ALOGE("rsiClearObject  %p,%p", vdst, *vdst);
-    if (dst[0]) {
-        CHECK_OBJ(dst[0]);
-        dst[0]->decSysRef();
-    }
-    *dst = NULL;
-}
-
-bool rsrIsObject(const Context *rsc, const Script *sc, const ObjectBase *src) {
-    return src != NULL;
-}
-
-
-uint32_t rsrToClient(Context *rsc, Script *sc, int cmdID, void *data, int len) {
-    //ALOGE("SC_toClient %i %i %i", cmdID, len);
-    return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, false);
-}
-
-uint32_t rsrToClientBlocking(Context *rsc, Script *sc, int cmdID, void *data, int len) {
-    //ALOGE("SC_toClientBlocking %i %i", cmdID, len);
-    return rsc->sendMessageToClient(data, RS_MESSAGE_TO_CLIENT_USER, cmdID, len, true);
-}
-
-
-void rsrForEach(Context *rsc, Script *sc,
-                Script *target,
-                Allocation *in, Allocation *out,
-                const void *usr, uint32_t usrBytes,
-                const RsScriptCall *call) {
-    target->runForEach(rsc, /* root slot */ 0, in, out, usr, usrBytes, call);
-}
-
-void rsrAllocationSyncAll(Context *rsc, Script *sc, Allocation *a, RsAllocationUsageType usage) {
-    a->syncAll(rsc, usage);
-}
-
-void rsrAllocationCopy1DRange(Context *rsc, Allocation *dstAlloc,
-                              uint32_t dstOff,
-                              uint32_t dstMip,
-                              uint32_t count,
-                              Allocation *srcAlloc,
-                              uint32_t srcOff, uint32_t srcMip) {
-    rsi_AllocationCopy2DRange(rsc, dstAlloc, dstOff, 0,
-                              dstMip, 0, count, 1,
-                              srcAlloc, srcOff, 0, srcMip, 0);
-}
-
-void rsrAllocationCopy2DRange(Context *rsc, Allocation *dstAlloc,
-                              uint32_t dstXoff, uint32_t dstYoff,
-                              uint32_t dstMip, uint32_t dstFace,
-                              uint32_t width, uint32_t height,
-                              Allocation *srcAlloc,
-                              uint32_t srcXoff, uint32_t srcYoff,
-                              uint32_t srcMip, uint32_t srcFace) {
-    rsi_AllocationCopy2DRange(rsc, dstAlloc, dstXoff, dstYoff,
-                              dstMip, dstFace, width, height,
-                              srcAlloc, srcXoff, srcYoff, srcMip, srcFace);
-}
-
-const Allocation * rsrGetAllocation(Context *rsc, Script *s, const void *ptr) {
-    ScriptC *sc = (ScriptC *)s;
-    return sc->ptrToAllocation(ptr);
-}
-
-}
-}
-
diff --git a/libs/rs/rsScriptC_LibGL.cpp b/libs/rs/rsScriptC_LibGL.cpp
deleted file mode 100644
index 21b1c42..0000000
--- a/libs/rs/rsScriptC_LibGL.cpp
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Copyright (C) 2011 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 "rsScriptC.h"
-#include "rsMatrix4x4.h"
-#include "rsMatrix3x3.h"
-#include "rsMatrix2x2.h"
-#include "rsMesh.h"
-#include "rsgApiStructs.h"
-
-#include "utils/Timers.h"
-#include "driver/rsdVertexArray.h"
-#include "driver/rsdShaderCache.h"
-#include "driver/rsdCore.h"
-
-#define GL_GLEXT_PROTOTYPES
-
-#include <GLES/gl.h>
-#include <GLES/glext.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-
-#include <time.h>
-
-using namespace android;
-using namespace android::renderscript;
-
-namespace android {
-namespace renderscript {
-
-//////////////////////////////////////////////////////////////////////////////
-// Context
-//////////////////////////////////////////////////////////////////////////////
-
-void rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
-    CHECK_OBJ_OR_NULL(a);
-    CHECK_OBJ(pf);
-    pf->bindTexture(rsc, slot, a);
-}
-
-void rsrBindConstant(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
-    CHECK_OBJ_OR_NULL(a);
-    CHECK_OBJ(pf);
-    pf->bindAllocation(rsc, a, slot);
-}
-
-void rsrBindConstant(Context *rsc, Script *sc, ProgramVertex *pv, uint32_t slot, Allocation *a) {
-    CHECK_OBJ_OR_NULL(a);
-    CHECK_OBJ(pv);
-    pv->bindAllocation(rsc, a, slot);
-}
-
-void rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
-    CHECK_OBJ_OR_NULL(vs);
-    CHECK_OBJ(vpf);
-    pf->bindSampler(rsc, slot, s);
-}
-
-void rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
-    CHECK_OBJ_OR_NULL(ps);
-    rsc->setProgramStore(ps);
-}
-
-void rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
-    CHECK_OBJ_OR_NULL(pf);
-    rsc->setProgramFragment(pf);
-}
-
-void rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
-    CHECK_OBJ_OR_NULL(pv);
-    rsc->setProgramVertex(pv);
-}
-
-void rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
-    CHECK_OBJ_OR_NULL(pr);
-    rsc->setProgramRaster(pr);
-}
-
-void rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
-    CHECK_OBJ(va);
-    rsc->mFBOCache.bindColorTarget(rsc, a, slot);
-    rsc->mStateVertex.updateSize(rsc);
-}
-
-void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
-    CHECK_OBJ(va);
-    rsc->mFBOCache.bindDepthTarget(rsc, a);
-    rsc->mStateVertex.updateSize(rsc);
-}
-
-void rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
-    rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
-    rsc->mStateVertex.updateSize(rsc);
-}
-
-void rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
-    rsc->mFBOCache.bindDepthTarget(rsc, NULL);
-    rsc->mStateVertex.updateSize(rsc);
-}
-
-void rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
-    rsc->mFBOCache.resetAll(rsc);
-    rsc->mStateVertex.updateSize(rsc);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// VP
-//////////////////////////////////////////////////////////////////////////////
-
-void rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
-    rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
-}
-
-void rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
-    rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
-}
-
-void rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
-    rsc->getProgramVertex()->setTextureMatrix(rsc, m);
-}
-
-void rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf,
-                        float r, float g, float b, float a) {
-    CHECK_OBJ(pf);
-    pf->setConstantColor(rsc, r, g, b, a);
-}
-
-void rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
-    rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// Drawing
-//////////////////////////////////////////////////////////////////////////////
-
-void rsrDrawQuadTexCoords(Context *rsc, Script *sc,
-                          float x1, float y1, float z1, float u1, float v1,
-                          float x2, float y2, float z2, float u2, float v2,
-                          float x3, float y3, float z3, float u3, float v3,
-                          float x4, float y4, float z4, float u4, float v4) {
-    if (!rsc->setupCheck()) {
-        return;
-    }
-
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
-    if (!dc->gl.shaderCache->setup(rsc)) {
-        return;
-    }
-
-    //ALOGE("Quad");
-    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
-    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
-    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
-    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
-
-    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
-    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
-
-    RsdVertexArray::Attrib attribs[2];
-    attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
-    attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
-
-    RsdVertexArray va(attribs, 2);
-    va.setup(rsc);
-
-    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
-}
-
-void rsrDrawQuad(Context *rsc, Script *sc,
-                 float x1, float y1, float z1,
-                 float x2, float y2, float z2,
-                 float x3, float y3, float z3,
-                 float x4, float y4, float z4) {
-    rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1,
-                                  x2, y2, z2, 1, 1,
-                                  x3, y3, z3, 1, 0,
-                                  x4, y4, z4, 0, 0);
-}
-
-void rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
-                              float x, float y, float z, float w, float h) {
-    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
-    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
-    //rsc->setupCheck();
-
-    //GLint crop[4] = {0, h, w, -h};
-
-    float sh = rsc->getHeight();
-
-    rsrDrawQuad(rsc, sc,
-                x,   sh - y,     z,
-                x+w, sh - y,     z,
-                x+w, sh - (y+h), z,
-                x,   sh - (y+h), z);
-    rsc->setProgramVertex((ProgramVertex *)tmp.get());
-}
-
-void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
-    //ALOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
-    rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
-}
-
-void rsrDrawPath(Context *rsc, Script *sc, Path *sm) {
-    CHECK_OBJ(sm);
-    if (!rsc->setupCheck()) {
-        return;
-    }
-    sm->render(rsc);
-}
-
-void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
-    CHECK_OBJ(sm);
-    if (!rsc->setupCheck()) {
-        return;
-    }
-    sm->render(rsc);
-}
-
-void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
-    CHECK_OBJ(sm);
-    if (!rsc->setupCheck()) {
-        return;
-    }
-    sm->renderPrimitive(rsc, primIndex);
-}
-
-void rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
-                               uint32_t start, uint32_t len) {
-    CHECK_OBJ(sm);
-    if (!rsc->setupCheck()) {
-        return;
-    }
-    sm->renderPrimitiveRange(rsc, primIndex, start, len);
-}
-
-void rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
-                               float *minX, float *minY, float *minZ,
-                               float *maxX, float *maxY, float *maxZ) {
-    CHECK_OBJ(sm);
-    sm->computeBBox();
-    *minX = sm->mBBoxMin[0];
-    *minY = sm->mBBoxMin[1];
-    *minZ = sm->mBBoxMin[2];
-    *maxX = sm->mBBoxMax[0];
-    *maxY = sm->mBBoxMax[1];
-    *maxZ = sm->mBBoxMax[2];
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-//////////////////////////////////////////////////////////////////////////////
-
-
-void rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
-    ProgramFragment *pf = rsc->getProgramFragment();
-    pf->setConstantColor(rsc, r, g, b, a);
-}
-
-void rsrPrepareClear(Context *rsc, Script *sc) {
-    rsc->mFBOCache.setup(rsc);
-    rsc->setupProgramStore();
-}
-
-uint32_t rsrGetWidth(Context *rsc, Script *sc) {
-    return rsc->getWidth();
-}
-
-uint32_t rsrGetHeight(Context *rsc, Script *sc) {
-    return rsc->getHeight();
-}
-
-void rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
-    const char *text = (const char *)a->getPtr();
-    size_t allocSize = a->getType()->getSizeBytes();
-    rsc->mStateFont.renderText(text, allocSize, x, y);
-}
-
-void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
-    size_t textLen = strlen(text);
-    rsc->mStateFont.renderText(text, textLen, x, y);
-}
-
-static void SetMetrics(Font::Rect *metrics,
-                       int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
-    if (left) {
-        *left = metrics->left;
-    }
-    if (right) {
-        *right = metrics->right;
-    }
-    if (top) {
-        *top = metrics->top;
-    }
-    if (bottom) {
-        *bottom = metrics->bottom;
-    }
-}
-
-void rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
-                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
-    CHECK_OBJ(a);
-    const char *text = (const char *)a->getPtr();
-    size_t textLen = a->getType()->getSizeBytes();
-    Font::Rect metrics;
-    rsc->mStateFont.measureText(text, textLen, &metrics);
-    SetMetrics(&metrics, left, right, top, bottom);
-}
-
-void rsrMeasureText(Context *rsc, Script *sc, const char *text,
-                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
-    size_t textLen = strlen(text);
-    Font::Rect metrics;
-    rsc->mStateFont.measureText(text, textLen, &metrics);
-    SetMetrics(&metrics, left, right, top, bottom);
-}
-
-void rsrBindFont(Context *rsc, Script *sc, Font *font) {
-    CHECK_OBJ(font);
-    rsi_ContextBindFont(rsc, font);
-}
-
-void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
-    rsc->mStateFont.setFontColor(r, g, b, a);
-}
-
-}
-}
diff --git a/libs/rs/rsSignal.cpp b/libs/rs/rsSignal.cpp
deleted file mode 100644
index 3f6a13c..0000000
--- a/libs/rs/rsSignal.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsSignal.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-
-Signal::Signal() {
-    mSet = true;
-}
-
-Signal::~Signal() {
-    pthread_mutex_destroy(&mMutex);
-    pthread_cond_destroy(&mCondition);
-}
-
-bool Signal::init() {
-    int status = pthread_mutex_init(&mMutex, NULL);
-    if (status) {
-        ALOGE("LocklessFifo mutex init failure");
-        return false;
-    }
-
-    status = pthread_cond_init(&mCondition, NULL);
-    if (status) {
-        ALOGE("LocklessFifo condition init failure");
-        pthread_mutex_destroy(&mMutex);
-        return false;
-    }
-
-    return true;
-}
-
-void Signal::set() {
-    int status;
-
-    status = pthread_mutex_lock(&mMutex);
-    if (status) {
-        ALOGE("LocklessCommandFifo: error %i locking for set condition.", status);
-        return;
-    }
-
-    mSet = true;
-
-    status = pthread_cond_signal(&mCondition);
-    if (status) {
-        ALOGE("LocklessCommandFifo: error %i on set condition.", status);
-    }
-
-    status = pthread_mutex_unlock(&mMutex);
-    if (status) {
-        ALOGE("LocklessCommandFifo: error %i unlocking for set condition.", status);
-    }
-}
-
-bool Signal::wait(uint64_t timeout) {
-    int status;
-    bool ret = false;
-
-    status = pthread_mutex_lock(&mMutex);
-    if (status) {
-        ALOGE("LocklessCommandFifo: error %i locking for condition.", status);
-        return false;
-    }
-
-    if (!mSet) {
-        if (!timeout) {
-            status = pthread_cond_wait(&mCondition, &mMutex);
-        } else {
-#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)
-            status = pthread_cond_timeout_np(&mCondition, &mMutex, timeout / 1000000);
-#else
-            // This is safe it will just make things less reponsive
-            status = pthread_cond_wait(&mCondition, &mMutex);
-#endif
-        }
-    }
-
-    if (!status) {
-        mSet = false;
-        ret = true;
-    } else {
-        if (status != ETIMEDOUT) {
-            ALOGE("LocklessCommandFifo: error %i waiting for condition.", status);
-        }
-    }
-
-    status = pthread_mutex_unlock(&mMutex);
-    if (status) {
-        ALOGE("LocklessCommandFifo: error %i unlocking for condition.", status);
-    }
-
-    return ret;
-}
-
diff --git a/libs/rs/rsSignal.h b/libs/rs/rsSignal.h
deleted file mode 100644
index fc31883..0000000
--- a/libs/rs/rsSignal.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_SIGNAL_H
-#define ANDROID_RS_SIGNAL_H
-
-
-#include "rsUtils.h"
-
-namespace android {
-namespace renderscript {
-
-class Signal {
-public:
-    Signal();
-    ~Signal();
-
-    bool init();
-
-    void set();
-
-    // returns true if the signal occured
-    // false for timeout
-    bool wait(uint64_t timeout = 0);
-
-protected:
-    bool mSet;
-    pthread_mutex_t mMutex;
-    pthread_cond_t mCondition;
-};
-
-}
-}
-
-#endif
-
diff --git a/libs/rs/rsStream.cpp b/libs/rs/rsStream.cpp
deleted file mode 100644
index b9df0cc..0000000
--- a/libs/rs/rsStream.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-
-/*
- * Copyright (C) 2009 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 "rsStream.h"
-
-using namespace android;
-using namespace android::renderscript;
-
-IStream::IStream(const uint8_t *buf, bool use64) {
-    mData = buf;
-    mPos = 0;
-    mUse64 = use64;
-}
-
-void IStream::loadByteArray(void *dest, size_t numBytes) {
-    memcpy(dest, mData + mPos, numBytes);
-    mPos += numBytes;
-}
-
-uint64_t IStream::loadOffset() {
-    uint64_t tmp;
-    if (mUse64) {
-        mPos = (mPos + 7) & (~7);
-        tmp = reinterpret_cast<const uint64_t *>(&mData[mPos])[0];
-        mPos += sizeof(uint64_t);
-        return tmp;
-    }
-    return loadU32();
-}
-
-void IStream::loadString(String8 *s) {
-    uint32_t len = loadU32();
-    s->setTo((const char *)&mData[mPos], len);
-    mPos += len;
-}
-
-// Output stream implementation
-OStream::OStream(uint64_t len, bool use64) {
-    mData = (uint8_t*)malloc(len);
-    mLength = len;
-    mPos = 0;
-    mUse64 = use64;
-}
-
-OStream::~OStream() {
-    free(mData);
-}
-
-void OStream::addByteArray(const void *src, size_t numBytes) {
-    // We need to potentially grow more than once if the number of byes we write is substantial
-    while (mPos + numBytes >= mLength) {
-        growSize();
-    }
-    memcpy(mData + mPos, src, numBytes);
-    mPos += numBytes;
-}
-
-void OStream::addOffset(uint64_t v) {
-    if (mUse64) {
-        mPos = (mPos + 7) & (~7);
-        if (mPos + sizeof(v) >= mLength) {
-            growSize();
-        }
-        mData[mPos++] = (uint8_t)(v & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 32) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 40) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 48) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 56) & 0xff);
-    } else {
-        addU32(v);
-    }
-}
-
-void OStream::addString(String8 *s) {
-    uint32_t len = s->size();
-    addU32(len);
-    if (mPos + len*sizeof(char) >= mLength) {
-        growSize();
-    }
-    char *stringData = reinterpret_cast<char *>(&mData[mPos]);
-    for (uint32_t i = 0; i < len; i ++) {
-        stringData[i] = s->string()[i];
-    }
-    mPos += len*sizeof(char);
-}
-
-void OStream::growSize() {
-    uint8_t *newData = (uint8_t*)malloc(mLength*2);
-    memcpy(newData, mData, mLength*sizeof(uint8_t));
-    mLength = mLength * 2;
-    free(mData);
-    mData = newData;
-}
-
-
diff --git a/libs/rs/rsStream.h b/libs/rs/rsStream.h
deleted file mode 100644
index 62bcf94..0000000
--- a/libs/rs/rsStream.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_STREAM_H
-#define ANDROID_RS_STREAM_H
-
-#include <utils/String8.h>
-#include <stdio.h>
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class IStream {
-public:
-    IStream(const uint8_t *, bool use64);
-
-    float loadF() {
-        mPos = (mPos + 3) & (~3);
-        float tmp = reinterpret_cast<const float *>(&mData[mPos])[0];
-        mPos += sizeof(float);
-        return tmp;
-    }
-    int32_t loadI32() {
-        mPos = (mPos + 3) & (~3);
-        int32_t tmp = reinterpret_cast<const int32_t *>(&mData[mPos])[0];
-        mPos += sizeof(int32_t);
-        return tmp;
-    }
-    uint32_t loadU32() {
-        mPos = (mPos + 3) & (~3);
-        uint32_t tmp = reinterpret_cast<const uint32_t *>(&mData[mPos])[0];
-        mPos += sizeof(uint32_t);
-        return tmp;
-    }
-    uint16_t loadU16() {
-        mPos = (mPos + 1) & (~1);
-        uint16_t tmp = reinterpret_cast<const uint16_t *>(&mData[mPos])[0];
-        mPos += sizeof(uint16_t);
-        return tmp;
-    }
-    inline uint8_t loadU8() {
-        uint8_t tmp = reinterpret_cast<const uint8_t *>(&mData[mPos])[0];
-        mPos += sizeof(uint8_t);
-        return tmp;
-    }
-    void loadByteArray(void *dest, size_t numBytes);
-    uint64_t loadOffset();
-    void loadString(String8 *s);
-    uint64_t getPos() const {
-        return mPos;
-    }
-    void reset(uint64_t pos) {
-        mPos = pos;
-    }
-    void reset() {
-        mPos = 0;
-    }
-
-    const uint8_t * getPtr() const {
-        return mData;
-    }
-protected:
-    const uint8_t * mData;
-    uint64_t mPos;
-    bool mUse64;
-};
-
-class OStream {
-public:
-    OStream(uint64_t length, bool use64);
-    ~OStream();
-
-    void align(uint32_t bytes) {
-        mPos = (mPos + (bytes - 1)) & (~(bytes - 1));
-        if (mPos >= mLength) {
-            growSize();
-        }
-    }
-
-    void addF(float v) {
-        uint32_t uintV = *reinterpret_cast<uint32_t*> (&v);
-        addU32(uintV);
-    }
-    void addI32(int32_t v) {
-        mPos = (mPos + 3) & (~3);
-        if (mPos + sizeof(v) >= mLength) {
-            growSize();
-        }
-        mData[mPos++] = (uint8_t)(v & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
-    }
-    void addU32(uint32_t v) {
-        mPos = (mPos + 3) & (~3);
-        if (mPos + sizeof(v) >= mLength) {
-            growSize();
-        }
-        mData[mPos++] = (uint8_t)(v & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 8) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 16) & 0xff);
-        mData[mPos++] = (uint8_t)((v >> 24) & 0xff);
-    }
-    void addU16(uint16_t v) {
-        mPos = (mPos + 1) & (~1);
-        if (mPos + sizeof(v) >= mLength) {
-            growSize();
-        }
-        mData[mPos++] = (uint8_t)(v & 0xff);
-        mData[mPos++] = (uint8_t)(v >> 8);
-    }
-    inline void addU8(uint8_t v) {
-        if (mPos + 1 >= mLength) {
-            growSize();
-        }
-        reinterpret_cast<uint8_t *>(&mData[mPos])[0] = v;
-        mPos ++;
-    }
-    void addByteArray(const void *src, size_t numBytes);
-    void addOffset(uint64_t v);
-    void addString(String8 *s);
-    uint64_t getPos() const {
-        return mPos;
-    }
-    void reset(uint64_t pos) {
-        mPos = pos;
-    }
-    void reset() {
-        mPos = 0;
-    }
-    const uint8_t * getPtr() const {
-        return mData;
-    }
-protected:
-    void growSize();
-    uint8_t * mData;
-    uint64_t mLength;
-    uint64_t mPos;
-    bool mUse64;
-};
-
-
-} // renderscript
-} // android
-#endif //ANDROID_RS_STREAM_H
-
-
diff --git a/libs/rs/rsThreadIO.cpp b/libs/rs/rsThreadIO.cpp
deleted file mode 100644
index 8a0a5dc..0000000
--- a/libs/rs/rsThreadIO.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (C) 2009 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 "rsThreadIO.h"
-#include "rsgApiStructs.h"
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-
-#include <fcntl.h>
-#include <poll.h>
-
-
-using namespace android;
-using namespace android::renderscript;
-
-ThreadIO::ThreadIO() {
-    mRunning = true;
-    mPureFifo = false;
-    mMaxInlineSize = 1024;
-}
-
-ThreadIO::~ThreadIO() {
-}
-
-void ThreadIO::init() {
-    mToClient.init();
-    mToCore.init();
-}
-
-void ThreadIO::shutdown() {
-    mRunning = false;
-    mToCore.shutdown();
-}
-
-void * ThreadIO::coreHeader(uint32_t cmdID, size_t dataLen) {
-    //ALOGE("coreHeader %i %i", cmdID, dataLen);
-    CoreCmdHeader *hdr = (CoreCmdHeader *)&mSendBuffer[0];
-    hdr->bytes = dataLen;
-    hdr->cmdID = cmdID;
-    mSendLen = dataLen + sizeof(CoreCmdHeader);
-    //mToCoreSocket.writeAsync(&hdr, sizeof(hdr));
-    //ALOGE("coreHeader ret ");
-    return &mSendBuffer[sizeof(CoreCmdHeader)];
-}
-
-void ThreadIO::coreCommit() {
-    mToCore.writeAsync(&mSendBuffer, mSendLen);
-}
-
-void ThreadIO::clientShutdown() {
-    mToClient.shutdown();
-}
-
-void ThreadIO::coreWrite(const void *data, size_t len) {
-    //ALOGV("core write %p %i", data, (int)len);
-    mToCore.writeAsync(data, len, true);
-}
-
-void ThreadIO::coreRead(void *data, size_t len) {
-    //ALOGV("core read %p %i", data, (int)len);
-    mToCore.read(data, len);
-}
-
-void ThreadIO::coreSetReturn(const void *data, size_t dataLen) {
-    uint32_t buf;
-    if (data == NULL) {
-        data = &buf;
-        dataLen = sizeof(buf);
-    }
-
-    mToCore.readReturn(data, dataLen);
-}
-
-void ThreadIO::coreGetReturn(void *data, size_t dataLen) {
-    uint32_t buf;
-    if (data == NULL) {
-        data = &buf;
-        dataLen = sizeof(buf);
-    }
-
-    mToCore.writeWaitReturn(data, dataLen);
-}
-
-void ThreadIO::setTimeoutCallback(void (*cb)(void *), void *dat, uint64_t timeout) {
-    //mToCore.setTimeoutCallback(cb, dat, timeout);
-}
-
-bool ThreadIO::playCoreCommands(Context *con, int waitFd) {
-    bool ret = false;
-    const bool isLocal = !isPureFifo();
-
-    uint8_t buf[2 * 1024];
-    const CoreCmdHeader *cmd = (const CoreCmdHeader *)&buf[0];
-    const void * data = (const void *)&buf[sizeof(CoreCmdHeader)];
-
-    struct pollfd p[2];
-    p[0].fd = mToCore.getReadFd();
-    p[0].events = POLLIN;
-    p[0].revents = 0;
-    p[1].fd = waitFd;
-    p[1].events = POLLIN;
-    p[1].revents = 0;
-    int pollCount = 1;
-    if (waitFd >= 0) {
-        pollCount = 2;
-    }
-
-    if (con->props.mLogTimes) {
-        con->timerSet(Context::RS_TIMER_IDLE);
-    }
-
-    int waitTime = -1;
-    while (mRunning) {
-        int pr = poll(p, pollCount, waitTime);
-        if (pr <= 0) {
-            break;
-        }
-
-        if (p[0].revents) {
-            size_t r = 0;
-            if (isLocal) {
-                r = mToCore.read(&buf[0], sizeof(CoreCmdHeader));
-                mToCore.read(&buf[sizeof(CoreCmdHeader)], cmd->bytes);
-                if (r != sizeof(CoreCmdHeader)) {
-                    // exception or timeout occurred.
-                    break;
-                }
-            } else {
-                r = mToCore.read((void *)&cmd->cmdID, sizeof(cmd->cmdID));
-            }
-
-
-            ret = true;
-            if (con->props.mLogTimes) {
-                con->timerSet(Context::RS_TIMER_INTERNAL);
-            }
-            //ALOGV("playCoreCommands 3 %i %i", cmd->cmdID, cmd->bytes);
-
-            if (cmd->cmdID >= (sizeof(gPlaybackFuncs) / sizeof(void *))) {
-                rsAssert(cmd->cmdID < (sizeof(gPlaybackFuncs) / sizeof(void *)));
-                ALOGE("playCoreCommands error con %p, cmd %i", con, cmd->cmdID);
-            }
-
-            if (isLocal) {
-                gPlaybackFuncs[cmd->cmdID](con, data, cmd->bytes);
-            } else {
-                gPlaybackRemoteFuncs[cmd->cmdID](con, this);
-            }
-
-            if (con->props.mLogTimes) {
-                con->timerSet(Context::RS_TIMER_IDLE);
-            }
-
-            if (waitFd < 0) {
-                // If we don't have a secondary wait object we should stop blocking now
-                // that at least one command has been processed.
-                waitTime = 0;
-            }
-        }
-
-        if (p[1].revents && !p[0].revents) {
-            // We want to finish processing fifo events before processing the vsync.
-            // Otherwise we can end up falling behind and having tremendous lag.
-            break;
-        }
-    }
-    return ret;
-}
-
-RsMessageToClientType ThreadIO::getClientHeader(size_t *receiveLen, uint32_t *usrID) {
-    //ALOGE("getClientHeader");
-    mToClient.read(&mLastClientHeader, sizeof(mLastClientHeader));
-
-    receiveLen[0] = mLastClientHeader.bytes;
-    usrID[0] = mLastClientHeader.userID;
-    //ALOGE("getClientHeader %i %i %i", mLastClientHeader.cmdID, usrID[0], receiveLen[0]);
-    return (RsMessageToClientType)mLastClientHeader.cmdID;
-}
-
-RsMessageToClientType ThreadIO::getClientPayload(void *data, size_t *receiveLen,
-                                uint32_t *usrID, size_t bufferLen) {
-    //ALOGE("getClientPayload");
-    receiveLen[0] = mLastClientHeader.bytes;
-    usrID[0] = mLastClientHeader.userID;
-    if (bufferLen < mLastClientHeader.bytes) {
-        return RS_MESSAGE_TO_CLIENT_RESIZE;
-    }
-    if (receiveLen[0]) {
-        mToClient.read(data, receiveLen[0]);
-    }
-    //ALOGE("getClientPayload x");
-    return (RsMessageToClientType)mLastClientHeader.cmdID;
-}
-
-bool ThreadIO::sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data,
-                            size_t dataLen, bool waitForSpace) {
-
-    //ALOGE("sendToClient %i %i %i", cmdID, usrID, (int)dataLen);
-    ClientCmdHeader hdr;
-    hdr.bytes = dataLen;
-    hdr.cmdID = cmdID;
-    hdr.userID = usrID;
-
-    mToClient.writeAsync(&hdr, sizeof(hdr));
-    if (dataLen) {
-        mToClient.writeAsync(data, dataLen);
-    }
-
-    //ALOGE("sendToClient x");
-    return true;
-}
-
diff --git a/libs/rs/rsThreadIO.h b/libs/rs/rsThreadIO.h
deleted file mode 100644
index cb7d4ab..0000000
--- a/libs/rs/rsThreadIO.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_THREAD_IO_H
-#define ANDROID_RS_THREAD_IO_H
-
-#include "rsUtils.h"
-#include "rsFifoSocket.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-
-class Context;
-
-class ThreadIO {
-public:
-    ThreadIO();
-    ~ThreadIO();
-
-    void init();
-    void shutdown();
-
-    size_t getMaxInlineSize() {
-        return mMaxInlineSize;
-    }
-    bool isPureFifo() {
-        return mPureFifo;
-    }
-
-    // Plays back commands from the client.
-    // Returns true if any commands were processed.
-    bool playCoreCommands(Context *con, int waitFd);
-
-    void setTimeoutCallback(void (*)(void *), void *, uint64_t timeout);
-
-    void * coreHeader(uint32_t, size_t dataLen);
-    void coreCommit();
-
-    void coreSetReturn(const void *data, size_t dataLen);
-    void coreGetReturn(void *data, size_t dataLen);
-    void coreWrite(const void *data, size_t len);
-    void coreRead(void *data, size_t len);
-
-    void asyncSetReturn(const void *data, size_t dataLen);
-    void asyncGetReturn(void *data, size_t dataLen);
-    void asyncWrite(const void *data, size_t len);
-    void asyncRead(void *data, size_t len);
-
-
-    RsMessageToClientType getClientHeader(size_t *receiveLen, uint32_t *usrID);
-    RsMessageToClientType getClientPayload(void *data, size_t *receiveLen, uint32_t *subID, size_t bufferLen);
-    bool sendToClient(RsMessageToClientType cmdID, uint32_t usrID, const void *data, size_t dataLen, bool waitForSpace);
-    void clientShutdown();
-
-
-protected:
-    typedef struct CoreCmdHeaderRec {
-        uint32_t cmdID;
-        uint32_t bytes;
-    } CoreCmdHeader;
-    typedef struct ClientCmdHeaderRec {
-        uint32_t cmdID;
-        uint32_t bytes;
-        uint32_t userID;
-    } ClientCmdHeader;
-    ClientCmdHeader mLastClientHeader;
-
-    bool mRunning;
-    bool mPureFifo;
-    size_t mMaxInlineSize;
-
-    FifoSocket mToClient;
-    FifoSocket mToCore;
-
-    intptr_t mToCoreRet;
-
-    size_t mSendLen;
-    uint8_t mSendBuffer[2 * 1024];
-
-};
-
-
-}
-}
-#endif
-
diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp
deleted file mode 100644
index b668a78..0000000
--- a/libs/rs/rsType.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2009 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;
-
-Type::Type(Context *rsc) : ObjectBase(rsc) {
-    memset(&mHal, 0, sizeof(mHal));
-    mDimLOD = false;
-}
-
-void Type::preDestroy() const {
-    for (uint32_t ct = 0; ct < mRSC->mStateType.mTypes.size(); ct++) {
-        if (mRSC->mStateType.mTypes[ct] == this) {
-            mRSC->mStateType.mTypes.removeAt(ct);
-            break;
-        }
-    }
-}
-
-Type::~Type() {
-    clear();
-}
-
-void Type::clear() {
-    if (mHal.state.lodCount) {
-        delete [] mHal.state.lodDimX;
-        delete [] mHal.state.lodDimY;
-        delete [] mHal.state.lodDimZ;
-        delete [] mHal.state.lodOffset;
-    }
-    mElement.clear();
-    memset(&mHal, 0, sizeof(mHal));
-}
-
-TypeState::TypeState() {
-}
-
-TypeState::~TypeState() {
-    rsAssert(!mTypes.size());
-}
-
-size_t Type::getOffsetForFace(uint32_t face) const {
-    rsAssert(mHal.state.faces);
-    return 0;
-}
-
-void Type::compute() {
-    uint32_t oldLODCount = mHal.state.lodCount;
-    if (mDimLOD) {
-        uint32_t l2x = rsFindHighBit(mHal.state.dimX) + 1;
-        uint32_t l2y = rsFindHighBit(mHal.state.dimY) + 1;
-        uint32_t l2z = rsFindHighBit(mHal.state.dimZ) + 1;
-
-        mHal.state.lodCount = rsMax(l2x, l2y);
-        mHal.state.lodCount = rsMax(mHal.state.lodCount, l2z);
-    } else {
-        mHal.state.lodCount = 1;
-    }
-    if (mHal.state.lodCount != oldLODCount) {
-        if (oldLODCount) {
-            delete [] mHal.state.lodDimX;
-            delete [] mHal.state.lodDimY;
-            delete [] mHal.state.lodDimZ;
-            delete [] mHal.state.lodOffset;
-        }
-        mHal.state.lodDimX = new uint32_t[mHal.state.lodCount];
-        mHal.state.lodDimY = new uint32_t[mHal.state.lodCount];
-        mHal.state.lodDimZ = new uint32_t[mHal.state.lodCount];
-        mHal.state.lodOffset = new uint32_t[mHal.state.lodCount];
-    }
-
-    uint32_t tx = mHal.state.dimX;
-    uint32_t ty = mHal.state.dimY;
-    uint32_t tz = mHal.state.dimZ;
-    size_t offset = 0;
-    for (uint32_t lod=0; lod < mHal.state.lodCount; lod++) {
-        mHal.state.lodDimX[lod] = tx;
-        mHal.state.lodDimY[lod] = ty;
-        mHal.state.lodDimZ[lod]  = tz;
-        mHal.state.lodOffset[lod] = offset;
-        offset += tx * rsMax(ty, 1u) * rsMax(tz, 1u) * mElement->getSizeBytes();
-        if (tx > 1) tx >>= 1;
-        if (ty > 1) ty >>= 1;
-        if (tz > 1) tz >>= 1;
-    }
-
-    // At this point the offset is the size of a mipmap chain;
-    mMipChainSizeBytes = offset;
-
-    if (mHal.state.faces) {
-        offset *= 6;
-    }
-    mTotalSizeBytes = offset;
-    mHal.state.element = mElement.get();
-}
-
-uint32_t Type::getLODOffset(uint32_t lod, uint32_t x) const {
-    uint32_t offset = mHal.state.lodOffset[lod];
-    offset += x * mElement->getSizeBytes();
-    return offset;
-}
-
-uint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const {
-    uint32_t offset = mHal.state.lodOffset[lod];
-    offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes();
-    return offset;
-}
-
-uint32_t Type::getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const {
-    uint32_t offset = mHal.state.lodOffset[lod];
-    offset += (x +
-               y * mHal.state.lodDimX[lod] +
-               z * mHal.state.lodDimX[lod] * mHal.state.lodDimY[lod]) * mElement->getSizeBytes();
-    return offset;
-}
-
-uint32_t Type::getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face,
-                                uint32_t x, uint32_t y) const {
-    uint32_t offset = mHal.state.lodOffset[lod];
-    offset += (x + y * mHal.state.lodDimX[lod]) * mElement->getSizeBytes();
-
-    if (face != 0) {
-        uint32_t faceOffset = getSizeBytes() / 6;
-        offset += faceOffset * face;
-    }
-    return offset;
-}
-
-void Type::dumpLOGV(const char *prefix) const {
-    char buf[1024];
-    ObjectBase::dumpLOGV(prefix);
-    ALOGV("%s   Type: x=%u y=%u z=%u mip=%i face=%i", prefix,
-                                                      mHal.state.dimX,
-                                                      mHal.state.dimY,
-                                                      mHal.state.dimZ,
-                                                      mHal.state.lodCount,
-                                                      mHal.state.faces);
-    snprintf(buf, sizeof(buf), "%s element: ", prefix);
-    mElement->dumpLOGV(buf);
-}
-
-void Type::serialize(OStream *stream) const {
-    // Need to identify ourselves
-    stream->addU32((uint32_t)getClassId());
-
-    String8 name(getName());
-    stream->addString(&name);
-
-    mElement->serialize(stream);
-
-    stream->addU32(mHal.state.dimX);
-    stream->addU32(mHal.state.dimY);
-    stream->addU32(mHal.state.dimZ);
-
-    stream->addU8((uint8_t)(mHal.state.lodCount ? 1 : 0));
-    stream->addU8((uint8_t)(mHal.state.faces ? 1 : 0));
-}
-
-Type *Type::createFromStream(Context *rsc, IStream *stream) {
-    // First make sure we are reading the correct object
-    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
-    if (classID != RS_A3D_CLASS_ID_TYPE) {
-        ALOGE("type loading skipped due to invalid class id\n");
-        return NULL;
-    }
-
-    String8 name;
-    stream->loadString(&name);
-
-    Element *elem = Element::createFromStream(rsc, stream);
-    if (!elem) {
-        return NULL;
-    }
-
-    uint32_t x = stream->loadU32();
-    uint32_t y = stream->loadU32();
-    uint32_t z = stream->loadU32();
-    uint8_t lod = stream->loadU8();
-    uint8_t faces = stream->loadU8();
-    Type *type = Type::getType(rsc, elem, x, y, z, lod != 0, faces !=0 );
-    elem->decUserRef();
-    return type;
-}
-
-bool Type::getIsNp2() const {
-    uint32_t x = getDimX();
-    uint32_t y = getDimY();
-    uint32_t z = getDimZ();
-
-    if (x && (x & (x-1))) {
-        return true;
-    }
-    if (y && (y & (y-1))) {
-        return true;
-    }
-    if (z && (z & (z-1))) {
-        return true;
-    }
-    return false;
-}
-
-ObjectBaseRef<Type> Type::getTypeRef(Context *rsc, const Element *e,
-                                     uint32_t dimX, uint32_t dimY, uint32_t dimZ,
-                                     bool dimLOD, bool dimFaces) {
-    ObjectBaseRef<Type> returnRef;
-
-    TypeState * stc = &rsc->mStateType;
-
-    ObjectBase::asyncLock();
-    for (uint32_t ct=0; ct < stc->mTypes.size(); ct++) {
-        Type *t = stc->mTypes[ct];
-        if (t->getElement() != e) continue;
-        if (t->getDimX() != dimX) continue;
-        if (t->getDimY() != dimY) continue;
-        if (t->getDimZ() != dimZ) continue;
-        if (t->getDimLOD() != dimLOD) continue;
-        if (t->getDimFaces() != dimFaces) continue;
-        returnRef.set(t);
-        ObjectBase::asyncUnlock();
-        return returnRef;
-    }
-    ObjectBase::asyncUnlock();
-
-
-    Type *nt = new Type(rsc);
-    nt->mDimLOD = dimLOD;
-    returnRef.set(nt);
-    nt->mElement.set(e);
-    nt->mHal.state.dimX = dimX;
-    nt->mHal.state.dimY = dimY;
-    nt->mHal.state.dimZ = dimZ;
-    nt->mHal.state.faces = dimFaces;
-    nt->compute();
-
-    ObjectBase::asyncLock();
-    stc->mTypes.push(nt);
-    ObjectBase::asyncUnlock();
-
-    return returnRef;
-}
-
-ObjectBaseRef<Type> Type::cloneAndResize1D(Context *rsc, uint32_t dimX) const {
-    return getTypeRef(rsc, mElement.get(), dimX,
-                      getDimY(), getDimZ(), getDimLOD(), getDimFaces());
-}
-
-ObjectBaseRef<Type> Type::cloneAndResize2D(Context *rsc,
-                              uint32_t dimX,
-                              uint32_t dimY) const {
-    return getTypeRef(rsc, mElement.get(), dimX, dimY,
-                      getDimZ(), getDimLOD(), getDimFaces());
-}
-
-
-//////////////////////////////////////////////////
-//
-namespace android {
-namespace renderscript {
-
-RsType rsi_TypeCreate(Context *rsc, RsElement _e, uint32_t dimX,
-                     uint32_t dimY, uint32_t dimZ, bool mips, bool faces) {
-    Element *e = static_cast<Element *>(_e);
-
-    return Type::getType(rsc, e, dimX, dimY, dimZ, mips, faces);
-}
-
-}
-}
-
-void rsaTypeGetNativeData(RsContext con, RsType type, uint32_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++) = (uint32_t)t->getElement();
-    t->getElement()->incUserRef();
-}
diff --git a/libs/rs/rsType.h b/libs/rs/rsType.h
deleted file mode 100644
index f1aeb0a..0000000
--- a/libs/rs/rsType.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef ANDROID_STRUCTURED_TYPE_H
-#define ANDROID_STRUCTURED_TYPE_H
-
-#include "rsElement.h"
-
-// ---------------------------------------------------------------------------
-namespace android {
-namespace renderscript {
-/*****************************************************************************
- * CAUTION
- *
- * Any layout changes for this class may require a corresponding change to be
- * made to frameworks/compile/libbcc/lib/ScriptCRT/rs_core.c, which contains
- * a partial copy of the information below.
- *
- *****************************************************************************/
-
-class Type : public ObjectBase {
-public:
-    struct Hal {
-        mutable void *drv;
-
-        struct State {
-            const Element * element;
-
-            // Size of the structure in the various dimensions.  A missing Dimension is
-            // specified as a 0 and not a 1.
-            uint32_t dimX;
-            uint32_t dimY;
-            uint32_t dimZ;
-            uint32_t *lodDimX;
-            uint32_t *lodDimY;
-            uint32_t *lodDimZ;
-            uint32_t *lodOffset;
-            uint32_t lodCount;
-            bool faces;
-        };
-        State state;
-    };
-    Hal mHal;
-
-    Type * createTex2D(const Element *, size_t w, size_t h, bool mip);
-
-    size_t getOffsetForFace(uint32_t face) const;
-
-    size_t getSizeBytes() const {return mTotalSizeBytes;}
-    size_t getElementSizeBytes() const {return mElement->getSizeBytes();}
-    const Element * getElement() const {return mElement.get();}
-
-    uint32_t getDimX() const {return mHal.state.dimX;}
-    uint32_t getDimY() const {return mHal.state.dimY;}
-    uint32_t getDimZ() const {return mHal.state.dimZ;}
-    bool getDimLOD() const {return mDimLOD;}
-    bool getDimFaces() const {return mHal.state.faces;}
-
-    uint32_t getLODDimX(uint32_t lod) const {
-        rsAssert(lod < mHal.state.lodCount);
-        return mHal.state.lodDimX[lod];
-    }
-    uint32_t getLODDimY(uint32_t lod) const {
-        rsAssert(lod < mHal.state.lodCount);
-        return mHal.state.lodDimY[lod];
-    }
-    uint32_t getLODDimZ(uint32_t lod) const {
-        rsAssert(lod < mHal.state.lodCount);
-        return mHal.state.lodDimZ[lod];
-    }
-    uint32_t getLODOffset(uint32_t lod) const {
-        rsAssert(lod < mHal.state.lodCount);
-        return mHal.state.lodOffset[lod];
-    }
-    uint32_t getLODOffset(uint32_t lod, uint32_t x) const;
-    uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y) const;
-    uint32_t getLODOffset(uint32_t lod, uint32_t x, uint32_t y, uint32_t z) const;
-
-    uint32_t getLODFaceOffset(uint32_t lod, RsAllocationCubemapFace face,
-                              uint32_t x, uint32_t y) const;
-
-    uint32_t getLODCount() const {return mHal.state.lodCount;}
-    bool getIsNp2() const;
-
-    void clear();
-    void compute();
-
-    void dumpLOGV(const char *prefix) const;
-    virtual void serialize(OStream *stream) const;
-    virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_TYPE; }
-    static Type *createFromStream(Context *rsc, IStream *stream);
-
-    ObjectBaseRef<Type> cloneAndResize1D(Context *rsc, uint32_t dimX) const;
-    ObjectBaseRef<Type> cloneAndResize2D(Context *rsc, uint32_t dimX, uint32_t dimY) const;
-
-    static ObjectBaseRef<Type> getTypeRef(Context *rsc, const Element *e,
-                                          uint32_t dimX, uint32_t dimY, uint32_t dimZ,
-                                          bool dimLOD, bool dimFaces);
-
-    static Type* getType(Context *rsc, const Element *e,
-                         uint32_t dimX, uint32_t dimY, uint32_t dimZ,
-                         bool dimLOD, bool dimFaces) {
-        ObjectBaseRef<Type> type = getTypeRef(rsc, e, dimX, dimY, dimZ, dimLOD, dimFaces);
-        type->incUserRef();
-        return type.get();
-    }
-
-protected:
-    void makeLODTable();
-    bool mDimLOD;
-
-    // Internal structure from most to least significant.
-    // * Array dimensions
-    // * Faces
-    // * Mipmaps
-    // * xyz
-
-    ObjectBaseRef<const Element> mElement;
-
-    // count of mipmap levels, 0 indicates no mipmapping
-
-    size_t mMipChainSizeBytes;
-    size_t mTotalSizeBytes;
-protected:
-    virtual void preDestroy() const;
-    virtual ~Type();
-
-private:
-    Type(Context *);
-    Type(const Type &);
-};
-
-
-class TypeState {
-public:
-    TypeState();
-    ~TypeState();
-
-    // Cache of all existing types.
-    Vector<Type *> mTypes;
-};
-
-
-}
-}
-#endif //ANDROID_STRUCTURED_TYPE
diff --git a/libs/rs/rsUtils.h b/libs/rs/rsUtils.h
deleted file mode 100644
index cbbae6c..0000000
--- a/libs/rs/rsUtils.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2009 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.
- */
-
-#ifndef ANDROID_RS_UTILS_H
-#define ANDROID_RS_UTILS_H
-
-#define LOG_NDEBUG 0
-#define LOG_TAG "RenderScript"
-
-#include <utils/Log.h>
-
-#include "rsStream.h"
-
-#include <utils/String8.h>
-#include <utils/Vector.h>
-
-#include <stdlib.h>
-#include <pthread.h>
-#include <time.h>
-#include <cutils/atomic.h>
-
-#include <math.h>
-
-namespace android {
-namespace renderscript {
-
-#if 1
-#define rsAssert(v) do {if(!(v)) ALOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while (0)
-#else
-#define rsAssert(v) while (0)
-#endif
-
-typedef float rsvF_2 __attribute__ ((vector_size (8)));
-typedef float rsvF_4 __attribute__ ((vector_size (16)));
-typedef uint8_t rsvU8_4 __attribute__ ((vector_size (4)));
-
-union float2 {
-    rsvF_2 v;
-    float f[2];
-};
-
-union float4 {
-    rsvF_4 v;
-    float f[4];
-};
-
-union uchar4 {
-    rsvU8_4 v;
-    uint8_t f[4];
-    uint32_t packed;
-};
-
-template<typename T>
-T rsMin(T in1, T in2)
-{
-    if (in1 > in2) {
-        return in2;
-    }
-    return in1;
-}
-
-template<typename T>
-T rsMax(T in1, T in2) {
-    if (in1 < in2) {
-        return in2;
-    }
-    return in1;
-}
-
-template<typename T>
-T rsFindHighBit(T val) {
-    uint32_t bit = 0;
-    while (val > 1) {
-        bit++;
-        val>>=1;
-    }
-    return bit;
-}
-
-template<typename T>
-bool rsIsPow2(T val) {
-    return (val & (val-1)) == 0;
-}
-
-template<typename T>
-T rsHigherPow2(T v) {
-    if (rsIsPow2(v)) {
-        return v;
-    }
-    return 1 << (rsFindHighBit(v) + 1);
-}
-
-template<typename T>
-T rsLowerPow2(T v) {
-    if (rsIsPow2(v)) {
-        return v;
-    }
-    return 1 << rsFindHighBit(v);
-}
-
-static inline uint16_t rs888to565(uint32_t r, uint32_t g, uint32_t b) {
-    uint16_t t = 0;
-    t |= b >> 3;
-    t |= (g >> 2) << 5;
-    t |= (r >> 3) << 11;
-    return t;
-}
-
-static inline uint16_t rsBoxFilter565(uint16_t i1, uint16_t i2, uint16_t i3, uint16_t i4) {
-    uint32_t r = ((i1 & 0x1f) + (i2 & 0x1f) + (i3 & 0x1f) + (i4 & 0x1f));
-    uint32_t g = ((i1 >> 5) & 0x3f) + ((i2 >> 5) & 0x3f) + ((i3 >> 5) & 0x3f) + ((i4 >> 5) & 0x3f);
-    uint32_t b = ((i1 >> 11) + (i2 >> 11) + (i3 >> 11) + (i4 >> 11));
-    return (r >> 2) | ((g >> 2) << 5) | ((b >> 2) << 11);
-}
-
-static inline uint32_t rsBoxFilter8888(uint32_t i1, uint32_t i2, uint32_t i3, uint32_t i4) {
-    uint32_t r = (i1 & 0xff) +         (i2 & 0xff) +         (i3 & 0xff) +         (i4 & 0xff);
-    uint32_t g = ((i1 >> 8) & 0xff) +  ((i2 >> 8) & 0xff) +  ((i3 >> 8) & 0xff) +  ((i4 >> 8) & 0xff);
-    uint32_t b = ((i1 >> 16) & 0xff) + ((i2 >> 16) & 0xff) + ((i3 >> 16) & 0xff) + ((i4 >> 16) & 0xff);
-    uint32_t a = ((i1 >> 24) & 0xff) + ((i2 >> 24) & 0xff) + ((i3 >> 24) & 0xff) + ((i4 >> 24) & 0xff);
-    return (r >> 2) | ((g >> 2) << 8) | ((b >> 2) << 16) | ((a >> 2) << 24);
-}
-
-}
-}
-
-#endif //ANDROID_RS_OBJECT_BASE_H
-
-
diff --git a/libs/rs/rs_hal.h b/libs/rs/rs_hal.h
deleted file mode 100644
index e4bf17f..0000000
--- a/libs/rs/rs_hal.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-#ifndef RS_HAL_H
-#define RS_HAL_H
-
-#include <rsDefines.h>
-
-struct ANativeWindow;
-
-namespace android {
-namespace renderscript {
-
-class Context;
-class ObjectBase;
-class Element;
-class Type;
-class Allocation;
-class Script;
-class ScriptC;
-class Path;
-class Program;
-class ProgramStore;
-class ProgramRaster;
-class ProgramVertex;
-class ProgramFragment;
-class Mesh;
-class Sampler;
-class FBOCache;
-
-typedef void *(*RsHalSymbolLookupFunc)(void *usrptr, char const *symbolName);
-
-typedef struct {
-    const void *in;
-    void *out;
-    const void *usr;
-    size_t usr_len;
-    uint32_t x;
-    uint32_t y;
-    uint32_t z;
-    uint32_t lod;
-    RsAllocationCubemapFace face;
-    uint32_t ar[16];
-} RsForEachStubParamStruct;
-
-/**
- * Script management functions
- */
-typedef struct {
-    bool (*initGraphics)(const Context *);
-    void (*shutdownGraphics)(const Context *);
-    bool (*setSurface)(const Context *, uint32_t w, uint32_t h, RsNativeWindow);
-    void (*swap)(const Context *);
-
-    void (*shutdownDriver)(Context *);
-    void (*getVersion)(unsigned int *major, unsigned int *minor);
-    void (*setPriority)(const Context *, int32_t priority);
-
-
-
-    struct {
-        bool (*init)(const Context *rsc, ScriptC *s,
-                     char const *resName,
-                     char const *cacheDir,
-                     uint8_t const *bitcode,
-                     size_t bitcodeSize,
-                     uint32_t flags);
-
-        void (*invokeFunction)(const Context *rsc, Script *s,
-                               uint32_t slot,
-                               const void *params,
-                               size_t paramLength);
-        int (*invokeRoot)(const Context *rsc, Script *s);
-        void (*invokeForEach)(const Context *rsc,
-                              Script *s,
-                              uint32_t slot,
-                              const Allocation * ain,
-                              Allocation * aout,
-                              const void * usr,
-                              uint32_t usrLen,
-                              const RsScriptCall *sc);
-        void (*invokeInit)(const Context *rsc, Script *s);
-        void (*invokeFreeChildren)(const Context *rsc, Script *s);
-
-        void (*setGlobalVar)(const Context *rsc, const Script *s,
-                             uint32_t slot,
-                             void *data,
-                             size_t dataLength);
-        void (*setGlobalBind)(const Context *rsc, const Script *s,
-                              uint32_t slot,
-                              void *data);
-        void (*setGlobalObj)(const Context *rsc, const Script *s,
-                             uint32_t slot,
-                             ObjectBase *data);
-
-        void (*destroy)(const Context *rsc, Script *s);
-    } script;
-
-    struct {
-        bool (*init)(const Context *rsc, Allocation *alloc, bool forceZero);
-        void (*destroy)(const Context *rsc, Allocation *alloc);
-
-        void (*resize)(const Context *rsc, const Allocation *alloc, const Type *newType,
-                       bool zeroNew);
-        void (*syncAll)(const Context *rsc, const Allocation *alloc, RsAllocationUsageType src);
-        void (*markDirty)(const Context *rsc, const Allocation *alloc);
-
-        int32_t (*initSurfaceTexture)(const Context *rsc, const Allocation *alloc);
-        void (*setSurfaceTexture)(const Context *rsc, Allocation *alloc, ANativeWindow *sur);
-        void (*ioSend)(const Context *rsc, Allocation *alloc);
-        void (*ioReceive)(const Context *rsc, Allocation *alloc);
-
-        void (*data1D)(const Context *rsc, const Allocation *alloc,
-                       uint32_t xoff, uint32_t lod, uint32_t count,
-                       const void *data, size_t sizeBytes);
-        void (*data2D)(const Context *rsc, const Allocation *alloc,
-                       uint32_t xoff, uint32_t yoff, uint32_t lod,
-                       RsAllocationCubemapFace face, uint32_t w, uint32_t h,
-                       const void *data, size_t sizeBytes);
-        void (*data3D)(const Context *rsc, const Allocation *alloc,
-                       uint32_t xoff, uint32_t yoff, uint32_t zoff,
-                       uint32_t lod, RsAllocationCubemapFace face,
-                       uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes);
-
-        // Allocation to allocation copies
-        void (*allocData1D)(const Context *rsc,
-                            const Allocation *dstAlloc,
-                            uint32_t dstXoff, uint32_t dstLod, uint32_t count,
-                            const Allocation *srcAlloc, uint32_t srcXoff, uint32_t srcLod);
-        void (*allocData2D)(const Context *rsc,
-                            const Allocation *dstAlloc,
-                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstLod,
-                            RsAllocationCubemapFace dstFace, uint32_t w, uint32_t h,
-                            const Allocation *srcAlloc,
-                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcLod,
-                            RsAllocationCubemapFace srcFace);
-        void (*allocData3D)(const Context *rsc,
-                            const Allocation *dstAlloc,
-                            uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff,
-                            uint32_t dstLod, RsAllocationCubemapFace dstFace,
-                            uint32_t w, uint32_t h, uint32_t d,
-                            const Allocation *srcAlloc,
-                            uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff,
-                            uint32_t srcLod, RsAllocationCubemapFace srcFace);
-
-        void (*elementData1D)(const Context *rsc, const Allocation *alloc, uint32_t x,
-                              const void *data, uint32_t elementOff, size_t sizeBytes);
-        void (*elementData2D)(const Context *rsc, const Allocation *alloc, uint32_t x, uint32_t y,
-                              const void *data, uint32_t elementOff, size_t sizeBytes);
-
-
-    } allocation;
-
-    struct {
-        bool (*init)(const Context *rsc, const ProgramStore *ps);
-        void (*setActive)(const Context *rsc, const ProgramStore *ps);
-        void (*destroy)(const Context *rsc, const ProgramStore *ps);
-    } store;
-
-    struct {
-        bool (*init)(const Context *rsc, const ProgramRaster *ps);
-        void (*setActive)(const Context *rsc, const ProgramRaster *ps);
-        void (*destroy)(const Context *rsc, const ProgramRaster *ps);
-    } raster;
-
-    struct {
-        bool (*init)(const Context *rsc, const ProgramVertex *pv,
-                     const char* shader, size_t shaderLen,
-                     const char** textureNames, size_t textureNamesCount,
-                     const size_t *textureNamesLength);
-        void (*setActive)(const Context *rsc, const ProgramVertex *pv);
-        void (*destroy)(const Context *rsc, const ProgramVertex *pv);
-    } vertex;
-
-    struct {
-        bool (*init)(const Context *rsc, const ProgramFragment *pf,
-                     const char* shader, size_t shaderLen,
-                     const char** textureNames, size_t textureNamesCount,
-                     const size_t *textureNamesLength);
-        void (*setActive)(const Context *rsc, const ProgramFragment *pf);
-        void (*destroy)(const Context *rsc, const ProgramFragment *pf);
-    } fragment;
-
-    struct {
-        bool (*init)(const Context *rsc, const Mesh *m);
-        void (*draw)(const Context *rsc, const Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len);
-        void (*destroy)(const Context *rsc, const Mesh *m);
-    } mesh;
-
-    struct {
-        bool (*initStatic)(const Context *rsc, const Path *m, const Allocation *vtx, const Allocation *loops);
-        bool (*initDynamic)(const Context *rsc, const Path *m);
-        void (*draw)(const Context *rsc, const Path *m);
-        void (*destroy)(const Context *rsc, const Path *m);
-    } path;
-
-    struct {
-        bool (*init)(const Context *rsc, const Sampler *m);
-        void (*destroy)(const Context *rsc, const Sampler *m);
-    } sampler;
-
-    struct {
-        bool (*init)(const Context *rsc, const FBOCache *fb);
-        void (*setActive)(const Context *rsc, const FBOCache *fb);
-        void (*destroy)(const Context *rsc, const FBOCache *fb);
-    } framebuffer;
-
-} RsdHalFunctions;
-
-
-}
-}
-
-
-bool rsdHalInit(android::renderscript::Context *, uint32_t version_major, uint32_t version_minor);
-
-#endif
-
diff --git a/libs/rs/rsgApi.cpp.rsg b/libs/rs/rsgApi.cpp.rsg
deleted file mode 100644
index 0cfbf08..0000000
--- a/libs/rs/rsgApi.cpp.rsg
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/libs/rs/rsgApiFuncDecl.h.rsg b/libs/rs/rsgApiFuncDecl.h.rsg
deleted file mode 100644
index d00491f..0000000
--- a/libs/rs/rsgApiFuncDecl.h.rsg
+++ /dev/null
@@ -1 +0,0 @@
-1
diff --git a/libs/rs/rsgApiReplay.cpp.rsg b/libs/rs/rsgApiReplay.cpp.rsg
deleted file mode 100644
index 00750ed..0000000
--- a/libs/rs/rsgApiReplay.cpp.rsg
+++ /dev/null
@@ -1 +0,0 @@
-3
diff --git a/libs/rs/rsgApiStructs.h.rsg b/libs/rs/rsgApiStructs.h.rsg
deleted file mode 100644
index 573541a..0000000
--- a/libs/rs/rsgApiStructs.h.rsg
+++ /dev/null
@@ -1 +0,0 @@
-0
diff --git a/libs/rs/rsg_generator.c b/libs/rs/rsg_generator.c
deleted file mode 100644
index c0f82dc..0000000
--- a/libs/rs/rsg_generator.c
+++ /dev/null
@@ -1,684 +0,0 @@
-
-#include "spec.h"
-#include <stdio.h>
-
-void printFileHeader(FILE *f) {
-    fprintf(f, "/*\n");
-    fprintf(f, " * Copyright (C) 2011 The Android Open Source Project\n");
-    fprintf(f, " *\n");
-    fprintf(f, " * Licensed under the Apache License, Version 2.0 (the \"License\");\n");
-    fprintf(f, " * you may not use this file except in compliance with the License.\n");
-    fprintf(f, " * You may obtain a copy of the License at\n");
-    fprintf(f, " *\n");
-    fprintf(f, " *      http://www.apache.org/licenses/LICENSE-2.0\n");
-    fprintf(f, " *\n");
-    fprintf(f, " * Unless required by applicable law or agreed to in writing, software\n");
-    fprintf(f, " * distributed under the License is distributed on an \"AS IS\" BASIS,\n");
-    fprintf(f, " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
-    fprintf(f, " * See the License for the specific language governing permissions and\n");
-    fprintf(f, " * limitations under the License.\n");
-    fprintf(f, " */\n\n");
-}
-
-void printVarType(FILE *f, const VarType *vt) {
-    int ct;
-    if (vt->isConst) {
-        fprintf(f, "const ");
-    }
-
-    switch (vt->type) {
-    case 0:
-        fprintf(f, "void");
-        break;
-    case 1:
-        fprintf(f, "int%i_t", vt->bits);
-        break;
-    case 2:
-        fprintf(f, "uint%i_t", vt->bits);
-        break;
-    case 3:
-        if (vt->bits == 32)
-            fprintf(f, "float");
-        else
-            fprintf(f, "double");
-        break;
-    case 4:
-        fprintf(f, "%s", vt->typeName);
-        break;
-    }
-
-    if (vt->ptrLevel) {
-        fprintf(f, " ");
-        for (ct=0; ct < vt->ptrLevel; ct++) {
-            fprintf(f, "*");
-        }
-    }
-}
-
-void printVarTypeAndName(FILE *f, const VarType *vt) {
-    printVarType(f, vt);
-
-    if (vt->name[0]) {
-        fprintf(f, " %s", vt->name);
-    }
-}
-
-void printArgList(FILE *f, const ApiEntry * api, int assumePrevious) {
-    int ct;
-    for (ct=0; ct < api->paramCount; ct++) {
-        if (ct || assumePrevious) {
-            fprintf(f, ", ");
-        }
-        printVarTypeAndName(f, &api->params[ct]);
-    }
-}
-
-void printStructures(FILE *f) {
-    int ct;
-    int ct2;
-
-    for (ct=0; ct < apiCount; ct++) {
-        fprintf(f, "typedef struct RS_CMD_%s_rec RS_CMD_%s;\n", apis[ct].name, apis[ct].name);
-    }
-    fprintf(f, "\n");
-
-    for (ct=0; ct < apiCount; ct++) {
-        const ApiEntry * api = &apis[ct];
-        fprintf(f, "#define RS_CMD_ID_%s %i\n", api->name, ct+1);
-        fprintf(f, "struct RS_CMD_%s_rec {\n", api->name);
-        //fprintf(f, "    RsCommandHeader _hdr;\n");
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            fprintf(f, "    ");
-            printVarTypeAndName(f, &api->params[ct2]);
-            fprintf(f, ";\n");
-        }
-        fprintf(f, "};\n\n");
-    }
-}
-
-void printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) {
-    printVarTypeAndName(f, &api->ret);
-    if (isFnPtr) {
-        char t[1024];
-        strcpy(t, api->name);
-        if (strlen(prefix) == 0) {
-            if (t[0] > 'A' && t[0] < 'Z') {
-                t[0] -= 'A' - 'a';
-            }
-        }
-        fprintf(f, " (* %s%s) (", prefix, api->name);
-    } else {
-        fprintf(f, " %s%s (", prefix, api->name);
-    }
-    if (!api->nocontext) {
-        if (addContext) {
-            fprintf(f, "Context *");
-        } else {
-            fprintf(f, "RsContext rsc");
-        }
-    }
-    printArgList(f, api, !api->nocontext);
-    fprintf(f, ")");
-}
-
-void printFuncDecls(FILE *f, const char *prefix, int addContext) {
-    int ct;
-    for (ct=0; ct < apiCount; ct++) {
-        printFuncDecl(f, &apis[ct], prefix, addContext, 0);
-        fprintf(f, ";\n");
-    }
-    fprintf(f, "\n\n");
-}
-
-void printFuncPointers(FILE *f, int addContext) {
-    fprintf(f, "\n");
-    fprintf(f, "typedef struct RsApiEntrypoints {\n");
-    int ct;
-    for (ct=0; ct < apiCount; ct++) {
-        fprintf(f, "    ");
-        printFuncDecl(f, &apis[ct], "", addContext, 1);
-        fprintf(f, ";\n");
-    }
-    fprintf(f, "} RsApiEntrypoints_t;\n\n");
-}
-
-void printPlaybackFuncs(FILE *f, const char *prefix) {
-    int ct;
-    for (ct=0; ct < apiCount; ct++) {
-        if (apis[ct].direct) {
-            continue;
-        }
-
-        fprintf(f, "void %s%s (Context *, const void *);\n", prefix, apis[ct].name);
-    }
-}
-
-static int hasInlineDataPointers(const ApiEntry * api) {
-    int ret = 0;
-    int ct;
-    if (api->sync || api->ret.typeName[0]) {
-        return 0;
-    }
-    for (ct=0; ct < api->paramCount; ct++) {
-        const VarType *vt = &api->params[ct];
-
-        if (!vt->isConst && vt->ptrLevel) {
-            // Non-const pointers cannot be inlined.
-            return 0;
-        }
-        if (vt->ptrLevel > 1) {
-            // not handled yet.
-            return 0;
-        }
-
-        if (vt->isConst && vt->ptrLevel) {
-            // Non-const pointers cannot be inlined.
-            ret = 1;
-        }
-    }
-    return ret;
-}
-
-void printApiCpp(FILE *f) {
-    int ct;
-    int ct2;
-
-    fprintf(f, "#include \"rsDevice.h\"\n");
-    fprintf(f, "#include \"rsContext.h\"\n");
-    fprintf(f, "#include \"rsThreadIO.h\"\n");
-    fprintf(f, "#include \"rsgApiStructs.h\"\n");
-    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
-    fprintf(f, "#include \"rsFifo.h\"\n");
-    fprintf(f, "\n");
-    fprintf(f, "using namespace android;\n");
-    fprintf(f, "using namespace android::renderscript;\n");
-    fprintf(f, "\n");
-
-    printFuncPointers(f, 0);
-
-    // Generate RS funcs for local fifo
-    for (ct=0; ct < apiCount; ct++) {
-        int needFlush = 0;
-        const ApiEntry * api = &apis[ct];
-
-        fprintf(f, "static ");
-        printFuncDecl(f, api, "LF_", 0, 0);
-        fprintf(f, "\n{\n");
-        if (api->direct) {
-            fprintf(f, "    ");
-            if (api->ret.typeName[0]) {
-                fprintf(f, "return ");
-            }
-            fprintf(f, "rsi_%s(", api->name);
-            if (!api->nocontext) {
-                fprintf(f, "(Context *)rsc");
-            }
-            for (ct2=0; ct2 < api->paramCount; ct2++) {
-                const VarType *vt = &api->params[ct2];
-                if (ct2 > 0 || !api->nocontext) {
-                    fprintf(f, ", ");
-                }
-                fprintf(f, "%s", vt->name);
-            }
-            fprintf(f, ");\n");
-        } else {
-            fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
-            fprintf(f, "    const uint32_t size = sizeof(RS_CMD_%s);\n", api->name);
-            if (hasInlineDataPointers(api)) {
-                fprintf(f, "    uint32_t dataSize = 0;\n");
-                for (ct2=0; ct2 < api->paramCount; ct2++) {
-                    const VarType *vt = &api->params[ct2];
-                    if (vt->isConst && vt->ptrLevel) {
-                        fprintf(f, "    dataSize += %s_length;\n", vt->name);
-                    }
-                }
-            }
-
-            //fprintf(f, "    ALOGE(\"add command %s\\n\");\n", api->name);
-            if (hasInlineDataPointers(api)) {
-                fprintf(f, "    RS_CMD_%s *cmd = NULL;\n", api->name);
-                fprintf(f, "    if (dataSize < io->getMaxInlineSize()) {;\n");
-                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, dataSize + size));\n", api->name, api->name);
-                fprintf(f, "    } else {\n");
-                fprintf(f, "        cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name);
-                fprintf(f, "    }\n");
-                fprintf(f, "    uint8_t *payload = (uint8_t *)&cmd[1];\n");
-            } else {
-                fprintf(f, "    RS_CMD_%s *cmd = static_cast<RS_CMD_%s *>(io->coreHeader(RS_CMD_ID_%s, size));\n", api->name, api->name, api->name);
-            }
-
-            for (ct2=0; ct2 < api->paramCount; ct2++) {
-                const VarType *vt = &api->params[ct2];
-                needFlush += vt->ptrLevel;
-                if (vt->ptrLevel && hasInlineDataPointers(api)) {
-                    fprintf(f, "    if (dataSize < io->getMaxInlineSize()) {\n");
-                    fprintf(f, "        memcpy(payload, %s, %s_length);\n", vt->name, vt->name);
-                    fprintf(f, "        cmd->%s = (", vt->name);
-                    printVarType(f, vt);
-                    fprintf(f, ")(payload - ((uint8_t *)&cmd[1]));\n");
-                    fprintf(f, "        payload += %s_length;\n", vt->name);
-                    fprintf(f, "    } else {\n");
-                    fprintf(f, "        cmd->%s = %s;\n", vt->name, vt->name);
-                    fprintf(f, "    }\n");
-
-                } else {
-                    fprintf(f, "    cmd->%s = %s;\n", vt->name, vt->name);
-                }
-            }
-            if (api->ret.typeName[0] || api->sync) {
-                needFlush = 1;
-            }
-
-            fprintf(f, "    io->coreCommit();\n");
-            if (hasInlineDataPointers(api)) {
-                fprintf(f, "    if (dataSize >= io->getMaxInlineSize()) {\n");
-                fprintf(f, "        io->coreGetReturn(NULL, 0);\n");
-                fprintf(f, "    }\n");
-            } else if (api->ret.typeName[0]) {
-                fprintf(f, "\n    ");
-                printVarType(f, &api->ret);
-                fprintf(f, " ret;\n");
-                fprintf(f, "    io->coreGetReturn(&ret, sizeof(ret));\n");
-                fprintf(f, "    return ret;\n");
-            } else if (needFlush) {
-                fprintf(f, "    io->coreGetReturn(NULL, 0);\n");
-            }
-        }
-        fprintf(f, "};\n\n");
-
-
-        // Generate a remote sender function
-        const char * str = "core";
-        if (api->direct) {
-            str = "async";
-        }
-
-        fprintf(f, "static ");
-        printFuncDecl(f, api, "RF_", 0, 0);
-        fprintf(f, "\n{\n");
-        fprintf(f, "    ThreadIO *io = &((Context *)rsc)->mIO;\n");
-        fprintf(f, "    const uint32_t cmdID = RS_CMD_ID_%s;\n", api->name);
-        fprintf(f, "    io->%sWrite(&cmdID, sizeof(cmdID));\n\n", str);
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if (vt->ptrLevel == 0) {
-                fprintf(f, "    io->%sWrite(& %s, sizeof(%s));\n", str, vt->name, vt->name);
-            }
-        }
-        fprintf(f, "\n");
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if ((vt->ptrLevel == 1) && (vt->isConst)) {
-                fprintf(f, "    io->%sWrite(%s, %s_length);\n", str, vt->name, vt->name);
-            }
-        }
-        fprintf(f, "\n");
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if ((vt->ptrLevel == 2) && (vt->isConst)) {
-                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
-                fprintf(f, "        io->%sWrite(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name);
-                fprintf(f, "    }\n");
-            }
-        }
-        fprintf(f, "\n");
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if ((vt->ptrLevel == 1) && (!vt->isConst)) {
-                fprintf(f, "    io->%sGetReturn(%s, %s_length);\n", str, vt->name, vt->name);
-            }
-        }
-        fprintf(f, "\n");
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if ((vt->ptrLevel == 2) && (!vt->isConst)) {
-                fprintf(f, "    for (size_t ct = 0; ct < (%s_length_length / sizeof(%s_length)); ct++) {\n", vt->name, vt->name);
-                fprintf(f, "        io->%sGetReturn(%s[ct], %s_length[ct]);\n", str, vt->name, vt->name);
-                fprintf(f, "    }\n");
-            }
-        }
-        fprintf(f, "\n");
-
-        if (api->ret.typeName[0]) {
-            fprintf(f, "    ");
-            printVarType(f, &api->ret);
-            fprintf(f, " retValue;\n");
-            fprintf(f, "    io->%sGetReturn(&retValue, sizeof(retValue));\n", str);
-            fprintf(f, "    return retValue;\n");
-        } else /*if (api->sync)*/ {
-            fprintf(f, "    io->%sGetReturn(NULL, 0);\n", str);
-        }
-        fprintf(f, "}\n\n");
-    }
-
-    fprintf(f, "\n");
-    fprintf(f, "static RsApiEntrypoints_t s_LocalTable = {\n");
-    for (ct=0; ct < apiCount; ct++) {
-        fprintf(f, "    LF_%s,\n", apis[ct].name);
-    }
-    fprintf(f, "};\n");
-
-    fprintf(f, "\n");
-    fprintf(f, "static RsApiEntrypoints_t s_RemoteTable = {\n");
-    for (ct=0; ct < apiCount; ct++) {
-        fprintf(f, "    RF_%s,\n", apis[ct].name);
-    }
-    fprintf(f, "};\n");
-
-    fprintf(f, "static RsApiEntrypoints_t *s_CurrentTable = &s_LocalTable;\n\n");
-    for (ct=0; ct < apiCount; ct++) {
-        int needFlush = 0;
-        const ApiEntry * api = &apis[ct];
-
-        printFuncDecl(f, api, "rs", 0, 0);
-        fprintf(f, "\n{\n");
-        fprintf(f, "    ");
-        if (api->ret.typeName[0]) {
-            fprintf(f, "return ");
-        }
-        fprintf(f, "s_CurrentTable->%s(", api->name);
-
-        if (!api->nocontext) {
-            fprintf(f, "(Context *)rsc");
-        }
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if (ct2 > 0 || !api->nocontext) {
-                fprintf(f, ", ");
-            }
-            fprintf(f, "%s", vt->name);
-        }
-        fprintf(f, ");\n");
-        fprintf(f, "}\n\n");
-    }
-
-}
-
-void printPlaybackCpp(FILE *f) {
-    int ct;
-    int ct2;
-
-    fprintf(f, "#include \"rsDevice.h\"\n");
-    fprintf(f, "#include \"rsContext.h\"\n");
-    fprintf(f, "#include \"rsThreadIO.h\"\n");
-    fprintf(f, "#include \"rsgApiStructs.h\"\n");
-    fprintf(f, "#include \"rsgApiFuncDecl.h\"\n");
-    fprintf(f, "\n");
-    fprintf(f, "namespace android {\n");
-    fprintf(f, "namespace renderscript {\n");
-    fprintf(f, "\n");
-
-    for (ct=0; ct < apiCount; ct++) {
-        const ApiEntry * api = &apis[ct];
-        int needFlush = 0;
-
-        if (api->direct) {
-            continue;
-        }
-
-        fprintf(f, "void rsp_%s(Context *con, const void *vp, size_t cmdSizeBytes) {\n", api->name);
-        fprintf(f, "    const RS_CMD_%s *cmd = static_cast<const RS_CMD_%s *>(vp);\n", api->name, api->name);
-
-        if (hasInlineDataPointers(api)) {
-            fprintf(f, "    const uint8_t *baseData = 0;\n");
-            fprintf(f, "    if (cmdSizeBytes != sizeof(RS_CMD_%s)) {\n", api->name);
-            fprintf(f, "        baseData = &((const uint8_t *)vp)[sizeof(*cmd)];\n");
-            fprintf(f, "    }\n");
-        }
-
-        fprintf(f, "    ");
-        if (api->ret.typeName[0]) {
-            fprintf(f, "\n    ");
-            printVarType(f, &api->ret);
-            fprintf(f, " ret = ");
-        }
-        fprintf(f, "rsi_%s(con", api->name);
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            needFlush += vt->ptrLevel;
-
-            if (hasInlineDataPointers(api) && vt->ptrLevel) {
-                fprintf(f, ",\n           (const %s *)&baseData[(intptr_t)cmd->%s]", vt->typeName, vt->name);
-            } else {
-                fprintf(f, ",\n           cmd->%s", vt->name);
-            }
-        }
-        fprintf(f, ");\n");
-
-        if (hasInlineDataPointers(api)) {
-            fprintf(f, "    size_t totalSize = 0;\n");
-            for (ct2=0; ct2 < api->paramCount; ct2++) {
-                if (api->params[ct2].ptrLevel) {
-                    fprintf(f, "    totalSize += cmd->%s_length;\n", api->params[ct2].name);
-                }
-            }
-
-            fprintf(f, "    if ((totalSize != 0) && (cmdSizeBytes == sizeof(RS_CMD_%s))) {\n", api->name);
-            fprintf(f, "        con->mIO.coreSetReturn(NULL, 0);\n");
-            fprintf(f, "    }\n");
-        } else if (api->ret.typeName[0]) {
-            fprintf(f, "    con->mIO.coreSetReturn(&ret, sizeof(ret));\n");
-        } else if (api->sync || needFlush) {
-            fprintf(f, "    con->mIO.coreSetReturn(NULL, 0);\n");
-        }
-
-        fprintf(f, "};\n\n");
-    }
-
-    for (ct=0; ct < apiCount; ct++) {
-        const ApiEntry * api = &apis[ct];
-        int needFlush = 0;
-
-        fprintf(f, "void rspr_%s(Context *con, ThreadIO *io) {\n", api->name);
-        fprintf(f, "    RS_CMD_%s cmd;\n", api->name);
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if (vt->ptrLevel == 0) {
-                fprintf(f, "    io->coreRead(&cmd.%s, sizeof(cmd.%s));\n", vt->name, vt->name);
-            }
-        }
-        fprintf(f, "\n");
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if (vt->ptrLevel == 1) {
-                fprintf(f, "    cmd.%s = (", vt->name);
-                printVarType(f, vt);
-                fprintf(f, ")malloc(cmd.%s_length);\n", vt->name);
-
-                if (vt->isConst) {
-                    fprintf(f, "    if (cmd.%s_length) io->coreRead((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name, vt->name);
-                }
-            }
-        }
-        fprintf(f, "\n");
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if (vt->ptrLevel == 2) {
-                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
-                fprintf(f, "        cmd.%s = (", vt->name);
-                printVarType(f, vt);
-                fprintf(f, ")malloc(cmd.%s_length[ct]);\n", vt->name);
-                fprintf(f, "        io->coreRead(& cmd.%s, cmd.%s_length[ct]);\n", vt->name, vt->name);
-                fprintf(f, "    }\n");
-            }
-        }
-        fprintf(f, "\n");
-
-        if (api->ret.typeName[0]) {
-            fprintf(f, "    ");
-            printVarType(f, &api->ret);
-            fprintf(f, " ret =\n");
-        }
-
-        fprintf(f, "    rsi_%s(", api->name);
-        if (!api->nocontext) {
-            fprintf(f, "con");
-        }
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if (ct2 > 0 || !api->nocontext) {
-                fprintf(f, ",\n");
-            }
-            fprintf(f, "           cmd.%s", vt->name);
-        }
-        fprintf(f, ");\n");
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if ((vt->ptrLevel == 1) && (!vt->isConst)) {
-                fprintf(f, "    io->coreSetReturn((void *)cmd.%s, cmd.%s_length);\n", vt->name, vt->name);
-            }
-        }
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if ((vt->ptrLevel == 2) && (!vt->isConst)) {
-                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
-                fprintf(f, "        io->coreSetReturn((void *)cmd.%s[ct], cmd.%s_length[ct]);\n", vt->name, vt->name);
-                fprintf(f, "    }\n");
-            }
-        }
-        fprintf(f, "\n");
-
-        if (api->ret.typeName[0]) {
-            fprintf(f, "    io->coreSetReturn(&ret, sizeof(ret));\n");
-        } else /*if (needFlush)*/ {
-            fprintf(f, "    io->coreSetReturn(NULL, 0);\n");
-        }
-
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if (vt->ptrLevel == 1) {
-                fprintf(f, "    free((void *)cmd.%s);\n", vt->name);
-            }
-        }
-        for (ct2=0; ct2 < api->paramCount; ct2++) {
-            const VarType *vt = &api->params[ct2];
-            if (vt->ptrLevel == 2) {
-                fprintf(f, "    for (size_t ct = 0; ct < (cmd.%s_length_length / sizeof(cmd.%s_length)); ct++) {\n", vt->name, vt->name);
-                fprintf(f, "        free((void *)cmd.%s);\n", vt->name);
-                fprintf(f, "    }\n");
-            }
-        }
-
-        fprintf(f, "};\n\n");
-    }
-
-    fprintf(f, "RsPlaybackLocalFunc gPlaybackFuncs[%i] = {\n", apiCount + 1);
-    fprintf(f, "    NULL,\n");
-    for (ct=0; ct < apiCount; ct++) {
-        if (apis[ct].direct) {
-            fprintf(f, "    NULL,\n");
-        } else {
-            fprintf(f, "    %s%s,\n", "rsp_", apis[ct].name);
-        }
-    }
-    fprintf(f, "};\n");
-
-    fprintf(f, "RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i] = {\n", apiCount + 1);
-    fprintf(f, "    NULL,\n");
-    for (ct=0; ct < apiCount; ct++) {
-        fprintf(f, "    %s%s,\n", "rspr_", apis[ct].name);
-    }
-    fprintf(f, "};\n");
-
-    fprintf(f, "};\n");
-    fprintf(f, "};\n");
-}
-
-void yylex();
-
-int main(int argc, char **argv) {
-    if (argc != 3) {
-        fprintf(stderr, "usage: %s commandFile outFile\n", argv[0]);
-        return 1;
-    }
-    const char* rsgFile = argv[1];
-    const char* outFile = argv[2];
-    FILE* input = fopen(rsgFile, "r");
-
-    char choice = fgetc(input);
-    fclose(input);
-
-    if (choice < '0' || choice > '3') {
-        fprintf(stderr, "Uknown command: \'%c\'\n", choice);
-        return -2;
-    }
-
-    yylex();
-    // printf("# of lines = %d\n", num_lines);
-
-    FILE *f = fopen(outFile, "w");
-
-    printFileHeader(f);
-    switch (choice) {
-        case '0': // rsgApiStructs.h
-        {
-            fprintf(f, "\n");
-            fprintf(f, "#include \"rsContext.h\"\n");
-            fprintf(f, "#include \"rsFifo.h\"\n");
-            fprintf(f, "\n");
-            fprintf(f, "namespace android {\n");
-            fprintf(f, "namespace renderscript {\n");
-            printStructures(f);
-            printFuncDecls(f, "rsi_", 1);
-            printPlaybackFuncs(f, "rsp_");
-            fprintf(f, "\n\ntypedef struct RsPlaybackRemoteHeaderRec {\n");
-            fprintf(f, "    uint32_t command;\n");
-            fprintf(f, "    uint32_t size;\n");
-            fprintf(f, "} RsPlaybackRemoteHeader;\n\n");
-            fprintf(f, "typedef void (*RsPlaybackLocalFunc)(Context *, const void *, size_t sizeBytes);\n");
-            fprintf(f, "typedef void (*RsPlaybackRemoteFunc)(Context *, ThreadIO *);\n");
-            fprintf(f, "extern RsPlaybackLocalFunc gPlaybackFuncs[%i];\n", apiCount + 1);
-            fprintf(f, "extern RsPlaybackRemoteFunc gPlaybackRemoteFuncs[%i];\n", apiCount + 1);
-
-            fprintf(f, "}\n");
-            fprintf(f, "}\n");
-        }
-        break;
-
-        case '1': // rsgApiFuncDecl.h
-        {
-            printFuncDecls(f, "rs", 0);
-        }
-        break;
-
-        case '2': // rsgApi.cpp
-        {
-            printApiCpp(f);
-        }
-        break;
-
-        case '3': // rsgApiReplay.cpp
-        {
-            printFileHeader(f);
-            printPlaybackCpp(f);
-        }
-        break;
-
-        case '4': // rsgApiStream.cpp
-        {
-            printFileHeader(f);
-            printPlaybackCpp(f);
-        }
-
-        case '5': // rsgApiStreamReplay.cpp
-        {
-            printFileHeader(f);
-            printPlaybackCpp(f);
-        }
-        break;
-    }
-    fclose(f);
-    return 0;
-}
diff --git a/libs/rs/scriptc/rs_allocation.rsh b/libs/rs/scriptc/rs_allocation.rsh
deleted file mode 100644
index b0840a0..0000000
--- a/libs/rs/scriptc/rs_allocation.rsh
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_allocation.rsh
- *  \brief Allocation routines
- *
- *
- */
-
-#ifndef __RS_ALLOCATION_RSH__
-#define __RS_ALLOCATION_RSH__
-
-/**
- * Returns the Allocation for a given pointer.  The pointer should point within
- * a valid allocation.  The results are undefined if the pointer is not from a
- * valid allocation.
- */
-extern rs_allocation __attribute__((overloadable))
-    rsGetAllocation(const void *);
-
-/**
- * Query the dimension of an allocation.
- *
- * @return uint32_t The X dimension of the allocation.
- */
-extern uint32_t __attribute__((overloadable))
-    rsAllocationGetDimX(rs_allocation);
-
-/**
- * Query the dimension of an allocation.
- *
- * @return uint32_t The Y dimension of the allocation.
- */
-extern uint32_t __attribute__((overloadable))
-    rsAllocationGetDimY(rs_allocation);
-
-/**
- * Query the dimension of an allocation.
- *
- * @return uint32_t The Z dimension of the allocation.
- */
-extern uint32_t __attribute__((overloadable))
-    rsAllocationGetDimZ(rs_allocation);
-
-/**
- * Query an allocation for the presence of more than one LOD.
- *
- * @return uint32_t Returns 1 if more than one LOD is present, 0 otherwise.
- */
-extern uint32_t __attribute__((overloadable))
-    rsAllocationGetDimLOD(rs_allocation);
-
-/**
- * Query an allocation for the presence of more than one face.
- *
- * @return uint32_t Returns 1 if more than one face is present, 0 otherwise.
- */
-extern uint32_t __attribute__((overloadable))
-    rsAllocationGetDimFaces(rs_allocation);
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 14))
-
-/**
- * Copy part of an allocation from another allocation.
- *
- * @param dstAlloc Allocation to copy data into.
- * @param dstOff The offset of the first element to be copied in
- *               the destination allocation.
- * @param dstMip Mip level in the destination allocation.
- * @param count The number of elements to be copied.
- * @param srcAlloc The source data allocation.
- * @param srcOff The offset of the first element in data to be
- *               copied in the source allocation.
- * @param srcMip Mip level in the source allocation.
- */
-extern void __attribute__((overloadable))
-    rsAllocationCopy1DRange(rs_allocation dstAlloc,
-                            uint32_t dstOff, uint32_t dstMip,
-                            uint32_t count,
-                            rs_allocation srcAlloc,
-                            uint32_t srcOff, uint32_t srcMip);
-
-/**
- * Copy a rectangular region into the allocation from another
- * allocation.
- *
- * @param dstAlloc allocation to copy data into.
- * @param dstXoff X offset of the region to update in the
- *                destination allocation.
- * @param dstYoff Y offset of the region to update in the
- *                destination allocation.
- * @param dstMip Mip level in the destination allocation.
- * @param dstFace Cubemap face of the destination allocation,
- *                ignored for allocations that aren't cubemaps.
- * @param width Width of the incoming region to update.
- * @param height Height of the incoming region to update.
- * @param srcAlloc The source data allocation.
- * @param srcXoff X offset in data of the source allocation.
- * @param srcYoff Y offset in data of the source allocation.
- * @param srcMip Mip level in the source allocation.
- * @param srcFace Cubemap face of the source allocation,
- *                ignored for allocations that aren't cubemaps.
- */
-extern void __attribute__((overloadable))
-    rsAllocationCopy2DRange(rs_allocation dstAlloc,
-                            uint32_t dstXoff, uint32_t dstYoff,
-                            uint32_t dstMip,
-                            rs_allocation_cubemap_face dstFace,
-                            uint32_t width, uint32_t height,
-                            rs_allocation srcAlloc,
-                            uint32_t srcXoff, uint32_t srcYoff,
-                            uint32_t srcMip,
-                            rs_allocation_cubemap_face srcFace);
-
-#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
-
-/**
- * Extract a single element from an allocation.
- */
-extern const void * __attribute__((overloadable))
-    rsGetElementAt(rs_allocation, uint32_t x);
-/**
- * \overload
- */
-extern const void * __attribute__((overloadable))
-    rsGetElementAt(rs_allocation, uint32_t x, uint32_t y);
-/**
- * \overload
- */
-extern const void * __attribute__((overloadable))
-    rsGetElementAt(rs_allocation, uint32_t x, uint32_t y, uint32_t z);
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-/**
- * @param a allocation to get data from
- * @return element describing allocation layout
- */
-extern rs_element __attribute__((overloadable))
-    rsAllocationGetElement(rs_allocation a);
-
-/**
- * Fetch allocation in a way described by the sampler
- * @param a 1D allocation to sample from
- * @param s sampler state
- * @param location to sample from
- */
-extern const float4 __attribute__((overloadable))
-    rsSample(rs_allocation a, rs_sampler s, float location);
-/**
- * Fetch allocation in a way described by the sampler
- * @param a 1D allocation to sample from
- * @param s sampler state
- * @param location to sample from
- * @param lod mip level to sample from, for fractional values
- *            mip levels will be interpolated if
- *            RS_SAMPLER_LINEAR_MIP_LINEAR is used
- */
-extern const float4 __attribute__((overloadable))
-    rsSample(rs_allocation a, rs_sampler s, float location, float lod);
-
-/**
- * Fetch allocation in a way described by the sampler
- * @param a 2D allocation to sample from
- * @param s sampler state
- * @param location to sample from
- */
-extern const float4 __attribute__((overloadable))
-    rsSample(rs_allocation a, rs_sampler s, float2 location);
-
-/**
- * Fetch allocation in a way described by the sampler
- * @param a 2D allocation to sample from
- * @param s sampler state
- * @param location to sample from
- * @param lod mip level to sample from, for fractional values
- *            mip levels will be interpolated if
- *            RS_SAMPLER_LINEAR_MIP_LINEAR is used
- */
-extern const float4 __attribute__((overloadable))
-    rsSample(rs_allocation a, rs_sampler s, float2 location, float lod);
-
-#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-#endif
-
diff --git a/libs/rs/scriptc/rs_atomic.rsh b/libs/rs/scriptc/rs_atomic.rsh
deleted file mode 100644
index a455edd..0000000
--- a/libs/rs/scriptc/rs_atomic.rsh
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_atomic.rsh
- *  \brief Atomic routines
- *
- *
- */
-
-#ifndef __RS_ATOMIC_RSH__
-#define __RS_ATOMIC_RSH__
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 14))
-
-/**
- * Atomic add one to the value at addr.
- * Equal to rsAtomicAdd(addr, 1)
- *
- * @param addr Address of value to increment
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicInc(volatile int32_t* addr);
-/**
- * Atomic add one to the value at addr.
- * Equal to rsAtomicAdd(addr, 1)
- *
- * @param addr Address of value to increment
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicInc(volatile uint32_t* addr);
-
-/**
- * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1)
- *
- * @param addr Address of value to decrement
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicDec(volatile int32_t* addr);
-/**
- * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1)
- *
- * @param addr Address of value to decrement
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicDec(volatile uint32_t* addr);
-
-/**
- * Atomic add a value to the value at addr.  addr[0] += value
- *
- * @param addr Address of value to modify
- * @param value Amount to add to the value at addr
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicAdd(volatile int32_t* addr, int32_t value);
-/**
- * Atomic add a value to the value at addr.  addr[0] += value
- *
- * @param addr Address of value to modify
- * @param value Amount to add to the value at addr
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicAdd(volatile uint32_t* addr, uint32_t value);
-
-/**
- * Atomic Subtract a value from the value at addr.  addr[0] -= value
- *
- * @param addr Address of value to modify
- * @param value Amount to subtract from the value at addr
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicSub(volatile int32_t* addr, int32_t value);
-/**
- * Atomic Subtract a value from the value at addr.  addr[0] -= value
- *
- * @param addr Address of value to modify
- * @param value Amount to subtract from the value at addr
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicSub(volatile uint32_t* addr, uint32_t value);
-
-/**
- * Atomic Bitwise and a value from the value at addr.  addr[0] &= value
- *
- * @param addr Address of value to modify
- * @param value Amount to and with the value at addr
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicAnd(volatile int32_t* addr, int32_t value);
-/**
- * Atomic Bitwise and a value from the value at addr.  addr[0] &= value
- *
- * @param addr Address of value to modify
- * @param value Amount to and with the value at addr
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicAnd(volatile uint32_t* addr, uint32_t value);
-
-/**
- * Atomic Bitwise or a value from the value at addr.  addr[0] |= value
- *
- * @param addr Address of value to modify
- * @param value Amount to or with the value at addr
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicOr(volatile int32_t* addr, int32_t value);
-/**
- * Atomic Bitwise or a value from the value at addr.  addr[0] |= value
- *
- * @param addr Address of value to modify
- * @param value Amount to or with the value at addr
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicOr(volatile uint32_t* addr, uint32_t value);
-
-/**
- * Atomic Bitwise xor a value from the value at addr.  addr[0] ^= value
- *
- * @param addr Address of value to modify
- * @param value Amount to xor with the value at addr
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicXor(volatile uint32_t* addr, uint32_t value);
-/**
- * Atomic Bitwise xor a value from the value at addr.  addr[0] ^= value
- *
- * @param addr Address of value to modify
- * @param value Amount to xor with the value at addr
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicXor(volatile int32_t* addr, int32_t value);
-
-/**
- * Atomic Set the value at addr to the min of addr and value
- * addr[0] = rsMin(addr[0], value)
- *
- * @param addr Address of value to modify
- * @param value comparison value
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicMin(volatile uint32_t* addr, uint32_t value);
-/**
- * Atomic Set the value at addr to the min of addr and value
- * addr[0] = rsMin(addr[0], value)
- *
- * @param addr Address of value to modify
- * @param value comparison value
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicMin(volatile int32_t* addr, int32_t value);
-
-/**
- * Atomic Set the value at addr to the max of addr and value
- * addr[0] = rsMax(addr[0], value)
- *
- * @param addr Address of value to modify
- * @param value comparison value
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicMax(volatile uint32_t* addr, uint32_t value);
-/**
- * Atomic Set the value at addr to the max of addr and value
- * addr[0] = rsMin(addr[0], value)
- *
- * @param addr Address of value to modify
- * @param value comparison value
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicMax(volatile int32_t* addr, int32_t value);
-
-/**
- * Compare-and-set operation with a full memory barrier.
- *
- * If the value at addr matches compareValue then newValue is written.
- *
- * @param addr The address to compare and replace if the compare passes.
- * @param compareValue The value to test addr[0] against.
- * @param newValue The value to write if the test passes.
- *
- * @return old value
- */
-extern int32_t __attribute__((overloadable))
-    rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue);
-
-/**
- * Compare-and-set operation with a full memory barrier.
- *
- * If the value at addr matches compareValue then newValue is written.
- *
- * @param addr The address to compare and replace if the compare passes.
- * @param compareValue The value to test addr[0] against.
- * @param newValue The value to write if the test passes.
- *
- * @return old value
- */
-extern uint32_t __attribute__((overloadable))
-    rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue);
-
-#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
-
-#endif
-
diff --git a/libs/rs/scriptc/rs_cl.rsh b/libs/rs/scriptc/rs_cl.rsh
deleted file mode 100644
index bbc8fc5..0000000
--- a/libs/rs/scriptc/rs_cl.rsh
+++ /dev/null
@@ -1,867 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_cl.rsh
- *  \brief Basic math functions
- *
- *
- */
-
-#ifndef __RS_CL_RSH__
-#define __RS_CL_RSH__
-
-// Conversions
-#define CVT_FUNC_2(typeout, typein)                             \
-_RS_RUNTIME typeout##2 __attribute__((overloadable))             \
-        convert_##typeout##2(typein##2 v);                      \
-_RS_RUNTIME typeout##3 __attribute__((overloadable))             \
-        convert_##typeout##3(typein##3 v);                      \
-_RS_RUNTIME typeout##4 __attribute__((overloadable))             \
-        convert_##typeout##4(typein##4 v);
-
-
-#define CVT_FUNC(type)  CVT_FUNC_2(type, uchar)     \
-                        CVT_FUNC_2(type, char)      \
-                        CVT_FUNC_2(type, ushort)    \
-                        CVT_FUNC_2(type, short)     \
-                        CVT_FUNC_2(type, uint)      \
-                        CVT_FUNC_2(type, int)       \
-                        CVT_FUNC_2(type, float)
-
-CVT_FUNC(char)
-CVT_FUNC(uchar)
-CVT_FUNC(short)
-CVT_FUNC(ushort)
-CVT_FUNC(int)
-CVT_FUNC(uint)
-CVT_FUNC(float)
-
-// Float ops, 6.11.2
-
-#define FN_FUNC_FN(fnc)                                         \
-_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v);  \
-_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v);  \
-_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v);
-
-#define IN_FUNC_FN(fnc)                                         \
-_RS_RUNTIME int2 __attribute__((overloadable)) fnc(float2 v);    \
-_RS_RUNTIME int3 __attribute__((overloadable)) fnc(float3 v);    \
-_RS_RUNTIME int4 __attribute__((overloadable)) fnc(float4 v);
-
-#define FN_FUNC_FN_FN(fnc)                                                  \
-_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, float2 v2);  \
-_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, float3 v2);  \
-_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, float4 v2);
-
-#define FN_FUNC_FN_F(fnc)                                                   \
-_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, float v2);   \
-_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, float v2);   \
-_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, float v2);
-
-#define FN_FUNC_FN_IN(fnc)                                                  \
-_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, int2 v2);    \
-_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, int3 v2);    \
-_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, int4 v2);    \
-
-#define FN_FUNC_FN_I(fnc)                                                   \
-_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, int v2);     \
-_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, int v2);     \
-_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, int v2);
-
-#define FN_FUNC_FN_PFN(fnc)                     \
-_RS_RUNTIME float2 __attribute__((overloadable)) \
-        fnc(float2 v1, float2 *v2);             \
-_RS_RUNTIME float3 __attribute__((overloadable)) \
-        fnc(float3 v1, float3 *v2);             \
-_RS_RUNTIME float4 __attribute__((overloadable)) \
-        fnc(float4 v1, float4 *v2);
-
-#define FN_FUNC_FN_PIN(fnc)                                                 \
-_RS_RUNTIME float2 __attribute__((overloadable)) fnc(float2 v1, int2 *v2);   \
-_RS_RUNTIME float3 __attribute__((overloadable)) fnc(float3 v1, int3 *v2);   \
-_RS_RUNTIME float4 __attribute__((overloadable)) fnc(float4 v1, int4 *v2);
-
-#define FN_FUNC_FN_FN_FN(fnc)                   \
-_RS_RUNTIME float2 __attribute__((overloadable)) \
-        fnc(float2 v1, float2 v2, float2 v3);   \
-_RS_RUNTIME float3 __attribute__((overloadable)) \
-        fnc(float3 v1, float3 v2, float3 v3);   \
-_RS_RUNTIME float4 __attribute__((overloadable)) \
-        fnc(float4 v1, float4 v2, float4 v3);
-
-#define FN_FUNC_FN_FN_PIN(fnc)                  \
-_RS_RUNTIME float2 __attribute__((overloadable)) \
-        fnc(float2 v1, float2 v2, int2 *v3);    \
-_RS_RUNTIME float3 __attribute__((overloadable)) \
-        fnc(float3 v1, float3 v2, int3 *v3);    \
-_RS_RUNTIME float4 __attribute__((overloadable)) \
-        fnc(float4 v1, float4 v2, int4 *v3);
-
-
-/**
- * Return the inverse cosine.
- *
- * Supports float, float2, float3, float4
- */
-extern float __attribute__((overloadable)) acos(float);
-FN_FUNC_FN(acos)
-
-/**
- * Return the inverse hyperbolic cosine.
- *
- * Supports float, float2, float3, float4
- */
-extern float __attribute__((overloadable)) acosh(float);
-FN_FUNC_FN(acosh)
-
-/**
- * Return the inverse cosine divided by PI.
- *
- * Supports float, float2, float3, float4
- */
-_RS_RUNTIME float __attribute__((overloadable)) acospi(float v);
-FN_FUNC_FN(acospi)
-
-/**
- * Return the inverse sine.
- *
- * Supports float, float2, float3, float4
- */
-extern float __attribute__((overloadable)) asin(float);
-FN_FUNC_FN(asin)
-
-/**
- * Return the inverse hyperbolic sine.
- *
- * Supports float, float2, float3, float4
- */
-extern float __attribute__((overloadable)) asinh(float);
-FN_FUNC_FN(asinh)
-
-
-/**
- * Return the inverse sine divided by PI.
- *
- * Supports float, float2, float3, float4
- */
-_RS_RUNTIME float __attribute__((overloadable)) asinpi(float v);
-FN_FUNC_FN(asinpi)
-
-/**
- * Return the inverse tangent.
- *
- * Supports float, float2, float3, float4
- */
-extern float __attribute__((overloadable)) atan(float);
-FN_FUNC_FN(atan)
-
-/**
- * Return the inverse tangent of y / x.
- *
- * Supports float, float2, float3, float4.  Both arguments must be of the same
- * type.
- *
- * @param y
- * @param x
- */
-extern float __attribute__((overloadable)) atan2(float y, float x);
-FN_FUNC_FN_FN(atan2)
-
-/**
- * Return the inverse hyperbolic tangent.
- *
- * Supports float, float2, float3, float4
- */
-extern float __attribute__((overloadable)) atanh(float);
-FN_FUNC_FN(atanh)
-
-/**
- * Return the inverse tangent divided by PI.
- *
- * Supports float, float2, float3, float4
- */
-_RS_RUNTIME float __attribute__((overloadable)) atanpi(float v);
-FN_FUNC_FN(atanpi)
-
-/**
- * Return the inverse tangent of y / x, divided by PI.
- *
- * Supports float, float2, float3, float4.  Both arguments must be of the same
- * type.
- *
- * @param y
- * @param x
- */
-_RS_RUNTIME float __attribute__((overloadable)) atan2pi(float y, float x);
-FN_FUNC_FN_FN(atan2pi)
-
-
-/**
- * Return the cube root.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) cbrt(float);
-FN_FUNC_FN(cbrt)
-
-/**
- * Return the smallest integer not less than a value.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) ceil(float);
-FN_FUNC_FN(ceil)
-
-/**
- * Copy the sign bit from y to x.
- *
- * Supports float, float2, float3, float4.  Both arguments must be of the same
- * type.
- *
- * @param x
- * @param y
- */
-extern float __attribute__((overloadable)) copysign(float x, float y);
-FN_FUNC_FN_FN(copysign)
-
-/**
- * Return the cosine.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) cos(float);
-FN_FUNC_FN(cos)
-
-/**
- * Return the hypebolic cosine.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) cosh(float);
-FN_FUNC_FN(cosh)
-
-/**
- * Return the cosine of the value * PI.
- *
- * Supports float, float2, float3, float4.
- */
-_RS_RUNTIME float __attribute__((overloadable)) cospi(float v);
-FN_FUNC_FN(cospi)
-
-/**
- * Return the complementary error function.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) erfc(float);
-FN_FUNC_FN(erfc)
-
-/**
- * Return the error function.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) erf(float);
-FN_FUNC_FN(erf)
-
-/**
- * Return e ^ value.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) exp(float);
-FN_FUNC_FN(exp)
-
-/**
- * Return 2 ^ value.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) exp2(float);
-FN_FUNC_FN(exp2)
-
-/**
- * Return x ^ y.
- *
- * Supports float, float2, float3, float4. Both arguments must be of the same
- * type.
- */
-extern float __attribute__((overloadable)) pow(float x, float y);
-FN_FUNC_FN_FN(pow)
-
-/**
- * Return 10 ^ value.
- *
- * Supports float, float2, float3, float4.
- */
-_RS_RUNTIME float __attribute__((overloadable)) exp10(float v);
-FN_FUNC_FN(exp10)
-
-/**
- * Return (e ^ value) - 1.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) expm1(float);
-FN_FUNC_FN(expm1)
-
-/**
- * Return the absolute value of a value.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) fabs(float);
-FN_FUNC_FN(fabs)
-
-/**
- * Return the positive difference between two values.
- *
- * Supports float, float2, float3, float4.  Both arguments must be of the same
- * type.
- */
-extern float __attribute__((overloadable)) fdim(float, float);
-FN_FUNC_FN_FN(fdim)
-
-/**
- * Return the smallest integer not greater than a value.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) floor(float);
-FN_FUNC_FN(floor)
-
-/**
- * Return a*b + c.
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) fma(float a, float b, float c);
-FN_FUNC_FN_FN_FN(fma)
-
-/**
- * Return (x < y ? y : x)
- *
- * Supports float, float2, float3, float4.
- * @param x: may be float, float2, float3, float4
- * @param y: may be float or vector.  If vector must match type of x.
- */
-extern float __attribute__((overloadable)) fmax(float x, float y);
-FN_FUNC_FN_FN(fmax);
-FN_FUNC_FN_F(fmax);
-
-/**
- * Return (x > y ? y : x)
- *
- * @param x: may be float, float2, float3, float4
- * @param y: may be float or vector.  If vector must match type of x.
- */
-extern float __attribute__((overloadable)) fmin(float x, float y);
-FN_FUNC_FN_FN(fmin);
-FN_FUNC_FN_F(fmin);
-
-/**
- * Return the remainder from x / y
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) fmod(float x, float y);
-FN_FUNC_FN_FN(fmod)
-
-
-/**
- * Return fractional part of v
- *
- * @param iptr  iptr[0] will be set to the floor of the input value.
- * Supports float, float2, float3, float4.
- */
-_RS_RUNTIME float __attribute__((overloadable)) fract(float v, float *iptr);
-FN_FUNC_FN_PFN(fract)
-
-/**
- * Return the mantissa and place the exponent into iptr[0]
- *
- * @param v Supports float, float2, float3, float4.
- * @param iptr  Must have the same vector size as v.
- */
-extern float __attribute__((overloadable)) frexp(float v, int *iptr);
-FN_FUNC_FN_PIN(frexp)
-
-/**
- * Return sqrt(x*x + y*y)
- *
- * Supports float, float2, float3, float4.
- */
-extern float __attribute__((overloadable)) hypot(float x, float y);
-FN_FUNC_FN_FN(hypot)
-
-/**
- * Return the integer exponent of a value
- *
- * Supports 1,2,3,4 components
- */
-extern int __attribute__((overloadable)) ilogb(float);
-IN_FUNC_FN(ilogb)
-
-/**
- * Return (x * 2^y)
- *
- * @param x Supports 1,2,3,4 components
- * @param y Supports single component or matching vector.
- */
-extern float __attribute__((overloadable)) ldexp(float x, int y);
-FN_FUNC_FN_IN(ldexp)
-FN_FUNC_FN_I(ldexp)
-
-/**
- * Return the log gamma
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) lgamma(float);
-FN_FUNC_FN(lgamma)
-
-/**
- * Return the log gamma and sign
- *
- * @param x Supports 1,2,3,4 components
- * @param y Supports matching vector.
- */
-extern float __attribute__((overloadable)) lgamma(float x, int* y);
-FN_FUNC_FN_PIN(lgamma)
-
-/**
- * Return the natural logarithm
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) log(float);
-FN_FUNC_FN(log)
-
-/**
- * Return the base 10 logarithm
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) log10(float);
-FN_FUNC_FN(log10)
-
-/**
- * Return the base 2 logarithm
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) log2(float v);
-FN_FUNC_FN(log2)
-
-/**
- * Return the natural logarithm of (v + 1.0f)
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) log1p(float v);
-FN_FUNC_FN(log1p)
-
-/**
- * Compute the exponent of the value.
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) logb(float);
-FN_FUNC_FN(logb)
-
-/**
- * Compute (a * b) + c
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) mad(float a, float b, float c);
-FN_FUNC_FN_FN_FN(mad)
-
-/**
- * Return the integral and fractional components of a number
- * Supports 1,2,3,4 components
- *
- * @param x Source value
- * @param iret iret[0] will be set to the integral portion of the number.
- * @return The floating point portion of the value.
- */
-extern float __attribute__((overloadable)) modf(float x, float *iret);
-FN_FUNC_FN_PFN(modf);
-
-//extern float __attribute__((overloadable)) nan(uint);
-
-/**
- * Return the next floating point number from x towards y.
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) nextafter(float x, float y);
-FN_FUNC_FN_FN(nextafter)
-
-/**
- * Return (v ^ p).
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) pown(float v, int p);
-FN_FUNC_FN_IN(pown)
-
-/**
- * Return (v ^ p).
- * @param v must be greater than 0.
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) powr(float v, float p);
-FN_FUNC_FN_FN(powr)
-
-/**
- * Return round x/y to the nearest integer then compute the remander.
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) remainder(float x, float y);
-FN_FUNC_FN_FN(remainder)
-
-// document once we know the precision of bionic
-extern float __attribute__((overloadable)) remquo(float, float, int *);
-FN_FUNC_FN_FN_PIN(remquo)
-
-/**
- * Round to the nearest integral value.
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) rint(float);
-FN_FUNC_FN(rint)
-
-/**
- * Compute the Nth root of a value.
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) rootn(float v, int n);
-FN_FUNC_FN_IN(rootn)
-
-/**
- * Round to the nearest integral value.  Half values are rounded away from zero.
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) round(float);
-FN_FUNC_FN(round)
-
-/**
- * Return the square root of a value.
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) sqrt(float);
-FN_FUNC_FN(sqrt)
-
-/**
- * Return (1 / sqrt(value)).
- *
- * @param v The incoming value in radians
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) rsqrt(float v);
-FN_FUNC_FN(rsqrt)
-
-/**
- * Return the sine of a value specified in radians.
- *
- * @param v The incoming value in radians
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) sin(float v);
-FN_FUNC_FN(sin)
-
-/**
- * Return the sine and cosine of a value.
- *
- * @return sine
- * @param v The incoming value in radians
- * @param *cosptr cosptr[0] will be set to the cosine value.
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) sincos(float v, float *cosptr);
-FN_FUNC_FN_PFN(sincos);
-
-/**
- * Return the hyperbolic sine of a value specified in radians.
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) sinh(float);
-FN_FUNC_FN(sinh)
-
-/**
- * Return the sin(v * PI).
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) sinpi(float v);
-FN_FUNC_FN(sinpi)
-
-/**
- * Return the tangent of a value.
- *
- * Supports 1,2,3,4 components
- * @param v The incoming value in radians
- */
-extern float __attribute__((overloadable)) tan(float v);
-FN_FUNC_FN(tan)
-
-/**
- * Return the hyperbolic tangent of a value.
- *
- * Supports 1,2,3,4 components
- * @param v The incoming value in radians
- */
-extern float __attribute__((overloadable)) tanh(float);
-FN_FUNC_FN(tanh)
-
-/**
- * Return tan(v * PI)
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) tanpi(float v);
-FN_FUNC_FN(tanpi)
-
-/**
- * Compute the gamma function of a value.
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) tgamma(float);
-FN_FUNC_FN(tgamma)
-
-/**
- * Round to integral using truncation.
- *
- * Supports 1,2,3,4 components
- */
-extern float __attribute__((overloadable)) trunc(float);
-FN_FUNC_FN(trunc)
-
-
-#define XN_FUNC_YN(typeout, fnc, typein)                                \
-extern typeout __attribute__((overloadable)) fnc(typein);               \
-_RS_RUNTIME typeout##2 __attribute__((overloadable)) fnc(typein##2 v);   \
-_RS_RUNTIME typeout##3 __attribute__((overloadable)) fnc(typein##3 v);   \
-_RS_RUNTIME typeout##4 __attribute__((overloadable)) fnc(typein##4 v);
-
-#define UIN_FUNC_IN(fnc)          \
-XN_FUNC_YN(uchar, fnc, char)      \
-XN_FUNC_YN(ushort, fnc, short)    \
-XN_FUNC_YN(uint, fnc, int)
-
-#define IN_FUNC_IN(fnc)           \
-XN_FUNC_YN(uchar, fnc, uchar)     \
-XN_FUNC_YN(char, fnc, char)       \
-XN_FUNC_YN(ushort, fnc, ushort)   \
-XN_FUNC_YN(short, fnc, short)     \
-XN_FUNC_YN(uint, fnc, uint)       \
-XN_FUNC_YN(int, fnc, int)
-
-
-#define XN_FUNC_XN_XN_BODY(type, fnc, body)         \
-_RS_RUNTIME type __attribute__((overloadable))       \
-        fnc(type v1, type v2);                      \
-_RS_RUNTIME type##2 __attribute__((overloadable))    \
-        fnc(type##2 v1, type##2 v2);                \
-_RS_RUNTIME type##3 __attribute__((overloadable))    \
-        fnc(type##3 v1, type##3 v2);                \
-_RS_RUNTIME type##4 __attribute__((overloadable))    \
-        fnc(type##4 v1, type##4 v2);
-
-#define IN_FUNC_IN_IN_BODY(fnc, body) \
-XN_FUNC_XN_XN_BODY(uchar, fnc, body)  \
-XN_FUNC_XN_XN_BODY(char, fnc, body)   \
-XN_FUNC_XN_XN_BODY(ushort, fnc, body) \
-XN_FUNC_XN_XN_BODY(short, fnc, body)  \
-XN_FUNC_XN_XN_BODY(uint, fnc, body)   \
-XN_FUNC_XN_XN_BODY(int, fnc, body)    \
-XN_FUNC_XN_XN_BODY(float, fnc, body)
-
-UIN_FUNC_IN(abs)
-IN_FUNC_IN(clz)
-
-/**
- * Return the minimum of two values.
- *
- * Supports 1,2,3,4 components of uchar, char, ushort, short, uint, int, float.
- */
-IN_FUNC_IN_IN_BODY(min, (v1 < v2 ? v1 : v2))
-FN_FUNC_FN_F(min)
-
-/**
- * Return the maximum of two values.
- *
- * Supports 1,2,3,4 components of uchar, char, ushort, short, uint, int, float.
- */
-IN_FUNC_IN_IN_BODY(max, (v1 > v2 ? v1 : v2))
-FN_FUNC_FN_F(max)
-
-/**
- *  Clamp a value to a specified high and low bound.
- *
- * @param amount value to be clamped.  Supports 1,2,3,4 components
- * @param low Lower bound, must be scalar or matching vector.
- * @param high High bound, must match type of low
- */
-_RS_RUNTIME float __attribute__((overloadable)) clamp(float amount, float low, float high);
-_RS_RUNTIME float2 __attribute__((overloadable)) clamp(float2 amount, float2 low, float2 high);
-_RS_RUNTIME float3 __attribute__((overloadable)) clamp(float3 amount, float3 low, float3 high);
-_RS_RUNTIME float4 __attribute__((overloadable)) clamp(float4 amount, float4 low, float4 high);
-_RS_RUNTIME float2 __attribute__((overloadable)) clamp(float2 amount, float low, float high);
-_RS_RUNTIME float3 __attribute__((overloadable)) clamp(float3 amount, float low, float high);
-_RS_RUNTIME float4 __attribute__((overloadable)) clamp(float4 amount, float low, float high);
-
-/**
- * Convert from radians to degrees.
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) degrees(float radians);
-FN_FUNC_FN(degrees)
-
-/**
- * return start + ((stop - start) * amount);
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) mix(float start, float stop, float amount);
-_RS_RUNTIME float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float2 amount);
-_RS_RUNTIME float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float3 amount);
-_RS_RUNTIME float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float4 amount);
-_RS_RUNTIME float2 __attribute__((overloadable)) mix(float2 start, float2 stop, float amount);
-_RS_RUNTIME float3 __attribute__((overloadable)) mix(float3 start, float3 stop, float amount);
-_RS_RUNTIME float4 __attribute__((overloadable)) mix(float4 start, float4 stop, float amount);
-
-/**
- * Convert from degrees to radians.
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) radians(float degrees);
-FN_FUNC_FN(radians)
-
-/**
- * if (v < edge)
- *     return 0.f;
- * else
- *     return 1.f;
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) step(float edge, float v);
-_RS_RUNTIME float2 __attribute__((overloadable)) step(float2 edge, float2 v);
-_RS_RUNTIME float3 __attribute__((overloadable)) step(float3 edge, float3 v);
-_RS_RUNTIME float4 __attribute__((overloadable)) step(float4 edge, float4 v);
-_RS_RUNTIME float2 __attribute__((overloadable)) step(float2 edge, float v);
-_RS_RUNTIME float3 __attribute__((overloadable)) step(float3 edge, float v);
-_RS_RUNTIME float4 __attribute__((overloadable)) step(float4 edge, float v);
-
-// not implemented
-extern float __attribute__((overloadable)) smoothstep(float, float, float);
-extern float2 __attribute__((overloadable)) smoothstep(float2, float2, float2);
-extern float3 __attribute__((overloadable)) smoothstep(float3, float3, float3);
-extern float4 __attribute__((overloadable)) smoothstep(float4, float4, float4);
-extern float2 __attribute__((overloadable)) smoothstep(float, float, float2);
-extern float3 __attribute__((overloadable)) smoothstep(float, float, float3);
-extern float4 __attribute__((overloadable)) smoothstep(float, float, float4);
-
-/**
- * if (v < 0) return -1.f;
- * else if (v > 0) return 1.f;
- * else return 0.f;
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) sign(float v);
-FN_FUNC_FN(sign)
-
-/**
- * Compute the cross product of two vectors.
- *
- * Supports 3,4 components
- */
-_RS_RUNTIME float3 __attribute__((overloadable)) cross(float3 lhs, float3 rhs);
-_RS_RUNTIME float4 __attribute__((overloadable)) cross(float4 lhs, float4 rhs);
-
-/**
- * Compute the dot product of two vectors.
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) dot(float lhs, float rhs);
-_RS_RUNTIME float __attribute__((overloadable)) dot(float2 lhs, float2 rhs);
-_RS_RUNTIME float __attribute__((overloadable)) dot(float3 lhs, float3 rhs);
-_RS_RUNTIME float __attribute__((overloadable)) dot(float4 lhs, float4 rhs);
-
-/**
- * Compute the length of a vector.
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) length(float v);
-_RS_RUNTIME float __attribute__((overloadable)) length(float2 v);
-_RS_RUNTIME float __attribute__((overloadable)) length(float3 v);
-_RS_RUNTIME float __attribute__((overloadable)) length(float4 v);
-
-/**
- * Compute the distance between two points.
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) distance(float lhs, float rhs);
-_RS_RUNTIME float __attribute__((overloadable)) distance(float2 lhs, float2 rhs);
-_RS_RUNTIME float __attribute__((overloadable)) distance(float3 lhs, float3 rhs);
-_RS_RUNTIME float __attribute__((overloadable)) distance(float4 lhs, float4 rhs);
-
-/**
- * Normalize a vector.
- *
- * Supports 1,2,3,4 components
- */
-_RS_RUNTIME float __attribute__((overloadable)) normalize(float v);
-_RS_RUNTIME float2 __attribute__((overloadable)) normalize(float2 v);
-_RS_RUNTIME float3 __attribute__((overloadable)) normalize(float3 v);
-_RS_RUNTIME float4 __attribute__((overloadable)) normalize(float4 v);
-
-#undef CVT_FUNC
-#undef CVT_FUNC_2
-#undef FN_FUNC_FN
-#undef IN_FUNC_FN
-#undef FN_FUNC_FN_FN
-#undef FN_FUNC_FN_F
-#undef FN_FUNC_FN_IN
-#undef FN_FUNC_FN_I
-#undef FN_FUNC_FN_PFN
-#undef FN_FUNC_FN_PIN
-#undef FN_FUNC_FN_FN_FN
-#undef FN_FUNC_FN_FN_PIN
-#undef XN_FUNC_YN
-#undef UIN_FUNC_IN
-#undef IN_FUNC_IN
-#undef XN_FUNC_XN_XN_BODY
-#undef IN_FUNC_IN_IN_BODY
-
-#endif
diff --git a/libs/rs/scriptc/rs_core.rsh b/libs/rs/scriptc/rs_core.rsh
deleted file mode 100644
index 1b0f9db..0000000
--- a/libs/rs/scriptc/rs_core.rsh
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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.
- */
-
- /*! \mainpage notitle
-  *
-  * Renderscript is a high-performance runtime that provides graphics rendering and
-  * compute operations at the native level. Renderscript code is compiled on devices
-  * at runtime to allow platform-independence as well.
-  * This reference documentation describes the Renderscript runtime APIs, which you
-  * can utilize to write Renderscript code in C99. The Renderscript header
-  * files are automatically included for you, except for the rs_graphics.rsh header. If
-  * you are doing graphics rendering, include the graphics header file like this:
-  *
-  * <code>#include "rs_graphics.rsh"</code>
-  *
-  * To use Renderscript, you need to utilize the Renderscript runtime APIs documented here
-  * as well as the Android framework APIs for Renderscript.
-  * For documentation on the Android framework APIs, see the <a target="_parent" href=
-  * "http://developer.android.com/reference/android/renderscript/package-summary.html">
-  * android.renderscript</a> package reference.
-  * For more information on how to develop with Renderscript and how the runtime and
-  * Android framework APIs interact, see the <a target="_parent" href=
-  * "http://developer.android.com/guide/topics/renderscript/index.html">Renderscript
-  * developer guide</a> and the <a target="_parent" href=
-  * "http://developer.android.com/resources/samples/RenderScript/index.html">
-  * Renderscript samples</a>.
-  */
-
-/** @file rs_core.rsh
- *  \brief todo-jsams
- *
- *  todo-jsams
- *
- */
-
-#ifndef __RS_CORE_RSH__
-#define __RS_CORE_RSH__
-
-#define _RS_RUNTIME extern
-
-#include "rs_types.rsh"
-#include "rs_allocation.rsh"
-#include "rs_atomic.rsh"
-#include "rs_cl.rsh"
-#include "rs_debug.rsh"
-#include "rs_element.rsh"
-#include "rs_math.rsh"
-#include "rs_matrix.rsh"
-#include "rs_object.rsh"
-#include "rs_quaternion.rsh"
-#include "rs_sampler.rsh"
-#include "rs_time.rsh"
-
-/**
- * Send a message back to the client.  Will not block and returns true
- * if the message was sendable and false if the fifo was full.
- * A message ID is required.  Data payload is optional.
- */
-extern bool __attribute__((overloadable))
-    rsSendToClient(int cmdID);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsSendToClient(int cmdID, const void *data, uint len);
-/**
- * Send a message back to the client, blocking until the message is queued.
- * A message ID is required.  Data payload is optional.
- */
-extern void __attribute__((overloadable))
-    rsSendToClientBlocking(int cmdID);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSendToClientBlocking(int cmdID, const void *data, uint len);
-
-
-/**
- * Launch order hint for rsForEach calls.  This provides a hint to the system to
- * determine in which order the root function of the target is called with each
- * cell of the allocation.
- *
- * This is a hint and implementations may not obey the order.
- */
-enum rs_for_each_strategy {
-    RS_FOR_EACH_STRATEGY_SERIAL,
-    RS_FOR_EACH_STRATEGY_DONT_CARE,
-    RS_FOR_EACH_STRATEGY_DST_LINEAR,
-    RS_FOR_EACH_STRATEGY_TILE_SMALL,
-    RS_FOR_EACH_STRATEGY_TILE_MEDIUM,
-    RS_FOR_EACH_STRATEGY_TILE_LARGE
-};
-
-
-/**
- * Structure to provide extra information to a rsForEach call.  Primarly used to
- * restrict the call to a subset of cells in the allocation.
- */
-typedef struct rs_script_call {
-    enum rs_for_each_strategy strategy;
-    uint32_t xStart;
-    uint32_t xEnd;
-    uint32_t yStart;
-    uint32_t yEnd;
-    uint32_t zStart;
-    uint32_t zEnd;
-    uint32_t arrayStart;
-    uint32_t arrayEnd;
-} rs_script_call_t;
-
-/**
- * Make a script to script call to launch work. One of the input or output is
- * required to be a valid object. The input and output must be of the same
- * dimensions.
- * API 10-13
- *
- * @param script The target script to call
- * @param input The allocation to source data from
- * @param output the allocation to write date into
- * @param usrData The user definied params to pass to the root script.  May be
- *                NULL.
- * @param sc Extra control infomation used to select a sub-region of the
- *           allocation to be processed or suggest a walking strategy.  May be
- *           NULL.
- *
- *  */
-#if !defined(RS_VERSION) || (RS_VERSION < 14)
-extern void __attribute__((overloadable))
-    rsForEach(rs_script script, rs_allocation input,
-              rs_allocation output, const void * usrData,
-              const rs_script_call_t *sc);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsForEach(rs_script script, rs_allocation input,
-              rs_allocation output, const void * usrData);
-#else
-
-/**
- * Make a script to script call to launch work. One of the input or output is
- * required to be a valid object. The input and output must be of the same
- * dimensions.
- * API 14+
- *
- * @param script The target script to call
- * @param input The allocation to source data from
- * @param output the allocation to write date into
- * @param usrData The user definied params to pass to the root script.  May be
- *                NULL.
- * @param usrDataLen The size of the userData structure.  This will be used to
- *                   perform a shallow copy of the data if necessary.
- * @param sc Extra control infomation used to select a sub-region of the
- *           allocation to be processed or suggest a walking strategy.  May be
- *           NULL.
- *
- */
-extern void __attribute__((overloadable))
-    rsForEach(rs_script script, rs_allocation input, rs_allocation output,
-              const void * usrData, size_t usrDataLen, const rs_script_call_t *);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsForEach(rs_script script, rs_allocation input, rs_allocation output,
-              const void * usrData, size_t usrDataLen);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsForEach(rs_script script, rs_allocation input, rs_allocation output);
-#endif
-
-
-
-#undef _RS_RUNTIME
-
-#endif
diff --git a/libs/rs/scriptc/rs_debug.rsh b/libs/rs/scriptc/rs_debug.rsh
deleted file mode 100644
index 074c28f..0000000
--- a/libs/rs/scriptc/rs_debug.rsh
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_debug.rsh
- *  \brief Utility debugging routines
- *
- *  Routines intended to be used during application developement.  These should
- *  not be used in shipping applications.  All print a string and value pair to
- *  the standard log.
- *
- */
-
-#ifndef __RS_DEBUG_RSH__
-#define __RS_DEBUG_RSH__
-
-
-
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, float);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, float, float);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, float, float, float);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, float, float, float, float);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, double);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, const rs_matrix4x4 *);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, const rs_matrix3x3 *);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, const rs_matrix2x2 *);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, int);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, uint);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, long);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, unsigned long);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, long long);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, unsigned long long);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-extern void __attribute__((overloadable))
-    rsDebug(const char *, const void *);
-#define RS_DEBUG(a) rsDebug(#a, a)
-#define RS_DEBUG_MARKER rsDebug(__FILE__, __LINE__)
-
-
-/**
- * Debug function.  Prints a string and value to the log.
- */
-_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float2 v);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float3 v);
-/**
- * Debug function.  Prints a string and value to the log.
- */
-_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float4 v);
-
-#endif
diff --git a/libs/rs/scriptc/rs_element.rsh b/libs/rs/scriptc/rs_element.rsh
deleted file mode 100644
index 1a4cdb75..0000000
--- a/libs/rs/scriptc/rs_element.rsh
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-/** @file rs_element.rsh
- *  \brief Element routines
- *
- *
- */
-
-#ifndef __RS_ELEMENT_RSH__
-#define __RS_ELEMENT_RSH__
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-/**
- * @param e element to get data from
- * @return number of sub-elements in this element
- */
-extern uint32_t __attribute__((overloadable))
-    rsElementGetSubElementCount(rs_element e);
-
-/**
- * @param e element to get data from
- * @param index index of the sub-element to return
- * @return sub-element in this element at given index
- */
-extern rs_element __attribute__((overloadable))
-    rsElementGetSubElement(rs_element, uint32_t index);
-
-/**
- * @param e element to get data from
- * @param index index of the sub-element to return
- * @return length of the sub-element name including the null
- *         terminator (size of buffer needed to write the name)
- */
-extern uint32_t __attribute__((overloadable))
-    rsElementGetSubElementNameLength(rs_element e, uint32_t index);
-
-/**
- * @param e element to get data from
- * @param index index of the sub-element
- * @param name array to store the name into
- * @param nameLength length of the provided name array
- * @return number of characters actually written, excluding the
- *         null terminator
- */
-extern uint32_t __attribute__((overloadable))
-    rsElementGetSubElementName(rs_element e, uint32_t index, char *name, uint32_t nameLength);
-
-/**
- * @param e element to get data from
- * @param index index of the sub-element
- * @return array size of sub-element in this element at given
- *         index
- */
-extern uint32_t __attribute__((overloadable))
-    rsElementGetSubElementArraySize(rs_element e, uint32_t index);
-
-/**
- * @param e element to get data from
- * @param index index of the sub-element
- * @return offset in bytes of sub-element in this element at
- *         given index
- */
-extern uint32_t __attribute__((overloadable))
-    rsElementGetSubElementOffsetBytes(rs_element e, uint32_t index);
-
-/**
- * @param e element to get data from
- * @return total size of the element in bytes
- */
-extern uint32_t __attribute__((overloadable))
-    rsElementGetSizeBytes(rs_element e);
-
-/**
- * @param e element to get data from
- * @return element's data type
- */
-extern rs_data_type __attribute__((overloadable))
-    rsElementGetDataType(rs_element e);
-
-/**
- * @param e element to get data from
- * @return element's data size
- */
-extern rs_data_kind __attribute__((overloadable))
-    rsElementGetDataKind(rs_element e);
-
-/**
- * @param e element to get data from
- * @return length of the element vector (for float2, float3,
- *         etc.)
- */
-extern uint32_t __attribute__((overloadable))
-    rsElementGetVectorSize(rs_element e);
-
-#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-#endif // __RS_ELEMENT_RSH__
-
diff --git a/libs/rs/scriptc/rs_graphics.rsh b/libs/rs/scriptc/rs_graphics.rsh
deleted file mode 100644
index 44ee99f..0000000
--- a/libs/rs/scriptc/rs_graphics.rsh
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * Copyright (C) 2011-2012 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.
- */
-
-/** @file rs_graphics.rsh
- *  \brief Renderscript graphics API
- *
- *  A set of graphics functions used by Renderscript.
- *
- */
-#ifndef __RS_GRAPHICS_RSH__
-#define __RS_GRAPHICS_RSH__
-
-#include "rs_mesh.rsh"
-#include "rs_program.rsh"
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 14))
-/**
- * Set the color target used for all subsequent rendering calls
- * @param colorTarget
- * @param slot
- */
-extern void __attribute__((overloadable))
-    rsgBindColorTarget(rs_allocation colorTarget, uint slot);
-
-/**
- * Clear the previously set color target
- * @param slot
- */
-extern void __attribute__((overloadable))
-    rsgClearColorTarget(uint slot);
-
-/**
- * Set the depth target used for all subsequent rendering calls
- * @param depthTarget
- */
-extern void __attribute__((overloadable))
-    rsgBindDepthTarget(rs_allocation depthTarget);
-
-/**
- * Clear the previously set depth target
- */
-extern void __attribute__((overloadable))
-    rsgClearDepthTarget(void);
-
-/**
- * Clear all color and depth targets and resume rendering into
- * the framebuffer
- */
-extern void __attribute__((overloadable))
-    rsgClearAllRenderTargets(void);
-
-/**
- * Force Renderscript to finish all rendering commands
- */
-extern uint __attribute__((overloadable))
-    rsgFinish(void);
-
-#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
-
-/**
- * Bind a new ProgramFragment to the rendering context.
- *
- * @param pf
- */
-extern void __attribute__((overloadable))
-    rsgBindProgramFragment(rs_program_fragment pf);
-
-/**
- * Bind a new ProgramStore to the rendering context.
- *
- * @param ps
- */
-extern void __attribute__((overloadable))
-    rsgBindProgramStore(rs_program_store ps);
-
-/**
- * Bind a new ProgramVertex to the rendering context.
- *
- * @param pv
- */
-extern void __attribute__((overloadable))
-    rsgBindProgramVertex(rs_program_vertex pv);
-
-/**
- * Bind a new ProgramRaster to the rendering context.
- *
- * @param pr
- */
-extern void __attribute__((overloadable))
-    rsgBindProgramRaster(rs_program_raster pr);
-
-/**
- * Bind a new Sampler object to a ProgramFragment.  The sampler will
- * operate on the texture bound at the matching slot.
- *
- * @param slot
- */
-extern void __attribute__((overloadable))
-    rsgBindSampler(rs_program_fragment, uint slot, rs_sampler);
-
-/**
- * Bind a new Allocation object to a ProgramFragment.  The
- * Allocation must be a valid texture for the Program.  The sampling
- * of the texture will be controled by the Sampler bound at the
- * matching slot.
- *
- * @param slot
- */
-extern void __attribute__((overloadable))
-    rsgBindTexture(rs_program_fragment, uint slot, rs_allocation);
-
-/**
- * Load the projection matrix for a currently bound fixed function
- * vertex program. Calling this function with a custom vertex shader
- * would result in an error.
- * @param proj projection matrix
- */
-extern void __attribute__((overloadable))
-    rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *proj);
-/**
- * Load the model matrix for a currently bound fixed function
- * vertex program. Calling this function with a custom vertex shader
- * would result in an error.
- * @param model model matrix
- */
-extern void __attribute__((overloadable))
-    rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *model);
-/**
- * Load the texture matrix for a currently bound fixed function
- * vertex program. Calling this function with a custom vertex shader
- * would result in an error.
- * @param tex texture matrix
- */
-extern void __attribute__((overloadable))
-    rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *tex);
-/**
- * Get the projection matrix for a currently bound fixed function
- * vertex program. Calling this function with a custom vertex shader
- * would result in an error.
- * @param proj matrix to store the current projection matrix into
- */
-extern void __attribute__((overloadable))
-    rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *proj);
-
-/**
- * Set the constant color for a fixed function emulation program.
- *
- * @param pf
- * @param r
- * @param g
- * @param b
- * @param a
- */
-extern void __attribute__((overloadable))
-    rsgProgramFragmentConstantColor(rs_program_fragment pf, float r, float g, float b, float a);
-
-/**
- * Bind a new Allocation object to a ProgramFragment.  The
- * Allocation must be a valid constant input for the Program.
- *
- * @param ps program object
- * @param slot index of the constant buffer on the program
- * @param c constants to bind
- */
-extern void __attribute__((overloadable))
-    rsgBindConstant(rs_program_fragment ps, uint slot, rs_allocation c);
-
-/**
- * Bind a new Allocation object to a ProgramVertex.  The
- * Allocation must be a valid constant input for the Program.
- *
- * @param pv program object
- * @param slot index of the constant buffer on the program
- * @param c constants to bind
- */
-extern void __attribute__((overloadable))
-    rsgBindConstant(rs_program_vertex pv, uint slot, rs_allocation c);
-
-/**
- * Get the width of the current rendering surface.
- *
- * @return uint
- */
-extern uint __attribute__((overloadable))
-    rsgGetWidth(void);
-
-/**
- * Get the height of the current rendering surface.
- *
- * @return uint
- */
-extern uint __attribute__((overloadable))
-    rsgGetHeight(void);
-
-
-/**
- * Sync the contents of an allocation from its SCRIPT memory space to its HW
- * memory spaces.
- *
- * @param alloc
- */
-extern void __attribute__((overloadable))
-    rsgAllocationSyncAll(rs_allocation alloc);
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 14))
-
-/**
- * Sync the contents of an allocation from memory space
- * specified by source.
- *
- * @param alloc
- * @param source
- */
-extern void __attribute__((overloadable))
-    rsgAllocationSyncAll(rs_allocation alloc,
-                         rs_allocation_usage_type source);
-
-#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
-
-/**
- * Low performance utility function for drawing a simple rectangle.  Not
- * intended for drawing large quantities of geometry.
- *
- * @param x1
- * @param y1
- * @param x2
- * @param y2
- * @param z
- */
-extern void __attribute__((overloadable))
-    rsgDrawRect(float x1, float y1, float x2, float y2, float z);
-
-/**
- * Low performance utility function for drawing a simple quad.  Not intended for
- * drawing large quantities of geometry.
- *
- * @param x1
- * @param y1
- * @param z1
- * @param x2
- * @param y2
- * @param z2
- * @param x3
- * @param y3
- * @param z3
- * @param x4
- * @param y4
- * @param z4
- */
-extern void __attribute__((overloadable))
-    rsgDrawQuad(float x1, float y1, float z1,
-                float x2, float y2, float z2,
-                float x3, float y3, float z3,
-                float x4, float y4, float z4);
-
-
-/**
- * Low performance utility function for drawing a textured quad.  Not intended
- * for drawing large quantities of geometry.
- *
- * @param x1
- * @param y1
- * @param z1
- * @param u1
- * @param v1
- * @param x2
- * @param y2
- * @param z2
- * @param u2
- * @param v2
- * @param x3
- * @param y3
- * @param z3
- * @param u3
- * @param v3
- * @param x4
- * @param y4
- * @param z4
- * @param u4
- * @param v4
- */
-extern void __attribute__((overloadable))
-    rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
-                         float x2, float y2, float z2, float u2, float v2,
-                         float x3, float y3, float z3, float u3, float v3,
-                         float x4, float y4, float z4, float u4, float v4);
-
-
-/**
- * Low performance function for drawing rectangles in screenspace.  This
- * function uses the default passthough ProgramVertex.  Any bound ProgramVertex
- * is ignored.  This function has considerable overhead and should not be used
- * for drawing in shipping applications.
- *
- * @param x
- * @param y
- * @param z
- * @param w
- * @param h
- */
-extern void __attribute__((overloadable))
-    rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h);
-
-extern void __attribute__((overloadable))
-    rsgDrawPath(rs_path p);
-
-/**
- * Draw a mesh using the current context state.  The whole mesh is
- * rendered.
- *
- * @param ism
- */
-extern void __attribute__((overloadable))
-    rsgDrawMesh(rs_mesh ism);
-/**
- * Draw part of a mesh using the current context state.
- * @param ism mesh object to render
- * @param primitiveIndex for meshes that contain multiple primitive groups
- *        this parameter specifies the index of the group to draw.
- */
-extern void __attribute__((overloadable))
-    rsgDrawMesh(rs_mesh ism, uint primitiveIndex);
-/**
- * Draw specified index range of part of a mesh using the current context state.
- * @param ism mesh object to render
- * @param primitiveIndex for meshes that contain multiple primitive groups
- *        this parameter specifies the index of the group to draw.
- * @param start starting index in the range
- * @param len number of indices to draw
- */
-extern void __attribute__((overloadable))
-    rsgDrawMesh(rs_mesh ism, uint primitiveIndex, uint start, uint len);
-
-/**
- * Clears the rendering surface to the specified color.
- *
- * @param r
- * @param g
- * @param b
- * @param a
- */
-extern void __attribute__((overloadable))
-    rsgClearColor(float r, float g, float b, float a);
-
-/**
- * Clears the depth suface to the specified value.
- */
-extern void __attribute__((overloadable))
-    rsgClearDepth(float value);
-/**
- * Draws text given a string and location
- */
-extern void __attribute__((overloadable))
-    rsgDrawText(const char *, int x, int y);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsgDrawText(rs_allocation, int x, int y);
-/**
- * Binds the font object to be used for all subsequent font rendering calls
- * @param font object to bind
- */
-extern void __attribute__((overloadable))
-    rsgBindFont(rs_font font);
-/**
- * Sets the font color for all subsequent rendering calls
- * @param r red component
- * @param g green component
- * @param b blue component
- * @param a alpha component
- */
-extern void __attribute__((overloadable))
-    rsgFontColor(float r, float g, float b, float a);
-/**
- * Returns the bounding box of the text relative to (0, 0)
- * Any of left, right, top, bottom could be NULL
- */
-extern void __attribute__((overloadable))
-    rsgMeasureText(const char *, int *left, int *right, int *top, int *bottom);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsgMeasureText(rs_allocation, int *left, int *right, int *top, int *bottom);
-/**
- * Computes an axis aligned bounding box of a mesh object
- */
-extern void __attribute__((overloadable))
-    rsgMeshComputeBoundingBox(rs_mesh mesh, float *minX, float *minY, float *minZ,
-                                                float *maxX, float *maxY, float *maxZ);
-/**
- * \overload
- */
-__inline__ static void __attribute__((overloadable, always_inline))
-rsgMeshComputeBoundingBox(rs_mesh mesh, float3 *bBoxMin, float3 *bBoxMax) {
-    float x1, y1, z1, x2, y2, z2;
-    rsgMeshComputeBoundingBox(mesh, &x1, &y1, &z1, &x2, &y2, &z2);
-    bBoxMin->x = x1;
-    bBoxMin->y = y1;
-    bBoxMin->z = z1;
-    bBoxMax->x = x2;
-    bBoxMax->y = y2;
-    bBoxMax->z = z2;
-}
-
-#endif
-
diff --git a/libs/rs/scriptc/rs_math.rsh b/libs/rs/scriptc/rs_math.rsh
deleted file mode 100644
index 8117ca8..0000000
--- a/libs/rs/scriptc/rs_math.rsh
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_math.rsh
- *  \brief todo-jsams
- *
- *  todo-jsams
- *
- */
-
-#ifndef __RS_MATH_RSH__
-#define __RS_MATH_RSH__
-
-
-/**
- * Return a random value between 0 (or min_value) and max_malue.
- */
-extern int __attribute__((overloadable))
-    rsRand(int max_value);
-/**
- * \overload
- */
-extern int __attribute__((overloadable))
-    rsRand(int min_value, int max_value);
-/**
- * \overload
- */
-extern float __attribute__((overloadable))
-    rsRand(float max_value);
-/**
- * \overload
- */
-extern float __attribute__((overloadable))
-    rsRand(float min_value, float max_value);
-
-/**
- * Returns the fractional part of a float
- */
-extern float __attribute__((overloadable))
-    rsFrac(float);
-
-
-/////////////////////////////////////////////////////
-// int ops
-/////////////////////////////////////////////////////
-
-/**
- * Clamp the value amount between low and high.
- *
- * @param amount  The value to clamp
- * @param low
- * @param high
- */
-_RS_RUNTIME uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high);
-
-/**
- * \overload
- */
-_RS_RUNTIME int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high);
-/**
- * \overload
- */
-_RS_RUNTIME ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high);
-/**
- * \overload
- */
-_RS_RUNTIME short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high);
-/**
- * \overload
- */
-_RS_RUNTIME uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high);
-/**
- * \overload
- */
-_RS_RUNTIME char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high);
-
-
-/**
- * Computes 6 frustum planes from the view projection matrix
- * @param viewProj matrix to extract planes from
- * @param left plane
- * @param right plane
- * @param top plane
- * @param bottom plane
- * @param near plane
- * @param far plane
- */
-__inline__ static void __attribute__((overloadable, always_inline))
-rsExtractFrustumPlanes(const rs_matrix4x4 *viewProj,
-                         float4 *left, float4 *right,
-                         float4 *top, float4 *bottom,
-                         float4 *near, float4 *far) {
-    // x y z w = a b c d in the plane equation
-    left->x = viewProj->m[3] + viewProj->m[0];
-    left->y = viewProj->m[7] + viewProj->m[4];
-    left->z = viewProj->m[11] + viewProj->m[8];
-    left->w = viewProj->m[15] + viewProj->m[12];
-
-    right->x = viewProj->m[3] - viewProj->m[0];
-    right->y = viewProj->m[7] - viewProj->m[4];
-    right->z = viewProj->m[11] - viewProj->m[8];
-    right->w = viewProj->m[15] - viewProj->m[12];
-
-    top->x = viewProj->m[3] - viewProj->m[1];
-    top->y = viewProj->m[7] - viewProj->m[5];
-    top->z = viewProj->m[11] - viewProj->m[9];
-    top->w = viewProj->m[15] - viewProj->m[13];
-
-    bottom->x = viewProj->m[3] + viewProj->m[1];
-    bottom->y = viewProj->m[7] + viewProj->m[5];
-    bottom->z = viewProj->m[11] + viewProj->m[9];
-    bottom->w = viewProj->m[15] + viewProj->m[13];
-
-    near->x = viewProj->m[3] + viewProj->m[2];
-    near->y = viewProj->m[7] + viewProj->m[6];
-    near->z = viewProj->m[11] + viewProj->m[10];
-    near->w = viewProj->m[15] + viewProj->m[14];
-
-    far->x = viewProj->m[3] - viewProj->m[2];
-    far->y = viewProj->m[7] - viewProj->m[6];
-    far->z = viewProj->m[11] - viewProj->m[10];
-    far->w = viewProj->m[15] - viewProj->m[14];
-
-    float len = length(left->xyz);
-    *left /= len;
-    len = length(right->xyz);
-    *right /= len;
-    len = length(top->xyz);
-    *top /= len;
-    len = length(bottom->xyz);
-    *bottom /= len;
-    len = length(near->xyz);
-    *near /= len;
-    len = length(far->xyz);
-    *far /= len;
-}
-
-/**
- * Checks if a sphere is withing the 6 frustum planes
- * @param sphere float4 representing the sphere
- * @param left plane
- * @param right plane
- * @param top plane
- * @param bottom plane
- * @param near plane
- * @param far plane
- */
-__inline__ static bool __attribute__((overloadable, always_inline))
-rsIsSphereInFrustum(float4 *sphere,
-                      float4 *left, float4 *right,
-                      float4 *top, float4 *bottom,
-                      float4 *near, float4 *far) {
-
-    float distToCenter = dot(left->xyz, sphere->xyz) + left->w;
-    if (distToCenter < -sphere->w) {
-        return false;
-    }
-    distToCenter = dot(right->xyz, sphere->xyz) + right->w;
-    if (distToCenter < -sphere->w) {
-        return false;
-    }
-    distToCenter = dot(top->xyz, sphere->xyz) + top->w;
-    if (distToCenter < -sphere->w) {
-        return false;
-    }
-    distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w;
-    if (distToCenter < -sphere->w) {
-        return false;
-    }
-    distToCenter = dot(near->xyz, sphere->xyz) + near->w;
-    if (distToCenter < -sphere->w) {
-        return false;
-    }
-    distToCenter = dot(far->xyz, sphere->xyz) + far->w;
-    if (distToCenter < -sphere->w) {
-        return false;
-    }
-    return true;
-}
-
-
-/**
- * Pack floating point (0-1) RGB values into a uchar4.  The alpha component is
- * set to 255 (1.0).
- *
- * @param r
- * @param g
- * @param b
- *
- * @return uchar4
- */
-_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b);
-
-/**
- * Pack floating point (0-1) RGBA values into a uchar4.
- *
- * @param r
- * @param g
- * @param b
- * @param a
- *
- * @return uchar4
- */
-_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a);
-
-/**
- * Pack floating point (0-1) RGB values into a uchar4.  The alpha component is
- * set to 255 (1.0).
- *
- * @param color
- *
- * @return uchar4
- */
-_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color);
-
-/**
- * Pack floating point (0-1) RGBA values into a uchar4.
- *
- * @param color
- *
- * @return uchar4
- */
-_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color);
-
-/**
- * Unpack a uchar4 color to float4.  The resulting float range will be (0-1).
- *
- * @param c
- *
- * @return float4
- */
-_RS_RUNTIME float4 rsUnpackColor8888(uchar4 c);
-
-
-#endif
diff --git a/libs/rs/scriptc/rs_matrix.rsh b/libs/rs/scriptc/rs_matrix.rsh
deleted file mode 100644
index ebff7f4..0000000
--- a/libs/rs/scriptc/rs_matrix.rsh
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_matrix.rsh
- *  \brief Matrix routines
- *
- *
- */
-
-#ifndef __RS_MATRIX_RSH__
-#define __RS_MATRIX_RSH__
-
-/**
- * Set one element of a matrix.
- *
- * @param m The matrix to be set
- * @param row
- * @param col
- * @param v
- *
- * @return void
- */
-_RS_RUNTIME void __attribute__((overloadable))
-rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v);
-/**
- * \overload
- */
-_RS_RUNTIME void __attribute__((overloadable))
-rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v);
-/**
- * \overload
- */
-_RS_RUNTIME void __attribute__((overloadable))
-rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v);
-
-/**
- * Get one element of a matrix.
- *
- * @param m The matrix to read from
- * @param row
- * @param col
- *
- * @return float
- */
-_RS_RUNTIME float __attribute__((overloadable))
-rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col);
-/**
- * \overload
- */
-_RS_RUNTIME float __attribute__((overloadable))
-rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col);
-/**
- * \overload
- */
-_RS_RUNTIME float __attribute__((overloadable))
-rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col);
-
-/**
- * Set the elements of a matrix to the identity matrix.
- *
- * @param m
- */
-extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m);
-
-/**
- * Set the elements of a matrix from an array of floats.
- *
- * @param m
- */
-extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v);
-
-/**
- * Set the elements of a matrix from another matrix.
- *
- * @param m
- */
-extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v);
-
-/**
- * Load a rotation matrix.
- *
- * @param m
- * @param rot
- * @param x
- * @param y
- * @param z
- */
-extern void __attribute__((overloadable))
-rsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
-
-/**
- * Load a scale matrix.
- *
- * @param m
- * @param x
- * @param y
- * @param z
- */
-extern void __attribute__((overloadable))
-rsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z);
-
-/**
- * Load a translation matrix.
- *
- * @param m
- * @param x
- * @param y
- * @param z
- */
-extern void __attribute__((overloadable))
-rsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z);
-
-/**
- * Multiply two matrix (lhs, rhs) and place the result in m.
- *
- * @param m
- * @param lhs
- * @param rhs
- */
-extern void __attribute__((overloadable))
-rsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-rsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-rsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs);
-
-/**
- * Multiply the matrix m by rhs and place the result back into m.
- *
- * @param m (lhs)
- * @param rhs
- */
-extern void __attribute__((overloadable))
-rsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-rsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-rsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs);
-
-/**
- * Multiple matrix m with a rotation matrix
- *
- * @param m
- * @param rot
- * @param x
- * @param y
- * @param z
- */
-extern void __attribute__((overloadable))
-rsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
-
-/**
- * Multiple matrix m with a scale matrix
- *
- * @param m
- * @param x
- * @param y
- * @param z
- */
-extern void __attribute__((overloadable))
-rsMatrixScale(rs_matrix4x4 *m, float x, float y, float z);
-
-/**
- * Multiple matrix m with a translation matrix
- *
- * @param m
- * @param x
- * @param y
- * @param z
- */
-extern void __attribute__((overloadable))
-rsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z);
-
-/**
- * Load an Ortho projection matrix constructed from the 6 planes
- *
- * @param m
- * @param left
- * @param right
- * @param bottom
- * @param top
- * @param near
- * @param far
- */
-extern void __attribute__((overloadable))
-rsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
-
-/**
- * Load an Frustum projection matrix constructed from the 6 planes
- *
- * @param m
- * @param left
- * @param right
- * @param bottom
- * @param top
- * @param near
- * @param far
- */
-extern void __attribute__((overloadable))
-rsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
-
-/**
- * Load an perspective projection matrix constructed from the 6 planes
- *
- * @param m
- * @param fovy Field of view, in degrees along the Y axis.
- * @param aspect Ratio of x / y.
- * @param near
- * @param far
- */
-extern void __attribute__((overloadable))
-rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
-
-#if !defined(RS_VERSION) || (RS_VERSION < 14)
-/**
- * Multiply a vector by a matrix and return the result vector.
- * API version 10-13
- */
-_RS_RUNTIME float4 __attribute__((overloadable))
-rsMatrixMultiply(rs_matrix4x4 *m, float4 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float4 __attribute__((overloadable))
-rsMatrixMultiply(rs_matrix4x4 *m, float3 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float4 __attribute__((overloadable))
-rsMatrixMultiply(rs_matrix4x4 *m, float2 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float3 __attribute__((overloadable))
-rsMatrixMultiply(rs_matrix3x3 *m, float3 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float3 __attribute__((overloadable))
-rsMatrixMultiply(rs_matrix3x3 *m, float2 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float2 __attribute__((overloadable))
-rsMatrixMultiply(rs_matrix2x2 *m, float2 in);
-#else
-/**
- * Multiply a vector by a matrix and return the result vector.
- * API version 14+
- */
-_RS_RUNTIME float4 __attribute__((overloadable))
-rsMatrixMultiply(const rs_matrix4x4 *m, float4 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float4 __attribute__((overloadable))
-rsMatrixMultiply(const rs_matrix4x4 *m, float3 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float4 __attribute__((overloadable))
-rsMatrixMultiply(const rs_matrix4x4 *m, float2 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float3 __attribute__((overloadable))
-rsMatrixMultiply(const rs_matrix3x3 *m, float3 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float3 __attribute__((overloadable))
-rsMatrixMultiply(const rs_matrix3x3 *m, float2 in);
-
-/**
- * \overload
- */
-_RS_RUNTIME float2 __attribute__((overloadable))
-rsMatrixMultiply(const rs_matrix2x2 *m, float2 in);
-#endif
-
-
-/**
- * Returns true if the matrix was successfully inversed
- *
- * @param m
- */
-extern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m);
-
-/**
- * Returns true if the matrix was successfully inversed and transposed.
- *
- * @param m
- */
-extern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m);
-
-/**
- * Transpose the matrix m.
- *
- * @param m
- */
-extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m);
-/**
- * \overload
- */
-extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m);
-
-
-#endif
diff --git a/libs/rs/scriptc/rs_mesh.rsh b/libs/rs/scriptc/rs_mesh.rsh
deleted file mode 100644
index 87ffd33..0000000
--- a/libs/rs/scriptc/rs_mesh.rsh
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-/** @file rs_mesh.rsh
- *  \brief Mesh routines
- *
- *
- */
-
-#ifndef __RS_MESH_RSH__
-#define __RS_MESH_RSH__
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-/**
- * @param m mesh to get data from
- * @return number of allocations in the mesh that contain vertex
- *         data
- */
-extern uint32_t __attribute__((overloadable))
-    rsgMeshGetVertexAllocationCount(rs_mesh m);
-
-/**
- * @param m mesh to get data from
- * @return number of primitive groups in the mesh. This would
- *         include simple primitives as well as allocations
- *         containing index data
- */
-extern uint32_t __attribute__((overloadable))
-    rsgMeshGetPrimitiveCount(rs_mesh m);
-
-/**
- * @param m mesh to get data from
- * @param index index of the vertex allocation
- * @return allocation containing vertex data
- */
-extern rs_allocation __attribute__((overloadable))
-    rsgMeshGetVertexAllocation(rs_mesh m, uint32_t index);
-
-/**
- * @param m mesh to get data from
- * @param index index of the index allocation
- * @return allocation containing index data
- */
-extern rs_allocation __attribute__((overloadable))
-    rsgMeshGetIndexAllocation(rs_mesh m, uint32_t index);
-
-/**
- * @param m mesh to get data from
- * @param index index of the primitive
- * @return primitive describing how the mesh is rendered
- */
-extern rs_primitive __attribute__((overloadable))
-    rsgMeshGetPrimitive(rs_mesh m, uint32_t index);
-
-#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-#endif // __RS_MESH_RSH__
-
diff --git a/libs/rs/scriptc/rs_object.rsh b/libs/rs/scriptc/rs_object.rsh
deleted file mode 100644
index 1fc3f83..0000000
--- a/libs/rs/scriptc/rs_object.rsh
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_object.rsh
- *  \brief Object routines
- *
- *
- */
-
-#ifndef __RS_OBJECT_RSH__
-#define __RS_OBJECT_RSH__
-
-
-/**
- * Copy reference to the specified object.
- *
- * @param dst
- * @param src
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_element *dst, rs_element src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_type *dst, rs_type src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_allocation *dst, rs_allocation src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_sampler *dst, rs_sampler src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_script *dst, rs_script src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_path *dst, rs_path src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_mesh *dst, rs_mesh src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_program_fragment *dst, rs_program_fragment src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_program_vertex *dst, rs_program_vertex src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_program_raster *dst, rs_program_raster src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_program_store *dst, rs_program_store src);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsSetObject(rs_font *dst, rs_font src);
-
-/**
- * Sets the object to NULL.
- *
- * @return bool
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_element *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_type *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_allocation *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_sampler *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_script *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_path *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_mesh *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_program_fragment *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_program_vertex *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_program_raster *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_program_store *dst);
-/**
- * \overload
- */
-extern void __attribute__((overloadable))
-    rsClearObject(rs_font *dst);
-
-
-
-/**
- * Tests if the object is valid.  Returns true if the object is valid, false if
- * it is NULL.
- *
- * @return bool
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_element);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_type);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_allocation);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_sampler);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_script);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_path);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_mesh);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_program_fragment);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_program_vertex);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_program_raster);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_program_store);
-/**
- * \overload
- */
-extern bool __attribute__((overloadable))
-    rsIsObject(rs_font);
-
-#endif
diff --git a/libs/rs/scriptc/rs_program.rsh b/libs/rs/scriptc/rs_program.rsh
deleted file mode 100644
index 6a9929e..0000000
--- a/libs/rs/scriptc/rs_program.rsh
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-/** @file rs_program.rsh
- *  \brief Program object routines
- *
- *
- */
-
-#ifndef __RS_PROGRAM_RSH__
-#define __RS_PROGRAM_RSH__
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-/**
- * @hide
- * Get program store depth function
- *
- * @param ps
- */
-extern rs_depth_func __attribute__((overloadable))
-    rsgProgramStoreGetDepthFunc(rs_program_store ps);
-
-/**
- * @hide
- * Get program store depth mask
- *
- * @param ps
- */
-extern bool __attribute__((overloadable))
-    rsgProgramStoreGetDepthMask(rs_program_store ps);
-/**
- * @hide
- * Get program store red component color mask
- *
- * @param ps
- */
-extern bool __attribute__((overloadable))
-    rsgProgramStoreGetColorMaskR(rs_program_store ps);
-
-/**
- * @hide
- * Get program store green component color mask
- *
- * @param ps
- */
-extern bool __attribute__((overloadable))
-    rsgProgramStoreGetColorMaskG(rs_program_store ps);
-
-/**
- * @hide
- * Get program store blur component color mask
- *
- * @param ps
- */
-extern bool __attribute__((overloadable))
-    rsgProgramStoreGetColorMaskB(rs_program_store ps);
-
-/**
- * @hide
- * Get program store alpha component color mask
- *
- * @param ps
- */
-extern bool __attribute__((overloadable))
-    rsgProgramStoreGetColorMaskA(rs_program_store ps);
-
-/**
- * @hide
- * Get program store blend source function
- *
- * @param ps
- */
-extern rs_blend_src_func __attribute__((overloadable))
-        rsgProgramStoreGetBlendSrcFunc(rs_program_store ps);
-
-/**
- * @hide
- * Get program store blend destination function
- *
- * @param ps
- */
-extern rs_blend_dst_func __attribute__((overloadable))
-    rsgProgramStoreGetBlendDstFunc(rs_program_store ps);
-
-/**
- * @hide
- * Get program store dither state
- *
- * @param ps
- */
-extern bool __attribute__((overloadable))
-    rsgProgramStoreGetDitherEnabled(rs_program_store ps);
-
-/**
- * @hide
- * Get program raster point sprite state
- *
- * @param pr
- */
-extern bool __attribute__((overloadable))
-    rsgProgramRasterGetPointSpriteEnabled(rs_program_raster pr);
-
-/**
- * @hide
- * Get program raster cull mode
- *
- * @param pr
- */
-extern rs_cull_mode __attribute__((overloadable))
-    rsgProgramRasterGetCullMode(rs_program_raster pr);
-
-#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-#endif // __RS_PROGRAM_RSH__
-
diff --git a/libs/rs/scriptc/rs_quaternion.rsh b/libs/rs/scriptc/rs_quaternion.rsh
deleted file mode 100644
index 4e08d2f..0000000
--- a/libs/rs/scriptc/rs_quaternion.rsh
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_quaternion.rsh
- *  \brief Quaternion routines
- *
- *
- */
-
-#ifndef __RS_QUATERNION_RSH__
-#define __RS_QUATERNION_RSH__
-
-
-/**
- * Set the quaternion components
- * @param w component
- * @param x component
- * @param y component
- * @param z component
- */
-static void __attribute__((overloadable))
-rsQuaternionSet(rs_quaternion *q, float w, float x, float y, float z) {
-    q->w = w;
-    q->x = x;
-    q->y = y;
-    q->z = z;
-}
-
-/**
- * Set the quaternion from another quaternion
- * @param q destination quaternion
- * @param rhs source quaternion
- */
-static void __attribute__((overloadable))
-rsQuaternionSet(rs_quaternion *q, const rs_quaternion *rhs) {
-    q->w = rhs->w;
-    q->x = rhs->x;
-    q->y = rhs->y;
-    q->z = rhs->z;
-}
-
-/**
- * Multiply quaternion by a scalar
- * @param q quaternion to multiply
- * @param s scalar
- */
-static void __attribute__((overloadable))
-rsQuaternionMultiply(rs_quaternion *q, float s) {
-    q->w *= s;
-    q->x *= s;
-    q->y *= s;
-    q->z *= s;
-}
-
-/**
- * Add two quaternions
- * @param q destination quaternion to add to
- * @param rsh right hand side quaternion to add
- */
-static void
-rsQuaternionAdd(rs_quaternion *q, const rs_quaternion *rhs) {
-    q->w *= rhs->w;
-    q->x *= rhs->x;
-    q->y *= rhs->y;
-    q->z *= rhs->z;
-}
-
-/**
- * Loads a quaternion that represents a rotation about an arbitrary unit vector
- * @param q quaternion to set
- * @param rot angle to rotate by
- * @param x component of a vector
- * @param y component of a vector
- * @param x component of a vector
- */
-static void
-rsQuaternionLoadRotateUnit(rs_quaternion *q, float rot, float x, float y, float z) {
-    rot *= (float)(M_PI / 180.0f) * 0.5f;
-    float c = cos(rot);
-    float s = sin(rot);
-
-    q->w = c;
-    q->x = x * s;
-    q->y = y * s;
-    q->z = z * s;
-}
-
-/**
- * Loads a quaternion that represents a rotation about an arbitrary vector
- * (doesn't have to be unit)
- * @param q quaternion to set
- * @param rot angle to rotate by
- * @param x component of a vector
- * @param y component of a vector
- * @param x component of a vector
- */
-static void
-rsQuaternionLoadRotate(rs_quaternion *q, float rot, float x, float y, float z) {
-    const float len = x*x + y*y + z*z;
-    if (len != 1) {
-        const float recipLen = 1.f / sqrt(len);
-        x *= recipLen;
-        y *= recipLen;
-        z *= recipLen;
-    }
-    rsQuaternionLoadRotateUnit(q, rot, x, y, z);
-}
-
-/**
- * Conjugates the quaternion
- * @param q quaternion to conjugate
- */
-static void
-rsQuaternionConjugate(rs_quaternion *q) {
-    q->x = -q->x;
-    q->y = -q->y;
-    q->z = -q->z;
-}
-
-/**
- * Dot product of two quaternions
- * @param q0 first quaternion
- * @param q1 second quaternion
- * @return dot product between q0 and q1
- */
-static float
-rsQuaternionDot(const rs_quaternion *q0, const rs_quaternion *q1) {
-    return q0->w*q1->w + q0->x*q1->x + q0->y*q1->y + q0->z*q1->z;
-}
-
-/**
- * Normalizes the quaternion
- * @param q quaternion to normalize
- */
-static void
-rsQuaternionNormalize(rs_quaternion *q) {
-    const float len = rsQuaternionDot(q, q);
-    if (len != 1) {
-        const float recipLen = 1.f / sqrt(len);
-        rsQuaternionMultiply(q, recipLen);
-    }
-}
-
-/**
- * Multiply quaternion by another quaternion
- * @param q destination quaternion
- * @param rhs right hand side quaternion to multiply by
- */
-static void __attribute__((overloadable))
-rsQuaternionMultiply(rs_quaternion *q, const rs_quaternion *rhs) {
-    rs_quaternion qtmp;
-    rsQuaternionSet(&qtmp, q);
-
-    q->w = qtmp.w*rhs->w - qtmp.x*rhs->x - qtmp.y*rhs->y - qtmp.z*rhs->z;
-    q->x = qtmp.w*rhs->x + qtmp.x*rhs->w + qtmp.y*rhs->z - qtmp.z*rhs->y;
-    q->y = qtmp.w*rhs->y + qtmp.y*rhs->w + qtmp.z*rhs->x - qtmp.x*rhs->z;
-    q->z = qtmp.w*rhs->z + qtmp.z*rhs->w + qtmp.x*rhs->y - qtmp.y*rhs->x;
-    rsQuaternionNormalize(q);
-}
-
-/**
- * Performs spherical linear interpolation between two quaternions
- * @param q result quaternion from interpolation
- * @param q0 first param
- * @param q1 second param
- * @param t how much to interpolate by
- */
-static void
-rsQuaternionSlerp(rs_quaternion *q, const rs_quaternion *q0, const rs_quaternion *q1, float t) {
-    if (t <= 0.0f) {
-        rsQuaternionSet(q, q0);
-        return;
-    }
-    if (t >= 1.0f) {
-        rsQuaternionSet(q, q1);
-        return;
-    }
-
-    rs_quaternion tempq0, tempq1;
-    rsQuaternionSet(&tempq0, q0);
-    rsQuaternionSet(&tempq1, q1);
-
-    float angle = rsQuaternionDot(q0, q1);
-    if (angle < 0) {
-        rsQuaternionMultiply(&tempq0, -1.0f);
-        angle *= -1.0f;
-    }
-
-    float scale, invScale;
-    if (angle + 1.0f > 0.05f) {
-        if (1.0f - angle >= 0.05f) {
-            float theta = acos(angle);
-            float invSinTheta = 1.0f / sin(theta);
-            scale = sin(theta * (1.0f - t)) * invSinTheta;
-            invScale = sin(theta * t) * invSinTheta;
-        } else {
-            scale = 1.0f - t;
-            invScale = t;
-        }
-    } else {
-        rsQuaternionSet(&tempq1, tempq0.z, -tempq0.y, tempq0.x, -tempq0.w);
-        scale = sin(M_PI * (0.5f - t));
-        invScale = sin(M_PI * t);
-    }
-
-    rsQuaternionSet(q, tempq0.w*scale + tempq1.w*invScale, tempq0.x*scale + tempq1.x*invScale,
-                        tempq0.y*scale + tempq1.y*invScale, tempq0.z*scale + tempq1.z*invScale);
-}
-
-/**
- * Computes rotation matrix from the normalized quaternion
- * @param m resulting matrix
- * @param p normalized quaternion
- */
-static void rsQuaternionGetMatrixUnit(rs_matrix4x4 *m, const rs_quaternion *q) {
-    float xx = q->x * q->x;
-    float xy = q->x * q->y;
-    float xz = q->x * q->z;
-    float xw = q->x * q->w;
-    float yy = q->y * q->y;
-    float yz = q->y * q->z;
-    float yw = q->y * q->w;
-    float zz = q->z * q->z;
-    float zw = q->z * q->w;
-
-    m->m[0]  = 1.0f - 2.0f * ( yy + zz );
-    m->m[4]  =        2.0f * ( xy - zw );
-    m->m[8]  =        2.0f * ( xz + yw );
-    m->m[1]  =        2.0f * ( xy + zw );
-    m->m[5]  = 1.0f - 2.0f * ( xx + zz );
-    m->m[9]  =        2.0f * ( yz - xw );
-    m->m[2]  =        2.0f * ( xz - yw );
-    m->m[6]  =        2.0f * ( yz + xw );
-    m->m[10] = 1.0f - 2.0f * ( xx + yy );
-    m->m[3]  = m->m[7] = m->m[11] = m->m[12] = m->m[13] = m->m[14] = 0.0f;
-    m->m[15] = 1.0f;
-}
-
-#endif
-
diff --git a/libs/rs/scriptc/rs_sampler.rsh b/libs/rs/scriptc/rs_sampler.rsh
deleted file mode 100644
index c8948c7..0000000
--- a/libs/rs/scriptc/rs_sampler.rsh
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-/** @file rs_sampler.rsh
- *  \brief Sampler routines
- *
- *
- */
-
-#ifndef __RS_SAMPLER_RSH__
-#define __RS_SAMPLER_RSH__
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-/**
- * @hide
- * Get sampler minification value
- *
- * @param pr
- */
-extern rs_sampler_value __attribute__((overloadable))
-    rsSamplerGetMinification(rs_sampler s);
-
-/**
- * @hide
- * Get sampler magnification value
- *
- * @param pr
- */
-extern rs_sampler_value __attribute__((overloadable))
-    rsSamplerGetMagnification(rs_sampler s);
-
-/**
- * @hide
- * Get sampler wrap S value
- *
- * @param pr
- */
-extern rs_sampler_value __attribute__((overloadable))
-    rsSamplerGetWrapS(rs_sampler s);
-
-/**
- * @hide
- * Get sampler wrap T value
- *
- * @param pr
- */
-extern rs_sampler_value __attribute__((overloadable))
-    rsSamplerGetWrapT(rs_sampler s);
-
-/**
- * @hide
- * Get sampler anisotropy
- *
- * @param pr
- */
-extern float __attribute__((overloadable))
-    rsSamplerGetAnisotropy(rs_sampler s);
-
-#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-#endif // __RS_SAMPLER_RSH__
-
diff --git a/libs/rs/scriptc/rs_time.rsh b/libs/rs/scriptc/rs_time.rsh
deleted file mode 100644
index 60e3dee..0000000
--- a/libs/rs/scriptc/rs_time.rsh
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_time.rsh
- *  \brief Renderscript time routines
- *
- *  This file contains Renderscript functions relating to time and date
- *  manipulation.
- */
-
-#ifndef __RS_TIME_RSH__
-#define __RS_TIME_RSH__
-
-/**
- * Calendar time interpreted as seconds elapsed since the Epoch (00:00:00 on
- * January 1, 1970, Coordinated Universal Time (UTC)).
- */
-typedef int rs_time_t;
-
-/**
- * Data structure for broken-down time components.
- *
- * tm_sec   - Seconds after the minute. This ranges from 0 to 59, but possibly
- *            up to 60 for leap seconds.
- * tm_min   - Minutes after the hour. This ranges from 0 to 59.
- * tm_hour  - Hours past midnight. This ranges from 0 to 23.
- * tm_mday  - Day of the month. This ranges from 1 to 31.
- * tm_mon   - Months since January. This ranges from 0 to 11.
- * tm_year  - Years since 1900.
- * tm_wday  - Days since Sunday. This ranges from 0 to 6.
- * tm_yday  - Days since January 1. This ranges from 0 to 365.
- * tm_isdst - Flag to indicate whether daylight saving time is in effect. The
- *            value is positive if it is in effect, zero if it is not, and
- *            negative if the information is not available.
- */
-typedef struct {
-    int tm_sec;     ///< seconds
-    int tm_min;     ///< minutes
-    int tm_hour;    ///< hours
-    int tm_mday;    ///< day of the month
-    int tm_mon;     ///< month
-    int tm_year;    ///< year
-    int tm_wday;    ///< day of the week
-    int tm_yday;    ///< day of the year
-    int tm_isdst;   ///< daylight savings time
-} rs_tm;
-
-/**
- * Returns the number of seconds since the Epoch (00:00:00 UTC, January 1,
- * 1970). If @p timer is non-NULL, the result is also stored in the memory
- * pointed to by this variable. If an error occurs, a value of -1 is returned.
- *
- * @param timer Location to also store the returned calendar time.
- *
- * @return Seconds since the Epoch.
- */
-extern rs_time_t __attribute__((overloadable))
-    rsTime(rs_time_t *timer);
-
-/**
- * Converts the time specified by @p timer into broken-down time and stores it
- * in @p local. This function also returns a pointer to @p local. If @p local
- * is NULL, this function does nothing and returns NULL.
- *
- * @param local Broken-down time.
- * @param timer Input time as calendar time.
- *
- * @return Pointer to broken-down time (same as input @p local).
- */
-extern rs_tm * __attribute__((overloadable))
-    rsLocaltime(rs_tm *local, const rs_time_t *timer);
-
-/**
- * Returns the current system clock (uptime) in milliseconds.
- *
- * @return Uptime in milliseconds.
- */
-extern int64_t __attribute__((overloadable))
-    rsUptimeMillis(void);
-
-/**
- * Returns the current system clock (uptime) in nanoseconds.
- *
- * @return Uptime in nanoseconds.
- */
-extern int64_t __attribute__((overloadable))
-    rsUptimeNanos(void);
-
-/**
- * Returns the time in seconds since this function was last called in this
- * script.
- *
- * @return Time in seconds.
- */
-extern float __attribute__((overloadable))
-    rsGetDt(void);
-
-#endif
diff --git a/libs/rs/scriptc/rs_types.rsh b/libs/rs/scriptc/rs_types.rsh
deleted file mode 100644
index 10617d8..0000000
--- a/libs/rs/scriptc/rs_types.rsh
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-/** @file rs_types.rsh
- *
- *  Define the standard Renderscript types
- *
- *  Integers
- *  8 bit: char, int8_t
- *  16 bit: short, int16_t
- *  32 bit: int, in32_t
- *  64 bit: long, long long, int64_t
- *
- *  Unsigned Integers
- *  8 bit: uchar, uint8_t
- *  16 bit: ushort, uint16_t
- *  32 bit: uint, uint32_t
- *  64 bit: ulong, uint64_t
- *
- *  Floating point
- *  32 bit: float
- *  64 bit: double
- *
- *  Vectors of length 2, 3, and 4 are supported for all the types above.
- *
- */
-
-#ifndef __RS_TYPES_RSH__
-#define __RS_TYPES_RSH__
-
-#define M_PI        3.14159265358979323846264338327950288f   /* pi */
-
-#include "stdbool.h"
-/**
- * 8 bit integer type
- */
-typedef char int8_t;
-/**
- * 16 bit integer type
- */
-typedef short int16_t;
-/**
- * 32 bit integer type
- */
-typedef int int32_t;
-/**
- * 64 bit integer type
- */
-typedef long long int64_t;
-/**
- * 8 bit unsigned integer type
- */
-typedef unsigned char uint8_t;
-/**
- * 16 bit unsigned integer type
- */
-typedef unsigned short uint16_t;
-/**
- * 32 bit unsigned integer type
- */
-typedef unsigned int uint32_t;
-/**
- * 64 bit unsigned integer type
- */
-typedef unsigned long long uint64_t;
-/**
- * 8 bit unsigned integer type
- */
-typedef uint8_t uchar;
-/**
- * 16 bit unsigned integer type
- */
-typedef uint16_t ushort;
-/**
- * 32 bit unsigned integer type
- */
-typedef uint32_t uint;
-/**
- * Typedef for unsigned long (use for 64-bit unsigned integers)
- */
-typedef uint64_t ulong;
-/**
- * Typedef for unsigned int
- */
-typedef uint32_t size_t;
-/**
- * Typedef for int (use for 32-bit integers)
- */
-typedef int32_t ssize_t;
-
-/**
- * \brief Opaque handle to a Renderscript element.
- *
- * See: android.renderscript.Element
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_element;
-/**
- * \brief Opaque handle to a Renderscript type.
- *
- * See: android.renderscript.Type
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_type;
-/**
- * \brief Opaque handle to a Renderscript allocation.
- *
- * See: android.renderscript.Allocation
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_allocation;
-/**
- * \brief Opaque handle to a Renderscript sampler object.
- *
- * See: android.renderscript.Sampler
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_sampler;
-/**
- * \brief Opaque handle to a Renderscript script object.
- *
- * See: android.renderscript.ScriptC
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_script;
-/**
- * \brief Opaque handle to a Renderscript mesh object.
- *
- * See: android.renderscript.Mesh
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_mesh;
-/**
- * \brief Opaque handle to a Renderscript Path object.
- *
- * See: android.renderscript.Path
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_path;
-/**
- * \brief Opaque handle to a Renderscript ProgramFragment object.
- *
- * See: android.renderscript.ProgramFragment
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_fragment;
-/**
- * \brief Opaque handle to a Renderscript ProgramVertex object.
- *
- * See: android.renderscript.ProgramVertex
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_vertex;
-/**
- * \brief Opaque handle to a Renderscript ProgramRaster object.
- *
- * See: android.renderscript.ProgramRaster
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_raster;
-/**
- * \brief Opaque handle to a Renderscript ProgramStore object.
- *
- * See: android.renderscript.ProgramStore
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_store;
-/**
- * \brief Opaque handle to a Renderscript font object.
- *
- * See: android.renderscript.Font
- */
-typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_font;
-
-/**
- * Vector version of the basic float type.
- * Provides two float fields packed into a single 64 bit field with 64 bit
- * alignment.
- */
-typedef float float2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic float type. Provides three float fields packed
- * into a single 128 bit field with 128 bit alignment.
- */
-typedef float float3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic float type.
- * Provides four float fields packed into a single 128 bit field with 128 bit
- * alignment.
- */
-typedef float float4 __attribute__((ext_vector_type(4)));
-
-/**
- * Vector version of the basic double type. Provides two double fields packed
- * into a single 128 bit field with 128 bit alignment.
- */
-typedef double double2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic double type. Provides three double fields packed
- * into a single 256 bit field with 256 bit alignment.
- */
-typedef double double3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic double type. Provides four double fields packed
- * into a single 256 bit field with 256 bit alignment.
- */
-typedef double double4 __attribute__((ext_vector_type(4)));
-
-/**
- * Vector version of the basic uchar type. Provides two uchar fields packed
- * into a single 16 bit field with 16 bit alignment.
- */
-typedef uchar uchar2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic uchar type. Provides three uchar fields packed
- * into a single 32 bit field with 32 bit alignment.
- */
-typedef uchar uchar3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic uchar type. Provides four uchar fields packed
- * into a single 32 bit field with 32 bit alignment.
- */
-typedef uchar uchar4 __attribute__((ext_vector_type(4)));
-
-/**
- * Vector version of the basic ushort type. Provides two ushort fields packed
- * into a single 32 bit field with 32 bit alignment.
- */
-typedef ushort ushort2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic ushort type. Provides three ushort fields packed
- * into a single 64 bit field with 64 bit alignment.
- */
-typedef ushort ushort3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic ushort type. Provides four ushort fields packed
- * into a single 64 bit field with 64 bit alignment.
- */
-typedef ushort ushort4 __attribute__((ext_vector_type(4)));
-
-/**
- * Vector version of the basic uint type. Provides two uint fields packed into a
- * single 64 bit field with 64 bit alignment.
- */
-typedef uint uint2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic uint type. Provides three uint fields packed into
- * a single 128 bit field with 128 bit alignment.
- */
-typedef uint uint3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic uint type. Provides four uint fields packed into
- * a single 128 bit field with 128 bit alignment.
- */
-typedef uint uint4 __attribute__((ext_vector_type(4)));
-
-/**
- * Vector version of the basic ulong type. Provides two ulong fields packed into
- * a single 128 bit field with 128 bit alignment.
- */
-typedef ulong ulong2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic ulong type. Provides three ulong fields packed
- * into a single 256 bit field with 256 bit alignment.
- */
-typedef ulong ulong3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic ulong type. Provides four ulong fields packed
- * into a single 256 bit field with 256 bit alignment.
- */
-typedef ulong ulong4 __attribute__((ext_vector_type(4)));
-
-/**
- * Vector version of the basic char type. Provides two char fields packed into a
- * single 16 bit field with 16 bit alignment.
- */
-typedef char char2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic char type. Provides three char fields packed into
- * a single 32 bit field with 32 bit alignment.
- */
-typedef char char3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic char type. Provides four char fields packed into
- * a single 32 bit field with 32 bit alignment.
- */
-typedef char char4 __attribute__((ext_vector_type(4)));
-
-/**
- * Vector version of the basic short type. Provides two short fields packed into
- * a single 32 bit field with 32 bit alignment.
- */
-typedef short short2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic short type. Provides three short fields packed
- * into a single 64 bit field with 64 bit alignment.
- */
-typedef short short3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic short type. Provides four short fields packed
- * into a single 64 bit field with 64 bit alignment.
- */
-typedef short short4 __attribute__((ext_vector_type(4)));
-
-/**
- * Vector version of the basic int type. Provides two int fields packed into a
- * single 64 bit field with 64 bit alignment.
- */
-typedef int int2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic int type. Provides three int fields packed into a
- * single 128 bit field with 128 bit alignment.
- */
-typedef int int3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic int type. Provides two four fields packed into a
- * single 128 bit field with 128 bit alignment.
- */
-typedef int int4 __attribute__((ext_vector_type(4)));
-
-/**
- * Vector version of the basic long type. Provides two long fields packed into a
- * single 128 bit field with 128 bit alignment.
- */
-typedef long long2 __attribute__((ext_vector_type(2)));
-/**
- * Vector version of the basic long type. Provides three long fields packed into
- * a single 256 bit field with 256 bit alignment.
- */
-typedef long long3 __attribute__((ext_vector_type(3)));
-/**
- * Vector version of the basic long type. Provides four long fields packed into
- * a single 256 bit field with 256 bit alignment.
- */
-typedef long long4 __attribute__((ext_vector_type(4)));
-
-/**
- * \brief 4x4 float matrix
- *
- * Native holder for RS matrix.  Elements are stored in the array at the
- * location [row*4 + col]
- */
-typedef struct {
-    float m[16];
-} rs_matrix4x4;
-/**
- * \brief 3x3 float matrix
- *
- * Native holder for RS matrix.  Elements are stored in the array at the
- * location [row*3 + col]
- */
-typedef struct {
-    float m[9];
-} rs_matrix3x3;
-/**
- * \brief 2x2 float matrix
- *
- * Native holder for RS matrix.  Elements are stored in the array at the
- * location [row*2 + col]
- */
-typedef struct {
-    float m[4];
-} rs_matrix2x2;
-
-/**
- * quaternion type for use with the quaternion functions
- */
-typedef float4 rs_quaternion;
-
-#define RS_PACKED __attribute__((packed, aligned(4)))
-#define NULL ((void *)0)
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 14))
-
-/**
- * \brief Enum for selecting cube map faces
- */
-typedef enum {
-    RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X = 0,
-    RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_X = 1,
-    RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Y = 2,
-    RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Y = 3,
-    RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Z = 4,
-    RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Z = 5
-} rs_allocation_cubemap_face;
-
-/**
- * \brief Bitfield to specify the usage types for an allocation.
- *
- * These values are ORed together to specify which usages or memory spaces are
- * relevant to an allocation or an operation on an allocation.
- */
-typedef enum {
-    RS_ALLOCATION_USAGE_SCRIPT = 0x0001,
-    RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE = 0x0002,
-    RS_ALLOCATION_USAGE_GRAPHICS_VERTEX = 0x0004,
-    RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS = 0x0008,
-    RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET = 0x0010
-} rs_allocation_usage_type;
-
-#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
-
-#if (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-/**
- * Describes the way mesh vertex data is interpreted when rendering
- *
- **/
-typedef enum {
-    RS_PRIMITIVE_POINT              = 0,
-    RS_PRIMITIVE_LINE               = 1,
-    RS_PRIMITIVE_LINE_STRIP         = 2,
-    RS_PRIMITIVE_TRIANGLE           = 3,
-    RS_PRIMITIVE_TRIANGLE_STRIP     = 4,
-    RS_PRIMITIVE_TRIANGLE_FAN       = 5,
-
-    RS_PRIMITIVE_INVALID            = 100,
-} rs_primitive;
-
-/**
- * \brief Enumeration for possible element data types
- *
- * DataType represents the basic type information for a basic element.  The
- * naming convention follows.  For numeric types it is FLOAT,
- * SIGNED, or UNSIGNED followed by the _BITS where BITS is the
- * size of the data.  BOOLEAN is a true / false (1,0)
- * represented in an 8 bit container.  The UNSIGNED variants
- * with multiple bit definitions are for packed graphical data
- * formats and represent vectors with per vector member sizes
- * which are treated as a single unit for packing and alignment
- * purposes.
- *
- * MATRIX the three matrix types contain FLOAT_32 elements and are treated
- * as 32 bits for alignment purposes.
- *
- * RS_* objects.  32 bit opaque handles.
- */
-typedef enum {
-    RS_TYPE_NONE             = 0,
-    //RS_TYPE_FLOAT_16,
-    RS_TYPE_FLOAT_32         = 2,
-    RS_TYPE_FLOAT_64         = 3,
-    RS_TYPE_SIGNED_8         = 4,
-    RS_TYPE_SIGNED_16        = 5,
-    RS_TYPE_SIGNED_32        = 6,
-    RS_TYPE_SIGNED_64        = 7,
-    RS_TYPE_UNSIGNED_8       = 8,
-    RS_TYPE_UNSIGNED_16      = 9,
-    RS_TYPE_UNSIGNED_32      = 10,
-    RS_TYPE_UNSIGNED_64      = 11,
-
-    RS_TYPE_BOOLEAN          = 12,
-
-    RS_TYPE_UNSIGNED_5_6_5   = 13,
-    RS_TYPE_UNSIGNED_5_5_5_1 = 14,
-    RS_TYPE_UNSIGNED_4_4_4_4 = 15,
-
-    RS_TYPE_MATRIX_4X4       = 16,
-    RS_TYPE_MATRIX_3X3       = 17,
-    RS_TYPE_MATRIX_2X2       = 18,
-
-    RS_TYPE_ELEMENT          = 1000,
-    RS_TYPE_TYPE             = 1001,
-    RS_TYPE_ALLOCATION       = 1002,
-    RS_TYPE_SAMPLER          = 1003,
-    RS_TYPE_SCRIPT           = 1004,
-    RS_TYPE_MESH             = 1005,
-    RS_TYPE_PROGRAM_FRAGMENT = 1006,
-    RS_TYPE_PROGRAM_VERTEX   = 1007,
-    RS_TYPE_PROGRAM_RASTER   = 1008,
-    RS_TYPE_PROGRAM_STORE    = 1009,
-
-    RS_TYPE_INVALID          = 10000,
-} rs_data_type;
-
-/**
- * \brief Enumeration for possible element data kind
- *
- * The special interpretation of the data if required.  This is primarly
- * useful for graphical data.  USER indicates no special interpretation is
- * expected.  PIXEL is used in conjunction with the standard data types for
- * representing texture formats.
- */
-typedef enum {
-    RS_KIND_USER         = 0,
-
-    RS_KIND_PIXEL_L      = 7,
-    RS_KIND_PIXEL_A      = 8,
-    RS_KIND_PIXEL_LA     = 9,
-    RS_KIND_PIXEL_RGB    = 10,
-    RS_KIND_PIXEL_RGBA   = 11,
-    RS_KIND_PIXEL_DEPTH  = 12,
-
-    RS_KIND_INVALID      = 100,
-} rs_data_kind;
-
-typedef enum {
-    RS_DEPTH_FUNC_ALWAYS        = 0,
-    RS_DEPTH_FUNC_LESS          = 1,
-    RS_DEPTH_FUNC_LEQUAL        = 2,
-    RS_DEPTH_FUNC_GREATER       = 3,
-    RS_DEPTH_FUNC_GEQUAL        = 4,
-    RS_DEPTH_FUNC_EQUAL         = 5,
-    RS_DEPTH_FUNC_NOTEQUAL      = 6,
-
-    RS_DEPTH_FUNC_INVALID       = 100,
-} rs_depth_func;
-
-typedef enum {
-    RS_BLEND_SRC_ZERO                   = 0,
-    RS_BLEND_SRC_ONE                    = 1,
-    RS_BLEND_SRC_DST_COLOR              = 2,
-    RS_BLEND_SRC_ONE_MINUS_DST_COLOR    = 3,
-    RS_BLEND_SRC_SRC_ALPHA              = 4,
-    RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA    = 5,
-    RS_BLEND_SRC_DST_ALPHA              = 6,
-    RS_BLEND_SRC_ONE_MINUS_DST_ALPHA    = 7,
-    RS_BLEND_SRC_SRC_ALPHA_SATURATE     = 8,
-
-    RS_BLEND_SRC_INVALID                = 100,
-} rs_blend_src_func;
-
-typedef enum {
-    RS_BLEND_DST_ZERO                   = 0,
-    RS_BLEND_DST_ONE                    = 1,
-    RS_BLEND_DST_SRC_COLOR              = 2,
-    RS_BLEND_DST_ONE_MINUS_SRC_COLOR    = 3,
-    RS_BLEND_DST_SRC_ALPHA              = 4,
-    RS_BLEND_DST_ONE_MINUS_SRC_ALPHA    = 5,
-    RS_BLEND_DST_DST_ALPHA              = 6,
-    RS_BLEND_DST_ONE_MINUS_DST_ALPHA    = 7,
-
-    RS_BLEND_DST_INVALID                = 100,
-} rs_blend_dst_func;
-
-typedef enum {
-    RS_CULL_BACK     = 0,
-    RS_CULL_FRONT    = 1,
-    RS_CULL_NONE     = 2,
-
-    RS_CULL_INVALID  = 100,
-} rs_cull_mode;
-
-typedef enum {
-    RS_SAMPLER_NEAREST              = 0,
-    RS_SAMPLER_LINEAR               = 1,
-    RS_SAMPLER_LINEAR_MIP_LINEAR    = 2,
-    RS_SAMPLER_WRAP                 = 3,
-    RS_SAMPLER_CLAMP                = 4,
-    RS_SAMPLER_LINEAR_MIP_NEAREST   = 5,
-
-    RS_SAMPLER_INVALID              = 100,
-} rs_sampler_value;
-
-#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
-
-#endif // __RS_TYPES_RSH__
diff --git a/libs/rs/spec.h b/libs/rs/spec.h
deleted file mode 100644
index ecc5cc7..0000000
--- a/libs/rs/spec.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef SPEC_H
-#define SPEC_H
-
-#include <string.h>
-#include <stdlib.h>
-
-#if __cplusplus
-extern "C" {
-#endif
-
-extern int num_lines;
-
-typedef struct {
-  int isConst;
-  int type;
-  int bits;
-  int ptrLevel;
-  char name[256];
-  char typeName[256];
-} VarType;
-
-extern VarType *currType;
-
-typedef struct {
-  char name[256];
-  int sync;
-  int handcodeApi;
-  int direct;
-  int nocontext;
-  int paramCount;
-  VarType ret;
-  VarType params[16];
-} ApiEntry;
-
-extern ApiEntry apis[128];
-extern int apiCount;
-
-extern int typeNextState;
-
-#if __cplusplus
-} // extern "C"
-#endif
-
-#endif // SPEC_H
diff --git a/libs/rs/spec.l b/libs/rs/spec.l
deleted file mode 100644
index a24bfd3..0000000
--- a/libs/rs/spec.l
+++ /dev/null
@@ -1,198 +0,0 @@
-%option stack
-
-%x comment
-%x api_entry
-%x api_entry2
-%x api_entry_param
-%x var_type
-
-DIGIT    [0-9]
-ID       [a-zA-Z_][a-zA-Z0-9_]*
-
-    #include "spec.h"
-
-   int num_lines = 0;
-
-   VarType *currType = 0;
-
-   ApiEntry apis[128];
-   int apiCount = 0;
-
-   int typeNextState;
-
-   void checkPointerType() {
-       VarType *baseType = currType;
-       int curPtrLevel = 0;
-       while (curPtrLevel < baseType->ptrLevel) {
-           currType = &apis[apiCount].params[apis[apiCount].paramCount];
-           currType->type = 4;
-           currType->ptrLevel = curPtrLevel;
-           if (currType->ptrLevel > 0) {
-              currType->isConst = 1;
-           }
-           sprintf(currType->typeName, "%s", "size_t");
-           switch(baseType->ptrLevel - curPtrLevel) {
-           case 1:
-              sprintf(currType->name, "%s_length", baseType->name);
-              break;
-           case 2:
-              sprintf(currType->name, "%s_length_length", baseType->name);
-              break;
-           }
-           apis[apiCount].paramCount++;
-           curPtrLevel ++;
-       }
-   }
-
-   extern "C" int yylex();
-
-%%
-
-"/*"         BEGIN(comment);
-<comment>[^*\n]*        /* eat anything that's not a '*' */
-<comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
-<comment>\n             ++num_lines;
-<comment>"*"+"/"        BEGIN(INITIAL);
-
-<*>" "   //printf("found ' '\n");
-<*>"\t"   //printf("found ' '\n");
-<*>"\n"  ++num_lines; //printf("found lf \n");
-
-{ID} {
-    memset(&apis[apiCount], 0, sizeof(ApiEntry));
-    memcpy(apis[apiCount].name, yytext, yyleng);
-    BEGIN(api_entry);
-    }
-
-<api_entry>"{" {
-    BEGIN(api_entry2);
-    }
-
-<api_entry2>"sync" {
-    apis[apiCount].sync = 1;
-    }
-
-<api_entry2>"handcodeApi" {
-    apis[apiCount].handcodeApi = 1;
-    }
-
-<api_entry2>"direct" {
-    apis[apiCount].direct = 1;
-    }
-
-<api_entry2>"nocontext" {
-    apis[apiCount].nocontext = 1;
-    }
-
-<api_entry2>"ret" {
-    currType = &apis[apiCount].ret;
-    typeNextState = api_entry2;
-    BEGIN(var_type);
-    }
-
-<api_entry2>"param" {
-    currType = &apis[apiCount].params[apis[apiCount].paramCount];
-    apis[apiCount].paramCount++;
-    typeNextState = api_entry_param;
-    BEGIN(var_type);
-    }
-
-<var_type>"const" {
-    currType->isConst = 1;
-    }
-
-<var_type>"i8" {
-    currType->type = 1;
-    currType->bits = 8;
-    BEGIN(typeNextState);
-    }
-
-<var_type>"i16" {
-    currType->type = 1;
-    currType->bits = 16;
-    BEGIN(typeNextState);
-    }
-
-<var_type>"i32" {
-    currType->type = 1;
-    currType->bits = 32;
-    BEGIN(typeNextState);
-    }
-
-<var_type>"i64" {
-    currType->type = 1;
-    currType->bits = 64;
-    BEGIN(typeNextState);
-    }
-
-<var_type>"u8" {
-    currType->type = 2;
-    currType->bits = 8;
-    BEGIN(typeNextState);
-    }
-
-<var_type>"u16" {
-    currType->type = 2;
-    currType->bits = 16;
-    BEGIN(typeNextState);
-    }
-
-<var_type>"u32" {
-    currType->type = 2;
-    currType->bits = 32;
-    BEGIN(typeNextState);
-    }
-
-<var_type>"u64" {
-    currType->type = 2;
-    currType->bits = 64;
-    BEGIN(typeNextState);
-    }
-
-<var_type>"f" {
-    currType->type = 3;
-    currType->bits = 32;
-    BEGIN(typeNextState);
-    }
-
-<var_type>"d" {
-    currType->type = 3;
-    currType->bits = 64;
-    BEGIN(typeNextState);
-    }
-
-<var_type>{ID} {
-    currType->type = 4;
-    currType->bits = 32;
-    memcpy(currType->typeName, yytext, yyleng);
-    BEGIN(typeNextState);
-    }
-
-<api_entry_param>"*" {
-    currType->ptrLevel ++;
-    }
-
-<api_entry_param>{ID} {
-    memcpy(currType->name, yytext, yyleng);
-    checkPointerType();
-    BEGIN(api_entry2);
-    }
-
-<api_entry2>"*" {
-    currType->ptrLevel ++;
-    }
-
-<api_entry2>"}" {
-    apiCount++;
-    BEGIN(INITIAL);
-    }
-
-
-%%
-
-
-int yywrap()
-{
-    return 1;
-}
-
diff --git a/libs/rs/tests/Android.mk b/libs/rs/tests/Android.mk
deleted file mode 100644
index 627ff72..0000000
--- a/libs/rs/tests/Android.mk
+++ /dev/null
@@ -1,36 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
-	compute.cpp \
-	ScriptC_mono.cpp
-
-LOCAL_SHARED_LIBRARIES := \
-	libRS \
-	libz \
-	libcutils \
-	libutils \
-	libEGL \
-	libGLESv1_CM \
-	libGLESv2 \
-	libui \
-	libbcc \
-	libbcinfo \
-	libgui
-
-LOCAL_MODULE:= rstest-compute
-
-LOCAL_MODULE_TAGS := tests
-
-intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
-librs_generated_headers := \
-    $(intermediates)/rsgApiStructs.h \
-    $(intermediates)/rsgApiFuncDecl.h
-LOCAL_GENERATED_SOURCES := $(librs_generated_headers)
-
-LOCAL_C_INCLUDES += frameworks/base/libs/rs
-LOCAL_C_INCLUDES += $(intermediates)
-
-
-include $(BUILD_EXECUTABLE)
-
diff --git a/libs/rs/tests/ScriptC_mono.cpp b/libs/rs/tests/ScriptC_mono.cpp
deleted file mode 100644
index a6c63a8..0000000
--- a/libs/rs/tests/ScriptC_mono.cpp
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-
-/*
- * This file is auto-generated. DO NOT MODIFY!
- * The source Renderscript file: mono.rs
- */
-
-
-#include "ScriptC_mono.h"
-
-static const unsigned char __txt[] = {
-    0xde,0xc0,0x17,0x0b,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xd0,0x04,0x00,0x00,
-    0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x42,0x43,0xc0,0xde,0x21,0x0c,0x00,0x00,
-    0x31,0x01,0x00,0x00,0x01,0x10,0x00,0x00,0x12,0x00,0x00,0x00,0x07,0x81,0x23,0x91,
-    0x41,0xc8,0x04,0x49,0x06,0x10,0x32,0x39,0x92,0x01,0x84,0x0c,0x25,0x05,0x08,0x19,
-    0x1e,0x04,0x8b,0x62,0x80,0x14,0x45,0x02,0x42,0x92,0x0b,0x42,0xa4,0x10,0x32,0x14,
-    0x38,0x08,0x18,0x49,0x0a,0x32,0x44,0x24,0x48,0x0a,0x90,0x21,0x23,0xc4,0x52,0x80,
-    0x0c,0x19,0x21,0x72,0x24,0x07,0xc8,0x48,0x11,0x62,0xa8,0xa0,0xa8,0x40,0xc6,0xf0,
-    0x01,0x00,0x00,0x00,0x49,0x18,0x00,0x00,0x08,0x00,0x00,0x00,0x0b,0x8c,0x00,0x04,
-    0x41,0x10,0x04,0x09,0x01,0x04,0x41,0x10,0x04,0x89,0xff,0xff,0xff,0xff,0x1f,0xc0,
-    0x60,0x81,0xf0,0xff,0xff,0xff,0xff,0x03,0x18,0x00,0x00,0x00,0x89,0x20,0x00,0x00,
-    0x14,0x00,0x00,0x00,0x32,0x22,0x48,0x09,0x20,0x64,0x85,0x04,0x93,0x22,0xa4,0x84,
-    0x04,0x93,0x22,0xe3,0x84,0xa1,0x90,0x14,0x12,0x4c,0x8a,0x8c,0x0b,0x84,0xa4,0x4c,
-    0x10,0x54,0x73,0x04,0x60,0x40,0x60,0x06,0x80,0xc4,0x1c,0x01,0x42,0x64,0x04,0x60,
-    0x18,0x81,0x20,0xe8,0x94,0xc1,0x20,0x44,0x69,0x18,0x81,0x10,0x8a,0xb0,0x0e,0xb1,
-    0x61,0x84,0x41,0x28,0x83,0x70,0x8e,0x5e,0x11,0x8e,0xa3,0x38,0x10,0x30,0x8c,0x30,
-    0x00,0x00,0x00,0x00,0x13,0xb0,0x70,0x90,0x87,0x76,0xb0,0x87,0x3b,0x68,0x03,0x77,
-    0x78,0x07,0x77,0x28,0x87,0x36,0x60,0x87,0x74,0x70,0x87,0x7a,0xc0,0x87,0x36,0x38,
-    0x07,0x77,0xa8,0x87,0x72,0x08,0x07,0x71,0x48,0x87,0x0d,0xf2,0x50,0x0e,0x6d,0x00,
-    0x0f,0x7a,0x30,0x07,0x72,0xa0,0x07,0x73,0x20,0x07,0x7a,0x30,0x07,0x72,0xd0,0x06,
-    0xe9,0x10,0x07,0x7a,0x80,0x07,0x7a,0x80,0x07,0x6d,0x90,0x0e,0x78,0xa0,0x07,0x78,
-    0xa0,0x07,0x78,0xd0,0x06,0xe9,0x10,0x07,0x76,0xa0,0x07,0x71,0x60,0x07,0x7a,0x10,
-    0x07,0x76,0xd0,0x06,0xe9,0x30,0x07,0x72,0xa0,0x07,0x73,0x20,0x07,0x7a,0x30,0x07,
-    0x72,0xd0,0x06,0xe9,0x60,0x07,0x74,0xa0,0x07,0x76,0x40,0x07,0x7a,0x60,0x07,0x74,
-    0xd0,0x06,0xe6,0x30,0x07,0x72,0xa0,0x07,0x73,0x20,0x07,0x7a,0x30,0x07,0x72,0xd0,
-    0x06,0xe6,0x60,0x07,0x74,0xa0,0x07,0x76,0x40,0x07,0x7a,0x60,0x07,0x74,0xd0,0x06,
-    0xf6,0x60,0x07,0x74,0xa0,0x07,0x76,0x40,0x07,0x7a,0x60,0x07,0x74,0xd0,0x06,0xf6,
-    0x10,0x07,0x72,0x80,0x07,0x7a,0x60,0x07,0x74,0xa0,0x07,0x71,0x20,0x07,0x78,0xd0,
-    0x06,0xe1,0x00,0x07,0x7a,0x00,0x07,0x7a,0x60,0x07,0x74,0xd0,0x06,0xee,0x30,0x07,
-    0x72,0xd0,0x06,0xb3,0x60,0x07,0x74,0xa0,0xf3,0x40,0x86,0x04,0x32,0x42,0x44,0x04,
-    0x60,0x20,0x30,0x77,0x81,0x59,0x0a,0x34,0x44,0x51,0x00,0x00,0x08,0x00,0x00,0x00,
-    0x80,0x21,0x4a,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x0c,0x51,0x20,0x20,0x00,0x00,
-    0x00,0x00,0x00,0x60,0x88,0x22,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x59,0x20,0x00,
-    0x08,0x00,0x00,0x00,0x32,0x1e,0x98,0x10,0x19,0x11,0x4c,0x90,0x8c,0x09,0x26,0x47,
-    0xc6,0x04,0x43,0x02,0x85,0x50,0x06,0x44,0x4a,0x80,0xc4,0x18,0x81,0xce,0x9a,0x73,
-    0xfe,0x01,0x00,0x00,0x79,0x18,0x00,0x00,0x69,0x00,0x00,0x00,0x43,0x88,0x29,0x98,
-    0x84,0x05,0x87,0x3d,0x94,0x83,0x3c,0xcc,0x43,0x3a,0xbc,0x83,0x3b,0x2c,0x08,0xe2,
-    0x60,0x08,0x31,0x11,0x53,0xb1,0x20,0x52,0x87,0x70,0xb0,0x87,0x70,0xf8,0x05,0x78,
-    0x08,0x87,0x71,0x58,0x87,0x70,0x38,0x87,0x72,0xf8,0x05,0x77,0x08,0x87,0x76,0x28,
-    0x87,0x05,0x63,0x30,0x0e,0xef,0xd0,0x0e,0x6e,0x50,0x0e,0xf8,0x10,0x0e,0xed,0x00,
-    0x0f,0xec,0x50,0x0e,0x6e,0x10,0x0e,0xee,0x40,0x0e,0xf2,0xf0,0x0e,0xe9,0x40,0x0e,
-    0x6e,0x20,0x0f,0xf3,0xe0,0x06,0xe8,0x50,0x0e,0xec,0xc0,0x0e,0xef,0x30,0x0e,0xef,
-    0xd0,0x0e,0xf0,0x50,0x0f,0xf4,0x50,0x0e,0x43,0x04,0x00,0x19,0x42,0x4c,0xc8,0x94,
-    0x2c,0x20,0xce,0x21,0x15,0xdc,0x81,0x1e,0x16,0x04,0x75,0x30,0x84,0x98,0x96,0x49,
-    0x58,0x60,0x8c,0x83,0x29,0xb0,0xc3,0x3b,0x84,0x03,0x3d,0x0c,0x21,0xa6,0x66,0x72,
-    0x16,0x14,0xe7,0x20,0x0a,0xef,0xf0,0x0e,0xec,0xb0,0x40,0x88,0x83,0x38,0x18,0x22,
-    0x4c,0xd0,0x02,0x42,0x1e,0xde,0xe1,0x1d,0xe8,0x61,0x88,0x30,0x49,0x0b,0x82,0x39,
-    0x18,0x42,0x4c,0xd4,0x54,0x2d,0x78,0xde,0xa1,0x1d,0xdc,0x21,0x1d,0xe0,0xe1,0x1d,
-    0xe8,0xa1,0x1c,0xdc,0x81,0x1e,0xc0,0x60,0x1c,0xd0,0x21,0x1c,0xe4,0x61,0x08,0x31,
-    0x59,0x06,0xb0,0x20,0x9a,0x85,0x74,0x68,0x07,0x78,0x60,0x87,0x72,0x00,0x83,0x51,
-    0x78,0x83,0x51,0x58,0x83,0x35,0x00,0x03,0x5a,0x10,0x85,0x50,0x08,0x85,0x11,0xc7,
-    0x18,0xc0,0x83,0x3c,0x84,0xc3,0x39,0xb4,0x43,0x38,0x4c,0x11,0x80,0x61,0xc4,0x34,
-    0x06,0xef,0x00,0x0f,0xf4,0x90,0x0e,0xed,0x90,0x0e,0xfa,0x10,0x0e,0xf4,0x90,0x0e,
-    0xef,0xe0,0x0e,0xbf,0xc0,0x0e,0xe5,0x60,0x0f,0xe5,0xc0,0x0e,0x53,0x02,0x63,0x84,
-    0x33,0x06,0xf2,0x30,0x0f,0xbf,0x50,0x0e,0xf8,0x00,0x0f,0xef,0x20,0x0f,0xf4,0xf0,
-    0x0b,0xf6,0x10,0x0e,0xf2,0x30,0x65,0x38,0x14,0x66,0x04,0x34,0x06,0xf2,0x30,0x0f,
-    0xbf,0xf0,0x0e,0xe2,0xa0,0x0e,0xe5,0x30,0x0e,0xf4,0xf0,0x0b,0xf3,0xc0,0x0e,0xef,
-    0x40,0x0f,0xf3,0x30,0x05,0x18,0x71,0x8d,0x81,0x3c,0xcc,0xc3,0x2f,0x94,0x03,0x3e,
-    0xc0,0xc3,0x3b,0xc8,0x03,0x3d,0xfc,0x82,0x39,0xbc,0x83,0x3c,0x94,0x43,0x38,0x8c,
-    0x03,0x3a,0xfc,0x82,0x3b,0x84,0x43,0x3b,0x94,0xc3,0x94,0xe0,0x19,0x21,0x8d,0x81,
-    0x3c,0xcc,0xc3,0x2f,0x94,0x03,0x3e,0xc0,0xc3,0x3b,0xc8,0x03,0x3d,0xfc,0x82,0x39,
-    0xbc,0x83,0x3c,0x94,0x43,0x38,0x8c,0x03,0x3a,0x4c,0x09,0x22,0x00,0x00,0x00,0x00,
-    0x79,0x18,0x00,0x00,0x0b,0x00,0x00,0x00,0x33,0x08,0x80,0x1c,0xc4,0xe1,0x1c,0x66,
-    0x14,0x01,0x3d,0x88,0x43,0x38,0x84,0xc3,0x8c,0x42,0x80,0x07,0x79,0x78,0x07,0x73,
-    0x98,0xb1,0x0c,0xe6,0x00,0x0f,0xe1,0x30,0x0e,0xe3,0x50,0x0f,0xf2,0x10,0x0e,0xe3,
-    0x90,0x0f,0x00,0x00,0x71,0x20,0x00,0x00,0x13,0x00,0x00,0x00,0x06,0x40,0x18,0x62,
-    0x33,0x99,0x40,0x61,0x6c,0x8e,0xb3,0xd8,0x00,0x11,0x39,0xce,0x64,0x04,0x51,0x24,
-    0xb9,0xcd,0x03,0x08,0x0a,0xe7,0x2c,0x4e,0xc4,0xf3,0x3c,0x6f,0x05,0xcd,0x3f,0xdf,
-    0x83,0x33,0x75,0xd5,0xfd,0x17,0xec,0x6f,0x01,0x86,0xf0,0x2d,0x0e,0x30,0x99,0x81,
-    0xf6,0xcf,0xf5,0x1e,0x49,0x29,0x20,0x28,0x9c,0xb3,0x38,0x51,0xeb,0xf0,0x3c,0xcf,
-    0x77,0xd5,0xfd,0x17,0x00,0x00,0x00,0x00,0x61,0x20,0x00,0x00,0x21,0x00,0x00,0x00,
-    0x13,0x04,0x41,0x2c,0x10,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x04,0x46,0x00,0x68,
-    0xcd,0x00,0x90,0x9b,0x01,0x18,0x6b,0x38,0xe9,0x52,0x4e,0x3f,0xb1,0x8d,0xd9,0xf8,
-    0xab,0x4d,0x5f,0xf6,0x3d,0xa2,0x63,0x0d,0x40,0x20,0x8c,0x00,0x00,0x00,0x00,0x00,
-    0xb4,0x8c,0x11,0x03,0x42,0x08,0x88,0x69,0x90,0x81,0x72,0xa2,0x11,0x83,0x42,0x08,
-    0x8a,0x0a,0x9a,0x63,0x78,0xac,0x66,0x90,0xe1,0x7a,0xa4,0x11,0x03,0x42,0x08,0x0c,
-    0x6c,0x30,0x82,0xc9,0x06,0x00,0xc3,0x81,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
-    0xb6,0x40,0x54,0x3f,0xd2,0x18,0x43,0x51,0xfd,0x0e,0x35,0x01,0x01,0x31,0x00,0x00,
-    0x03,0x00,0x00,0x00,0x5b,0x06,0x20,0x98,0xb6,0x0c,0x47,0x30,0x01,0x00,0x00,0x00,
-    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-};
-
-ScriptC_mono::ScriptC_mono(RenderScript *rs, const char *cacheDir, size_t cacheDirLength) :
-        ScriptC(rs, __txt, sizeof(__txt), "mono.rs", 4, cacheDir, cacheDirLength) {
-}
-
-ScriptC_mono::~ScriptC_mono() {
-}
-
-void ScriptC_mono::forEach_root(const Allocation *ain, const Allocation *aout) const {
-    forEach(0, ain, aout, NULL, 0);
-}
-
diff --git a/libs/rs/tests/ScriptC_mono.h b/libs/rs/tests/ScriptC_mono.h
deleted file mode 100644
index 69c41ac..0000000
--- a/libs/rs/tests/ScriptC_mono.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- */
-
-
-/*
- * This file is auto-generated. DO NOT MODIFY!
- * The source Renderscript file: mono.rs
- */
-
-
-#include "ScriptC.h"
-
-class ScriptC_mono : protected ScriptC {
-private:
-    int32_t __gInt;
-    bool __gBool;
-public:
-    ScriptC_mono(RenderScript *rs, const char *cacheDir, size_t cacheDirLength);
-    virtual ~ScriptC_mono();
-    
-    void set_gInt(int32_t v) {
-        setVar(0, v);
-        __gInt = v;
-    }
-    int32_t get_gInt() const {
-        return __gInt;
-    }
-    
-    float get_cFloat() const {
-        return 1.2f;
-    }
-    
-    void set_gBool(bool v) {
-        setVar(2, v);
-        __gBool = v;
-    }
-    bool get_gBool() const {
-        return __gBool;
-    }
-    
-    void forEach_root(const Allocation *ain, const Allocation *aout) const;
-};
diff --git a/libs/rs/tests/compute.cpp b/libs/rs/tests/compute.cpp
deleted file mode 100644
index 42eaa52..0000000
--- a/libs/rs/tests/compute.cpp
+++ /dev/null
@@ -1,58 +0,0 @@
-
-#include "RenderScript.h"
-#include "Element.h"
-#include "Type.h"
-#include "Allocation.h"
-
-#include "ScriptC_mono.h"
-
-int main(int argc, char** argv)
-{
-
-    RenderScript *rs = new RenderScript();
-    printf("New RS %p\n", rs);
-
-    bool r = rs->init(16);
-    printf("Init returned %i\n", r);
-
-    const Element *e = Element::RGBA_8888(rs);
-    printf("Element %p\n", e);
-
-    Type::Builder tb(rs, e);
-    tb.setX(128);
-    tb.setY(128);
-    const Type *t = tb.create();
-    printf("Type %p\n", t);
-
-
-    Allocation *a1 = Allocation::createSized(rs, e, 1000);
-    printf("Allocation %p\n", a1);
-
-    Allocation *ain = Allocation::createTyped(rs, t);
-    Allocation *aout = Allocation::createTyped(rs, t);
-    printf("Allocation %p %p\n", ain, aout);
-
-    ScriptC_mono * sc = new ScriptC_mono(rs, NULL, 0);
-    printf("new script\n");
-
-    uint32_t *buf = new uint32_t[t->getCount()];
-    for (uint32_t ct=0; ct < t->getCount(); ct++) {
-        buf[ct] = ct | (ct << 16);
-    }
-    //ain->copy1DRangeFrom(0, 128*128, (int32_t *)buf, 128*128*4);
-    ain->copy1DRangeFromUnchecked(0, t->getCount(), buf, t->getCount()*4);
-
-
-
-    sc->forEach_root(ain, aout);
-    printf("for each done\n");
-
-
-    printf("Deleting stuff\n");
-    delete sc;
-    delete t;
-    delete a1;
-    delete e;
-    delete rs;
-    printf("Delete OK\n");
-}
