SurfaceFlinger: add support for secure displays
This change adds support for displays that are not allowed to display surfaces
with the eSecure flag set. All non-virtual displays are considered secure,
while virtual displays have their secure-ness specified at creation time.
Bug: 7368436
Change-Id: I81ad535d2d1e5a7ff78269017e85b111f0098500
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 8e569be..38e02f1 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -163,7 +163,8 @@
return bclient;
}
-sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName)
+sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
+ bool secure)
{
class DisplayToken : public BBinder {
sp<SurfaceFlinger> flinger;
@@ -184,6 +185,7 @@
Mutex::Autolock _l(mStateLock);
DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL);
info.displayName = displayName;
+ info.isSecure = secure;
mCurrentState.displays.add(token, info);
return token;
@@ -485,12 +487,14 @@
// set-up the displays that are already connected
if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
+ // All non-virtual displays are currently considered secure.
+ bool isSecure = true;
mCurrentState.displays.add(token, DisplayDeviceState(type));
sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i);
sp<SurfaceTextureClient> stc = new SurfaceTextureClient(
static_cast< sp<ISurfaceTexture> >(fbs->getBufferQueue()));
sp<DisplayDevice> hw = new DisplayDevice(this,
- type, token, stc, fbs, mEGLConfig);
+ type, isSecure, token, stc, fbs, mEGLConfig);
if (i > DisplayDevice::DISPLAY_PRIMARY) {
// FIXME: currently we don't get blank/unblank requests
// for displays other than the main display, so we always
@@ -666,6 +670,10 @@
info->xdpi = xdpi;
info->ydpi = ydpi;
info->fps = float(1e9 / hwc.getRefreshPeriod(type));
+
+ // All non-virtual displays are currently considered secure.
+ info->secure = true;
+
return NO_ERROR;
}
@@ -675,34 +683,6 @@
return mEventThread->createEventConnection();
}
-void SurfaceFlinger::connectDisplay(const sp<ISurfaceTexture>& surface) {
-
- sp<IBinder> token;
- { // scope for the lock
- Mutex::Autolock _l(mStateLock);
- token = mExtDisplayToken;
- }
-
- if (token == 0) {
- token = createDisplay(String8("Display from connectDisplay"));
- }
-
- { // scope for the lock
- Mutex::Autolock _l(mStateLock);
- if (surface == 0) {
- // release our current display. we're guarantee to have
- // a reference to it (token), while we hold the lock
- mExtDisplayToken = 0;
- } else {
- mExtDisplayToken = token;
- }
-
- DisplayDeviceState& info(mCurrentState.displays.editValueFor(token));
- info.surface = surface;
- setTransactionFlags(eDisplayTransactionNeeded);
- }
-}
-
// ----------------------------------------------------------------------------
void SurfaceFlinger::waitForEvent() {
@@ -1183,6 +1163,7 @@
for (size_t i=0 ; i<cc ; i++) {
if (draw.indexOfKey(curr.keyAt(i)) < 0) {
const DisplayDeviceState& state(curr[i]);
+ bool isSecure = false;
sp<FramebufferSurface> fbs;
sp<SurfaceTextureClient> stc;
@@ -1193,21 +1174,28 @@
"surface is provided (%p), ignoring it",
state.surface.get());
+ // All non-virtual displays are currently considered
+ // secure.
+ isSecure = true;
+
// for supported (by hwc) displays we provide our
// own rendering surface
fbs = new FramebufferSurface(*mHwc, state.type);
stc = new SurfaceTextureClient(
- static_cast< sp<ISurfaceTexture> >(fbs->getBufferQueue()));
+ static_cast< sp<ISurfaceTexture> >(
+ fbs->getBufferQueue()));
} else {
if (state.surface != NULL) {
stc = new SurfaceTextureClient(state.surface);
}
+ isSecure = state.isSecure;
}
const wp<IBinder>& display(curr.keyAt(i));
if (stc != NULL) {
sp<DisplayDevice> hw = new DisplayDevice(this,
- state.type, display, stc, fbs, mEGLConfig);
+ state.type, isSecure, display, stc, fbs,
+ mEGLConfig);
hw->setLayerStack(state.layerStack);
hw->setProjection(state.orientation,
state.viewport, state.frame);