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

Commit e57f2925 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

make multi-display more real

- displays are represented by a binder on the client side
- c++ clients can now create and modify displays

Change-Id: I203ea5b4beae0819d742ec5171c27568f4e8354b
parent ef7b9c7e
Loading
Loading
Loading
Loading
+28 −10
Original line number Original line Diff line number Diff line
@@ -48,6 +48,11 @@ public:
        eSynchronous = 0x01,
        eSynchronous = 0x01,
    };
    };


    enum {
        eDisplayIdMain = 0,
        eDisplayIdHdmi = 1
    };

    /* create connection with surface flinger, requires
    /* create connection with surface flinger, requires
     * ACCESS_SURFACE_FLINGER permission
     * ACCESS_SURFACE_FLINGER permission
     */
     */
@@ -57,6 +62,19 @@ public:
     */
     */
    virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc() = 0;
    virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc() = 0;


    /* return an IDisplayEventConnection */
    virtual sp<IDisplayEventConnection> createDisplayEventConnection() = 0;

    /* create a display with given id.
     * requires ACCESS_SURFACE_FLINGER permission.
     */
    virtual sp<IBinder> createDisplay() = 0;

    /* get the token for the existing default displays. possible values
     * for id are eDisplayIdMain and eDisplayIdHdmi.
     */
    virtual sp<IBinder> getBuiltInDisplay(int32_t id) = 0;

    /* open/close transactions. requires ACCESS_SURFACE_FLINGER permission */
    /* open/close transactions. requires ACCESS_SURFACE_FLINGER permission */
    virtual void setTransactionState(const Vector<ComposerState>& state,
    virtual void setTransactionState(const Vector<ComposerState>& state,
            const Vector<DisplayState>& displays, uint32_t flags) = 0;
            const Vector<DisplayState>& displays, uint32_t flags) = 0;
@@ -66,6 +84,11 @@ public:
     */
     */
    virtual void bootFinished() = 0;
    virtual void bootFinished() = 0;


    /* verify that an ISurfaceTexture was created by SurfaceFlinger.
     */
    virtual bool authenticateSurfaceTexture(
            const sp<ISurfaceTexture>& surface) const = 0;

    /* Capture the specified screen. requires READ_FRAME_BUFFER permission
    /* Capture the specified screen. requires READ_FRAME_BUFFER permission
     * This function will fail if there is a secure window on screen.
     * This function will fail if there is a secure window on screen.
     */
     */
@@ -74,13 +97,6 @@ public:
            uint32_t reqWidth, uint32_t reqHeight, uint32_t minLayerZ,
            uint32_t reqWidth, uint32_t reqHeight, uint32_t minLayerZ,
            uint32_t maxLayerZ) = 0;
            uint32_t maxLayerZ) = 0;


    /* verify that an ISurfaceTexture was created by SurfaceFlinger.
     */
    virtual bool authenticateSurfaceTexture(
            const sp<ISurfaceTexture>& surface) const = 0;

    /* return an IDisplayEventConnection */
    virtual sp<IDisplayEventConnection> createDisplayEventConnection() = 0;


    /* triggers screen off and waits for it to complete */
    /* triggers screen off and waits for it to complete */
    virtual void blank() = 0;
    virtual void blank() = 0;
@@ -106,13 +122,15 @@ public:
        BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,
        BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,
        CREATE_CONNECTION,
        CREATE_CONNECTION,
        CREATE_GRAPHIC_BUFFER_ALLOC,
        CREATE_GRAPHIC_BUFFER_ALLOC,
        GET_DISPLAY_INFO,
        CREATE_DISPLAY_EVENT_CONNECTION,
        CREATE_DISPLAY,
        GET_BUILT_IN_DISPLAY,
        SET_TRANSACTION_STATE,
        SET_TRANSACTION_STATE,
        CAPTURE_SCREEN,
        AUTHENTICATE_SURFACE,
        AUTHENTICATE_SURFACE,
        CREATE_DISPLAY_EVENT_CONNECTION,
        CAPTURE_SCREEN,
        BLANK,
        BLANK,
        UNBLANK,
        UNBLANK,
        GET_DISPLAY_INFO,
        CONNECT_DISPLAY,
        CONNECT_DISPLAY,
    };
    };


+19 −7
Original line number Original line Diff line number Diff line
@@ -59,6 +59,13 @@ public:
    // Forcibly remove connection before all references have gone away.
    // Forcibly remove connection before all references have gone away.
    void        dispose();
    void        dispose();


    // callback when the composer is dies
    status_t linkToComposerDeath(const sp<IBinder::DeathRecipient>& recipient,
            void* cookie = NULL, uint32_t flags = 0);

    // Get information about a display
    static status_t getDisplayInfo(DisplayID dpy, DisplayInfo* info);

    // ------------------------------------------------------------------------
    // ------------------------------------------------------------------------
    // surface creation / destruction
    // surface creation / destruction


@@ -80,13 +87,14 @@ public:
            uint32_t flags = 0  // usage flags
            uint32_t flags = 0  // usage flags
    );
    );


    static sp<IBinder> createDisplay();


    // ------------------------------------------------------------------------
    // ------------------------------------------------------------------------
    // Composer parameters
    // Composer parameters
    // All composer parameters must be changed within a transaction
    // All composer parameters must be changed within a transaction
    // several surfaces can be updated in one transaction, all changes are
    // several surfaces can be updated in one transaction, all changes are
    // committed at once when the transaction is closed.
    // committed at once when the transaction is closed.
    // closeGlobalTransaction() usually requires an IPC with the server.
    // closeGlobalTransaction() requires an IPC with the server.


    //! Open a composer transaction on all active SurfaceComposerClients.
    //! Open a composer transaction on all active SurfaceComposerClients.
    static void openGlobalTransaction();
    static void openGlobalTransaction();
