blob: dae03b3c25b5b36fb7916cbedcbceb9ab1c29e55 [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 Sanglardc93afd52017-03-13 13:02:42 -0700113bool SurfaceFlinger::useContextPriority;
Fabien Sanglardc45a7d92017-03-14 13:24:22 -0700114int64_t SurfaceFlinger::dispSyncPresentTimeOffset;
Fabien Sanglarda34ed632017-03-14 11:43:52 -0700115bool SurfaceFlinger::useHwcForRgbToYuv;
Fabien Sanglardc8e387e2017-03-10 10:30:28 -0800116uint64_t SurfaceFlinger::maxVirtualDisplaySize;
Fabien Sanglardcbf153b2017-03-10 17:57:12 -0800117bool SurfaceFlinger::hasSyncFramework;
Fabien Sanglard1971b632017-03-10 14:50:03 -0800118int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000119
120SurfaceFlinger::SurfaceFlinger()
121 : BnSurfaceComposer(),
122 mTransactionFlags(0),
123 mTransactionPending(false),
124 mAnimTransactionPending(false),
125 mLayersRemoved(false),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700126 mLayersAdded(false),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000127 mRepaintEverything(0),
128 mRenderEngine(NULL),
129 mBootTime(systemTime()),
130 mVisibleRegionsDirty(false),
131 mHwWorkListDirty(false),
132 mAnimCompositionPending(false),
133 mDebugRegion(0),
134 mDebugDDMS(0),
135 mDebugDisableHWC(0),
136 mDebugDisableTransformHint(0),
137 mDebugInSwapBuffers(0),
138 mLastSwapBufferTime(0),
139 mDebugInTransaction(0),
140 mLastTransactionTime(0),
141 mBootFinished(false),
142 mForceFullDamage(false),
Robert Carr0d480722017-01-10 16:42:54 -0800143 mInterceptor(this),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000144 mPrimaryDispSync("PrimaryDispSync"),
145 mPrimaryHWVsyncEnabled(false),
146 mHWVsyncAvailable(false),
147 mDaltonize(false),
148 mHasColorMatrix(false),
149 mHasPoweredOff(false),
150 mFrameBuckets(),
151 mTotalTime(0),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700152 mLastSwapTime(0),
153 mNumLayers(0)
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000154{
Fabien Sanglardc8e387e2017-03-10 10:30:28 -0800155 ALOGI("SurfaceFlinger is starting");
156
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800157 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
158 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
159
160 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
161 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
162
Fabien Sanglardc8e387e2017-03-10 10:30:28 -0800163 maxVirtualDisplaySize = getUInt64<ISurfaceFlingerConfigs,
164 &ISurfaceFlingerConfigs::maxVirtualDisplaySize>(0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000165
Fabien Sanglardcbf153b2017-03-10 17:57:12 -0800166 hasSyncFramework = getBool< ISurfaceFlingerConfigs,
167 &ISurfaceFlingerConfigs::hasSyncFramework>(true);
168
Fabien Sanglardc93afd52017-03-13 13:02:42 -0700169 useContextPriority = getBool< ISurfaceFlingerConfigs,
170 &ISurfaceFlingerConfigs::useContextPriority>(false);
171
Fabien Sanglardc45a7d92017-03-14 13:24:22 -0700172 dispSyncPresentTimeOffset = getInt64< ISurfaceFlingerConfigs,
173 &ISurfaceFlingerConfigs::presentTimeOffsetFromVSyncNs>(0);
174
Fabien Sanglarda34ed632017-03-14 11:43:52 -0700175 useHwcForRgbToYuv = getBool< ISurfaceFlingerConfigs,
176 &ISurfaceFlingerConfigs::useHwcForRGBtoYUV>(false);
177
Fabien Sanglard1971b632017-03-10 14:50:03 -0800178 maxFrameBufferAcquiredBuffers = getInt64< ISurfaceFlingerConfigs,
179 &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2);
180
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000181 char value[PROPERTY_VALUE_MAX];
182
183 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
184 mGpuToCpuSupported = !atoi(value);
185
186 property_get("debug.sf.showupdates", value, "0");
187 mDebugRegion = atoi(value);
188
189 property_get("debug.sf.ddms", value, "0");
190 mDebugDDMS = atoi(value);
191 if (mDebugDDMS) {
192 if (!startDdmConnection()) {
193 // start failed, and DDMS debugging not enabled
194 mDebugDDMS = 0;
195 }
196 }
197 ALOGI_IF(mDebugRegion, "showupdates enabled");
198 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
199
Fabien Sanglard642b23d2017-02-09 12:29:39 -0800200 property_get("debug.sf.enable_hwc_vds", value, "0");
201 mUseHwcVirtualDisplays = atoi(value);
202 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800203
Fabien Sanglardc65dafa2017-02-07 14:06:39 -0800204 property_get("ro.sf.disable_triple_buffer", value, "1");
205 mLayerTripleBufferingDisabled = atoi(value);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800206 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000207}
208
209void SurfaceFlinger::onFirstRef()
210{
211 mEventQueue.init(this);
212}
213
214SurfaceFlinger::~SurfaceFlinger()
215{
216 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
217 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
218 eglTerminate(display);
219}
220
221void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
222{
223 // the window manager died on us. prepare its eulogy.
224
225 // restore initial conditions (default device unblank, etc)
226 initializeDisplays();
227
228 // restart the boot-animation
229 startBootAnim();
230}
231
Robert Carr1db73f62016-12-21 12:58:51 -0800232static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000233 status_t err = client->initCheck();
234 if (err == NO_ERROR) {
Robert Carr1db73f62016-12-21 12:58:51 -0800235 return client;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000236 }
Robert Carr1db73f62016-12-21 12:58:51 -0800237 return nullptr;
238}
239
240sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
241 return initClient(new Client(this));
242}
243
244sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
245 const sp<IGraphicBufferProducer>& gbp) {
246 if (authenticateSurfaceTexture(gbp) == false) {
247 return nullptr;
248 }
249 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
250 if (layer == nullptr) {
251 return nullptr;
252 }
253
254 return initClient(new Client(this, layer));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000255}
256
257sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
258 bool secure)
259{
260 class DisplayToken : public BBinder {
261 sp<SurfaceFlinger> flinger;
262 virtual ~DisplayToken() {
263 // no more references, this display must be terminated
264 Mutex::Autolock _l(flinger->mStateLock);
265 flinger->mCurrentState.displays.removeItem(this);
266 flinger->setTransactionFlags(eDisplayTransactionNeeded);
267 }
268 public:
269 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
270 : flinger(flinger) {
271 }
272 };
273
274 sp<BBinder> token = new DisplayToken(this);
275
276 Mutex::Autolock _l(mStateLock);
277 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
278 info.displayName = displayName;
279 mCurrentState.displays.add(token, info);
280 mInterceptor.saveDisplayCreation(info);
281 return token;
282}
283
284void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
285 Mutex::Autolock _l(mStateLock);
286
287 ssize_t idx = mCurrentState.displays.indexOfKey(display);
288 if (idx < 0) {
289 ALOGW("destroyDisplay: invalid display token");
290 return;
291 }
292
293 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
294 if (!info.isVirtualDisplay()) {
295 ALOGE("destroyDisplay called for non-virtual display");
296 return;
297 }
298 mInterceptor.saveDisplayDeletion(info.displayId);
299 mCurrentState.displays.removeItemsAt(idx);
300 setTransactionFlags(eDisplayTransactionNeeded);
301}
302
303void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
304 ALOGW_IF(mBuiltinDisplays[type],
305 "Overwriting display token for display type %d", type);
306 mBuiltinDisplays[type] = new BBinder();
307 // All non-virtual displays are currently considered secure.
308 DisplayDeviceState info(type, true);
309 mCurrentState.displays.add(mBuiltinDisplays[type], info);
310 mInterceptor.saveDisplayCreation(info);
311}
312
313sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
314 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
315 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
316 return NULL;
317 }
318 return mBuiltinDisplays[id];
319}
320
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000321void SurfaceFlinger::bootFinished()
322{
Wei Wangf9b05ee2017-07-19 20:59:39 -0700323 if (mStartPropertySetThread->join() != NO_ERROR) {
324 ALOGE("Join StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800325 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000326 const nsecs_t now = systemTime();
327 const nsecs_t duration = now - mBootTime;
328 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
329 mBootFinished = true;
330
331 // wait patiently for the window manager death
332 const String16 name("window");
333 sp<IBinder> window(defaultServiceManager()->getService(name));
334 if (window != 0) {
335 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
336 }
337
338 // stop boot animation
339 // formerly we would just kill the process, but we now ask it to exit so it
340 // can choose where to stop the animation.
341 property_set("service.bootanim.exit", "1");
342
343 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
344 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
345 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
346}
347
348void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
349 class MessageDestroyGLTexture : public MessageBase {
350 RenderEngine& engine;
351 uint32_t texture;
352 public:
353 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
354 : engine(engine), texture(texture) {
355 }
356 virtual bool handler() {
357 engine.deleteTextures(1, &texture);
358 return true;
359 }
360 };
361 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
362}
363
364class DispSyncSource : public VSyncSource, private DispSync::Callback {
365public:
366 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
367 const char* name) :
368 mName(name),
369 mValue(0),
370 mTraceVsync(traceVsync),
371 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
372 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
373 mDispSync(dispSync),
374 mCallbackMutex(),
375 mCallback(),
376 mVsyncMutex(),
377 mPhaseOffset(phaseOffset),
378 mEnabled(false) {}
379
380 virtual ~DispSyncSource() {}
381
382 virtual void setVSyncEnabled(bool enable) {
383 Mutex::Autolock lock(mVsyncMutex);
384 if (enable) {
385 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
386 static_cast<DispSync::Callback*>(this));
387 if (err != NO_ERROR) {
388 ALOGE("error registering vsync callback: %s (%d)",
389 strerror(-err), err);
390 }
391 //ATRACE_INT(mVsyncOnLabel.string(), 1);
392 } else {
393 status_t err = mDispSync->removeEventListener(
394 static_cast<DispSync::Callback*>(this));
395 if (err != NO_ERROR) {
396 ALOGE("error unregistering vsync callback: %s (%d)",
397 strerror(-err), err);
398 }
399 //ATRACE_INT(mVsyncOnLabel.string(), 0);
400 }
401 mEnabled = enable;
402 }
403
404 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
405 Mutex::Autolock lock(mCallbackMutex);
406 mCallback = callback;
407 }
408
409 virtual void setPhaseOffset(nsecs_t phaseOffset) {
410 Mutex::Autolock lock(mVsyncMutex);
411
412 // Normalize phaseOffset to [0, period)
413 auto period = mDispSync->getPeriod();
414 phaseOffset %= period;
415 if (phaseOffset < 0) {
416 // If we're here, then phaseOffset is in (-period, 0). After this
417 // operation, it will be in (0, period)
418 phaseOffset += period;
419 }
420 mPhaseOffset = phaseOffset;
421
422 // If we're not enabled, we don't need to mess with the listeners
423 if (!mEnabled) {
424 return;
425 }
426
427 // Remove the listener with the old offset
428 status_t err = mDispSync->removeEventListener(
429 static_cast<DispSync::Callback*>(this));
430 if (err != NO_ERROR) {
431 ALOGE("error unregistering vsync callback: %s (%d)",
432 strerror(-err), err);
433 }
434
435 // Add a listener with the new offset
436 err = mDispSync->addEventListener(mName, mPhaseOffset,
437 static_cast<DispSync::Callback*>(this));
438 if (err != NO_ERROR) {
439 ALOGE("error registering vsync callback: %s (%d)",
440 strerror(-err), err);
441 }
442 }
443
444private:
445 virtual void onDispSyncEvent(nsecs_t when) {
446 sp<VSyncSource::Callback> callback;
447 {
448 Mutex::Autolock lock(mCallbackMutex);
449 callback = mCallback;
450
451 if (mTraceVsync) {
452 mValue = (mValue + 1) % 2;
453 ATRACE_INT(mVsyncEventLabel.string(), mValue);
454 }
455 }
456
457 if (callback != NULL) {
458 callback->onVSyncEvent(when);
459 }
460 }
461
462 const char* const mName;
463
464 int mValue;
465
466 const bool mTraceVsync;
467 const String8 mVsyncOnLabel;
468 const String8 mVsyncEventLabel;
469
470 DispSync* mDispSync;
471
472 Mutex mCallbackMutex; // Protects the following
473 sp<VSyncSource::Callback> mCallback;
474
475 Mutex mVsyncMutex; // Protects the following
476 nsecs_t mPhaseOffset;
477 bool mEnabled;
478};
479
480class InjectVSyncSource : public VSyncSource {
481public:
482 InjectVSyncSource() {}
483
484 virtual ~InjectVSyncSource() {}
485
486 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
487 std::lock_guard<std::mutex> lock(mCallbackMutex);
488 mCallback = callback;
489 }
490
491 virtual void onInjectSyncEvent(nsecs_t when) {
492 std::lock_guard<std::mutex> lock(mCallbackMutex);
493 mCallback->onVSyncEvent(when);
494 }
495
496 virtual void setVSyncEnabled(bool) {}
497 virtual void setPhaseOffset(nsecs_t) {}
498
499private:
500 std::mutex mCallbackMutex; // Protects the following
501 sp<VSyncSource::Callback> mCallback;
502};
503
Wei Wangf9b05ee2017-07-19 20:59:39 -0700504// Do not call property_set on main thread which will be blocked by init
505// Use StartPropertySetThread instead.
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000506void SurfaceFlinger::init() {
507 ALOGI( "SurfaceFlinger's main thread ready to run. "
508 "Initializing graphics H/W...");
509
510 Mutex::Autolock _l(mStateLock);
511
512 // initialize EGL for the default display
513 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
514 eglInitialize(mEGLDisplay, NULL, NULL);
515
516 // start the EventThread
517 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
518 vsyncPhaseOffsetNs, true, "app");
519 mEventThread = new EventThread(vsyncSrc, *this, false);
520 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
521 sfVsyncPhaseOffsetNs, true, "sf");
522 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
523 mEventQueue.setEventThread(mSFEventThread);
524
Tim Murray22752852017-05-04 13:38:49 -0700525 // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000526 struct sched_param param = {0};
527 param.sched_priority = 2;
528 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
529 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
530 }
Tim Murray22752852017-05-04 13:38:49 -0700531 if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, &param) != 0) {
532 ALOGE("Couldn't set SCHED_FIFO for EventThread");
533 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000534
535 // Initialize the H/W composer object. There may or may not be an
536 // actual hardware composer underneath.
537 mHwc = new HWComposer(this,
538 *static_cast<HWComposer::EventHandler *>(this));
539
540 // get a RenderEngine for the given display / config (can't fail)
Kalle Raitabbdcf1f2017-05-22 15:47:46 -0700541 mRenderEngine = RenderEngine::create(mEGLDisplay,
542 mHwc->getVisualID(), 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000543
544 // retrieve the EGL context that was selected/created
545 mEGLContext = mRenderEngine->getEGLContext();
546
547 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
548 "couldn't create EGLContext");
549
550 // initialize our non-virtual displays
551 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
552 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
553 // set-up the displays that are already connected
554 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
555 // All non-virtual displays are currently considered secure.
556 bool isSecure = true;
557 createBuiltinDisplayLocked(type);
558 wp<IBinder> token = mBuiltinDisplays[i];
559
560 sp<IGraphicBufferProducer> producer;
561 sp<IGraphicBufferConsumer> consumer;
Mathias Agopian0556d792017-03-22 15:49:32 -0700562 BufferQueue::createBufferQueue(&producer, &consumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000563
564 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
565 consumer);
566 int32_t hwcId = allocateHwcDisplayId(type);
567 sp<DisplayDevice> hw = new DisplayDevice(this,
568 type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
569 fbs, producer,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -0600570 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000571 if (i > DisplayDevice::DISPLAY_PRIMARY) {
572 // FIXME: currently we don't get blank/unblank requests
573 // for displays other than the main display, so we always
574 // assume a connected display is unblanked.
575 ALOGD("marking display %zu as acquired/unblanked", i);
576 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
577 }
578 mDisplays.add(token, hw);
579 }
580 }
581
582 // make the GLContext current so that we can create textures when creating Layers
583 // (which may happens before we render something)
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -0700584 getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000585
586 mEventControlThread = new EventControlThread(this);
587 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
588
589 // set a fake vsync period if there is no HWComposer
590 if (mHwc->initCheck() != NO_ERROR) {
591 mPrimaryDispSync.setPeriod(16666667);
592 }
593
594 // initialize our drawing state
595 mDrawingState = mCurrentState;
596
597 // set initial conditions (e.g. unblank default device)
598 initializeDisplays();
599
600 mRenderEngine->primeCache();
601
Wei Wangf9b05ee2017-07-19 20:59:39 -0700602 // Inform native graphics APIs that the present timestamp is NOT supported:
603 mStartPropertySetThread = new StartPropertySetThread(false);
604 if (mStartPropertySetThread->Start() != NO_ERROR) {
605 ALOGE("Run StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800606 }
607
608 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000609}
610
611int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
612 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
613 type : mHwc->allocateDisplayId();
614}
615
616void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800617 // Start boot animation service by setting a property mailbox
618 // if property setting thread is already running, Start() will be just a NOP
Wei Wangf9b05ee2017-07-19 20:59:39 -0700619 mStartPropertySetThread->Start();
Wei Wangb254fa32017-01-31 17:43:23 -0800620 // Wait until property was set
Wei Wangf9b05ee2017-07-19 20:59:39 -0700621 if (mStartPropertySetThread->join() != NO_ERROR) {
622 ALOGE("Join StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800623 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000624}
625
626size_t SurfaceFlinger::getMaxTextureSize() const {
627 return mRenderEngine->getMaxTextureSize();
628}
629
630size_t SurfaceFlinger::getMaxViewportDims() const {
631 return mRenderEngine->getMaxViewportDims();
632}
633
634// ----------------------------------------------------------------------------
635
636bool SurfaceFlinger::authenticateSurfaceTexture(
637 const sp<IGraphicBufferProducer>& bufferProducer) const {
638 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800639 return authenticateSurfaceTextureLocked(bufferProducer);
640}
641
642bool SurfaceFlinger::authenticateSurfaceTextureLocked(
643 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000644 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
645 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
646}
647
Brian Anderson6b376712017-04-04 10:51:39 -0700648status_t SurfaceFlinger::getSupportedFrameTimestamps(
649 std::vector<FrameEvent>* outSupported) const {
650 *outSupported = {
651 FrameEvent::REQUESTED_PRESENT,
652 FrameEvent::ACQUIRE,
653 FrameEvent::LATCH,
654 FrameEvent::FIRST_REFRESH_START,
655 FrameEvent::LAST_REFRESH_START,
656 FrameEvent::GPU_COMPOSITION_DONE,
657 FrameEvent::DEQUEUE_READY,
658 FrameEvent::RELEASE,
659 };
660 return NO_ERROR;
661}
662
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000663status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
664 Vector<DisplayInfo>* configs) {
665 if ((configs == NULL) || (display.get() == NULL)) {
666 return BAD_VALUE;
667 }
668
669 int32_t type = getDisplayType(display);
670 if (type < 0) return type;
671
672 // TODO: Not sure if display density should handled by SF any longer
673 class Density {
674 static int getDensityFromProperty(char const* propName) {
675 char property[PROPERTY_VALUE_MAX];
676 int density = 0;
677 if (property_get(propName, property, NULL) > 0) {
678 density = atoi(property);
679 }
680 return density;
681 }
682 public:
683 static int getEmuDensity() {
684 return getDensityFromProperty("qemu.sf.lcd_density"); }
685 static int getBuildDensity() {
686 return getDensityFromProperty("ro.sf.lcd_density"); }
687 };
688
689 configs->clear();
690
691 const Vector<HWComposer::DisplayConfig>& hwConfigs =
692 getHwComposer().getConfigs(type);
693 for (size_t c = 0; c < hwConfigs.size(); ++c) {
694 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
695 DisplayInfo info = DisplayInfo();
696
697 float xdpi = hwConfig.xdpi;
698 float ydpi = hwConfig.ydpi;
699
700 if (type == DisplayDevice::DISPLAY_PRIMARY) {
701 // The density of the device is provided by a build property
702 float density = Density::getBuildDensity() / 160.0f;
703 if (density == 0) {
704 // the build doesn't provide a density -- this is wrong!
705 // use xdpi instead
706 ALOGE("ro.sf.lcd_density must be defined as a build property");
707 density = xdpi / 160.0f;
708 }
709 if (Density::getEmuDensity()) {
710 // if "qemu.sf.lcd_density" is specified, it overrides everything
711 xdpi = ydpi = density = Density::getEmuDensity();
712 density /= 160.0f;
713 }
714 info.density = density;
715
716 // TODO: this needs to go away (currently needed only by webkit)
717 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
718 info.orientation = hw->getOrientation();
719 } else {
720 // TODO: where should this value come from?
721 static const int TV_DENSITY = 213;
722 info.density = TV_DENSITY / 160.0f;
723 info.orientation = 0;
724 }
725
726 info.w = hwConfig.width;
727 info.h = hwConfig.height;
728 info.xdpi = xdpi;
729 info.ydpi = ydpi;
730 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800731 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000732
733 // This is how far in advance a buffer must be queued for
734 // presentation at a given time. If you want a buffer to appear
735 // on the screen at time N, you must submit the buffer before
736 // (N - presentationDeadline).
737 //
738 // Normally it's one full refresh period (to give SF a chance to
739 // latch the buffer), but this can be reduced by configuring a
740 // DispSync offset. Any additional delays introduced by the hardware
741 // composer or panel must be accounted for here.
742 //
743 // We add an additional 1ms to allow for processing time and
744 // differences between the ideal and actual refresh rate.
745 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800746 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000747
748 // All non-virtual displays are currently considered secure.
749 info.secure = true;
750
751 configs->push_back(info);
752 }
753
754 return NO_ERROR;
755}
756
757status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
758 DisplayStatInfo* stats) {
759 if (stats == NULL) {
760 return BAD_VALUE;
761 }
762
763 // FIXME for now we always return stats for the primary display
764 memset(stats, 0, sizeof(*stats));
765 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
766 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
767 return NO_ERROR;
768}
769
770int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -0700771 sp<const DisplayDevice> device(getDisplayDevice(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000772 if (device != NULL) {
773 return device->getActiveConfig();
774 }
775 return BAD_VALUE;
776}
777
778void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
779 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
780 this);
781 int32_t type = hw->getDisplayType();
782 int currentMode = hw->getActiveConfig();
783
784 if (mode == currentMode) {
785 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
786 return;
787 }
788
789 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
790 ALOGW("Trying to set config for virtual display");
791 return;
792 }
793
794 hw->setActiveConfig(mode);
795 getHwComposer().setActiveConfig(type, mode);
796}
797
798status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
799 class MessageSetActiveConfig: public MessageBase {
800 SurfaceFlinger& mFlinger;
801 sp<IBinder> mDisplay;
802 int mMode;
803 public:
804 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
805 int mode) :
806 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
807 virtual bool handler() {
808 Vector<DisplayInfo> configs;
809 mFlinger.getDisplayConfigs(mDisplay, &configs);
810 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
811 ALOGE("Attempt to set active config = %d for display with %zu configs",
812 mMode, configs.size());
813 }
814 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
815 if (hw == NULL) {
816 ALOGE("Attempt to set active config = %d for null display %p",
817 mMode, mDisplay.get());
818 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
819 ALOGW("Attempt to set active config = %d for virtual display",
820 mMode);
821 } else {
822 mFlinger.setActiveConfigInternal(hw, mMode);
823 }
824 return true;
825 }
826 };
827 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
828 postMessageSync(msg);
829 return NO_ERROR;
830}
831
832status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
833 Vector<android_color_mode_t>* outColorModes) {
834 if (outColorModes == nullptr || display.get() == nullptr) {
835 return BAD_VALUE;
836 }
837
838 int32_t type = getDisplayType(display);
839 if (type < 0) return type;
840
841 std::set<android_color_mode_t> colorModes;
842 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
843 colorModes.insert(hwConfig.colorMode);
844 }
845
846 outColorModes->clear();
847 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
848
849 return NO_ERROR;
850}
851
852android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
853 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
854
855 int32_t type = getDisplayType(display);
856 if (type < 0) return static_cast<android_color_mode_t>(type);
857
858 return getHwComposer().getColorMode(type);
859}
860
861status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
862 android_color_mode_t colorMode) {
863 if (display.get() == nullptr || colorMode < 0) {
864 return BAD_VALUE;
865 }
866
867 int32_t type = getDisplayType(display);
868 if (type < 0) return type;
869 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
870 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
871 desiredConfig.colorMode = colorMode;
872 for (size_t c = 0; c < hwConfigs.size(); ++c) {
873 const HWComposer::DisplayConfig config = hwConfigs[c];
874 if (config == desiredConfig) {
875 return setActiveConfig(display, c);
876 }
877 }
878 return BAD_VALUE;
879}
880
881status_t SurfaceFlinger::clearAnimationFrameStats() {
882 Mutex::Autolock _l(mStateLock);
883 mAnimFrameTracker.clearStats();
884 return NO_ERROR;
885}
886
887status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
888 Mutex::Autolock _l(mStateLock);
889 mAnimFrameTracker.getStats(outStats);
890 return NO_ERROR;
891}
892
893status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
894 HdrCapabilities* outCapabilities) const {
895 // HWC1 does not provide HDR capabilities
896 *outCapabilities = HdrCapabilities();
897 return NO_ERROR;
898}
899
900status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
901 if (enable == mInjectVSyncs) {
902 return NO_ERROR;
903 }
904
905 if (enable) {
906 mInjectVSyncs = enable;
907 ALOGV("VSync Injections enabled");
908 if (mVSyncInjector.get() == nullptr) {
909 mVSyncInjector = new InjectVSyncSource();
910 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
911 }
912 mEventQueue.setEventThread(mInjectorEventThread);
913 } else {
914 mInjectVSyncs = enable;
915 ALOGV("VSync Injections disabled");
916 mEventQueue.setEventThread(mSFEventThread);
917 mVSyncInjector.clear();
918 }
919 return NO_ERROR;
920}
921
922status_t SurfaceFlinger::injectVSync(nsecs_t when) {
923 if (!mInjectVSyncs) {
924 ALOGE("VSync Injections not enabled");
925 return BAD_VALUE;
926 }
927 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
928 ALOGV("Injecting VSync inside SurfaceFlinger");
929 mVSyncInjector->onInjectSyncEvent(when);
930 }
931 return NO_ERROR;
932}
933
934// ----------------------------------------------------------------------------
935
Jorim Jaggiaaef0982017-06-08 23:55:29 -0700936sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
937 ISurfaceComposer::VsyncSource vsyncSource) {
938 if (vsyncSource == eVsyncSourceSurfaceFlinger) {
939 return mSFEventThread->createEventConnection();
940 } else {
941 return mEventThread->createEventConnection();
942 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000943}
944
945// ----------------------------------------------------------------------------
946
947void SurfaceFlinger::waitForEvent() {
948 mEventQueue.waitMessage();
949}
950
951void SurfaceFlinger::signalTransaction() {
952 mEventQueue.invalidate();
953}
954
955void SurfaceFlinger::signalLayerUpdate() {
956 mEventQueue.invalidate();
957}
958
959void SurfaceFlinger::signalRefresh() {
960 mEventQueue.refresh();
961}
962
963status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
964 nsecs_t reltime, uint32_t /* flags */) {
965 return mEventQueue.postMessage(msg, reltime);
966}
967
968status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
969 nsecs_t reltime, uint32_t /* flags */) {
970 status_t res = mEventQueue.postMessage(msg, reltime);
971 if (res == NO_ERROR) {
972 msg->wait();
973 }
974 return res;
975}
976
977void SurfaceFlinger::run() {
978 do {
979 waitForEvent();
980 } while (true);
981}
982
983void SurfaceFlinger::enableHardwareVsync() {
984 Mutex::Autolock _l(mHWVsyncLock);
985 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
986 mPrimaryDispSync.beginResync();
987 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
988 mEventControlThread->setVsyncEnabled(true);
989 mPrimaryHWVsyncEnabled = true;
990 }
991}
992
993void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
994 Mutex::Autolock _l(mHWVsyncLock);
995
996 if (makeAvailable) {
997 mHWVsyncAvailable = true;
998 } else if (!mHWVsyncAvailable) {
999 // Hardware vsync is not currently available, so abort the resync
1000 // attempt for now
1001 return;
1002 }
1003
1004 const nsecs_t period =
1005 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1006
1007 mPrimaryDispSync.reset();
1008 mPrimaryDispSync.setPeriod(period);
1009
1010 if (!mPrimaryHWVsyncEnabled) {
1011 mPrimaryDispSync.beginResync();
1012 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1013 mEventControlThread->setVsyncEnabled(true);
1014 mPrimaryHWVsyncEnabled = true;
1015 }
1016}
1017
1018void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1019 Mutex::Autolock _l(mHWVsyncLock);
1020 if (mPrimaryHWVsyncEnabled) {
1021 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1022 mEventControlThread->setVsyncEnabled(false);
1023 mPrimaryDispSync.endResync();
1024 mPrimaryHWVsyncEnabled = false;
1025 }
1026 if (makeUnavailable) {
1027 mHWVsyncAvailable = false;
1028 }
1029}
1030
1031void SurfaceFlinger::resyncWithRateLimit() {
1032 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1033 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1034 resyncToHardwareVsync(false);
1035 }
1036}
1037
Steven Thomas3cfac282017-02-06 12:29:30 -08001038void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1039 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001040 bool needsHwVsync = false;
1041
1042 { // Scope for the lock
1043 Mutex::Autolock _l(mHWVsyncLock);
1044 if (type == 0 && mPrimaryHWVsyncEnabled) {
1045 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1046 }
1047 }
1048
1049 if (needsHwVsync) {
1050 enableHardwareVsync();
1051 } else {
1052 disableHardwareVsync(false);
1053 }
1054}
1055
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001056void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
Brian Andersond0010582017-03-07 13:20:31 -08001057 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001058 *compositorTiming = mCompositorTiming;
1059}
1060
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001061void SurfaceFlinger::onHotplugReceived(HWComposer* /*composer*/, int type, bool connected) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001062 if (mEventThread == NULL) {
1063 // This is a temporary workaround for b/7145521. A non-null pointer
1064 // does not mean EventThread has finished initializing, so this
1065 // is not a correct fix.
1066 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1067 return;
1068 }
1069
1070 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1071 Mutex::Autolock _l(mStateLock);
1072 if (connected) {
1073 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1074 } else {
1075 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1076 mBuiltinDisplays[type].clear();
1077 }
1078 setTransactionFlags(eDisplayTransactionNeeded);
1079
1080 // Defer EventThread notification until SF has updated mDisplays.
1081 }
1082}
1083
Steven Thomas3cfac282017-02-06 12:29:30 -08001084void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1085 repaintEverything();
1086}
1087
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001088void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1089 ATRACE_CALL();
1090 getHwComposer().eventControl(disp, event, enabled);
1091}
1092
1093void SurfaceFlinger::onMessageReceived(int32_t what) {
1094 ATRACE_CALL();
1095 switch (what) {
1096 case MessageQueue::INVALIDATE: {
1097 bool refreshNeeded = handleMessageTransaction();
1098 refreshNeeded |= handleMessageInvalidate();
1099 refreshNeeded |= mRepaintEverything;
1100 if (refreshNeeded) {
1101 // Signal a refresh if a transaction modified the window state,
1102 // a new buffer was latched, or if HWC has requested a full
1103 // repaint
1104 signalRefresh();
1105 }
1106 break;
1107 }
1108 case MessageQueue::REFRESH: {
1109 handleMessageRefresh();
1110 break;
1111 }
1112 }
1113}
1114
1115bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001116 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001117 if (transactionFlags) {
1118 handleTransaction(transactionFlags);
1119 return true;
1120 }
1121 return false;
1122}
1123
1124bool SurfaceFlinger::handleMessageInvalidate() {
1125 ATRACE_CALL();
1126 return handlePageFlip();
1127}
1128
1129void SurfaceFlinger::handleMessageRefresh() {
1130 ATRACE_CALL();
1131
1132 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1133
Brian Andersond6927fb2016-07-23 23:37:30 -07001134 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001135 rebuildLayerStacks();
1136 setUpHWComposer();
1137 doDebugFlashRegions();
1138 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001139 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001140}
1141
1142void SurfaceFlinger::doDebugFlashRegions()
1143{
1144 // is debugging enabled
1145 if (CC_LIKELY(!mDebugRegion))
1146 return;
1147
1148 const bool repaintEverything = mRepaintEverything;
1149 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1150 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1151 if (hw->isDisplayOn()) {
1152 // transform the dirty region into this screen's coordinate space
1153 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1154 if (!dirtyRegion.isEmpty()) {
1155 // redraw the whole screen
1156 doComposeSurfaces(hw, Region(hw->bounds()));
1157
1158 // and draw the dirty region
1159 const int32_t height = hw->getHeight();
1160 RenderEngine& engine(getRenderEngine());
1161 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1162
1163 hw->compositionComplete();
1164 hw->swapBuffers(getHwComposer());
1165 }
1166 }
1167 }
1168
1169 postFramebuffer();
1170
1171 if (mDebugRegion > 1) {
1172 usleep(mDebugRegion * 1000);
1173 }
1174
1175 HWComposer& hwc(getHwComposer());
1176 if (hwc.initCheck() == NO_ERROR) {
1177 status_t err = hwc.prepare();
1178 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1179 }
1180}
1181
Brian Andersond6927fb2016-07-23 23:37:30 -07001182void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001183{
1184 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001185 mDrawingState.traverseInZOrder([&](Layer* layer) {
1186 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001187 needExtraInvalidate = true;
1188 }
Robert Carr2047fae2016-11-28 14:09:09 -08001189 });
1190
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001191 if (needExtraInvalidate) {
1192 signalLayerUpdate();
1193 }
1194}
1195
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001196void SurfaceFlinger::updateCompositorTiming(
1197 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1198 std::shared_ptr<FenceTime>& presentFenceTime) {
1199 // Update queue of past composite+present times and determine the
1200 // most recently known composite to present latency.
1201 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1202 nsecs_t compositeToPresentLatency = -1;
1203 while (!mCompositePresentTimes.empty()) {
1204 CompositePresentTime& cpt = mCompositePresentTimes.front();
1205 // Cached values should have been updated before calling this method,
1206 // which helps avoid duplicate syscalls.
1207 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1208 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1209 break;
1210 }
1211 compositeToPresentLatency = displayTime - cpt.composite;
1212 mCompositePresentTimes.pop();
1213 }
1214
1215 // Don't let mCompositePresentTimes grow unbounded, just in case.
1216 while (mCompositePresentTimes.size() > 16) {
1217 mCompositePresentTimes.pop();
1218 }
1219
Brian Andersond0010582017-03-07 13:20:31 -08001220 setCompositorTimingSnapped(
1221 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1222}
1223
1224void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1225 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001226 // Integer division and modulo round toward 0 not -inf, so we need to
1227 // treat negative and positive offsets differently.
Brian Andersond0010582017-03-07 13:20:31 -08001228 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001229 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1230 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1231
Brian Andersond0010582017-03-07 13:20:31 -08001232 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1233 if (idealLatency <= 0) {
1234 idealLatency = vsyncInterval;
1235 }
1236
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001237 // Snap the latency to a value that removes scheduling jitter from the
1238 // composition and present times, which often have >1ms of jitter.
1239 // Reducing jitter is important if an app attempts to extrapolate
1240 // something (such as user input) to an accurate diasplay time.
1241 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1242 // with (presentLatency % interval).
Brian Andersond0010582017-03-07 13:20:31 -08001243 nsecs_t bias = vsyncInterval / 2;
1244 int64_t extraVsyncs =
1245 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1246 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1247 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001248
Brian Andersond0010582017-03-07 13:20:31 -08001249 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001250 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1251 mCompositorTiming.interval = vsyncInterval;
Brian Andersond0010582017-03-07 13:20:31 -08001252 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001253}
1254
1255void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001256{
Brian Andersond6927fb2016-07-23 23:37:30 -07001257 const HWComposer& hwc = getHwComposer();
1258 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1259
Brian Andersonfbc80ae2017-05-26 16:23:54 -07001260 mGlCompositionDoneTimeline.updateSignalTimes();
Brian Anderson3d4039d2016-09-23 16:31:30 -07001261 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1262 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1263 glCompositionDoneFenceTime =
1264 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1265 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1266 } else {
1267 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1268 }
Brian Anderson3d4039d2016-09-23 16:31:30 -07001269
Brian Andersonfbc80ae2017-05-26 16:23:54 -07001270 mDisplayTimeline.updateSignalTimes();
Brian Anderson4e606e32017-03-16 15:34:57 -07001271 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1272 auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
Brian Anderson3d4039d2016-09-23 16:31:30 -07001273 mDisplayTimeline.push(retireFenceTime);
Brian Andersond6927fb2016-07-23 23:37:30 -07001274
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001275 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1276 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1277
1278 // We use the refreshStartTime which might be sampled a little later than
1279 // when we started doing work for this frame, but that should be okay
1280 // since updateCompositorTiming has snapping logic.
1281 updateCompositorTiming(
1282 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
Brian Andersond0010582017-03-07 13:20:31 -08001283 CompositorTiming compositorTiming;
1284 {
1285 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1286 compositorTiming = mCompositorTiming;
1287 }
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001288
Robert Carr2047fae2016-11-28 14:09:09 -08001289 mDrawingState.traverseInZOrder([&](Layer* layer) {
Brian Anderson4e606e32017-03-16 15:34:57 -07001290 // TODO(brianderson): The retire fence is incorrectly passed in as the
1291 // present fence. Fix this if this file lives on.
Robert Carr2047fae2016-11-28 14:09:09 -08001292 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson4e606e32017-03-16 15:34:57 -07001293 retireFenceTime, compositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001294 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001295 recordBufferingStats(layer->getName().string(),
1296 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001297 }
Robert Carr2047fae2016-11-28 14:09:09 -08001298 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001299
Brian Anderson4e606e32017-03-16 15:34:57 -07001300 if (retireFence->isValid()) {
Brian Andersonfbc80ae2017-05-26 16:23:54 -07001301 if (mPrimaryDispSync.addPresentFence(retireFenceTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001302 enableHardwareVsync();
1303 } else {
1304 disableHardwareVsync(false);
1305 }
1306 }
1307
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08001308 if (!hasSyncFramework) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001309 if (hw->isDisplayOn()) {
1310 enableHardwareVsync();
1311 }
1312 }
1313
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001314 if (mAnimCompositionPending) {
1315 mAnimCompositionPending = false;
1316
Brian Anderson3d4039d2016-09-23 16:31:30 -07001317 if (retireFenceTime->isValid()) {
1318 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001319 } else {
1320 // The HWC doesn't support present fences, so use the refresh
1321 // timestamp instead.
1322 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1323 mAnimFrameTracker.setActualPresentTime(presentTime);
1324 }
1325 mAnimFrameTracker.advanceFrame();
1326 }
1327
1328 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1329 return;
1330 }
1331
1332 nsecs_t currentTime = systemTime();
1333 if (mHasPoweredOff) {
1334 mHasPoweredOff = false;
1335 } else {
1336 nsecs_t period = mPrimaryDispSync.getPeriod();
1337 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1338 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1339 if (numPeriods < NUM_BUCKETS - 1) {
1340 mFrameBuckets[numPeriods] += elapsedTime;
1341 } else {
1342 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1343 }
1344 mTotalTime += elapsedTime;
1345 }
1346 mLastSwapTime = currentTime;
1347}
1348
1349void SurfaceFlinger::rebuildLayerStacks() {
1350 // rebuild the visible layer list per screen
1351 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1352 ATRACE_CALL();
1353 mVisibleRegionsDirty = false;
1354 invalidateHwcGeometry();
1355
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001356 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1357 Region opaqueRegion;
1358 Region dirtyRegion;
1359 Vector< sp<Layer> > layersSortedByZ;
1360 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1361 const Transform& tr(hw->getTransform());
1362 const Rect bounds(hw->getBounds());
1363 if (hw->isDisplayOn()) {
Chia-I Wuab0c3192017-08-01 11:29:00 -07001364 computeVisibleRegions(hw, dirtyRegion, opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001365
Robert Carr2047fae2016-11-28 14:09:09 -08001366 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001367 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001368 Region drawRegion(tr.transform(
1369 layer->visibleNonTransparentRegion));
1370 drawRegion.andSelf(bounds);
1371 if (!drawRegion.isEmpty()) {
1372 layersSortedByZ.add(layer);
1373 }
1374 }
Robert Carr2047fae2016-11-28 14:09:09 -08001375 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001376 }
1377 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1378 hw->undefinedRegion.set(bounds);
1379 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1380 hw->dirtyRegion.orSelf(dirtyRegion);
1381 }
1382 }
1383}
1384
1385void SurfaceFlinger::setUpHWComposer() {
1386 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1387 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1388 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1389 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1390
1391 // If nothing has changed (!dirty), don't recompose.
1392 // If something changed, but we don't currently have any visible layers,
1393 // and didn't when we last did a composition, then skip it this time.
1394 // The second rule does two things:
1395 // - When all layers are removed from a display, we'll emit one black
1396 // frame, then nothing more until we get new layers.
1397 // - When a display is created with a private layer stack, we won't
1398 // emit any black frames until a layer is added to the layer stack.
1399 bool mustRecompose = dirty && !(empty && wasEmpty);
1400
1401 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1402 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1403 mustRecompose ? "doing" : "skipping",
1404 dirty ? "+" : "-",
1405 empty ? "+" : "-",
1406 wasEmpty ? "+" : "-");
1407
1408 mDisplays[dpy]->beginFrame(mustRecompose);
1409
1410 if (mustRecompose) {
1411 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1412 }
1413 }
1414
1415 HWComposer& hwc(getHwComposer());
1416 if (hwc.initCheck() == NO_ERROR) {
1417 // build the h/w work list
1418 if (CC_UNLIKELY(mHwWorkListDirty)) {
1419 mHwWorkListDirty = false;
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 if (hwc.createWorkList(id, count) == NO_ERROR) {
1428 HWComposer::LayerListIterator cur = hwc.begin(id);
1429 const HWComposer::LayerListIterator end = hwc.end(id);
1430 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1431 const sp<Layer>& layer(currentLayers[i]);
1432 layer->setGeometry(hw, *cur);
1433 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1434 cur->setSkip(true);
1435 }
1436 }
1437 }
1438 }
1439 }
1440 }
1441
1442 // set the per-frame data
1443 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1444 sp<const DisplayDevice> hw(mDisplays[dpy]);
1445 const int32_t id = hw->getHwcDisplayId();
1446 if (id >= 0) {
1447 const Vector< sp<Layer> >& currentLayers(
1448 hw->getVisibleLayersSortedByZ());
1449 const size_t count = currentLayers.size();
1450 HWComposer::LayerListIterator cur = hwc.begin(id);
1451 const HWComposer::LayerListIterator end = hwc.end(id);
1452 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1453 /*
1454 * update the per-frame h/w composer data for each layer
1455 * and build the transparent region of the FB
1456 */
1457 const sp<Layer>& layer(currentLayers[i]);
1458 layer->setPerFrameData(hw, *cur);
1459 }
1460 }
1461 }
1462
1463 // If possible, attempt to use the cursor overlay on each display.
1464 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1465 sp<const DisplayDevice> hw(mDisplays[dpy]);
1466 const int32_t id = hw->getHwcDisplayId();
1467 if (id >= 0) {
1468 const Vector< sp<Layer> >& currentLayers(
1469 hw->getVisibleLayersSortedByZ());
1470 const size_t count = currentLayers.size();
1471 HWComposer::LayerListIterator cur = hwc.begin(id);
1472 const HWComposer::LayerListIterator end = hwc.end(id);
1473 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1474 const sp<Layer>& layer(currentLayers[i]);
1475 if (layer->isPotentialCursor()) {
1476 cur->setIsCursorLayerHint();
1477 break;
1478 }
1479 }
1480 }
1481 }
1482
1483 status_t err = hwc.prepare();
1484 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1485
1486 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1487 sp<const DisplayDevice> hw(mDisplays[dpy]);
1488 hw->prepareFrame(hwc);
1489 }
1490 }
1491}
1492
1493void SurfaceFlinger::doComposition() {
1494 ATRACE_CALL();
1495 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1496 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1497 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1498 if (hw->isDisplayOn()) {
1499 // transform the dirty region into this screen's coordinate space
1500 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1501
1502 // repaint the framebuffer (if needed)
1503 doDisplayComposition(hw, dirtyRegion);
1504
1505 hw->dirtyRegion.clear();
1506 hw->flip(hw->swapRegion);
1507 hw->swapRegion.clear();
1508 }
1509 // inform the h/w that we're done compositing
1510 hw->compositionComplete();
1511 }
1512 postFramebuffer();
1513}
1514
1515void SurfaceFlinger::postFramebuffer()
1516{
1517 ATRACE_CALL();
1518
1519 const nsecs_t now = systemTime();
1520 mDebugInSwapBuffers = now;
1521
1522 HWComposer& hwc(getHwComposer());
1523 if (hwc.initCheck() == NO_ERROR) {
1524 if (!hwc.supportsFramebufferTarget()) {
1525 // EGL spec says:
1526 // "surface must be bound to the calling thread's current context,
1527 // for the current rendering API."
1528 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1529 }
1530 hwc.commit();
1531 }
1532
1533 // make the default display current because the VirtualDisplayDevice code cannot
1534 // deal with dequeueBuffer() being called outside of the composition loop; however
1535 // the code below can call glFlush() which is allowed (and does in some case) call
1536 // dequeueBuffer().
1537 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1538
1539 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1540 sp<const DisplayDevice> hw(mDisplays[dpy]);
1541 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1542 hw->onSwapBuffersCompleted(hwc);
1543 const size_t count = currentLayers.size();
1544 int32_t id = hw->getHwcDisplayId();
1545 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1546 HWComposer::LayerListIterator cur = hwc.begin(id);
1547 const HWComposer::LayerListIterator end = hwc.end(id);
1548 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1549 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1550 }
1551 } else {
1552 for (size_t i = 0; i < count; i++) {
1553 currentLayers[i]->onLayerDisplayed(hw, NULL);
1554 }
1555 }
1556 }
1557
1558 mLastSwapBufferTime = systemTime() - now;
1559 mDebugInSwapBuffers = 0;
1560
1561 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1562 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1563 logFrameStats();
1564 }
1565}
1566
1567void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1568{
1569 ATRACE_CALL();
1570
1571 // here we keep a copy of the drawing state (that is the state that's
1572 // going to be overwritten by handleTransactionLocked()) outside of
1573 // mStateLock so that the side-effects of the State assignment
1574 // don't happen with mStateLock held (which can cause deadlocks).
1575 State drawingState(mDrawingState);
1576
1577 Mutex::Autolock _l(mStateLock);
1578 const nsecs_t now = systemTime();
1579 mDebugInTransaction = now;
1580
1581 // Here we're guaranteed that some transaction flags are set
1582 // so we can call handleTransactionLocked() unconditionally.
1583 // We call getTransactionFlags(), which will also clear the flags,
1584 // with mStateLock held to guarantee that mCurrentState won't change
1585 // until the transaction is committed.
1586
1587 transactionFlags = getTransactionFlags(eTransactionMask);
1588 handleTransactionLocked(transactionFlags);
1589
1590 mLastTransactionTime = systemTime() - now;
1591 mDebugInTransaction = 0;
1592 invalidateHwcGeometry();
1593 // here the transaction has been committed
1594}
1595
1596void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1597{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001598 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001599 mCurrentState.traverseInZOrder([](Layer* layer) {
1600 layer->notifyAvailableFrames();
1601 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001602
1603 /*
1604 * Traversal of the children
1605 * (perform the transaction for each of them if needed)
1606 */
1607
1608 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001609 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001610 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001611 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001612
1613 const uint32_t flags = layer->doTransaction(0);
1614 if (flags & Layer::eVisibleRegion)
1615 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001616 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001617 }
1618
1619 /*
1620 * Perform display own transactions if needed
1621 */
1622
1623 if (transactionFlags & eDisplayTransactionNeeded) {
1624 // here we take advantage of Vector's copy-on-write semantics to
1625 // improve performance by skipping the transaction entirely when
1626 // know that the lists are identical
1627 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1628 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1629 if (!curr.isIdenticalTo(draw)) {
1630 mVisibleRegionsDirty = true;
1631 const size_t cc = curr.size();
1632 size_t dc = draw.size();
1633
1634 // find the displays that were removed
1635 // (ie: in drawing state but not in current state)
1636 // also handle displays that changed
1637 // (ie: displays that are in both lists)
1638 for (size_t i=0 ; i<dc ; i++) {
1639 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1640 if (j < 0) {
1641 // in drawing state but not in current state
1642 if (!draw[i].isMainDisplay()) {
1643 // Call makeCurrent() on the primary display so we can
1644 // be sure that nothing associated with this display
1645 // is current.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001646 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001647 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001648 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001649 if (hw != NULL)
1650 hw->disconnect(getHwComposer());
1651 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1652 mEventThread->onHotplugReceived(draw[i].type, false);
1653 mDisplays.removeItem(draw.keyAt(i));
1654 } else {
1655 ALOGW("trying to remove the main display");
1656 }
1657 } else {
1658 // this display is in both lists. see if something changed.
1659 const DisplayDeviceState& state(curr[j]);
1660 const wp<IBinder>& display(curr.keyAt(j));
1661 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1662 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1663 if (state_binder != draw_binder) {
1664 // changing the surface is like destroying and
1665 // recreating the DisplayDevice, so we just remove it
1666 // from the drawing state, so that it get re-added
1667 // below.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001668 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001669 if (hw != NULL)
1670 hw->disconnect(getHwComposer());
1671 mDisplays.removeItem(display);
1672 mDrawingState.displays.removeItemsAt(i);
1673 dc--; i--;
1674 // at this point we must loop to the next item
1675 continue;
1676 }
1677
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001678 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001679 if (disp != NULL) {
1680 if (state.layerStack != draw[i].layerStack) {
1681 disp->setLayerStack(state.layerStack);
1682 }
1683 if ((state.orientation != draw[i].orientation)
1684 || (state.viewport != draw[i].viewport)
1685 || (state.frame != draw[i].frame))
1686 {
1687 disp->setProjection(state.orientation,
1688 state.viewport, state.frame);
1689 }
1690 if (state.width != draw[i].width || state.height != draw[i].height) {
1691 disp->setDisplaySize(state.width, state.height);
1692 }
1693 }
1694 }
1695 }
1696
1697 // find displays that were added
1698 // (ie: in current state but not in drawing state)
1699 for (size_t i=0 ; i<cc ; i++) {
1700 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1701 const DisplayDeviceState& state(curr[i]);
1702
1703 sp<DisplaySurface> dispSurface;
1704 sp<IGraphicBufferProducer> producer;
1705 sp<IGraphicBufferProducer> bqProducer;
1706 sp<IGraphicBufferConsumer> bqConsumer;
Mathias Agopian0556d792017-03-22 15:49:32 -07001707 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001708
1709 int32_t hwcDisplayId = -1;
1710 if (state.isVirtualDisplay()) {
1711 // Virtual displays without a surface are dormant:
1712 // they have external state (layer stack, projection,
1713 // etc.) but no internal state (i.e. a DisplayDevice).
1714 if (state.surface != NULL) {
1715
1716 int width = 0;
1717 int status = state.surface->query(
1718 NATIVE_WINDOW_WIDTH, &width);
1719 ALOGE_IF(status != NO_ERROR,
1720 "Unable to query width (%d)", status);
1721 int height = 0;
1722 status = state.surface->query(
1723 NATIVE_WINDOW_HEIGHT, &height);
1724 ALOGE_IF(status != NO_ERROR,
1725 "Unable to query height (%d)", status);
1726 if (mUseHwcVirtualDisplays &&
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08001727 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1728 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1729 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001730 hwcDisplayId = allocateHwcDisplayId(state.type);
1731 }
1732
1733 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1734 *mHwc, hwcDisplayId, state.surface,
1735 bqProducer, bqConsumer, state.displayName);
1736
1737 dispSurface = vds;
1738 producer = vds;
1739 }
1740 } else {
1741 ALOGE_IF(state.surface!=NULL,
1742 "adding a supported display, but rendering "
1743 "surface is provided (%p), ignoring it",
1744 state.surface.get());
1745 hwcDisplayId = allocateHwcDisplayId(state.type);
1746 // for supported (by hwc) displays we provide our
1747 // own rendering surface
1748 dispSurface = new FramebufferSurface(*mHwc, state.type,
1749 bqConsumer);
1750 producer = bqProducer;
1751 }
1752
1753 const wp<IBinder>& display(curr.keyAt(i));
1754 if (dispSurface != NULL) {
1755 sp<DisplayDevice> hw = new DisplayDevice(this,
1756 state.type, hwcDisplayId,
1757 mHwc->getFormat(hwcDisplayId), state.isSecure,
1758 display, dispSurface, producer,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -06001759 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001760 hw->setLayerStack(state.layerStack);
1761 hw->setProjection(state.orientation,
1762 state.viewport, state.frame);
1763 hw->setDisplayName(state.displayName);
1764 mDisplays.add(display, hw);
1765 if (state.isVirtualDisplay()) {
1766 if (hwcDisplayId >= 0) {
1767 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1768 hw->getWidth(), hw->getHeight(),
1769 hw->getFormat());
1770 }
1771 } else {
1772 mEventThread->onHotplugReceived(state.type, true);
1773 }
1774 }
1775 }
1776 }
1777 }
1778 }
1779
1780 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1781 // The transform hint might have changed for some layers
1782 // (either because a display has changed, or because a layer
1783 // as changed).
1784 //
1785 // Walk through all the layers in currentLayers,
1786 // and update their transform hint.
1787 //
1788 // If a layer is visible only on a single display, then that
1789 // display is used to calculate the hint, otherwise we use the
1790 // default display.
1791 //
1792 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1793 // the hint is set before we acquire a buffer from the surface texture.
1794 //
1795 // NOTE: layer transactions have taken place already, so we use their
1796 // drawing state. However, SurfaceFlinger's own transaction has not
1797 // happened yet, so we must use the current state layer list
1798 // (soon to become the drawing state list).
1799 //
1800 sp<const DisplayDevice> disp;
1801 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001802 bool first = true;
1803 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001804 // NOTE: we rely on the fact that layers are sorted by
1805 // layerStack first (so we don't have to traverse the list
1806 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001807 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001808 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001809 currentlayerStack = layerStack;
1810 // figure out if this layerstack is mirrored
1811 // (more than one display) if so, pick the default display,
1812 // if not, pick the only display it's on.
1813 disp.clear();
1814 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1815 sp<const DisplayDevice> hw(mDisplays[dpy]);
1816 if (hw->getLayerStack() == currentlayerStack) {
1817 if (disp == NULL) {
1818 disp = hw;
1819 } else {
1820 disp = NULL;
1821 break;
1822 }
1823 }
1824 }
1825 }
1826 if (disp == NULL) {
1827 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1828 // redraw after transform hint changes. See bug 8508397.
1829
1830 // could be null when this layer is using a layerStack
1831 // that is not visible on any display. Also can occur at
1832 // screen off/on times.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001833 disp = getDefaultDisplayDeviceLocked();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001834 }
1835 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001836
1837 first = false;
1838 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001839 }
1840
1841
1842 /*
1843 * Perform our own transaction if needed
1844 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001845
1846 if (mLayersAdded) {
1847 mLayersAdded = false;
1848 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001849 mVisibleRegionsDirty = true;
1850 }
1851
1852 // some layers might have been removed, so
1853 // we need to update the regions they're exposing.
1854 if (mLayersRemoved) {
1855 mLayersRemoved = false;
1856 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001857 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001858 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001859 // this layer is not visible anymore
1860 // TODO: we could traverse the tree from front to back and
1861 // compute the actual visible region
1862 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001863 Region visibleReg;
1864 visibleReg.set(layer->computeScreenBounds());
Chia-I Wuab0c3192017-08-01 11:29:00 -07001865 invalidateLayerStack(layer, visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001866 }
Robert Carr2047fae2016-11-28 14:09:09 -08001867 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001868 }
1869
1870 commitTransaction();
1871
1872 updateCursorAsync();
1873}
1874
1875void SurfaceFlinger::updateCursorAsync()
1876{
1877 HWComposer& hwc(getHwComposer());
1878 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1879 sp<const DisplayDevice> hw(mDisplays[dpy]);
1880 const int32_t id = hw->getHwcDisplayId();
1881 if (id < 0) {
1882 continue;
1883 }
1884 const Vector< sp<Layer> >& currentLayers(
1885 hw->getVisibleLayersSortedByZ());
1886 const size_t count = currentLayers.size();
1887 HWComposer::LayerListIterator cur = hwc.begin(id);
1888 const HWComposer::LayerListIterator end = hwc.end(id);
1889 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1890 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1891 continue;
1892 }
1893 const sp<Layer>& layer(currentLayers[i]);
1894 Rect cursorPos = layer->getPosition(hw);
1895 hwc.setCursorPositionAsync(id, cursorPos);
1896 break;
1897 }
1898 }
1899}
1900
1901void SurfaceFlinger::commitTransaction()
1902{
1903 if (!mLayersPendingRemoval.isEmpty()) {
1904 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001905 for (const auto& l : mLayersPendingRemoval) {
1906 recordBufferingStats(l->getName().string(),
1907 l->getOccupancyHistory(true));
1908 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001909 }
1910 mLayersPendingRemoval.clear();
1911 }
1912
1913 // If this transaction is part of a window animation then the next frame
1914 // we composite should be considered an animation as well.
1915 mAnimCompositionPending = mAnimTransactionPending;
1916
1917 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001918 mDrawingState.traverseInZOrder([](Layer* layer) {
1919 layer->commitChildList();
1920 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001921 mTransactionPending = false;
1922 mAnimTransactionPending = false;
1923 mTransactionCV.broadcast();
1924}
1925
Chia-I Wuab0c3192017-08-01 11:29:00 -07001926void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001927 Region& outDirtyRegion, Region& outOpaqueRegion)
1928{
1929 ATRACE_CALL();
1930
1931 Region aboveOpaqueLayers;
1932 Region aboveCoveredLayers;
1933 Region dirty;
1934
1935 outDirtyRegion.clear();
1936
Robert Carr2047fae2016-11-28 14:09:09 -08001937 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001938 // start with the whole surface at its current location
1939 const Layer::State& s(layer->getDrawingState());
1940
1941 // only consider the layers on the given layer stack
Chia-I Wuab0c3192017-08-01 11:29:00 -07001942 if (layer->getLayerStack() != displayDevice->getLayerStack())
Robert Carr2047fae2016-11-28 14:09:09 -08001943 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001944
1945 /*
1946 * opaqueRegion: area of a surface that is fully opaque.
1947 */
1948 Region opaqueRegion;
1949
1950 /*
1951 * visibleRegion: area of a surface that is visible on screen
1952 * and not fully transparent. This is essentially the layer's
1953 * footprint minus the opaque regions above it.
1954 * Areas covered by a translucent surface are considered visible.
1955 */
1956 Region visibleRegion;
1957
1958 /*
1959 * coveredRegion: area of a surface that is covered by all
1960 * visible regions above it (which includes the translucent areas).
1961 */
1962 Region coveredRegion;
1963
1964 /*
1965 * transparentRegion: area of a surface that is hinted to be completely
1966 * transparent. This is only used to tell when the layer has no visible
1967 * non-transparent regions and can be removed from the layer list. It
1968 * does not affect the visibleRegion of this layer or any layers
1969 * beneath it. The hint may not be correct if apps don't respect the
1970 * SurfaceView restrictions (which, sadly, some don't).
1971 */
1972 Region transparentRegion;
1973
1974
1975 // handle hidden surfaces by setting the visible region to empty
1976 if (CC_LIKELY(layer->isVisible())) {
1977 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001978 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001979 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001980 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001981 if (!visibleRegion.isEmpty()) {
1982 // Remove the transparent area from the visible region
1983 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001984 if (tr.preserveRects()) {
1985 // transform the transparent region
1986 transparentRegion = tr.transform(s.activeTransparentRegion);
1987 } else {
1988 // transformation too complex, can't do the
1989 // transparent region optimization.
1990 transparentRegion.clear();
1991 }
1992 }
1993
1994 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001995 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001996 if (s.alpha==255 && !translucent &&
1997 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1998 // the opaque region is the layer's footprint
1999 opaqueRegion = visibleRegion;
2000 }
2001 }
2002 }
2003
2004 // Clip the covered region to the visible region
2005 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2006
2007 // Update aboveCoveredLayers for next (lower) layer
2008 aboveCoveredLayers.orSelf(visibleRegion);
2009
2010 // subtract the opaque region covered by the layers above us
2011 visibleRegion.subtractSelf(aboveOpaqueLayers);
2012
2013 // compute this layer's dirty region
2014 if (layer->contentDirty) {
2015 // we need to invalidate the whole region
2016 dirty = visibleRegion;
2017 // as well, as the old visible region
2018 dirty.orSelf(layer->visibleRegion);
2019 layer->contentDirty = false;
2020 } else {
2021 /* compute the exposed region:
2022 * the exposed region consists of two components:
2023 * 1) what's VISIBLE now and was COVERED before
2024 * 2) what's EXPOSED now less what was EXPOSED before
2025 *
2026 * note that (1) is conservative, we start with the whole
2027 * visible region but only keep what used to be covered by
2028 * something -- which mean it may have been exposed.
2029 *
2030 * (2) handles areas that were not covered by anything but got
2031 * exposed because of a resize.
2032 */
2033 const Region newExposed = visibleRegion - coveredRegion;
2034 const Region oldVisibleRegion = layer->visibleRegion;
2035 const Region oldCoveredRegion = layer->coveredRegion;
2036 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2037 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2038 }
2039 dirty.subtractSelf(aboveOpaqueLayers);
2040
2041 // accumulate to the screen dirty region
2042 outDirtyRegion.orSelf(dirty);
2043
2044 // Update aboveOpaqueLayers for next (lower) layer
2045 aboveOpaqueLayers.orSelf(opaqueRegion);
2046
2047 // Store the visible region in screen space
2048 layer->setVisibleRegion(visibleRegion);
2049 layer->setCoveredRegion(coveredRegion);
2050 layer->setVisibleNonTransparentRegion(
2051 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002052 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002053
2054 outOpaqueRegion = aboveOpaqueLayers;
2055}
2056
Chia-I Wuab0c3192017-08-01 11:29:00 -07002057void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
2058 uint32_t layerStack = layer->getLayerStack();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002059 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2060 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2061 if (hw->getLayerStack() == layerStack) {
2062 hw->dirtyRegion.orSelf(dirty);
2063 }
2064 }
2065}
2066
2067bool SurfaceFlinger::handlePageFlip()
2068{
Brian Andersond6927fb2016-07-23 23:37:30 -07002069 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002070 Region dirtyRegion;
2071
2072 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002073 bool frameQueued = false;
2074
2075 // Store the set of layers that need updates. This set must not change as
2076 // buffers are being latched, as this could result in a deadlock.
2077 // Example: Two producers share the same command stream and:
2078 // 1.) Layer 0 is latched
2079 // 2.) Layer 0 gets a new frame
2080 // 2.) Layer 1 gets a new frame
2081 // 3.) Layer 1 is latched.
2082 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2083 // second frame. But layer 0's second frame could be waiting on display.
2084 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002085 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002086 if (layer->hasQueuedFrame()) {
2087 frameQueued = true;
2088 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002089 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002090 } else {
2091 layer->useEmptyDamage();
2092 }
2093 } else {
2094 layer->useEmptyDamage();
2095 }
Robert Carr2047fae2016-11-28 14:09:09 -08002096 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002097 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2098 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002099 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002100 layer->useSurfaceDamage();
Chia-I Wuab0c3192017-08-01 11:29:00 -07002101 invalidateLayerStack(layer, dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002102 }
2103
2104 mVisibleRegionsDirty |= visibleRegions;
2105
2106 // If we will need to wake up at some time in the future to deal with a
2107 // queued frame that shouldn't be displayed during this vsync period, wake
2108 // up during the next vsync period to check again.
2109 if (frameQueued && layersWithQueuedFrames.empty()) {
2110 signalLayerUpdate();
2111 }
2112
2113 // Only continue with the refresh if there is actually new work to do
2114 return !layersWithQueuedFrames.empty();
2115}
2116
2117void SurfaceFlinger::invalidateHwcGeometry()
2118{
2119 mHwWorkListDirty = true;
2120}
2121
2122
2123void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2124 const Region& inDirtyRegion)
2125{
2126 // We only need to actually compose the display if:
2127 // 1) It is being handled by hardware composer, which may need this to
2128 // keep its virtual display state machine in sync, or
2129 // 2) There is work to be done (the dirty region isn't empty)
2130 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2131 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2132 return;
2133 }
2134
2135 Region dirtyRegion(inDirtyRegion);
2136
2137 // compute the invalid region
2138 hw->swapRegion.orSelf(dirtyRegion);
2139
2140 uint32_t flags = hw->getFlags();
2141 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2142 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2143 // takes a rectangle, we must make sure to update that whole
2144 // rectangle in that case
2145 dirtyRegion.set(hw->swapRegion.bounds());
2146 } else {
2147 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2148 // We need to redraw the rectangle that will be updated
2149 // (pushed to the framebuffer).
2150 // This is needed because PARTIAL_UPDATES only takes one
2151 // rectangle instead of a region (see DisplayDevice::flip())
2152 dirtyRegion.set(hw->swapRegion.bounds());
2153 } else {
2154 // we need to redraw everything (the whole screen)
2155 dirtyRegion.set(hw->bounds());
2156 hw->swapRegion = dirtyRegion;
2157 }
2158 }
2159
2160 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2161 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2162 } else {
2163 RenderEngine& engine(getRenderEngine());
2164 mat4 colorMatrix = mColorMatrix;
2165 if (mDaltonize) {
2166 colorMatrix = colorMatrix * mDaltonizer();
2167 }
2168 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2169 doComposeSurfaces(hw, dirtyRegion);
2170 engine.setupColorTransform(oldMatrix);
2171 }
2172
2173 // update the swap region and clear the dirty region
2174 hw->swapRegion.orSelf(dirtyRegion);
2175
2176 // swap buffers (presentation)
2177 hw->swapBuffers(getHwComposer());
2178}
2179
2180bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2181{
2182 RenderEngine& engine(getRenderEngine());
2183 const int32_t id = hw->getHwcDisplayId();
2184 HWComposer& hwc(getHwComposer());
2185 HWComposer::LayerListIterator cur = hwc.begin(id);
2186 const HWComposer::LayerListIterator end = hwc.end(id);
2187
2188 bool hasGlesComposition = hwc.hasGlesComposition(id);
2189 if (hasGlesComposition) {
2190 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2191 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2192 hw->getDisplayName().string());
2193 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2194 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2195 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2196 }
2197 return false;
2198 }
2199
2200 // Never touch the framebuffer if we don't have any framebuffer layers
2201 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2202 if (hasHwcComposition) {
2203 // when using overlays, we assume a fully transparent framebuffer
2204 // NOTE: we could reduce how much we need to clear, for instance
2205 // remove where there are opaque FB layers. however, on some
2206 // GPUs doing a "clean slate" clear might be more efficient.
2207 // We'll revisit later if needed.
2208 engine.clearWithColor(0, 0, 0, 0);
2209 } else {
2210 // we start with the whole screen area
2211 const Region bounds(hw->getBounds());
2212
2213 // we remove the scissor part
2214 // we're left with the letterbox region
2215 // (common case is that letterbox ends-up being empty)
2216 const Region letterbox(bounds.subtract(hw->getScissor()));
2217
2218 // compute the area to clear
2219 Region region(hw->undefinedRegion.merge(letterbox));
2220
2221 // but limit it to the dirty region
2222 region.andSelf(dirty);
2223
2224 // screen is already cleared here
2225 if (!region.isEmpty()) {
2226 // can happen with SurfaceView
2227 drawWormhole(hw, region);
2228 }
2229 }
2230
2231 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2232 // just to be on the safe side, we don't set the
2233 // scissor on the main display. It should never be needed
2234 // anyways (though in theory it could since the API allows it).
2235 const Rect& bounds(hw->getBounds());
2236 const Rect& scissor(hw->getScissor());
2237 if (scissor != bounds) {
2238 // scissor doesn't match the screen's dimensions, so we
2239 // need to clear everything outside of it and enable
2240 // the GL scissor so we don't draw anything where we shouldn't
2241
2242 // enable scissor for this frame
2243 const uint32_t height = hw->getHeight();
2244 engine.setScissor(scissor.left, height - scissor.bottom,
2245 scissor.getWidth(), scissor.getHeight());
2246 }
2247 }
2248 }
2249
2250 /*
2251 * and then, render the layers targeted at the framebuffer
2252 */
2253
2254 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2255 const size_t count = layers.size();
2256 const Transform& tr = hw->getTransform();
2257 if (cur != end) {
2258 // we're using h/w composer
2259 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2260 const sp<Layer>& layer(layers[i]);
2261 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2262 if (!clip.isEmpty()) {
2263 switch (cur->getCompositionType()) {
2264 case HWC_CURSOR_OVERLAY:
2265 case HWC_OVERLAY: {
2266 const Layer::State& state(layer->getDrawingState());
2267 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2268 && i
2269 && layer->isOpaque(state) && (state.alpha == 0xFF)
2270 && hasGlesComposition) {
2271 // never clear the very first layer since we're
2272 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002273 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002274 }
2275 break;
2276 }
2277 case HWC_FRAMEBUFFER: {
2278 layer->draw(hw, clip);
2279 break;
2280 }
2281 case HWC_FRAMEBUFFER_TARGET: {
2282 // this should not happen as the iterator shouldn't
2283 // let us get there.
2284 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2285 break;
2286 }
2287 }
2288 }
2289 layer->setAcquireFence(hw, *cur);
2290 }
2291 } else {
2292 // we're not using h/w composer
2293 for (size_t i=0 ; i<count ; ++i) {
2294 const sp<Layer>& layer(layers[i]);
2295 const Region clip(dirty.intersect(
2296 tr.transform(layer->visibleRegion)));
2297 if (!clip.isEmpty()) {
2298 layer->draw(hw, clip);
2299 }
2300 }
2301 }
2302
2303 // disable scissor at the end of the frame
2304 engine.disableScissor();
2305 return true;
2306}
2307
2308void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2309 const int32_t height = hw->getHeight();
2310 RenderEngine& engine(getRenderEngine());
2311 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2312}
2313
2314status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2315 const sp<IBinder>& handle,
2316 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002317 const sp<Layer>& lbc,
2318 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002319{
2320 // add this layer to the current state list
2321 {
2322 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002323 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002324 return NO_MEMORY;
2325 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002326 if (parent == nullptr) {
2327 mCurrentState.layersSortedByZ.add(lbc);
2328 } else {
Chia-I Wufae51c42017-06-15 12:53:59 -07002329 if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) {
2330 ALOGE("addClientLayer called with a removed parent");
2331 return NAME_NOT_FOUND;
2332 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002333 parent->addChild(lbc);
2334 }
Chia-I Wufae51c42017-06-15 12:53:59 -07002335
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002336 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002337 mLayersAdded = true;
2338 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002339 }
2340
2341 // attach this layer to the client
2342 client->attachLayer(handle, lbc);
2343
2344 return NO_ERROR;
2345}
2346
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002347status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002348 Mutex::Autolock _l(mStateLock);
2349
Robert Carr1f0a16a2016-10-24 16:27:39 -07002350 const auto& p = layer->getParent();
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002351 ssize_t index;
2352 if (p != nullptr) {
2353 if (topLevelOnly) {
2354 return NO_ERROR;
2355 }
2356
Chia-I Wufae51c42017-06-15 12:53:59 -07002357 sp<Layer> ancestor = p;
2358 while (ancestor->getParent() != nullptr) {
2359 ancestor = ancestor->getParent();
2360 }
2361 if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
2362 ALOGE("removeLayer called with a layer whose parent has been removed");
2363 return NAME_NOT_FOUND;
2364 }
2365
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002366 index = p->removeChild(layer);
2367 } else {
2368 index = mCurrentState.layersSortedByZ.remove(layer);
2369 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002370
Robert Carr136e2f62017-02-08 17:54:29 -08002371 // As a matter of normal operation, the LayerCleaner will produce a second
2372 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2373 // so we will succeed in promoting it, but it's already been removed
2374 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2375 // otherwise something has gone wrong and we are leaking the layer.
2376 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002377 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2378 layer->getName().string(),
2379 (p != nullptr) ? p->getName().string() : "no-parent");
2380 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002381 } else if (index < 0) {
2382 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002383 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002384
2385 mLayersPendingRemoval.add(layer);
2386 mLayersRemoved = true;
Chia-I Wufae51c42017-06-15 12:53:59 -07002387 mNumLayers -= 1 + layer->getChildrenCount();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002388 setTransactionFlags(eTransactionNeeded);
2389 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002390}
2391
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002392uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002393 return android_atomic_release_load(&mTransactionFlags);
2394}
2395
2396uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2397 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2398}
2399
2400uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2401 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2402 if ((old & flags)==0) { // wake the server up
2403 signalTransaction();
2404 }
2405 return old;
2406}
2407
2408void SurfaceFlinger::setTransactionState(
2409 const Vector<ComposerState>& state,
2410 const Vector<DisplayState>& displays,
2411 uint32_t flags)
2412{
2413 ATRACE_CALL();
2414 Mutex::Autolock _l(mStateLock);
2415 uint32_t transactionFlags = 0;
2416
2417 if (flags & eAnimation) {
2418 // For window updates that are part of an animation we must wait for
2419 // previous animation "frames" to be handled.
2420 while (mAnimTransactionPending) {
2421 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2422 if (CC_UNLIKELY(err != NO_ERROR)) {
2423 // just in case something goes wrong in SF, return to the
2424 // caller after a few seconds.
2425 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2426 "waiting for previous animation frame");
2427 mAnimTransactionPending = false;
2428 break;
2429 }
2430 }
2431 }
2432
2433 size_t count = displays.size();
2434 for (size_t i=0 ; i<count ; i++) {
2435 const DisplayState& s(displays[i]);
2436 transactionFlags |= setDisplayStateLocked(s);
2437 }
2438
2439 count = state.size();
2440 for (size_t i=0 ; i<count ; i++) {
2441 const ComposerState& s(state[i]);
2442 // Here we need to check that the interface we're given is indeed
2443 // one of our own. A malicious client could give us a NULL
2444 // IInterface, or one of its own or even one of our own but a
2445 // different type. All these situations would cause us to crash.
2446 //
2447 // NOTE: it would be better to use RTTI as we could directly check
2448 // that we have a Client*. however, RTTI is disabled in Android.
2449 if (s.client != NULL) {
2450 sp<IBinder> binder = IInterface::asBinder(s.client);
2451 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002452 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002453 sp<Client> client( static_cast<Client *>(s.client.get()) );
2454 transactionFlags |= setClientStateLocked(client, s.state);
2455 }
2456 }
2457 }
2458 }
2459
2460 // If a synchronous transaction is explicitly requested without any changes,
2461 // force a transaction anyway. This can be used as a flush mechanism for
2462 // previous async transactions.
2463 if (transactionFlags == 0 && (flags & eSynchronous)) {
2464 transactionFlags = eTransactionNeeded;
2465 }
2466
2467 if (transactionFlags) {
2468 if (mInterceptor.isEnabled()) {
2469 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2470 }
2471
2472 // this triggers the transaction
2473 setTransactionFlags(transactionFlags);
2474
2475 // if this is a synchronous transaction, wait for it to take effect
2476 // before returning.
2477 if (flags & eSynchronous) {
2478 mTransactionPending = true;
2479 }
2480 if (flags & eAnimation) {
2481 mAnimTransactionPending = true;
2482 }
2483 while (mTransactionPending) {
2484 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2485 if (CC_UNLIKELY(err != NO_ERROR)) {
2486 // just in case something goes wrong in SF, return to the
2487 // called after a few seconds.
2488 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2489 mTransactionPending = false;
2490 break;
2491 }
2492 }
2493 }
2494}
2495
2496uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2497{
2498 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2499 if (dpyIdx < 0)
2500 return 0;
2501
2502 uint32_t flags = 0;
2503 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2504 if (disp.isValid()) {
2505 const uint32_t what = s.what;
2506 if (what & DisplayState::eSurfaceChanged) {
2507 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2508 disp.surface = s.surface;
2509 flags |= eDisplayTransactionNeeded;
2510 }
2511 }
2512 if (what & DisplayState::eLayerStackChanged) {
2513 if (disp.layerStack != s.layerStack) {
2514 disp.layerStack = s.layerStack;
2515 flags |= eDisplayTransactionNeeded;
2516 }
2517 }
2518 if (what & DisplayState::eDisplayProjectionChanged) {
2519 if (disp.orientation != s.orientation) {
2520 disp.orientation = s.orientation;
2521 flags |= eDisplayTransactionNeeded;
2522 }
2523 if (disp.frame != s.frame) {
2524 disp.frame = s.frame;
2525 flags |= eDisplayTransactionNeeded;
2526 }
2527 if (disp.viewport != s.viewport) {
2528 disp.viewport = s.viewport;
2529 flags |= eDisplayTransactionNeeded;
2530 }
2531 }
2532 if (what & DisplayState::eDisplaySizeChanged) {
2533 if (disp.width != s.width) {
2534 disp.width = s.width;
2535 flags |= eDisplayTransactionNeeded;
2536 }
2537 if (disp.height != s.height) {
2538 disp.height = s.height;
2539 flags |= eDisplayTransactionNeeded;
2540 }
2541 }
2542 }
2543 return flags;
2544}
2545
2546uint32_t SurfaceFlinger::setClientStateLocked(
2547 const sp<Client>& client,
2548 const layer_state_t& s)
2549{
2550 uint32_t flags = 0;
2551 sp<Layer> layer(client->getLayerUser(s.surface));
2552 if (layer != 0) {
2553 const uint32_t what = s.what;
2554 bool geometryAppliesWithResize =
2555 what & layer_state_t::eGeometryAppliesWithResize;
2556 if (what & layer_state_t::ePositionChanged) {
2557 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2558 flags |= eTraversalNeeded;
2559 }
2560 }
2561 if (what & layer_state_t::eLayerChanged) {
2562 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002563 const auto& p = layer->getParent();
2564 if (p == nullptr) {
2565 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2566 if (layer->setLayer(s.z) && idx >= 0) {
2567 mCurrentState.layersSortedByZ.removeAt(idx);
2568 mCurrentState.layersSortedByZ.add(layer);
2569 // we need traversal (state changed)
2570 // AND transaction (list changed)
2571 flags |= eTransactionNeeded|eTraversalNeeded;
2572 }
2573 } else {
2574 if (p->setChildLayer(layer, s.z)) {
2575 flags |= eTransactionNeeded|eTraversalNeeded;
2576 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002577 }
2578 }
chaviw64f7b422017-07-12 10:31:58 -07002579 if (what & layer_state_t::eRelativeLayerChanged) {
2580 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2581 if (layer->setRelativeLayer(s.relativeLayerHandle, s.z)) {
2582 mCurrentState.layersSortedByZ.removeAt(idx);
2583 mCurrentState.layersSortedByZ.add(layer);
2584 flags |= eTransactionNeeded|eTraversalNeeded;
2585 }
2586 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002587 if (what & layer_state_t::eSizeChanged) {
2588 if (layer->setSize(s.w, s.h)) {
2589 flags |= eTraversalNeeded;
2590 }
2591 }
2592 if (what & layer_state_t::eAlphaChanged) {
2593 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2594 flags |= eTraversalNeeded;
2595 }
2596 if (what & layer_state_t::eMatrixChanged) {
2597 if (layer->setMatrix(s.matrix))
2598 flags |= eTraversalNeeded;
2599 }
2600 if (what & layer_state_t::eTransparentRegionChanged) {
2601 if (layer->setTransparentRegionHint(s.transparentRegion))
2602 flags |= eTraversalNeeded;
2603 }
2604 if (what & layer_state_t::eFlagsChanged) {
2605 if (layer->setFlags(s.flags, s.mask))
2606 flags |= eTraversalNeeded;
2607 }
2608 if (what & layer_state_t::eCropChanged) {
2609 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2610 flags |= eTraversalNeeded;
2611 }
2612 if (what & layer_state_t::eFinalCropChanged) {
Robert Carr6fb9ca72017-03-22 18:23:23 -07002613 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002614 flags |= eTraversalNeeded;
2615 }
2616 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002617 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002618 // We only allow setting layer stacks for top level layers,
2619 // everything else inherits layer stack from its parent.
2620 if (layer->hasParent()) {
2621 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2622 layer->getName().string());
2623 } else if (idx < 0) {
2624 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2625 "that also does not appear in the top level layer list. Something"
2626 " has gone wrong.", layer->getName().string());
2627 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002628 mCurrentState.layersSortedByZ.removeAt(idx);
2629 mCurrentState.layersSortedByZ.add(layer);
2630 // we need traversal (state changed)
2631 // AND transaction (list changed)
2632 flags |= eTransactionNeeded|eTraversalNeeded;
2633 }
2634 }
2635 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002636 if (s.barrierHandle != nullptr) {
2637 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2638 } else if (s.barrierGbp != nullptr) {
2639 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2640 if (authenticateSurfaceTextureLocked(gbp)) {
2641 const auto& otherLayer =
2642 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2643 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2644 } else {
2645 ALOGE("Attempt to defer transaction to to an"
2646 " unrecognized GraphicBufferProducer");
2647 }
2648 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002649 // We don't trigger a traversal here because if no other state is
2650 // changed, we don't want this to cause any more work
2651 }
Robert Carr1db73f62016-12-21 12:58:51 -08002652 if (what & layer_state_t::eReparentChildren) {
2653 if (layer->reparentChildren(s.reparentHandle)) {
2654 flags |= eTransactionNeeded|eTraversalNeeded;
2655 }
2656 }
Robert Carr9524cb32017-02-13 11:32:32 -08002657 if (what & layer_state_t::eDetachChildren) {
2658 layer->detachChildren();
2659 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002660 if (what & layer_state_t::eOverrideScalingModeChanged) {
2661 layer->setOverrideScalingMode(s.overrideScalingMode);
2662 // We don't trigger a traversal here because if no other state is
2663 // changed, we don't want this to cause any more work
2664 }
2665 }
2666 return flags;
2667}
2668
2669status_t SurfaceFlinger::createLayer(
2670 const String8& name,
2671 const sp<Client>& client,
2672 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002673 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2674 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002675{
2676 if (int32_t(w|h) < 0) {
2677 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2678 int(w), int(h));
2679 return BAD_VALUE;
2680 }
2681
2682 status_t result = NO_ERROR;
2683
2684 sp<Layer> layer;
2685
Cody Northropbc755282017-03-31 12:00:08 -06002686 String8 uniqueName = getUniqueLayerName(name);
2687
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002688 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2689 case ISurfaceComposerClient::eFXSurfaceNormal:
2690 result = createNormalLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002691 uniqueName, w, h, flags, format,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002692 handle, gbp, &layer);
2693 break;
2694 case ISurfaceComposerClient::eFXSurfaceDim:
2695 result = createDimLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002696 uniqueName, w, h, flags,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002697 handle, gbp, &layer);
2698 break;
2699 default:
2700 result = BAD_VALUE;
2701 break;
2702 }
2703
2704 if (result != NO_ERROR) {
2705 return result;
2706 }
2707
Albert Chaulk479c60c2017-01-27 14:21:34 -05002708 layer->setInfo(windowType, ownerUid);
2709
Robert Carr1f0a16a2016-10-24 16:27:39 -07002710 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002711 if (result != NO_ERROR) {
2712 return result;
2713 }
2714 mInterceptor.saveSurfaceCreation(layer);
2715
2716 setTransactionFlags(eTransactionNeeded);
2717 return result;
2718}
2719
Cody Northropbc755282017-03-31 12:00:08 -06002720String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
2721{
2722 bool matchFound = true;
2723 uint32_t dupeCounter = 0;
2724
2725 // Tack on our counter whether there is a hit or not, so everyone gets a tag
2726 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
2727
2728 // Loop over layers until we're sure there is no matching name
2729 while (matchFound) {
2730 matchFound = false;
2731 mDrawingState.traverseInZOrder([&](Layer* layer) {
2732 if (layer->getName() == uniqueName) {
2733 matchFound = true;
2734 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
2735 }
2736 });
2737 }
2738
2739 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
2740
2741 return uniqueName;
2742}
2743
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002744status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2745 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2746 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2747{
2748 // initialize the surfaces
2749 switch (format) {
2750 case PIXEL_FORMAT_TRANSPARENT:
2751 case PIXEL_FORMAT_TRANSLUCENT:
2752 format = PIXEL_FORMAT_RGBA_8888;
2753 break;
2754 case PIXEL_FORMAT_OPAQUE:
2755 format = PIXEL_FORMAT_RGBX_8888;
2756 break;
2757 }
2758
2759 *outLayer = new Layer(this, client, name, w, h, flags);
2760 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2761 if (err == NO_ERROR) {
2762 *handle = (*outLayer)->getHandle();
2763 *gbp = (*outLayer)->getProducer();
2764 }
2765
2766 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2767 return err;
2768}
2769
2770status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2771 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2772 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2773{
2774 *outLayer = new LayerDim(this, client, name, w, h, flags);
2775 *handle = (*outLayer)->getHandle();
2776 *gbp = (*outLayer)->getProducer();
2777 return NO_ERROR;
2778}
2779
2780status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2781{
Robert Carr9524cb32017-02-13 11:32:32 -08002782 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002783 status_t err = NO_ERROR;
2784 sp<Layer> l(client->getLayerUser(handle));
2785 if (l != NULL) {
2786 mInterceptor.saveSurfaceDeletion(l);
2787 err = removeLayer(l);
2788 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2789 "error removing layer=%p (%s)", l.get(), strerror(-err));
2790 }
2791 return err;
2792}
2793
2794status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2795{
2796 // called by ~LayerCleaner() when all references to the IBinder (handle)
2797 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002798 sp<Layer> l = layer.promote();
2799 if (l == nullptr) {
2800 // The layer has already been removed, carry on
2801 return NO_ERROR;
Robert Carr9524cb32017-02-13 11:32:32 -08002802 }
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002803 // If we have a parent, then we can continue to live as long as it does.
2804 return removeLayer(l, true);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002805}
2806
2807// ---------------------------------------------------------------------------
2808
2809void SurfaceFlinger::onInitializeDisplays() {
2810 // reset screen orientation and use primary layer stack
2811 Vector<ComposerState> state;
2812 Vector<DisplayState> displays;
2813 DisplayState d;
2814 d.what = DisplayState::eDisplayProjectionChanged |
2815 DisplayState::eLayerStackChanged;
2816 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2817 d.layerStack = 0;
2818 d.orientation = DisplayState::eOrientationDefault;
2819 d.frame.makeInvalid();
2820 d.viewport.makeInvalid();
2821 d.width = 0;
2822 d.height = 0;
2823 displays.add(d);
2824 setTransactionState(state, displays, 0);
2825 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2826
2827 const nsecs_t period =
2828 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2829 mAnimFrameTracker.setDisplayRefreshPeriod(period);
Brian Andersond0010582017-03-07 13:20:31 -08002830
2831 // Use phase of 0 since phase is not known.
2832 // Use latency of 0, which will snap to the ideal latency.
2833 setCompositorTimingSnapped(0, period, 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002834}
2835
2836void SurfaceFlinger::initializeDisplays() {
2837 class MessageScreenInitialized : public MessageBase {
2838 SurfaceFlinger* flinger;
2839 public:
2840 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2841 virtual bool handler() {
2842 flinger->onInitializeDisplays();
2843 return true;
2844 }
2845 };
2846 sp<MessageBase> msg = new MessageScreenInitialized(this);
2847 postMessageAsync(msg); // we may be called from main thread, use async message
2848}
2849
2850void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2851 int mode) {
2852 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2853 this);
2854 int32_t type = hw->getDisplayType();
2855 int currentMode = hw->getPowerMode();
2856
2857 if (mode == currentMode) {
2858 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2859 return;
2860 }
2861
2862 hw->setPowerMode(mode);
2863 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2864 ALOGW("Trying to set power mode for virtual display");
2865 return;
2866 }
2867
2868 if (mInterceptor.isEnabled()) {
2869 Mutex::Autolock _l(mStateLock);
2870 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2871 if (idx < 0) {
2872 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2873 return;
2874 }
2875 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2876 }
2877
2878 if (currentMode == HWC_POWER_MODE_OFF) {
2879 // Turn on the display
2880 getHwComposer().setPowerMode(type, mode);
Matthew Bouyack38d49612017-05-12 12:49:32 -07002881 if (type == DisplayDevice::DISPLAY_PRIMARY &&
2882 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002883 // FIXME: eventthread only knows about the main display right now
2884 mEventThread->onScreenAcquired();
2885 resyncToHardwareVsync(true);
2886 }
2887
2888 mVisibleRegionsDirty = true;
2889 mHasPoweredOff = true;
2890 repaintEverything();
2891
2892 struct sched_param param = {0};
2893 param.sched_priority = 1;
2894 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2895 ALOGW("Couldn't set SCHED_FIFO on display on");
2896 }
2897 } else if (mode == HWC_POWER_MODE_OFF) {
2898 // Turn off the display
2899 struct sched_param param = {0};
2900 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2901 ALOGW("Couldn't set SCHED_OTHER on display off");
2902 }
2903
2904 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2905 disableHardwareVsync(true); // also cancels any in-progress resync
2906
2907 // FIXME: eventthread only knows about the main display right now
2908 mEventThread->onScreenReleased();
2909 }
2910
2911 getHwComposer().setPowerMode(type, mode);
2912 mVisibleRegionsDirty = true;
2913 // from this point on, SF will stop drawing on this display
Matthew Bouyack38d49612017-05-12 12:49:32 -07002914 } else if (mode == HWC_POWER_MODE_DOZE ||
2915 mode == HWC_POWER_MODE_NORMAL) {
Zheng Zhang8a43fe62017-03-17 11:19:39 +01002916 // Update display while dozing
2917 getHwComposer().setPowerMode(type, mode);
2918 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2919 // FIXME: eventthread only knows about the main display right now
2920 mEventThread->onScreenAcquired();
2921 resyncToHardwareVsync(true);
2922 }
2923 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
2924 // Leave display going to doze
2925 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2926 disableHardwareVsync(true); // also cancels any in-progress resync
2927 // FIXME: eventthread only knows about the main display right now
2928 mEventThread->onScreenReleased();
2929 }
2930 getHwComposer().setPowerMode(type, mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002931 } else {
Matthew Bouyack38d49612017-05-12 12:49:32 -07002932 ALOGE("Attempting to set unknown power mode: %d\n", mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002933 getHwComposer().setPowerMode(type, mode);
2934 }
2935}
2936
2937void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2938 class MessageSetPowerMode: public MessageBase {
2939 SurfaceFlinger& mFlinger;
2940 sp<IBinder> mDisplay;
2941 int mMode;
2942 public:
2943 MessageSetPowerMode(SurfaceFlinger& flinger,
2944 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2945 mDisplay(disp) { mMode = mode; }
2946 virtual bool handler() {
2947 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2948 if (hw == NULL) {
2949 ALOGE("Attempt to set power mode = %d for null display %p",
2950 mMode, mDisplay.get());
2951 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2952 ALOGW("Attempt to set power mode = %d for virtual display",
2953 mMode);
2954 } else {
2955 mFlinger.setPowerModeInternal(hw, mMode);
2956 }
2957 return true;
2958 }
2959 };
2960 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2961 postMessageSync(msg);
2962}
2963
2964// ---------------------------------------------------------------------------
2965
2966status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2967{
2968 String8 result;
2969
2970 IPCThreadState* ipc = IPCThreadState::self();
2971 const int pid = ipc->getCallingPid();
2972 const int uid = ipc->getCallingUid();
2973 if ((uid != AID_SHELL) &&
2974 !PermissionCache::checkPermission(sDump, pid, uid)) {
2975 result.appendFormat("Permission Denial: "
2976 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2977 } else {
2978 // Try to get the main lock, but give up after one second
2979 // (this would indicate SF is stuck, but we want to be able to
2980 // print something in dumpsys).
2981 status_t err = mStateLock.timedLock(s2ns(1));
2982 bool locked = (err == NO_ERROR);
2983 if (!locked) {
2984 result.appendFormat(
2985 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2986 "dumping anyways (no locks held)\n", strerror(-err), err);
2987 }
2988
2989 bool dumpAll = true;
2990 size_t index = 0;
2991 size_t numArgs = args.size();
2992 if (numArgs) {
2993 if ((index < numArgs) &&
2994 (args[index] == String16("--list"))) {
2995 index++;
2996 listLayersLocked(args, index, result);
2997 dumpAll = false;
2998 }
2999
3000 if ((index < numArgs) &&
3001 (args[index] == String16("--latency"))) {
3002 index++;
3003 dumpStatsLocked(args, index, result);
3004 dumpAll = false;
3005 }
3006
3007 if ((index < numArgs) &&
3008 (args[index] == String16("--latency-clear"))) {
3009 index++;
3010 clearStatsLocked(args, index, result);
3011 dumpAll = false;
3012 }
3013
3014 if ((index < numArgs) &&
3015 (args[index] == String16("--dispsync"))) {
3016 index++;
3017 mPrimaryDispSync.dump(result);
3018 dumpAll = false;
3019 }
3020
3021 if ((index < numArgs) &&
3022 (args[index] == String16("--static-screen"))) {
3023 index++;
3024 dumpStaticScreenStats(result);
3025 dumpAll = false;
3026 }
3027
3028 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07003029 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003030 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07003031 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003032 dumpAll = false;
3033 }
3034 }
3035
3036 if (dumpAll) {
3037 dumpAllLocked(args, index, result);
3038 }
3039
3040 if (locked) {
3041 mStateLock.unlock();
3042 }
3043 }
3044 write(fd, result.string(), result.size());
3045 return NO_ERROR;
3046}
3047
3048void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3049 size_t& /* index */, String8& result) const
3050{
Robert Carr2047fae2016-11-28 14:09:09 -08003051 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003052 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08003053 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003054}
3055
3056void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3057 String8& result) const
3058{
3059 String8 name;
3060 if (index < args.size()) {
3061 name = String8(args[index]);
3062 index++;
3063 }
3064
3065 const nsecs_t period =
3066 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3067 result.appendFormat("%" PRId64 "\n", period);
3068
3069 if (name.isEmpty()) {
3070 mAnimFrameTracker.dumpStats(result);
3071 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08003072 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003073 if (name == layer->getName()) {
3074 layer->dumpFrameStats(result);
3075 }
Robert Carr2047fae2016-11-28 14:09:09 -08003076 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003077 }
3078}
3079
3080void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3081 String8& /* result */)
3082{
3083 String8 name;
3084 if (index < args.size()) {
3085 name = String8(args[index]);
3086 index++;
3087 }
3088
Robert Carr2047fae2016-11-28 14:09:09 -08003089 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003090 if (name.isEmpty() || (name == layer->getName())) {
3091 layer->clearFrameStats();
3092 }
Robert Carr2047fae2016-11-28 14:09:09 -08003093 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003094
3095 mAnimFrameTracker.clearStats();
3096}
3097
3098// This should only be called from the main thread. Otherwise it would need
3099// the lock and should use mCurrentState rather than mDrawingState.
3100void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003101 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003102 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003103 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003104
3105 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3106}
3107
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003108void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003109{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003110 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003111 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3112
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003113 if (isLayerTripleBufferingDisabled())
3114 result.append(" DISABLE_TRIPLE_BUFFERING");
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003115
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003116 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003117 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08003118 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08003119 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
Fabien Sanglard1971b632017-03-10 14:50:03 -08003120 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3121 maxFrameBufferAcquiredBuffers);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003122 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003123}
3124
3125void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3126{
3127 result.appendFormat("Static screen stats:\n");
3128 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3129 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3130 float percent = 100.0f *
3131 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3132 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3133 b + 1, bucketTimeSec, percent);
3134 }
3135 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3136 float percent = 100.0f *
3137 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3138 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3139 NUM_BUCKETS - 1, bucketTimeSec, percent);
3140}
3141
Brian Andersond6927fb2016-07-23 23:37:30 -07003142void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3143 result.appendFormat("Layer frame timestamps:\n");
3144
3145 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3146 const size_t count = currentLayers.size();
3147 for (size_t i=0 ; i<count ; i++) {
3148 currentLayers[i]->dumpFrameEvents(result);
3149 }
3150}
3151
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003152void SurfaceFlinger::recordBufferingStats(const char* layerName,
3153 std::vector<OccupancyTracker::Segment>&& history) {
3154 Mutex::Autolock lock(mBufferingStatsMutex);
3155 auto& stats = mBufferingStats[layerName];
3156 for (const auto& segment : history) {
3157 if (!segment.usedThirdBuffer) {
3158 stats.twoBufferTime += segment.totalTime;
3159 }
3160 if (segment.occupancyAverage < 1.0f) {
3161 stats.doubleBufferedTime += segment.totalTime;
3162 } else if (segment.occupancyAverage < 2.0f) {
3163 stats.tripleBufferedTime += segment.totalTime;
3164 }
3165 ++stats.numSegments;
3166 stats.totalTime += segment.totalTime;
3167 }
3168}
3169
3170void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3171 result.append("Buffering stats:\n");
3172 result.append(" [Layer name] <Active time> <Two buffer> "
3173 "<Double buffered> <Triple buffered>\n");
3174 Mutex::Autolock lock(mBufferingStatsMutex);
3175 typedef std::tuple<std::string, float, float, float> BufferTuple;
3176 std::map<float, BufferTuple, std::greater<float>> sorted;
3177 for (const auto& statsPair : mBufferingStats) {
3178 const char* name = statsPair.first.c_str();
3179 const BufferingStats& stats = statsPair.second;
3180 if (stats.numSegments == 0) {
3181 continue;
3182 }
3183 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3184 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3185 stats.totalTime;
3186 float doubleBufferRatio = static_cast<float>(
3187 stats.doubleBufferedTime) / stats.totalTime;
3188 float tripleBufferRatio = static_cast<float>(
3189 stats.tripleBufferedTime) / stats.totalTime;
3190 sorted.insert({activeTime, {name, twoBufferRatio,
3191 doubleBufferRatio, tripleBufferRatio}});
3192 }
3193 for (const auto& sortedPair : sorted) {
3194 float activeTime = sortedPair.first;
3195 const BufferTuple& values = sortedPair.second;
3196 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3197 std::get<0>(values).c_str(), activeTime,
3198 std::get<1>(values), std::get<2>(values),
3199 std::get<3>(values));
3200 }
3201 result.append("\n");
3202}
3203
3204void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3205 String8& result) const
3206{
3207 bool colorize = false;
3208 if (index < args.size()
3209 && (args[index] == String16("--color"))) {
3210 colorize = true;
3211 index++;
3212 }
3213
3214 Colorizer colorizer(colorize);
3215
3216 // figure out if we're stuck somewhere
3217 const nsecs_t now = systemTime();
3218 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3219 const nsecs_t inTransaction(mDebugInTransaction);
3220 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3221 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3222
3223 /*
3224 * Dump library configuration.
3225 */
3226
3227 colorizer.bold(result);
3228 result.append("Build configuration:");
3229 colorizer.reset(result);
3230 appendSfConfigString(result);
3231 appendUiConfigString(result);
3232 appendGuiConfigString(result);
3233 result.append("\n");
3234
3235 colorizer.bold(result);
3236 result.append("Sync configuration: ");
3237 colorizer.reset(result);
3238 result.append(SyncFeatures::getInstance().toString());
3239 result.append("\n");
3240
3241 colorizer.bold(result);
3242 result.append("DispSync configuration: ");
3243 colorizer.reset(result);
3244 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003245 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3246 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003247 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3248 result.append("\n");
3249
3250 // Dump static screen stats
3251 result.append("\n");
3252 dumpStaticScreenStats(result);
3253 result.append("\n");
3254
3255 dumpBufferingStats(result);
3256
3257 /*
3258 * Dump the visible layer list
3259 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003260 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003261 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003262 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003263 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003264 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003265 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003266
3267 /*
3268 * Dump Display state
3269 */
3270
3271 colorizer.bold(result);
3272 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3273 colorizer.reset(result);
3274 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3275 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3276 hw->dump(result);
3277 }
3278
3279 /*
3280 * Dump SurfaceFlinger global state
3281 */
3282
3283 colorizer.bold(result);
3284 result.append("SurfaceFlinger global state:\n");
3285 colorizer.reset(result);
3286
3287 HWComposer& hwc(getHwComposer());
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003288 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003289
3290 colorizer.bold(result);
3291 result.appendFormat("EGL implementation : %s\n",
3292 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3293 colorizer.reset(result);
3294 result.appendFormat("%s\n",
3295 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3296
3297 mRenderEngine->dump(result);
3298
3299 hw->undefinedRegion.dump(result, "undefinedRegion");
3300 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3301 hw->getOrientation(), hw->isDisplayOn());
3302 result.appendFormat(
3303 " last eglSwapBuffers() time: %f us\n"
3304 " last transaction time : %f us\n"
3305 " transaction-flags : %08x\n"
3306 " refresh-rate : %f fps\n"
3307 " x-dpi : %f\n"
3308 " y-dpi : %f\n"
3309 " gpu_to_cpu_unsupported : %d\n"
3310 ,
3311 mLastSwapBufferTime/1000.0,
3312 mLastTransactionTime/1000.0,
3313 mTransactionFlags,
3314 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3315 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3316 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3317 !mGpuToCpuSupported);
3318
3319 result.appendFormat(" eglSwapBuffers time: %f us\n",
3320 inSwapBuffersDuration/1000.0);
3321
3322 result.appendFormat(" transaction time: %f us\n",
3323 inTransactionDuration/1000.0);
3324
3325 /*
3326 * VSYNC state
3327 */
3328 mEventThread->dump(result);
3329
3330 /*
3331 * Dump HWComposer state
3332 */
3333 colorizer.bold(result);
3334 result.append("h/w composer state:\n");
3335 colorizer.reset(result);
3336 result.appendFormat(" h/w composer %s and %s\n",
3337 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3338 (mDebugDisableHWC || mDebugRegion || mDaltonize
3339 || mHasColorMatrix) ? "disabled" : "enabled");
3340 hwc.dump(result);
3341
3342 /*
3343 * Dump gralloc state
3344 */
3345 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3346 alloc.dump(result);
3347}
3348
3349const Vector< sp<Layer> >&
3350SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3351 // Note: mStateLock is held here
3352 wp<IBinder> dpy;
3353 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3354 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3355 dpy = mDisplays.keyAt(i);
3356 break;
3357 }
3358 }
3359 if (dpy == NULL) {
3360 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3361 // Just use the primary display so we have something to return
3362 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3363 }
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003364 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003365}
3366
3367bool SurfaceFlinger::startDdmConnection()
3368{
3369 void* libddmconnection_dso =
3370 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3371 if (!libddmconnection_dso) {
3372 return false;
3373 }
3374 void (*DdmConnection_start)(const char* name);
3375 DdmConnection_start =
3376 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3377 if (!DdmConnection_start) {
3378 dlclose(libddmconnection_dso);
3379 return false;
3380 }
3381 (*DdmConnection_start)(getServiceName());
3382 return true;
3383}
3384
3385status_t SurfaceFlinger::onTransact(
3386 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3387{
3388 switch (code) {
3389 case CREATE_CONNECTION:
3390 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003391 case BOOT_FINISHED:
3392 case CLEAR_ANIMATION_FRAME_STATS:
3393 case GET_ANIMATION_FRAME_STATS:
3394 case SET_POWER_MODE:
3395 case GET_HDR_CAPABILITIES:
3396 {
3397 // codes that require permission check
3398 IPCThreadState* ipc = IPCThreadState::self();
3399 const int pid = ipc->getCallingPid();
3400 const int uid = ipc->getCallingUid();
3401 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3402 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3403 ALOGE("Permission Denial: "
3404 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3405 return PERMISSION_DENIED;
3406 }
3407 break;
3408 }
Robert Carr1db73f62016-12-21 12:58:51 -08003409 /*
3410 * Calling setTransactionState is safe, because you need to have been
3411 * granted a reference to Client* and Handle* to do anything with it.
3412 *
3413 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3414 */
3415 case SET_TRANSACTION_STATE:
3416 case CREATE_SCOPED_CONNECTION:
3417 {
3418 break;
3419 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003420 case CAPTURE_SCREEN:
3421 {
3422 // codes that require permission check
3423 IPCThreadState* ipc = IPCThreadState::self();
3424 const int pid = ipc->getCallingPid();
3425 const int uid = ipc->getCallingUid();
3426 if ((uid != AID_GRAPHICS) &&
3427 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3428 ALOGE("Permission Denial: "
3429 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3430 return PERMISSION_DENIED;
3431 }
3432 break;
3433 }
3434 }
3435
3436 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3437 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3438 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3439 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3440 IPCThreadState* ipc = IPCThreadState::self();
3441 const int pid = ipc->getCallingPid();
3442 const int uid = ipc->getCallingUid();
3443 ALOGE("Permission Denial: "
3444 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3445 return PERMISSION_DENIED;
3446 }
3447 int n;
3448 switch (code) {
3449 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3450 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3451 return NO_ERROR;
3452 case 1002: // SHOW_UPDATES
3453 n = data.readInt32();
3454 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3455 invalidateHwcGeometry();
3456 repaintEverything();
3457 return NO_ERROR;
3458 case 1004:{ // repaint everything
3459 repaintEverything();
3460 return NO_ERROR;
3461 }
3462 case 1005:{ // force transaction
3463 setTransactionFlags(
3464 eTransactionNeeded|
3465 eDisplayTransactionNeeded|
3466 eTraversalNeeded);
3467 return NO_ERROR;
3468 }
3469 case 1006:{ // send empty update
3470 signalRefresh();
3471 return NO_ERROR;
3472 }
3473 case 1008: // toggle use of hw composer
3474 n = data.readInt32();
3475 mDebugDisableHWC = n ? 1 : 0;
3476 invalidateHwcGeometry();
3477 repaintEverything();
3478 return NO_ERROR;
3479 case 1009: // toggle use of transform hint
3480 n = data.readInt32();
3481 mDebugDisableTransformHint = n ? 1 : 0;
3482 invalidateHwcGeometry();
3483 repaintEverything();
3484 return NO_ERROR;
3485 case 1010: // interrogate.
3486 reply->writeInt32(0);
3487 reply->writeInt32(0);
3488 reply->writeInt32(mDebugRegion);
3489 reply->writeInt32(0);
3490 reply->writeInt32(mDebugDisableHWC);
3491 return NO_ERROR;
3492 case 1013: {
3493 Mutex::Autolock _l(mStateLock);
3494 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3495 reply->writeInt32(hw->getPageFlipCount());
3496 return NO_ERROR;
3497 }
3498 case 1014: {
3499 // daltonize
3500 n = data.readInt32();
3501 switch (n % 10) {
3502 case 1:
3503 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3504 break;
3505 case 2:
3506 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3507 break;
3508 case 3:
3509 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3510 break;
3511 }
3512 if (n >= 10) {
3513 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3514 } else {
3515 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3516 }
3517 mDaltonize = n > 0;
3518 invalidateHwcGeometry();
3519 repaintEverything();
3520 return NO_ERROR;
3521 }
3522 case 1015: {
3523 // apply a color matrix
3524 n = data.readInt32();
3525 mHasColorMatrix = n ? 1 : 0;
3526 if (n) {
3527 // color matrix is sent as mat3 matrix followed by vec3
3528 // offset, then packed into a mat4 where the last row is
3529 // the offset and extra values are 0
3530 for (size_t i = 0 ; i < 4; i++) {
3531 for (size_t j = 0; j < 4; j++) {
3532 mColorMatrix[i][j] = data.readFloat();
3533 }
3534 }
3535 } else {
3536 mColorMatrix = mat4();
3537 }
3538 invalidateHwcGeometry();
3539 repaintEverything();
3540 return NO_ERROR;
3541 }
3542 // This is an experimental interface
3543 // Needs to be shifted to proper binder interface when we productize
3544 case 1016: {
3545 n = data.readInt32();
3546 mPrimaryDispSync.setRefreshSkipCount(n);
3547 return NO_ERROR;
3548 }
3549 case 1017: {
3550 n = data.readInt32();
3551 mForceFullDamage = static_cast<bool>(n);
3552 return NO_ERROR;
3553 }
3554 case 1018: { // Modify Choreographer's phase offset
3555 n = data.readInt32();
3556 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3557 return NO_ERROR;
3558 }
3559 case 1019: { // Modify SurfaceFlinger's phase offset
3560 n = data.readInt32();
3561 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3562 return NO_ERROR;
3563 }
3564 case 1020: { // Layer updates interceptor
3565 n = data.readInt32();
3566 if (n) {
3567 ALOGV("Interceptor enabled");
3568 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3569 }
3570 else{
3571 ALOGV("Interceptor disabled");
3572 mInterceptor.disable();
3573 }
3574 return NO_ERROR;
3575 }
3576 case 1021: { // Disable HWC virtual displays
3577 n = data.readInt32();
3578 mUseHwcVirtualDisplays = !n;
3579 return NO_ERROR;
3580 }
3581 }
3582 }
3583 return err;
3584}
3585
3586void SurfaceFlinger::repaintEverything() {
3587 android_atomic_or(1, &mRepaintEverything);
3588 signalTransaction();
3589}
3590
3591// ---------------------------------------------------------------------------
3592// Capture screen into an IGraphiBufferProducer
3593// ---------------------------------------------------------------------------
3594
3595/* The code below is here to handle b/8734824
3596 *
3597 * We create a IGraphicBufferProducer wrapper that forwards all calls
3598 * from the surfaceflinger thread to the calling binder thread, where they
3599 * are executed. This allows the calling thread in the calling process to be
3600 * reused and not depend on having "enough" binder threads to handle the
3601 * requests.
3602 */
3603class GraphicProducerWrapper : public BBinder, public MessageHandler {
3604 /* Parts of GraphicProducerWrapper are run on two different threads,
3605 * communicating by sending messages via Looper but also by shared member
3606 * data. Coherence maintenance is subtle and in places implicit (ugh).
3607 *
3608 * Don't rely on Looper's sendMessage/handleMessage providing
3609 * release/acquire semantics for any data not actually in the Message.
3610 * Data going from surfaceflinger to binder threads needs to be
3611 * synchronized explicitly.
3612 *
3613 * Barrier open/wait do provide release/acquire semantics. This provides
3614 * implicit synchronization for data coming back from binder to
3615 * surfaceflinger threads.
3616 */
3617
3618 sp<IGraphicBufferProducer> impl;
3619 sp<Looper> looper;
3620 status_t result;
3621 bool exitPending;
3622 bool exitRequested;
3623 Barrier barrier;
3624 uint32_t code;
3625 Parcel const* data;
3626 Parcel* reply;
3627
3628 enum {
3629 MSG_API_CALL,
3630 MSG_EXIT
3631 };
3632
3633 /*
3634 * Called on surfaceflinger thread. This is called by our "fake"
3635 * BpGraphicBufferProducer. We package the data and reply Parcel and
3636 * forward them to the binder thread.
3637 */
3638 virtual status_t transact(uint32_t code,
3639 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3640 this->code = code;
3641 this->data = &data;
3642 this->reply = reply;
3643 if (exitPending) {
3644 // if we've exited, we run the message synchronously right here.
3645 // note (JH): as far as I can tell from looking at the code, this
3646 // never actually happens. if it does, i'm not sure if it happens
3647 // on the surfaceflinger or binder thread.
3648 handleMessage(Message(MSG_API_CALL));
3649 } else {
3650 barrier.close();
3651 // Prevent stores to this->{code, data, reply} from being
3652 // reordered later than the construction of Message.
3653 atomic_thread_fence(memory_order_release);
3654 looper->sendMessage(this, Message(MSG_API_CALL));
3655 barrier.wait();
3656 }
3657 return result;
3658 }
3659
3660 /*
3661 * here we run on the binder thread. All we've got to do is
3662 * call the real BpGraphicBufferProducer.
3663 */
3664 virtual void handleMessage(const Message& message) {
3665 int what = message.what;
3666 // Prevent reads below from happening before the read from Message
3667 atomic_thread_fence(memory_order_acquire);
3668 if (what == MSG_API_CALL) {
3669 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3670 barrier.open();
3671 } else if (what == MSG_EXIT) {
3672 exitRequested = true;
3673 }
3674 }
3675
3676public:
3677 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3678 : impl(impl),
3679 looper(new Looper(true)),
3680 result(NO_ERROR),
3681 exitPending(false),
3682 exitRequested(false),
3683 code(0),
3684 data(NULL),
3685 reply(NULL)
3686 {}
3687
3688 // Binder thread
3689 status_t waitForResponse() {
3690 do {
3691 looper->pollOnce(-1);
3692 } while (!exitRequested);
3693 return result;
3694 }
3695
3696 // Client thread
3697 void exit(status_t result) {
3698 this->result = result;
3699 exitPending = true;
3700 // Ensure this->result is visible to the binder thread before it
3701 // handles the message.
3702 atomic_thread_fence(memory_order_release);
3703 looper->sendMessage(this, Message(MSG_EXIT));
3704 }
3705};
3706
3707
3708status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3709 const sp<IGraphicBufferProducer>& producer,
3710 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003711 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003712 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3713
3714 if (CC_UNLIKELY(display == 0))
3715 return BAD_VALUE;
3716
3717 if (CC_UNLIKELY(producer == 0))
3718 return BAD_VALUE;
3719
3720 // if we have secure windows on this display, never allow the screen capture
3721 // unless the producer interface is local (i.e.: we can take a screenshot for
3722 // ourselves).
3723 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3724
3725 // Convert to surfaceflinger's internal rotation type.
3726 Transform::orientation_flags rotationFlags;
3727 switch (rotation) {
3728 case ISurfaceComposer::eRotateNone:
3729 rotationFlags = Transform::ROT_0;
3730 break;
3731 case ISurfaceComposer::eRotate90:
3732 rotationFlags = Transform::ROT_90;
3733 break;
3734 case ISurfaceComposer::eRotate180:
3735 rotationFlags = Transform::ROT_180;
3736 break;
3737 case ISurfaceComposer::eRotate270:
3738 rotationFlags = Transform::ROT_270;
3739 break;
3740 default:
3741 rotationFlags = Transform::ROT_0;
3742 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3743 break;
3744 }
3745
3746 class MessageCaptureScreen : public MessageBase {
3747 SurfaceFlinger* flinger;
3748 sp<IBinder> display;
3749 sp<IGraphicBufferProducer> producer;
3750 Rect sourceCrop;
3751 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003752 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003753 bool useIdentityTransform;
3754 Transform::orientation_flags rotation;
3755 status_t result;
3756 bool isLocalScreenshot;
3757 public:
3758 MessageCaptureScreen(SurfaceFlinger* flinger,
3759 const sp<IBinder>& display,
3760 const sp<IGraphicBufferProducer>& producer,
3761 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003762 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003763 bool useIdentityTransform,
3764 Transform::orientation_flags rotation,
3765 bool isLocalScreenshot)
3766 : flinger(flinger), display(display), producer(producer),
3767 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3768 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3769 useIdentityTransform(useIdentityTransform),
3770 rotation(rotation), result(PERMISSION_DENIED),
3771 isLocalScreenshot(isLocalScreenshot)
3772 {
3773 }
3774 status_t getResult() const {
3775 return result;
3776 }
3777 virtual bool handler() {
3778 Mutex::Autolock _l(flinger->mStateLock);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003779 sp<const DisplayDevice> hw(flinger->getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003780 result = flinger->captureScreenImplLocked(hw, producer,
3781 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3782 useIdentityTransform, rotation, isLocalScreenshot);
3783 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3784 return true;
3785 }
3786 };
3787
3788 // this creates a "fake" BBinder which will serve as a "fake" remote
3789 // binder to receive the marshaled calls and forward them to the
3790 // real remote (a BpGraphicBufferProducer)
3791 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3792
3793 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3794 // which does the marshaling work forwards to our "fake remote" above.
3795 sp<MessageBase> msg = new MessageCaptureScreen(this,
3796 display, IGraphicBufferProducer::asInterface( wrapper ),
3797 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3798 useIdentityTransform, rotationFlags, isLocalScreenshot);
3799
3800 status_t res = postMessageAsync(msg);
3801 if (res == NO_ERROR) {
3802 res = wrapper->waitForResponse();
3803 }
3804 return res;
3805}
3806
3807
3808void SurfaceFlinger::renderScreenImplLocked(
3809 const sp<const DisplayDevice>& hw,
3810 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003811 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003812 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3813{
3814 ATRACE_CALL();
3815 RenderEngine& engine(getRenderEngine());
3816
3817 // get screen geometry
3818 const int32_t hw_w = hw->getWidth();
3819 const int32_t hw_h = hw->getHeight();
3820 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3821 static_cast<int32_t>(reqHeight) != hw_h;
3822
3823 // if a default or invalid sourceCrop is passed in, set reasonable values
3824 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3825 !sourceCrop.isValid()) {
3826 sourceCrop.setLeftTop(Point(0, 0));
3827 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3828 }
3829
3830 // ensure that sourceCrop is inside screen
3831 if (sourceCrop.left < 0) {
3832 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3833 }
3834 if (sourceCrop.right > hw_w) {
3835 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3836 }
3837 if (sourceCrop.top < 0) {
3838 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3839 }
3840 if (sourceCrop.bottom > hw_h) {
3841 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3842 }
3843
3844 // make sure to clear all GL error flags
3845 engine.checkErrors();
3846
3847 // set-up our viewport
3848 engine.setViewportAndProjection(
3849 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3850 engine.disableTexturing();
3851
3852 // redraw the screen entirely...
3853 engine.clearWithColor(0, 0, 0, 1);
3854
Robert Carr1f0a16a2016-10-24 16:27:39 -07003855 // We loop through the first level of layers without traversing,
3856 // as we need to interpret min/max layer Z in the top level Z space.
3857 for (const auto& layer : mDrawingState.layersSortedByZ) {
3858 if (layer->getLayerStack() != hw->getLayerStack()) {
3859 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003860 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003861 const Layer::State& state(layer->getDrawingState());
3862 if (state.z < minLayerZ || state.z > maxLayerZ) {
3863 continue;
3864 }
Dan Stoza412903f2017-04-27 13:42:17 -07003865 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003866 if (!layer->isVisible()) {
3867 return;
3868 }
3869 if (filtering) layer->setFiltering(true);
3870 layer->draw(hw, useIdentityTransform);
3871 if (filtering) layer->setFiltering(false);
3872 });
3873 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003874
3875 // compositionComplete is needed for older driver
3876 hw->compositionComplete();
3877 hw->setViewportAndProjection();
3878}
3879
3880
3881status_t SurfaceFlinger::captureScreenImplLocked(
3882 const sp<const DisplayDevice>& hw,
3883 const sp<IGraphicBufferProducer>& producer,
3884 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003885 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003886 bool useIdentityTransform, Transform::orientation_flags rotation,
3887 bool isLocalScreenshot)
3888{
3889 ATRACE_CALL();
3890
3891 // get screen geometry
3892 uint32_t hw_w = hw->getWidth();
3893 uint32_t hw_h = hw->getHeight();
3894
3895 if (rotation & Transform::ROT_90) {
3896 std::swap(hw_w, hw_h);
3897 }
3898
3899 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3900 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3901 reqWidth, reqHeight, hw_w, hw_h);
3902 return BAD_VALUE;
3903 }
3904
3905 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3906 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3907
3908 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003909 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003910 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003911 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3912 (state.z < minLayerZ || state.z > maxLayerZ)) {
3913 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003914 }
Dan Stoza412903f2017-04-27 13:42:17 -07003915 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003916 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3917 layer->isSecure());
3918 });
3919 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003920
3921 if (!isLocalScreenshot && secureLayerIsVisible) {
3922 ALOGW("FB is protected: PERMISSION_DENIED");
3923 return PERMISSION_DENIED;
3924 }
3925
3926 // create a surface (because we're a producer, and we need to
3927 // dequeue/queue a buffer)
3928 sp<Surface> sur = new Surface(producer, false);
3929 ANativeWindow* window = sur.get();
3930
3931 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3932 if (result == NO_ERROR) {
3933 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3934 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3935
3936 int err = 0;
3937 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3938 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3939 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3940 err |= native_window_set_usage(window, usage);
3941
3942 if (err == NO_ERROR) {
3943 ANativeWindowBuffer* buffer;
3944 /* TODO: Once we have the sync framework everywhere this can use
3945 * server-side waits on the fence that dequeueBuffer returns.
3946 */
3947 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3948 if (result == NO_ERROR) {
3949 int syncFd = -1;
3950 // create an EGLImage from the buffer so we can later
3951 // turn it into a texture
3952 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3953 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3954 if (image != EGL_NO_IMAGE_KHR) {
3955 // this binds the given EGLImage as a framebuffer for the
3956 // duration of this scope.
3957 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3958 if (imageBond.getStatus() == NO_ERROR) {
3959 // this will in fact render into our dequeued buffer
3960 // via an FBO, which means we didn't have to create
3961 // an EGLSurface and therefore we're not
3962 // dependent on the context's EGLConfig.
3963 renderScreenImplLocked(
3964 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3965 useIdentityTransform, rotation);
3966
3967 // Attempt to create a sync khr object that can produce a sync point. If that
3968 // isn't available, create a non-dupable sync object in the fallback path and
3969 // wait on it directly.
3970 EGLSyncKHR sync;
3971 if (!DEBUG_SCREENSHOTS) {
3972 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3973 // native fence fd will not be populated until flush() is done.
3974 getRenderEngine().flush();
3975 } else {
3976 sync = EGL_NO_SYNC_KHR;
3977 }
3978 if (sync != EGL_NO_SYNC_KHR) {
3979 // get the sync fd
3980 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3981 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3982 ALOGW("captureScreen: failed to dup sync khr object");
3983 syncFd = -1;
3984 }
3985 eglDestroySyncKHR(mEGLDisplay, sync);
3986 } else {
3987 // fallback path
3988 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3989 if (sync != EGL_NO_SYNC_KHR) {
3990 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3991 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3992 EGLint eglErr = eglGetError();
3993 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3994 ALOGW("captureScreen: fence wait timed out");
3995 } else {
3996 ALOGW_IF(eglErr != EGL_SUCCESS,
3997 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3998 }
3999 eglDestroySyncKHR(mEGLDisplay, sync);
4000 } else {
4001 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
4002 }
4003 }
4004 if (DEBUG_SCREENSHOTS) {
4005 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
4006 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
4007 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
4008 hw, minLayerZ, maxLayerZ);
4009 delete [] pixels;
4010 }
4011
4012 } else {
4013 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
4014 result = INVALID_OPERATION;
4015 window->cancelBuffer(window, buffer, syncFd);
4016 buffer = NULL;
4017 }
4018 // destroy our image
4019 eglDestroyImageKHR(mEGLDisplay, image);
4020 } else {
4021 result = BAD_VALUE;
4022 }
4023 if (buffer) {
4024 // queueBuffer takes ownership of syncFd
4025 result = window->queueBuffer(window, buffer, syncFd);
4026 }
4027 }
4028 } else {
4029 result = BAD_VALUE;
4030 }
4031 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
4032 }
4033
4034 return result;
4035}
4036
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004037void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08004038 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004039 if (DEBUG_SCREENSHOTS) {
4040 for (size_t y=0 ; y<h ; y++) {
4041 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4042 for (size_t x=0 ; x<w ; x++) {
4043 if (p[x] != 0xFF000000) return;
4044 }
4045 }
4046 ALOGE("*** we just took a black screenshot ***\n"
4047 "requested minz=%d, maxz=%d, layerStack=%d",
4048 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08004049 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004050 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004051 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004052 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4053 state.z <= maxLayerZ) {
Dan Stoza412903f2017-04-27 13:42:17 -07004054 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07004055 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
4056 layer->isVisible() ? '+' : '-',
4057 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004058 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07004059 i++;
4060 });
4061 }
4062 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004063 }
4064}
4065
4066// ---------------------------------------------------------------------------
4067
Dan Stoza412903f2017-04-27 13:42:17 -07004068void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4069 layersSortedByZ.traverseInZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004070}
4071
Dan Stoza412903f2017-04-27 13:42:17 -07004072void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4073 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004074}
4075
4076}; // namespace android
4077
4078
4079#if defined(__gl_h_)
4080#error "don't include gl/gl.h in this file"
4081#endif
4082
4083#if defined(__gl2_h_)
4084#error "don't include gl2/gl2.h in this file"
4085#endif