From aa52da57950ff4e880fc99612c42086a9496a0f6 Mon Sep 17 00:00:00 2001 From: Ramkumar Radhakrishnan Date: Fri, 30 Aug 2013 18:37:55 -0700 Subject: [PATCH] frameworks/native: Add support for Secure Display - Add secure UI layers to primary and remove other layers from internal and external list for Secure Display usecase. - Dont let secure UI layers to be captured on screen Change-Id: Iebdad5c56247308604ee90928f6d6460a1f69279 --- services/surfaceflinger/Layer.cpp | 12 +++++++++++ services/surfaceflinger/Layer.h | 1 + services/surfaceflinger/SurfaceFlinger.cpp | 23 ++++++++++++++++++---- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index dd66f0b02af..710dec8523b 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1283,6 +1283,18 @@ bool Layer::isIntOnly() const } return false; } + +bool Layer::isSecureDisplay() const +{ + const sp& activeBuffer(mActiveBuffer); + if (activeBuffer != 0) { + uint32_t usage = activeBuffer->getUsage(); + if(usage & GRALLOC_USAGE_PRIVATE_SECURE_DISPLAY) + return true; + } + return false; +} + #endif // --------------------------------------------------------------------------- }; // namespace android diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 9c363499586..32ea0a2496c 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -261,6 +261,7 @@ class Layer : public SurfaceFlingerConsumer::FrameAvailableListener { #ifdef QCOM_BSP virtual bool isExtOnly() const; virtual bool isIntOnly() const; + virtual bool isSecureDisplay() const; #endif /* diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 673a1984d30..7a6dec9a8f3 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1592,18 +1592,25 @@ void SurfaceFlinger::computeVisibleRegions(size_t dpy, outDirtyRegion.clear(); bool bIgnoreLayers = false; - int extOnlyLayerIndex = -1; + int indexLOI = -1; size_t i = currentLayers.size(); #ifdef QCOM_BSP while (i--) { const sp& layer = currentLayers[i]; // iterate through the layer list to find ext_only layers and store // the index - if ((dpy && layer->isExtOnly())) { + if (layer->isSecureDisplay()) { bIgnoreLayers = true; - extOnlyLayerIndex = i; + indexLOI = -1; + if(!dpy) + indexLOI = i; break; } + + if (dpy && layer->isExtOnly()) { + bIgnoreLayers = true; + indexLOI = i; + } } i = currentLayers.size(); #endif @@ -1617,7 +1624,9 @@ void SurfaceFlinger::computeVisibleRegions(size_t dpy, // Only add the layer marked as "external_only" to external list and // only remove the layer marked as "external_only" from primary list // and do not add the layer marked as "internal_only" to external list - if((bIgnoreLayers && extOnlyLayerIndex != (int)i) || + // Add secure UI layers to primary and remove other layers from internal + //and external list + if((bIgnoreLayers && indexLOI != (int)i) || (!dpy && layer->isExtOnly()) || (dpy && layer->isIntOnly())) { // Ignore all other layers except the layers marked as ext_only @@ -3088,6 +3097,12 @@ void SurfaceFlinger::renderScreenImplLocked( const Layer::State& state(layer->getDrawingState()); if (state.layerStack == hw->getLayerStack()) { if (state.z >= minLayerZ && state.z <= maxLayerZ) { +#ifdef QCOM_BSP + // dont render the secure Display Layer + if(layer->isSecureDisplay()) { + continue; + } +#endif if (layer->isVisible()) { if (filtering) layer->setFiltering(true); layer->draw(hw);