1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
|
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_LAYER_BASE_H
#define ANDROID_LAYER_BASE_H
#include <stdint.h>
#include <sys/types.h>
#include <private/ui/LayerState.h>
#include <ui/Region.h>
#include <pixelflinger/pixelflinger.h>
#include "Transform.h"
namespace android {
// ---------------------------------------------------------------------------
class SurfaceFlinger;
class DisplayHardware;
class GraphicPlane;
class Client;
// ---------------------------------------------------------------------------
class LayerBase
{
// poor man's dynamic_cast below
template<typename T>
struct getTypeInfoOfAnyType {
static uint32_t get() { return T::typeInfo; }
};
template<typename T>
struct getTypeInfoOfAnyType<T*> {
static uint32_t get() { return getTypeInfoOfAnyType<T>::get(); }
};
public:
static const uint32_t typeInfo;
static const char* const typeID;
virtual char const* getTypeID() const { return typeID; }
virtual uint32_t getTypeInfo() const { return typeInfo; }
template<typename T>
static T dynamicCast(LayerBase* base) {
uint32_t mostDerivedInfo = base->getTypeInfo();
uint32_t castToInfo = getTypeInfoOfAnyType<T>::get();
if ((mostDerivedInfo & castToInfo) == castToInfo)
return static_cast<T>(base);
return 0;
}
static Vector<GLuint> deletedTextures;
LayerBase(SurfaceFlinger* flinger, DisplayID display);
virtual ~LayerBase();
DisplayID dpy;
mutable bool invalidate;
Region visibleRegionScreen;
Region transparentRegionScreen;
Region coveredRegionScreen;
struct State {
uint32_t w;
uint32_t h;
uint32_t z;
uint8_t alpha;
uint8_t flags;
uint8_t sequence; // changes when visible regions can change
uint8_t reserved;
uint32_t tint;
Transform transform;
Region transparentRegion;
};
// modify current state
bool setPosition(int32_t x, int32_t y);
bool setLayer(uint32_t z);
bool setSize(uint32_t w, uint32_t h);
bool setAlpha(uint8_t alpha);
bool setMatrix(const layer_state_t::matrix22_t& matrix);
bool setTransparentRegionHint(const Region& opaque);
bool setFlags(uint8_t flags, uint8_t mask);
void commitTransaction(bool skipSize);
bool requestTransaction();
uint32_t getTransactionFlags(uint32_t flags);
uint32_t setTransactionFlags(uint32_t flags);
void validateVisibility(const Transform& globalTransform);
Rect visibleBounds() const;
void drawRegion(const Region& reg) const;
virtual void draw(const Region& clip) const;
virtual void onDraw(const Region& clip) const = 0;
virtual void initStates(uint32_t w, uint32_t h, uint32_t flags);
virtual void setSizeChanged(uint32_t w, uint32_t h);
virtual uint32_t doTransaction(uint32_t transactionFlags);
virtual void setVisibleRegion(const Region& visibleRegion);
virtual void setCoveredRegion(const Region& coveredRegion);
virtual Point getPhysicalSize() const;
virtual void lockPageFlip(bool& recomputeVisibleRegions);
virtual void unlockPageFlip(const Transform& planeTransform, Region& outDirtyRegion);
virtual void finishPageFlip();
virtual bool needsBlending() const { return false; }
virtual bool isSecure() const { return false; }
enum { // flags for doTransaction()
eVisibleRegion = 0x00000002,
eRestartTransaction = 0x00000008
};
inline const State& drawingState() const { return mDrawingState; }
inline const State& currentState() const { return mCurrentState; }
inline State& currentState() { return mCurrentState; }
static int compareCurrentStateZ(LayerBase*const* layerA, LayerBase*const* layerB) {
return layerA[0]->currentState().z - layerB[0]->currentState().z;
}
int32_t getOrientation() const { return mOrientation; }
bool transformed() const { return mTransformed; }
int tx() const { return mLeft; }
int ty() const { return mTop; }
protected:
const GraphicPlane& graphicPlane(int dpy) const;
GraphicPlane& graphicPlane(int dpy);
GLuint createTexture() const;
void drawWithOpenGL(const Region& clip,
GLint textureName, const GGLSurface& surface) const;
void clearWithOpenGL(const Region& clip) const;
void loadTexture(const Region& dirty,
GLint textureName, const GGLSurface& t,
GLuint& textureWidth, GLuint& textureHeight) const;
bool canUseCopybit() const;
SurfaceFlinger* mFlinger;
uint32_t mFlags;
// cached during validateVisibility()
bool mTransformed;
int32_t mOrientation;
GLfixed mVertices[4][2];
Rect mTransformedBounds;
bool mCanUseCopyBit;
int mLeft;
int mTop;
// these are protected by an external lock
State mCurrentState;
State mDrawingState;
volatile int32_t mTransactionFlags;
// don't change, don't need a lock
bool mPremultipliedAlpha;
// only read
const uint32_t mIdentity;
private:
void validateTexture(GLint textureName) const;
static int32_t sIdentity;
};
// ---------------------------------------------------------------------------
class LayerBaseClient : public LayerBase
{
public:
class Surface;
static const uint32_t typeInfo;
static const char* const typeID;
virtual char const* getTypeID() const { return typeID; }
virtual uint32_t getTypeInfo() const { return typeInfo; }
LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
Client* client, int32_t i);
virtual ~LayerBaseClient();
Client* const client;
layer_cblk_t* const lcblk;
inline int32_t clientIndex() const { return mIndex; }
int32_t serverIndex() const;
virtual sp<Surface> getSurface() const;
uint32_t getIdentity() const { return mIdentity; }
class Surface : public BnSurface
{
public:
Surface(SurfaceID id, int identity) {
mParams.token = id;
mParams.identity = identity;
mParams.type = 0;
}
Surface(SurfaceID id,
const sp<IMemoryHeap>& heap0,
const sp<IMemoryHeap>& heap1,
int memory_type, int identity)
{
mParams.token = id;
mParams.identity = identity;
mParams.type = memory_type;
mParams.heap[0] = heap0;
mParams.heap[1] = heap1;
}
virtual ~Surface() {
// TODO: We now have a point here were we can clean-up the
// client's mess.
// This is also where surface id should be recycled.
//LOGD("Surface %d, heaps={%p, %p}, type=%d destroyed",
// mId, mHeap[0].get(), mHeap[1].get(), mMemoryType);
}
virtual void getSurfaceData(
ISurfaceFlingerClient::surface_data_t* params) const {
*params = mParams;
}
virtual status_t registerBuffers(int w, int h, int hstride, int vstride,
PixelFormat format, const sp<IMemoryHeap>& heap)
{ return INVALID_OPERATION; }
virtual void postBuffer(ssize_t offset) { }
virtual void unregisterBuffers() { };
private:
ISurfaceFlingerClient::surface_data_t mParams;
};
private:
int32_t mIndex;
};
// ---------------------------------------------------------------------------
}; // namespace android
#endif // ANDROID_LAYER_BASE_H
|