19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#ifndef ANDROID_SF_SURFACE_COMPOSER_CLIENT_H
18000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#define ANDROID_SF_SURFACE_COMPOSER_CLIENT_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian#include <binder/IBinder.h>
24bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/RefBase.h>
267623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian#include <utils/Singleton.h>
277623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian#include <utils/SortedVector.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Region.h>
32000479f9e325b4e426a67033abd92d47da412725Mathias Agopian
33000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <surfaceflinger/Surface.h>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39000479f9e325b4e426a67033abd92d47da412725Mathias Agopianclass DisplayInfo;
40439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopianclass Composer;
417bb843ca0777111dae7daf8f1b0705817cf523c4Mathias Agopianclass IMemoryHeap;
427bb843ca0777111dae7daf8f1b0705817cf523c4Mathias Agopianclass ISurfaceComposer;
437bb843ca0777111dae7daf8f1b0705817cf523c4Mathias Agopianclass Region;
447623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopianclass surface_flinger_cblk_t;
45439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopianstruct layer_state_t;
467623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian
477623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian// ---------------------------------------------------------------------------
487623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian
497623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopianclass ComposerService : public Singleton<ComposerService>
507623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian{
517623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian    // these are constants
527623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian    sp<ISurfaceComposer> mComposerService;
537623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian    sp<IMemoryHeap> mServerCblkMemory;
547623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian    surface_flinger_cblk_t volatile* mServerCblk;
557623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian    ComposerService();
567623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian    friend class Singleton<ComposerService>;
577623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopianpublic:
587623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian    static sp<ISurfaceComposer> getComposerService();
597623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian    static surface_flinger_cblk_t const volatile * getControlBlock();
607623da435e45c7c03ef6a00a43675deb6645f070Mathias Agopian};
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62c7b388c2b3a9558c85e3730a7c6b261392ce493eMathias Agopian// ---------------------------------------------------------------------------
63c7b388c2b3a9558c85e3730a7c6b261392ce493eMathias Agopian
64439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopianclass Composer;
65439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian
66c7b388c2b3a9558c85e3730a7c6b261392ce493eMathias Agopianclass SurfaceComposerClient : public RefBase
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
68439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian    friend class Composer;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                SurfaceComposerClient();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual     ~SurfaceComposerClient();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Always make sure we could initialize
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t    initCheck() const;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Return the connection of this client
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<IBinder> connection() const;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Forcibly remove connection before all references have gone away.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void        dispose();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------------------------------------------------------------
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // surface creation / destruction
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //! Create a surface
8617f638b39f2e8b610ecfa1290e5bc42ab7700c98Mathias Agopian    sp<SurfaceControl> createSurface(
875d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            const String8& name,// name of the surface
889779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian            DisplayID display,  // Display to create this surface on
899779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian            uint32_t w,         // width in pixel
909779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian            uint32_t h,         // height in pixel
919779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian            PixelFormat format, // pixel-format desired
929779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian            uint32_t flags = 0  // usage flags
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    );
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
955d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    sp<SurfaceControl> createSurface(
965d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            DisplayID display,  // Display to create this surface on
975d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            uint32_t w,         // width in pixel
985d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            uint32_t h,         // height in pixel
995d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            PixelFormat format, // pixel-format desired
1005d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian            uint32_t flags = 0  // usage flags
1015d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian    );
1025d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian
1035d26c1e38dabb3ad8b4b6e1000375f3b1a6b7693Mathias Agopian
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ------------------------------------------------------------------------
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Composer parameters
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // All composer parameters must be changed within a transaction
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // several surfaces can be updated in one transaction, all changes are
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // committed at once when the transaction is closed.
109439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian    // closeGlobalTransaction() usually requires an IPC with the server.
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //! Open a composer transaction on all active SurfaceComposerClients.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static void openGlobalTransaction();
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //! Close a composer transaction on all active SurfaceComposerClients.
115122aa6bae9f72015e6d50e78d4d47a95e05d3f49Jamie Gennis    static void closeGlobalTransaction(bool synchronous = false);
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //! Freeze the specified display but not transactions.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static status_t freezeDisplay(DisplayID dpy, uint32_t flags = 0);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //! Resume updates on the specified display.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static status_t unfreezeDisplay(DisplayID dpy, uint32_t flags = 0);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //! Set the orientation of the given display
124eb0c86e18b7d620b679ff2a45a0233867a53a334Mathias Agopian    static int setOrientation(DisplayID dpy, int orientation, uint32_t flags);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Query the number of displays
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static ssize_t getNumberOfDisplays();
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Get information about a display
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static status_t getDisplayInfo(DisplayID dpy, DisplayInfo* info);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static ssize_t getDisplayWidth(DisplayID dpy);
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static ssize_t getDisplayHeight(DisplayID dpy);
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static ssize_t getDisplayOrientation(DisplayID dpy);
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
135bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian    status_t linkToComposerDeath(const sp<IBinder::DeathRecipient>& recipient,
136bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian            void* cookie = NULL, uint32_t flags = 0);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1386d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    hide(SurfaceID id);
1396d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    show(SurfaceID id, int32_t layer = -1);
1406d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    freeze(SurfaceID id);
1416d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    unfreeze(SurfaceID id);
1426d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    setFlags(SurfaceID id, uint32_t flags, uint32_t mask);
1436d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    setTransparentRegionHint(SurfaceID id, const Region& transparent);
1446d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    setLayer(SurfaceID id, int32_t layer);
1456d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    setAlpha(SurfaceID id, float alpha=1.0f);
1466d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    setFreezeTint(SurfaceID id, uint32_t tint);
1476d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    setMatrix(SurfaceID id, float dsdx, float dtdx, float dsdy, float dtdy);
14834cb9f2a960c4173bdafb4b8a2444c1bca4c5f0dMathias Agopian    status_t    setPosition(SurfaceID id, float x, float y);
1496d2c0bc7bfe10a9b70ca608baf626c47a228fa6bMathias Agopian    status_t    setSize(SurfaceID id, uint32_t w, uint32_t h);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t    destroySurface(SurfaceID sid);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1522ce19af45bf4c5e311a73df474ffe88d96d118c5Mathias Agopianprivate:
153c7b388c2b3a9558c85e3730a7c6b261392ce493eMathias Agopian    virtual void onFirstRef();
154439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian    Composer& getComposer();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
156439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian    mutable     Mutex                       mLock;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                status_t                    mStatus;
158770492cb2b19f6a36ad748cd05fbedfbb9a67dfaMathias Agopian                sp<ISurfaceComposerClient>  mClient;
159439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian                Composer&                   mComposer;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
162c7b388c2b3a9558c85e3730a7c6b261392ce493eMathias Agopian// ---------------------------------------------------------------------------
16338ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian
16438ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopianclass ScreenshotClient
16538ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian{
16638ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    sp<IMemoryHeap> mHeap;
16738ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    uint32_t mWidth;
16838ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    uint32_t mHeight;
16938ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    PixelFormat mFormat;
17038ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopianpublic:
17138ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    ScreenshotClient();
17238ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian
17338ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    // frees the previous screenshot and capture a new one
17438ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    status_t update();
17538ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    status_t update(uint32_t reqWidth, uint32_t reqHeight);
1763dd25a6bf71bd535bf9dbbe16234229ff45414a0Mathias Agopian    status_t update(uint32_t reqWidth, uint32_t reqHeight,
1773dd25a6bf71bd535bf9dbbe16234229ff45414a0Mathias Agopian            uint32_t minLayerZ, uint32_t maxLayerZ);
17838ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian
17938ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    // release memory occupied by the screenshot
18038ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    void release();
18138ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian
18238ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    // pixels are valid until this object is freed or
18338ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    // release() or update() is called
18438ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    void const* getPixels() const;
18538ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian
18638ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    uint32_t getWidth() const;
18738ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    uint32_t getHeight() const;
18838ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    PixelFormat getFormat() const;
18938ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    uint32_t getStride() const;
19038ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    // size of allocated memory in bytes
19138ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian    size_t getSize() const;
19238ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian};
19338ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian
19438ed2e39c54a42dda8f00620f960788f569a3698Mathias Agopian// ---------------------------------------------------------------------------
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
197000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#endif // ANDROID_SF_SURFACE_COMPOSER_CLIENT_H
198