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