summaryrefslogtreecommitdiffstats
path: root/libs/rs/rsScriptC.cpp
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2010-07-19 15:38:19 -0700
committerJason Sams <rjsams@android.com>2010-07-19 15:38:19 -0700
commit8e6c17fcc40bfb2391dcadecb397431239ab8a18 (patch)
tree78253130ab783fb7bf0885a8ef121edd0bba2f04 /libs/rs/rsScriptC.cpp
parent6ef3593c3666dda3718e7e06547498ec33451690 (diff)
downloadframeworks_base-8e6c17fcc40bfb2391dcadecb397431239ab8a18.zip
frameworks_base-8e6c17fcc40bfb2391dcadecb397431239ab8a18.tar.gz
frameworks_base-8e6c17fcc40bfb2391dcadecb397431239ab8a18.tar.bz2
Threading RS ForEach.
Change-Id: I5d6fe4db2b6ac0613394bc5a066ff90ec146d60e
Diffstat (limited to 'libs/rs/rsScriptC.cpp')
-rw-r--r--libs/rs/rsScriptC.cpp161
1 files changed, 122 insertions, 39 deletions
diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp
index b87ac28..9693b16 100644
--- a/libs/rs/rsScriptC.cpp
+++ b/libs/rs/rsScriptC.cpp
@@ -137,72 +137,155 @@ uint32_t ScriptC::run(Context *rsc)
}
+typedef struct {
+ Context *rsc;
+ ScriptC *script;
+ const Allocation * ain;
+ Allocation * aout;
+ const void * usr;
+
+ 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 int (*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;
+ LOGE("usr %p, idx %i", usr, idx);
+
+ 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;
+ }
+
+ //LOGE("usr idx %i, x %i,%i y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd);
+
+ for (uint32_t y = yStart; y < yEnd; y++) {
+ uint32_t offset = mtls->dimX * y;
+ uint8_t *xPtrOut = mtls->ptrOut + (mtls->eStrideOut * offset);
+ const uint8_t *xPtrIn = mtls->ptrIn + (mtls->eStrideIn * offset);
+
+ for (uint32_t x = mtls->xStart; x < mtls->xEnd; x++) {
+ ((rs_t)mtls->script->mProgram.mRoot) (xPtrIn, xPtrOut, mtls->usr, x, y, 0, 0);
+ xPtrIn += mtls->eStrideIn;
+ xPtrOut += mtls->eStrideOut;
+ }
+ }
+ }
+
+}
+
void ScriptC::runForEach(Context *rsc,
const Allocation * ain,
Allocation * aout,
const void * usr,
const RsScriptCall *sc)
{
- uint32_t dimX = ain->getType()->getDimX();
- uint32_t dimY = ain->getType()->getDimY();
- uint32_t dimZ = ain->getType()->getDimZ();
- uint32_t dimA = 0;//ain->getType()->getDimArray();
-
- uint32_t xStart = 0;
- uint32_t xEnd = 0;
- uint32_t yStart = 0;
- uint32_t yEnd = 0;
- uint32_t zStart = 0;
- uint32_t zEnd = 0;
- uint32_t arrayStart = 0;
- uint32_t arrayEnd = 0;
+ MTLaunchStruct mtls;
+ memset(&mtls, 0, sizeof(mtls));
+
+ 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)) {
- xStart = 0;
- xEnd = ain->getType()->getDimX();
+ mtls.xEnd = mtls.dimX;
} else {
- rsAssert(xStart < dimX);
- rsAssert(xEnd <= dimX);
+ rsAssert(sc->xStart < mtls.dimX);
+ rsAssert(sc->xEnd <= mtls.dimX);
rsAssert(sc->xStart < sc->xEnd);
- xStart = rsMin(dimX, sc->xStart);
- xEnd = rsMin(dimX, sc->xEnd);
- if (xStart >= xEnd) return;
+ 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)) {
- yStart = 0;
- yEnd = ain->getType()->getDimY();
+ mtls.yEnd = mtls.dimY;
} else {
- rsAssert(yStart < dimY);
- rsAssert(yEnd <= dimY);
+ rsAssert(sc->yStart < mtls.dimY);
+ rsAssert(sc->yEnd <= mtls.dimY);
rsAssert(sc->yStart < sc->yEnd);
- yStart = rsMin(dimY, sc->yStart);
- yEnd = rsMin(dimY, sc->yEnd);
- if (yStart >= yEnd) return;
+ mtls.yStart = rsMin(mtls.dimY, sc->yStart);
+ mtls.yEnd = rsMin(mtls.dimY, sc->yEnd);
+ if (mtls.yStart >= mtls.yEnd) return;
}
- xEnd = rsMax((uint32_t)1, xEnd);
- yEnd = rsMax((uint32_t)1, yEnd);
- zEnd = rsMax((uint32_t)1, zEnd);
- arrayEnd = rsMax((uint32_t)1, arrayEnd);
+ 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->getType()->getDimZ() == 0);
setupScript(rsc);
Script * oldTLS = setTLS(this);
- typedef int (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t);
- const uint8_t *ptrIn = (const uint8_t *)ain->getPtr();
- uint32_t eStrideIn = ain->getType()->getElementSizeBytes();
+ mtls.rsc = rsc;
+ mtls.ain = ain;
+ mtls.aout = aout;
+ mtls.script = this;
+ mtls.usr = usr;
+ 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();
+ }
- uint8_t *ptrOut = NULL;
- uint32_t eStrideOut = 0;
+ mtls.ptrOut = NULL;
+ mtls.eStrideOut = 0;
if (aout) {
- ptrOut = (uint8_t *)aout->getPtr();
- eStrideOut = aout->getType()->getElementSizeBytes();
+ mtls.ptrOut = (uint8_t *)aout->getPtr();
+ mtls.eStrideOut = aout->getType()->getElementSizeBytes();
}
+
+ {
+ LOGE("launch 1");
+ rsc->launchThreads(wc_xy, &mtls);
+ LOGE("launch 2");
+ }
+
+/*
for (uint32_t ar = arrayStart; ar < arrayEnd; ar++) {
for (uint32_t z = zStart; z < zEnd; z++) {
for (uint32_t y = yStart; y < yEnd; y++) {
@@ -221,7 +304,7 @@ void ScriptC::runForEach(Context *rsc,
}
}
-
+*/
setTLS(oldTLS);
}