@@ -97,12 +105,6 @@ public:
    //! Set the orientation of the given display
    //! Set the orientation of the given display
    static int setOrientation(DisplayID dpy, int orientation, uint32_t flags);
    static int setOrientation(DisplayID dpy, int orientation, uint32_t flags);


    // Get information about a display
    static status_t getDisplayInfo(DisplayID dpy, DisplayInfo* info);

    status_t linkToComposerDeath(const sp<IBinder::DeathRecipient>& recipient,
            void* cookie = NULL, uint32_t flags = 0);

    status_t    hide(SurfaceID id);
    status_t    hide(SurfaceID id);
    status_t    show(SurfaceID id, int32_t layer = -1);
    status_t    show(SurfaceID id, int32_t layer = -1);
    status_t    setFlags(SurfaceID id, uint32_t flags, uint32_t mask);
    status_t    setFlags(SurfaceID id, uint32_t flags, uint32_t mask);
@@ -116,6 +118,16 @@ public:
    status_t    setLayerStack(SurfaceID id, uint32_t layerStack);
    status_t    setLayerStack(SurfaceID id, uint32_t layerStack);
    status_t    destroySurface(SurfaceID sid);
    status_t    destroySurface(SurfaceID sid);


    static void setDisplaySurface(const sp<IBinder>& token,
            const sp<ISurfaceTexture>& surface);
    static void setDisplayLayerStack(const sp<IBinder>& token,
            uint32_t layerStack);
    static void setDisplayOrientation(const sp<IBinder>& token,
            uint32_t orientation);
    static void setDisplayViewport(const sp<IBinder>& token,
            const Rect& viewport);
    static void setDisplayFrame(const sp<IBinder>& token, const Rect& frame);

private:
private:
    virtual void onFirstRef();
    virtual void onFirstRef();
    Composer& getComposer();
    Composer& getComposer();
+14 −7
Original line number Original line Diff line number Diff line
@@ -106,7 +106,14 @@ struct DisplayState {
        eOrientationSwapMask    = 0x01
        eOrientationSwapMask    = 0x01
    };
    };


    int32_t             displayId;
    enum {
        eSurfaceChanged     = 0x1,
        eLayerStackChanged  = 0x2,
        eTransformChanged   = 0x4
    };

    uint32_t what;
    sp<IBinder> token;
    sp<ISurfaceTexture> surface;
    sp<ISurfaceTexture> surface;
    uint32_t layerStack;
    uint32_t layerStack;
    uint32_t orientation;
    uint32_t orientation;
+30 −0
Original line number Original line Diff line number Diff line
@@ -179,6 +179,23 @@ public:
        return result;
        return result;
    }
    }


    virtual sp<IBinder> createDisplay()
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
        return reply.readStrongBinder();
    }

    virtual sp<IBinder> getBuiltInDisplay(int32_t id)
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        data.writeInt32(id);
        remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply);
        return reply.readStrongBinder();
    }

    virtual void blank()
    virtual void blank()
    {
    {
        Parcel data, reply;
        Parcel data, reply;
@@ -286,6 +303,19 @@ status_t BnSurfaceComposer::onTransact(
            reply->writeStrongBinder(connection->asBinder());
            reply->writeStrongBinder(connection->asBinder());
            return NO_ERROR;
            return NO_ERROR;
        } break;
        } break;
        case CREATE_DISPLAY: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            sp<IBinder> display(createDisplay());
            reply->writeStrongBinder(display);
            return NO_ERROR;
        } break;
        case GET_BUILT_IN_DISPLAY: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            int32_t id = data.readInt32();
            sp<IBinder> display(getBuiltInDisplay(id));
            reply->writeStrongBinder(display);
            return NO_ERROR;
        } break;
        case BLANK: {
        case BLANK: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            blank();
            blank();
+4 −2
Original line number Original line Diff line number Diff line
@@ -72,8 +72,9 @@ status_t ComposerState::read(const Parcel& input) {




status_t DisplayState::write(Parcel& output) const {
status_t DisplayState::write(Parcel& output) const {
    output.writeStrongBinder(token);
    output.writeStrongBinder(surface->asBinder());
    output.writeStrongBinder(surface->asBinder());
    output.writeInt32(displayId);
    output.writeInt32(what);
    output.writeInt32(layerStack);
    output.writeInt32(layerStack);
    output.writeInt32(orientation);
    output.writeInt32(orientation);
    memcpy(output.writeInplace(sizeof(Rect)), &viewport, sizeof(Rect));
    memcpy(output.writeInplace(sizeof(Rect)), &viewport, sizeof(Rect));
@@ -82,8 +83,9 @@ status_t DisplayState::write(Parcel& output) const {
}
}


status_t DisplayState::read(const Parcel& input) {
status_t DisplayState::read(const Parcel& input) {
    token = input.readStrongBinder();
    surface = interface_cast<ISurfaceTexture>(input.readStrongBinder());
    surface = interface_cast<ISurfaceTexture>(input.readStrongBinder());
    displayId = input.readInt32();
    what = input.readInt32();
    layerStack = input.readInt32();
    layerStack = input.readInt32();
    orientation = input.readInt32();
    orientation = input.readInt32();
    memcpy(&viewport, input.readInplace(sizeof(Rect)), sizeof(Rect));
    memcpy(&viewport, input.readInplace(sizeof(Rect)), sizeof(Rect));
Loading