diff options
author | Byunghun Jeon <bjeon@codeaurora.org> | 2014-12-05 18:28:32 -0800 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-11-08 01:07:13 -0800 |
commit | 987034b5633d0eb7fca806acfe00ddbe3305b159 (patch) | |
tree | 9d186252541a857729a9f3920bd8369d4a056e0d /services/surfaceflinger/SurfaceFlinger.cpp | |
parent | b53d92c3eb9319dbf725b3e59b3c52acfa6d77f0 (diff) | |
download | frameworks_native-987034b5633d0eb7fca806acfe00ddbe3305b159.zip frameworks_native-987034b5633d0eb7fca806acfe00ddbe3305b159.tar.gz frameworks_native-987034b5633d0eb7fca806acfe00ddbe3305b159.tar.bz2 |
SurfaceFlinger: Native changes to add blur effect
Native changes to add blur-behind and blur mask effect
Change-Id: I54faf82d750e8299de6d261f6a893ab26d08df84
SurfaceFlinger: Adding template for LayerBlur files
Change-Id: I444009113b7bdd6c5284863fd1f56358e67d9fe6
SurfaceFlinger: Featurize libuiblur module for OSS build
Change-Id: Ifdc176e699434125d17b111c044b8ba954cf717c
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index fc99fa0..cea463a 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +//#define LOG_NDEBUG 0 #define ATRACE_TAG ATRACE_TAG_GRAPHICS #include <stdint.h> @@ -68,6 +69,7 @@ #include "EventThread.h" #include "Layer.h" #include "LayerDim.h" +#include "LayerBlur.h" #include "SurfaceFlinger.h" #include "DisplayHardware/FramebufferSurface.h" @@ -157,7 +159,8 @@ SurfaceFlinger::SurfaceFlinger() mHasPoweredOff(false), mFrameBuckets(), mTotalTime(0), - mLastSwapTime(0) + mLastSwapTime(0), + mActiveFrameSequence(0) { ALOGI("SurfaceFlinger is starting"); @@ -1249,6 +1252,8 @@ void SurfaceFlinger::doComposition() { // repaint the framebuffer (if needed) doDisplayComposition(hw, dirtyRegion); + ++mActiveFrameSequence; + hw->dirtyRegion.clear(); hw->flip(hw->swapRegion); hw->swapRegion.clear(); @@ -1309,6 +1314,7 @@ void SurfaceFlinger::postFramebuffer() if (flipCount % LOG_FRAME_STATS_PERIOD == 0) { logFrameStats(); } + ALOGV_IF(mFrameRateHelper.update(), "FPS: %d", mFrameRateHelper.get()); } void SurfaceFlinger::handleTransaction(uint32_t transactionFlags) @@ -2277,6 +2283,41 @@ uint32_t SurfaceFlinger::setClientStateLocked( flags |= eTransactionNeeded|eTraversalNeeded; } } + if (what & layer_state_t::eBlurChanged) { + ALOGV("eBlurChanged"); + if (layer->setBlur(uint8_t(255.0f*s.blur+0.5f))) { + flags |= eTraversalNeeded; + } + } + if (what & layer_state_t::eBlurMaskSurfaceChanged) { + ALOGV("eBlurMaskSurfaceChanged"); + sp<Layer> maskLayer = 0; + if (s.blurMaskSurface != 0) { + maskLayer = client->getLayerUser(s.blurMaskSurface); + } + if (maskLayer == 0) { + ALOGV("eBlurMaskSurfaceChanged. maskLayer == 0"); + } else { + ALOGV("eBlurMaskSurfaceChagned. maskLayer.z == %d", maskLayer->getCurrentState().z); + if (maskLayer->isBlurLayer()) { + ALOGE("Blur layer can not be used as blur mask surface"); + maskLayer = 0; + } + } + if (layer->setBlurMaskLayer(maskLayer)) { + flags |= eTraversalNeeded; + } + } + if (what & layer_state_t::eBlurMaskSamplingChanged) { + if (layer->setBlurMaskSampling(s.blurMaskSampling)) { + flags |= eTraversalNeeded; + } + } + if (what & layer_state_t::eBlurMaskAlphaThresholdChanged) { + if (layer->setBlurMaskAlphaThreshold(s.blurMaskAlphaThreshold)) { + flags |= eTraversalNeeded; + } + } if (what & layer_state_t::eSizeChanged) { if (layer->setSize(s.w, s.h)) { flags |= eTraversalNeeded; @@ -2345,6 +2386,11 @@ status_t SurfaceFlinger::createLayer( name, w, h, flags, handle, gbp, &layer); break; + case ISurfaceComposerClient::eFXSurfaceBlur: + result = createBlurLayer(client, + name, w, h, flags, + handle, gbp, &layer); + break; default: result = BAD_VALUE; break; @@ -2399,6 +2445,16 @@ status_t SurfaceFlinger::createDimLayer(const sp<Client>& client, return NO_ERROR; } +status_t SurfaceFlinger::createBlurLayer(const sp<Client>& client, + const String8& name, uint32_t w, uint32_t h, uint32_t flags, + sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer) +{ + *outLayer = new LayerBlur(this, client, name, w, h, flags); + *handle = (*outLayer)->getHandle(); + *gbp = (*outLayer)->getProducer(); + return NO_ERROR; +} + status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle) { // called by the window manager when it wants to remove a Layer @@ -3407,6 +3463,8 @@ status_t SurfaceFlinger::captureScreenImplLocked( return BAD_VALUE; } + ++mActiveFrameSequence; + reqWidth = (!reqWidth) ? hw_w : reqWidth; reqHeight = (!reqHeight) ? hw_h : reqHeight; |