From 8e6c17fcc40bfb2391dcadecb397431239ab8a18 Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Mon, 19 Jul 2010 15:38:19 -0700 Subject: [PATCH] Threading RS ForEach. Change-Id: I5d6fe4db2b6ac0613394bc5a066ff90ec146d60e --- .../res/raw/horizontal_blur.rs | 7 +- .../res/raw/horizontal_blur_bc.bc | Bin 1324 -> 1348 bytes libs/rs/java/ImageProcessing/res/raw/ip.rsh | 2 + .../java/ImageProcessing/res/raw/threshold.rs | 123 +++---------- .../ImageProcessing/res/raw/threshold_bc.bc | Bin 7208 -> 3304 bytes .../ImageProcessing/res/raw/vertical_blur.rs | 20 +-- .../res/raw/vertical_blur_bc.bc | Bin 1464 -> 1468 bytes .../rs/image/ImageProcessingActivity.java | 5 +- .../rs/image/ScriptC_Horizontal_blur.java | 12 -- .../rs/image/ScriptC_Vertical_blur.java | 12 -- libs/rs/rsContext.cpp | 67 +++++++- libs/rs/rsContext.h | 18 ++ libs/rs/rsScriptC.cpp | 161 +++++++++++++----- libs/rs/rsScriptC_Lib.cpp | 33 ++++ libs/rs/rsUtils.h | 1 + libs/rs/scriptc/rs_math.rsh | 6 + 16 files changed, 286 insertions(+), 181 deletions(-) diff --git a/libs/rs/java/ImageProcessing/res/raw/horizontal_blur.rs b/libs/rs/java/ImageProcessing/res/raw/horizontal_blur.rs index 7b0e6bcc68fbb..10815fb33075d 100644 --- a/libs/rs/java/ImageProcessing/res/raw/horizontal_blur.rs +++ b/libs/rs/java/ImageProcessing/res/raw/horizontal_blur.rs @@ -5,17 +5,14 @@ #include "ip.rsh" -uchar4 * ScratchPixel; - -#pragma rs export_var(ScratchPixel) - void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32_t y) { uchar4 *output = (uchar4 *)v_out; - const uchar4 *input = (uchar4 *)v_in; const FilterStruct *fs = (const FilterStruct *)usrData; + const uchar4 *input = (const uchar4 *)rsGetElementAt(fs->ain, 0, y); float4 blurredPixel = 0; float4 currentPixel = 0; + for(int r = -fs->radius; r <= fs->radius; r ++) { // Stepping left and right away from the pixel int validW = x + r; diff --git a/libs/rs/java/ImageProcessing/res/raw/horizontal_blur_bc.bc b/libs/rs/java/ImageProcessing/res/raw/horizontal_blur_bc.bc index c9ba5d9c5cec28c8666ac0e1db570c1838f76c32..5920f3ab0d47eeba6a93e6465cd9d765a7b276ce 100644 GIT binary patch delta 1047 zcmWlYdrVVz6vt0{+skcpEiI+n1*_ibf`ZlEQUs>ew6uj{Dzwm`2FWh+7`h1v)5I*S zEw7mYrUioRAKwfc43AGT{4S5Wc$*??RGi-webX#EAe)pIBKIfd|oNvzW zoc!*IgJMyJF)*tl0dl;e<2;eKcpJ;QSN}r?qrgrB!~#I_PK$^xt8at^vqdOMFo%ea zoeO+bqFgYooBKS#yW*Om1*m4@N`x8E2>JGm~pusH|c{e)&ajPtbjEkgEJumvX&~s;|U9V?svUJ`a6u9M{dfR&*oM~k7Gqwuk%mnbLcx#&SgH=2M7Zc4} zBP~C1yWT%wI9h-*ak=3ao&8Soy?eNj!y!RO~GZVo-k8{M+%y$fNhieBCi4x+=YGsn= zrYNlWDkDjWLYH!{=SInirUHFPnxh&xPHRUZV!zWvW?Ju~=}QCv=h66Hmk>GmF9*D_ z^0i3s4UT<3a_s+^%F;!?W*)+50)>UwubX3`)*S5wW;+=%>3%m zRH+d&?kn%1zqj$c&!ta41mU<T%IW<~aDZX(+=i)7&04tB({-_J|Y{-A?Ejq7{A``)x9_ z!4aq@{qJ^x{a;HhmNjQOGEU-o)^N#k0>_mQx0)9lBDzWbk6X*8E?6AZ&p#HbM`5Gq zJ{e$6SXK6+y23|{CK@dg;1UJEM^<~;r3}s~;XDn%{VZH>x}rT9pf+pUvXn6v>ud&N W(w@n$%bJK*x9kG>d`dP~2Jk;R`F&*o delta 977 zcmW-fdrVtZ9LIm{y|>(!3%55d>=p{#hB<-Jq%DL(Df5;V=tu+QG4}^VTWK&cw$!wi$(Xt&%Pfj4S=6ziERlaa^(5!>JHL}} zey?-VvQK5wW~=Z}Ljl-h(u1O$n7bqgpo;@wVy8+f?x;m9RW4tkAl4xEutDw$B$gN) z6QxL;4}sQ%Pcq-I5Q#lp37F`xoh!H5;JT=6%6u6>1i%-P00aOSN-vTs#u1H3_p~kI zR#Q2;JI(^AkX20VwugzO>d1&Wj5S3tlhAC+SQ}IHr96^UQ2u{7`iKxPAPXf1I$WBlU|=x~@@w|8dEJyM+gE za{!-Zli{{%IkMTJ@K$J#lW)WY+2jH#P;iw2XuEV{?T>ewlMm7tDxCI$RNnbf$u-LA zKlP$=+5KiEc16q0&uHI@N2;o>zIK6U6A+El;owOjApHw@nLpCk{D6eTQ0a@Fute1BddPhdmE+;hpy2DE7yk{~Uq z66f5*+*Fc|?qCLGuwl#zga^4(#f0H)YKE8HVnbyWugg3eZ2Ow>Tylae07wPVKwuE< z#cs#a$m&LxzinsvsIUj|iNr&8^!z!;s6wl~jYGRe1#^>k58{y_yyc(9y8(|0vuc03 z#w|NVv0vmr9|mH@!3^%}oppBEsLDgkWarK#w}1GSQn9tZO|X`X@wWQ~><-zAqMvhI@bfK_|~AlHtaTjoi_jLtw+4>t2%8X zjy?$-6hhQ&=d{It-!l9GsjTi*GS-v*>0ejh^S*?1?|LnWjlSmW*=I%E@o8o978s*; zo#^Y*>*-ggvkVm9=5%K?1&XcBuVNgp6tRZ>IlaBtrHS$_%!=dxPM*&lKyBRpqCkC4 zc|^ePwdwT(oj3bBG)=j>`_gVvu0h!6-D@YRzlEJI^W;CCsWtkQ9qWo^7mE_ld5aLY zy%nRV@S&QqOznXaA3=A0tgIdzEXQ=zhTgF>phgQS71JGA}-{-#(e diff --git a/libs/rs/java/ImageProcessing/res/raw/ip.rsh b/libs/rs/java/ImageProcessing/res/raw/ip.rsh index 4073304f6490f..dea92c3568d2f 100644 --- a/libs/rs/java/ImageProcessing/res/raw/ip.rsh +++ b/libs/rs/java/ImageProcessing/res/raw/ip.rsh @@ -3,6 +3,8 @@ #define MAX_RADIUS 25 typedef struct { + rs_allocation ain; + float *gaussian; //[MAX_RADIUS * 2 + 1]; rs_matrix3x3 colorMat; diff --git a/libs/rs/java/ImageProcessing/res/raw/threshold.rs b/libs/rs/java/ImageProcessing/res/raw/threshold.rs index ecbfac4631e61..aa6b6fa8a179c 100644 --- a/libs/rs/java/ImageProcessing/res/raw/threshold.rs +++ b/libs/rs/java/ImageProcessing/res/raw/threshold.rs @@ -24,7 +24,6 @@ float saturation; static float inWMinInB; static float outWMinOutB; static float overInWMinInB; -static FilterStruct filterStruct; #pragma rs export_var(height, width, radius, InPixel, OutPixel, ScratchPixel, inBlack, outBlack, inWhite, outWhite, gamma, saturation, InPixel, OutPixel, ScratchPixel, vBlurScript, hBlurScript) #pragma rs export_func(filter, filterBenchmark); @@ -106,138 +105,70 @@ static void computeGaussianWeights() { } } -// This needs to be inline -static float4 levelsSaturation(float4 currentPixel) { - float3 temp = rsMatrixMultiply(&colorMat, currentPixel.xyz); - temp = (clamp(temp, 0.1f, 255.f) - inBlack) * overInWMinInB; - temp = pow(temp, (float3)gamma); - currentPixel.xyz = clamp(temp * outWMinOutB + outBlack, 0.1f, 255.f); - return currentPixel; -} - static void processNoBlur() { - int w, h, r; - int count = 0; - float inWMinInB = inWhite - inBlack; float outWMinOutB = outWhite - outBlack; float4 currentPixel = 0; - for(h = 0; h < height; h ++) { - for(w = 0; w < width; w ++) { - uchar4 *input = InPixel + h*width + w; + for(int h = 0; h < height; h ++) { + uchar4 *input = InPixel + h*width; + uchar4 *output = OutPixel + h*width; + for(int w = 0; w < width; w ++) { //currentPixel.xyz = convert_float3(input.xyz); currentPixel.x = (float)(input->x); currentPixel.y = (float)(input->y); currentPixel.z = (float)(input->z); - currentPixel = levelsSaturation(currentPixel); + float3 temp = rsMatrixMultiply(&colorMat, currentPixel.xyz); + temp = (clamp(temp, 0.f, 255.f) - inBlack) * overInWMinInB; + temp = pow(temp, (float3)gamma); + currentPixel.xyz = clamp(temp * outWMinOutB + outBlack, 0.f, 255.f); - uchar4 *output = OutPixel + h*width + w; //output.xyz = convert_uchar3(currentPixel.xyz); output->x = (uint8_t)currentPixel.x; output->y = (uint8_t)currentPixel.y; output->z = (uint8_t)currentPixel.z; output->w = input->w; - } - } - rsSendToClient(&count, 1, 4, 0); -} -static void horizontalBlurLevels() { - float4 blurredPixel = 0; - float4 currentPixel = 0; - // Horizontal blur - int w, h, r; - for(h = 0; h < height; h ++) { - uchar4 *output = OutPixel + h*width; - - for(w = 0; w < width; w ++) { - blurredPixel = 0; - - for(r = -radius; r <= radius; r ++) { - // Stepping left and right away from the pixel - int validW = w + r; - // Clamp to zero and width max() isn't exposed for ints yet - if(validW < 0) { - validW = 0; - } - if(validW > width - 1) { - validW = width - 1; - } - //int validW = rsClamp(w + r, 0, width - 1); - - uchar4 *input = InPixel + h*width + validW; - - float weight = gaussian[r + radius]; - currentPixel.x = (float)(input->x); - currentPixel.y = (float)(input->y); - currentPixel.z = (float)(input->z); - //currentPixel.w = (float)(input->a); - - blurredPixel.xyz += currentPixel.xyz * weight; - } - - blurredPixel = levelsSaturation(blurredPixel); - - output->x = (uint8_t)blurredPixel.x; - output->y = (uint8_t)blurredPixel.y; - output->z = (uint8_t)blurredPixel.z; - //output->a = (uint8_t)blurredPixel.w; + input++; output++; } } } -static void initStructs() { - filterStruct.gaussian = gaussian; - filterStruct.width = width; - filterStruct.height = height; - filterStruct.radius = radius; +static void blur() { + computeGaussianWeights(); + + FilterStruct fs; + fs.gaussian = gaussian; + fs.width = width; + fs.height = height; + fs.radius = radius; + + fs.ain = rsGetAllocation(InPixel); + rsForEach(hBlurScript, fs.ain, rsGetAllocation(ScratchPixel), &fs); + + fs.ain = rsGetAllocation(ScratchPixel); + rsForEach(vBlurScript, fs.ain, rsGetAllocation(OutPixel), &fs); } void filter() { - RS_DEBUG(height); - RS_DEBUG(width); RS_DEBUG(radius); - initStructs(); - computeColorMatrix(); - if(radius == 0) { - processNoBlur(); - return; + if(radius > 0) { + blur(); } - - computeGaussianWeights(); - - horizontalBlurLevels(); - - rsForEach(vBlurScript, - rsGetAllocation(InPixel), - rsGetAllocation(OutPixel), - &filterStruct); + processNoBlur(); int count = 0; rsSendToClient(&count, 1, 4, 0); } void filterBenchmark() { - initStructs(); - - computeGaussianWeights(); - - rsForEach(hBlurScript, - rsGetAllocation(InPixel), - rsGetAllocation(OutPixel), - &filterStruct); - - rsForEach(vBlurScript, - rsGetAllocation(InPixel), - rsGetAllocation(OutPixel), - &filterStruct); + blur(); int count = 0; rsSendToClient(&count, 1, 4, 0); diff --git a/libs/rs/java/ImageProcessing/res/raw/threshold_bc.bc b/libs/rs/java/ImageProcessing/res/raw/threshold_bc.bc index 8f37fdc349ccb75016b1c773b8531e9b320d4b58..2b5d2543c38d3bdf20b11ec847651c5e0d30b07c 100644 GIT binary patch delta 2682 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, x, 0); float4 blurredPixel = 0; float4 currentPixel = 0; @@ -27,19 +23,21 @@ void root(const void *v_in, void *v_out, const void *usrData, uint32_t x, uint32 validH = fs->height - 1; } - uchar4 *input = ScratchPixel + validH * fs->width + x; + const uchar4 *i = input + validH * fs->width; + //const uchar4 *i = (const uchar4 *)rsGetElementAt(fs->ain, x, validH); float weight = fs->gaussian[r + fs->radius]; - currentPixel.x = (float)(input->x); - currentPixel.y = (float)(input->y); - currentPixel.z = (float)(input->z); + currentPixel.x = (float)(i->x); + currentPixel.y = (float)(i->y); + currentPixel.z = (float)(i->z); blurredPixel.xyz += currentPixel.xyz * weight; #else int validH = rsClamp(y + r, 0, height - 1); - uchar4 *input = ScratchPixel + validH * width + x; - blurredPixel.xyz += convert_float3(input->xyz) * gaussian[r + fs->radius]; + validH -= y; + uchar4 *i = input + validH * width + x; + blurredPixel.xyz += convert_float3(i->xyz) * gaussian[r + fs->radius]; #endif } diff --git a/libs/rs/java/ImageProcessing/res/raw/vertical_blur_bc.bc b/libs/rs/java/ImageProcessing/res/raw/vertical_blur_bc.bc index af1cd8e097772e71214791fa9ad64b392a7b1195..be5d0e4ee69b223b3f84b7f370851cdf11845f45 100644 GIT binary patch delta 1195 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 #include +#include #include @@ -355,6 +356,49 @@ void * Context::threadProc(void *vrsc) return NULL; } +void * Context::helperThreadProc(void *vrsc) +{ + Context *rsc = static_cast(vrsc); + uint32_t idx = (uint32_t)android_atomic_inc(&rsc->mWorkers.mLaunchCount); + + LOGE("helperThreadProc 1 %p idx=%i", rsc, idx); + + rsc->mWorkers.mLaunchSignals[idx].init(); + rsc->mWorkers.mNativeThreadId[idx] = gettid(); + + //cpu_set_t cpset[16]; + //int ret = sched_getaffinity(rsc->mWorkers.mNativeThreadId[idx], sizeof(cpset), &cpset); + //LOGE("ret = %i", ret); + +//sched_setaffinity + + setpriority(PRIO_PROCESS, rsc->mWorkers.mNativeThreadId[idx], rsc->mThreadPriority); + while(rsc->mRunning) { + rsc->mWorkers.mLaunchSignals[idx].wait(); + if (rsc->mWorkers.mLaunchCallback) { + LOGE("helperThreadProc 4"); + rsc->mWorkers.mLaunchCallback(rsc->mWorkers.mLaunchData, idx); + } + LOGE("helperThreadProc 5"); + android_atomic_dec(&rsc->mWorkers.mRunningCount); + rsc->mWorkers.mCompleteSignal.set(); + } + return NULL; +} + +void Context::launchThreads(WorkerCallback_t cbk, void *data) +{ + mWorkers.mLaunchData = data; + mWorkers.mLaunchCallback = cbk; + mWorkers.mRunningCount = (int)mWorkers.mCount; + for (uint32_t ct = 0; ct < mWorkers.mCount; ct++) { + mWorkers.mLaunchSignals[ct].set(); + } + while(mWorkers.mRunningCount) { + mWorkers.mCompleteSignal.wait(); + } +} + void Context::setPriority(int32_t p) { // Note: If we put this in the proper "background" policy @@ -371,7 +415,10 @@ void Context::setPriority(int32_t p) // success; reset the priority as well } #else - setpriority(PRIO_PROCESS, mNativeThreadId, p); + setpriority(PRIO_PROCESS, mNativeThreadId, p); + for (uint32_t ct=0; ct < mWorkers.mCount; ct++) { + setpriority(PRIO_PROCESS, mWorkers.mNativeThreadId[ct], p); + } #endif } @@ -421,10 +468,26 @@ Context::Context(Device *dev, bool isGraphics, bool useDepth) timerInit(); timerSet(RS_TIMER_INTERNAL); - LOGV("RS Launching thread"); + LOGV("RS Launching thread(s)"); + mWorkers.mCount = 2; + mWorkers.mThreadId = (pthread_t *) calloc(mWorkers.mCount, sizeof(pthread_t)); + mWorkers.mNativeThreadId = (pid_t *) calloc(mWorkers.mCount, sizeof(pid_t)); + mWorkers.mLaunchSignals = new Signal[mWorkers.mCount]; + mWorkers.mLaunchCallback = NULL; status = pthread_create(&mThreadId, &threadAttr, threadProc, this); if (status) { LOGE("Failed to start rs context thread."); + return; + } + mWorkers.mRunningCount = 0; + mWorkers.mLaunchCount = 0; + for (uint32_t ct=0; ct < mWorkers.mCount; ct++) { + status = pthread_create(&mWorkers.mThreadId[ct], &threadAttr, helperThreadProc, this); + if (status) { + mWorkers.mCount = ct; + LOGE("Created fewer than expected number of RS threads."); + break; + } } while(!mRunning) { diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index 06433a17f1491..98ad3a4e90421 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -65,6 +65,7 @@ public: Script * mScript; }; + typedef void (*WorkerCallback_t)(void *usr, uint32_t idx); //StructuredAllocationContext mStateAllocation; ElementState mStateElement; @@ -172,6 +173,8 @@ public: bool ext_OES_texture_npot() const {return mGL.OES_texture_npot;} + void launchThreads(WorkerCallback_t cbk, void *data); + protected: Device *mDev; @@ -222,6 +225,20 @@ protected: pthread_t mThreadId; pid_t mNativeThreadId; + struct Workers { + volatile int mRunningCount; + volatile int mLaunchCount; + uint32_t mCount; + pthread_t *mThreadId; + pid_t *mNativeThreadId; + Signal mCompleteSignal; + + Signal *mLaunchSignals; + WorkerCallback_t mLaunchCallback; + void *mLaunchData; + }; + Workers mWorkers; + ObjectBaseRef