diff --git a/driver/rsdBcc.cpp b/driver/rsdBcc.cpp
index a811cfb..37a96a2 100644
--- a/driver/rsdBcc.cpp
+++ b/driver/rsdBcc.cpp
@@ -48,6 +48,7 @@
     bcc::RSExecutable *mExecutable;
 
     Allocation **mBoundAllocs;
+    RsdIntriniscFuncs_t mIntrinsicFuncs;
 };
 
 typedef void (*outer_foreach_t)(
@@ -176,11 +177,7 @@
     }
     s->mHal.drv = drv;
     drv->mIntrinsicID = iid;
-
-    s->mHal.info.exportedVariableCount = 1;
-
-
-
+    rsdIntrinsic_Init(rsc, s, iid, &drv->mIntrinsicFuncs);
 
     pthread_mutex_unlock(&rsdgInitMutex);
     return true;
@@ -286,7 +283,7 @@
     DrvScript *drv = (DrvScript *)s->mHal.drv;
 
     if (drv->mIntrinsicID) {
-        mtls.kernel = (void (*)())&rsdIntrinsic_Convolve3x3_uchar4;
+        mtls.kernel = (void (*)())drv->mIntrinsicFuncs.root;
     } else {
         rsAssert(slot < drv->mExecutable->getExportForeachFuncAddrs().size());
         mtls.kernel = reinterpret_cast<ForEachFunc_t>(
@@ -460,7 +457,7 @@
     //ALOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength);
 
     if (drv->mIntrinsicID) {
-        rsdIntrinsic_Convolve3x3_SetVar(dc, script, slot, data, dataLength);
+        drv->mIntrinsicFuncs.setVar(dc, script, slot, data, dataLength);
         return;
     }
 
@@ -521,6 +518,11 @@
     //rsAssert(!script->mFieldIsObject[slot]);
     //ALOGE("setGlobalBind %p %p %i %p", dc, script, slot, data);
 
+    if (drv->mIntrinsicID) {
+        drv->mIntrinsicFuncs.bind(dc, script, slot, data);
+        return;
+    }
+
     int32_t *destPtr = reinterpret_cast<int32_t *>(
                           drv->mExecutable->getExportVarAddrs()[slot]);
     if (!destPtr) {
diff --git a/driver/rsdIntrinsics.cpp b/driver/rsdIntrinsics.cpp
index b235669..7553150 100644
--- a/driver/rsdIntrinsics.cpp
+++ b/driver/rsdIntrinsics.cpp
@@ -17,7 +17,7 @@
 
 #include "rsdCore.h"
 #include "rsdIntrinsics.h"
-
+#include "rsdAllocation.h"
 
 typedef uint8_t uchar;
 typedef uint16_t ushort;
@@ -98,21 +98,35 @@
                           -1.f,   5.f, -1.f,
                            0.f,  -1.f,  0.f };
 
-void rsdIntrinsic_Convolve3x3_SetVar(const Context *dc, const Script *script,
-                           uint32_t slot, void *data, size_t dataLength) {
+ObjectBaseRef<Allocation> gAlloc;
+
+static void Convolve3x3_Bind(const Context *dc, const Script *script,
+                             uint32_t slot, Allocation *data) {
+
+    ALOGE("bind %p", data);
+    rsAssert(slot == 1);
+    gAlloc.set(data);
+}
+
+static void Convolve3x3_SetVar(const Context *dc, const Script *script,
+                               uint32_t slot, void *data, size_t dataLength) {
+
+    rsAssert(slot == 0);
     memcpy (params, data, dataLength);
 }
 
-void rsdIntrinsic_Convolve3x3_uchar4(const RsForEachStubParamStruct *p,
-                                     uint32_t xstart, uint32_t xend,
-                                     uint32_t instep, uint32_t outstep) {
+static void Convolve3x3_uchar4(const RsForEachStubParamStruct *p,
+                                    uint32_t xstart, uint32_t xend,
+                                    uint32_t instep, uint32_t outstep) {
+
+    DrvAllocation *din = (DrvAllocation *)gAlloc->mHal.drv;
+    const uchar *pin = (const uchar *)din->lod[0].mallocPtr;
 
     uint32_t y1 = rsMin((int32_t)p->y + 1, (int32_t)p->dimY);
     uint32_t y2 = rsMax((int32_t)p->y - 1, 0);
-    const uint8_t *bp = (const uint8_t *)p->ptrIn;
-    const uchar4 *py0 = (const uchar4 *)(bp + p->yStrideIn * y2);
-    const uchar4 *py1 = (const uchar4 *)(bp + p->yStrideIn * p->y);
-    const uchar4 *py2 = (const uchar4 *)(bp + p->yStrideIn * y1);
+    const uchar4 *py0 = (const uchar4 *)(pin + din->lod[0].stride * y2);
+    const uchar4 *py1 = (const uchar4 *)(pin + din->lod[0].stride * p->y);
+    const uchar4 *py2 = (const uchar4 *)(pin + din->lod[0].stride * y1);
 
     uchar4 *out = (uchar4 *)p->out;
 
@@ -148,3 +162,22 @@
 
 }
 
+
+
+
+
+bool rsdIntrinsic_Init(const android::renderscript::Context *dc,
+                       android::renderscript::Script *script,
+                       RsScriptIntrinsicID iid,
+                       RsdIntriniscFuncs_t *funcs) {
+
+    script->mHal.info.exportedVariableCount = 2;
+
+    funcs->bind = Convolve3x3_Bind;
+    funcs->setVar = Convolve3x3_SetVar;
+    funcs->root = Convolve3x3_uchar4;
+    return true;
+}
+
+
+
diff --git a/driver/rsdIntrinsics.h b/driver/rsdIntrinsics.h
index 5aecd34..efa37fb 100644
--- a/driver/rsdIntrinsics.h
+++ b/driver/rsdIntrinsics.h
@@ -19,12 +19,22 @@
 
 #include <rs_hal.h>
 
-void rsdIntrinsic_Convolve3x3_SetVar(const android::renderscript::Context *dc,
-                                     const android::renderscript::Script *script,
-                                     uint32_t slot, void *data, size_t dataLength);
-void rsdIntrinsic_Convolve3x3_uchar4(const android::renderscript::RsForEachStubParamStruct *,
-                                     uint32_t x1, uint32_t x2,
-                                     uint32_t instep, uint32_t outstep);
+typedef struct RsdIntriniscFuncs_rec {
+
+    void (*bind)(const android::renderscript::Context *dc,
+                 const android::renderscript::Script *script,
+                 uint32_t slot, android::renderscript::Allocation *data);
+    void (*setVar)(const android::renderscript::Context *dc,
+                   const android::renderscript::Script *script,
+                   uint32_t slot, void *data, size_t dataLength);
+    void (*root)(const android::renderscript::RsForEachStubParamStruct *,
+                 uint32_t x1, uint32_t x2, uint32_t instep, uint32_t outstep);
+
+} RsdIntriniscFuncs_t;
+
+bool rsdIntrinsic_Init(const android::renderscript::Context *dc,
+                       android::renderscript::Script *script,
+                       RsScriptIntrinsicID id, RsdIntriniscFuncs_t *funcs);
 
 
 
diff --git a/rsScriptIntrinsic.cpp b/rsScriptIntrinsic.cpp
index d732576..51f0a5d 100644
--- a/rsScriptIntrinsic.cpp
+++ b/rsScriptIntrinsic.cpp
@@ -30,8 +30,12 @@
 bool ScriptIntrinsic::init(Context *rsc, RsScriptIntrinsicID iid, Element *e) {
     mIntrinsicID = iid;
     mElement.set(e);
+    mSlots = new ObjectBaseRef<Allocation>[2];
+    mTypes = new ObjectBaseRef<const Type>[2];
+
     rsc->mHal.funcs.script.initIntrinsic(rsc, this, iid, e);
 
+
     return true;
 }
 
