blob: 7d2444aa87e6a6ac60c5b2edac4da0a8bdb83dc0 [file] [log] [blame]
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001/*
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
Mark Salyzyn7823e122016-09-29 08:08:05 -070019#include <dlfcn.h>
20#include <errno.h>
21#include <inttypes.h>
22#include <math.h>
23#include <stdatomic.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000024#include <stdint.h>
25#include <sys/types.h>
Dan Stoza9e56aa02015-11-02 13:00:03 -080026
Fabien Sanglard9d96de42016-10-11 00:15:18 +000027#include <mutex>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000028
29#include <EGL/egl.h>
30
Fabien Sanglard9d96de42016-10-11 00:15:18 +000031#include <cutils/properties.h>
Mark Salyzyn7823e122016-09-29 08:08:05 -070032#include <log/log.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000033
34#include <binder/IPCThreadState.h>
35#include <binder/IServiceManager.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000036#include <binder/PermissionCache.h>
37
38#include <ui/DisplayInfo.h>
39#include <ui/DisplayStatInfo.h>
40
Fabien Sanglard9d96de42016-10-11 00:15:18 +000041#include <gui/BufferQueue.h>
42#include <gui/GuiConfig.h>
43#include <gui/IDisplayEventConnection.h>
44#include <gui/Surface.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000045
46#include <ui/GraphicBufferAllocator.h>
47#include <ui/HdrCapabilities.h>
48#include <ui/PixelFormat.h>
49#include <ui/UiConfig.h>
50
51#include <utils/misc.h>
52#include <utils/String8.h>
53#include <utils/String16.h>
54#include <utils/StopWatch.h>
55#include <utils/Timers.h>
56#include <utils/Trace.h>
57
58#include <private/android_filesystem_config.h>
59#include <private/gui/SyncFeatures.h>
60
61#include <set>
62
63#include "Client.h"
64#include "clz.h"
65#include "Colorizer.h"
66#include "DdmConnection.h"
67#include "DisplayDevice.h"
68#include "DispSync.h"
69#include "EventControlThread.h"
70#include "EventThread.h"
71#include "Layer.h"
Robert Carr1f0a16a2016-10-24 16:27:39 -070072#include "LayerVector.h"
Fabien Sanglard9d96de42016-10-11 00:15:18 +000073#include "LayerDim.h"
Robert Carr1db73f62016-12-21 12:58:51 -080074#include "MonitoredProducer.h"
Fabien Sanglard9d96de42016-10-11 00:15:18 +000075#include "SurfaceFlinger.h"
76
77#include "DisplayHardware/FramebufferSurface.h"
78#include "DisplayHardware/HWComposer.h"
79#include "DisplayHardware/VirtualDisplaySurface.h"
80
81#include "Effects/Daltonizer.h"
82
83#include "RenderEngine/RenderEngine.h"
84#include <cutils/compiler.h>
85
Fabien Sanglard0cc19382017-03-06 11:54:40 -080086#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
87#include <configstore/Utils.h>
88
Fabien Sanglard9d96de42016-10-11 00:15:18 +000089#define DISPLAY_COUNT 1
90
91/*
92 * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
93 * black pixels.
94 */
95#define DEBUG_SCREENSHOTS false
96
97EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
98
Fabien Sanglard9d96de42016-10-11 00:15:18 +000099namespace android {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000100// ---------------------------------------------------------------------------
101
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800102using namespace android::hardware::configstore;
103using namespace android::hardware::configstore::V1_0;
104
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000105const String16 sHardwareTest("android.permission.HARDWARE_TEST");
106const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
107const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
108const String16 sDump("android.permission.DUMP");
109
110// ---------------------------------------------------------------------------
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800111int64_t SurfaceFlinger::vsyncPhaseOffsetNs;
112int64_t SurfaceFlinger::sfVsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000113
114SurfaceFlinger::SurfaceFlinger()
115 : BnSurfaceComposer(),
116 mTransactionFlags(0),
117 mTransactionPending(false),
118 mAnimTransactionPending(false),
119 mLayersRemoved(false),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700120 mLayersAdded(false),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000121 mRepaintEverything(0),
122 mRenderEngine(NULL),
123 mBootTime(systemTime()),
124 mVisibleRegionsDirty(false),
125 mHwWorkListDirty(false),
126 mAnimCompositionPending(false),
127 mDebugRegion(0),
128 mDebugDDMS(0),
129 mDebugDisableHWC(0),
130 mDebugDisableTransformHint(0),
131 mDebugInSwapBuffers(0),
132 mLastSwapBufferTime(0),
133 mDebugInTransaction(0),
134 mLastTransactionTime(0),
135 mBootFinished(false),
136 mForceFullDamage(false),
Robert Carr0d480722017-01-10 16:42:54 -0800137 mInterceptor(this),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000138 mPrimaryDispSync("PrimaryDispSync"),
139 mPrimaryHWVsyncEnabled(false),
140 mHWVsyncAvailable(false),
141 mDaltonize(false),
142 mHasColorMatrix(false),
143 mHasPoweredOff(false),
144 mFrameBuckets(),
145 mTotalTime(0),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700146 mLastSwapTime(0),
147 mNumLayers(0)
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000148{
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800149 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
150 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
151
152 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
153 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
154
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000155 ALOGI("SurfaceFlinger is starting");
156
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000157 char value[PROPERTY_VALUE_MAX];
158
159 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
160 mGpuToCpuSupported = !atoi(value);
161
162 property_get("debug.sf.showupdates", value, "0");
163 mDebugRegion = atoi(value);
164
165 property_get("debug.sf.ddms", value, "0");
166 mDebugDDMS = atoi(value);
167 if (mDebugDDMS) {
168 if (!startDdmConnection()) {
169 // start failed, and DDMS debugging not enabled
170 mDebugDDMS = 0;
171 }
172 }
173 ALOGI_IF(mDebugRegion, "showupdates enabled");
174 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
175
Fabien Sanglard642b23d2017-02-09 12:29:39 -0800176 property_get("debug.sf.enable_hwc_vds", value, "0");
177 mUseHwcVirtualDisplays = atoi(value);
178 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800179
Fabien Sanglardc65dafa2017-02-07 14:06:39 -0800180 property_get("ro.sf.disable_triple_buffer", value, "1");
181 mLayerTripleBufferingDisabled = atoi(value);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800182 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000183}
184
185void SurfaceFlinger::onFirstRef()
186{
187 mEventQueue.init(this);
188}
189
190SurfaceFlinger::~SurfaceFlinger()
191{
192 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
193 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
194 eglTerminate(display);
195}
196
197void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
198{
199 // the window manager died on us. prepare its eulogy.
200
201 // restore initial conditions (default device unblank, etc)
202 initializeDisplays();
203
204 // restart the boot-animation
205 startBootAnim();
206}
207
Robert Carr1db73f62016-12-21 12:58:51 -0800208static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000209 status_t err = client->initCheck();
210 if (err == NO_ERROR) {
Robert Carr1db73f62016-12-21 12:58:51 -0800211 return client;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000212 }
Robert Carr1db73f62016-12-21 12:58:51 -0800213 return nullptr;
214}
215
216sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
217 return initClient(new Client(this));
218}
219
220sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
221 const sp<IGraphicBufferProducer>& gbp) {
222 if (authenticateSurfaceTexture(gbp) == false) {
223 return nullptr;
224 }
225 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
226 if (layer == nullptr) {
227 return nullptr;
228 }
229
230 return initClient(new Client(this, layer));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000231}
232
233sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
234 bool secure)
235{
236 class DisplayToken : public BBinder {
237 sp<SurfaceFlinger> flinger;
238 virtual ~DisplayToken() {
239 // no more references, this display must be terminated
240 Mutex::Autolock _l(flinger->mStateLock);
241 flinger->mCurrentState.displays.removeItem(this);
242 flinger->setTransactionFlags(eDisplayTransactionNeeded);
243 }
244 public:
245 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
246 : flinger(flinger) {
247 }
248 };
249
250 sp<BBinder> token = new DisplayToken(this);
251
252 Mutex::Autolock _l(mStateLock);
253 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
254 info.displayName = displayName;
255 mCurrentState.displays.add(token, info);
256 mInterceptor.saveDisplayCreation(info);
257 return token;
258}
259
260void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
261 Mutex::Autolock _l(mStateLock);
262
263 ssize_t idx = mCurrentState.displays.indexOfKey(display);
264 if (idx < 0) {
265 ALOGW("destroyDisplay: invalid display token");
266 return;
267 }
268
269 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
270 if (!info.isVirtualDisplay()) {
271 ALOGE("destroyDisplay called for non-virtual display");
272 return;
273 }
274 mInterceptor.saveDisplayDeletion(info.displayId);
275 mCurrentState.displays.removeItemsAt(idx);
276 setTransactionFlags(eDisplayTransactionNeeded);
277}
278
279void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
280 ALOGW_IF(mBuiltinDisplays[type],
281 "Overwriting display token for display type %d", type);
282 mBuiltinDisplays[type] = new BBinder();
283 // All non-virtual displays are currently considered secure.
284 DisplayDeviceState info(type, true);
285 mCurrentState.displays.add(mBuiltinDisplays[type], info);
286 mInterceptor.saveDisplayCreation(info);
287}
288
289sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
290 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
291 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
292 return NULL;
293 }
294 return mBuiltinDisplays[id];
295}
296
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000297void SurfaceFlinger::bootFinished()
298{
Wei Wangb254fa32017-01-31 17:43:23 -0800299 if (mStartBootAnimThread->join() != NO_ERROR) {
300 ALOGE("Join StartBootAnimThread failed!");
301 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000302 const nsecs_t now = systemTime();
303 const nsecs_t duration = now - mBootTime;
304 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
305 mBootFinished = true;
306
307 // wait patiently for the window manager death
308 const String16 name("window");
309 sp<IBinder> window(defaultServiceManager()->getService(name));
310 if (window != 0) {
311 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
312 }
313
314 // stop boot animation
315 // formerly we would just kill the process, but we now ask it to exit so it
316 // can choose where to stop the animation.
317 property_set("service.bootanim.exit", "1");
318
319 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
320 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
321 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
322}
323
324void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
325 class MessageDestroyGLTexture : public MessageBase {
326 RenderEngine& engine;
327 uint32_t texture;
328 public:
329 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
330 : engine(engine), texture(texture) {
331 }
332 virtual bool handler() {
333 engine.deleteTextures(1, &texture);
334 return true;
335 }
336 };
337 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
338}
339
340class DispSyncSource : public VSyncSource, private DispSync::Callback {
341public:
342 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
343 const char* name) :
344 mName(name),
345 mValue(0),
346 mTraceVsync(traceVsync),
347 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
348 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
349 mDispSync(dispSync),
350 mCallbackMutex(),
351 mCallback(),
352 mVsyncMutex(),
353 mPhaseOffset(phaseOffset),
354 mEnabled(false) {}
355
356 virtual ~DispSyncSource() {}
357
358 virtual void setVSyncEnabled(bool enable) {
359 Mutex::Autolock lock(mVsyncMutex);
360 if (enable) {
361 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
362 static_cast<DispSync::Callback*>(this));
363 if (err != NO_ERROR) {
364 ALOGE("error registering vsync callback: %s (%d)",
365 strerror(-err), err);
366 }
367 //ATRACE_INT(mVsyncOnLabel.string(), 1);
368 } else {
369 status_t err = mDispSync->removeEventListener(
370 static_cast<DispSync::Callback*>(this));
371 if (err != NO_ERROR) {
372 ALOGE("error unregistering vsync callback: %s (%d)",
373 strerror(-err), err);
374 }
375 //ATRACE_INT(mVsyncOnLabel.string(), 0);
376 }
377 mEnabled = enable;
378 }
379
380 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
381 Mutex::Autolock lock(mCallbackMutex);
382 mCallback = callback;
383 }
384
385 virtual void setPhaseOffset(nsecs_t phaseOffset) {
386 Mutex::Autolock lock(mVsyncMutex);
387
388 // Normalize phaseOffset to [0, period)
389 auto period = mDispSync->getPeriod();
390 phaseOffset %= period;
391 if (phaseOffset < 0) {
392 // If we're here, then phaseOffset is in (-period, 0). After this
393 // operation, it will be in (0, period)
394 phaseOffset += period;
395 }
396 mPhaseOffset = phaseOffset;
397
398 // If we're not enabled, we don't need to mess with the listeners
399 if (!mEnabled) {
400 return;
401 }
402
403 // Remove the listener with the old offset
404 status_t err = mDispSync->removeEventListener(
405 static_cast<DispSync::Callback*>(this));
406 if (err != NO_ERROR) {
407 ALOGE("error unregistering vsync callback: %s (%d)",
408 strerror(-err), err);
409 }
410
411 // Add a listener with the new offset
412 err = mDispSync->addEventListener(mName, mPhaseOffset,
413 static_cast<DispSync::Callback*>(this));
414 if (err != NO_ERROR) {
415 ALOGE("error registering vsync callback: %s (%d)",
416 strerror(-err), err);
417 }
418 }
419
420private:
421 virtual void onDispSyncEvent(nsecs_t when) {
422 sp<VSyncSource::Callback> callback;
423 {
424 Mutex::Autolock lock(mCallbackMutex);
425 callback = mCallback;
426
427 if (mTraceVsync) {
428 mValue = (mValue + 1) % 2;
429 ATRACE_INT(mVsyncEventLabel.string(), mValue);
430 }
431 }
432
433 if (callback != NULL) {
434 callback->onVSyncEvent(when);
435 }
436 }
437
438 const char* const mName;
439
440 int mValue;
441
442 const bool mTraceVsync;
443 const String8 mVsyncOnLabel;
444 const String8 mVsyncEventLabel;
445
446 DispSync* mDispSync;
447
448 Mutex mCallbackMutex; // Protects the following
449 sp<VSyncSource::Callback> mCallback;
450
451 Mutex mVsyncMutex; // Protects the following
452 nsecs_t mPhaseOffset;
453 bool mEnabled;
454};
455
456class InjectVSyncSource : public VSyncSource {
457public:
458 InjectVSyncSource() {}
459
460 virtual ~InjectVSyncSource() {}
461
462 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
463 std::lock_guard<std::mutex> lock(mCallbackMutex);
464 mCallback = callback;
465 }
466
467 virtual void onInjectSyncEvent(nsecs_t when) {
468 std::lock_guard<std::mutex> lock(mCallbackMutex);
469 mCallback->onVSyncEvent(when);
470 }
471
472 virtual void setVSyncEnabled(bool) {}
473 virtual void setPhaseOffset(nsecs_t) {}
474
475private:
476 std::mutex mCallbackMutex; // Protects the following
477 sp<VSyncSource::Callback> mCallback;
478};
479
480void SurfaceFlinger::init() {
481 ALOGI( "SurfaceFlinger's main thread ready to run. "
482 "Initializing graphics H/W...");
483
484 Mutex::Autolock _l(mStateLock);
485
486 // initialize EGL for the default display
487 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
488 eglInitialize(mEGLDisplay, NULL, NULL);
489
490 // start the EventThread
491 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
492 vsyncPhaseOffsetNs, true, "app");
493 mEventThread = new EventThread(vsyncSrc, *this, false);
494 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
495 sfVsyncPhaseOffsetNs, true, "sf");
496 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
497 mEventQueue.setEventThread(mSFEventThread);
498
499 // set SFEventThread to SCHED_FIFO to minimize jitter
500 struct sched_param param = {0};
501 param.sched_priority = 2;
502 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
503 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
504 }
505
506
507 // Initialize the H/W composer object. There may or may not be an
508 // actual hardware composer underneath.
509 mHwc = new HWComposer(this,
510 *static_cast<HWComposer::EventHandler *>(this));
511
512 // get a RenderEngine for the given display / config (can't fail)
513 mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID());
514
515 // retrieve the EGL context that was selected/created
516 mEGLContext = mRenderEngine->getEGLContext();
517
518 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
519 "couldn't create EGLContext");
520
521 // initialize our non-virtual displays
522 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
523 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
524 // set-up the displays that are already connected
525 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
526 // All non-virtual displays are currently considered secure.
527 bool isSecure = true;
528 createBuiltinDisplayLocked(type);
529 wp<IBinder> token = mBuiltinDisplays[i];
530
531 sp<IGraphicBufferProducer> producer;
532 sp<IGraphicBufferConsumer> consumer;
Mathias Agopian1da94df2017-02-27 18:17:44 -0800533 BufferQueue::createBufferQueue(&producer, &consumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000534
535 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
536 consumer);
537 int32_t hwcId = allocateHwcDisplayId(type);
538 sp<DisplayDevice> hw = new DisplayDevice(this,
539 type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
540 fbs, producer,
541 mRenderEngine->getEGLConfig());
542 if (i > DisplayDevice::DISPLAY_PRIMARY) {
543 // FIXME: currently we don't get blank/unblank requests
544 // for displays other than the main display, so we always
545 // assume a connected display is unblanked.
546 ALOGD("marking display %zu as acquired/unblanked", i);
547 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
548 }
549 mDisplays.add(token, hw);
550 }
551 }
552
553 // make the GLContext current so that we can create textures when creating Layers
554 // (which may happens before we render something)
555 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
556
557 mEventControlThread = new EventControlThread(this);
558 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
559
560 // set a fake vsync period if there is no HWComposer
561 if (mHwc->initCheck() != NO_ERROR) {
562 mPrimaryDispSync.setPeriod(16666667);
563 }
564
565 // initialize our drawing state
566 mDrawingState = mCurrentState;
567
568 // set initial conditions (e.g. unblank default device)
569 initializeDisplays();
570
571 mRenderEngine->primeCache();
572
Wei Wangb254fa32017-01-31 17:43:23 -0800573 mStartBootAnimThread = new StartBootAnimThread();
574 if (mStartBootAnimThread->Start() != NO_ERROR) {
575 ALOGE("Run StartBootAnimThread failed!");
576 }
577
578 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000579}
580
581int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
582 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
583 type : mHwc->allocateDisplayId();
584}
585
586void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800587 // Start boot animation service by setting a property mailbox
588 // if property setting thread is already running, Start() will be just a NOP
589 mStartBootAnimThread->Start();
590 // Wait until property was set
591 if (mStartBootAnimThread->join() != NO_ERROR) {
592 ALOGE("Join StartBootAnimThread failed!");
593 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000594}
595
596size_t SurfaceFlinger::getMaxTextureSize() const {
597 return mRenderEngine->getMaxTextureSize();
598}
599
600size_t SurfaceFlinger::getMaxViewportDims() const {
601 return mRenderEngine->getMaxViewportDims();
602}
603
604// ----------------------------------------------------------------------------
605
606bool SurfaceFlinger::authenticateSurfaceTexture(
607 const sp<IGraphicBufferProducer>& bufferProducer) const {
608 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800609 return authenticateSurfaceTextureLocked(bufferProducer);
610}
611
612bool SurfaceFlinger::authenticateSurfaceTextureLocked(
613 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000614 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
615 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
616}
617
Brian Anderson069b3652016-07-22 10:32:47 -0700618status_t SurfaceFlinger::getSupportedFrameTimestamps(
Brian Anderson3890c392016-07-25 12:48:08 -0700619 std::vector<FrameEvent>* outSupported) const {
Brian Anderson069b3652016-07-22 10:32:47 -0700620 *outSupported = {
Brian Anderson3890c392016-07-25 12:48:08 -0700621 FrameEvent::REQUESTED_PRESENT,
622 FrameEvent::ACQUIRE,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700623 FrameEvent::LATCH,
Brian Anderson3890c392016-07-25 12:48:08 -0700624 FrameEvent::FIRST_REFRESH_START,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700625 FrameEvent::LAST_REFRESH_START,
Brian Andersonb04c6f02016-10-21 12:57:46 -0700626 FrameEvent::GPU_COMPOSITION_DONE,
Brian Anderson3890c392016-07-25 12:48:08 -0700627 FrameEvent::DISPLAY_RETIRE,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700628 FrameEvent::DEQUEUE_READY,
Brian Anderson3890c392016-07-25 12:48:08 -0700629 FrameEvent::RELEASE,
Brian Anderson069b3652016-07-22 10:32:47 -0700630 };
631 return NO_ERROR;
632}
633
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000634status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
635 Vector<DisplayInfo>* configs) {
636 if ((configs == NULL) || (display.get() == NULL)) {
637 return BAD_VALUE;
638 }
639
640 int32_t type = getDisplayType(display);
641 if (type < 0) return type;
642
643 // TODO: Not sure if display density should handled by SF any longer
644 class Density {
645 static int getDensityFromProperty(char const* propName) {
646 char property[PROPERTY_VALUE_MAX];
647 int density = 0;
648 if (property_get(propName, property, NULL) > 0) {
649 density = atoi(property);
650 }
651 return density;
652 }
653 public:
654 static int getEmuDensity() {
655 return getDensityFromProperty("qemu.sf.lcd_density"); }
656 static int getBuildDensity() {
657 return getDensityFromProperty("ro.sf.lcd_density"); }
658 };
659
660 configs->clear();
661
662 const Vector<HWComposer::DisplayConfig>& hwConfigs =
663 getHwComposer().getConfigs(type);
664 for (size_t c = 0; c < hwConfigs.size(); ++c) {
665 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
666 DisplayInfo info = DisplayInfo();
667
668 float xdpi = hwConfig.xdpi;
669 float ydpi = hwConfig.ydpi;
670
671 if (type == DisplayDevice::DISPLAY_PRIMARY) {
672 // The density of the device is provided by a build property
673 float density = Density::getBuildDensity() / 160.0f;
674 if (density == 0) {
675 // the build doesn't provide a density -- this is wrong!
676 // use xdpi instead
677 ALOGE("ro.sf.lcd_density must be defined as a build property");
678 density = xdpi / 160.0f;
679 }
680 if (Density::getEmuDensity()) {
681 // if "qemu.sf.lcd_density" is specified, it overrides everything
682 xdpi = ydpi = density = Density::getEmuDensity();
683 density /= 160.0f;
684 }
685 info.density = density;
686
687 // TODO: this needs to go away (currently needed only by webkit)
688 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
689 info.orientation = hw->getOrientation();
690 } else {
691 // TODO: where should this value come from?
692 static const int TV_DENSITY = 213;
693 info.density = TV_DENSITY / 160.0f;
694 info.orientation = 0;
695 }
696
697 info.w = hwConfig.width;
698 info.h = hwConfig.height;
699 info.xdpi = xdpi;
700 info.ydpi = ydpi;
701 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800702 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000703
704 // This is how far in advance a buffer must be queued for
705 // presentation at a given time. If you want a buffer to appear
706 // on the screen at time N, you must submit the buffer before
707 // (N - presentationDeadline).
708 //
709 // Normally it's one full refresh period (to give SF a chance to
710 // latch the buffer), but this can be reduced by configuring a
711 // DispSync offset. Any additional delays introduced by the hardware
712 // composer or panel must be accounted for here.
713 //
714 // We add an additional 1ms to allow for processing time and
715 // differences between the ideal and actual refresh rate.
716 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800717 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000718
719 // All non-virtual displays are currently considered secure.
720 info.secure = true;
721
722 configs->push_back(info);
723 }
724
725 return NO_ERROR;
726}
727
728status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
729 DisplayStatInfo* stats) {
730 if (stats == NULL) {
731 return BAD_VALUE;
732 }
733
734 // FIXME for now we always return stats for the primary display
735 memset(stats, 0, sizeof(*stats));
736 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
737 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
738 return NO_ERROR;
739}
740
741int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
742 sp<DisplayDevice> device(getDisplayDevice(display));
743 if (device != NULL) {
744 return device->getActiveConfig();
745 }
746 return BAD_VALUE;
747}
748
749void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
750 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
751 this);
752 int32_t type = hw->getDisplayType();
753 int currentMode = hw->getActiveConfig();
754
755 if (mode == currentMode) {
756 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
757 return;
758 }
759
760 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
761 ALOGW("Trying to set config for virtual display");
762 return;
763 }
764
765 hw->setActiveConfig(mode);
766 getHwComposer().setActiveConfig(type, mode);
767}
768
769status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
770 class MessageSetActiveConfig: public MessageBase {
771 SurfaceFlinger& mFlinger;
772 sp<IBinder> mDisplay;
773 int mMode;
774 public:
775 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
776 int mode) :
777 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
778 virtual bool handler() {
779 Vector<DisplayInfo> configs;
780 mFlinger.getDisplayConfigs(mDisplay, &configs);
781 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
782 ALOGE("Attempt to set active config = %d for display with %zu configs",
783 mMode, configs.size());
784 }
785 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
786 if (hw == NULL) {
787 ALOGE("Attempt to set active config = %d for null display %p",
788 mMode, mDisplay.get());
789 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
790 ALOGW("Attempt to set active config = %d for virtual display",
791 mMode);
792 } else {
793 mFlinger.setActiveConfigInternal(hw, mMode);
794 }
795 return true;
796 }
797 };
798 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
799 postMessageSync(msg);
800 return NO_ERROR;
801}
802
803status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
804 Vector<android_color_mode_t>* outColorModes) {
805 if (outColorModes == nullptr || display.get() == nullptr) {
806 return BAD_VALUE;
807 }
808
809 int32_t type = getDisplayType(display);
810 if (type < 0) return type;
811
812 std::set<android_color_mode_t> colorModes;
813 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
814 colorModes.insert(hwConfig.colorMode);
815 }
816
817 outColorModes->clear();
818 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
819
820 return NO_ERROR;
821}
822
823android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
824 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
825
826 int32_t type = getDisplayType(display);
827 if (type < 0) return static_cast<android_color_mode_t>(type);
828
829 return getHwComposer().getColorMode(type);
830}
831
832status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
833 android_color_mode_t colorMode) {
834 if (display.get() == nullptr || colorMode < 0) {
835 return BAD_VALUE;
836 }
837
838 int32_t type = getDisplayType(display);
839 if (type < 0) return type;
840 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
841 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
842 desiredConfig.colorMode = colorMode;
843 for (size_t c = 0; c < hwConfigs.size(); ++c) {
844 const HWComposer::DisplayConfig config = hwConfigs[c];
845 if (config == desiredConfig) {
846 return setActiveConfig(display, c);
847 }
848 }
849 return BAD_VALUE;
850}
851
852status_t SurfaceFlinger::clearAnimationFrameStats() {
853 Mutex::Autolock _l(mStateLock);
854 mAnimFrameTracker.clearStats();
855 return NO_ERROR;
856}
857
858status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
859 Mutex::Autolock _l(mStateLock);
860 mAnimFrameTracker.getStats(outStats);
861 return NO_ERROR;
862}
863
864status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
865 HdrCapabilities* outCapabilities) const {
866 // HWC1 does not provide HDR capabilities
867 *outCapabilities = HdrCapabilities();
868 return NO_ERROR;
869}
870
871status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
872 if (enable == mInjectVSyncs) {
873 return NO_ERROR;
874 }
875
876 if (enable) {
877 mInjectVSyncs = enable;
878 ALOGV("VSync Injections enabled");
879 if (mVSyncInjector.get() == nullptr) {
880 mVSyncInjector = new InjectVSyncSource();
881 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
882 }
883 mEventQueue.setEventThread(mInjectorEventThread);
884 } else {
885 mInjectVSyncs = enable;
886 ALOGV("VSync Injections disabled");
887 mEventQueue.setEventThread(mSFEventThread);
888 mVSyncInjector.clear();
889 }
890 return NO_ERROR;
891}
892
893status_t SurfaceFlinger::injectVSync(nsecs_t when) {
894 if (!mInjectVSyncs) {
895 ALOGE("VSync Injections not enabled");
896 return BAD_VALUE;
897 }
898 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
899 ALOGV("Injecting VSync inside SurfaceFlinger");
900 mVSyncInjector->onInjectSyncEvent(when);
901 }
902 return NO_ERROR;
903}
904
905// ----------------------------------------------------------------------------
906
907sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
908 return mEventThread->createEventConnection();
909}
910
911// ----------------------------------------------------------------------------
912
913void SurfaceFlinger::waitForEvent() {
914 mEventQueue.waitMessage();
915}
916
917void SurfaceFlinger::signalTransaction() {
918 mEventQueue.invalidate();
919}
920
921void SurfaceFlinger::signalLayerUpdate() {
922 mEventQueue.invalidate();
923}
924
925void SurfaceFlinger::signalRefresh() {
926 mEventQueue.refresh();
927}
928
929status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
930 nsecs_t reltime, uint32_t /* flags */) {
931 return mEventQueue.postMessage(msg, reltime);
932}
933
934status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
935 nsecs_t reltime, uint32_t /* flags */) {
936 status_t res = mEventQueue.postMessage(msg, reltime);
937 if (res == NO_ERROR) {
938 msg->wait();
939 }
940 return res;
941}
942
943void SurfaceFlinger::run() {
944 do {
945 waitForEvent();
946 } while (true);
947}
948
949void SurfaceFlinger::enableHardwareVsync() {
950 Mutex::Autolock _l(mHWVsyncLock);
951 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
952 mPrimaryDispSync.beginResync();
953 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
954 mEventControlThread->setVsyncEnabled(true);
955 mPrimaryHWVsyncEnabled = true;
956 }
957}
958
959void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
960 Mutex::Autolock _l(mHWVsyncLock);
961
962 if (makeAvailable) {
963 mHWVsyncAvailable = true;
964 } else if (!mHWVsyncAvailable) {
965 // Hardware vsync is not currently available, so abort the resync
966 // attempt for now
967 return;
968 }
969
970 const nsecs_t period =
971 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
972
973 mPrimaryDispSync.reset();
974 mPrimaryDispSync.setPeriod(period);
975
976 if (!mPrimaryHWVsyncEnabled) {
977 mPrimaryDispSync.beginResync();
978 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
979 mEventControlThread->setVsyncEnabled(true);
980 mPrimaryHWVsyncEnabled = true;
981 }
982}
983
984void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
985 Mutex::Autolock _l(mHWVsyncLock);
986 if (mPrimaryHWVsyncEnabled) {
987 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
988 mEventControlThread->setVsyncEnabled(false);
989 mPrimaryDispSync.endResync();
990 mPrimaryHWVsyncEnabled = false;
991 }
992 if (makeUnavailable) {
993 mHWVsyncAvailable = false;
994 }
995}
996
997void SurfaceFlinger::resyncWithRateLimit() {
998 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
999 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1000 resyncToHardwareVsync(false);
1001 }
1002}
1003
Steven Thomas3cfac282017-02-06 12:29:30 -08001004void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1005 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001006 bool needsHwVsync = false;
1007
1008 { // Scope for the lock
1009 Mutex::Autolock _l(mHWVsyncLock);
1010 if (type == 0 && mPrimaryHWVsyncEnabled) {
1011 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1012 }
1013 }
1014
1015 if (needsHwVsync) {
1016 enableHardwareVsync();
1017 } else {
1018 disableHardwareVsync(false);
1019 }
1020}
1021
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001022void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
1023 std::lock_guard<std::mutex> lock(mCompositeTimingLock);
1024 *compositorTiming = mCompositorTiming;
1025}
1026
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001027void SurfaceFlinger::onHotplugReceived(int type, bool connected) {
1028 if (mEventThread == NULL) {
1029 // This is a temporary workaround for b/7145521. A non-null pointer
1030 // does not mean EventThread has finished initializing, so this
1031 // is not a correct fix.
1032 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1033 return;
1034 }
1035
1036 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1037 Mutex::Autolock _l(mStateLock);
1038 if (connected) {
1039 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1040 } else {
1041 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1042 mBuiltinDisplays[type].clear();
1043 }
1044 setTransactionFlags(eDisplayTransactionNeeded);
1045
1046 // Defer EventThread notification until SF has updated mDisplays.
1047 }
1048}
1049
Steven Thomas3cfac282017-02-06 12:29:30 -08001050void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1051 repaintEverything();
1052}
1053
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001054void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1055 ATRACE_CALL();
1056 getHwComposer().eventControl(disp, event, enabled);
1057}
1058
1059void SurfaceFlinger::onMessageReceived(int32_t what) {
1060 ATRACE_CALL();
1061 switch (what) {
1062 case MessageQueue::INVALIDATE: {
1063 bool refreshNeeded = handleMessageTransaction();
1064 refreshNeeded |= handleMessageInvalidate();
1065 refreshNeeded |= mRepaintEverything;
1066 if (refreshNeeded) {
1067 // Signal a refresh if a transaction modified the window state,
1068 // a new buffer was latched, or if HWC has requested a full
1069 // repaint
1070 signalRefresh();
1071 }
1072 break;
1073 }
1074 case MessageQueue::REFRESH: {
1075 handleMessageRefresh();
1076 break;
1077 }
1078 }
1079}
1080
1081bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001082 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001083 if (transactionFlags) {
1084 handleTransaction(transactionFlags);
1085 return true;
1086 }
1087 return false;
1088}
1089
1090bool SurfaceFlinger::handleMessageInvalidate() {
1091 ATRACE_CALL();
1092 return handlePageFlip();
1093}
1094
1095void SurfaceFlinger::handleMessageRefresh() {
1096 ATRACE_CALL();
1097
1098 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1099
Brian Andersond6927fb2016-07-23 23:37:30 -07001100 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001101 rebuildLayerStacks();
1102 setUpHWComposer();
1103 doDebugFlashRegions();
1104 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001105 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001106}
1107
1108void SurfaceFlinger::doDebugFlashRegions()
1109{
1110 // is debugging enabled
1111 if (CC_LIKELY(!mDebugRegion))
1112 return;
1113
1114 const bool repaintEverything = mRepaintEverything;
1115 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1116 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1117 if (hw->isDisplayOn()) {
1118 // transform the dirty region into this screen's coordinate space
1119 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1120 if (!dirtyRegion.isEmpty()) {
1121 // redraw the whole screen
1122 doComposeSurfaces(hw, Region(hw->bounds()));
1123
1124 // and draw the dirty region
1125 const int32_t height = hw->getHeight();
1126 RenderEngine& engine(getRenderEngine());
1127 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1128
1129 hw->compositionComplete();
1130 hw->swapBuffers(getHwComposer());
1131 }
1132 }
1133 }
1134
1135 postFramebuffer();
1136
1137 if (mDebugRegion > 1) {
1138 usleep(mDebugRegion * 1000);
1139 }
1140
1141 HWComposer& hwc(getHwComposer());
1142 if (hwc.initCheck() == NO_ERROR) {
1143 status_t err = hwc.prepare();
1144 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1145 }
1146}
1147
Brian Andersond6927fb2016-07-23 23:37:30 -07001148void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001149{
1150 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001151 mDrawingState.traverseInZOrder([&](Layer* layer) {
1152 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001153 needExtraInvalidate = true;
1154 }
Robert Carr2047fae2016-11-28 14:09:09 -08001155 });
1156
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001157 if (needExtraInvalidate) {
1158 signalLayerUpdate();
1159 }
1160}
1161
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001162void SurfaceFlinger::updateCompositorTiming(
1163 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1164 std::shared_ptr<FenceTime>& presentFenceTime) {
1165 // Update queue of past composite+present times and determine the
1166 // most recently known composite to present latency.
1167 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1168 nsecs_t compositeToPresentLatency = -1;
1169 while (!mCompositePresentTimes.empty()) {
1170 CompositePresentTime& cpt = mCompositePresentTimes.front();
1171 // Cached values should have been updated before calling this method,
1172 // which helps avoid duplicate syscalls.
1173 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1174 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1175 break;
1176 }
1177 compositeToPresentLatency = displayTime - cpt.composite;
1178 mCompositePresentTimes.pop();
1179 }
1180
1181 // Don't let mCompositePresentTimes grow unbounded, just in case.
1182 while (mCompositePresentTimes.size() > 16) {
1183 mCompositePresentTimes.pop();
1184 }
1185
1186 // Integer division and modulo round toward 0 not -inf, so we need to
1187 // treat negative and positive offsets differently.
1188 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs >= 0) ?
1189 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1190 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1191
1192 // Snap the latency to a value that removes scheduling jitter from the
1193 // composition and present times, which often have >1ms of jitter.
1194 // Reducing jitter is important if an app attempts to extrapolate
1195 // something (such as user input) to an accurate diasplay time.
1196 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1197 // with (presentLatency % interval).
1198 nsecs_t snappedCompositeToPresentLatency = -1;
1199 if (compositeToPresentLatency >= 0) {
1200 nsecs_t bias = vsyncInterval / 2;
1201 int64_t extraVsyncs =
1202 (compositeToPresentLatency - idealLatency + bias) /
1203 vsyncInterval;
1204 nsecs_t extraLatency = extraVsyncs * vsyncInterval;
1205 snappedCompositeToPresentLatency = idealLatency + extraLatency;
1206 }
1207
1208 std::lock_guard<std::mutex> lock(mCompositeTimingLock);
1209 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1210 mCompositorTiming.interval = vsyncInterval;
1211 if (snappedCompositeToPresentLatency >= 0) {
1212 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
1213 }
1214}
1215
1216void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001217{
Brian Andersond6927fb2016-07-23 23:37:30 -07001218 const HWComposer& hwc = getHwComposer();
1219 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1220
Brian Anderson3d4039d2016-09-23 16:31:30 -07001221 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1222 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1223 glCompositionDoneFenceTime =
1224 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1225 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1226 } else {
1227 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1228 }
1229 mGlCompositionDoneTimeline.updateSignalTimes();
1230
1231 sp<Fence> displayFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1232 const std::shared_ptr<FenceTime>& presentFenceTime = FenceTime::NO_FENCE;
1233 auto retireFenceTime = std::make_shared<FenceTime>(displayFence);
1234 mDisplayTimeline.push(retireFenceTime);
1235 mDisplayTimeline.updateSignalTimes();
Brian Andersond6927fb2016-07-23 23:37:30 -07001236
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001237 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1238 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1239
1240 // We use the refreshStartTime which might be sampled a little later than
1241 // when we started doing work for this frame, but that should be okay
1242 // since updateCompositorTiming has snapping logic.
1243 updateCompositorTiming(
1244 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
1245
Robert Carr2047fae2016-11-28 14:09:09 -08001246 mDrawingState.traverseInZOrder([&](Layer* layer) {
1247 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001248 presentFenceTime, retireFenceTime, mCompositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001249 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001250 recordBufferingStats(layer->getName().string(),
1251 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001252 }
Robert Carr2047fae2016-11-28 14:09:09 -08001253 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001254
Brian Anderson3d4039d2016-09-23 16:31:30 -07001255 if (displayFence->isValid()) {
1256 if (mPrimaryDispSync.addPresentFence(displayFence)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001257 enableHardwareVsync();
1258 } else {
1259 disableHardwareVsync(false);
1260 }
1261 }
1262
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001263 if (kIgnorePresentFences) {
1264 if (hw->isDisplayOn()) {
1265 enableHardwareVsync();
1266 }
1267 }
1268
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001269 if (mAnimCompositionPending) {
1270 mAnimCompositionPending = false;
1271
Brian Anderson3d4039d2016-09-23 16:31:30 -07001272 if (retireFenceTime->isValid()) {
1273 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001274 } else {
1275 // The HWC doesn't support present fences, so use the refresh
1276 // timestamp instead.
1277 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1278 mAnimFrameTracker.setActualPresentTime(presentTime);
1279 }
1280 mAnimFrameTracker.advanceFrame();
1281 }
1282
1283 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1284 return;
1285 }
1286
1287 nsecs_t currentTime = systemTime();
1288 if (mHasPoweredOff) {
1289 mHasPoweredOff = false;
1290 } else {
1291 nsecs_t period = mPrimaryDispSync.getPeriod();
1292 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1293 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1294 if (numPeriods < NUM_BUCKETS - 1) {
1295 mFrameBuckets[numPeriods] += elapsedTime;
1296 } else {
1297 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1298 }
1299 mTotalTime += elapsedTime;
1300 }
1301 mLastSwapTime = currentTime;
1302}
1303
1304void SurfaceFlinger::rebuildLayerStacks() {
1305 // rebuild the visible layer list per screen
1306 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1307 ATRACE_CALL();
1308 mVisibleRegionsDirty = false;
1309 invalidateHwcGeometry();
1310
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001311 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1312 Region opaqueRegion;
1313 Region dirtyRegion;
1314 Vector< sp<Layer> > layersSortedByZ;
1315 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1316 const Transform& tr(hw->getTransform());
1317 const Rect bounds(hw->getBounds());
1318 if (hw->isDisplayOn()) {
Robert Carr2047fae2016-11-28 14:09:09 -08001319 computeVisibleRegions(hw->getLayerStack(), dirtyRegion,
1320 opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001321
Robert Carr2047fae2016-11-28 14:09:09 -08001322 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001323 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001324 Region drawRegion(tr.transform(
1325 layer->visibleNonTransparentRegion));
1326 drawRegion.andSelf(bounds);
1327 if (!drawRegion.isEmpty()) {
1328 layersSortedByZ.add(layer);
1329 }
1330 }
Robert Carr2047fae2016-11-28 14:09:09 -08001331 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001332 }
1333 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1334 hw->undefinedRegion.set(bounds);
1335 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1336 hw->dirtyRegion.orSelf(dirtyRegion);
1337 }
1338 }
1339}
1340
1341void SurfaceFlinger::setUpHWComposer() {
1342 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1343 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1344 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1345 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1346
1347 // If nothing has changed (!dirty), don't recompose.
1348 // If something changed, but we don't currently have any visible layers,
1349 // and didn't when we last did a composition, then skip it this time.
1350 // The second rule does two things:
1351 // - When all layers are removed from a display, we'll emit one black
1352 // frame, then nothing more until we get new layers.
1353 // - When a display is created with a private layer stack, we won't
1354 // emit any black frames until a layer is added to the layer stack.
1355 bool mustRecompose = dirty && !(empty && wasEmpty);
1356
1357 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1358 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1359 mustRecompose ? "doing" : "skipping",
1360 dirty ? "+" : "-",
1361 empty ? "+" : "-",
1362 wasEmpty ? "+" : "-");
1363
1364 mDisplays[dpy]->beginFrame(mustRecompose);
1365
1366 if (mustRecompose) {
1367 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1368 }
1369 }
1370
1371 HWComposer& hwc(getHwComposer());
1372 if (hwc.initCheck() == NO_ERROR) {
1373 // build the h/w work list
1374 if (CC_UNLIKELY(mHwWorkListDirty)) {
1375 mHwWorkListDirty = false;
1376 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1377 sp<const DisplayDevice> hw(mDisplays[dpy]);
1378 const int32_t id = hw->getHwcDisplayId();
1379 if (id >= 0) {
1380 const Vector< sp<Layer> >& currentLayers(
1381 hw->getVisibleLayersSortedByZ());
1382 const size_t count = currentLayers.size();
1383 if (hwc.createWorkList(id, count) == NO_ERROR) {
1384 HWComposer::LayerListIterator cur = hwc.begin(id);
1385 const HWComposer::LayerListIterator end = hwc.end(id);
1386 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1387 const sp<Layer>& layer(currentLayers[i]);
1388 layer->setGeometry(hw, *cur);
1389 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1390 cur->setSkip(true);
1391 }
1392 }
1393 }
1394 }
1395 }
1396 }
1397
1398 // set the per-frame data
1399 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1400 sp<const DisplayDevice> hw(mDisplays[dpy]);
1401 const int32_t id = hw->getHwcDisplayId();
1402 if (id >= 0) {
1403 const Vector< sp<Layer> >& currentLayers(
1404 hw->getVisibleLayersSortedByZ());
1405 const size_t count = currentLayers.size();
1406 HWComposer::LayerListIterator cur = hwc.begin(id);
1407 const HWComposer::LayerListIterator end = hwc.end(id);
1408 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1409 /*
1410 * update the per-frame h/w composer data for each layer
1411 * and build the transparent region of the FB
1412 */
1413 const sp<Layer>& layer(currentLayers[i]);
1414 layer->setPerFrameData(hw, *cur);
1415 }
1416 }
1417 }
1418
1419 // If possible, attempt to use the cursor overlay on each display.
1420 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1421 sp<const DisplayDevice> hw(mDisplays[dpy]);
1422 const int32_t id = hw->getHwcDisplayId();
1423 if (id >= 0) {
1424 const Vector< sp<Layer> >& currentLayers(
1425 hw->getVisibleLayersSortedByZ());
1426 const size_t count = currentLayers.size();
1427 HWComposer::LayerListIterator cur = hwc.begin(id);
1428 const HWComposer::LayerListIterator end = hwc.end(id);
1429 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1430 const sp<Layer>& layer(currentLayers[i]);
1431 if (layer->isPotentialCursor()) {
1432 cur->setIsCursorLayerHint();
1433 break;
1434 }
1435 }
1436 }
1437 }
1438
1439 status_t err = hwc.prepare();
1440 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1441
1442 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1443 sp<const DisplayDevice> hw(mDisplays[dpy]);
1444 hw->prepareFrame(hwc);
1445 }
1446 }
1447}
1448
1449void SurfaceFlinger::doComposition() {
1450 ATRACE_CALL();
1451 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1452 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1453 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1454 if (hw->isDisplayOn()) {
1455 // transform the dirty region into this screen's coordinate space
1456 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1457
1458 // repaint the framebuffer (if needed)
1459 doDisplayComposition(hw, dirtyRegion);
1460
1461 hw->dirtyRegion.clear();
1462 hw->flip(hw->swapRegion);
1463 hw->swapRegion.clear();
1464 }
1465 // inform the h/w that we're done compositing
1466 hw->compositionComplete();
1467 }
1468 postFramebuffer();
1469}
1470
1471void SurfaceFlinger::postFramebuffer()
1472{
1473 ATRACE_CALL();
1474
1475 const nsecs_t now = systemTime();
1476 mDebugInSwapBuffers = now;
1477
1478 HWComposer& hwc(getHwComposer());
1479 if (hwc.initCheck() == NO_ERROR) {
1480 if (!hwc.supportsFramebufferTarget()) {
1481 // EGL spec says:
1482 // "surface must be bound to the calling thread's current context,
1483 // for the current rendering API."
1484 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1485 }
1486 hwc.commit();
1487 }
1488
1489 // make the default display current because the VirtualDisplayDevice code cannot
1490 // deal with dequeueBuffer() being called outside of the composition loop; however
1491 // the code below can call glFlush() which is allowed (and does in some case) call
1492 // dequeueBuffer().
1493 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1494
1495 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1496 sp<const DisplayDevice> hw(mDisplays[dpy]);
1497 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1498 hw->onSwapBuffersCompleted(hwc);
1499 const size_t count = currentLayers.size();
1500 int32_t id = hw->getHwcDisplayId();
1501 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1502 HWComposer::LayerListIterator cur = hwc.begin(id);
1503 const HWComposer::LayerListIterator end = hwc.end(id);
1504 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1505 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1506 }
1507 } else {
1508 for (size_t i = 0; i < count; i++) {
1509 currentLayers[i]->onLayerDisplayed(hw, NULL);
1510 }
1511 }
1512 }
1513
1514 mLastSwapBufferTime = systemTime() - now;
1515 mDebugInSwapBuffers = 0;
1516
1517 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1518 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1519 logFrameStats();
1520 }
1521}
1522
1523void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1524{
1525 ATRACE_CALL();
1526
1527 // here we keep a copy of the drawing state (that is the state that's
1528 // going to be overwritten by handleTransactionLocked()) outside of
1529 // mStateLock so that the side-effects of the State assignment
1530 // don't happen with mStateLock held (which can cause deadlocks).
1531 State drawingState(mDrawingState);
1532
1533 Mutex::Autolock _l(mStateLock);
1534 const nsecs_t now = systemTime();
1535 mDebugInTransaction = now;
1536
1537 // Here we're guaranteed that some transaction flags are set
1538 // so we can call handleTransactionLocked() unconditionally.
1539 // We call getTransactionFlags(), which will also clear the flags,
1540 // with mStateLock held to guarantee that mCurrentState won't change
1541 // until the transaction is committed.
1542
1543 transactionFlags = getTransactionFlags(eTransactionMask);
1544 handleTransactionLocked(transactionFlags);
1545
1546 mLastTransactionTime = systemTime() - now;
1547 mDebugInTransaction = 0;
1548 invalidateHwcGeometry();
1549 // here the transaction has been committed
1550}
1551
1552void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1553{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001554 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001555 mCurrentState.traverseInZOrder([](Layer* layer) {
1556 layer->notifyAvailableFrames();
1557 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001558
1559 /*
1560 * Traversal of the children
1561 * (perform the transaction for each of them if needed)
1562 */
1563
1564 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001565 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001566 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001567 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001568
1569 const uint32_t flags = layer->doTransaction(0);
1570 if (flags & Layer::eVisibleRegion)
1571 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001572 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001573 }
1574
1575 /*
1576 * Perform display own transactions if needed
1577 */
1578
1579 if (transactionFlags & eDisplayTransactionNeeded) {
1580 // here we take advantage of Vector's copy-on-write semantics to
1581 // improve performance by skipping the transaction entirely when
1582 // know that the lists are identical
1583 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1584 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1585 if (!curr.isIdenticalTo(draw)) {
1586 mVisibleRegionsDirty = true;
1587 const size_t cc = curr.size();
1588 size_t dc = draw.size();
1589
1590 // find the displays that were removed
1591 // (ie: in drawing state but not in current state)
1592 // also handle displays that changed
1593 // (ie: displays that are in both lists)
1594 for (size_t i=0 ; i<dc ; i++) {
1595 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1596 if (j < 0) {
1597 // in drawing state but not in current state
1598 if (!draw[i].isMainDisplay()) {
1599 // Call makeCurrent() on the primary display so we can
1600 // be sure that nothing associated with this display
1601 // is current.
1602 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1603 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1604 sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1605 if (hw != NULL)
1606 hw->disconnect(getHwComposer());
1607 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1608 mEventThread->onHotplugReceived(draw[i].type, false);
1609 mDisplays.removeItem(draw.keyAt(i));
1610 } else {
1611 ALOGW("trying to remove the main display");
1612 }
1613 } else {
1614 // this display is in both lists. see if something changed.
1615 const DisplayDeviceState& state(curr[j]);
1616 const wp<IBinder>& display(curr.keyAt(j));
1617 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1618 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1619 if (state_binder != draw_binder) {
1620 // changing the surface is like destroying and
1621 // recreating the DisplayDevice, so we just remove it
1622 // from the drawing state, so that it get re-added
1623 // below.
1624 sp<DisplayDevice> hw(getDisplayDevice(display));
1625 if (hw != NULL)
1626 hw->disconnect(getHwComposer());
1627 mDisplays.removeItem(display);
1628 mDrawingState.displays.removeItemsAt(i);
1629 dc--; i--;
1630 // at this point we must loop to the next item
1631 continue;
1632 }
1633
1634 const sp<DisplayDevice> disp(getDisplayDevice(display));
1635 if (disp != NULL) {
1636 if (state.layerStack != draw[i].layerStack) {
1637 disp->setLayerStack(state.layerStack);
1638 }
1639 if ((state.orientation != draw[i].orientation)
1640 || (state.viewport != draw[i].viewport)
1641 || (state.frame != draw[i].frame))
1642 {
1643 disp->setProjection(state.orientation,
1644 state.viewport, state.frame);
1645 }
1646 if (state.width != draw[i].width || state.height != draw[i].height) {
1647 disp->setDisplaySize(state.width, state.height);
1648 }
1649 }
1650 }
1651 }
1652
1653 // find displays that were added
1654 // (ie: in current state but not in drawing state)
1655 for (size_t i=0 ; i<cc ; i++) {
1656 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1657 const DisplayDeviceState& state(curr[i]);
1658
1659 sp<DisplaySurface> dispSurface;
1660 sp<IGraphicBufferProducer> producer;
1661 sp<IGraphicBufferProducer> bqProducer;
1662 sp<IGraphicBufferConsumer> bqConsumer;
Mathias Agopian1da94df2017-02-27 18:17:44 -08001663 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001664
1665 int32_t hwcDisplayId = -1;
1666 if (state.isVirtualDisplay()) {
1667 // Virtual displays without a surface are dormant:
1668 // they have external state (layer stack, projection,
1669 // etc.) but no internal state (i.e. a DisplayDevice).
1670 if (state.surface != NULL) {
1671
1672 int width = 0;
1673 int status = state.surface->query(
1674 NATIVE_WINDOW_WIDTH, &width);
1675 ALOGE_IF(status != NO_ERROR,
1676 "Unable to query width (%d)", status);
1677 int height = 0;
1678 status = state.surface->query(
1679 NATIVE_WINDOW_HEIGHT, &height);
1680 ALOGE_IF(status != NO_ERROR,
1681 "Unable to query height (%d)", status);
1682 if (mUseHwcVirtualDisplays &&
1683 (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 ||
1684 (width <= MAX_VIRTUAL_DISPLAY_DIMENSION &&
1685 height <= MAX_VIRTUAL_DISPLAY_DIMENSION))) {
1686 hwcDisplayId = allocateHwcDisplayId(state.type);
1687 }
1688
1689 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1690 *mHwc, hwcDisplayId, state.surface,
1691 bqProducer, bqConsumer, state.displayName);
1692
1693 dispSurface = vds;
1694 producer = vds;
1695 }
1696 } else {
1697 ALOGE_IF(state.surface!=NULL,
1698 "adding a supported display, but rendering "
1699 "surface is provided (%p), ignoring it",
1700 state.surface.get());
1701 hwcDisplayId = allocateHwcDisplayId(state.type);
1702 // for supported (by hwc) displays we provide our
1703 // own rendering surface
1704 dispSurface = new FramebufferSurface(*mHwc, state.type,
1705 bqConsumer);
1706 producer = bqProducer;
1707 }
1708
1709 const wp<IBinder>& display(curr.keyAt(i));
1710 if (dispSurface != NULL) {
1711 sp<DisplayDevice> hw = new DisplayDevice(this,
1712 state.type, hwcDisplayId,
1713 mHwc->getFormat(hwcDisplayId), state.isSecure,
1714 display, dispSurface, producer,
1715 mRenderEngine->getEGLConfig());
1716 hw->setLayerStack(state.layerStack);
1717 hw->setProjection(state.orientation,
1718 state.viewport, state.frame);
1719 hw->setDisplayName(state.displayName);
1720 mDisplays.add(display, hw);
1721 if (state.isVirtualDisplay()) {
1722 if (hwcDisplayId >= 0) {
1723 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1724 hw->getWidth(), hw->getHeight(),
1725 hw->getFormat());
1726 }
1727 } else {
1728 mEventThread->onHotplugReceived(state.type, true);
1729 }
1730 }
1731 }
1732 }
1733 }
1734 }
1735
1736 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1737 // The transform hint might have changed for some layers
1738 // (either because a display has changed, or because a layer
1739 // as changed).
1740 //
1741 // Walk through all the layers in currentLayers,
1742 // and update their transform hint.
1743 //
1744 // If a layer is visible only on a single display, then that
1745 // display is used to calculate the hint, otherwise we use the
1746 // default display.
1747 //
1748 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1749 // the hint is set before we acquire a buffer from the surface texture.
1750 //
1751 // NOTE: layer transactions have taken place already, so we use their
1752 // drawing state. However, SurfaceFlinger's own transaction has not
1753 // happened yet, so we must use the current state layer list
1754 // (soon to become the drawing state list).
1755 //
1756 sp<const DisplayDevice> disp;
1757 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001758 bool first = true;
1759 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001760 // NOTE: we rely on the fact that layers are sorted by
1761 // layerStack first (so we don't have to traverse the list
1762 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001763 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001764 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001765 currentlayerStack = layerStack;
1766 // figure out if this layerstack is mirrored
1767 // (more than one display) if so, pick the default display,
1768 // if not, pick the only display it's on.
1769 disp.clear();
1770 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1771 sp<const DisplayDevice> hw(mDisplays[dpy]);
1772 if (hw->getLayerStack() == currentlayerStack) {
1773 if (disp == NULL) {
1774 disp = hw;
1775 } else {
1776 disp = NULL;
1777 break;
1778 }
1779 }
1780 }
1781 }
1782 if (disp == NULL) {
1783 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1784 // redraw after transform hint changes. See bug 8508397.
1785
1786 // could be null when this layer is using a layerStack
1787 // that is not visible on any display. Also can occur at
1788 // screen off/on times.
1789 disp = getDefaultDisplayDevice();
1790 }
1791 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001792
1793 first = false;
1794 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001795 }
1796
1797
1798 /*
1799 * Perform our own transaction if needed
1800 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001801
1802 if (mLayersAdded) {
1803 mLayersAdded = false;
1804 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001805 mVisibleRegionsDirty = true;
1806 }
1807
1808 // some layers might have been removed, so
1809 // we need to update the regions they're exposing.
1810 if (mLayersRemoved) {
1811 mLayersRemoved = false;
1812 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001813 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001814 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001815 // this layer is not visible anymore
1816 // TODO: we could traverse the tree from front to back and
1817 // compute the actual visible region
1818 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001819 Region visibleReg;
1820 visibleReg.set(layer->computeScreenBounds());
1821 invalidateLayerStack(layer->getLayerStack(), visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001822 }
Robert Carr2047fae2016-11-28 14:09:09 -08001823 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001824 }
1825
1826 commitTransaction();
1827
1828 updateCursorAsync();
1829}
1830
1831void SurfaceFlinger::updateCursorAsync()
1832{
1833 HWComposer& hwc(getHwComposer());
1834 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1835 sp<const DisplayDevice> hw(mDisplays[dpy]);
1836 const int32_t id = hw->getHwcDisplayId();
1837 if (id < 0) {
1838 continue;
1839 }
1840 const Vector< sp<Layer> >& currentLayers(
1841 hw->getVisibleLayersSortedByZ());
1842 const size_t count = currentLayers.size();
1843 HWComposer::LayerListIterator cur = hwc.begin(id);
1844 const HWComposer::LayerListIterator end = hwc.end(id);
1845 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1846 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1847 continue;
1848 }
1849 const sp<Layer>& layer(currentLayers[i]);
1850 Rect cursorPos = layer->getPosition(hw);
1851 hwc.setCursorPositionAsync(id, cursorPos);
1852 break;
1853 }
1854 }
1855}
1856
1857void SurfaceFlinger::commitTransaction()
1858{
1859 if (!mLayersPendingRemoval.isEmpty()) {
1860 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001861 for (const auto& l : mLayersPendingRemoval) {
1862 recordBufferingStats(l->getName().string(),
1863 l->getOccupancyHistory(true));
1864 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001865 }
1866 mLayersPendingRemoval.clear();
1867 }
1868
1869 // If this transaction is part of a window animation then the next frame
1870 // we composite should be considered an animation as well.
1871 mAnimCompositionPending = mAnimTransactionPending;
1872
1873 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001874 mDrawingState.traverseInZOrder([](Layer* layer) {
1875 layer->commitChildList();
1876 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001877 mTransactionPending = false;
1878 mAnimTransactionPending = false;
1879 mTransactionCV.broadcast();
1880}
1881
Robert Carr2047fae2016-11-28 14:09:09 -08001882void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001883 Region& outDirtyRegion, Region& outOpaqueRegion)
1884{
1885 ATRACE_CALL();
1886
1887 Region aboveOpaqueLayers;
1888 Region aboveCoveredLayers;
1889 Region dirty;
1890
1891 outDirtyRegion.clear();
1892
Robert Carr2047fae2016-11-28 14:09:09 -08001893 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001894 // start with the whole surface at its current location
1895 const Layer::State& s(layer->getDrawingState());
1896
1897 // only consider the layers on the given layer stack
Robert Carr1f0a16a2016-10-24 16:27:39 -07001898 if (layer->getLayerStack() != layerStack)
Robert Carr2047fae2016-11-28 14:09:09 -08001899 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001900
1901 /*
1902 * opaqueRegion: area of a surface that is fully opaque.
1903 */
1904 Region opaqueRegion;
1905
1906 /*
1907 * visibleRegion: area of a surface that is visible on screen
1908 * and not fully transparent. This is essentially the layer's
1909 * footprint minus the opaque regions above it.
1910 * Areas covered by a translucent surface are considered visible.
1911 */
1912 Region visibleRegion;
1913
1914 /*
1915 * coveredRegion: area of a surface that is covered by all
1916 * visible regions above it (which includes the translucent areas).
1917 */
1918 Region coveredRegion;
1919
1920 /*
1921 * transparentRegion: area of a surface that is hinted to be completely
1922 * transparent. This is only used to tell when the layer has no visible
1923 * non-transparent regions and can be removed from the layer list. It
1924 * does not affect the visibleRegion of this layer or any layers
1925 * beneath it. The hint may not be correct if apps don't respect the
1926 * SurfaceView restrictions (which, sadly, some don't).
1927 */
1928 Region transparentRegion;
1929
1930
1931 // handle hidden surfaces by setting the visible region to empty
1932 if (CC_LIKELY(layer->isVisible())) {
1933 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001934 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001935 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001936 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001937 if (!visibleRegion.isEmpty()) {
1938 // Remove the transparent area from the visible region
1939 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001940 if (tr.preserveRects()) {
1941 // transform the transparent region
1942 transparentRegion = tr.transform(s.activeTransparentRegion);
1943 } else {
1944 // transformation too complex, can't do the
1945 // transparent region optimization.
1946 transparentRegion.clear();
1947 }
1948 }
1949
1950 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001951 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001952 if (s.alpha==255 && !translucent &&
1953 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1954 // the opaque region is the layer's footprint
1955 opaqueRegion = visibleRegion;
1956 }
1957 }
1958 }
1959
1960 // Clip the covered region to the visible region
1961 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1962
1963 // Update aboveCoveredLayers for next (lower) layer
1964 aboveCoveredLayers.orSelf(visibleRegion);
1965
1966 // subtract the opaque region covered by the layers above us
1967 visibleRegion.subtractSelf(aboveOpaqueLayers);
1968
1969 // compute this layer's dirty region
1970 if (layer->contentDirty) {
1971 // we need to invalidate the whole region
1972 dirty = visibleRegion;
1973 // as well, as the old visible region
1974 dirty.orSelf(layer->visibleRegion);
1975 layer->contentDirty = false;
1976 } else {
1977 /* compute the exposed region:
1978 * the exposed region consists of two components:
1979 * 1) what's VISIBLE now and was COVERED before
1980 * 2) what's EXPOSED now less what was EXPOSED before
1981 *
1982 * note that (1) is conservative, we start with the whole
1983 * visible region but only keep what used to be covered by
1984 * something -- which mean it may have been exposed.
1985 *
1986 * (2) handles areas that were not covered by anything but got
1987 * exposed because of a resize.
1988 */
1989 const Region newExposed = visibleRegion - coveredRegion;
1990 const Region oldVisibleRegion = layer->visibleRegion;
1991 const Region oldCoveredRegion = layer->coveredRegion;
1992 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
1993 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
1994 }
1995 dirty.subtractSelf(aboveOpaqueLayers);
1996
1997 // accumulate to the screen dirty region
1998 outDirtyRegion.orSelf(dirty);
1999
2000 // Update aboveOpaqueLayers for next (lower) layer
2001 aboveOpaqueLayers.orSelf(opaqueRegion);
2002
2003 // Store the visible region in screen space
2004 layer->setVisibleRegion(visibleRegion);
2005 layer->setCoveredRegion(coveredRegion);
2006 layer->setVisibleNonTransparentRegion(
2007 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002008 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002009
2010 outOpaqueRegion = aboveOpaqueLayers;
2011}
2012
2013void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2014 const Region& dirty) {
2015 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2016 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2017 if (hw->getLayerStack() == layerStack) {
2018 hw->dirtyRegion.orSelf(dirty);
2019 }
2020 }
2021}
2022
2023bool SurfaceFlinger::handlePageFlip()
2024{
Brian Andersond6927fb2016-07-23 23:37:30 -07002025 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002026 Region dirtyRegion;
2027
2028 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002029 bool frameQueued = false;
2030
2031 // Store the set of layers that need updates. This set must not change as
2032 // buffers are being latched, as this could result in a deadlock.
2033 // Example: Two producers share the same command stream and:
2034 // 1.) Layer 0 is latched
2035 // 2.) Layer 0 gets a new frame
2036 // 2.) Layer 1 gets a new frame
2037 // 3.) Layer 1 is latched.
2038 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2039 // second frame. But layer 0's second frame could be waiting on display.
2040 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002041 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002042 if (layer->hasQueuedFrame()) {
2043 frameQueued = true;
2044 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002045 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002046 } else {
2047 layer->useEmptyDamage();
2048 }
2049 } else {
2050 layer->useEmptyDamage();
2051 }
Robert Carr2047fae2016-11-28 14:09:09 -08002052 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002053 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2054 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002055 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002056 layer->useSurfaceDamage();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002057 invalidateLayerStack(layer->getLayerStack(), dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002058 }
2059
2060 mVisibleRegionsDirty |= visibleRegions;
2061
2062 // If we will need to wake up at some time in the future to deal with a
2063 // queued frame that shouldn't be displayed during this vsync period, wake
2064 // up during the next vsync period to check again.
2065 if (frameQueued && layersWithQueuedFrames.empty()) {
2066 signalLayerUpdate();
2067 }
2068
2069 // Only continue with the refresh if there is actually new work to do
2070 return !layersWithQueuedFrames.empty();
2071}
2072
2073void SurfaceFlinger::invalidateHwcGeometry()
2074{
2075 mHwWorkListDirty = true;
2076}
2077
2078
2079void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2080 const Region& inDirtyRegion)
2081{
2082 // We only need to actually compose the display if:
2083 // 1) It is being handled by hardware composer, which may need this to
2084 // keep its virtual display state machine in sync, or
2085 // 2) There is work to be done (the dirty region isn't empty)
2086 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2087 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2088 return;
2089 }
2090
2091 Region dirtyRegion(inDirtyRegion);
2092
2093 // compute the invalid region
2094 hw->swapRegion.orSelf(dirtyRegion);
2095
2096 uint32_t flags = hw->getFlags();
2097 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2098 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2099 // takes a rectangle, we must make sure to update that whole
2100 // rectangle in that case
2101 dirtyRegion.set(hw->swapRegion.bounds());
2102 } else {
2103 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2104 // We need to redraw the rectangle that will be updated
2105 // (pushed to the framebuffer).
2106 // This is needed because PARTIAL_UPDATES only takes one
2107 // rectangle instead of a region (see DisplayDevice::flip())
2108 dirtyRegion.set(hw->swapRegion.bounds());
2109 } else {
2110 // we need to redraw everything (the whole screen)
2111 dirtyRegion.set(hw->bounds());
2112 hw->swapRegion = dirtyRegion;
2113 }
2114 }
2115
2116 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2117 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2118 } else {
2119 RenderEngine& engine(getRenderEngine());
2120 mat4 colorMatrix = mColorMatrix;
2121 if (mDaltonize) {
2122 colorMatrix = colorMatrix * mDaltonizer();
2123 }
2124 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2125 doComposeSurfaces(hw, dirtyRegion);
2126 engine.setupColorTransform(oldMatrix);
2127 }
2128
2129 // update the swap region and clear the dirty region
2130 hw->swapRegion.orSelf(dirtyRegion);
2131
2132 // swap buffers (presentation)
2133 hw->swapBuffers(getHwComposer());
2134}
2135
2136bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2137{
2138 RenderEngine& engine(getRenderEngine());
2139 const int32_t id = hw->getHwcDisplayId();
2140 HWComposer& hwc(getHwComposer());
2141 HWComposer::LayerListIterator cur = hwc.begin(id);
2142 const HWComposer::LayerListIterator end = hwc.end(id);
2143
2144 bool hasGlesComposition = hwc.hasGlesComposition(id);
2145 if (hasGlesComposition) {
2146 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2147 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2148 hw->getDisplayName().string());
2149 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2150 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2151 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2152 }
2153 return false;
2154 }
2155
2156 // Never touch the framebuffer if we don't have any framebuffer layers
2157 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2158 if (hasHwcComposition) {
2159 // when using overlays, we assume a fully transparent framebuffer
2160 // NOTE: we could reduce how much we need to clear, for instance
2161 // remove where there are opaque FB layers. however, on some
2162 // GPUs doing a "clean slate" clear might be more efficient.
2163 // We'll revisit later if needed.
2164 engine.clearWithColor(0, 0, 0, 0);
2165 } else {
2166 // we start with the whole screen area
2167 const Region bounds(hw->getBounds());
2168
2169 // we remove the scissor part
2170 // we're left with the letterbox region
2171 // (common case is that letterbox ends-up being empty)
2172 const Region letterbox(bounds.subtract(hw->getScissor()));
2173
2174 // compute the area to clear
2175 Region region(hw->undefinedRegion.merge(letterbox));
2176
2177 // but limit it to the dirty region
2178 region.andSelf(dirty);
2179
2180 // screen is already cleared here
2181 if (!region.isEmpty()) {
2182 // can happen with SurfaceView
2183 drawWormhole(hw, region);
2184 }
2185 }
2186
2187 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2188 // just to be on the safe side, we don't set the
2189 // scissor on the main display. It should never be needed
2190 // anyways (though in theory it could since the API allows it).
2191 const Rect& bounds(hw->getBounds());
2192 const Rect& scissor(hw->getScissor());
2193 if (scissor != bounds) {
2194 // scissor doesn't match the screen's dimensions, so we
2195 // need to clear everything outside of it and enable
2196 // the GL scissor so we don't draw anything where we shouldn't
2197
2198 // enable scissor for this frame
2199 const uint32_t height = hw->getHeight();
2200 engine.setScissor(scissor.left, height - scissor.bottom,
2201 scissor.getWidth(), scissor.getHeight());
2202 }
2203 }
2204 }
2205
2206 /*
2207 * and then, render the layers targeted at the framebuffer
2208 */
2209
2210 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2211 const size_t count = layers.size();
2212 const Transform& tr = hw->getTransform();
2213 if (cur != end) {
2214 // we're using h/w composer
2215 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2216 const sp<Layer>& layer(layers[i]);
2217 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2218 if (!clip.isEmpty()) {
2219 switch (cur->getCompositionType()) {
2220 case HWC_CURSOR_OVERLAY:
2221 case HWC_OVERLAY: {
2222 const Layer::State& state(layer->getDrawingState());
2223 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2224 && i
2225 && layer->isOpaque(state) && (state.alpha == 0xFF)
2226 && hasGlesComposition) {
2227 // never clear the very first layer since we're
2228 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002229 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002230 }
2231 break;
2232 }
2233 case HWC_FRAMEBUFFER: {
2234 layer->draw(hw, clip);
2235 break;
2236 }
2237 case HWC_FRAMEBUFFER_TARGET: {
2238 // this should not happen as the iterator shouldn't
2239 // let us get there.
2240 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2241 break;
2242 }
2243 }
2244 }
2245 layer->setAcquireFence(hw, *cur);
2246 }
2247 } else {
2248 // we're not using h/w composer
2249 for (size_t i=0 ; i<count ; ++i) {
2250 const sp<Layer>& layer(layers[i]);
2251 const Region clip(dirty.intersect(
2252 tr.transform(layer->visibleRegion)));
2253 if (!clip.isEmpty()) {
2254 layer->draw(hw, clip);
2255 }
2256 }
2257 }
2258
2259 // disable scissor at the end of the frame
2260 engine.disableScissor();
2261 return true;
2262}
2263
2264void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2265 const int32_t height = hw->getHeight();
2266 RenderEngine& engine(getRenderEngine());
2267 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2268}
2269
2270status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2271 const sp<IBinder>& handle,
2272 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002273 const sp<Layer>& lbc,
2274 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002275{
2276 // add this layer to the current state list
2277 {
2278 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002279 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002280 return NO_MEMORY;
2281 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002282 if (parent == nullptr) {
2283 mCurrentState.layersSortedByZ.add(lbc);
2284 } else {
2285 parent->addChild(lbc);
2286 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002287 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002288 mLayersAdded = true;
2289 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002290 }
2291
2292 // attach this layer to the client
2293 client->attachLayer(handle, lbc);
2294
2295 return NO_ERROR;
2296}
2297
Robert Carr9524cb32017-02-13 11:32:32 -08002298status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002299 const auto& p = layer->getParent();
2300 const ssize_t index = (p != nullptr) ? p->removeChild(layer) :
2301 mCurrentState.layersSortedByZ.remove(layer);
2302
Robert Carr136e2f62017-02-08 17:54:29 -08002303 // As a matter of normal operation, the LayerCleaner will produce a second
2304 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2305 // so we will succeed in promoting it, but it's already been removed
2306 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2307 // otherwise something has gone wrong and we are leaking the layer.
2308 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002309 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2310 layer->getName().string(),
2311 (p != nullptr) ? p->getName().string() : "no-parent");
2312 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002313 } else if (index < 0) {
2314 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002315 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002316
2317 mLayersPendingRemoval.add(layer);
2318 mLayersRemoved = true;
2319 mNumLayers--;
2320 setTransactionFlags(eTransactionNeeded);
2321 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002322}
2323
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002324uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002325 return android_atomic_release_load(&mTransactionFlags);
2326}
2327
2328uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2329 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2330}
2331
2332uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2333 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2334 if ((old & flags)==0) { // wake the server up
2335 signalTransaction();
2336 }
2337 return old;
2338}
2339
2340void SurfaceFlinger::setTransactionState(
2341 const Vector<ComposerState>& state,
2342 const Vector<DisplayState>& displays,
2343 uint32_t flags)
2344{
2345 ATRACE_CALL();
2346 Mutex::Autolock _l(mStateLock);
2347 uint32_t transactionFlags = 0;
2348
2349 if (flags & eAnimation) {
2350 // For window updates that are part of an animation we must wait for
2351 // previous animation "frames" to be handled.
2352 while (mAnimTransactionPending) {
2353 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2354 if (CC_UNLIKELY(err != NO_ERROR)) {
2355 // just in case something goes wrong in SF, return to the
2356 // caller after a few seconds.
2357 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2358 "waiting for previous animation frame");
2359 mAnimTransactionPending = false;
2360 break;
2361 }
2362 }
2363 }
2364
2365 size_t count = displays.size();
2366 for (size_t i=0 ; i<count ; i++) {
2367 const DisplayState& s(displays[i]);
2368 transactionFlags |= setDisplayStateLocked(s);
2369 }
2370
2371 count = state.size();
2372 for (size_t i=0 ; i<count ; i++) {
2373 const ComposerState& s(state[i]);
2374 // Here we need to check that the interface we're given is indeed
2375 // one of our own. A malicious client could give us a NULL
2376 // IInterface, or one of its own or even one of our own but a
2377 // different type. All these situations would cause us to crash.
2378 //
2379 // NOTE: it would be better to use RTTI as we could directly check
2380 // that we have a Client*. however, RTTI is disabled in Android.
2381 if (s.client != NULL) {
2382 sp<IBinder> binder = IInterface::asBinder(s.client);
2383 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002384 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002385 sp<Client> client( static_cast<Client *>(s.client.get()) );
2386 transactionFlags |= setClientStateLocked(client, s.state);
2387 }
2388 }
2389 }
2390 }
2391
2392 // If a synchronous transaction is explicitly requested without any changes,
2393 // force a transaction anyway. This can be used as a flush mechanism for
2394 // previous async transactions.
2395 if (transactionFlags == 0 && (flags & eSynchronous)) {
2396 transactionFlags = eTransactionNeeded;
2397 }
2398
2399 if (transactionFlags) {
2400 if (mInterceptor.isEnabled()) {
2401 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2402 }
2403
2404 // this triggers the transaction
2405 setTransactionFlags(transactionFlags);
2406
2407 // if this is a synchronous transaction, wait for it to take effect
2408 // before returning.
2409 if (flags & eSynchronous) {
2410 mTransactionPending = true;
2411 }
2412 if (flags & eAnimation) {
2413 mAnimTransactionPending = true;
2414 }
2415 while (mTransactionPending) {
2416 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2417 if (CC_UNLIKELY(err != NO_ERROR)) {
2418 // just in case something goes wrong in SF, return to the
2419 // called after a few seconds.
2420 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2421 mTransactionPending = false;
2422 break;
2423 }
2424 }
2425 }
2426}
2427
2428uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2429{
2430 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2431 if (dpyIdx < 0)
2432 return 0;
2433
2434 uint32_t flags = 0;
2435 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2436 if (disp.isValid()) {
2437 const uint32_t what = s.what;
2438 if (what & DisplayState::eSurfaceChanged) {
2439 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2440 disp.surface = s.surface;
2441 flags |= eDisplayTransactionNeeded;
2442 }
2443 }
2444 if (what & DisplayState::eLayerStackChanged) {
2445 if (disp.layerStack != s.layerStack) {
2446 disp.layerStack = s.layerStack;
2447 flags |= eDisplayTransactionNeeded;
2448 }
2449 }
2450 if (what & DisplayState::eDisplayProjectionChanged) {
2451 if (disp.orientation != s.orientation) {
2452 disp.orientation = s.orientation;
2453 flags |= eDisplayTransactionNeeded;
2454 }
2455 if (disp.frame != s.frame) {
2456 disp.frame = s.frame;
2457 flags |= eDisplayTransactionNeeded;
2458 }
2459 if (disp.viewport != s.viewport) {
2460 disp.viewport = s.viewport;
2461 flags |= eDisplayTransactionNeeded;
2462 }
2463 }
2464 if (what & DisplayState::eDisplaySizeChanged) {
2465 if (disp.width != s.width) {
2466 disp.width = s.width;
2467 flags |= eDisplayTransactionNeeded;
2468 }
2469 if (disp.height != s.height) {
2470 disp.height = s.height;
2471 flags |= eDisplayTransactionNeeded;
2472 }
2473 }
2474 }
2475 return flags;
2476}
2477
2478uint32_t SurfaceFlinger::setClientStateLocked(
2479 const sp<Client>& client,
2480 const layer_state_t& s)
2481{
2482 uint32_t flags = 0;
2483 sp<Layer> layer(client->getLayerUser(s.surface));
2484 if (layer != 0) {
2485 const uint32_t what = s.what;
2486 bool geometryAppliesWithResize =
2487 what & layer_state_t::eGeometryAppliesWithResize;
2488 if (what & layer_state_t::ePositionChanged) {
2489 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2490 flags |= eTraversalNeeded;
2491 }
2492 }
2493 if (what & layer_state_t::eLayerChanged) {
2494 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002495 const auto& p = layer->getParent();
2496 if (p == nullptr) {
2497 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2498 if (layer->setLayer(s.z) && idx >= 0) {
2499 mCurrentState.layersSortedByZ.removeAt(idx);
2500 mCurrentState.layersSortedByZ.add(layer);
2501 // we need traversal (state changed)
2502 // AND transaction (list changed)
2503 flags |= eTransactionNeeded|eTraversalNeeded;
2504 }
2505 } else {
2506 if (p->setChildLayer(layer, s.z)) {
2507 flags |= eTransactionNeeded|eTraversalNeeded;
2508 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002509 }
2510 }
2511 if (what & layer_state_t::eSizeChanged) {
2512 if (layer->setSize(s.w, s.h)) {
2513 flags |= eTraversalNeeded;
2514 }
2515 }
2516 if (what & layer_state_t::eAlphaChanged) {
2517 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2518 flags |= eTraversalNeeded;
2519 }
2520 if (what & layer_state_t::eMatrixChanged) {
2521 if (layer->setMatrix(s.matrix))
2522 flags |= eTraversalNeeded;
2523 }
2524 if (what & layer_state_t::eTransparentRegionChanged) {
2525 if (layer->setTransparentRegionHint(s.transparentRegion))
2526 flags |= eTraversalNeeded;
2527 }
2528 if (what & layer_state_t::eFlagsChanged) {
2529 if (layer->setFlags(s.flags, s.mask))
2530 flags |= eTraversalNeeded;
2531 }
2532 if (what & layer_state_t::eCropChanged) {
2533 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2534 flags |= eTraversalNeeded;
2535 }
2536 if (what & layer_state_t::eFinalCropChanged) {
2537 if (layer->setFinalCrop(s.finalCrop))
2538 flags |= eTraversalNeeded;
2539 }
2540 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002541 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002542 // We only allow setting layer stacks for top level layers,
2543 // everything else inherits layer stack from its parent.
2544 if (layer->hasParent()) {
2545 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2546 layer->getName().string());
2547 } else if (idx < 0) {
2548 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2549 "that also does not appear in the top level layer list. Something"
2550 " has gone wrong.", layer->getName().string());
2551 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002552 mCurrentState.layersSortedByZ.removeAt(idx);
2553 mCurrentState.layersSortedByZ.add(layer);
2554 // we need traversal (state changed)
2555 // AND transaction (list changed)
2556 flags |= eTransactionNeeded|eTraversalNeeded;
2557 }
2558 }
2559 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002560 if (s.barrierHandle != nullptr) {
2561 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2562 } else if (s.barrierGbp != nullptr) {
2563 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2564 if (authenticateSurfaceTextureLocked(gbp)) {
2565 const auto& otherLayer =
2566 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2567 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2568 } else {
2569 ALOGE("Attempt to defer transaction to to an"
2570 " unrecognized GraphicBufferProducer");
2571 }
2572 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002573 // We don't trigger a traversal here because if no other state is
2574 // changed, we don't want this to cause any more work
2575 }
Robert Carr1db73f62016-12-21 12:58:51 -08002576 if (what & layer_state_t::eReparentChildren) {
2577 if (layer->reparentChildren(s.reparentHandle)) {
2578 flags |= eTransactionNeeded|eTraversalNeeded;
2579 }
2580 }
Robert Carr9524cb32017-02-13 11:32:32 -08002581 if (what & layer_state_t::eDetachChildren) {
2582 layer->detachChildren();
2583 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002584 if (what & layer_state_t::eOverrideScalingModeChanged) {
2585 layer->setOverrideScalingMode(s.overrideScalingMode);
2586 // We don't trigger a traversal here because if no other state is
2587 // changed, we don't want this to cause any more work
2588 }
2589 }
2590 return flags;
2591}
2592
2593status_t SurfaceFlinger::createLayer(
2594 const String8& name,
2595 const sp<Client>& client,
2596 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002597 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2598 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002599{
2600 if (int32_t(w|h) < 0) {
2601 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2602 int(w), int(h));
2603 return BAD_VALUE;
2604 }
2605
2606 status_t result = NO_ERROR;
2607
2608 sp<Layer> layer;
2609
2610 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2611 case ISurfaceComposerClient::eFXSurfaceNormal:
2612 result = createNormalLayer(client,
2613 name, w, h, flags, format,
2614 handle, gbp, &layer);
2615 break;
2616 case ISurfaceComposerClient::eFXSurfaceDim:
2617 result = createDimLayer(client,
2618 name, w, h, flags,
2619 handle, gbp, &layer);
2620 break;
2621 default:
2622 result = BAD_VALUE;
2623 break;
2624 }
2625
2626 if (result != NO_ERROR) {
2627 return result;
2628 }
2629
Albert Chaulk479c60c2017-01-27 14:21:34 -05002630 layer->setInfo(windowType, ownerUid);
2631
Robert Carr1f0a16a2016-10-24 16:27:39 -07002632 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002633 if (result != NO_ERROR) {
2634 return result;
2635 }
2636 mInterceptor.saveSurfaceCreation(layer);
2637
2638 setTransactionFlags(eTransactionNeeded);
2639 return result;
2640}
2641
2642status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2643 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2644 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2645{
2646 // initialize the surfaces
2647 switch (format) {
2648 case PIXEL_FORMAT_TRANSPARENT:
2649 case PIXEL_FORMAT_TRANSLUCENT:
2650 format = PIXEL_FORMAT_RGBA_8888;
2651 break;
2652 case PIXEL_FORMAT_OPAQUE:
2653 format = PIXEL_FORMAT_RGBX_8888;
2654 break;
2655 }
2656
2657 *outLayer = new Layer(this, client, name, w, h, flags);
2658 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2659 if (err == NO_ERROR) {
2660 *handle = (*outLayer)->getHandle();
2661 *gbp = (*outLayer)->getProducer();
2662 }
2663
2664 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2665 return err;
2666}
2667
2668status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2669 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2670 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2671{
2672 *outLayer = new LayerDim(this, client, name, w, h, flags);
2673 *handle = (*outLayer)->getHandle();
2674 *gbp = (*outLayer)->getProducer();
2675 return NO_ERROR;
2676}
2677
2678status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2679{
Robert Carr9524cb32017-02-13 11:32:32 -08002680 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002681 status_t err = NO_ERROR;
2682 sp<Layer> l(client->getLayerUser(handle));
2683 if (l != NULL) {
2684 mInterceptor.saveSurfaceDeletion(l);
2685 err = removeLayer(l);
2686 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2687 "error removing layer=%p (%s)", l.get(), strerror(-err));
2688 }
2689 return err;
2690}
2691
2692status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2693{
2694 // called by ~LayerCleaner() when all references to the IBinder (handle)
2695 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002696 sp<Layer> l = layer.promote();
2697 if (l == nullptr) {
2698 // The layer has already been removed, carry on
2699 return NO_ERROR;
2700 } if (l->getParent() != nullptr) {
2701 // If we have a parent, then we can continue to live as long as it does.
2702 return NO_ERROR;
2703 }
2704 return removeLayer(l);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002705}
2706
2707// ---------------------------------------------------------------------------
2708
2709void SurfaceFlinger::onInitializeDisplays() {
2710 // reset screen orientation and use primary layer stack
2711 Vector<ComposerState> state;
2712 Vector<DisplayState> displays;
2713 DisplayState d;
2714 d.what = DisplayState::eDisplayProjectionChanged |
2715 DisplayState::eLayerStackChanged;
2716 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2717 d.layerStack = 0;
2718 d.orientation = DisplayState::eOrientationDefault;
2719 d.frame.makeInvalid();
2720 d.viewport.makeInvalid();
2721 d.width = 0;
2722 d.height = 0;
2723 displays.add(d);
2724 setTransactionState(state, displays, 0);
2725 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2726
2727 const nsecs_t period =
2728 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2729 mAnimFrameTracker.setDisplayRefreshPeriod(period);
2730}
2731
2732void SurfaceFlinger::initializeDisplays() {
2733 class MessageScreenInitialized : public MessageBase {
2734 SurfaceFlinger* flinger;
2735 public:
2736 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2737 virtual bool handler() {
2738 flinger->onInitializeDisplays();
2739 return true;
2740 }
2741 };
2742 sp<MessageBase> msg = new MessageScreenInitialized(this);
2743 postMessageAsync(msg); // we may be called from main thread, use async message
2744}
2745
2746void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2747 int mode) {
2748 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2749 this);
2750 int32_t type = hw->getDisplayType();
2751 int currentMode = hw->getPowerMode();
2752
2753 if (mode == currentMode) {
2754 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2755 return;
2756 }
2757
2758 hw->setPowerMode(mode);
2759 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2760 ALOGW("Trying to set power mode for virtual display");
2761 return;
2762 }
2763
2764 if (mInterceptor.isEnabled()) {
2765 Mutex::Autolock _l(mStateLock);
2766 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2767 if (idx < 0) {
2768 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2769 return;
2770 }
2771 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2772 }
2773
2774 if (currentMode == HWC_POWER_MODE_OFF) {
2775 // Turn on the display
2776 getHwComposer().setPowerMode(type, mode);
2777 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2778 // FIXME: eventthread only knows about the main display right now
2779 mEventThread->onScreenAcquired();
2780 resyncToHardwareVsync(true);
2781 }
2782
2783 mVisibleRegionsDirty = true;
2784 mHasPoweredOff = true;
2785 repaintEverything();
2786
2787 struct sched_param param = {0};
2788 param.sched_priority = 1;
2789 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2790 ALOGW("Couldn't set SCHED_FIFO on display on");
2791 }
2792 } else if (mode == HWC_POWER_MODE_OFF) {
2793 // Turn off the display
2794 struct sched_param param = {0};
2795 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2796 ALOGW("Couldn't set SCHED_OTHER on display off");
2797 }
2798
2799 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2800 disableHardwareVsync(true); // also cancels any in-progress resync
2801
2802 // FIXME: eventthread only knows about the main display right now
2803 mEventThread->onScreenReleased();
2804 }
2805
2806 getHwComposer().setPowerMode(type, mode);
2807 mVisibleRegionsDirty = true;
2808 // from this point on, SF will stop drawing on this display
2809 } else {
2810 getHwComposer().setPowerMode(type, mode);
2811 }
2812}
2813
2814void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2815 class MessageSetPowerMode: public MessageBase {
2816 SurfaceFlinger& mFlinger;
2817 sp<IBinder> mDisplay;
2818 int mMode;
2819 public:
2820 MessageSetPowerMode(SurfaceFlinger& flinger,
2821 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2822 mDisplay(disp) { mMode = mode; }
2823 virtual bool handler() {
2824 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2825 if (hw == NULL) {
2826 ALOGE("Attempt to set power mode = %d for null display %p",
2827 mMode, mDisplay.get());
2828 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2829 ALOGW("Attempt to set power mode = %d for virtual display",
2830 mMode);
2831 } else {
2832 mFlinger.setPowerModeInternal(hw, mMode);
2833 }
2834 return true;
2835 }
2836 };
2837 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2838 postMessageSync(msg);
2839}
2840
2841// ---------------------------------------------------------------------------
2842
2843status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2844{
2845 String8 result;
2846
2847 IPCThreadState* ipc = IPCThreadState::self();
2848 const int pid = ipc->getCallingPid();
2849 const int uid = ipc->getCallingUid();
2850 if ((uid != AID_SHELL) &&
2851 !PermissionCache::checkPermission(sDump, pid, uid)) {
2852 result.appendFormat("Permission Denial: "
2853 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2854 } else {
2855 // Try to get the main lock, but give up after one second
2856 // (this would indicate SF is stuck, but we want to be able to
2857 // print something in dumpsys).
2858 status_t err = mStateLock.timedLock(s2ns(1));
2859 bool locked = (err == NO_ERROR);
2860 if (!locked) {
2861 result.appendFormat(
2862 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2863 "dumping anyways (no locks held)\n", strerror(-err), err);
2864 }
2865
2866 bool dumpAll = true;
2867 size_t index = 0;
2868 size_t numArgs = args.size();
2869 if (numArgs) {
2870 if ((index < numArgs) &&
2871 (args[index] == String16("--list"))) {
2872 index++;
2873 listLayersLocked(args, index, result);
2874 dumpAll = false;
2875 }
2876
2877 if ((index < numArgs) &&
2878 (args[index] == String16("--latency"))) {
2879 index++;
2880 dumpStatsLocked(args, index, result);
2881 dumpAll = false;
2882 }
2883
2884 if ((index < numArgs) &&
2885 (args[index] == String16("--latency-clear"))) {
2886 index++;
2887 clearStatsLocked(args, index, result);
2888 dumpAll = false;
2889 }
2890
2891 if ((index < numArgs) &&
2892 (args[index] == String16("--dispsync"))) {
2893 index++;
2894 mPrimaryDispSync.dump(result);
2895 dumpAll = false;
2896 }
2897
2898 if ((index < numArgs) &&
2899 (args[index] == String16("--static-screen"))) {
2900 index++;
2901 dumpStaticScreenStats(result);
2902 dumpAll = false;
2903 }
2904
2905 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07002906 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002907 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07002908 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002909 dumpAll = false;
2910 }
2911 }
2912
2913 if (dumpAll) {
2914 dumpAllLocked(args, index, result);
2915 }
2916
2917 if (locked) {
2918 mStateLock.unlock();
2919 }
2920 }
2921 write(fd, result.string(), result.size());
2922 return NO_ERROR;
2923}
2924
2925void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2926 size_t& /* index */, String8& result) const
2927{
Robert Carr2047fae2016-11-28 14:09:09 -08002928 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002929 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08002930 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002931}
2932
2933void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2934 String8& result) const
2935{
2936 String8 name;
2937 if (index < args.size()) {
2938 name = String8(args[index]);
2939 index++;
2940 }
2941
2942 const nsecs_t period =
2943 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2944 result.appendFormat("%" PRId64 "\n", period);
2945
2946 if (name.isEmpty()) {
2947 mAnimFrameTracker.dumpStats(result);
2948 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08002949 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002950 if (name == layer->getName()) {
2951 layer->dumpFrameStats(result);
2952 }
Robert Carr2047fae2016-11-28 14:09:09 -08002953 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002954 }
2955}
2956
2957void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
2958 String8& /* result */)
2959{
2960 String8 name;
2961 if (index < args.size()) {
2962 name = String8(args[index]);
2963 index++;
2964 }
2965
Robert Carr2047fae2016-11-28 14:09:09 -08002966 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002967 if (name.isEmpty() || (name == layer->getName())) {
2968 layer->clearFrameStats();
2969 }
Robert Carr2047fae2016-11-28 14:09:09 -08002970 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002971
2972 mAnimFrameTracker.clearStats();
2973}
2974
2975// This should only be called from the main thread. Otherwise it would need
2976// the lock and should use mCurrentState rather than mDrawingState.
2977void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08002978 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002979 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08002980 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002981
2982 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
2983}
2984
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002985void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002986{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002987 result.append(" [sf");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002988#ifdef HAS_CONTEXT_PRIORITY
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002989 result.append(" HAS_CONTEXT_PRIORITY");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002990#endif
2991#ifdef NEVER_DEFAULT_TO_ASYNC_MODE
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002992 result.append(" NEVER_DEFAULT_TO_ASYNC_MODE");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002993#endif
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002994 if (isLayerTripleBufferingDisabled())
2995 result.append(" DISABLE_TRIPLE_BUFFERING");
2996 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002997}
2998
2999void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3000{
3001 result.appendFormat("Static screen stats:\n");
3002 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3003 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3004 float percent = 100.0f *
3005 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3006 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3007 b + 1, bucketTimeSec, percent);
3008 }
3009 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3010 float percent = 100.0f *
3011 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3012 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3013 NUM_BUCKETS - 1, bucketTimeSec, percent);
3014}
3015
Brian Andersond6927fb2016-07-23 23:37:30 -07003016void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3017 result.appendFormat("Layer frame timestamps:\n");
3018
3019 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3020 const size_t count = currentLayers.size();
3021 for (size_t i=0 ; i<count ; i++) {
3022 currentLayers[i]->dumpFrameEvents(result);
3023 }
3024}
3025
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003026void SurfaceFlinger::recordBufferingStats(const char* layerName,
3027 std::vector<OccupancyTracker::Segment>&& history) {
3028 Mutex::Autolock lock(mBufferingStatsMutex);
3029 auto& stats = mBufferingStats[layerName];
3030 for (const auto& segment : history) {
3031 if (!segment.usedThirdBuffer) {
3032 stats.twoBufferTime += segment.totalTime;
3033 }
3034 if (segment.occupancyAverage < 1.0f) {
3035 stats.doubleBufferedTime += segment.totalTime;
3036 } else if (segment.occupancyAverage < 2.0f) {
3037 stats.tripleBufferedTime += segment.totalTime;
3038 }
3039 ++stats.numSegments;
3040 stats.totalTime += segment.totalTime;
3041 }
3042}
3043
3044void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3045 result.append("Buffering stats:\n");
3046 result.append(" [Layer name] <Active time> <Two buffer> "
3047 "<Double buffered> <Triple buffered>\n");
3048 Mutex::Autolock lock(mBufferingStatsMutex);
3049 typedef std::tuple<std::string, float, float, float> BufferTuple;
3050 std::map<float, BufferTuple, std::greater<float>> sorted;
3051 for (const auto& statsPair : mBufferingStats) {
3052 const char* name = statsPair.first.c_str();
3053 const BufferingStats& stats = statsPair.second;
3054 if (stats.numSegments == 0) {
3055 continue;
3056 }
3057 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3058 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3059 stats.totalTime;
3060 float doubleBufferRatio = static_cast<float>(
3061 stats.doubleBufferedTime) / stats.totalTime;
3062 float tripleBufferRatio = static_cast<float>(
3063 stats.tripleBufferedTime) / stats.totalTime;
3064 sorted.insert({activeTime, {name, twoBufferRatio,
3065 doubleBufferRatio, tripleBufferRatio}});
3066 }
3067 for (const auto& sortedPair : sorted) {
3068 float activeTime = sortedPair.first;
3069 const BufferTuple& values = sortedPair.second;
3070 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3071 std::get<0>(values).c_str(), activeTime,
3072 std::get<1>(values), std::get<2>(values),
3073 std::get<3>(values));
3074 }
3075 result.append("\n");
3076}
3077
3078void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3079 String8& result) const
3080{
3081 bool colorize = false;
3082 if (index < args.size()
3083 && (args[index] == String16("--color"))) {
3084 colorize = true;
3085 index++;
3086 }
3087
3088 Colorizer colorizer(colorize);
3089
3090 // figure out if we're stuck somewhere
3091 const nsecs_t now = systemTime();
3092 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3093 const nsecs_t inTransaction(mDebugInTransaction);
3094 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3095 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3096
3097 /*
3098 * Dump library configuration.
3099 */
3100
3101 colorizer.bold(result);
3102 result.append("Build configuration:");
3103 colorizer.reset(result);
3104 appendSfConfigString(result);
3105 appendUiConfigString(result);
3106 appendGuiConfigString(result);
3107 result.append("\n");
3108
3109 colorizer.bold(result);
3110 result.append("Sync configuration: ");
3111 colorizer.reset(result);
3112 result.append(SyncFeatures::getInstance().toString());
3113 result.append("\n");
3114
3115 colorizer.bold(result);
3116 result.append("DispSync configuration: ");
3117 colorizer.reset(result);
3118 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
3119 "present offset %d ns (refresh %" PRId64 " ns)",
3120 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, PRESENT_TIME_OFFSET_FROM_VSYNC_NS,
3121 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3122 result.append("\n");
3123
3124 // Dump static screen stats
3125 result.append("\n");
3126 dumpStaticScreenStats(result);
3127 result.append("\n");
3128
3129 dumpBufferingStats(result);
3130
3131 /*
3132 * Dump the visible layer list
3133 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003134 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003135 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003136 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003137 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003138 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003139 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003140
3141 /*
3142 * Dump Display state
3143 */
3144
3145 colorizer.bold(result);
3146 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3147 colorizer.reset(result);
3148 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3149 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3150 hw->dump(result);
3151 }
3152
3153 /*
3154 * Dump SurfaceFlinger global state
3155 */
3156
3157 colorizer.bold(result);
3158 result.append("SurfaceFlinger global state:\n");
3159 colorizer.reset(result);
3160
3161 HWComposer& hwc(getHwComposer());
3162 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3163
3164 colorizer.bold(result);
3165 result.appendFormat("EGL implementation : %s\n",
3166 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3167 colorizer.reset(result);
3168 result.appendFormat("%s\n",
3169 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3170
3171 mRenderEngine->dump(result);
3172
3173 hw->undefinedRegion.dump(result, "undefinedRegion");
3174 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3175 hw->getOrientation(), hw->isDisplayOn());
3176 result.appendFormat(
3177 " last eglSwapBuffers() time: %f us\n"
3178 " last transaction time : %f us\n"
3179 " transaction-flags : %08x\n"
3180 " refresh-rate : %f fps\n"
3181 " x-dpi : %f\n"
3182 " y-dpi : %f\n"
3183 " gpu_to_cpu_unsupported : %d\n"
3184 ,
3185 mLastSwapBufferTime/1000.0,
3186 mLastTransactionTime/1000.0,
3187 mTransactionFlags,
3188 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3189 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3190 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3191 !mGpuToCpuSupported);
3192
3193 result.appendFormat(" eglSwapBuffers time: %f us\n",
3194 inSwapBuffersDuration/1000.0);
3195
3196 result.appendFormat(" transaction time: %f us\n",
3197 inTransactionDuration/1000.0);
3198
3199 /*
3200 * VSYNC state
3201 */
3202 mEventThread->dump(result);
3203
3204 /*
3205 * Dump HWComposer state
3206 */
3207 colorizer.bold(result);
3208 result.append("h/w composer state:\n");
3209 colorizer.reset(result);
3210 result.appendFormat(" h/w composer %s and %s\n",
3211 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3212 (mDebugDisableHWC || mDebugRegion || mDaltonize
3213 || mHasColorMatrix) ? "disabled" : "enabled");
3214 hwc.dump(result);
3215
3216 /*
3217 * Dump gralloc state
3218 */
3219 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3220 alloc.dump(result);
3221}
3222
3223const Vector< sp<Layer> >&
3224SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3225 // Note: mStateLock is held here
3226 wp<IBinder> dpy;
3227 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3228 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3229 dpy = mDisplays.keyAt(i);
3230 break;
3231 }
3232 }
3233 if (dpy == NULL) {
3234 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3235 // Just use the primary display so we have something to return
3236 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3237 }
3238 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
3239}
3240
3241bool SurfaceFlinger::startDdmConnection()
3242{
3243 void* libddmconnection_dso =
3244 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3245 if (!libddmconnection_dso) {
3246 return false;
3247 }
3248 void (*DdmConnection_start)(const char* name);
3249 DdmConnection_start =
3250 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3251 if (!DdmConnection_start) {
3252 dlclose(libddmconnection_dso);
3253 return false;
3254 }
3255 (*DdmConnection_start)(getServiceName());
3256 return true;
3257}
3258
3259status_t SurfaceFlinger::onTransact(
3260 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3261{
3262 switch (code) {
3263 case CREATE_CONNECTION:
3264 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003265 case BOOT_FINISHED:
3266 case CLEAR_ANIMATION_FRAME_STATS:
3267 case GET_ANIMATION_FRAME_STATS:
3268 case SET_POWER_MODE:
3269 case GET_HDR_CAPABILITIES:
3270 {
3271 // codes that require permission check
3272 IPCThreadState* ipc = IPCThreadState::self();
3273 const int pid = ipc->getCallingPid();
3274 const int uid = ipc->getCallingUid();
3275 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3276 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3277 ALOGE("Permission Denial: "
3278 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3279 return PERMISSION_DENIED;
3280 }
3281 break;
3282 }
Robert Carr1db73f62016-12-21 12:58:51 -08003283 /*
3284 * Calling setTransactionState is safe, because you need to have been
3285 * granted a reference to Client* and Handle* to do anything with it.
3286 *
3287 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3288 */
3289 case SET_TRANSACTION_STATE:
3290 case CREATE_SCOPED_CONNECTION:
3291 {
3292 break;
3293 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003294 case CAPTURE_SCREEN:
3295 {
3296 // codes that require permission check
3297 IPCThreadState* ipc = IPCThreadState::self();
3298 const int pid = ipc->getCallingPid();
3299 const int uid = ipc->getCallingUid();
3300 if ((uid != AID_GRAPHICS) &&
3301 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3302 ALOGE("Permission Denial: "
3303 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3304 return PERMISSION_DENIED;
3305 }
3306 break;
3307 }
3308 }
3309
3310 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3311 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3312 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3313 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3314 IPCThreadState* ipc = IPCThreadState::self();
3315 const int pid = ipc->getCallingPid();
3316 const int uid = ipc->getCallingUid();
3317 ALOGE("Permission Denial: "
3318 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3319 return PERMISSION_DENIED;
3320 }
3321 int n;
3322 switch (code) {
3323 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3324 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3325 return NO_ERROR;
3326 case 1002: // SHOW_UPDATES
3327 n = data.readInt32();
3328 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3329 invalidateHwcGeometry();
3330 repaintEverything();
3331 return NO_ERROR;
3332 case 1004:{ // repaint everything
3333 repaintEverything();
3334 return NO_ERROR;
3335 }
3336 case 1005:{ // force transaction
3337 setTransactionFlags(
3338 eTransactionNeeded|
3339 eDisplayTransactionNeeded|
3340 eTraversalNeeded);
3341 return NO_ERROR;
3342 }
3343 case 1006:{ // send empty update
3344 signalRefresh();
3345 return NO_ERROR;
3346 }
3347 case 1008: // toggle use of hw composer
3348 n = data.readInt32();
3349 mDebugDisableHWC = n ? 1 : 0;
3350 invalidateHwcGeometry();
3351 repaintEverything();
3352 return NO_ERROR;
3353 case 1009: // toggle use of transform hint
3354 n = data.readInt32();
3355 mDebugDisableTransformHint = n ? 1 : 0;
3356 invalidateHwcGeometry();
3357 repaintEverything();
3358 return NO_ERROR;
3359 case 1010: // interrogate.
3360 reply->writeInt32(0);
3361 reply->writeInt32(0);
3362 reply->writeInt32(mDebugRegion);
3363 reply->writeInt32(0);
3364 reply->writeInt32(mDebugDisableHWC);
3365 return NO_ERROR;
3366 case 1013: {
3367 Mutex::Autolock _l(mStateLock);
3368 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3369 reply->writeInt32(hw->getPageFlipCount());
3370 return NO_ERROR;
3371 }
3372 case 1014: {
3373 // daltonize
3374 n = data.readInt32();
3375 switch (n % 10) {
3376 case 1:
3377 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3378 break;
3379 case 2:
3380 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3381 break;
3382 case 3:
3383 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3384 break;
3385 }
3386 if (n >= 10) {
3387 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3388 } else {
3389 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3390 }
3391 mDaltonize = n > 0;
3392 invalidateHwcGeometry();
3393 repaintEverything();
3394 return NO_ERROR;
3395 }
3396 case 1015: {
3397 // apply a color matrix
3398 n = data.readInt32();
3399 mHasColorMatrix = n ? 1 : 0;
3400 if (n) {
3401 // color matrix is sent as mat3 matrix followed by vec3
3402 // offset, then packed into a mat4 where the last row is
3403 // the offset and extra values are 0
3404 for (size_t i = 0 ; i < 4; i++) {
3405 for (size_t j = 0; j < 4; j++) {
3406 mColorMatrix[i][j] = data.readFloat();
3407 }
3408 }
3409 } else {
3410 mColorMatrix = mat4();
3411 }
3412 invalidateHwcGeometry();
3413 repaintEverything();
3414 return NO_ERROR;
3415 }
3416 // This is an experimental interface
3417 // Needs to be shifted to proper binder interface when we productize
3418 case 1016: {
3419 n = data.readInt32();
3420 mPrimaryDispSync.setRefreshSkipCount(n);
3421 return NO_ERROR;
3422 }
3423 case 1017: {
3424 n = data.readInt32();
3425 mForceFullDamage = static_cast<bool>(n);
3426 return NO_ERROR;
3427 }
3428 case 1018: { // Modify Choreographer's phase offset
3429 n = data.readInt32();
3430 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3431 return NO_ERROR;
3432 }
3433 case 1019: { // Modify SurfaceFlinger's phase offset
3434 n = data.readInt32();
3435 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3436 return NO_ERROR;
3437 }
3438 case 1020: { // Layer updates interceptor
3439 n = data.readInt32();
3440 if (n) {
3441 ALOGV("Interceptor enabled");
3442 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3443 }
3444 else{
3445 ALOGV("Interceptor disabled");
3446 mInterceptor.disable();
3447 }
3448 return NO_ERROR;
3449 }
3450 case 1021: { // Disable HWC virtual displays
3451 n = data.readInt32();
3452 mUseHwcVirtualDisplays = !n;
3453 return NO_ERROR;
3454 }
3455 }
3456 }
3457 return err;
3458}
3459
3460void SurfaceFlinger::repaintEverything() {
3461 android_atomic_or(1, &mRepaintEverything);
3462 signalTransaction();
3463}
3464
3465// ---------------------------------------------------------------------------
3466// Capture screen into an IGraphiBufferProducer
3467// ---------------------------------------------------------------------------
3468
3469/* The code below is here to handle b/8734824
3470 *
3471 * We create a IGraphicBufferProducer wrapper that forwards all calls
3472 * from the surfaceflinger thread to the calling binder thread, where they
3473 * are executed. This allows the calling thread in the calling process to be
3474 * reused and not depend on having "enough" binder threads to handle the
3475 * requests.
3476 */
3477class GraphicProducerWrapper : public BBinder, public MessageHandler {
3478 /* Parts of GraphicProducerWrapper are run on two different threads,
3479 * communicating by sending messages via Looper but also by shared member
3480 * data. Coherence maintenance is subtle and in places implicit (ugh).
3481 *
3482 * Don't rely on Looper's sendMessage/handleMessage providing
3483 * release/acquire semantics for any data not actually in the Message.
3484 * Data going from surfaceflinger to binder threads needs to be
3485 * synchronized explicitly.
3486 *
3487 * Barrier open/wait do provide release/acquire semantics. This provides
3488 * implicit synchronization for data coming back from binder to
3489 * surfaceflinger threads.
3490 */
3491
3492 sp<IGraphicBufferProducer> impl;
3493 sp<Looper> looper;
3494 status_t result;
3495 bool exitPending;
3496 bool exitRequested;
3497 Barrier barrier;
3498 uint32_t code;
3499 Parcel const* data;
3500 Parcel* reply;
3501
3502 enum {
3503 MSG_API_CALL,
3504 MSG_EXIT
3505 };
3506
3507 /*
3508 * Called on surfaceflinger thread. This is called by our "fake"
3509 * BpGraphicBufferProducer. We package the data and reply Parcel and
3510 * forward them to the binder thread.
3511 */
3512 virtual status_t transact(uint32_t code,
3513 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3514 this->code = code;
3515 this->data = &data;
3516 this->reply = reply;
3517 if (exitPending) {
3518 // if we've exited, we run the message synchronously right here.
3519 // note (JH): as far as I can tell from looking at the code, this
3520 // never actually happens. if it does, i'm not sure if it happens
3521 // on the surfaceflinger or binder thread.
3522 handleMessage(Message(MSG_API_CALL));
3523 } else {
3524 barrier.close();
3525 // Prevent stores to this->{code, data, reply} from being
3526 // reordered later than the construction of Message.
3527 atomic_thread_fence(memory_order_release);
3528 looper->sendMessage(this, Message(MSG_API_CALL));
3529 barrier.wait();
3530 }
3531 return result;
3532 }
3533
3534 /*
3535 * here we run on the binder thread. All we've got to do is
3536 * call the real BpGraphicBufferProducer.
3537 */
3538 virtual void handleMessage(const Message& message) {
3539 int what = message.what;
3540 // Prevent reads below from happening before the read from Message
3541 atomic_thread_fence(memory_order_acquire);
3542 if (what == MSG_API_CALL) {
3543 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3544 barrier.open();
3545 } else if (what == MSG_EXIT) {
3546 exitRequested = true;
3547 }
3548 }
3549
3550public:
3551 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3552 : impl(impl),
3553 looper(new Looper(true)),
3554 result(NO_ERROR),
3555 exitPending(false),
3556 exitRequested(false),
3557 code(0),
3558 data(NULL),
3559 reply(NULL)
3560 {}
3561
3562 // Binder thread
3563 status_t waitForResponse() {
3564 do {
3565 looper->pollOnce(-1);
3566 } while (!exitRequested);
3567 return result;
3568 }
3569
3570 // Client thread
3571 void exit(status_t result) {
3572 this->result = result;
3573 exitPending = true;
3574 // Ensure this->result is visible to the binder thread before it
3575 // handles the message.
3576 atomic_thread_fence(memory_order_release);
3577 looper->sendMessage(this, Message(MSG_EXIT));
3578 }
3579};
3580
3581
3582status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3583 const sp<IGraphicBufferProducer>& producer,
3584 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003585 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003586 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3587
3588 if (CC_UNLIKELY(display == 0))
3589 return BAD_VALUE;
3590
3591 if (CC_UNLIKELY(producer == 0))
3592 return BAD_VALUE;
3593
3594 // if we have secure windows on this display, never allow the screen capture
3595 // unless the producer interface is local (i.e.: we can take a screenshot for
3596 // ourselves).
3597 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3598
3599 // Convert to surfaceflinger's internal rotation type.
3600 Transform::orientation_flags rotationFlags;
3601 switch (rotation) {
3602 case ISurfaceComposer::eRotateNone:
3603 rotationFlags = Transform::ROT_0;
3604 break;
3605 case ISurfaceComposer::eRotate90:
3606 rotationFlags = Transform::ROT_90;
3607 break;
3608 case ISurfaceComposer::eRotate180:
3609 rotationFlags = Transform::ROT_180;
3610 break;
3611 case ISurfaceComposer::eRotate270:
3612 rotationFlags = Transform::ROT_270;
3613 break;
3614 default:
3615 rotationFlags = Transform::ROT_0;
3616 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3617 break;
3618 }
3619
3620 class MessageCaptureScreen : public MessageBase {
3621 SurfaceFlinger* flinger;
3622 sp<IBinder> display;
3623 sp<IGraphicBufferProducer> producer;
3624 Rect sourceCrop;
3625 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003626 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003627 bool useIdentityTransform;
3628 Transform::orientation_flags rotation;
3629 status_t result;
3630 bool isLocalScreenshot;
3631 public:
3632 MessageCaptureScreen(SurfaceFlinger* flinger,
3633 const sp<IBinder>& display,
3634 const sp<IGraphicBufferProducer>& producer,
3635 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003636 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003637 bool useIdentityTransform,
3638 Transform::orientation_flags rotation,
3639 bool isLocalScreenshot)
3640 : flinger(flinger), display(display), producer(producer),
3641 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3642 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3643 useIdentityTransform(useIdentityTransform),
3644 rotation(rotation), result(PERMISSION_DENIED),
3645 isLocalScreenshot(isLocalScreenshot)
3646 {
3647 }
3648 status_t getResult() const {
3649 return result;
3650 }
3651 virtual bool handler() {
3652 Mutex::Autolock _l(flinger->mStateLock);
3653 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3654 result = flinger->captureScreenImplLocked(hw, producer,
3655 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3656 useIdentityTransform, rotation, isLocalScreenshot);
3657 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3658 return true;
3659 }
3660 };
3661
3662 // this creates a "fake" BBinder which will serve as a "fake" remote
3663 // binder to receive the marshaled calls and forward them to the
3664 // real remote (a BpGraphicBufferProducer)
3665 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3666
3667 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3668 // which does the marshaling work forwards to our "fake remote" above.
3669 sp<MessageBase> msg = new MessageCaptureScreen(this,
3670 display, IGraphicBufferProducer::asInterface( wrapper ),
3671 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3672 useIdentityTransform, rotationFlags, isLocalScreenshot);
3673
3674 status_t res = postMessageAsync(msg);
3675 if (res == NO_ERROR) {
3676 res = wrapper->waitForResponse();
3677 }
3678 return res;
3679}
3680
3681
3682void SurfaceFlinger::renderScreenImplLocked(
3683 const sp<const DisplayDevice>& hw,
3684 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003685 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003686 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3687{
3688 ATRACE_CALL();
3689 RenderEngine& engine(getRenderEngine());
3690
3691 // get screen geometry
3692 const int32_t hw_w = hw->getWidth();
3693 const int32_t hw_h = hw->getHeight();
3694 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3695 static_cast<int32_t>(reqHeight) != hw_h;
3696
3697 // if a default or invalid sourceCrop is passed in, set reasonable values
3698 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3699 !sourceCrop.isValid()) {
3700 sourceCrop.setLeftTop(Point(0, 0));
3701 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3702 }
3703
3704 // ensure that sourceCrop is inside screen
3705 if (sourceCrop.left < 0) {
3706 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3707 }
3708 if (sourceCrop.right > hw_w) {
3709 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3710 }
3711 if (sourceCrop.top < 0) {
3712 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3713 }
3714 if (sourceCrop.bottom > hw_h) {
3715 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3716 }
3717
3718 // make sure to clear all GL error flags
3719 engine.checkErrors();
3720
3721 // set-up our viewport
3722 engine.setViewportAndProjection(
3723 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3724 engine.disableTexturing();
3725
3726 // redraw the screen entirely...
3727 engine.clearWithColor(0, 0, 0, 1);
3728
Robert Carr1f0a16a2016-10-24 16:27:39 -07003729 // We loop through the first level of layers without traversing,
3730 // as we need to interpret min/max layer Z in the top level Z space.
3731 for (const auto& layer : mDrawingState.layersSortedByZ) {
3732 if (layer->getLayerStack() != hw->getLayerStack()) {
3733 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003734 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003735 const Layer::State& state(layer->getDrawingState());
3736 if (state.z < minLayerZ || state.z > maxLayerZ) {
3737 continue;
3738 }
3739 layer->traverseInZOrder([&](Layer* layer) {
3740 if (!layer->isVisible()) {
3741 return;
3742 }
3743 if (filtering) layer->setFiltering(true);
3744 layer->draw(hw, useIdentityTransform);
3745 if (filtering) layer->setFiltering(false);
3746 });
3747 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003748
3749 // compositionComplete is needed for older driver
3750 hw->compositionComplete();
3751 hw->setViewportAndProjection();
3752}
3753
3754
3755status_t SurfaceFlinger::captureScreenImplLocked(
3756 const sp<const DisplayDevice>& hw,
3757 const sp<IGraphicBufferProducer>& producer,
3758 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003759 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003760 bool useIdentityTransform, Transform::orientation_flags rotation,
3761 bool isLocalScreenshot)
3762{
3763 ATRACE_CALL();
3764
3765 // get screen geometry
3766 uint32_t hw_w = hw->getWidth();
3767 uint32_t hw_h = hw->getHeight();
3768
3769 if (rotation & Transform::ROT_90) {
3770 std::swap(hw_w, hw_h);
3771 }
3772
3773 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3774 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3775 reqWidth, reqHeight, hw_w, hw_h);
3776 return BAD_VALUE;
3777 }
3778
3779 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3780 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3781
3782 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003783 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003784 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003785 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3786 (state.z < minLayerZ || state.z > maxLayerZ)) {
3787 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003788 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003789 layer->traverseInZOrder([&](Layer *layer) {
3790 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3791 layer->isSecure());
3792 });
3793 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003794
3795 if (!isLocalScreenshot && secureLayerIsVisible) {
3796 ALOGW("FB is protected: PERMISSION_DENIED");
3797 return PERMISSION_DENIED;
3798 }
3799
3800 // create a surface (because we're a producer, and we need to
3801 // dequeue/queue a buffer)
3802 sp<Surface> sur = new Surface(producer, false);
3803 ANativeWindow* window = sur.get();
3804
3805 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3806 if (result == NO_ERROR) {
3807 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3808 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3809
3810 int err = 0;
3811 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3812 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3813 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3814 err |= native_window_set_usage(window, usage);
3815
3816 if (err == NO_ERROR) {
3817 ANativeWindowBuffer* buffer;
3818 /* TODO: Once we have the sync framework everywhere this can use
3819 * server-side waits on the fence that dequeueBuffer returns.
3820 */
3821 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3822 if (result == NO_ERROR) {
3823 int syncFd = -1;
3824 // create an EGLImage from the buffer so we can later
3825 // turn it into a texture
3826 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3827 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3828 if (image != EGL_NO_IMAGE_KHR) {
3829 // this binds the given EGLImage as a framebuffer for the
3830 // duration of this scope.
3831 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3832 if (imageBond.getStatus() == NO_ERROR) {
3833 // this will in fact render into our dequeued buffer
3834 // via an FBO, which means we didn't have to create
3835 // an EGLSurface and therefore we're not
3836 // dependent on the context's EGLConfig.
3837 renderScreenImplLocked(
3838 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3839 useIdentityTransform, rotation);
3840
3841 // Attempt to create a sync khr object that can produce a sync point. If that
3842 // isn't available, create a non-dupable sync object in the fallback path and
3843 // wait on it directly.
3844 EGLSyncKHR sync;
3845 if (!DEBUG_SCREENSHOTS) {
3846 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3847 // native fence fd will not be populated until flush() is done.
3848 getRenderEngine().flush();
3849 } else {
3850 sync = EGL_NO_SYNC_KHR;
3851 }
3852 if (sync != EGL_NO_SYNC_KHR) {
3853 // get the sync fd
3854 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3855 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3856 ALOGW("captureScreen: failed to dup sync khr object");
3857 syncFd = -1;
3858 }
3859 eglDestroySyncKHR(mEGLDisplay, sync);
3860 } else {
3861 // fallback path
3862 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3863 if (sync != EGL_NO_SYNC_KHR) {
3864 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3865 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3866 EGLint eglErr = eglGetError();
3867 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3868 ALOGW("captureScreen: fence wait timed out");
3869 } else {
3870 ALOGW_IF(eglErr != EGL_SUCCESS,
3871 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3872 }
3873 eglDestroySyncKHR(mEGLDisplay, sync);
3874 } else {
3875 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3876 }
3877 }
3878 if (DEBUG_SCREENSHOTS) {
3879 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3880 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3881 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3882 hw, minLayerZ, maxLayerZ);
3883 delete [] pixels;
3884 }
3885
3886 } else {
3887 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3888 result = INVALID_OPERATION;
3889 window->cancelBuffer(window, buffer, syncFd);
3890 buffer = NULL;
3891 }
3892 // destroy our image
3893 eglDestroyImageKHR(mEGLDisplay, image);
3894 } else {
3895 result = BAD_VALUE;
3896 }
3897 if (buffer) {
3898 // queueBuffer takes ownership of syncFd
3899 result = window->queueBuffer(window, buffer, syncFd);
3900 }
3901 }
3902 } else {
3903 result = BAD_VALUE;
3904 }
3905 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3906 }
3907
3908 return result;
3909}
3910
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003911void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08003912 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003913 if (DEBUG_SCREENSHOTS) {
3914 for (size_t y=0 ; y<h ; y++) {
3915 uint32_t const * p = (uint32_t const *)vaddr + y*s;
3916 for (size_t x=0 ; x<w ; x++) {
3917 if (p[x] != 0xFF000000) return;
3918 }
3919 }
3920 ALOGE("*** we just took a black screenshot ***\n"
3921 "requested minz=%d, maxz=%d, layerStack=%d",
3922 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08003923 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003924 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003925 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003926 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
3927 state.z <= maxLayerZ) {
3928 layer->traverseInZOrder([&](Layer* layer) {
3929 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3930 layer->isVisible() ? '+' : '-',
3931 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003932 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003933 i++;
3934 });
3935 }
3936 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003937 }
3938}
3939
3940// ---------------------------------------------------------------------------
3941
Robert Carr2047fae2016-11-28 14:09:09 -08003942void SurfaceFlinger::State::traverseInZOrder(const std::function<void(Layer*)>& consume) const {
3943 layersSortedByZ.traverseInZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003944}
3945
Robert Carr2047fae2016-11-28 14:09:09 -08003946void SurfaceFlinger::State::traverseInReverseZOrder(const std::function<void(Layer*)>& consume) const {
3947 layersSortedByZ.traverseInReverseZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003948}
3949
3950}; // namespace android
3951
3952
3953#if defined(__gl_h_)
3954#error "don't include gl/gl.h in this file"
3955#endif
3956
3957#if defined(__gl2_h_)
3958#error "don't include gl2/gl2.h in this file"
3959#endif