Merge "Generalize intrinsics" into jb-mr1-dev
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;
 }