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

Commit fc6eab5d authored by Alan Ding's avatar Alan Ding
Browse files

SF: Propagate uniqueID when creating virtual displays

This is part of Trunk Stable effort to upstream SF-ARC screen record
capabiliy (undiverging http://ag/20003031) which requires mirroring
virtual displays to be associated with screen capture sessions using
the package name within the unique ID.

Creating virtual display with unique ID specified is optional such that
it doesn't affect existing consumers who don't need it (i.e. av).

Bug: 137375833
Bug: 194863377
Test: libsurfaceflinger_unittest
Change-Id: Ia3cd13df07f701593ddc94c196df0b04844cf502
parent db8c7b40
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -89,6 +89,8 @@ int64_t generateId() {
void emptyCallback(nsecs_t, const sp<Fence>&, const std::vector<SurfaceControlStats>&) {}
} // namespace

const std::string SurfaceComposerClient::kEmpty{};

ComposerService::ComposerService()
: Singleton<ComposerService>() {
    Mutex::Autolock _l(mLock);
@@ -1276,14 +1278,13 @@ status_t SurfaceComposerClient::Transaction::sendSurfaceFlushJankDataTransaction
}
// ---------------------------------------------------------------------------

sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool secure,
                                                 float requestedRefereshRate) {
sp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, bool isSecure,
                                                 const std::string& uniqueId,
                                                 float requestedRefreshRate) {
    sp<IBinder> display = nullptr;
    binder::Status status =
            ComposerServiceAIDL::getComposerService()->createDisplay(std::string(
                                                                             displayName.c_str()),
                                                                     secure, requestedRefereshRate,
                                                                     &display);
    binder::Status status = ComposerServiceAIDL::getComposerService()
                                    ->createDisplay(std::string(displayName.c_str()), isSecure,
                                                    uniqueId, requestedRefreshRate, &display);
    return status.isOk() ? display : nullptr;
}

+10 −8
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ interface ISurfaceComposer {
    void bootFinished();

    /**
     * Create a display event connection
     * Create a display event connection.
     *
     * layerHandle
     *     Optional binder handle representing a Layer in SF to associate the new
@@ -90,12 +90,14 @@ interface ISurfaceComposer {
    @nullable ISurfaceComposerClient createConnection();

    /**
     * Create a virtual display
     * Create a virtual display.
     *
     * displayName
     *     The name of the virtual display
     * secure
     *     Whether this virtual display is secure
     *     The name of the virtual display.
     * isSecure
     *     Whether this virtual display is secure.
     * uniqueId
     *     The unique ID for the display.
     * requestedRefreshRate
     *     The refresh rate, frames per second, to request on the virtual display.
     *     This is just a request, the actual rate may be adjusted to align well
@@ -104,11 +106,11 @@ interface ISurfaceComposer {
     *
     * requires ACCESS_SURFACE_FLINGER permission.
     */
    @nullable IBinder createDisplay(@utf8InCpp String displayName, boolean secure,
            float requestedRefreshRate);
    @nullable IBinder createDisplay(@utf8InCpp String displayName, boolean isSecure,
            @utf8InCpp String uniqueId, float requestedRefreshRate);

    /**
     * Destroy a virtual display
     * Destroy a virtual display.
     * requires ACCESS_SURFACE_FLINGER permission.
     */
    void destroyDisplay(IBinder display);
+5 −6
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <stdint.h>
#include <sys/types.h>

#include <set>
#include <thread>
#include <unordered_map>
@@ -374,17 +375,15 @@ public:

    sp<SurfaceControl> mirrorDisplay(DisplayId displayId);

    //! Create a virtual display
    static sp<IBinder> createDisplay(const String8& displayName, bool secure,
                                     float requestedRefereshRate = 0);
    static const std::string kEmpty;
    static sp<IBinder> createDisplay(const String8& displayName, bool isSecure,
                                     const std::string& uniqueId = kEmpty,
                                     float requestedRefreshRate = 0);

    //! Destroy a virtual display
    static void destroyDisplay(const sp<IBinder>& display);

    //! Get stable IDs for connected physical displays
    static std::vector<PhysicalDisplayId> getPhysicalDisplayIds();

    //! Get token for a physical display given its stable ID
    static sp<IBinder> getPhysicalDisplayToken(PhysicalDisplayId displayId);

    // Returns StalledTransactionInfo if a transaction from the provided pid has not been applied
+2 −2
Original line number Diff line number Diff line
@@ -673,8 +673,8 @@ public:
        return binder::Status::ok();
    }

    binder::Status createDisplay(const std::string& /*displayName*/, bool /*secure*/,
                                 float /*requestedRefreshRate*/,
    binder::Status createDisplay(const std::string& /*displayName*/, bool /*isSecure*/,
                                 const std::string& /*uniqueId*/, float /*requestedRefreshRate*/,
                                 sp<IBinder>* /*outDisplay*/) override {
        return binder::Status::ok();
    }
+1 −0
Original line number Diff line number Diff line
@@ -329,6 +329,7 @@ struct DisplayDeviceState {
    uint32_t width = 0;
    uint32_t height = 0;
    std::string displayName;
    std::string uniqueId;
    bool isSecure = false;
    bool isProtected = false;
    // Refer to DisplayDevice::mRequestedRefreshRate, for virtual display only
Loading