1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_LAYER_BASE_H 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_LAYER_BASE_H 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 231fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian#include <EGL/egl.h> 241fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian#include <EGL/eglext.h> 25eda65400f5ae301e26c5f52287d831f063069ec2Mathias Agopian#include <GLES/gl.h> 261fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian 27076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h> 28a49126087b4494f4ef50873f3a3f6727265f6621Mathias Agopian#include <utils/String8.h> 29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 339cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 3490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Transform.h" 378630320433bd15aca239522e54e711ef6372ab07Mathias Agopian#include "DisplayHardware/HWComposer.h" 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client; 440f2f5ff75b7b48ceb64270655ee6b62d09bf4d00Mathias Agopianclass DisplayDevice; 453330b203039dea366d4981db1408a460134b2d2cMathias Agopianclass GraphicBuffer; 46670a8990e822785da2a684f71f0035725022ced4Mathias Agopianclass Layer; 47b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass LayerBaseClient; 483330b203039dea366d4981db1408a460134b2d2cMathias Agopianclass SurfaceFlinger; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianclass LayerBase : public RefBase 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 54f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian static int32_t sSequence; 55f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 573ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian LayerBase(SurfaceFlinger* flinger); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mutable bool contentDirty; 604fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // regions below are in window-manager space 614fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region visibleRegion; 624fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region coveredRegion; 63a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall Region visibleNonTransparentRegion; 64f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian int32_t sequence; 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian struct Geometry { 67b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian uint32_t w; 68b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian uint32_t h; 69b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian Rect crop; 70b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian inline bool operator == (const Geometry& rhs) const { 71b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian return (w==rhs.w && h==rhs.h && crop==rhs.crop); 72b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian } 73b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian inline bool operator != (const Geometry& rhs) const { 74b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian return !operator == (rhs); 75b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian } 7693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian }; 7793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian 7893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian struct State { 7993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian Geometry active; 8093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian Geometry requested; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t z; 828785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian uint32_t layerStack; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint8_t alpha; 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint8_t flags; 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint8_t reserved[2]; 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t sequence; // changes when visible regions can change 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Transform transform; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Region transparentRegion; 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 914fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian class LayerMesh { 924fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian friend class LayerBase; 934fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian GLfloat mVertices[4][2]; 944fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian size_t mNumVertices; 954fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian public: 964fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian LayerMesh() : mNumVertices(4) { } 974fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian GLfloat const* getVertices() const { 984fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return &mVertices[0][0]; 994fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 1004fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian size_t getVertexCount() const { 1014fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return mNumVertices; 1024fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian } 1034fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian }; 1044fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 105a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennis virtual void setName(const String8& name); 106d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian String8 getName() const; 107d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // modify current state 10941b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian bool setPosition(float x, float y); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setLayer(uint32_t z); 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setSize(uint32_t w, uint32_t h); 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setAlpha(uint8_t alpha); 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setMatrix(const layer_state_t::matrix22_t& matrix); 114a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall bool setTransparentRegionHint(const Region& transparent); 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool setFlags(uint8_t flags, uint8_t mask); 116f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis bool setCrop(const Rect& crop); 1178785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian bool setLayerStack(uint32_t layerStack); 1188785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 119ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian void commitTransaction(); 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool requestTransaction(); 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void forceVisibilityTransaction(); 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t getTransactionFlags(uint32_t flags); 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t setTransactionFlags(uint32_t flags); 1254fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 1264297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian void computeGeometry(const sp<const DisplayDevice>& hw, LayerMesh* mesh) const; 1274fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Rect computeBounds() const; 1284fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 130921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual sp<LayerBaseClient> getLayerBaseClient() const; 131921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian virtual sp<Layer> getLayer() const; 132b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian 1331b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian virtual const char* getTypeId() const { return "LayerBase"; } 1341b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 1354297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void setGeometry(const sp<const DisplayDevice>& hw, 1364fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian HWComposer::HWCLayerInterface& layer); 1374297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void setPerFrameData(const sp<const DisplayDevice>& hw, 138d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian HWComposer::HWCLayerInterface& layer); 1394297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void setAcquireFence(const sp<const DisplayDevice>& hw, 140d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian HWComposer::HWCLayerInterface& layer); 141a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * draw - performs some global clipping optimizations 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * and calls onDraw(). 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Typically this method is not overridden, instead implement onDraw() 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * to perform the actual drawing. 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 1484297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void draw(const sp<const DisplayDevice>& hw, const Region& clip) const; 1494297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void draw(const sp<const DisplayDevice>& hw); 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * onDraw - draws the surface. 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 1544297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void onDraw(const sp<const DisplayDevice>& hw, const Region& clip) const = 0; 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * initStates - called just after construction 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void initStates(uint32_t w, uint32_t h, uint32_t flags); 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * doTransaction - process the transaction. This is a good place to figure 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * out which attributes of the surface have changed. 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual uint32_t doTransaction(uint32_t transactionFlags); 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * setVisibleRegion - called to set the new visible region. This gives 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * a chance to update the new visible region or record the fact it changed. 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void setVisibleRegion(const Region& visibleRegion); 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * setCoveredRegion - called when the covered region changes. The covered 175ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian * region corresponds to any area of the surface that is covered 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * (transparently or not) by another surface. 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void setCoveredRegion(const Region& coveredRegion); 179ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 181a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall * setVisibleNonTransparentRegion - called when the visible and 182a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall * non-transparent region changes. 183a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall */ 184a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall virtual void setVisibleNonTransparentRegion(const Region& 185a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall visibleNonTransparentRegion); 186a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall 187a8026d21f3f2f09e3416cbd33c277fbd15d8cf4eJesse Hall /** 1884fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian * latchBuffer - called each time the screen is redrawn and returns whether 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * the visible regions need to be recomputed (this is a fairly heavy 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * operation, so this should be set only if needed). Typically this is used 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * to figure out if the content or size of a surface has changed. 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 1934fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian virtual Region latchBuffer(bool& recomputeVisibleRegions); 1944fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 196a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian * isOpaque - true if this surface is opaque 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 198a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual bool isOpaque() const { return true; } 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 201401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian * needsDithering - true if this surface needs dithering 202401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian */ 203401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian virtual bool needsDithering() const { return false; } 204401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian 205401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian /** 206a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian * needsLinearFiltering - true if this surface's state requires filtering 207a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian */ 208eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian virtual bool needsFiltering(const sp<const DisplayDevice>& hw) const; 209a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian 210a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian /** 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * isSecure - true if this surface is secure, that is if it prevents 2129a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian * screenshots or VNC servers. 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual bool isSecure() const { return false; } 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21616f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten /** 2177a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis * isProtected - true if the layer may contain protected content in the 2187a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis * GRALLOC_USAGE_PROTECTED sense. 21916f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten */ 2207a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis virtual bool isProtected() const { return false; } 22116f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten 222da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian /* 223da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian * isVisible - true if this layer is visibile, false otherwise 224da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian */ 225da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian virtual bool isVisible() const; 226da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 2270b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian /** called with the state lock when the surface is removed from the 2280b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian * current list */ 22999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian virtual void onRemoved() { } 230e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 23199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian /** called after page-flip 23299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian */ 2334297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian virtual void onLayerDisplayed(const sp<const DisplayDevice>& hw, 234c39736088398a9b4367b30fc307ed7de96ac342eMathias Agopian HWComposer::HWCLayerInterface* layer); 23599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 23699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian /** called before composition. 23799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian * returns true if the layer has pending updates. 23899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian */ 23999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian virtual bool onPreComposition() { return false; } 240e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 241d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian /** called before composition. 242d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian */ 243d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian virtual void onPostComposition() { } 244d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 2456905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden /** 2466905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden * Updates the SurfaceTexture's transform hint, for layers that have 2476905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden * a SurfaceTexture. 2486905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden */ 2496905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden virtual void updateTransformHint() const { } 2506905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden 2511b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian /** always call base class first */ 2521b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian virtual void dump(String8& result, char* scratch, size_t size) const; 25348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian virtual void shortDump(String8& result, char* scratch, size_t size) const; 25482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian virtual void dumpStats(String8& result, char* buffer, size_t SIZE) const; 25525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian virtual void clearStats(); 2561b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2571b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2589a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian enum { // flags for doTransaction() 25905cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian eDontUpdateGeometryState = 0x00000001, 26005cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian eVisibleRegion = 0x00000002, 2619a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian }; 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline const State& drawingState() const { return mDrawingState; } 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline const State& currentState() const { return mCurrentState; } 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline State& currentState() { return mCurrentState; } 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 2684297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian void clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const; 269a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian 270fcb239d3dac8bc80f28177f1951611c1d43286ffMathias Agopian void setFiltering(bool filtering); 271fcb239d3dac8bc80f28177f1951611c1d43286ffMathias Agopian bool getFiltering() const; 272fcb239d3dac8bc80f28177f1951611c1d43286ffMathias Agopian 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 2744297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian void clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip, 2751b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian GLclampf r, GLclampf g, GLclampf b, GLclampf alpha) const; 2764297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian void drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const; 277a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 2789a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian sp<SurfaceFlinger> mFlinger; 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 280a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianprivate: 281a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // accessed only in the main thread 282a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // Whether filtering is forced on or not 283a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian bool mFiltering; 284b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian 285a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // Whether filtering is needed b/c of the drawingstate 286a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian bool mNeedsFiltering; 287a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 288a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianprotected: 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // these are protected by an external lock 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project State mCurrentState; 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project State mDrawingState; 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project volatile int32_t mTransactionFlags; 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // don't change, don't need a lock 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool mPremultipliedAlpha; 296d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian String8 mName; 297d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian mutable bool mDebug; 298d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 300ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopianpublic: 301ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian // called from class SurfaceFlinger 302076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian virtual ~LayerBase(); 303076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 305076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian LayerBase(const LayerBase& rhs); 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass LayerBaseClient : public LayerBase 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 3143ee454a7bef8bd3d1c9cdd9d17108eb80ebadf2aMathias Agopian LayerBaseClient(SurfaceFlinger* flinger, const sp<Client>& client); 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 316a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual ~LayerBaseClient(); 317a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 318a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<ISurface> getSurface(); 3190d1561275e80073807ac04728951782d943f8882Mathias Agopian wp<IBinder> getSurfaceBinder() const; 320582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual wp<IBinder> getSurfaceTextureBinder() const; 321a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 322b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian virtual sp<LayerBaseClient> getLayerBaseClient() const { 323b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return const_cast<LayerBaseClient*>(this); } 324a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 3251b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian virtual const char* getTypeId() const { return "LayerBaseClient"; } 326285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 32796f0819f81293076e652792794a961543e6750d7Mathias Agopian uint32_t getIdentity() const { return mIdentity; } 32896f0819f81293076e652792794a961543e6750d7Mathias Agopian 3291b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianprotected: 3301b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian virtual void dump(String8& result, char* scratch, size_t size) const; 33148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian virtual void shortDump(String8& result, char* scratch, size_t size) const; 3321b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 333a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian class LayerCleaner { 334a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<SurfaceFlinger> mFlinger; 335a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian wp<LayerBaseClient> mLayer; 336a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian protected: 337a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian ~LayerCleaner(); 338a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian public: 339a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian LayerCleaner(const sp<SurfaceFlinger>& flinger, 340a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<LayerBaseClient>& layer); 341a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian }; 342a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 343076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianprivate: 344a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian virtual sp<ISurface> createSurface(); 345a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 34696f0819f81293076e652792794a961543e6750d7Mathias Agopian mutable Mutex mLock; 347a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian mutable bool mHasSurface; 3480d1561275e80073807ac04728951782d943f8882Mathias Agopian wp<IBinder> mClientSurfaceBinder; 349b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const wp<Client> mClientRef; 3502e123245811a1f31c080a29728fcc1655045f011Mathias Agopian // only read 35196f0819f81293076e652792794a961543e6750d7Mathias Agopian const uint32_t mIdentity; 35296f0819f81293076e652792794a961543e6750d7Mathias Agopian static int32_t sIdentity; 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_LAYER_BASE_H 360