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

Commit 698c0873 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

SF transactions are now O(1) wrt IPC instead of O(N).

Change-Id: I57669852cbf6aabae244ea86940a08a5a27ffc43
parent 0748907d
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
namespace android {

class Parcel;
class ISurfaceComposerClient;

struct layer_state_t {

@@ -68,6 +69,13 @@ struct layer_state_t {
            Region          transparentRegion;
};

struct ComposerState {
    sp<ISurfaceComposerClient> client;
    layer_state_t state;
    status_t    write(Parcel& output) const;
    status_t    read(const Parcel& input);
};

}; // namespace android

#endif // ANDROID_SF_LAYER_STATE_H
+3 −4
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ namespace android {
// ----------------------------------------------------------------------------

class IMemoryHeap;
class ComposerState;

class ISurfaceComposer : public IInterface
{
@@ -105,8 +106,7 @@ public:
    virtual sp<IMemoryHeap> getCblk() const = 0;

    /* open/close transactions. requires ACCESS_SURFACE_FLINGER permission */
    virtual void openGlobalTransaction() = 0;
    virtual void closeGlobalTransaction() = 0;
    virtual void setTransactionState(const Vector<ComposerState>& state) = 0;

    /* [un]freeze display. requires ACCESS_SURFACE_FLINGER permission */
    virtual status_t freezeDisplay(DisplayID dpy, uint32_t flags) = 0;
@@ -149,8 +149,7 @@ public:
        CREATE_CONNECTION,
        CREATE_GRAPHIC_BUFFER_ALLOC,
        GET_CBLK,
        OPEN_GLOBAL_TRANSACTION,
        CLOSE_GLOBAL_TRANSACTION,
        SET_TRANSACTION_STATE,
        SET_ORIENTATION,
        FREEZE_DISPLAY,
        UNFREEZE_DISPLAY,
+0 −7
Original line number Diff line number Diff line
@@ -37,8 +37,6 @@ typedef int32_t DisplayID;

// ----------------------------------------------------------------------------

class layer_state_t;

class ISurfaceComposerClient : public IInterface
{
public:
@@ -69,11 +67,6 @@ public:
     * Requires ACCESS_SURFACE_FLINGER permission
     */
    virtual status_t    destroySurface(SurfaceID sid) = 0;

    /*
     * Requires ACCESS_SURFACE_FLINGER permission
     */
    virtual status_t    setState(int32_t count, const layer_state_t* states) = 0;
};

// ----------------------------------------------------------------------------
+9 −17
Original line number Diff line number Diff line
@@ -37,10 +37,12 @@ namespace android {
// ---------------------------------------------------------------------------

class DisplayInfo;
class Composer;
class IMemoryHeap;
class ISurfaceComposer;
class Region;
class surface_flinger_cblk_t;
struct layer_state_t;

// ---------------------------------------------------------------------------

@@ -59,8 +61,11 @@ public:

// ---------------------------------------------------------------------------

class Composer;

class SurfaceComposerClient : public RefBase
{
    friend class Composer;
public:    
                SurfaceComposerClient();
    virtual     ~SurfaceComposerClient();
@@ -101,13 +106,7 @@ public:
    // All composer parameters must be changed within a transaction
    // several surfaces can be updated in one transaction, all changes are
    // committed at once when the transaction is closed.
    // CloseTransaction() usually requires an IPC with the server.
    
    //! Open a composer transaction
    status_t    openTransaction();

    //! commit the transaction
    status_t    closeTransaction();
    // closeGlobalTransaction() usually requires an IPC with the server.

    //! Open a composer transaction on all active SurfaceComposerClients.
    static void openGlobalTransaction();
@@ -152,19 +151,12 @@ public:

private:
    virtual void onFirstRef();
    inline layer_state_t*   get_state_l(SurfaceID id);
    layer_state_t*          lockLayerState(SurfaceID id);
    inline void             unlockLayerState();
    Composer& getComposer();

    mutable     Mutex                       mLock;
                SortedVector<layer_state_t>         mStates;
                int32_t                             mTransactionOpen;
                layer_state_t*                      mPrebuiltLayerState;

                // these don't need to be protected because they never change
                // after assignment
                status_t                    mStatus;
                sp<ISurfaceComposerClient>  mClient;
                Composer&                   mComposer;
};

// ---------------------------------------------------------------------------
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ namespace android {
template <class TYPE>
class SortedVector : private SortedVectorImpl
{
    friend class Vector<TYPE>;

public:
            typedef TYPE    value_type;
    
Loading