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>
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h>
329cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
3390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h>
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian#include <hardware/hwcomposer.h>
36a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
375ec99b57c3b6e15a1e19a9888100de76278b7696Mathias Agopian#include "DisplayHardware/DisplayHardware.h"
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "Transform.h"
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass Client;
45a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianclass DisplayHardware;
463330b203039dea366d4981db1408a460134b2d2cMathias Agopianclass GraphicBuffer;
473330b203039dea366d4981db1408a460134b2d2cMathias Agopianclass GraphicPlane;
48670a8990e822785da2a684f71f0035725022ced4Mathias Agopianclass Layer;
49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopianclass LayerBaseClient;
503330b203039dea366d4981db1408a460134b2d2cMathias Agopianclass SurfaceFlinger;
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianclass LayerBase : public RefBase
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
56f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian    static int32_t sSequence;
57f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            LayerBase(SurfaceFlinger* flinger, DisplayID display);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    DisplayID           dpy;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable bool        contentDirty;
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Region      visibleRegionScreen;
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Region      transparentRegionScreen;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Region      coveredRegionScreen;
66f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian            int32_t     sequence;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian            struct Geometry {
69b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                uint32_t w;
70b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                uint32_t h;
71b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                Rect crop;
72b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                inline bool operator == (const Geometry& rhs) const {
73b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                    return (w==rhs.w && h==rhs.h && crop==rhs.crop);
74b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                }
75b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                inline bool operator != (const Geometry& rhs) const {
76b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                    return !operator == (rhs);
77b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                }
7893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian            };
7993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian
8093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian            struct State {
8193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian                Geometry        active;
8293ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian                Geometry        requested;
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                uint32_t        z;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                uint8_t         alpha;
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                uint8_t         flags;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                uint8_t         reserved[2];
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int32_t         sequence;   // changes when visible regions can change
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Transform       transform;
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Region          transparentRegion;
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            };
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennis    virtual void setName(const String8& name);
93d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian            String8 getName() const;
94d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // modify current state
9641b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian            bool setPosition(float x, float y);
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool setLayer(uint32_t z);
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool setSize(uint32_t w, uint32_t h);
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool setAlpha(uint8_t alpha);
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool setMatrix(const layer_state_t::matrix22_t& matrix);
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool setTransparentRegionHint(const Region& opaque);
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool setFlags(uint8_t flags, uint8_t mask);
103f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis            bool setCrop(const Rect& crop);
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian            void commitTransaction();
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bool requestTransaction();
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void forceVisibilityTransaction();
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint32_t getTransactionFlags(uint32_t flags);
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            uint32_t setTransactionFlags(uint32_t flags);
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Rect visibleBounds() const;
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
114b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual sp<LayerBaseClient> getLayerBaseClient() const { return 0; }
115670a8990e822785da2a684f71f0035725022ced4Mathias Agopian    virtual sp<Layer> getLayer() const { return 0; }
116b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian
1171b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    virtual const char* getTypeId() const { return "LayerBase"; }
1181b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
119a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    virtual void setGeometry(hwc_layer_t* hwcl);
120a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    virtual void setPerFrameData(hwc_layer_t* hwcl);
121f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian
122a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * draw - performs some global clipping optimizations
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * and calls onDraw().
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * Typically this method is not overridden, instead implement onDraw()
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * to perform the actual drawing.
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void draw(const Region& clip) const;
130a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual void drawForSreenShot();
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * onDraw - draws the surface.
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void onDraw(const Region& clip) const = 0;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * initStates - called just after construction
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void initStates(uint32_t w, uint32_t h, uint32_t flags);
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * doTransaction - process the transaction. This is a good place to figure
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * out which attributes of the surface have changed.
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual uint32_t doTransaction(uint32_t transactionFlags);
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * setVisibleRegion - called to set the new visible region. This gives
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * a chance to update the new visible region or record the fact it changed.
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void setVisibleRegion(const Region& visibleRegion);
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * setCoveredRegion - called when the covered region changes. The covered
156ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian     * region corresponds to any area of the surface that is covered
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * (transparently or not) by another surface.
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void setCoveredRegion(const Region& coveredRegion);
160ab02873e8f4e235b0db800521dd0c969ed38c0b9Mathias Agopian
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * validateVisibility - cache a bunch of things
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void validateVisibility(const Transform& globalTransform);
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * lockPageFlip - called each time the screen is redrawn and returns whether
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * the visible regions need to be recomputed (this is a fairly heavy
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * operation, so this should be set only if needed). Typically this is used
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * to figure out if the content or size of a surface has changed.
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void lockPageFlip(bool& recomputeVisibleRegions);
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * unlockPageFlip - called each time the screen is redrawn. updates the
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * final dirty region wrt the planeTransform.
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * At this point, all visible regions, surface position and size, etc... are
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * correct.
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion);
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
183a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian     * isOpaque - true if this surface is opaque
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
185a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual bool isOpaque() const  { return true; }
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
188401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian     * needsDithering - true if this surface needs dithering
189401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian     */
190401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    virtual bool needsDithering() const { return false; }
191401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian
192401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    /**
193a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian     * needsLinearFiltering - true if this surface's state requires filtering
194a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian     */
195a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual bool needsFiltering() const { return mNeedsFiltering; }
196a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
197a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian    /**
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * isSecure - true if this surface is secure, that is if it prevents
1999a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     * screenshots or VNC servers.
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool isSecure() const       { return false; }
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20316f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    /**
2047a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis     * isProtected - true if the layer may contain protected content in the
2057a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis     * GRALLOC_USAGE_PROTECTED sense.
20616f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten     */
2077a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    virtual bool isProtected() const   { return false; }
20816f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten
2090b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian    /** called with the state lock when the surface is removed from the
2100b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian     *  current list */
21199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    virtual void onRemoved() { }
212e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
21399ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    /** called after page-flip
21499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian     */
21599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    virtual void onLayerDisplayed() { }
21699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
21799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    /** called before composition.
21899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian     * returns true if the layer has pending updates.
21999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian     */
22099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian    virtual bool onPreComposition() { return false; }
221e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
2221b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    /** always call base class first */
2231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    virtual void dump(String8& result, char* scratch, size_t size) const;
22448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    virtual void shortDump(String8& result, char* scratch, size_t size) const;
22582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    virtual void dumpStats(String8& result, char* buffer, size_t SIZE) const;
22625e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian    virtual void clearStats();
2271b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2281b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
2299a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    enum { // flags for doTransaction()
23005cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian        eDontUpdateGeometryState = 0x00000001,
23105cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian        eVisibleRegion           = 0x00000002,
2329a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    };
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline  const State&    drawingState() const    { return mDrawingState; }
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline  const State&    currentState() const    { return mCurrentState; }
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline  State&          currentState()          { return mCurrentState; }
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t  getOrientation() const { return mOrientation; }
2408d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis    int32_t  getPlaneOrientation() const { return mPlaneOrientation; }
241a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian
242a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian    void clearWithOpenGL(const Region& clip) const;
243a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const GraphicPlane& graphicPlane(int dpy) const;
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          GraphicPlane& graphicPlane(int dpy);
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
248010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian          void clearWithOpenGL(const Region& clip, GLclampf r, GLclampf g,
249010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                               GLclampf b, GLclampf alpha) const;
250a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian          void drawWithOpenGL(const Region& clip) const;
251a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
252a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian          void setFiltering(bool filtering);
253a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian          bool getFiltering() const;
254b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian
2559a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian                sp<SurfaceFlinger> mFlinger;
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                uint32_t        mFlags;
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
258a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianprivate:
259a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                // accessed only in the main thread
260a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                // Whether filtering is forced on or not
261a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                bool            mFiltering;
262b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // cached during validateVisibility()
264a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                // Whether filtering is needed b/c of the drawingstate
265a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian                bool            mNeedsFiltering;
266a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
267a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianprotected:
268a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                // cached during validateVisibility()
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int32_t         mOrientation;
2708d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis                int32_t         mPlaneOrientation;
271d992db3827016388e8069f5793b031153d423501Mathias Agopian                Transform       mTransform;
27278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian                GLfloat         mVertices[4][2];
273f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian                size_t          mNumVertices;
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                Rect            mTransformedBounds;
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // these are protected by an external lock
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                State           mCurrentState;
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                State           mDrawingState;
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    volatile    int32_t         mTransactionFlags;
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // don't change, don't need a lock
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                bool            mPremultipliedAlpha;
283d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian                String8         mName;
284d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    mutable     bool            mDebug;
285d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
287ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopianpublic:
288ca4d3602c07837d0b2ac6878685a8e327b5f30f0Mathias Agopian    // called from class SurfaceFlinger
289076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    virtual ~LayerBase();
290076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    LayerBase(const LayerBase& rhs);
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass LayerBaseClient : public LayerBase
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
30196f0819f81293076e652792794a961543e6750d7Mathias Agopian            LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
30296f0819f81293076e652792794a961543e6750d7Mathias Agopian                        const sp<Client>& client);
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
304a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            virtual ~LayerBaseClient();
305a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
306a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            sp<ISurface> getSurface();
3070d1561275e80073807ac04728951782d943f8882Mathias Agopian            wp<IBinder> getSurfaceBinder() const;
308582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis            virtual wp<IBinder> getSurfaceTextureBinder() const;
309a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
310b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    virtual sp<LayerBaseClient> getLayerBaseClient() const {
311b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        return const_cast<LayerBaseClient*>(this); }
312a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
3131b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    virtual const char* getTypeId() const { return "LayerBaseClient"; }
314285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian
31596f0819f81293076e652792794a961543e6750d7Mathias Agopian    uint32_t getIdentity() const { return mIdentity; }
31696f0819f81293076e652792794a961543e6750d7Mathias Agopian
3171b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianprotected:
3181b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    virtual void dump(String8& result, char* scratch, size_t size) const;
31948b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    virtual void shortDump(String8& result, char* scratch, size_t size) const;
3201b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
321a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    class LayerCleaner {
322a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        sp<SurfaceFlinger> mFlinger;
323a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        wp<LayerBaseClient> mLayer;
324a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    protected:
325a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        ~LayerCleaner();
326a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    public:
327a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        LayerCleaner(const sp<SurfaceFlinger>& flinger,
328a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                const sp<LayerBaseClient>& layer);
329a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    };
330a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
331076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianprivate:
332a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    virtual sp<ISurface> createSurface();
333a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
33496f0819f81293076e652792794a961543e6750d7Mathias Agopian    mutable Mutex mLock;
335a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    mutable bool mHasSurface;
3360d1561275e80073807ac04728951782d943f8882Mathias Agopian    wp<IBinder> mClientSurfaceBinder;
337b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    const wp<Client> mClientRef;
3382e123245811a1f31c080a29728fcc1655045f011Mathias Agopian    // only read
33996f0819f81293076e652792794a961543e6750d7Mathias Agopian    const uint32_t mIdentity;
34096f0819f81293076e652792794a961543e6750d7Mathias Agopian    static int32_t sIdentity;
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_LAYER_BASE_H
348