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