• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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