1 /*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <stdlib.h>
18 #include <stdint.h>
19 #include <sys/types.h>
20
21 #include <utils/Errors.h>
22 #include <utils/Log.h>
23 #include <binder/IPCThreadState.h>
24 #include <binder/IServiceManager.h>
25
26 #include <GLES/gl.h>
27 #include <GLES/glext.h>
28
29 #include <hardware/hardware.h>
30
31 #include "clz.h"
32 #include "Client.h"
33 #include "LayerBase.h"
34 #include "Layer.h"
35 #include "SurfaceFlinger.h"
36 #include "DisplayDevice.h"
37
38 namespace android {
39
40 // ---------------------------------------------------------------------------
41
42 int32_t LayerBase::sSequence = 1;
43
LayerBase(SurfaceFlinger * flinger)44 LayerBase::LayerBase(SurfaceFlinger* flinger)
45 : contentDirty(false),
46 sequence(uint32_t(android_atomic_inc(&sSequence))),
47 mFlinger(flinger), mFiltering(false),
48 mNeedsFiltering(false),
49 mTransactionFlags(0),
50 mPremultipliedAlpha(true), mName("unnamed"), mDebug(false)
51 {
52 }
53
~LayerBase()54 LayerBase::~LayerBase()
55 {
56 }
57
setName(const String8 & name)58 void LayerBase::setName(const String8& name) {
59 mName = name;
60 }
61
getName() const62 String8 LayerBase::getName() const {
63 return mName;
64 }
65
initStates(uint32_t w,uint32_t h,uint32_t flags)66 void LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags)
67 {
68 uint32_t layerFlags = 0;
69 if (flags & ISurfaceComposerClient::eHidden)
70 layerFlags = layer_state_t::eLayerHidden;
71
72 if (flags & ISurfaceComposerClient::eNonPremultiplied)
73 mPremultipliedAlpha = false;
74
75 mCurrentState.active.w = w;
76 mCurrentState.active.h = h;
77 mCurrentState.active.crop.makeInvalid();
78 mCurrentState.z = 0;
79 mCurrentState.alpha = 0xFF;
80 mCurrentState.layerStack = 0;
81 mCurrentState.flags = layerFlags;
82 mCurrentState.sequence = 0;
83 mCurrentState.transform.set(0, 0);
84 mCurrentState.requested = mCurrentState.active;
85
86 // drawing state & current state are identical
87 mDrawingState = mCurrentState;
88 }
89
needsFiltering(const sp<const DisplayDevice> & hw) const90 bool LayerBase::needsFiltering(const sp<const DisplayDevice>& hw) const {
91 return mNeedsFiltering || hw->needsFiltering();
92 }
93
commitTransaction()94 void LayerBase::commitTransaction() {
95 mDrawingState = mCurrentState;
96 }
forceVisibilityTransaction()97 void LayerBase::forceVisibilityTransaction() {
98 // this can be called without SurfaceFlinger.mStateLock, but if we
99 // can atomically increment the sequence number, it doesn't matter.
100 android_atomic_inc(&mCurrentState.sequence);
101 requestTransaction();
102 }
requestTransaction()103 bool LayerBase::requestTransaction() {
104 int32_t old = setTransactionFlags(eTransactionNeeded);
105 return ((old & eTransactionNeeded) == 0);
106 }
getTransactionFlags(uint32_t flags)107 uint32_t LayerBase::getTransactionFlags(uint32_t flags) {
108 return android_atomic_and(~flags, &mTransactionFlags) & flags;
109 }
setTransactionFlags(uint32_t flags)110 uint32_t LayerBase::setTransactionFlags(uint32_t flags) {
111 return android_atomic_or(flags, &mTransactionFlags);
112 }
113
setPosition(float x,float y)114 bool LayerBase::setPosition(float x, float y) {
115 if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
116 return false;
117 mCurrentState.sequence++;
118 mCurrentState.transform.set(x, y);
119 requestTransaction();
120 return true;
121 }
setLayer(uint32_t z)122 bool LayerBase::setLayer(uint32_t z) {
123 if (mCurrentState.z == z)
124 return false;
125 mCurrentState.sequence++;
126 mCurrentState.z = z;
127 requestTransaction();
128 return true;
129 }
setSize(uint32_t w,uint32_t h)130 bool LayerBase::setSize(uint32_t w, uint32_t h) {
131 if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
132 return false;
133 mCurrentState.requested.w = w;
134 mCurrentState.requested.h = h;
135 requestTransaction();
136 return true;
137 }
setAlpha(uint8_t alpha)138 bool LayerBase::setAlpha(uint8_t alpha) {
139 if (mCurrentState.alpha == alpha)
140 return false;
141 mCurrentState.sequence++;
142 mCurrentState.alpha = alpha;
143 requestTransaction();
144 return true;
145 }
setMatrix(const layer_state_t::matrix22_t & matrix)146 bool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) {
147 mCurrentState.sequence++;
148 mCurrentState.transform.set(
149 matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
150 requestTransaction();
151 return true;
152 }
setTransparentRegionHint(const Region & transparent)153 bool LayerBase::setTransparentRegionHint(const Region& transparent) {
154 mCurrentState.sequence++;
155 mCurrentState.transparentRegion = transparent;
156 requestTransaction();
157 return true;
158 }
setFlags(uint8_t flags,uint8_t mask)159 bool LayerBase::setFlags(uint8_t flags, uint8_t mask) {
160 const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
161 if (mCurrentState.flags == newFlags)
162 return false;
163 mCurrentState.sequence++;
164 mCurrentState.flags = newFlags;
165 requestTransaction();
166 return true;
167 }
setCrop(const Rect & crop)168 bool LayerBase::setCrop(const Rect& crop) {
169 if (mCurrentState.requested.crop == crop)
170 return false;
171 mCurrentState.sequence++;
172 mCurrentState.requested.crop = crop;
173 requestTransaction();
174 return true;
175 }
176
setLayerStack(uint32_t layerStack)177 bool LayerBase::setLayerStack(uint32_t layerStack) {
178 if (mCurrentState.layerStack == layerStack)
179 return false;
180 mCurrentState.sequence++;
181 mCurrentState.layerStack = layerStack;
182 requestTransaction();
183 return true;
184 }
185
setVisibleRegion(const Region & visibleRegion)186 void LayerBase::setVisibleRegion(const Region& visibleRegion) {
187 // always called from main thread
188 this->visibleRegion = visibleRegion;
189 }
190
setCoveredRegion(const Region & coveredRegion)191 void LayerBase::setCoveredRegion(const Region& coveredRegion) {
192 // always called from main thread
193 this->coveredRegion = coveredRegion;
194 }
195
setVisibleNonTransparentRegion(const Region & setVisibleNonTransparentRegion)196 void LayerBase::setVisibleNonTransparentRegion(const Region&
197 setVisibleNonTransparentRegion) {
198 // always called from main thread
199 this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
200 }
201
doTransaction(uint32_t flags)202 uint32_t LayerBase::doTransaction(uint32_t flags)
203 {
204 const Layer::State& front(drawingState());
205 const Layer::State& temp(currentState());
206
207 // always set active to requested, unless we're asked not to
208 // this is used by Layer, which special cases resizes.
209 if (flags & eDontUpdateGeometryState) {
210 } else {
211 Layer::State& editTemp(currentState());
212 editTemp.active = temp.requested;
213 }
214
215 if (front.active != temp.active) {
216 // invalidate and recompute the visible regions if needed
217 flags |= Layer::eVisibleRegion;
218 }
219
220 if (temp.sequence != front.sequence) {
221 // invalidate and recompute the visible regions if needed
222 flags |= eVisibleRegion;
223 this->contentDirty = true;
224
225 // we may use linear filtering, if the matrix scales us
226 const uint8_t type = temp.transform.getType();
227 mNeedsFiltering = (!temp.transform.preserveRects() ||
228 (type >= Transform::SCALE));
229 }
230
231 // Commit the transaction
232 commitTransaction();
233 return flags;
234 }
235
computeGeometry(const sp<const DisplayDevice> & hw,LayerMesh * mesh) const236 void LayerBase::computeGeometry(const sp<const DisplayDevice>& hw, LayerMesh* mesh) const
237 {
238 const Layer::State& s(drawingState());
239 const Transform tr(hw->getTransform() * s.transform);
240 const uint32_t hw_h = hw->getHeight();
241 Rect win(s.active.w, s.active.h);
242 if (!s.active.crop.isEmpty()) {
243 win.intersect(s.active.crop, &win);
244 }
245 if (mesh) {
246 tr.transform(mesh->mVertices[0], win.left, win.top);
247 tr.transform(mesh->mVertices[1], win.left, win.bottom);
248 tr.transform(mesh->mVertices[2], win.right, win.bottom);
249 tr.transform(mesh->mVertices[3], win.right, win.top);
250 for (size_t i=0 ; i<4 ; i++) {
251 mesh->mVertices[i][1] = hw_h - mesh->mVertices[i][1];
252 }
253 }
254 }
255
computeBounds() const256 Rect LayerBase::computeBounds() const {
257 const Layer::State& s(drawingState());
258 Rect win(s.active.w, s.active.h);
259 if (!s.active.crop.isEmpty()) {
260 win.intersect(s.active.crop, &win);
261 }
262 return s.transform.transform(win);
263 }
264
latchBuffer(bool & recomputeVisibleRegions)265 Region LayerBase::latchBuffer(bool& recomputeVisibleRegions) {
266 Region result;
267 return result;
268 }
269
setGeometry(const sp<const DisplayDevice> & hw,HWComposer::HWCLayerInterface & layer)270 void LayerBase::setGeometry(
271 const sp<const DisplayDevice>& hw,
272 HWComposer::HWCLayerInterface& layer)
273 {
274 layer.setDefaultState();
275
276 // this gives us only the "orientation" component of the transform
277 const State& s(drawingState());
278 const uint32_t finalTransform = s.transform.getOrientation();
279 // we can only handle simple transformation
280 if (finalTransform & Transform::ROT_INVALID) {
281 layer.setTransform(0);
282 } else {
283 layer.setTransform(finalTransform);
284 }
285
286 if (!isOpaque()) {
287 layer.setBlending(mPremultipliedAlpha ?
288 HWC_BLENDING_PREMULT :
289 HWC_BLENDING_COVERAGE);
290 }
291
292 const Transform& tr = hw->getTransform();
293 Rect transformedBounds(computeBounds());
294 transformedBounds = tr.transform(transformedBounds);
295
296 // scaling is already applied in transformedBounds
297 layer.setFrame(transformedBounds);
298 layer.setCrop(transformedBounds.getBounds());
299 }
300
setPerFrameData(const sp<const DisplayDevice> & hw,HWComposer::HWCLayerInterface & layer)301 void LayerBase::setPerFrameData(const sp<const DisplayDevice>& hw,
302 HWComposer::HWCLayerInterface& layer) {
303 layer.setPerFrameDefaultState();
304 // we have to set the visible region on every frame because
305 // we currently free it during onLayerDisplayed(), which is called
306 // after HWComposer::commit() -- every frame.
307 const Transform& tr = hw->getTransform();
308 layer.setVisibleRegionScreen(tr.transform(visibleRegion));
309 }
310
setAcquireFence(const sp<const DisplayDevice> & hw,HWComposer::HWCLayerInterface & layer)311 void LayerBase::setAcquireFence(const sp<const DisplayDevice>& hw,
312 HWComposer::HWCLayerInterface& layer) {
313 layer.setAcquireFenceFd(-1);
314 }
315
onLayerDisplayed(const sp<const DisplayDevice> & hw,HWComposer::HWCLayerInterface * layer)316 void LayerBase::onLayerDisplayed(const sp<const DisplayDevice>& hw,
317 HWComposer::HWCLayerInterface* layer) {
318 if (layer) {
319 layer->onDisplayed();
320 }
321 }
322
setFiltering(bool filtering)323 void LayerBase::setFiltering(bool filtering)
324 {
325 mFiltering = filtering;
326 }
327
getFiltering() const328 bool LayerBase::getFiltering() const
329 {
330 return mFiltering;
331 }
332
isVisible() const333 bool LayerBase::isVisible() const {
334 const Layer::State& s(mDrawingState);
335 return !(s.flags & layer_state_t::eLayerHidden) && s.alpha;
336 }
337
draw(const sp<const DisplayDevice> & hw,const Region & clip) const338 void LayerBase::draw(const sp<const DisplayDevice>& hw, const Region& clip) const
339 {
340 onDraw(hw, clip);
341 }
342
draw(const sp<const DisplayDevice> & hw)343 void LayerBase::draw(const sp<const DisplayDevice>& hw)
344 {
345 onDraw( hw, Region(hw->bounds()) );
346 }
347
clearWithOpenGL(const sp<const DisplayDevice> & hw,const Region & clip,GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha) const348 void LayerBase::clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip,
349 GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) const
350 {
351 const uint32_t fbHeight = hw->getHeight();
352 glColor4f(red,green,blue,alpha);
353
354 glDisable(GL_TEXTURE_EXTERNAL_OES);
355 glDisable(GL_TEXTURE_2D);
356 glDisable(GL_BLEND);
357
358 LayerMesh mesh;
359 computeGeometry(hw, &mesh);
360
361 glVertexPointer(2, GL_FLOAT, 0, mesh.getVertices());
362 glDrawArrays(GL_TRIANGLE_FAN, 0, mesh.getVertexCount());
363 }
364
clearWithOpenGL(const sp<const DisplayDevice> & hw,const Region & clip) const365 void LayerBase::clearWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const
366 {
367 clearWithOpenGL(hw, clip, 0,0,0,0);
368 }
369
drawWithOpenGL(const sp<const DisplayDevice> & hw,const Region & clip) const370 void LayerBase::drawWithOpenGL(const sp<const DisplayDevice>& hw, const Region& clip) const
371 {
372 const uint32_t fbHeight = hw->getHeight();
373 const State& s(drawingState());
374
375 GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
376 if (CC_UNLIKELY(s.alpha < 0xFF)) {
377 const GLfloat alpha = s.alpha * (1.0f/255.0f);
378 if (mPremultipliedAlpha) {
379 glColor4f(alpha, alpha, alpha, alpha);
380 } else {
381 glColor4f(1, 1, 1, alpha);
382 }
383 glEnable(GL_BLEND);
384 glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
385 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
386 } else {
387 glColor4f(1, 1, 1, 1);
388 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
389 if (!isOpaque()) {
390 glEnable(GL_BLEND);
391 glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
392 } else {
393 glDisable(GL_BLEND);
394 }
395 }
396
397 LayerMesh mesh;
398 computeGeometry(hw, &mesh);
399
400 // TODO: we probably want to generate the texture coords with the mesh
401 // here we assume that we only have 4 vertices
402
403 struct TexCoords {
404 GLfloat u;
405 GLfloat v;
406 };
407
408 Rect win(s.active.w, s.active.h);
409 if (!s.active.crop.isEmpty()) {
410 win.intersect(s.active.crop, &win);
411 }
412
413 GLfloat left = GLfloat(win.left) / GLfloat(s.active.w);
414 GLfloat top = GLfloat(win.top) / GLfloat(s.active.h);
415 GLfloat right = GLfloat(win.right) / GLfloat(s.active.w);
416 GLfloat bottom = GLfloat(win.bottom) / GLfloat(s.active.h);
417
418 TexCoords texCoords[4];
419 texCoords[0].u = left;
420 texCoords[0].v = top;
421 texCoords[1].u = left;
422 texCoords[1].v = bottom;
423 texCoords[2].u = right;
424 texCoords[2].v = bottom;
425 texCoords[3].u = right;
426 texCoords[3].v = top;
427 for (int i = 0; i < 4; i++) {
428 texCoords[i].v = 1.0f - texCoords[i].v;
429 }
430
431 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
432 glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
433 glVertexPointer(2, GL_FLOAT, 0, mesh.getVertices());
434 glDrawArrays(GL_TRIANGLE_FAN, 0, mesh.getVertexCount());
435
436 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
437 glDisable(GL_BLEND);
438 }
439
dump(String8 & result,char * buffer,size_t SIZE) const440 void LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
441 {
442 const Layer::State& s(drawingState());
443
444 snprintf(buffer, SIZE,
445 "+ %s %p (%s)\n",
446 getTypeId(), this, getName().string());
447 result.append(buffer);
448
449 s.transparentRegion.dump(result, "transparentRegion");
450 visibleRegion.dump(result, "visibleRegion");
451
452 snprintf(buffer, SIZE,
453 " "
454 "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), "
455 "isOpaque=%1d, needsDithering=%1d, invalidate=%1d, "
456 "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
457 s.layerStack, s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h,
458 s.active.crop.left, s.active.crop.top,
459 s.active.crop.right, s.active.crop.bottom,
460 isOpaque(), needsDithering(), contentDirty,
461 s.alpha, s.flags,
462 s.transform[0][0], s.transform[0][1],
463 s.transform[1][0], s.transform[1][1]);
464 result.append(buffer);
465 }
466
shortDump(String8 & result,char * scratch,size_t size) const467 void LayerBase::shortDump(String8& result, char* scratch, size_t size) const {
468 LayerBase::dump(result, scratch, size);
469 }
470
dumpStats(String8 & result,char * scratch,size_t SIZE) const471 void LayerBase::dumpStats(String8& result, char* scratch, size_t SIZE) const {
472 }
473
clearStats()474 void LayerBase::clearStats() {
475 }
476
getLayerBaseClient() const477 sp<LayerBaseClient> LayerBase::getLayerBaseClient() const {
478 return 0;
479 }
480
getLayer() const481 sp<Layer> LayerBase::getLayer() const {
482 return 0;
483 }
484
485 // ---------------------------------------------------------------------------
486
487 int32_t LayerBaseClient::sIdentity = 1;
488
LayerBaseClient(SurfaceFlinger * flinger,const sp<Client> & client)489 LayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger,
490 const sp<Client>& client)
491 : LayerBase(flinger),
492 mHasSurface(false),
493 mClientRef(client),
494 mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
495 {
496 }
497
~LayerBaseClient()498 LayerBaseClient::~LayerBaseClient()
499 {
500 sp<Client> c(mClientRef.promote());
501 if (c != 0) {
502 c->detachLayer(this);
503 }
504 }
505
createSurface()506 sp<ISurface> LayerBaseClient::createSurface()
507 {
508 class BSurface : public BnSurface, public LayerCleaner {
509 virtual sp<ISurfaceTexture> getSurfaceTexture() const { return 0; }
510 public:
511 BSurface(const sp<SurfaceFlinger>& flinger,
512 const sp<LayerBaseClient>& layer)
513 : LayerCleaner(flinger, layer) { }
514 };
515 sp<ISurface> sur(new BSurface(mFlinger, this));
516 return sur;
517 }
518
getSurface()519 sp<ISurface> LayerBaseClient::getSurface()
520 {
521 sp<ISurface> s;
522 Mutex::Autolock _l(mLock);
523
524 LOG_ALWAYS_FATAL_IF(mHasSurface,
525 "LayerBaseClient::getSurface() has already been called");
526
527 mHasSurface = true;
528 s = createSurface();
529 mClientSurfaceBinder = s->asBinder();
530 return s;
531 }
532
getSurfaceBinder() const533 wp<IBinder> LayerBaseClient::getSurfaceBinder() const {
534 return mClientSurfaceBinder;
535 }
536
getSurfaceTextureBinder() const537 wp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const {
538 return 0;
539 }
540
dump(String8 & result,char * buffer,size_t SIZE) const541 void LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
542 {
543 LayerBase::dump(result, buffer, SIZE);
544
545 sp<Client> client(mClientRef.promote());
546 snprintf(buffer, SIZE,
547 " client=%p, identity=%u\n",
548 client.get(), getIdentity());
549
550 result.append(buffer);
551 }
552
553
shortDump(String8 & result,char * scratch,size_t size) const554 void LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const
555 {
556 LayerBaseClient::dump(result, scratch, size);
557 }
558
559 // ---------------------------------------------------------------------------
560
LayerCleaner(const sp<SurfaceFlinger> & flinger,const sp<LayerBaseClient> & layer)561 LayerBaseClient::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
562 const sp<LayerBaseClient>& layer)
563 : mFlinger(flinger), mLayer(layer) {
564 }
565
~LayerCleaner()566 LayerBaseClient::LayerCleaner::~LayerCleaner() {
567 // destroy client resources
568 mFlinger->onLayerDestroyed(mLayer);
569 }
570
571 // ---------------------------------------------------------------------------
572
573 }; // namespace android
574