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;
}