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 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
18
19 #include <stdlib.h>
20 #include <stdint.h>
21 #include <sys/types.h>
22 #include <math.h>
23
24 #include <cutils/compiler.h>
25 #include <cutils/native_handle.h>
26 #include <cutils/properties.h>
27
28 #include <utils/Errors.h>
29 #include <utils/Log.h>
30 #include <utils/NativeHandle.h>
31 #include <utils/StopWatch.h>
32 #include <utils/Trace.h>
33
34 #include <ui/GraphicBuffer.h>
35 #include <ui/PixelFormat.h>
36
37 #include <gui/BufferItem.h>
38 #include <gui/Surface.h>
39
40 #include "clz.h"
41 #include "Colorizer.h"
42 #include "DisplayDevice.h"
43 #include "Layer.h"
44 #include "MonitoredProducer.h"
45 #include "SurfaceFlinger.h"
46
47 #include "DisplayHardware/HWComposer.h"
48
49 #include "RenderEngine/RenderEngine.h"
50
51 #define DEBUG_RESIZE 0
52
53 namespace android {
54
55 // ---------------------------------------------------------------------------
56
57 int32_t Layer::sSequence = 1;
58
Layer(SurfaceFlinger * flinger,const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags)59 Layer::Layer(SurfaceFlinger* flinger, const sp<Client>& client,
60 const String8& name, uint32_t w, uint32_t h, uint32_t flags)
61 : contentDirty(false),
62 sequence(uint32_t(android_atomic_inc(&sSequence))),
63 mFlinger(flinger),
64 mTextureName(-1U),
65 mPremultipliedAlpha(true),
66 mName("unnamed"),
67 mFormat(PIXEL_FORMAT_NONE),
68 mTransactionFlags(0),
69 mQueuedFrames(0),
70 mSidebandStreamChanged(false),
71 mCurrentTransform(0),
72 mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
73 mCurrentOpacity(true),
74 mRefreshPending(false),
75 mFrameLatencyNeeded(false),
76 mFiltering(false),
77 mNeedsFiltering(false),
78 mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2),
79 mProtectedByApp(false),
80 mHasSurface(false),
81 mClientRef(client),
82 mPotentialCursor(false),
83 mQueueItemLock(),
84 mQueueItemCondition(),
85 mQueueItems(),
86 mLastFrameNumberReceived(0),
87 mUpdateTexImageFailed(false)
88 {
89 mCurrentCrop.makeInvalid();
90 mFlinger->getRenderEngine().genTextures(1, &mTextureName);
91 mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName);
92
93 uint32_t layerFlags = 0;
94 if (flags & ISurfaceComposerClient::eHidden)
95 layerFlags |= layer_state_t::eLayerHidden;
96 if (flags & ISurfaceComposerClient::eOpaque)
97 layerFlags |= layer_state_t::eLayerOpaque;
98 if (flags & ISurfaceComposerClient::eSecure)
99 layerFlags |= layer_state_t::eLayerSecure;
100
101 if (flags & ISurfaceComposerClient::eNonPremultiplied)
102 mPremultipliedAlpha = false;
103
104 mName = name;
105
106 mCurrentState.active.w = w;
107 mCurrentState.active.h = h;
108 mCurrentState.active.crop.makeInvalid();
109 mCurrentState.z = 0;
110 mCurrentState.alpha = 0xFF;
111 mCurrentState.layerStack = 0;
112 mCurrentState.flags = layerFlags;
113 mCurrentState.sequence = 0;
114 mCurrentState.transform.set(0, 0);
115 mCurrentState.requested = mCurrentState.active;
116
117 // drawing state & current state are identical
118 mDrawingState = mCurrentState;
119
120 nsecs_t displayPeriod =
121 flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
122 mFrameTracker.setDisplayRefreshPeriod(displayPeriod);
123 }
124
onFirstRef()125 void Layer::onFirstRef() {
126 // Creates a custom BufferQueue for SurfaceFlingerConsumer to use
127 sp<IGraphicBufferProducer> producer;
128 sp<IGraphicBufferConsumer> consumer;
129 BufferQueue::createBufferQueue(&producer, &consumer);
130 mProducer = new MonitoredProducer(producer, mFlinger);
131 mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName);
132 mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
133 mSurfaceFlingerConsumer->setContentsChangedListener(this);
134 mSurfaceFlingerConsumer->setName(mName);
135
136 #ifdef TARGET_DISABLE_TRIPLE_BUFFERING
137 #warning "disabling triple buffering"
138 mSurfaceFlingerConsumer->setDefaultMaxBufferCount(2);
139 #else
140 mSurfaceFlingerConsumer->setDefaultMaxBufferCount(3);
141 #endif
142
143 const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice());
144 updateTransformHint(hw);
145 }
146
~Layer()147 Layer::~Layer() {
148 sp<Client> c(mClientRef.promote());
149 if (c != 0) {
150 c->detachLayer(this);
151 }
152 mFlinger->deleteTextureAsync(mTextureName);
153 mFrameTracker.logAndResetStats(mName);
154 }
155
156 // ---------------------------------------------------------------------------
157 // callbacks
158 // ---------------------------------------------------------------------------
159
onLayerDisplayed(const sp<const DisplayDevice> &,HWComposer::HWCLayerInterface * layer)160 void Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */,
161 HWComposer::HWCLayerInterface* layer) {
162 if (layer) {
163 layer->onDisplayed();
164 mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence());
165 }
166 }
167
onFrameAvailable(const BufferItem & item)168 void Layer::onFrameAvailable(const BufferItem& item) {
169 // Add this buffer from our internal queue tracker
170 { // Autolock scope
171 Mutex::Autolock lock(mQueueItemLock);
172
173 // Reset the frame number tracker when we receive the first buffer after
174 // a frame number reset
175 if (item.mFrameNumber == 1) {
176 mLastFrameNumberReceived = 0;
177 }
178
179 // Ensure that callbacks are handled in order
180 while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
181 status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
182 ms2ns(500));
183 if (result != NO_ERROR) {
184 ALOGE("[%s] Timed out waiting on callback", mName.string());
185 }
186 }
187
188 mQueueItems.push_back(item);
189 android_atomic_inc(&mQueuedFrames);
190
191 // Wake up any pending callbacks
192 mLastFrameNumberReceived = item.mFrameNumber;
193 mQueueItemCondition.broadcast();
194 }
195
196 mFlinger->signalLayerUpdate();
197 }
198
onFrameReplaced(const BufferItem & item)199 void Layer::onFrameReplaced(const BufferItem& item) {
200 Mutex::Autolock lock(mQueueItemLock);
201
202 // Ensure that callbacks are handled in order
203 while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
204 status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
205 ms2ns(500));
206 if (result != NO_ERROR) {
207 ALOGE("[%s] Timed out waiting on callback", mName.string());
208 }
209 }
210
211 if (mQueueItems.empty()) {
212 ALOGE("Can't replace a frame on an empty queue");
213 return;
214 }
215 mQueueItems.editItemAt(0) = item;
216
217 // Wake up any pending callbacks
218 mLastFrameNumberReceived = item.mFrameNumber;
219 mQueueItemCondition.broadcast();
220 }
221
onSidebandStreamChanged()222 void Layer::onSidebandStreamChanged() {
223 if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) {
224 // mSidebandStreamChanged was false
225 mFlinger->signalLayerUpdate();
226 }
227 }
228
229 // called with SurfaceFlinger::mStateLock from the drawing thread after
230 // the layer has been remove from the current state list (and just before
231 // it's removed from the drawing state list)
onRemoved()232 void Layer::onRemoved() {
233 mSurfaceFlingerConsumer->abandon();
234 }
235
236 // ---------------------------------------------------------------------------
237 // set-up
238 // ---------------------------------------------------------------------------
239
getName() const240 const String8& Layer::getName() const {
241 return mName;
242 }
243
setBuffers(uint32_t w,uint32_t h,PixelFormat format,uint32_t flags)244 status_t Layer::setBuffers( uint32_t w, uint32_t h,
245 PixelFormat format, uint32_t flags)
246 {
247 uint32_t const maxSurfaceDims = min(
248 mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
249
250 // never allow a surface larger than what our underlying GL implementation
251 // can handle.
252 if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
253 ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
254 return BAD_VALUE;
255 }
256
257 mFormat = format;
258
259 mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false;
260 mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false;
261 mCurrentOpacity = getOpacityForFormat(format);
262
263 mSurfaceFlingerConsumer->setDefaultBufferSize(w, h);
264 mSurfaceFlingerConsumer->setDefaultBufferFormat(format);
265 mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0));
266
267 return NO_ERROR;
268 }
269
getHandle()270 sp<IBinder> Layer::getHandle() {
271 Mutex::Autolock _l(mLock);
272
273 LOG_ALWAYS_FATAL_IF(mHasSurface,
274 "Layer::getHandle() has already been called");
275
276 mHasSurface = true;
277
278 /*
279 * The layer handle is just a BBinder object passed to the client
280 * (remote process) -- we don't keep any reference on our side such that
281 * the dtor is called when the remote side let go of its reference.
282 *
283 * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for
284 * this layer when the handle is destroyed.
285 */
286
287 class Handle : public BBinder, public LayerCleaner {
288 wp<const Layer> mOwner;
289 public:
290 Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer)
291 : LayerCleaner(flinger, layer), mOwner(layer) {
292 }
293 };
294
295 return new Handle(mFlinger, this);
296 }
297
getProducer() const298 sp<IGraphicBufferProducer> Layer::getProducer() const {
299 return mProducer;
300 }
301
302 // ---------------------------------------------------------------------------
303 // h/w composer set-up
304 // ---------------------------------------------------------------------------
305
getContentCrop() const306 Rect Layer::getContentCrop() const {
307 // this is the crop rectangle that applies to the buffer
308 // itself (as opposed to the window)
309 Rect crop;
310 if (!mCurrentCrop.isEmpty()) {
311 // if the buffer crop is defined, we use that
312 crop = mCurrentCrop;
313 } else if (mActiveBuffer != NULL) {
314 // otherwise we use the whole buffer
315 crop = mActiveBuffer->getBounds();
316 } else {
317 // if we don't have a buffer yet, we use an empty/invalid crop
318 crop.makeInvalid();
319 }
320 return crop;
321 }
322
reduce(const Rect & win,const Region & exclude)323 static Rect reduce(const Rect& win, const Region& exclude) {
324 if (CC_LIKELY(exclude.isEmpty())) {
325 return win;
326 }
327 if (exclude.isRect()) {
328 return win.reduce(exclude.getBounds());
329 }
330 return Region(win).subtract(exclude).getBounds();
331 }
332
computeBounds() const333 Rect Layer::computeBounds() const {
334 const Layer::State& s(getDrawingState());
335 return computeBounds(s.activeTransparentRegion);
336 }
337
computeBounds(const Region & activeTransparentRegion) const338 Rect Layer::computeBounds(const Region& activeTransparentRegion) const {
339 const Layer::State& s(getDrawingState());
340 Rect win(s.active.w, s.active.h);
341 if (!s.active.crop.isEmpty()) {
342 win.intersect(s.active.crop, &win);
343 }
344 // subtract the transparent region and snap to the bounds
345 return reduce(win, activeTransparentRegion);
346 }
347
computeCrop(const sp<const DisplayDevice> & hw) const348 FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
349 // the content crop is the area of the content that gets scaled to the
350 // layer's size.
351 FloatRect crop(getContentCrop());
352
353 // the active.crop is the area of the window that gets cropped, but not
354 // scaled in any ways.
355 const State& s(getDrawingState());
356
357 // apply the projection's clipping to the window crop in
358 // layerstack space, and convert-back to layer space.
359 // if there are no window scaling involved, this operation will map to full
360 // pixels in the buffer.
361 // FIXME: the 3 lines below can produce slightly incorrect clipping when we have
362 // a viewport clipping and a window transform. we should use floating point to fix this.
363
364 Rect activeCrop(s.active.w, s.active.h);
365 if (!s.active.crop.isEmpty()) {
366 activeCrop = s.active.crop;
367 }
368
369 activeCrop = s.transform.transform(activeCrop);
370 activeCrop.intersect(hw->getViewport(), &activeCrop);
371 activeCrop = s.transform.inverse().transform(activeCrop);
372
373 // This needs to be here as transform.transform(Rect) computes the
374 // transformed rect and then takes the bounding box of the result before
375 // returning. This means
376 // transform.inverse().transform(transform.transform(Rect)) != Rect
377 // in which case we need to make sure the final rect is clipped to the
378 // display bounds.
379 activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop);
380
381 // subtract the transparent region and snap to the bounds
382 activeCrop = reduce(activeCrop, s.activeTransparentRegion);
383
384 if (!activeCrop.isEmpty()) {
385 // Transform the window crop to match the buffer coordinate system,
386 // which means using the inverse of the current transform set on the
387 // SurfaceFlingerConsumer.
388 uint32_t invTransform = mCurrentTransform;
389 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
390 /*
391 * the code below applies the display's inverse transform to the buffer
392 */
393 uint32_t invTransformOrient = hw->getOrientationTransform();
394 // calculate the inverse transform
395 if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) {
396 invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
397 NATIVE_WINDOW_TRANSFORM_FLIP_H;
398 // If the transform has been rotated the axis of flip has been swapped
399 // so we need to swap which flip operations we are performing
400 bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
401 bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
402 if (is_h_flipped != is_v_flipped) {
403 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
404 NATIVE_WINDOW_TRANSFORM_FLIP_H;
405 }
406 }
407 // and apply to the current transform
408 invTransform = (Transform(invTransform) * Transform(invTransformOrient)).getOrientation();
409 }
410
411 int winWidth = s.active.w;
412 int winHeight = s.active.h;
413 if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
414 // If the activeCrop has been rotate the ends are rotated but not
415 // the space itself so when transforming ends back we can't rely on
416 // a modification of the axes of rotation. To account for this we
417 // need to reorient the inverse rotation in terms of the current
418 // axes of rotation.
419 bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
420 bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
421 if (is_h_flipped == is_v_flipped) {
422 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
423 NATIVE_WINDOW_TRANSFORM_FLIP_H;
424 }
425 winWidth = s.active.h;
426 winHeight = s.active.w;
427 }
428 const Rect winCrop = activeCrop.transform(
429 invTransform, s.active.w, s.active.h);
430
431 // below, crop is intersected with winCrop expressed in crop's coordinate space
432 float xScale = crop.getWidth() / float(winWidth);
433 float yScale = crop.getHeight() / float(winHeight);
434
435 float insetL = winCrop.left * xScale;
436 float insetT = winCrop.top * yScale;
437 float insetR = (winWidth - winCrop.right ) * xScale;
438 float insetB = (winHeight - winCrop.bottom) * yScale;
439
440 crop.left += insetL;
441 crop.top += insetT;
442 crop.right -= insetR;
443 crop.bottom -= insetB;
444 }
445 return crop;
446 }
447
setGeometry(const sp<const DisplayDevice> & hw,HWComposer::HWCLayerInterface & layer)448 void Layer::setGeometry(
449 const sp<const DisplayDevice>& hw,
450 HWComposer::HWCLayerInterface& layer)
451 {
452 layer.setDefaultState();
453
454 // enable this layer
455 layer.setSkip(false);
456
457 if (isSecure() && !hw->isSecure()) {
458 layer.setSkip(true);
459 }
460
461 // this gives us only the "orientation" component of the transform
462 const State& s(getDrawingState());
463 if (!isOpaque(s) || s.alpha != 0xFF) {
464 layer.setBlending(mPremultipliedAlpha ?
465 HWC_BLENDING_PREMULT :
466 HWC_BLENDING_COVERAGE);
467 }
468
469 // apply the layer's transform, followed by the display's global transform
470 // here we're guaranteed that the layer's transform preserves rects
471 Region activeTransparentRegion(s.activeTransparentRegion);
472 if (!s.active.crop.isEmpty()) {
473 Rect activeCrop(s.active.crop);
474 activeCrop = s.transform.transform(activeCrop);
475 activeCrop.intersect(hw->getViewport(), &activeCrop);
476 activeCrop = s.transform.inverse().transform(activeCrop);
477 // This needs to be here as transform.transform(Rect) computes the
478 // transformed rect and then takes the bounding box of the result before
479 // returning. This means
480 // transform.inverse().transform(transform.transform(Rect)) != Rect
481 // in which case we need to make sure the final rect is clipped to the
482 // display bounds.
483 activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop);
484 // mark regions outside the crop as transparent
485 activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top));
486 activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom,
487 s.active.w, s.active.h));
488 activeTransparentRegion.orSelf(Rect(0, activeCrop.top,
489 activeCrop.left, activeCrop.bottom));
490 activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top,
491 s.active.w, activeCrop.bottom));
492 }
493 Rect frame(s.transform.transform(computeBounds(activeTransparentRegion)));
494 frame.intersect(hw->getViewport(), &frame);
495 const Transform& tr(hw->getTransform());
496 layer.setFrame(tr.transform(frame));
497 layer.setCrop(computeCrop(hw));
498 layer.setPlaneAlpha(s.alpha);
499
500 /*
501 * Transformations are applied in this order:
502 * 1) buffer orientation/flip/mirror
503 * 2) state transformation (window manager)
504 * 3) layer orientation (screen orientation)
505 * (NOTE: the matrices are multiplied in reverse order)
506 */
507
508 const Transform bufferOrientation(mCurrentTransform);
509 Transform transform(tr * s.transform * bufferOrientation);
510
511 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
512 /*
513 * the code below applies the display's inverse transform to the buffer
514 */
515 uint32_t invTransform = hw->getOrientationTransform();
516 uint32_t t_orientation = transform.getOrientation();
517 // calculate the inverse transform
518 if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
519 invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
520 NATIVE_WINDOW_TRANSFORM_FLIP_H;
521 // If the transform has been rotated the axis of flip has been swapped
522 // so we need to swap which flip operations we are performing
523 bool is_h_flipped = (t_orientation & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
524 bool is_v_flipped = (t_orientation & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
525 if (is_h_flipped != is_v_flipped) {
526 t_orientation ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
527 NATIVE_WINDOW_TRANSFORM_FLIP_H;
528 }
529 }
530 // and apply to the current transform
531 transform = Transform(t_orientation) * Transform(invTransform);
532 }
533
534 // this gives us only the "orientation" component of the transform
535 const uint32_t orientation = transform.getOrientation();
536 if (orientation & Transform::ROT_INVALID) {
537 // we can only handle simple transformation
538 layer.setSkip(true);
539 } else {
540 layer.setTransform(orientation);
541 }
542 }
543
setPerFrameData(const sp<const DisplayDevice> & hw,HWComposer::HWCLayerInterface & layer)544 void Layer::setPerFrameData(const sp<const DisplayDevice>& hw,
545 HWComposer::HWCLayerInterface& layer) {
546 // we have to set the visible region on every frame because
547 // we currently free it during onLayerDisplayed(), which is called
548 // after HWComposer::commit() -- every frame.
549 // Apply this display's projection's viewport to the visible region
550 // before giving it to the HWC HAL.
551 const Transform& tr = hw->getTransform();
552 Region visible = tr.transform(visibleRegion.intersect(hw->getViewport()));
553 layer.setVisibleRegionScreen(visible);
554 layer.setSurfaceDamage(surfaceDamageRegion);
555
556 if (mSidebandStream.get()) {
557 layer.setSidebandStream(mSidebandStream);
558 } else {
559 // NOTE: buffer can be NULL if the client never drew into this
560 // layer yet, or if we ran out of memory
561 layer.setBuffer(mActiveBuffer);
562 }
563 }
564
setAcquireFence(const sp<const DisplayDevice> &,HWComposer::HWCLayerInterface & layer)565 void Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */,
566 HWComposer::HWCLayerInterface& layer) {
567 int fenceFd = -1;
568
569 // TODO: there is a possible optimization here: we only need to set the
570 // acquire fence the first time a new buffer is acquired on EACH display.
571
572 if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) {
573 sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence();
574 if (fence->isValid()) {
575 fenceFd = fence->dup();
576 if (fenceFd == -1) {
577 ALOGW("failed to dup layer fence, skipping sync: %d", errno);
578 }
579 }
580 }
581 layer.setAcquireFenceFd(fenceFd);
582 }
583
getPosition(const sp<const DisplayDevice> & hw)584 Rect Layer::getPosition(
585 const sp<const DisplayDevice>& hw)
586 {
587 // this gives us only the "orientation" component of the transform
588 const State& s(getCurrentState());
589
590 // apply the layer's transform, followed by the display's global transform
591 // here we're guaranteed that the layer's transform preserves rects
592 Rect win(s.active.w, s.active.h);
593 if (!s.active.crop.isEmpty()) {
594 win.intersect(s.active.crop, &win);
595 }
596 // subtract the transparent region and snap to the bounds
597 Rect bounds = reduce(win, s.activeTransparentRegion);
598 Rect frame(s.transform.transform(bounds));
599 frame.intersect(hw->getViewport(), &frame);
600 const Transform& tr(hw->getTransform());
601 return Rect(tr.transform(frame));
602 }
603
604 // ---------------------------------------------------------------------------
605 // drawing...
606 // ---------------------------------------------------------------------------
607
draw(const sp<const DisplayDevice> & hw,const Region & clip) const608 void Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const {
609 onDraw(hw, clip, false);
610 }
611
draw(const sp<const DisplayDevice> & hw,bool useIdentityTransform) const612 void Layer::draw(const sp<const DisplayDevice>& hw,
613 bool useIdentityTransform) const {
614 onDraw(hw, Region(hw->bounds()), useIdentityTransform);
615 }
616
draw(const sp<const DisplayDevice> & hw) const617 void Layer::draw(const sp<const DisplayDevice>& hw) const {
618 onDraw(hw, Region(hw->bounds()), false);
619 }
620
onDraw(const sp<const DisplayDevice> & hw,const Region & clip,bool useIdentityTransform) const621 void Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip,
622 bool useIdentityTransform) const
623 {
624 ATRACE_CALL();
625
626 if (CC_UNLIKELY(mActiveBuffer == 0)) {
627 // the texture has not been created yet, this Layer has
628 // in fact never been drawn into. This happens frequently with
629 // SurfaceView because the WindowManager can't know when the client
630 // has drawn the first time.
631
632 // If there is nothing under us, we paint the screen in black, otherwise
633 // we just skip this update.
634
635 // figure out if there is something below us
636 Region under;
637 const SurfaceFlinger::LayerVector& drawingLayers(
638 mFlinger->mDrawingState.layersSortedByZ);
639 const size_t count = drawingLayers.size();
640 for (size_t i=0 ; i<count ; ++i) {
641 const sp<Layer>& layer(drawingLayers[i]);
642 if (layer.get() == static_cast<Layer const*>(this))
643 break;
644 under.orSelf( hw->getTransform().transform(layer->visibleRegion) );
645 }
646 // if not everything below us is covered, we plug the holes!
647 Region holes(clip.subtract(under));
648 if (!holes.isEmpty()) {
649 clearWithOpenGL(hw, holes, 0, 0, 0, 1);
650 }
651 return;
652 }
653
654 // Bind the current buffer to the GL texture, and wait for it to be
655 // ready for us to draw into.
656 status_t err = mSurfaceFlingerConsumer->bindTextureImage();
657 if (err != NO_ERROR) {
658 ALOGW("onDraw: bindTextureImage failed (err=%d)", err);
659 // Go ahead and draw the buffer anyway; no matter what we do the screen
660 // is probably going to have something visibly wrong.
661 }
662
663 bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure());
664
665 RenderEngine& engine(mFlinger->getRenderEngine());
666
667 if (!blackOutLayer) {
668 // TODO: we could be more subtle with isFixedSize()
669 const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize();
670
671 // Query the texture matrix given our current filtering mode.
672 float textureMatrix[16];
673 mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering);
674 mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix);
675
676 if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) {
677
678 /*
679 * the code below applies the display's inverse transform to the texture transform
680 */
681
682 // create a 4x4 transform matrix from the display transform flags
683 const mat4 flipH(-1,0,0,0, 0,1,0,0, 0,0,1,0, 1,0,0,1);
684 const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1);
685 const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1);
686
687 mat4 tr;
688 uint32_t transform = hw->getOrientationTransform();
689 if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90)
690 tr = tr * rot90;
691 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H)
692 tr = tr * flipH;
693 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V)
694 tr = tr * flipV;
695
696 // calculate the inverse
697 tr = inverse(tr);
698
699 // and finally apply it to the original texture matrix
700 const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
701 memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
702 }
703
704 // Set things up for texturing.
705 mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
706 mTexture.setFiltering(useFiltering);
707 mTexture.setMatrix(textureMatrix);
708
709 engine.setupLayerTexturing(mTexture);
710 } else {
711 engine.setupLayerBlackedOut();
712 }
713 drawWithOpenGL(hw, clip, useIdentityTransform);
714 engine.disableTexturing();
715 }
716
717
clearWithOpenGL(const sp<const DisplayDevice> & hw,const Region &,float red,float green,float blue,float alpha) const718 void Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw,
719 const Region& /* clip */, float red, float green, float blue,
720 float alpha) const
721 {
722 RenderEngine& engine(mFlinger->getRenderEngine());
723 computeGeometry(hw, mMesh, false);
724 engine.setupFillWithColor(red, green, blue, alpha);
725 engine.drawMesh(mMesh);
726 }
727
clearWithOpenGL(const sp<const DisplayDevice> & hw,const Region & clip) const728 void Layer::clearWithOpenGL(
729 const sp<const DisplayDevice>& hw, const Region& clip) const {
730 clearWithOpenGL(hw, clip, 0,0,0,0);
731 }
732
drawWithOpenGL(const sp<const DisplayDevice> & hw,const Region &,bool useIdentityTransform) const733 void Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw,
734 const Region& /* clip */, bool useIdentityTransform) const {
735 const State& s(getDrawingState());
736
737 computeGeometry(hw, mMesh, useIdentityTransform);
738
739 /*
740 * NOTE: the way we compute the texture coordinates here produces
741 * different results than when we take the HWC path -- in the later case
742 * the "source crop" is rounded to texel boundaries.
743 * This can produce significantly different results when the texture
744 * is scaled by a large amount.
745 *
746 * The GL code below is more logical (imho), and the difference with
747 * HWC is due to a limitation of the HWC API to integers -- a question
748 * is suspend is whether we should ignore this problem or revert to
749 * GL composition when a buffer scaling is applied (maybe with some
750 * minimal value)? Or, we could make GL behave like HWC -- but this feel
751 * like more of a hack.
752 */
753 const Rect win(computeBounds());
754
755 float left = float(win.left) / float(s.active.w);
756 float top = float(win.top) / float(s.active.h);
757 float right = float(win.right) / float(s.active.w);
758 float bottom = float(win.bottom) / float(s.active.h);
759
760 // TODO: we probably want to generate the texture coords with the mesh
761 // here we assume that we only have 4 vertices
762 Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>());
763 texCoords[0] = vec2(left, 1.0f - top);
764 texCoords[1] = vec2(left, 1.0f - bottom);
765 texCoords[2] = vec2(right, 1.0f - bottom);
766 texCoords[3] = vec2(right, 1.0f - top);
767
768 RenderEngine& engine(mFlinger->getRenderEngine());
769 engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha);
770 engine.drawMesh(mMesh);
771 engine.disableBlending();
772 }
773
getProducerStickyTransform() const774 uint32_t Layer::getProducerStickyTransform() const {
775 int producerStickyTransform = 0;
776 int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform);
777 if (ret != OK) {
778 ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__,
779 strerror(-ret), ret);
780 return 0;
781 }
782 return static_cast<uint32_t>(producerStickyTransform);
783 }
784
setFiltering(bool filtering)785 void Layer::setFiltering(bool filtering) {
786 mFiltering = filtering;
787 }
788
getFiltering() const789 bool Layer::getFiltering() const {
790 return mFiltering;
791 }
792
793 // As documented in libhardware header, formats in the range
794 // 0x100 - 0x1FF are specific to the HAL implementation, and
795 // are known to have no alpha channel
796 // TODO: move definition for device-specific range into
797 // hardware.h, instead of using hard-coded values here.
798 #define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
799
getOpacityForFormat(uint32_t format)800 bool Layer::getOpacityForFormat(uint32_t format) {
801 if (HARDWARE_IS_DEVICE_FORMAT(format)) {
802 return true;
803 }
804 switch (format) {
805 case HAL_PIXEL_FORMAT_RGBA_8888:
806 case HAL_PIXEL_FORMAT_BGRA_8888:
807 return false;
808 }
809 // in all other case, we have no blending (also for unknown formats)
810 return true;
811 }
812
813 // ----------------------------------------------------------------------------
814 // local state
815 // ----------------------------------------------------------------------------
816
computeGeometry(const sp<const DisplayDevice> & hw,Mesh & mesh,bool useIdentityTransform) const817 void Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh,
818 bool useIdentityTransform) const
819 {
820 const Layer::State& s(getDrawingState());
821 const Transform tr(useIdentityTransform ?
822 hw->getTransform() : hw->getTransform() * s.transform);
823 const uint32_t hw_h = hw->getHeight();
824 Rect win(s.active.w, s.active.h);
825 if (!s.active.crop.isEmpty()) {
826 win.intersect(s.active.crop, &win);
827 }
828 // subtract the transparent region and snap to the bounds
829 win = reduce(win, s.activeTransparentRegion);
830
831 Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>());
832 position[0] = tr.transform(win.left, win.top);
833 position[1] = tr.transform(win.left, win.bottom);
834 position[2] = tr.transform(win.right, win.bottom);
835 position[3] = tr.transform(win.right, win.top);
836 for (size_t i=0 ; i<4 ; i++) {
837 position[i].y = hw_h - position[i].y;
838 }
839 }
840
isOpaque(const Layer::State & s) const841 bool Layer::isOpaque(const Layer::State& s) const
842 {
843 // if we don't have a buffer yet, we're translucent regardless of the
844 // layer's opaque flag.
845 if (mActiveBuffer == 0) {
846 return false;
847 }
848
849 // if the layer has the opaque flag, then we're always opaque,
850 // otherwise we use the current buffer's format.
851 return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity;
852 }
853
isSecure() const854 bool Layer::isSecure() const
855 {
856 const Layer::State& s(mDrawingState);
857 return (s.flags & layer_state_t::eLayerSecure);
858 }
859
isProtected() const860 bool Layer::isProtected() const
861 {
862 const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
863 return (activeBuffer != 0) &&
864 (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
865 }
866
isFixedSize() const867 bool Layer::isFixedSize() const {
868 return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
869 }
870
isCropped() const871 bool Layer::isCropped() const {
872 return !mCurrentCrop.isEmpty();
873 }
874
needsFiltering(const sp<const DisplayDevice> & hw) const875 bool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const {
876 return mNeedsFiltering || hw->needsFiltering();
877 }
878
setVisibleRegion(const Region & visibleRegion)879 void Layer::setVisibleRegion(const Region& visibleRegion) {
880 // always called from main thread
881 this->visibleRegion = visibleRegion;
882 }
883
setCoveredRegion(const Region & coveredRegion)884 void Layer::setCoveredRegion(const Region& coveredRegion) {
885 // always called from main thread
886 this->coveredRegion = coveredRegion;
887 }
888
setVisibleNonTransparentRegion(const Region & setVisibleNonTransparentRegion)889 void Layer::setVisibleNonTransparentRegion(const Region&
890 setVisibleNonTransparentRegion) {
891 // always called from main thread
892 this->visibleNonTransparentRegion = setVisibleNonTransparentRegion;
893 }
894
895 // ----------------------------------------------------------------------------
896 // transaction
897 // ----------------------------------------------------------------------------
898
doTransaction(uint32_t flags)899 uint32_t Layer::doTransaction(uint32_t flags) {
900 ATRACE_CALL();
901
902 const Layer::State& s(getDrawingState());
903 const Layer::State& c(getCurrentState());
904
905 const bool sizeChanged = (c.requested.w != s.requested.w) ||
906 (c.requested.h != s.requested.h);
907
908 if (sizeChanged) {
909 // the size changed, we need to ask our client to request a new buffer
910 ALOGD_IF(DEBUG_RESIZE,
911 "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n"
912 " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
913 " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n"
914 " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
915 " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n",
916 this, getName().string(), mCurrentTransform, mCurrentScalingMode,
917 c.active.w, c.active.h,
918 c.active.crop.left,
919 c.active.crop.top,
920 c.active.crop.right,
921 c.active.crop.bottom,
922 c.active.crop.getWidth(),
923 c.active.crop.getHeight(),
924 c.requested.w, c.requested.h,
925 c.requested.crop.left,
926 c.requested.crop.top,
927 c.requested.crop.right,
928 c.requested.crop.bottom,
929 c.requested.crop.getWidth(),
930 c.requested.crop.getHeight(),
931 s.active.w, s.active.h,
932 s.active.crop.left,
933 s.active.crop.top,
934 s.active.crop.right,
935 s.active.crop.bottom,
936 s.active.crop.getWidth(),
937 s.active.crop.getHeight(),
938 s.requested.w, s.requested.h,
939 s.requested.crop.left,
940 s.requested.crop.top,
941 s.requested.crop.right,
942 s.requested.crop.bottom,
943 s.requested.crop.getWidth(),
944 s.requested.crop.getHeight());
945
946 // record the new size, form this point on, when the client request
947 // a buffer, it'll get the new size.
948 mSurfaceFlingerConsumer->setDefaultBufferSize(
949 c.requested.w, c.requested.h);
950 }
951
952 if (!isFixedSize()) {
953
954 const bool resizePending = (c.requested.w != c.active.w) ||
955 (c.requested.h != c.active.h);
956
957 if (resizePending && mSidebandStream == NULL) {
958 // don't let Layer::doTransaction update the drawing state
959 // if we have a pending resize, unless we are in fixed-size mode.
960 // the drawing state will be updated only once we receive a buffer
961 // with the correct size.
962 //
963 // in particular, we want to make sure the clip (which is part
964 // of the geometry state) is latched together with the size but is
965 // latched immediately when no resizing is involved.
966 //
967 // If a sideband stream is attached, however, we want to skip this
968 // optimization so that transactions aren't missed when a buffer
969 // never arrives
970
971 flags |= eDontUpdateGeometryState;
972 }
973 }
974
975 // always set active to requested, unless we're asked not to
976 // this is used by Layer, which special cases resizes.
977 if (flags & eDontUpdateGeometryState) {
978 } else {
979 Layer::State& editCurrentState(getCurrentState());
980 editCurrentState.active = c.requested;
981 }
982
983 if (s.active != c.active) {
984 // invalidate and recompute the visible regions if needed
985 flags |= Layer::eVisibleRegion;
986 }
987
988 if (c.sequence != s.sequence) {
989 // invalidate and recompute the visible regions if needed
990 flags |= eVisibleRegion;
991 this->contentDirty = true;
992
993 // we may use linear filtering, if the matrix scales us
994 const uint8_t type = c.transform.getType();
995 mNeedsFiltering = (!c.transform.preserveRects() ||
996 (type >= Transform::SCALE));
997 }
998
999 // Commit the transaction
1000 commitTransaction();
1001 return flags;
1002 }
1003
commitTransaction()1004 void Layer::commitTransaction() {
1005 mDrawingState = mCurrentState;
1006 }
1007
getTransactionFlags(uint32_t flags)1008 uint32_t Layer::getTransactionFlags(uint32_t flags) {
1009 return android_atomic_and(~flags, &mTransactionFlags) & flags;
1010 }
1011
setTransactionFlags(uint32_t flags)1012 uint32_t Layer::setTransactionFlags(uint32_t flags) {
1013 return android_atomic_or(flags, &mTransactionFlags);
1014 }
1015
setPosition(float x,float y)1016 bool Layer::setPosition(float x, float y) {
1017 if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
1018 return false;
1019 mCurrentState.sequence++;
1020 mCurrentState.transform.set(x, y);
1021 setTransactionFlags(eTransactionNeeded);
1022 return true;
1023 }
setLayer(uint32_t z)1024 bool Layer::setLayer(uint32_t z) {
1025 if (mCurrentState.z == z)
1026 return false;
1027 mCurrentState.sequence++;
1028 mCurrentState.z = z;
1029 setTransactionFlags(eTransactionNeeded);
1030 return true;
1031 }
setSize(uint32_t w,uint32_t h)1032 bool Layer::setSize(uint32_t w, uint32_t h) {
1033 if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
1034 return false;
1035 mCurrentState.requested.w = w;
1036 mCurrentState.requested.h = h;
1037 setTransactionFlags(eTransactionNeeded);
1038 return true;
1039 }
setAlpha(uint8_t alpha)1040 bool Layer::setAlpha(uint8_t alpha) {
1041 if (mCurrentState.alpha == alpha)
1042 return false;
1043 mCurrentState.sequence++;
1044 mCurrentState.alpha = alpha;
1045 setTransactionFlags(eTransactionNeeded);
1046 return true;
1047 }
setMatrix(const layer_state_t::matrix22_t & matrix)1048 bool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) {
1049 mCurrentState.sequence++;
1050 mCurrentState.transform.set(
1051 matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
1052 setTransactionFlags(eTransactionNeeded);
1053 return true;
1054 }
setTransparentRegionHint(const Region & transparent)1055 bool Layer::setTransparentRegionHint(const Region& transparent) {
1056 mCurrentState.requestedTransparentRegion = transparent;
1057 setTransactionFlags(eTransactionNeeded);
1058 return true;
1059 }
setFlags(uint8_t flags,uint8_t mask)1060 bool Layer::setFlags(uint8_t flags, uint8_t mask) {
1061 const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
1062 if (mCurrentState.flags == newFlags)
1063 return false;
1064 mCurrentState.sequence++;
1065 mCurrentState.flags = newFlags;
1066 setTransactionFlags(eTransactionNeeded);
1067 return true;
1068 }
setCrop(const Rect & crop)1069 bool Layer::setCrop(const Rect& crop) {
1070 if (mCurrentState.requested.crop == crop)
1071 return false;
1072 mCurrentState.sequence++;
1073 mCurrentState.requested.crop = crop;
1074 setTransactionFlags(eTransactionNeeded);
1075 return true;
1076 }
1077
setLayerStack(uint32_t layerStack)1078 bool Layer::setLayerStack(uint32_t layerStack) {
1079 if (mCurrentState.layerStack == layerStack)
1080 return false;
1081 mCurrentState.sequence++;
1082 mCurrentState.layerStack = layerStack;
1083 setTransactionFlags(eTransactionNeeded);
1084 return true;
1085 }
1086
useSurfaceDamage()1087 void Layer::useSurfaceDamage() {
1088 if (mFlinger->mForceFullDamage) {
1089 surfaceDamageRegion = Region::INVALID_REGION;
1090 } else {
1091 surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage();
1092 }
1093 }
1094
useEmptyDamage()1095 void Layer::useEmptyDamage() {
1096 surfaceDamageRegion.clear();
1097 }
1098
1099 // ----------------------------------------------------------------------------
1100 // pageflip handling...
1101 // ----------------------------------------------------------------------------
1102
shouldPresentNow(const DispSync & dispSync) const1103 bool Layer::shouldPresentNow(const DispSync& dispSync) const {
1104 if (mSidebandStreamChanged) {
1105 return true;
1106 }
1107
1108 Mutex::Autolock lock(mQueueItemLock);
1109 if (mQueueItems.empty()) {
1110 return false;
1111 }
1112 auto timestamp = mQueueItems[0].mTimestamp;
1113 nsecs_t expectedPresent =
1114 mSurfaceFlingerConsumer->computeExpectedPresent(dispSync);
1115
1116 // Ignore timestamps more than a second in the future
1117 bool isPlausible = timestamp < (expectedPresent + s2ns(1));
1118 ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible "
1119 "relative to expectedPresent %" PRId64, mName.string(), timestamp,
1120 expectedPresent);
1121
1122 bool isDue = timestamp < expectedPresent;
1123 return isDue || !isPlausible;
1124 }
1125
onPreComposition()1126 bool Layer::onPreComposition() {
1127 mRefreshPending = false;
1128 return mQueuedFrames > 0 || mSidebandStreamChanged;
1129 }
1130
onPostComposition()1131 void Layer::onPostComposition() {
1132 if (mFrameLatencyNeeded) {
1133 nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp();
1134 mFrameTracker.setDesiredPresentTime(desiredPresentTime);
1135
1136 sp<Fence> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFence();
1137 if (frameReadyFence->isValid()) {
1138 mFrameTracker.setFrameReadyFence(frameReadyFence);
1139 } else {
1140 // There was no fence for this frame, so assume that it was ready
1141 // to be presented at the desired present time.
1142 mFrameTracker.setFrameReadyTime(desiredPresentTime);
1143 }
1144
1145 const HWComposer& hwc = mFlinger->getHwComposer();
1146 sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
1147 if (presentFence->isValid()) {
1148 mFrameTracker.setActualPresentFence(presentFence);
1149 } else {
1150 // The HWC doesn't support present fences, so use the refresh
1151 // timestamp instead.
1152 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1153 mFrameTracker.setActualPresentTime(presentTime);
1154 }
1155
1156 mFrameTracker.advanceFrame();
1157 mFrameLatencyNeeded = false;
1158 }
1159 }
1160
isVisible() const1161 bool Layer::isVisible() const {
1162 const Layer::State& s(mDrawingState);
1163 return !(s.flags & layer_state_t::eLayerHidden) && s.alpha
1164 && (mActiveBuffer != NULL || mSidebandStream != NULL);
1165 }
1166
latchBuffer(bool & recomputeVisibleRegions)1167 Region Layer::latchBuffer(bool& recomputeVisibleRegions)
1168 {
1169 ATRACE_CALL();
1170
1171 if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) {
1172 // mSidebandStreamChanged was true
1173 mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream();
1174 if (mSidebandStream != NULL) {
1175 setTransactionFlags(eTransactionNeeded);
1176 mFlinger->setTransactionFlags(eTraversalNeeded);
1177 }
1178 recomputeVisibleRegions = true;
1179
1180 const State& s(getDrawingState());
1181 return s.transform.transform(Region(Rect(s.active.w, s.active.h)));
1182 }
1183
1184 Region outDirtyRegion;
1185 if (mQueuedFrames > 0) {
1186
1187 // if we've already called updateTexImage() without going through
1188 // a composition step, we have to skip this layer at this point
1189 // because we cannot call updateTeximage() without a corresponding
1190 // compositionComplete() call.
1191 // we'll trigger an update in onPreComposition().
1192 if (mRefreshPending) {
1193 return outDirtyRegion;
1194 }
1195
1196 // Capture the old state of the layer for comparisons later
1197 const State& s(getDrawingState());
1198 const bool oldOpacity = isOpaque(s);
1199 sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
1200
1201 struct Reject : public SurfaceFlingerConsumer::BufferRejecter {
1202 Layer::State& front;
1203 Layer::State& current;
1204 bool& recomputeVisibleRegions;
1205 bool stickyTransformSet;
1206 Reject(Layer::State& front, Layer::State& current,
1207 bool& recomputeVisibleRegions, bool stickySet)
1208 : front(front), current(current),
1209 recomputeVisibleRegions(recomputeVisibleRegions),
1210 stickyTransformSet(stickySet) {
1211 }
1212
1213 virtual bool reject(const sp<GraphicBuffer>& buf,
1214 const BufferItem& item) {
1215 if (buf == NULL) {
1216 return false;
1217 }
1218
1219 uint32_t bufWidth = buf->getWidth();
1220 uint32_t bufHeight = buf->getHeight();
1221
1222 // check that we received a buffer of the right size
1223 // (Take the buffer's orientation into account)
1224 if (item.mTransform & Transform::ROT_90) {
1225 swap(bufWidth, bufHeight);
1226 }
1227
1228 bool isFixedSize = item.mScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
1229 if (front.active != front.requested) {
1230
1231 if (isFixedSize ||
1232 (bufWidth == front.requested.w &&
1233 bufHeight == front.requested.h))
1234 {
1235 // Here we pretend the transaction happened by updating the
1236 // current and drawing states. Drawing state is only accessed
1237 // in this thread, no need to have it locked
1238 front.active = front.requested;
1239
1240 // We also need to update the current state so that
1241 // we don't end-up overwriting the drawing state with
1242 // this stale current state during the next transaction
1243 //
1244 // NOTE: We don't need to hold the transaction lock here
1245 // because State::active is only accessed from this thread.
1246 current.active = front.active;
1247
1248 // recompute visible region
1249 recomputeVisibleRegions = true;
1250 }
1251
1252 ALOGD_IF(DEBUG_RESIZE,
1253 "latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n"
1254 " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
1255 " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n",
1256 bufWidth, bufHeight, item.mTransform, item.mScalingMode,
1257 front.active.w, front.active.h,
1258 front.active.crop.left,
1259 front.active.crop.top,
1260 front.active.crop.right,
1261 front.active.crop.bottom,
1262 front.active.crop.getWidth(),
1263 front.active.crop.getHeight(),
1264 front.requested.w, front.requested.h,
1265 front.requested.crop.left,
1266 front.requested.crop.top,
1267 front.requested.crop.right,
1268 front.requested.crop.bottom,
1269 front.requested.crop.getWidth(),
1270 front.requested.crop.getHeight());
1271 }
1272
1273 if (!isFixedSize && !stickyTransformSet) {
1274 if (front.active.w != bufWidth ||
1275 front.active.h != bufHeight) {
1276 // reject this buffer
1277 ALOGE("rejecting buffer: bufWidth=%d, bufHeight=%d, front.active.{w=%d, h=%d}",
1278 bufWidth, bufHeight, front.active.w, front.active.h);
1279 return true;
1280 }
1281 }
1282
1283 // if the transparent region has changed (this test is
1284 // conservative, but that's fine, worst case we're doing
1285 // a bit of extra work), we latch the new one and we
1286 // trigger a visible-region recompute.
1287 if (!front.activeTransparentRegion.isTriviallyEqual(
1288 front.requestedTransparentRegion)) {
1289 front.activeTransparentRegion = front.requestedTransparentRegion;
1290
1291 // We also need to update the current state so that
1292 // we don't end-up overwriting the drawing state with
1293 // this stale current state during the next transaction
1294 //
1295 // NOTE: We don't need to hold the transaction lock here
1296 // because State::active is only accessed from this thread.
1297 current.activeTransparentRegion = front.activeTransparentRegion;
1298
1299 // recompute visible region
1300 recomputeVisibleRegions = true;
1301 }
1302
1303 return false;
1304 }
1305 };
1306
1307 Reject r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
1308 getProducerStickyTransform() != 0);
1309
1310 uint64_t maxFrameNumber = 0;
1311 {
1312 Mutex::Autolock lock(mQueueItemLock);
1313 maxFrameNumber = mLastFrameNumberReceived;
1314 }
1315
1316 status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r,
1317 mFlinger->mPrimaryDispSync, maxFrameNumber);
1318 if (updateResult == BufferQueue::PRESENT_LATER) {
1319 // Producer doesn't want buffer to be displayed yet. Signal a
1320 // layer update so we check again at the next opportunity.
1321 mFlinger->signalLayerUpdate();
1322 return outDirtyRegion;
1323 } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) {
1324 // If the buffer has been rejected, remove it from the shadow queue
1325 // and return early
1326 Mutex::Autolock lock(mQueueItemLock);
1327 mQueueItems.removeAt(0);
1328 android_atomic_dec(&mQueuedFrames);
1329 return outDirtyRegion;
1330 } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) {
1331 // This can occur if something goes wrong when trying to create the
1332 // EGLImage for this buffer. If this happens, the buffer has already
1333 // been released, so we need to clean up the queue and bug out
1334 // early.
1335 {
1336 Mutex::Autolock lock(mQueueItemLock);
1337 mQueueItems.clear();
1338 android_atomic_and(0, &mQueuedFrames);
1339 }
1340
1341 // Once we have hit this state, the shadow queue may no longer
1342 // correctly reflect the incoming BufferQueue's contents, so even if
1343 // updateTexImage starts working, the only safe course of action is
1344 // to continue to ignore updates.
1345 mUpdateTexImageFailed = true;
1346
1347 return outDirtyRegion;
1348 }
1349
1350 { // Autolock scope
1351 auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber();
1352
1353 Mutex::Autolock lock(mQueueItemLock);
1354
1355 // Remove any stale buffers that have been dropped during
1356 // updateTexImage
1357 while (mQueueItems[0].mFrameNumber != currentFrameNumber) {
1358 mQueueItems.removeAt(0);
1359 android_atomic_dec(&mQueuedFrames);
1360 }
1361
1362 mQueueItems.removeAt(0);
1363 }
1364
1365
1366 // Decrement the queued-frames count. Signal another event if we
1367 // have more frames pending.
1368 if (android_atomic_dec(&mQueuedFrames) > 1) {
1369 mFlinger->signalLayerUpdate();
1370 }
1371
1372 if (updateResult != NO_ERROR) {
1373 // something happened!
1374 recomputeVisibleRegions = true;
1375 return outDirtyRegion;
1376 }
1377
1378 // update the active buffer
1379 mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer();
1380 if (mActiveBuffer == NULL) {
1381 // this can only happen if the very first buffer was rejected.
1382 return outDirtyRegion;
1383 }
1384
1385 mRefreshPending = true;
1386 mFrameLatencyNeeded = true;
1387 if (oldActiveBuffer == NULL) {
1388 // the first time we receive a buffer, we need to trigger a
1389 // geometry invalidation.
1390 recomputeVisibleRegions = true;
1391 }
1392
1393 Rect crop(mSurfaceFlingerConsumer->getCurrentCrop());
1394 const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform());
1395 const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode());
1396 if ((crop != mCurrentCrop) ||
1397 (transform != mCurrentTransform) ||
1398 (scalingMode != mCurrentScalingMode))
1399 {
1400 mCurrentCrop = crop;
1401 mCurrentTransform = transform;
1402 mCurrentScalingMode = scalingMode;
1403 recomputeVisibleRegions = true;
1404 }
1405
1406 if (oldActiveBuffer != NULL) {
1407 uint32_t bufWidth = mActiveBuffer->getWidth();
1408 uint32_t bufHeight = mActiveBuffer->getHeight();
1409 if (bufWidth != uint32_t(oldActiveBuffer->width) ||
1410 bufHeight != uint32_t(oldActiveBuffer->height)) {
1411 recomputeVisibleRegions = true;
1412 }
1413 }
1414
1415 mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
1416 if (oldOpacity != isOpaque(s)) {
1417 recomputeVisibleRegions = true;
1418 }
1419
1420 // FIXME: postedRegion should be dirty & bounds
1421 Region dirtyRegion(Rect(s.active.w, s.active.h));
1422
1423 // transform the dirty region to window-manager space
1424 outDirtyRegion = (s.transform.transform(dirtyRegion));
1425 }
1426 return outDirtyRegion;
1427 }
1428
getEffectiveUsage(uint32_t usage) const1429 uint32_t Layer::getEffectiveUsage(uint32_t usage) const
1430 {
1431 // TODO: should we do something special if mSecure is set?
1432 if (mProtectedByApp) {
1433 // need a hardware-protected path to external video sink
1434 usage |= GraphicBuffer::USAGE_PROTECTED;
1435 }
1436 if (mPotentialCursor) {
1437 usage |= GraphicBuffer::USAGE_CURSOR;
1438 }
1439 usage |= GraphicBuffer::USAGE_HW_COMPOSER;
1440 return usage;
1441 }
1442
updateTransformHint(const sp<const DisplayDevice> & hw) const1443 void Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const {
1444 uint32_t orientation = 0;
1445 if (!mFlinger->mDebugDisableTransformHint) {
1446 // The transform hint is used to improve performance, but we can
1447 // only have a single transform hint, it cannot
1448 // apply to all displays.
1449 const Transform& planeTransform(hw->getTransform());
1450 orientation = planeTransform.getOrientation();
1451 if (orientation & Transform::ROT_INVALID) {
1452 orientation = 0;
1453 }
1454 }
1455 mSurfaceFlingerConsumer->setTransformHint(orientation);
1456 }
1457
1458 // ----------------------------------------------------------------------------
1459 // debugging
1460 // ----------------------------------------------------------------------------
1461
dump(String8 & result,Colorizer & colorizer) const1462 void Layer::dump(String8& result, Colorizer& colorizer) const
1463 {
1464 const Layer::State& s(getDrawingState());
1465
1466 colorizer.colorize(result, Colorizer::GREEN);
1467 result.appendFormat(
1468 "+ %s %p (%s)\n",
1469 getTypeId(), this, getName().string());
1470 colorizer.reset(result);
1471
1472 s.activeTransparentRegion.dump(result, "transparentRegion");
1473 visibleRegion.dump(result, "visibleRegion");
1474 surfaceDamageRegion.dump(result, "surfaceDamageRegion");
1475 sp<Client> client(mClientRef.promote());
1476
1477 result.appendFormat( " "
1478 "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), "
1479 "isOpaque=%1d, invalidate=%1d, "
1480 "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n"
1481 " client=%p\n",
1482 s.layerStack, s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h,
1483 s.active.crop.left, s.active.crop.top,
1484 s.active.crop.right, s.active.crop.bottom,
1485 isOpaque(s), contentDirty,
1486 s.alpha, s.flags,
1487 s.transform[0][0], s.transform[0][1],
1488 s.transform[1][0], s.transform[1][1],
1489 client.get());
1490
1491 sp<const GraphicBuffer> buf0(mActiveBuffer);
1492 uint32_t w0=0, h0=0, s0=0, f0=0;
1493 if (buf0 != 0) {
1494 w0 = buf0->getWidth();
1495 h0 = buf0->getHeight();
1496 s0 = buf0->getStride();
1497 f0 = buf0->format;
1498 }
1499 result.appendFormat(
1500 " "
1501 "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
1502 " queued-frames=%d, mRefreshPending=%d\n",
1503 mFormat, w0, h0, s0,f0,
1504 mQueuedFrames, mRefreshPending);
1505
1506 if (mSurfaceFlingerConsumer != 0) {
1507 mSurfaceFlingerConsumer->dump(result, " ");
1508 }
1509 }
1510
dumpFrameStats(String8 & result) const1511 void Layer::dumpFrameStats(String8& result) const {
1512 mFrameTracker.dumpStats(result);
1513 }
1514
clearFrameStats()1515 void Layer::clearFrameStats() {
1516 mFrameTracker.clearStats();
1517 }
1518
logFrameStats()1519 void Layer::logFrameStats() {
1520 mFrameTracker.logAndResetStats(mName);
1521 }
1522
getFrameStats(FrameStats * outStats) const1523 void Layer::getFrameStats(FrameStats* outStats) const {
1524 mFrameTracker.getStats(outStats);
1525 }
1526
1527 // ---------------------------------------------------------------------------
1528
LayerCleaner(const sp<SurfaceFlinger> & flinger,const sp<Layer> & layer)1529 Layer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
1530 const sp<Layer>& layer)
1531 : mFlinger(flinger), mLayer(layer) {
1532 }
1533
~LayerCleaner()1534 Layer::LayerCleaner::~LayerCleaner() {
1535 // destroy client resources
1536 mFlinger->onLayerDestroyed(mLayer);
1537 }
1538
1539 // ---------------------------------------------------------------------------
1540 }; // namespace android
1541
1542 #if defined(__gl_h_)
1543 #error "don't include gl/gl.h in this file"
1544 #endif
1545
1546 #if defined(__gl2_h_)
1547 #error "don't include gl2/gl2.h in this file"
1548 #endif
1549