Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb93d80d authored by Leon Scroggins III's avatar Leon Scroggins III Committed by Leon Scroggins
Browse files

Add eLayerIsDisplayDecoration flag

When this flag is set on a BufferLayer, it should use
Composition.DISPLAY_DECORATION. The intent is that it will be set to
true once on a SurfaceControl for the ScreenDecorations, and it will
remain true, regardless of the currently used PixelFormat. When the
PixelFormat changes (e.g. from A8 to RGBA8888 to accommodate the privacy
dot), the HWC may change how it treats the layer.

Only respect the new flag if the caller has the INTERNAL_SYSTEM_WINDOW
permission.

Bug: 193170859
Test: manual
Change-Id: I1da03a88fb642fa775c192627f20459cae694951
parent f2869ebf
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1104,7 +1104,8 @@ SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setFlags
    }
    if ((mask & layer_state_t::eLayerOpaque) || (mask & layer_state_t::eLayerHidden) ||
        (mask & layer_state_t::eLayerSecure) || (mask & layer_state_t::eLayerSkipScreenshot) ||
        (mask & layer_state_t::eEnableBackpressure)) {
        (mask & layer_state_t::eEnableBackpressure) ||
        (mask & layer_state_t::eLayerIsDisplayDecoration)) {
        s->what |= layer_state_t::eFlagsChanged;
    }
    s->flags &= ~mask;
+1 −0
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ struct layer_state_t {
        // set. This blocks the client until all the buffers have been presented. If the buffers
        // have presentation timestamps, then we may drop buffers.
        eEnableBackpressure = 0x100, // ENABLE_BACKPRESSURE
        eLayerIsDisplayDecoration = 0x200,  // DISPLAY_DECORATION
    };

    enum {
+3 −0
Original line number Diff line number Diff line
@@ -295,6 +295,9 @@ void BufferLayer::preparePerFrameCompositionState() {
        compositionState->compositionType =
                aidl::android::hardware::graphics::composer3::Composition::SIDEBAND;
        return;
    } else if ((mDrawingState.flags & layer_state_t::eLayerIsDisplayDecoration) != 0) {
        compositionState->compositionType =
                aidl::android::hardware::graphics::composer3::Composition::DISPLAY_DECORATION;
    } else {
        // Normal buffer layers
        compositionState->hdrMetadata = mBufferInfo.mHdrMetadata;
+22 −2
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ bool validateCompositionDataspace(Dataspace dataspace) {
enum Permission {
    ACCESS_SURFACE_FLINGER = 0x1,
    ROTATE_SURFACE_FLINGER = 0x2,
    INTERNAL_SYSTEM_WINDOW = 0x4,
};

struct IdleTimerConfig {
@@ -316,6 +317,7 @@ const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
const String16 sControlDisplayBrightness("android.permission.CONTROL_DISPLAY_BRIGHTNESS");
const String16 sDump("android.permission.DUMP");
const String16 sCaptureBlackoutContent("android.permission.CAPTURE_BLACKOUT_CONTENT");
const String16 sInternalSystemWindow("android.permission.INTERNAL_SYSTEM_WINDOW");

const char* KERNEL_IDLE_TIMER_PROP = "graphics.display.kernel_idle_timer.enabled";

@@ -358,6 +360,13 @@ bool callingThreadHasRotateSurfaceFlingerAccess() {
            PermissionCache::checkPermission(sRotateSurfaceFlinger, pid, uid);
}

bool callingThreadHasInternalSystemWindowAccess() {
    IPCThreadState* ipc = IPCThreadState::self();
    const int pid = ipc->getCallingPid();
    const int uid = ipc->getCallingUid();
    return PermissionCache::checkPermission(sInternalSystemWindow, pid, uid);
}

SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
      : mFactory(factory),
        mPid(getpid()),
@@ -3810,6 +3819,10 @@ status_t SurfaceFlinger::setTransactionState(
        permissions |= Permission::ROTATE_SURFACE_FLINGER;
    }

    if (callingThreadHasInternalSystemWindowAccess()) {
        permissions |= Permission::INTERNAL_SYSTEM_WINDOW;
    }

    if (!(permissions & Permission::ACCESS_SURFACE_FLINGER) &&
        (flags & (eEarlyWakeupStart | eEarlyWakeupEnd))) {
        ALOGE("Only WindowManager is allowed to use eEarlyWakeup[Start|End] flags");
@@ -4147,8 +4160,15 @@ uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTime
            flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eFlagsChanged) {
        if (layer->setFlags(s.flags, s.mask))
            flags |= eTraversalNeeded;
        auto changedFlags = s.flags;
        if (changedFlags & layer_state_t::eLayerIsDisplayDecoration) {
            if ((permissions & Permission::INTERNAL_SYSTEM_WINDOW) == 0) {
                changedFlags &= ~layer_state_t::eLayerIsDisplayDecoration;
                ALOGE("Attempt to use eLayerIsDisplayDecoration without permission "
                      "INTERNAL_SYSTEM_WINDOW!");
            }
        }
        if (layer->setFlags(changedFlags, s.mask)) flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eCornerRadiusChanged) {
        if (layer->setCornerRadius(s.cornerRadius))