summaryrefslogtreecommitdiffstats
path: root/services/surfaceflinger/LayerBlur.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'services/surfaceflinger/LayerBlur.cpp')
-rw-r--r--services/surfaceflinger/LayerBlur.cpp103
1 files changed, 86 insertions, 17 deletions
diff --git a/services/surfaceflinger/LayerBlur.cpp b/services/surfaceflinger/LayerBlur.cpp
index 021978d..93f548f 100644
--- a/services/surfaceflinger/LayerBlur.cpp
+++ b/services/surfaceflinger/LayerBlur.cpp
@@ -25,6 +25,7 @@
#include <stdint.h>
#include <sys/types.h>
#include <time.h>
+#include <dlfcn.h>
#include <utils/Errors.h>
#include <utils/Log.h>
@@ -90,16 +91,11 @@ static void setupMesh(Mesh& mesh, int width, int height, int viewportHeight) {
texCoords[3] = vec2(1.0f, 1.0f);
}
-
LayerBlur::LayerBlur(SurfaceFlinger* flinger, const sp<Client>& client,
const String8& name, uint32_t w, uint32_t h, uint32_t flags)
- : Layer(flinger, client, name, w, h, flags), mBlurMaskSampling(1), mBlurMaskAlphaThreshold(0.0f)
- ,mLastFrameSequence(0)
+ : Layer(flinger, client, name, w, h, flags), mBlurMaskSampling(1),
+ mBlurMaskAlphaThreshold(0.0f) ,mLastFrameSequence(0)
{
-#ifdef UI_BLUR
- mBlurToken = qtiblur::initBlurToken();
-#endif
-
GLuint texnames[3];
mFlinger->getRenderEngine().genTextures(3, texnames);
mTextureCapture.init(Texture::TEXTURE_2D, texnames[0]);
@@ -108,9 +104,6 @@ LayerBlur::LayerBlur(SurfaceFlinger* flinger, const sp<Client>& client,
}
LayerBlur::~LayerBlur() {
-#ifdef UI_BLUR
- qtiblur::releaseBlurToken(mBlurToken);
-#endif
releaseFbo(mFboCapture);
releaseFbo(mFboMasking);
@@ -168,18 +161,15 @@ void LayerBlur::onDraw(const sp<const DisplayDevice>& hw, const Region& /*clip*/
// blur
size_t outTexWidth = mTextureBlur.getWidth();
size_t outTexHeight = mTextureBlur.getHeight();
-#ifdef UI_BLUR
- if (!qtiblur::blur(mBlurToken,
- s.blur,
+ if (mBlurImpl.blur(s.blur,
mTextureCapture.getTextureName(),
mTextureCapture.getWidth(),
mTextureCapture.getHeight(),
mTextureBlur.getTextureName(),
&outTexWidth,
- &outTexHeight)) {
+ &outTexHeight) != OK) {
return;
}
-#endif
// mTextureBlur now has "Blurred image"
mTextureBlur.setDimensions(outTexWidth, outTexHeight);
@@ -238,8 +228,7 @@ bool LayerBlur::captureScreen(const sp<const DisplayDevice>& hw, FBO& fbo, Textu
texture.getTextureName(), 0);
mFlinger->getRenderEngine().clearWithColor(0.0f, 0.0f, 0.0f, 1.0f);
- if (hw->isPanelInverseMounted())
- rotation = Transform::ROT_180;
+ rotation = (Transform::orientation_flags)(rotation ^ hw->getPanelMountFlip());
mFlinger->renderScreenImplLocked(
hw,
Rect(0,0,width,height),
@@ -412,6 +401,86 @@ void LayerBlur::ensureFbo(FBO& fbo, int width, int height, int textureName) {
}
}
+// ---------------------------------------------------------------------------
+
+void* LayerBlur::BlurImpl::sLibHandle = NULL;
+bool LayerBlur::BlurImpl::sUnsupported = false;
+
+LayerBlur::BlurImpl::initBlurTokenFn LayerBlur::BlurImpl::initBlurToken = NULL;
+LayerBlur::BlurImpl::releaseBlurTokenFn LayerBlur::BlurImpl::releaseBlurToken = NULL;
+LayerBlur::BlurImpl::blurFn LayerBlur::BlurImpl::doBlur = NULL;
+Mutex LayerBlur::BlurImpl::sLock;
+
+void LayerBlur::BlurImpl::closeBlurImpl() {
+ if (sLibHandle != NULL) {
+ dlclose(sLibHandle);
+ sLibHandle = NULL;
+ }
+}
+
+status_t LayerBlur::BlurImpl::initBlurImpl() {
+ if (sLibHandle != NULL) {
+ return OK;
+ }
+ if (sUnsupported) {
+ return NO_INIT;
+ }
+
+ sLibHandle = dlopen("libuiblur.so", RTLD_NOW);
+ if (sLibHandle == NULL) {
+ sUnsupported = true;
+ return NO_INIT;
+ }
+
+ // happy happy joy joy!
+
+ initBlurToken = (initBlurTokenFn)dlsym(sLibHandle,
+ "_ZN7qtiblur13initBlurTokenEv");
+ releaseBlurToken = (releaseBlurTokenFn)dlsym(sLibHandle,
+ "_ZN7qtiblur16releaseBlurTokenEPv");
+
+ if (sizeof(size_t) == 4) {
+ doBlur = (blurFn)dlsym(sLibHandle,
+ "_ZN7qtiblur4blurEPvijjjjPjS1_");
+ } else if (sizeof(size_t) == 8) {
+ doBlur = (blurFn)dlsym(sLibHandle,
+ "_ZN7qtiblur4blurEPvijmmjPmS1_");
+ }
+
+ if (!initBlurToken || !releaseBlurToken || !doBlur) {
+ ALOGE("dlsym failed for blur impl!: %s", dlerror());
+ closeBlurImpl();
+ sUnsupported = true;
+ return NO_INIT;
+ }
+
+ return OK;
+}
+
+LayerBlur::BlurImpl::BlurImpl() : mToken(NULL) {
+ Mutex::Autolock _l(sLock);
+ if (initBlurImpl() == OK) {
+ mToken = initBlurToken();
+ }
+}
+
+LayerBlur::BlurImpl::~BlurImpl() {
+ Mutex::Autolock _l(sLock);
+ if (mToken != NULL) {
+ releaseBlurToken(mToken);
+ }
+}
+
+status_t LayerBlur::BlurImpl::blur(int level, uint32_t inId, size_t inWidth, size_t inHeight,
+ uint32_t outId, size_t* outWidth, size_t* outHeight) {
+ Mutex::Autolock _l(sLock);
+ if (mToken == NULL) {
+ return NO_INIT;
+ }
+ return doBlur(mToken, level, inId, inWidth, inHeight,
+ outId, outWidth, outHeight) ? OK : NO_INIT;
+}
+
// ---------------------------------------------------------------------------