blob: f6ee6604e85c43037e8d71bc47b2fac4a641d434 [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 Wangb254fa32017-01-31 17:43:23 -0800323 if (mStartBootAnimThread->join() != NO_ERROR) {
324 ALOGE("Join StartBootAnimThread failed!");
325 }
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
504void SurfaceFlinger::init() {
505 ALOGI( "SurfaceFlinger's main thread ready to run. "
506 "Initializing graphics H/W...");
507
508 Mutex::Autolock _l(mStateLock);
509
510 // initialize EGL for the default display
511 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
512 eglInitialize(mEGLDisplay, NULL, NULL);
513
514 // start the EventThread
515 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
516 vsyncPhaseOffsetNs, true, "app");
517 mEventThread = new EventThread(vsyncSrc, *this, false);
518 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
519 sfVsyncPhaseOffsetNs, true, "sf");
520 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
521 mEventQueue.setEventThread(mSFEventThread);
522
Tim Murray22752852017-05-04 13:38:49 -0700523 // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000524 struct sched_param param = {0};
525 param.sched_priority = 2;
526 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
527 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
528 }
Tim Murray22752852017-05-04 13:38:49 -0700529 if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, &param) != 0) {
530 ALOGE("Couldn't set SCHED_FIFO for EventThread");
531 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000532
533 // Initialize the H/W composer object. There may or may not be an
534 // actual hardware composer underneath.
535 mHwc = new HWComposer(this,
536 *static_cast<HWComposer::EventHandler *>(this));
537
538 // get a RenderEngine for the given display / config (can't fail)
539 mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID());
540
541 // retrieve the EGL context that was selected/created
542 mEGLContext = mRenderEngine->getEGLContext();
543
544 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
545 "couldn't create EGLContext");
546
Ian Elliott5c34de22017-04-10 14:42:30 -0600547 // Inform native graphics APIs that the present timestamp is NOT supported:
548 property_set(kTimestampProperty, "0");
549
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000550 // 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 Wangb254fa32017-01-31 17:43:23 -0800602 mStartBootAnimThread = new StartBootAnimThread();
603 if (mStartBootAnimThread->Start() != NO_ERROR) {
604 ALOGE("Run StartBootAnimThread failed!");
605 }
606
607 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000608}
609
610int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
611 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
612 type : mHwc->allocateDisplayId();
613}
614
615void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800616 // Start boot animation service by setting a property mailbox
617 // if property setting thread is already running, Start() will be just a NOP
618 mStartBootAnimThread->Start();
619 // Wait until property was set
620 if (mStartBootAnimThread->join() != NO_ERROR) {
621 ALOGE("Join StartBootAnimThread failed!");
622 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000623}
624
625size_t SurfaceFlinger::getMaxTextureSize() const {
626 return mRenderEngine->getMaxTextureSize();
627}
628
629size_t SurfaceFlinger::getMaxViewportDims() const {
630 return mRenderEngine->getMaxViewportDims();
631}
632
633// ----------------------------------------------------------------------------
634
635bool SurfaceFlinger::authenticateSurfaceTexture(
636 const sp<IGraphicBufferProducer>& bufferProducer) const {
637 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800638 return authenticateSurfaceTextureLocked(bufferProducer);
639}
640
641bool SurfaceFlinger::authenticateSurfaceTextureLocked(
642 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000643 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
644 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
645}
646
Brian Anderson6b376712017-04-04 10:51:39 -0700647status_t SurfaceFlinger::getSupportedFrameTimestamps(
648 std::vector<FrameEvent>* outSupported) const {
649 *outSupported = {
650 FrameEvent::REQUESTED_PRESENT,
651 FrameEvent::ACQUIRE,
652 FrameEvent::LATCH,
653 FrameEvent::FIRST_REFRESH_START,
654 FrameEvent::LAST_REFRESH_START,
655 FrameEvent::GPU_COMPOSITION_DONE,
656 FrameEvent::DEQUEUE_READY,
657 FrameEvent::RELEASE,
658 };
659 return NO_ERROR;
660}
661
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000662status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
663 Vector<DisplayInfo>* configs) {
664 if ((configs == NULL) || (display.get() == NULL)) {
665 return BAD_VALUE;
666 }
667
668 int32_t type = getDisplayType(display);
669 if (type < 0) return type;
670
671 // TODO: Not sure if display density should handled by SF any longer
672 class Density {
673 static int getDensityFromProperty(char const* propName) {
674 char property[PROPERTY_VALUE_MAX];
675 int density = 0;
676 if (property_get(propName, property, NULL) > 0) {
677 density = atoi(property);
678 }
679 return density;
680 }
681 public:
682 static int getEmuDensity() {
683 return getDensityFromProperty("qemu.sf.lcd_density"); }
684 static int getBuildDensity() {
685 return getDensityFromProperty("ro.sf.lcd_density"); }
686 };
687
688 configs->clear();
689
690 const Vector<HWComposer::DisplayConfig>& hwConfigs =
691 getHwComposer().getConfigs(type);
692 for (size_t c = 0; c < hwConfigs.size(); ++c) {
693 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
694 DisplayInfo info = DisplayInfo();
695
696 float xdpi = hwConfig.xdpi;
697 float ydpi = hwConfig.ydpi;
698
699 if (type == DisplayDevice::DISPLAY_PRIMARY) {
700 // The density of the device is provided by a build property
701 float density = Density::getBuildDensity() / 160.0f;
702 if (density == 0) {
703 // the build doesn't provide a density -- this is wrong!
704 // use xdpi instead
705 ALOGE("ro.sf.lcd_density must be defined as a build property");
706 density = xdpi / 160.0f;
707 }
708 if (Density::getEmuDensity()) {
709 // if "qemu.sf.lcd_density" is specified, it overrides everything
710 xdpi = ydpi = density = Density::getEmuDensity();
711 density /= 160.0f;
712 }
713 info.density = density;
714
715 // TODO: this needs to go away (currently needed only by webkit)
716 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
717 info.orientation = hw->getOrientation();
718 } else {
719 // TODO: where should this value come from?
720 static const int TV_DENSITY = 213;
721 info.density = TV_DENSITY / 160.0f;
722 info.orientation = 0;
723 }
724
725 info.w = hwConfig.width;
726 info.h = hwConfig.height;
727 info.xdpi = xdpi;
728 info.ydpi = ydpi;
729 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800730 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000731
732 // This is how far in advance a buffer must be queued for
733 // presentation at a given time. If you want a buffer to appear
734 // on the screen at time N, you must submit the buffer before
735 // (N - presentationDeadline).
736 //
737 // Normally it's one full refresh period (to give SF a chance to
738 // latch the buffer), but this can be reduced by configuring a
739 // DispSync offset. Any additional delays introduced by the hardware
740 // composer or panel must be accounted for here.
741 //
742 // We add an additional 1ms to allow for processing time and
743 // differences between the ideal and actual refresh rate.
744 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800745 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000746
747 // All non-virtual displays are currently considered secure.
748 info.secure = true;
749
750 configs->push_back(info);
751 }
752
753 return NO_ERROR;
754}
755
756status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
757 DisplayStatInfo* stats) {
758 if (stats == NULL) {
759 return BAD_VALUE;
760 }
761
762 // FIXME for now we always return stats for the primary display
763 memset(stats, 0, sizeof(*stats));
764 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
765 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
766 return NO_ERROR;
767}
768
769int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -0700770 sp<const DisplayDevice> device(getDisplayDevice(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000771 if (device != NULL) {
772 return device->getActiveConfig();
773 }
774 return BAD_VALUE;
775}
776
777void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
778 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
779 this);
780 int32_t type = hw->getDisplayType();
781 int currentMode = hw->getActiveConfig();
782
783 if (mode == currentMode) {
784 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
785 return;
786 }
787
788 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
789 ALOGW("Trying to set config for virtual display");
790 return;
791 }
792
793 hw->setActiveConfig(mode);
794 getHwComposer().setActiveConfig(type, mode);
795}
796
797status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
798 class MessageSetActiveConfig: public MessageBase {
799 SurfaceFlinger& mFlinger;
800 sp<IBinder> mDisplay;
801 int mMode;
802 public:
803 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
804 int mode) :
805 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
806 virtual bool handler() {
807 Vector<DisplayInfo> configs;
808 mFlinger.getDisplayConfigs(mDisplay, &configs);
809 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
810 ALOGE("Attempt to set active config = %d for display with %zu configs",
811 mMode, configs.size());
812 }
813 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
814 if (hw == NULL) {
815 ALOGE("Attempt to set active config = %d for null display %p",
816 mMode, mDisplay.get());
817 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
818 ALOGW("Attempt to set active config = %d for virtual display",
819 mMode);
820 } else {
821 mFlinger.setActiveConfigInternal(hw, mMode);
822 }
823 return true;
824 }
825 };
826 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
827 postMessageSync(msg);
828 return NO_ERROR;
829}
830
831status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
832 Vector<android_color_mode_t>* outColorModes) {
833 if (outColorModes == nullptr || display.get() == nullptr) {
834 return BAD_VALUE;
835 }
836
837 int32_t type = getDisplayType(display);
838 if (type < 0) return type;
839
840 std::set<android_color_mode_t> colorModes;
841 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
842 colorModes.insert(hwConfig.colorMode);
843 }
844
845 outColorModes->clear();
846 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
847
848 return NO_ERROR;
849}
850
851android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
852 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
853
854 int32_t type = getDisplayType(display);
855 if (type < 0) return static_cast<android_color_mode_t>(type);
856
857 return getHwComposer().getColorMode(type);
858}
859
860status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
861 android_color_mode_t colorMode) {
862 if (display.get() == nullptr || colorMode < 0) {
863 return BAD_VALUE;
864 }
865
866 int32_t type = getDisplayType(display);
867 if (type < 0) return type;
868 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
869 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
870 desiredConfig.colorMode = colorMode;
871 for (size_t c = 0; c < hwConfigs.size(); ++c) {
872 const HWComposer::DisplayConfig config = hwConfigs[c];
873 if (config == desiredConfig) {
874 return setActiveConfig(display, c);
875 }
876 }
877 return BAD_VALUE;
878}
879
880status_t SurfaceFlinger::clearAnimationFrameStats() {
881 Mutex::Autolock _l(mStateLock);
882 mAnimFrameTracker.clearStats();
883 return NO_ERROR;
884}
885
886status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
887 Mutex::Autolock _l(mStateLock);
888 mAnimFrameTracker.getStats(outStats);
889 return NO_ERROR;
890}
891
892status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
893 HdrCapabilities* outCapabilities) const {
894 // HWC1 does not provide HDR capabilities
895 *outCapabilities = HdrCapabilities();
896 return NO_ERROR;
897}
898
899status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
900 if (enable == mInjectVSyncs) {
901 return NO_ERROR;
902 }
903
904 if (enable) {
905 mInjectVSyncs = enable;
906 ALOGV("VSync Injections enabled");
907 if (mVSyncInjector.get() == nullptr) {
908 mVSyncInjector = new InjectVSyncSource();
909 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
910 }
911 mEventQueue.setEventThread(mInjectorEventThread);
912 } else {
913 mInjectVSyncs = enable;
914 ALOGV("VSync Injections disabled");
915 mEventQueue.setEventThread(mSFEventThread);
916 mVSyncInjector.clear();
917 }
918 return NO_ERROR;
919}
920
921status_t SurfaceFlinger::injectVSync(nsecs_t when) {
922 if (!mInjectVSyncs) {
923 ALOGE("VSync Injections not enabled");
924 return BAD_VALUE;
925 }
926 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
927 ALOGV("Injecting VSync inside SurfaceFlinger");
928 mVSyncInjector->onInjectSyncEvent(when);
929 }
930 return NO_ERROR;
931}
932
933// ----------------------------------------------------------------------------
934
935sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
936 return mEventThread->createEventConnection();
937}
938
939// ----------------------------------------------------------------------------
940
941void SurfaceFlinger::waitForEvent() {
942 mEventQueue.waitMessage();
943}
944
945void SurfaceFlinger::signalTransaction() {
946 mEventQueue.invalidate();
947}
948
949void SurfaceFlinger::signalLayerUpdate() {
950 mEventQueue.invalidate();
951}
952
953void SurfaceFlinger::signalRefresh() {
954 mEventQueue.refresh();
955}
956
957status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
958 nsecs_t reltime, uint32_t /* flags */) {
959 return mEventQueue.postMessage(msg, reltime);
960}
961
962status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
963 nsecs_t reltime, uint32_t /* flags */) {
964 status_t res = mEventQueue.postMessage(msg, reltime);
965 if (res == NO_ERROR) {
966 msg->wait();
967 }
968 return res;
969}
970
971void SurfaceFlinger::run() {
972 do {
973 waitForEvent();
974 } while (true);
975}
976
977void SurfaceFlinger::enableHardwareVsync() {
978 Mutex::Autolock _l(mHWVsyncLock);
979 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
980 mPrimaryDispSync.beginResync();
981 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
982 mEventControlThread->setVsyncEnabled(true);
983 mPrimaryHWVsyncEnabled = true;
984 }
985}
986
987void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
988 Mutex::Autolock _l(mHWVsyncLock);
989
990 if (makeAvailable) {
991 mHWVsyncAvailable = true;
992 } else if (!mHWVsyncAvailable) {
993 // Hardware vsync is not currently available, so abort the resync
994 // attempt for now
995 return;
996 }
997
998 const nsecs_t period =
999 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1000
1001 mPrimaryDispSync.reset();
1002 mPrimaryDispSync.setPeriod(period);
1003
1004 if (!mPrimaryHWVsyncEnabled) {
1005 mPrimaryDispSync.beginResync();
1006 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1007 mEventControlThread->setVsyncEnabled(true);
1008 mPrimaryHWVsyncEnabled = true;
1009 }
1010}
1011
1012void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1013 Mutex::Autolock _l(mHWVsyncLock);
1014 if (mPrimaryHWVsyncEnabled) {
1015 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1016 mEventControlThread->setVsyncEnabled(false);
1017 mPrimaryDispSync.endResync();
1018 mPrimaryHWVsyncEnabled = false;
1019 }
1020 if (makeUnavailable) {
1021 mHWVsyncAvailable = false;
1022 }
1023}
1024
1025void SurfaceFlinger::resyncWithRateLimit() {
1026 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1027 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1028 resyncToHardwareVsync(false);
1029 }
1030}
1031
Steven Thomas3cfac282017-02-06 12:29:30 -08001032void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1033 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001034 bool needsHwVsync = false;
1035
1036 { // Scope for the lock
1037 Mutex::Autolock _l(mHWVsyncLock);
1038 if (type == 0 && mPrimaryHWVsyncEnabled) {
1039 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1040 }
1041 }
1042
1043 if (needsHwVsync) {
1044 enableHardwareVsync();
1045 } else {
1046 disableHardwareVsync(false);
1047 }
1048}
1049
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001050void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
Brian Andersond0010582017-03-07 13:20:31 -08001051 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001052 *compositorTiming = mCompositorTiming;
1053}
1054
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001055void SurfaceFlinger::onHotplugReceived(HWComposer* /*composer*/, int type, bool connected) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001056 if (mEventThread == NULL) {
1057 // This is a temporary workaround for b/7145521. A non-null pointer
1058 // does not mean EventThread has finished initializing, so this
1059 // is not a correct fix.
1060 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1061 return;
1062 }
1063
1064 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1065 Mutex::Autolock _l(mStateLock);
1066 if (connected) {
1067 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1068 } else {
1069 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1070 mBuiltinDisplays[type].clear();
1071 }
1072 setTransactionFlags(eDisplayTransactionNeeded);
1073
1074 // Defer EventThread notification until SF has updated mDisplays.
1075 }
1076}
1077
Steven Thomas3cfac282017-02-06 12:29:30 -08001078void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1079 repaintEverything();
1080}
1081
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001082void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1083 ATRACE_CALL();
1084 getHwComposer().eventControl(disp, event, enabled);
1085}
1086
1087void SurfaceFlinger::onMessageReceived(int32_t what) {
1088 ATRACE_CALL();
1089 switch (what) {
1090 case MessageQueue::INVALIDATE: {
1091 bool refreshNeeded = handleMessageTransaction();
1092 refreshNeeded |= handleMessageInvalidate();
1093 refreshNeeded |= mRepaintEverything;
1094 if (refreshNeeded) {
1095 // Signal a refresh if a transaction modified the window state,
1096 // a new buffer was latched, or if HWC has requested a full
1097 // repaint
1098 signalRefresh();
1099 }
1100 break;
1101 }
1102 case MessageQueue::REFRESH: {
1103 handleMessageRefresh();
1104 break;
1105 }
1106 }
1107}
1108
1109bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001110 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001111 if (transactionFlags) {
1112 handleTransaction(transactionFlags);
1113 return true;
1114 }
1115 return false;
1116}
1117
1118bool SurfaceFlinger::handleMessageInvalidate() {
1119 ATRACE_CALL();
1120 return handlePageFlip();
1121}
1122
1123void SurfaceFlinger::handleMessageRefresh() {
1124 ATRACE_CALL();
1125
1126 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1127
Brian Andersond6927fb2016-07-23 23:37:30 -07001128 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001129 rebuildLayerStacks();
1130 setUpHWComposer();
1131 doDebugFlashRegions();
1132 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001133 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001134}
1135
1136void SurfaceFlinger::doDebugFlashRegions()
1137{
1138 // is debugging enabled
1139 if (CC_LIKELY(!mDebugRegion))
1140 return;
1141
1142 const bool repaintEverything = mRepaintEverything;
1143 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1144 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1145 if (hw->isDisplayOn()) {
1146 // transform the dirty region into this screen's coordinate space
1147 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1148 if (!dirtyRegion.isEmpty()) {
1149 // redraw the whole screen
1150 doComposeSurfaces(hw, Region(hw->bounds()));
1151
1152 // and draw the dirty region
1153 const int32_t height = hw->getHeight();
1154 RenderEngine& engine(getRenderEngine());
1155 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1156
1157 hw->compositionComplete();
1158 hw->swapBuffers(getHwComposer());
1159 }
1160 }
1161 }
1162
1163 postFramebuffer();
1164
1165 if (mDebugRegion > 1) {
1166 usleep(mDebugRegion * 1000);
1167 }
1168
1169 HWComposer& hwc(getHwComposer());
1170 if (hwc.initCheck() == NO_ERROR) {
1171 status_t err = hwc.prepare();
1172 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1173 }
1174}
1175
Brian Andersond6927fb2016-07-23 23:37:30 -07001176void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001177{
1178 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001179 mDrawingState.traverseInZOrder([&](Layer* layer) {
1180 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001181 needExtraInvalidate = true;
1182 }
Robert Carr2047fae2016-11-28 14:09:09 -08001183 });
1184
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001185 if (needExtraInvalidate) {
1186 signalLayerUpdate();
1187 }
1188}
1189
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001190void SurfaceFlinger::updateCompositorTiming(
1191 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1192 std::shared_ptr<FenceTime>& presentFenceTime) {
1193 // Update queue of past composite+present times and determine the
1194 // most recently known composite to present latency.
1195 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1196 nsecs_t compositeToPresentLatency = -1;
1197 while (!mCompositePresentTimes.empty()) {
1198 CompositePresentTime& cpt = mCompositePresentTimes.front();
1199 // Cached values should have been updated before calling this method,
1200 // which helps avoid duplicate syscalls.
1201 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1202 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1203 break;
1204 }
1205 compositeToPresentLatency = displayTime - cpt.composite;
1206 mCompositePresentTimes.pop();
1207 }
1208
1209 // Don't let mCompositePresentTimes grow unbounded, just in case.
1210 while (mCompositePresentTimes.size() > 16) {
1211 mCompositePresentTimes.pop();
1212 }
1213
Brian Andersond0010582017-03-07 13:20:31 -08001214 setCompositorTimingSnapped(
1215 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1216}
1217
1218void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1219 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001220 // Integer division and modulo round toward 0 not -inf, so we need to
1221 // treat negative and positive offsets differently.
Brian Andersond0010582017-03-07 13:20:31 -08001222 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001223 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1224 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1225
Brian Andersond0010582017-03-07 13:20:31 -08001226 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1227 if (idealLatency <= 0) {
1228 idealLatency = vsyncInterval;
1229 }
1230
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001231 // Snap the latency to a value that removes scheduling jitter from the
1232 // composition and present times, which often have >1ms of jitter.
1233 // Reducing jitter is important if an app attempts to extrapolate
1234 // something (such as user input) to an accurate diasplay time.
1235 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1236 // with (presentLatency % interval).
Brian Andersond0010582017-03-07 13:20:31 -08001237 nsecs_t bias = vsyncInterval / 2;
1238 int64_t extraVsyncs =
1239 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1240 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1241 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001242
Brian Andersond0010582017-03-07 13:20:31 -08001243 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001244 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1245 mCompositorTiming.interval = vsyncInterval;
Brian Andersond0010582017-03-07 13:20:31 -08001246 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001247}
1248
1249void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001250{
Brian Andersond6927fb2016-07-23 23:37:30 -07001251 const HWComposer& hwc = getHwComposer();
1252 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1253
Brian Anderson3d4039d2016-09-23 16:31:30 -07001254 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1255 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1256 glCompositionDoneFenceTime =
1257 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1258 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1259 } else {
1260 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1261 }
1262 mGlCompositionDoneTimeline.updateSignalTimes();
1263
Brian Anderson4e606e32017-03-16 15:34:57 -07001264 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1265 auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
Brian Anderson3d4039d2016-09-23 16:31:30 -07001266 mDisplayTimeline.push(retireFenceTime);
1267 mDisplayTimeline.updateSignalTimes();
Brian Andersond6927fb2016-07-23 23:37:30 -07001268
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001269 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1270 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1271
1272 // We use the refreshStartTime which might be sampled a little later than
1273 // when we started doing work for this frame, but that should be okay
1274 // since updateCompositorTiming has snapping logic.
1275 updateCompositorTiming(
1276 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
Brian Andersond0010582017-03-07 13:20:31 -08001277 CompositorTiming compositorTiming;
1278 {
1279 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1280 compositorTiming = mCompositorTiming;
1281 }
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001282
Robert Carr2047fae2016-11-28 14:09:09 -08001283 mDrawingState.traverseInZOrder([&](Layer* layer) {
Brian Anderson4e606e32017-03-16 15:34:57 -07001284 // TODO(brianderson): The retire fence is incorrectly passed in as the
1285 // present fence. Fix this if this file lives on.
Robert Carr2047fae2016-11-28 14:09:09 -08001286 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson4e606e32017-03-16 15:34:57 -07001287 retireFenceTime, compositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001288 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001289 recordBufferingStats(layer->getName().string(),
1290 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001291 }
Robert Carr2047fae2016-11-28 14:09:09 -08001292 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001293
Brian Anderson4e606e32017-03-16 15:34:57 -07001294 if (retireFence->isValid()) {
1295 if (mPrimaryDispSync.addPresentFence(retireFence)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001296 enableHardwareVsync();
1297 } else {
1298 disableHardwareVsync(false);
1299 }
1300 }
1301
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08001302 if (!hasSyncFramework) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001303 if (hw->isDisplayOn()) {
1304 enableHardwareVsync();
1305 }
1306 }
1307
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001308 if (mAnimCompositionPending) {
1309 mAnimCompositionPending = false;
1310
Brian Anderson3d4039d2016-09-23 16:31:30 -07001311 if (retireFenceTime->isValid()) {
1312 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001313 } else {
1314 // The HWC doesn't support present fences, so use the refresh
1315 // timestamp instead.
1316 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1317 mAnimFrameTracker.setActualPresentTime(presentTime);
1318 }
1319 mAnimFrameTracker.advanceFrame();
1320 }
1321
1322 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1323 return;
1324 }
1325
1326 nsecs_t currentTime = systemTime();
1327 if (mHasPoweredOff) {
1328 mHasPoweredOff = false;
1329 } else {
1330 nsecs_t period = mPrimaryDispSync.getPeriod();
1331 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1332 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1333 if (numPeriods < NUM_BUCKETS - 1) {
1334 mFrameBuckets[numPeriods] += elapsedTime;
1335 } else {
1336 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1337 }
1338 mTotalTime += elapsedTime;
1339 }
1340 mLastSwapTime = currentTime;
1341}
1342
1343void SurfaceFlinger::rebuildLayerStacks() {
1344 // rebuild the visible layer list per screen
1345 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1346 ATRACE_CALL();
1347 mVisibleRegionsDirty = false;
1348 invalidateHwcGeometry();
1349
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001350 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1351 Region opaqueRegion;
1352 Region dirtyRegion;
1353 Vector< sp<Layer> > layersSortedByZ;
1354 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1355 const Transform& tr(hw->getTransform());
1356 const Rect bounds(hw->getBounds());
1357 if (hw->isDisplayOn()) {
Robert Carr2047fae2016-11-28 14:09:09 -08001358 computeVisibleRegions(hw->getLayerStack(), dirtyRegion,
1359 opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001360
Robert Carr2047fae2016-11-28 14:09:09 -08001361 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001362 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001363 Region drawRegion(tr.transform(
1364 layer->visibleNonTransparentRegion));
1365 drawRegion.andSelf(bounds);
1366 if (!drawRegion.isEmpty()) {
1367 layersSortedByZ.add(layer);
1368 }
1369 }
Robert Carr2047fae2016-11-28 14:09:09 -08001370 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001371 }
1372 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1373 hw->undefinedRegion.set(bounds);
1374 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1375 hw->dirtyRegion.orSelf(dirtyRegion);
1376 }
1377 }
1378}
1379
1380void SurfaceFlinger::setUpHWComposer() {
1381 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1382 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1383 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1384 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1385
1386 // If nothing has changed (!dirty), don't recompose.
1387 // If something changed, but we don't currently have any visible layers,
1388 // and didn't when we last did a composition, then skip it this time.
1389 // The second rule does two things:
1390 // - When all layers are removed from a display, we'll emit one black
1391 // frame, then nothing more until we get new layers.
1392 // - When a display is created with a private layer stack, we won't
1393 // emit any black frames until a layer is added to the layer stack.
1394 bool mustRecompose = dirty && !(empty && wasEmpty);
1395
1396 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1397 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1398 mustRecompose ? "doing" : "skipping",
1399 dirty ? "+" : "-",
1400 empty ? "+" : "-",
1401 wasEmpty ? "+" : "-");
1402
1403 mDisplays[dpy]->beginFrame(mustRecompose);
1404
1405 if (mustRecompose) {
1406 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1407 }
1408 }
1409
1410 HWComposer& hwc(getHwComposer());
1411 if (hwc.initCheck() == NO_ERROR) {
1412 // build the h/w work list
1413 if (CC_UNLIKELY(mHwWorkListDirty)) {
1414 mHwWorkListDirty = false;
1415 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1416 sp<const DisplayDevice> hw(mDisplays[dpy]);
1417 const int32_t id = hw->getHwcDisplayId();
1418 if (id >= 0) {
1419 const Vector< sp<Layer> >& currentLayers(
1420 hw->getVisibleLayersSortedByZ());
1421 const size_t count = currentLayers.size();
1422 if (hwc.createWorkList(id, count) == NO_ERROR) {
1423 HWComposer::LayerListIterator cur = hwc.begin(id);
1424 const HWComposer::LayerListIterator end = hwc.end(id);
1425 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1426 const sp<Layer>& layer(currentLayers[i]);
1427 layer->setGeometry(hw, *cur);
1428 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1429 cur->setSkip(true);
1430 }
1431 }
1432 }
1433 }
1434 }
1435 }
1436
1437 // set the per-frame data
1438 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1439 sp<const DisplayDevice> hw(mDisplays[dpy]);
1440 const int32_t id = hw->getHwcDisplayId();
1441 if (id >= 0) {
1442 const Vector< sp<Layer> >& currentLayers(
1443 hw->getVisibleLayersSortedByZ());
1444 const size_t count = currentLayers.size();
1445 HWComposer::LayerListIterator cur = hwc.begin(id);
1446 const HWComposer::LayerListIterator end = hwc.end(id);
1447 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1448 /*
1449 * update the per-frame h/w composer data for each layer
1450 * and build the transparent region of the FB
1451 */
1452 const sp<Layer>& layer(currentLayers[i]);
1453 layer->setPerFrameData(hw, *cur);
1454 }
1455 }
1456 }
1457
1458 // If possible, attempt to use the cursor overlay on each display.
1459 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1460 sp<const DisplayDevice> hw(mDisplays[dpy]);
1461 const int32_t id = hw->getHwcDisplayId();
1462 if (id >= 0) {
1463 const Vector< sp<Layer> >& currentLayers(
1464 hw->getVisibleLayersSortedByZ());
1465 const size_t count = currentLayers.size();
1466 HWComposer::LayerListIterator cur = hwc.begin(id);
1467 const HWComposer::LayerListIterator end = hwc.end(id);
1468 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1469 const sp<Layer>& layer(currentLayers[i]);
1470 if (layer->isPotentialCursor()) {
1471 cur->setIsCursorLayerHint();
1472 break;
1473 }
1474 }
1475 }
1476 }
1477
1478 status_t err = hwc.prepare();
1479 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1480
1481 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1482 sp<const DisplayDevice> hw(mDisplays[dpy]);
1483 hw->prepareFrame(hwc);
1484 }
1485 }
1486}
1487
1488void SurfaceFlinger::doComposition() {
1489 ATRACE_CALL();
1490 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1491 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1492 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1493 if (hw->isDisplayOn()) {
1494 // transform the dirty region into this screen's coordinate space
1495 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1496
1497 // repaint the framebuffer (if needed)
1498 doDisplayComposition(hw, dirtyRegion);
1499
1500 hw->dirtyRegion.clear();
1501 hw->flip(hw->swapRegion);
1502 hw->swapRegion.clear();
1503 }
1504 // inform the h/w that we're done compositing
1505 hw->compositionComplete();
1506 }
1507 postFramebuffer();
1508}
1509
1510void SurfaceFlinger::postFramebuffer()
1511{
1512 ATRACE_CALL();
1513
1514 const nsecs_t now = systemTime();
1515 mDebugInSwapBuffers = now;
1516
1517 HWComposer& hwc(getHwComposer());
1518 if (hwc.initCheck() == NO_ERROR) {
1519 if (!hwc.supportsFramebufferTarget()) {
1520 // EGL spec says:
1521 // "surface must be bound to the calling thread's current context,
1522 // for the current rendering API."
1523 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1524 }
1525 hwc.commit();
1526 }
1527
1528 // make the default display current because the VirtualDisplayDevice code cannot
1529 // deal with dequeueBuffer() being called outside of the composition loop; however
1530 // the code below can call glFlush() which is allowed (and does in some case) call
1531 // dequeueBuffer().
1532 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1533
1534 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1535 sp<const DisplayDevice> hw(mDisplays[dpy]);
1536 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1537 hw->onSwapBuffersCompleted(hwc);
1538 const size_t count = currentLayers.size();
1539 int32_t id = hw->getHwcDisplayId();
1540 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1541 HWComposer::LayerListIterator cur = hwc.begin(id);
1542 const HWComposer::LayerListIterator end = hwc.end(id);
1543 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1544 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1545 }
1546 } else {
1547 for (size_t i = 0; i < count; i++) {
1548 currentLayers[i]->onLayerDisplayed(hw, NULL);
1549 }
1550 }
1551 }
1552
1553 mLastSwapBufferTime = systemTime() - now;
1554 mDebugInSwapBuffers = 0;
1555
1556 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1557 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1558 logFrameStats();
1559 }
1560}
1561
1562void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1563{
1564 ATRACE_CALL();
1565
1566 // here we keep a copy of the drawing state (that is the state that's
1567 // going to be overwritten by handleTransactionLocked()) outside of
1568 // mStateLock so that the side-effects of the State assignment
1569 // don't happen with mStateLock held (which can cause deadlocks).
1570 State drawingState(mDrawingState);
1571
1572 Mutex::Autolock _l(mStateLock);
1573 const nsecs_t now = systemTime();
1574 mDebugInTransaction = now;
1575
1576 // Here we're guaranteed that some transaction flags are set
1577 // so we can call handleTransactionLocked() unconditionally.
1578 // We call getTransactionFlags(), which will also clear the flags,
1579 // with mStateLock held to guarantee that mCurrentState won't change
1580 // until the transaction is committed.
1581
1582 transactionFlags = getTransactionFlags(eTransactionMask);
1583 handleTransactionLocked(transactionFlags);
1584
1585 mLastTransactionTime = systemTime() - now;
1586 mDebugInTransaction = 0;
1587 invalidateHwcGeometry();
1588 // here the transaction has been committed
1589}
1590
1591void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1592{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001593 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001594 mCurrentState.traverseInZOrder([](Layer* layer) {
1595 layer->notifyAvailableFrames();
1596 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001597
1598 /*
1599 * Traversal of the children
1600 * (perform the transaction for each of them if needed)
1601 */
1602
1603 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001604 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001605 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001606 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001607
1608 const uint32_t flags = layer->doTransaction(0);
1609 if (flags & Layer::eVisibleRegion)
1610 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001611 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001612 }
1613
1614 /*
1615 * Perform display own transactions if needed
1616 */
1617
1618 if (transactionFlags & eDisplayTransactionNeeded) {
1619 // here we take advantage of Vector's copy-on-write semantics to
1620 // improve performance by skipping the transaction entirely when
1621 // know that the lists are identical
1622 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1623 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1624 if (!curr.isIdenticalTo(draw)) {
1625 mVisibleRegionsDirty = true;
1626 const size_t cc = curr.size();
1627 size_t dc = draw.size();
1628
1629 // find the displays that were removed
1630 // (ie: in drawing state but not in current state)
1631 // also handle displays that changed
1632 // (ie: displays that are in both lists)
1633 for (size_t i=0 ; i<dc ; i++) {
1634 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1635 if (j < 0) {
1636 // in drawing state but not in current state
1637 if (!draw[i].isMainDisplay()) {
1638 // Call makeCurrent() on the primary display so we can
1639 // be sure that nothing associated with this display
1640 // is current.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001641 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001642 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001643 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001644 if (hw != NULL)
1645 hw->disconnect(getHwComposer());
1646 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1647 mEventThread->onHotplugReceived(draw[i].type, false);
1648 mDisplays.removeItem(draw.keyAt(i));
1649 } else {
1650 ALOGW("trying to remove the main display");
1651 }
1652 } else {
1653 // this display is in both lists. see if something changed.
1654 const DisplayDeviceState& state(curr[j]);
1655 const wp<IBinder>& display(curr.keyAt(j));
1656 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1657 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1658 if (state_binder != draw_binder) {
1659 // changing the surface is like destroying and
1660 // recreating the DisplayDevice, so we just remove it
1661 // from the drawing state, so that it get re-added
1662 // below.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001663 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001664 if (hw != NULL)
1665 hw->disconnect(getHwComposer());
1666 mDisplays.removeItem(display);
1667 mDrawingState.displays.removeItemsAt(i);
1668 dc--; i--;
1669 // at this point we must loop to the next item
1670 continue;
1671 }
1672
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001673 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001674 if (disp != NULL) {
1675 if (state.layerStack != draw[i].layerStack) {
1676 disp->setLayerStack(state.layerStack);
1677 }
1678 if ((state.orientation != draw[i].orientation)
1679 || (state.viewport != draw[i].viewport)
1680 || (state.frame != draw[i].frame))
1681 {
1682 disp->setProjection(state.orientation,
1683 state.viewport, state.frame);
1684 }
1685 if (state.width != draw[i].width || state.height != draw[i].height) {
1686 disp->setDisplaySize(state.width, state.height);
1687 }
1688 }
1689 }
1690 }
1691
1692 // find displays that were added
1693 // (ie: in current state but not in drawing state)
1694 for (size_t i=0 ; i<cc ; i++) {
1695 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1696 const DisplayDeviceState& state(curr[i]);
1697
1698 sp<DisplaySurface> dispSurface;
1699 sp<IGraphicBufferProducer> producer;
1700 sp<IGraphicBufferProducer> bqProducer;
1701 sp<IGraphicBufferConsumer> bqConsumer;
Mathias Agopian0556d792017-03-22 15:49:32 -07001702 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001703
1704 int32_t hwcDisplayId = -1;
1705 if (state.isVirtualDisplay()) {
1706 // Virtual displays without a surface are dormant:
1707 // they have external state (layer stack, projection,
1708 // etc.) but no internal state (i.e. a DisplayDevice).
1709 if (state.surface != NULL) {
1710
1711 int width = 0;
1712 int status = state.surface->query(
1713 NATIVE_WINDOW_WIDTH, &width);
1714 ALOGE_IF(status != NO_ERROR,
1715 "Unable to query width (%d)", status);
1716 int height = 0;
1717 status = state.surface->query(
1718 NATIVE_WINDOW_HEIGHT, &height);
1719 ALOGE_IF(status != NO_ERROR,
1720 "Unable to query height (%d)", status);
1721 if (mUseHwcVirtualDisplays &&
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08001722 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1723 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1724 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001725 hwcDisplayId = allocateHwcDisplayId(state.type);
1726 }
1727
1728 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1729 *mHwc, hwcDisplayId, state.surface,
1730 bqProducer, bqConsumer, state.displayName);
1731
1732 dispSurface = vds;
1733 producer = vds;
1734 }
1735 } else {
1736 ALOGE_IF(state.surface!=NULL,
1737 "adding a supported display, but rendering "
1738 "surface is provided (%p), ignoring it",
1739 state.surface.get());
1740 hwcDisplayId = allocateHwcDisplayId(state.type);
1741 // for supported (by hwc) displays we provide our
1742 // own rendering surface
1743 dispSurface = new FramebufferSurface(*mHwc, state.type,
1744 bqConsumer);
1745 producer = bqProducer;
1746 }
1747
1748 const wp<IBinder>& display(curr.keyAt(i));
1749 if (dispSurface != NULL) {
1750 sp<DisplayDevice> hw = new DisplayDevice(this,
1751 state.type, hwcDisplayId,
1752 mHwc->getFormat(hwcDisplayId), state.isSecure,
1753 display, dispSurface, producer,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -06001754 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001755 hw->setLayerStack(state.layerStack);
1756 hw->setProjection(state.orientation,
1757 state.viewport, state.frame);
1758 hw->setDisplayName(state.displayName);
1759 mDisplays.add(display, hw);
1760 if (state.isVirtualDisplay()) {
1761 if (hwcDisplayId >= 0) {
1762 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1763 hw->getWidth(), hw->getHeight(),
1764 hw->getFormat());
1765 }
1766 } else {
1767 mEventThread->onHotplugReceived(state.type, true);
1768 }
1769 }
1770 }
1771 }
1772 }
1773 }
1774
1775 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1776 // The transform hint might have changed for some layers
1777 // (either because a display has changed, or because a layer
1778 // as changed).
1779 //
1780 // Walk through all the layers in currentLayers,
1781 // and update their transform hint.
1782 //
1783 // If a layer is visible only on a single display, then that
1784 // display is used to calculate the hint, otherwise we use the
1785 // default display.
1786 //
1787 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1788 // the hint is set before we acquire a buffer from the surface texture.
1789 //
1790 // NOTE: layer transactions have taken place already, so we use their
1791 // drawing state. However, SurfaceFlinger's own transaction has not
1792 // happened yet, so we must use the current state layer list
1793 // (soon to become the drawing state list).
1794 //
1795 sp<const DisplayDevice> disp;
1796 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001797 bool first = true;
1798 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001799 // NOTE: we rely on the fact that layers are sorted by
1800 // layerStack first (so we don't have to traverse the list
1801 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001802 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001803 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001804 currentlayerStack = layerStack;
1805 // figure out if this layerstack is mirrored
1806 // (more than one display) if so, pick the default display,
1807 // if not, pick the only display it's on.
1808 disp.clear();
1809 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1810 sp<const DisplayDevice> hw(mDisplays[dpy]);
1811 if (hw->getLayerStack() == currentlayerStack) {
1812 if (disp == NULL) {
1813 disp = hw;
1814 } else {
1815 disp = NULL;
1816 break;
1817 }
1818 }
1819 }
1820 }
1821 if (disp == NULL) {
1822 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1823 // redraw after transform hint changes. See bug 8508397.
1824
1825 // could be null when this layer is using a layerStack
1826 // that is not visible on any display. Also can occur at
1827 // screen off/on times.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001828 disp = getDefaultDisplayDeviceLocked();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001829 }
1830 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001831
1832 first = false;
1833 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001834 }
1835
1836
1837 /*
1838 * Perform our own transaction if needed
1839 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001840
1841 if (mLayersAdded) {
1842 mLayersAdded = false;
1843 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001844 mVisibleRegionsDirty = true;
1845 }
1846
1847 // some layers might have been removed, so
1848 // we need to update the regions they're exposing.
1849 if (mLayersRemoved) {
1850 mLayersRemoved = false;
1851 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001852 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001853 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001854 // this layer is not visible anymore
1855 // TODO: we could traverse the tree from front to back and
1856 // compute the actual visible region
1857 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001858 Region visibleReg;
1859 visibleReg.set(layer->computeScreenBounds());
1860 invalidateLayerStack(layer->getLayerStack(), visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001861 }
Robert Carr2047fae2016-11-28 14:09:09 -08001862 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001863 }
1864
1865 commitTransaction();
1866
1867 updateCursorAsync();
1868}
1869
1870void SurfaceFlinger::updateCursorAsync()
1871{
1872 HWComposer& hwc(getHwComposer());
1873 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1874 sp<const DisplayDevice> hw(mDisplays[dpy]);
1875 const int32_t id = hw->getHwcDisplayId();
1876 if (id < 0) {
1877 continue;
1878 }
1879 const Vector< sp<Layer> >& currentLayers(
1880 hw->getVisibleLayersSortedByZ());
1881 const size_t count = currentLayers.size();
1882 HWComposer::LayerListIterator cur = hwc.begin(id);
1883 const HWComposer::LayerListIterator end = hwc.end(id);
1884 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1885 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1886 continue;
1887 }
1888 const sp<Layer>& layer(currentLayers[i]);
1889 Rect cursorPos = layer->getPosition(hw);
1890 hwc.setCursorPositionAsync(id, cursorPos);
1891 break;
1892 }
1893 }
1894}
1895
1896void SurfaceFlinger::commitTransaction()
1897{
1898 if (!mLayersPendingRemoval.isEmpty()) {
1899 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001900 for (const auto& l : mLayersPendingRemoval) {
1901 recordBufferingStats(l->getName().string(),
1902 l->getOccupancyHistory(true));
1903 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001904 }
1905 mLayersPendingRemoval.clear();
1906 }
1907
1908 // If this transaction is part of a window animation then the next frame
1909 // we composite should be considered an animation as well.
1910 mAnimCompositionPending = mAnimTransactionPending;
1911
1912 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001913 mDrawingState.traverseInZOrder([](Layer* layer) {
1914 layer->commitChildList();
1915 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001916 mTransactionPending = false;
1917 mAnimTransactionPending = false;
1918 mTransactionCV.broadcast();
1919}
1920
Robert Carr2047fae2016-11-28 14:09:09 -08001921void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001922 Region& outDirtyRegion, Region& outOpaqueRegion)
1923{
1924 ATRACE_CALL();
1925
1926 Region aboveOpaqueLayers;
1927 Region aboveCoveredLayers;
1928 Region dirty;
1929
1930 outDirtyRegion.clear();
1931
Robert Carr2047fae2016-11-28 14:09:09 -08001932 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001933 // start with the whole surface at its current location
1934 const Layer::State& s(layer->getDrawingState());
1935
1936 // only consider the layers on the given layer stack
Robert Carr1f0a16a2016-10-24 16:27:39 -07001937 if (layer->getLayerStack() != layerStack)
Robert Carr2047fae2016-11-28 14:09:09 -08001938 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001939
1940 /*
1941 * opaqueRegion: area of a surface that is fully opaque.
1942 */
1943 Region opaqueRegion;
1944
1945 /*
1946 * visibleRegion: area of a surface that is visible on screen
1947 * and not fully transparent. This is essentially the layer's
1948 * footprint minus the opaque regions above it.
1949 * Areas covered by a translucent surface are considered visible.
1950 */
1951 Region visibleRegion;
1952
1953 /*
1954 * coveredRegion: area of a surface that is covered by all
1955 * visible regions above it (which includes the translucent areas).
1956 */
1957 Region coveredRegion;
1958
1959 /*
1960 * transparentRegion: area of a surface that is hinted to be completely
1961 * transparent. This is only used to tell when the layer has no visible
1962 * non-transparent regions and can be removed from the layer list. It
1963 * does not affect the visibleRegion of this layer or any layers
1964 * beneath it. The hint may not be correct if apps don't respect the
1965 * SurfaceView restrictions (which, sadly, some don't).
1966 */
1967 Region transparentRegion;
1968
1969
1970 // handle hidden surfaces by setting the visible region to empty
1971 if (CC_LIKELY(layer->isVisible())) {
1972 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001973 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001974 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001975 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001976 if (!visibleRegion.isEmpty()) {
1977 // Remove the transparent area from the visible region
1978 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001979 if (tr.preserveRects()) {
1980 // transform the transparent region
1981 transparentRegion = tr.transform(s.activeTransparentRegion);
1982 } else {
1983 // transformation too complex, can't do the
1984 // transparent region optimization.
1985 transparentRegion.clear();
1986 }
1987 }
1988
1989 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001990 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001991 if (s.alpha==255 && !translucent &&
1992 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1993 // the opaque region is the layer's footprint
1994 opaqueRegion = visibleRegion;
1995 }
1996 }
1997 }
1998
1999 // Clip the covered region to the visible region
2000 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2001
2002 // Update aboveCoveredLayers for next (lower) layer
2003 aboveCoveredLayers.orSelf(visibleRegion);
2004
2005 // subtract the opaque region covered by the layers above us
2006 visibleRegion.subtractSelf(aboveOpaqueLayers);
2007
2008 // compute this layer's dirty region
2009 if (layer->contentDirty) {
2010 // we need to invalidate the whole region
2011 dirty = visibleRegion;
2012 // as well, as the old visible region
2013 dirty.orSelf(layer->visibleRegion);
2014 layer->contentDirty = false;
2015 } else {
2016 /* compute the exposed region:
2017 * the exposed region consists of two components:
2018 * 1) what's VISIBLE now and was COVERED before
2019 * 2) what's EXPOSED now less what was EXPOSED before
2020 *
2021 * note that (1) is conservative, we start with the whole
2022 * visible region but only keep what used to be covered by
2023 * something -- which mean it may have been exposed.
2024 *
2025 * (2) handles areas that were not covered by anything but got
2026 * exposed because of a resize.
2027 */
2028 const Region newExposed = visibleRegion - coveredRegion;
2029 const Region oldVisibleRegion = layer->visibleRegion;
2030 const Region oldCoveredRegion = layer->coveredRegion;
2031 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2032 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2033 }
2034 dirty.subtractSelf(aboveOpaqueLayers);
2035
2036 // accumulate to the screen dirty region
2037 outDirtyRegion.orSelf(dirty);
2038
2039 // Update aboveOpaqueLayers for next (lower) layer
2040 aboveOpaqueLayers.orSelf(opaqueRegion);
2041
2042 // Store the visible region in screen space
2043 layer->setVisibleRegion(visibleRegion);
2044 layer->setCoveredRegion(coveredRegion);
2045 layer->setVisibleNonTransparentRegion(
2046 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002047 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002048
2049 outOpaqueRegion = aboveOpaqueLayers;
2050}
2051
2052void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2053 const Region& dirty) {
2054 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2055 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2056 if (hw->getLayerStack() == layerStack) {
2057 hw->dirtyRegion.orSelf(dirty);
2058 }
2059 }
2060}
2061
2062bool SurfaceFlinger::handlePageFlip()
2063{
Brian Andersond6927fb2016-07-23 23:37:30 -07002064 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002065 Region dirtyRegion;
2066
2067 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002068 bool frameQueued = false;
2069
2070 // Store the set of layers that need updates. This set must not change as
2071 // buffers are being latched, as this could result in a deadlock.
2072 // Example: Two producers share the same command stream and:
2073 // 1.) Layer 0 is latched
2074 // 2.) Layer 0 gets a new frame
2075 // 2.) Layer 1 gets a new frame
2076 // 3.) Layer 1 is latched.
2077 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2078 // second frame. But layer 0's second frame could be waiting on display.
2079 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002080 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002081 if (layer->hasQueuedFrame()) {
2082 frameQueued = true;
2083 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002084 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002085 } else {
2086 layer->useEmptyDamage();
2087 }
2088 } else {
2089 layer->useEmptyDamage();
2090 }
Robert Carr2047fae2016-11-28 14:09:09 -08002091 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002092 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2093 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002094 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002095 layer->useSurfaceDamage();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002096 invalidateLayerStack(layer->getLayerStack(), dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002097 }
2098
2099 mVisibleRegionsDirty |= visibleRegions;
2100
2101 // If we will need to wake up at some time in the future to deal with a
2102 // queued frame that shouldn't be displayed during this vsync period, wake
2103 // up during the next vsync period to check again.
2104 if (frameQueued && layersWithQueuedFrames.empty()) {
2105 signalLayerUpdate();
2106 }
2107
2108 // Only continue with the refresh if there is actually new work to do
2109 return !layersWithQueuedFrames.empty();
2110}
2111
2112void SurfaceFlinger::invalidateHwcGeometry()
2113{
2114 mHwWorkListDirty = true;
2115}
2116
2117
2118void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2119 const Region& inDirtyRegion)
2120{
2121 // We only need to actually compose the display if:
2122 // 1) It is being handled by hardware composer, which may need this to
2123 // keep its virtual display state machine in sync, or
2124 // 2) There is work to be done (the dirty region isn't empty)
2125 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2126 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2127 return;
2128 }
2129
2130 Region dirtyRegion(inDirtyRegion);
2131
2132 // compute the invalid region
2133 hw->swapRegion.orSelf(dirtyRegion);
2134
2135 uint32_t flags = hw->getFlags();
2136 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2137 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2138 // takes a rectangle, we must make sure to update that whole
2139 // rectangle in that case
2140 dirtyRegion.set(hw->swapRegion.bounds());
2141 } else {
2142 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2143 // We need to redraw the rectangle that will be updated
2144 // (pushed to the framebuffer).
2145 // This is needed because PARTIAL_UPDATES only takes one
2146 // rectangle instead of a region (see DisplayDevice::flip())
2147 dirtyRegion.set(hw->swapRegion.bounds());
2148 } else {
2149 // we need to redraw everything (the whole screen)
2150 dirtyRegion.set(hw->bounds());
2151 hw->swapRegion = dirtyRegion;
2152 }
2153 }
2154
2155 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2156 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2157 } else {
2158 RenderEngine& engine(getRenderEngine());
2159 mat4 colorMatrix = mColorMatrix;
2160 if (mDaltonize) {
2161 colorMatrix = colorMatrix * mDaltonizer();
2162 }
2163 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2164 doComposeSurfaces(hw, dirtyRegion);
2165 engine.setupColorTransform(oldMatrix);
2166 }
2167
2168 // update the swap region and clear the dirty region
2169 hw->swapRegion.orSelf(dirtyRegion);
2170
2171 // swap buffers (presentation)
2172 hw->swapBuffers(getHwComposer());
2173}
2174
2175bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2176{
2177 RenderEngine& engine(getRenderEngine());
2178 const int32_t id = hw->getHwcDisplayId();
2179 HWComposer& hwc(getHwComposer());
2180 HWComposer::LayerListIterator cur = hwc.begin(id);
2181 const HWComposer::LayerListIterator end = hwc.end(id);
2182
2183 bool hasGlesComposition = hwc.hasGlesComposition(id);
2184 if (hasGlesComposition) {
2185 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2186 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2187 hw->getDisplayName().string());
2188 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2189 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2190 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2191 }
2192 return false;
2193 }
2194
2195 // Never touch the framebuffer if we don't have any framebuffer layers
2196 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2197 if (hasHwcComposition) {
2198 // when using overlays, we assume a fully transparent framebuffer
2199 // NOTE: we could reduce how much we need to clear, for instance
2200 // remove where there are opaque FB layers. however, on some
2201 // GPUs doing a "clean slate" clear might be more efficient.
2202 // We'll revisit later if needed.
2203 engine.clearWithColor(0, 0, 0, 0);
2204 } else {
2205 // we start with the whole screen area
2206 const Region bounds(hw->getBounds());
2207
2208 // we remove the scissor part
2209 // we're left with the letterbox region
2210 // (common case is that letterbox ends-up being empty)
2211 const Region letterbox(bounds.subtract(hw->getScissor()));
2212
2213 // compute the area to clear
2214 Region region(hw->undefinedRegion.merge(letterbox));
2215
2216 // but limit it to the dirty region
2217 region.andSelf(dirty);
2218
2219 // screen is already cleared here
2220 if (!region.isEmpty()) {
2221 // can happen with SurfaceView
2222 drawWormhole(hw, region);
2223 }
2224 }
2225
2226 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2227 // just to be on the safe side, we don't set the
2228 // scissor on the main display. It should never be needed
2229 // anyways (though in theory it could since the API allows it).
2230 const Rect& bounds(hw->getBounds());
2231 const Rect& scissor(hw->getScissor());
2232 if (scissor != bounds) {
2233 // scissor doesn't match the screen's dimensions, so we
2234 // need to clear everything outside of it and enable
2235 // the GL scissor so we don't draw anything where we shouldn't
2236
2237 // enable scissor for this frame
2238 const uint32_t height = hw->getHeight();
2239 engine.setScissor(scissor.left, height - scissor.bottom,
2240 scissor.getWidth(), scissor.getHeight());
2241 }
2242 }
2243 }
2244
2245 /*
2246 * and then, render the layers targeted at the framebuffer
2247 */
2248
2249 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2250 const size_t count = layers.size();
2251 const Transform& tr = hw->getTransform();
2252 if (cur != end) {
2253 // we're using h/w composer
2254 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2255 const sp<Layer>& layer(layers[i]);
2256 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2257 if (!clip.isEmpty()) {
2258 switch (cur->getCompositionType()) {
2259 case HWC_CURSOR_OVERLAY:
2260 case HWC_OVERLAY: {
2261 const Layer::State& state(layer->getDrawingState());
2262 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2263 && i
2264 && layer->isOpaque(state) && (state.alpha == 0xFF)
2265 && hasGlesComposition) {
2266 // never clear the very first layer since we're
2267 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002268 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002269 }
2270 break;
2271 }
2272 case HWC_FRAMEBUFFER: {
2273 layer->draw(hw, clip);
2274 break;
2275 }
2276 case HWC_FRAMEBUFFER_TARGET: {
2277 // this should not happen as the iterator shouldn't
2278 // let us get there.
2279 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2280 break;
2281 }
2282 }
2283 }
2284 layer->setAcquireFence(hw, *cur);
2285 }
2286 } else {
2287 // we're not using h/w composer
2288 for (size_t i=0 ; i<count ; ++i) {
2289 const sp<Layer>& layer(layers[i]);
2290 const Region clip(dirty.intersect(
2291 tr.transform(layer->visibleRegion)));
2292 if (!clip.isEmpty()) {
2293 layer->draw(hw, clip);
2294 }
2295 }
2296 }
2297
2298 // disable scissor at the end of the frame
2299 engine.disableScissor();
2300 return true;
2301}
2302
2303void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2304 const int32_t height = hw->getHeight();
2305 RenderEngine& engine(getRenderEngine());
2306 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2307}
2308
2309status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2310 const sp<IBinder>& handle,
2311 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002312 const sp<Layer>& lbc,
2313 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002314{
2315 // add this layer to the current state list
2316 {
2317 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002318 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002319 return NO_MEMORY;
2320 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002321 if (parent == nullptr) {
2322 mCurrentState.layersSortedByZ.add(lbc);
2323 } else {
2324 parent->addChild(lbc);
2325 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002326 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002327 mLayersAdded = true;
2328 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002329 }
2330
2331 // attach this layer to the client
2332 client->attachLayer(handle, lbc);
2333
2334 return NO_ERROR;
2335}
2336
Robert Carr9524cb32017-02-13 11:32:32 -08002337status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002338 Mutex::Autolock _l(mStateLock);
2339
Robert Carr1f0a16a2016-10-24 16:27:39 -07002340 const auto& p = layer->getParent();
2341 const ssize_t index = (p != nullptr) ? p->removeChild(layer) :
2342 mCurrentState.layersSortedByZ.remove(layer);
2343
Robert Carr136e2f62017-02-08 17:54:29 -08002344 // As a matter of normal operation, the LayerCleaner will produce a second
2345 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2346 // so we will succeed in promoting it, but it's already been removed
2347 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2348 // otherwise something has gone wrong and we are leaking the layer.
2349 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002350 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2351 layer->getName().string(),
2352 (p != nullptr) ? p->getName().string() : "no-parent");
2353 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002354 } else if (index < 0) {
2355 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002356 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002357
2358 mLayersPendingRemoval.add(layer);
2359 mLayersRemoved = true;
2360 mNumLayers--;
2361 setTransactionFlags(eTransactionNeeded);
2362 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002363}
2364
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002365uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002366 return android_atomic_release_load(&mTransactionFlags);
2367}
2368
2369uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2370 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2371}
2372
2373uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2374 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2375 if ((old & flags)==0) { // wake the server up
2376 signalTransaction();
2377 }
2378 return old;
2379}
2380
2381void SurfaceFlinger::setTransactionState(
2382 const Vector<ComposerState>& state,
2383 const Vector<DisplayState>& displays,
2384 uint32_t flags)
2385{
2386 ATRACE_CALL();
2387 Mutex::Autolock _l(mStateLock);
2388 uint32_t transactionFlags = 0;
2389
2390 if (flags & eAnimation) {
2391 // For window updates that are part of an animation we must wait for
2392 // previous animation "frames" to be handled.
2393 while (mAnimTransactionPending) {
2394 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2395 if (CC_UNLIKELY(err != NO_ERROR)) {
2396 // just in case something goes wrong in SF, return to the
2397 // caller after a few seconds.
2398 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2399 "waiting for previous animation frame");
2400 mAnimTransactionPending = false;
2401 break;
2402 }
2403 }
2404 }
2405
2406 size_t count = displays.size();
2407 for (size_t i=0 ; i<count ; i++) {
2408 const DisplayState& s(displays[i]);
2409 transactionFlags |= setDisplayStateLocked(s);
2410 }
2411
2412 count = state.size();
2413 for (size_t i=0 ; i<count ; i++) {
2414 const ComposerState& s(state[i]);
2415 // Here we need to check that the interface we're given is indeed
2416 // one of our own. A malicious client could give us a NULL
2417 // IInterface, or one of its own or even one of our own but a
2418 // different type. All these situations would cause us to crash.
2419 //
2420 // NOTE: it would be better to use RTTI as we could directly check
2421 // that we have a Client*. however, RTTI is disabled in Android.
2422 if (s.client != NULL) {
2423 sp<IBinder> binder = IInterface::asBinder(s.client);
2424 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002425 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002426 sp<Client> client( static_cast<Client *>(s.client.get()) );
2427 transactionFlags |= setClientStateLocked(client, s.state);
2428 }
2429 }
2430 }
2431 }
2432
2433 // If a synchronous transaction is explicitly requested without any changes,
2434 // force a transaction anyway. This can be used as a flush mechanism for
2435 // previous async transactions.
2436 if (transactionFlags == 0 && (flags & eSynchronous)) {
2437 transactionFlags = eTransactionNeeded;
2438 }
2439
2440 if (transactionFlags) {
2441 if (mInterceptor.isEnabled()) {
2442 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2443 }
2444
2445 // this triggers the transaction
2446 setTransactionFlags(transactionFlags);
2447
2448 // if this is a synchronous transaction, wait for it to take effect
2449 // before returning.
2450 if (flags & eSynchronous) {
2451 mTransactionPending = true;
2452 }
2453 if (flags & eAnimation) {
2454 mAnimTransactionPending = true;
2455 }
2456 while (mTransactionPending) {
2457 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2458 if (CC_UNLIKELY(err != NO_ERROR)) {
2459 // just in case something goes wrong in SF, return to the
2460 // called after a few seconds.
2461 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2462 mTransactionPending = false;
2463 break;
2464 }
2465 }
2466 }
2467}
2468
2469uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2470{
2471 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2472 if (dpyIdx < 0)
2473 return 0;
2474
2475 uint32_t flags = 0;
2476 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2477 if (disp.isValid()) {
2478 const uint32_t what = s.what;
2479 if (what & DisplayState::eSurfaceChanged) {
2480 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2481 disp.surface = s.surface;
2482 flags |= eDisplayTransactionNeeded;
2483 }
2484 }
2485 if (what & DisplayState::eLayerStackChanged) {
2486 if (disp.layerStack != s.layerStack) {
2487 disp.layerStack = s.layerStack;
2488 flags |= eDisplayTransactionNeeded;
2489 }
2490 }
2491 if (what & DisplayState::eDisplayProjectionChanged) {
2492 if (disp.orientation != s.orientation) {
2493 disp.orientation = s.orientation;
2494 flags |= eDisplayTransactionNeeded;
2495 }
2496 if (disp.frame != s.frame) {
2497 disp.frame = s.frame;
2498 flags |= eDisplayTransactionNeeded;
2499 }
2500 if (disp.viewport != s.viewport) {
2501 disp.viewport = s.viewport;
2502 flags |= eDisplayTransactionNeeded;
2503 }
2504 }
2505 if (what & DisplayState::eDisplaySizeChanged) {
2506 if (disp.width != s.width) {
2507 disp.width = s.width;
2508 flags |= eDisplayTransactionNeeded;
2509 }
2510 if (disp.height != s.height) {
2511 disp.height = s.height;
2512 flags |= eDisplayTransactionNeeded;
2513 }
2514 }
2515 }
2516 return flags;
2517}
2518
2519uint32_t SurfaceFlinger::setClientStateLocked(
2520 const sp<Client>& client,
2521 const layer_state_t& s)
2522{
2523 uint32_t flags = 0;
2524 sp<Layer> layer(client->getLayerUser(s.surface));
2525 if (layer != 0) {
2526 const uint32_t what = s.what;
2527 bool geometryAppliesWithResize =
2528 what & layer_state_t::eGeometryAppliesWithResize;
2529 if (what & layer_state_t::ePositionChanged) {
2530 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2531 flags |= eTraversalNeeded;
2532 }
2533 }
2534 if (what & layer_state_t::eLayerChanged) {
2535 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002536 const auto& p = layer->getParent();
2537 if (p == nullptr) {
2538 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2539 if (layer->setLayer(s.z) && idx >= 0) {
2540 mCurrentState.layersSortedByZ.removeAt(idx);
2541 mCurrentState.layersSortedByZ.add(layer);
2542 // we need traversal (state changed)
2543 // AND transaction (list changed)
2544 flags |= eTransactionNeeded|eTraversalNeeded;
2545 }
2546 } else {
2547 if (p->setChildLayer(layer, s.z)) {
2548 flags |= eTransactionNeeded|eTraversalNeeded;
2549 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002550 }
2551 }
2552 if (what & layer_state_t::eSizeChanged) {
2553 if (layer->setSize(s.w, s.h)) {
2554 flags |= eTraversalNeeded;
2555 }
2556 }
2557 if (what & layer_state_t::eAlphaChanged) {
2558 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2559 flags |= eTraversalNeeded;
2560 }
2561 if (what & layer_state_t::eMatrixChanged) {
2562 if (layer->setMatrix(s.matrix))
2563 flags |= eTraversalNeeded;
2564 }
2565 if (what & layer_state_t::eTransparentRegionChanged) {
2566 if (layer->setTransparentRegionHint(s.transparentRegion))
2567 flags |= eTraversalNeeded;
2568 }
2569 if (what & layer_state_t::eFlagsChanged) {
2570 if (layer->setFlags(s.flags, s.mask))
2571 flags |= eTraversalNeeded;
2572 }
2573 if (what & layer_state_t::eCropChanged) {
2574 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2575 flags |= eTraversalNeeded;
2576 }
2577 if (what & layer_state_t::eFinalCropChanged) {
Robert Carr6fb9ca72017-03-22 18:23:23 -07002578 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002579 flags |= eTraversalNeeded;
2580 }
2581 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002582 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002583 // We only allow setting layer stacks for top level layers,
2584 // everything else inherits layer stack from its parent.
2585 if (layer->hasParent()) {
2586 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2587 layer->getName().string());
2588 } else if (idx < 0) {
2589 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2590 "that also does not appear in the top level layer list. Something"
2591 " has gone wrong.", layer->getName().string());
2592 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002593 mCurrentState.layersSortedByZ.removeAt(idx);
2594 mCurrentState.layersSortedByZ.add(layer);
2595 // we need traversal (state changed)
2596 // AND transaction (list changed)
2597 flags |= eTransactionNeeded|eTraversalNeeded;
2598 }
2599 }
2600 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002601 if (s.barrierHandle != nullptr) {
2602 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2603 } else if (s.barrierGbp != nullptr) {
2604 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2605 if (authenticateSurfaceTextureLocked(gbp)) {
2606 const auto& otherLayer =
2607 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2608 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2609 } else {
2610 ALOGE("Attempt to defer transaction to to an"
2611 " unrecognized GraphicBufferProducer");
2612 }
2613 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002614 // We don't trigger a traversal here because if no other state is
2615 // changed, we don't want this to cause any more work
2616 }
Robert Carr1db73f62016-12-21 12:58:51 -08002617 if (what & layer_state_t::eReparentChildren) {
2618 if (layer->reparentChildren(s.reparentHandle)) {
2619 flags |= eTransactionNeeded|eTraversalNeeded;
2620 }
2621 }
Robert Carr9524cb32017-02-13 11:32:32 -08002622 if (what & layer_state_t::eDetachChildren) {
2623 layer->detachChildren();
2624 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002625 if (what & layer_state_t::eOverrideScalingModeChanged) {
2626 layer->setOverrideScalingMode(s.overrideScalingMode);
2627 // We don't trigger a traversal here because if no other state is
2628 // changed, we don't want this to cause any more work
2629 }
2630 }
2631 return flags;
2632}
2633
2634status_t SurfaceFlinger::createLayer(
2635 const String8& name,
2636 const sp<Client>& client,
2637 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002638 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2639 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002640{
2641 if (int32_t(w|h) < 0) {
2642 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2643 int(w), int(h));
2644 return BAD_VALUE;
2645 }
2646
2647 status_t result = NO_ERROR;
2648
2649 sp<Layer> layer;
2650
Cody Northropbc755282017-03-31 12:00:08 -06002651 String8 uniqueName = getUniqueLayerName(name);
2652
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002653 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2654 case ISurfaceComposerClient::eFXSurfaceNormal:
2655 result = createNormalLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002656 uniqueName, w, h, flags, format,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002657 handle, gbp, &layer);
2658 break;
2659 case ISurfaceComposerClient::eFXSurfaceDim:
2660 result = createDimLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002661 uniqueName, w, h, flags,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002662 handle, gbp, &layer);
2663 break;
2664 default:
2665 result = BAD_VALUE;
2666 break;
2667 }
2668
2669 if (result != NO_ERROR) {
2670 return result;
2671 }
2672
Albert Chaulk479c60c2017-01-27 14:21:34 -05002673 layer->setInfo(windowType, ownerUid);
2674
Robert Carr1f0a16a2016-10-24 16:27:39 -07002675 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002676 if (result != NO_ERROR) {
2677 return result;
2678 }
2679 mInterceptor.saveSurfaceCreation(layer);
2680
2681 setTransactionFlags(eTransactionNeeded);
2682 return result;
2683}
2684
Cody Northropbc755282017-03-31 12:00:08 -06002685String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
2686{
2687 bool matchFound = true;
2688 uint32_t dupeCounter = 0;
2689
2690 // Tack on our counter whether there is a hit or not, so everyone gets a tag
2691 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
2692
2693 // Loop over layers until we're sure there is no matching name
2694 while (matchFound) {
2695 matchFound = false;
2696 mDrawingState.traverseInZOrder([&](Layer* layer) {
2697 if (layer->getName() == uniqueName) {
2698 matchFound = true;
2699 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
2700 }
2701 });
2702 }
2703
2704 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
2705
2706 return uniqueName;
2707}
2708
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002709status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2710 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2711 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2712{
2713 // initialize the surfaces
2714 switch (format) {
2715 case PIXEL_FORMAT_TRANSPARENT:
2716 case PIXEL_FORMAT_TRANSLUCENT:
2717 format = PIXEL_FORMAT_RGBA_8888;
2718 break;
2719 case PIXEL_FORMAT_OPAQUE:
2720 format = PIXEL_FORMAT_RGBX_8888;
2721 break;
2722 }
2723
2724 *outLayer = new Layer(this, client, name, w, h, flags);
2725 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2726 if (err == NO_ERROR) {
2727 *handle = (*outLayer)->getHandle();
2728 *gbp = (*outLayer)->getProducer();
2729 }
2730
2731 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2732 return err;
2733}
2734
2735status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2736 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2737 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2738{
2739 *outLayer = new LayerDim(this, client, name, w, h, flags);
2740 *handle = (*outLayer)->getHandle();
2741 *gbp = (*outLayer)->getProducer();
2742 return NO_ERROR;
2743}
2744
2745status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2746{
Robert Carr9524cb32017-02-13 11:32:32 -08002747 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002748 status_t err = NO_ERROR;
2749 sp<Layer> l(client->getLayerUser(handle));
2750 if (l != NULL) {
2751 mInterceptor.saveSurfaceDeletion(l);
2752 err = removeLayer(l);
2753 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2754 "error removing layer=%p (%s)", l.get(), strerror(-err));
2755 }
2756 return err;
2757}
2758
2759status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2760{
2761 // called by ~LayerCleaner() when all references to the IBinder (handle)
2762 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002763 sp<Layer> l = layer.promote();
2764 if (l == nullptr) {
2765 // The layer has already been removed, carry on
2766 return NO_ERROR;
2767 } if (l->getParent() != nullptr) {
2768 // If we have a parent, then we can continue to live as long as it does.
2769 return NO_ERROR;
2770 }
2771 return removeLayer(l);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002772}
2773
2774// ---------------------------------------------------------------------------
2775
2776void SurfaceFlinger::onInitializeDisplays() {
2777 // reset screen orientation and use primary layer stack
2778 Vector<ComposerState> state;
2779 Vector<DisplayState> displays;
2780 DisplayState d;
2781 d.what = DisplayState::eDisplayProjectionChanged |
2782 DisplayState::eLayerStackChanged;
2783 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2784 d.layerStack = 0;
2785 d.orientation = DisplayState::eOrientationDefault;
2786 d.frame.makeInvalid();
2787 d.viewport.makeInvalid();
2788 d.width = 0;
2789 d.height = 0;
2790 displays.add(d);
2791 setTransactionState(state, displays, 0);
2792 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2793
2794 const nsecs_t period =
2795 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2796 mAnimFrameTracker.setDisplayRefreshPeriod(period);
Brian Andersond0010582017-03-07 13:20:31 -08002797
2798 // Use phase of 0 since phase is not known.
2799 // Use latency of 0, which will snap to the ideal latency.
2800 setCompositorTimingSnapped(0, period, 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002801}
2802
2803void SurfaceFlinger::initializeDisplays() {
2804 class MessageScreenInitialized : public MessageBase {
2805 SurfaceFlinger* flinger;
2806 public:
2807 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2808 virtual bool handler() {
2809 flinger->onInitializeDisplays();
2810 return true;
2811 }
2812 };
2813 sp<MessageBase> msg = new MessageScreenInitialized(this);
2814 postMessageAsync(msg); // we may be called from main thread, use async message
2815}
2816
2817void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2818 int mode) {
2819 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2820 this);
2821 int32_t type = hw->getDisplayType();
2822 int currentMode = hw->getPowerMode();
2823
2824 if (mode == currentMode) {
2825 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2826 return;
2827 }
2828
2829 hw->setPowerMode(mode);
2830 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2831 ALOGW("Trying to set power mode for virtual display");
2832 return;
2833 }
2834
2835 if (mInterceptor.isEnabled()) {
2836 Mutex::Autolock _l(mStateLock);
2837 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2838 if (idx < 0) {
2839 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2840 return;
2841 }
2842 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2843 }
2844
2845 if (currentMode == HWC_POWER_MODE_OFF) {
2846 // Turn on the display
2847 getHwComposer().setPowerMode(type, mode);
Matthew Bouyack38d49612017-05-12 12:49:32 -07002848 if (type == DisplayDevice::DISPLAY_PRIMARY &&
2849 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002850 // FIXME: eventthread only knows about the main display right now
2851 mEventThread->onScreenAcquired();
2852 resyncToHardwareVsync(true);
2853 }
2854
2855 mVisibleRegionsDirty = true;
2856 mHasPoweredOff = true;
2857 repaintEverything();
2858
2859 struct sched_param param = {0};
2860 param.sched_priority = 1;
2861 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2862 ALOGW("Couldn't set SCHED_FIFO on display on");
2863 }
2864 } else if (mode == HWC_POWER_MODE_OFF) {
2865 // Turn off the display
2866 struct sched_param param = {0};
2867 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2868 ALOGW("Couldn't set SCHED_OTHER on display off");
2869 }
2870
2871 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2872 disableHardwareVsync(true); // also cancels any in-progress resync
2873
2874 // FIXME: eventthread only knows about the main display right now
2875 mEventThread->onScreenReleased();
2876 }
2877
2878 getHwComposer().setPowerMode(type, mode);
2879 mVisibleRegionsDirty = true;
2880 // from this point on, SF will stop drawing on this display
Matthew Bouyack38d49612017-05-12 12:49:32 -07002881 } else if (mode == HWC_POWER_MODE_DOZE ||
2882 mode == HWC_POWER_MODE_NORMAL) {
Zheng Zhang8a43fe62017-03-17 11:19:39 +01002883 // Update display while dozing
2884 getHwComposer().setPowerMode(type, mode);
2885 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2886 // FIXME: eventthread only knows about the main display right now
2887 mEventThread->onScreenAcquired();
2888 resyncToHardwareVsync(true);
2889 }
2890 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
2891 // Leave display going to doze
2892 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2893 disableHardwareVsync(true); // also cancels any in-progress resync
2894 // FIXME: eventthread only knows about the main display right now
2895 mEventThread->onScreenReleased();
2896 }
2897 getHwComposer().setPowerMode(type, mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002898 } else {
Matthew Bouyack38d49612017-05-12 12:49:32 -07002899 ALOGE("Attempting to set unknown power mode: %d\n", mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002900 getHwComposer().setPowerMode(type, mode);
2901 }
2902}
2903
2904void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2905 class MessageSetPowerMode: public MessageBase {
2906 SurfaceFlinger& mFlinger;
2907 sp<IBinder> mDisplay;
2908 int mMode;
2909 public:
2910 MessageSetPowerMode(SurfaceFlinger& flinger,
2911 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2912 mDisplay(disp) { mMode = mode; }
2913 virtual bool handler() {
2914 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2915 if (hw == NULL) {
2916 ALOGE("Attempt to set power mode = %d for null display %p",
2917 mMode, mDisplay.get());
2918 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2919 ALOGW("Attempt to set power mode = %d for virtual display",
2920 mMode);
2921 } else {
2922 mFlinger.setPowerModeInternal(hw, mMode);
2923 }
2924 return true;
2925 }
2926 };
2927 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2928 postMessageSync(msg);
2929}
2930
2931// ---------------------------------------------------------------------------
2932
2933status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2934{
2935 String8 result;
2936
2937 IPCThreadState* ipc = IPCThreadState::self();
2938 const int pid = ipc->getCallingPid();
2939 const int uid = ipc->getCallingUid();
2940 if ((uid != AID_SHELL) &&
2941 !PermissionCache::checkPermission(sDump, pid, uid)) {
2942 result.appendFormat("Permission Denial: "
2943 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2944 } else {
2945 // Try to get the main lock, but give up after one second
2946 // (this would indicate SF is stuck, but we want to be able to
2947 // print something in dumpsys).
2948 status_t err = mStateLock.timedLock(s2ns(1));
2949 bool locked = (err == NO_ERROR);
2950 if (!locked) {
2951 result.appendFormat(
2952 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2953 "dumping anyways (no locks held)\n", strerror(-err), err);
2954 }
2955
2956 bool dumpAll = true;
2957 size_t index = 0;
2958 size_t numArgs = args.size();
2959 if (numArgs) {
2960 if ((index < numArgs) &&
2961 (args[index] == String16("--list"))) {
2962 index++;
2963 listLayersLocked(args, index, result);
2964 dumpAll = false;
2965 }
2966
2967 if ((index < numArgs) &&
2968 (args[index] == String16("--latency"))) {
2969 index++;
2970 dumpStatsLocked(args, index, result);
2971 dumpAll = false;
2972 }
2973
2974 if ((index < numArgs) &&
2975 (args[index] == String16("--latency-clear"))) {
2976 index++;
2977 clearStatsLocked(args, index, result);
2978 dumpAll = false;
2979 }
2980
2981 if ((index < numArgs) &&
2982 (args[index] == String16("--dispsync"))) {
2983 index++;
2984 mPrimaryDispSync.dump(result);
2985 dumpAll = false;
2986 }
2987
2988 if ((index < numArgs) &&
2989 (args[index] == String16("--static-screen"))) {
2990 index++;
2991 dumpStaticScreenStats(result);
2992 dumpAll = false;
2993 }
2994
2995 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07002996 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002997 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07002998 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002999 dumpAll = false;
3000 }
3001 }
3002
3003 if (dumpAll) {
3004 dumpAllLocked(args, index, result);
3005 }
3006
3007 if (locked) {
3008 mStateLock.unlock();
3009 }
3010 }
3011 write(fd, result.string(), result.size());
3012 return NO_ERROR;
3013}
3014
3015void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3016 size_t& /* index */, String8& result) const
3017{
Robert Carr2047fae2016-11-28 14:09:09 -08003018 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003019 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08003020 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003021}
3022
3023void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3024 String8& result) const
3025{
3026 String8 name;
3027 if (index < args.size()) {
3028 name = String8(args[index]);
3029 index++;
3030 }
3031
3032 const nsecs_t period =
3033 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3034 result.appendFormat("%" PRId64 "\n", period);
3035
3036 if (name.isEmpty()) {
3037 mAnimFrameTracker.dumpStats(result);
3038 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08003039 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003040 if (name == layer->getName()) {
3041 layer->dumpFrameStats(result);
3042 }
Robert Carr2047fae2016-11-28 14:09:09 -08003043 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003044 }
3045}
3046
3047void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3048 String8& /* result */)
3049{
3050 String8 name;
3051 if (index < args.size()) {
3052 name = String8(args[index]);
3053 index++;
3054 }
3055
Robert Carr2047fae2016-11-28 14:09:09 -08003056 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003057 if (name.isEmpty() || (name == layer->getName())) {
3058 layer->clearFrameStats();
3059 }
Robert Carr2047fae2016-11-28 14:09:09 -08003060 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003061
3062 mAnimFrameTracker.clearStats();
3063}
3064
3065// This should only be called from the main thread. Otherwise it would need
3066// the lock and should use mCurrentState rather than mDrawingState.
3067void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003068 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003069 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003070 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003071
3072 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3073}
3074
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003075void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003076{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003077 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003078 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3079
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003080 if (isLayerTripleBufferingDisabled())
3081 result.append(" DISABLE_TRIPLE_BUFFERING");
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003082
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003083 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003084 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08003085 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08003086 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
Fabien Sanglard1971b632017-03-10 14:50:03 -08003087 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3088 maxFrameBufferAcquiredBuffers);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003089 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003090}
3091
3092void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3093{
3094 result.appendFormat("Static screen stats:\n");
3095 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3096 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3097 float percent = 100.0f *
3098 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3099 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3100 b + 1, bucketTimeSec, percent);
3101 }
3102 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3103 float percent = 100.0f *
3104 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3105 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3106 NUM_BUCKETS - 1, bucketTimeSec, percent);
3107}
3108
Brian Andersond6927fb2016-07-23 23:37:30 -07003109void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3110 result.appendFormat("Layer frame timestamps:\n");
3111
3112 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3113 const size_t count = currentLayers.size();
3114 for (size_t i=0 ; i<count ; i++) {
3115 currentLayers[i]->dumpFrameEvents(result);
3116 }
3117}
3118
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003119void SurfaceFlinger::recordBufferingStats(const char* layerName,
3120 std::vector<OccupancyTracker::Segment>&& history) {
3121 Mutex::Autolock lock(mBufferingStatsMutex);
3122 auto& stats = mBufferingStats[layerName];
3123 for (const auto& segment : history) {
3124 if (!segment.usedThirdBuffer) {
3125 stats.twoBufferTime += segment.totalTime;
3126 }
3127 if (segment.occupancyAverage < 1.0f) {
3128 stats.doubleBufferedTime += segment.totalTime;
3129 } else if (segment.occupancyAverage < 2.0f) {
3130 stats.tripleBufferedTime += segment.totalTime;
3131 }
3132 ++stats.numSegments;
3133 stats.totalTime += segment.totalTime;
3134 }
3135}
3136
3137void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3138 result.append("Buffering stats:\n");
3139 result.append(" [Layer name] <Active time> <Two buffer> "
3140 "<Double buffered> <Triple buffered>\n");
3141 Mutex::Autolock lock(mBufferingStatsMutex);
3142 typedef std::tuple<std::string, float, float, float> BufferTuple;
3143 std::map<float, BufferTuple, std::greater<float>> sorted;
3144 for (const auto& statsPair : mBufferingStats) {
3145 const char* name = statsPair.first.c_str();
3146 const BufferingStats& stats = statsPair.second;
3147 if (stats.numSegments == 0) {
3148 continue;
3149 }
3150 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3151 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3152 stats.totalTime;
3153 float doubleBufferRatio = static_cast<float>(
3154 stats.doubleBufferedTime) / stats.totalTime;
3155 float tripleBufferRatio = static_cast<float>(
3156 stats.tripleBufferedTime) / stats.totalTime;
3157 sorted.insert({activeTime, {name, twoBufferRatio,
3158 doubleBufferRatio, tripleBufferRatio}});
3159 }
3160 for (const auto& sortedPair : sorted) {
3161 float activeTime = sortedPair.first;
3162 const BufferTuple& values = sortedPair.second;
3163 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3164 std::get<0>(values).c_str(), activeTime,
3165 std::get<1>(values), std::get<2>(values),
3166 std::get<3>(values));
3167 }
3168 result.append("\n");
3169}
3170
3171void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3172 String8& result) const
3173{
3174 bool colorize = false;
3175 if (index < args.size()
3176 && (args[index] == String16("--color"))) {
3177 colorize = true;
3178 index++;
3179 }
3180
3181 Colorizer colorizer(colorize);
3182
3183 // figure out if we're stuck somewhere
3184 const nsecs_t now = systemTime();
3185 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3186 const nsecs_t inTransaction(mDebugInTransaction);
3187 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3188 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3189
3190 /*
3191 * Dump library configuration.
3192 */
3193
3194 colorizer.bold(result);
3195 result.append("Build configuration:");
3196 colorizer.reset(result);
3197 appendSfConfigString(result);
3198 appendUiConfigString(result);
3199 appendGuiConfigString(result);
3200 result.append("\n");
3201
3202 colorizer.bold(result);
3203 result.append("Sync configuration: ");
3204 colorizer.reset(result);
3205 result.append(SyncFeatures::getInstance().toString());
3206 result.append("\n");
3207
3208 colorizer.bold(result);
3209 result.append("DispSync configuration: ");
3210 colorizer.reset(result);
3211 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003212 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3213 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003214 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3215 result.append("\n");
3216
3217 // Dump static screen stats
3218 result.append("\n");
3219 dumpStaticScreenStats(result);
3220 result.append("\n");
3221
3222 dumpBufferingStats(result);
3223
3224 /*
3225 * Dump the visible layer list
3226 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003227 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003228 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003229 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003230 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003231 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003232 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003233
3234 /*
3235 * Dump Display state
3236 */
3237
3238 colorizer.bold(result);
3239 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3240 colorizer.reset(result);
3241 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3242 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3243 hw->dump(result);
3244 }
3245
3246 /*
3247 * Dump SurfaceFlinger global state
3248 */
3249
3250 colorizer.bold(result);
3251 result.append("SurfaceFlinger global state:\n");
3252 colorizer.reset(result);
3253
3254 HWComposer& hwc(getHwComposer());
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003255 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003256
3257 colorizer.bold(result);
3258 result.appendFormat("EGL implementation : %s\n",
3259 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3260 colorizer.reset(result);
3261 result.appendFormat("%s\n",
3262 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3263
3264 mRenderEngine->dump(result);
3265
3266 hw->undefinedRegion.dump(result, "undefinedRegion");
3267 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3268 hw->getOrientation(), hw->isDisplayOn());
3269 result.appendFormat(
3270 " last eglSwapBuffers() time: %f us\n"
3271 " last transaction time : %f us\n"
3272 " transaction-flags : %08x\n"
3273 " refresh-rate : %f fps\n"
3274 " x-dpi : %f\n"
3275 " y-dpi : %f\n"
3276 " gpu_to_cpu_unsupported : %d\n"
3277 ,
3278 mLastSwapBufferTime/1000.0,
3279 mLastTransactionTime/1000.0,
3280 mTransactionFlags,
3281 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3282 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3283 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3284 !mGpuToCpuSupported);
3285
3286 result.appendFormat(" eglSwapBuffers time: %f us\n",
3287 inSwapBuffersDuration/1000.0);
3288
3289 result.appendFormat(" transaction time: %f us\n",
3290 inTransactionDuration/1000.0);
3291
3292 /*
3293 * VSYNC state
3294 */
3295 mEventThread->dump(result);
3296
3297 /*
3298 * Dump HWComposer state
3299 */
3300 colorizer.bold(result);
3301 result.append("h/w composer state:\n");
3302 colorizer.reset(result);
3303 result.appendFormat(" h/w composer %s and %s\n",
3304 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3305 (mDebugDisableHWC || mDebugRegion || mDaltonize
3306 || mHasColorMatrix) ? "disabled" : "enabled");
3307 hwc.dump(result);
3308
3309 /*
3310 * Dump gralloc state
3311 */
3312 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3313 alloc.dump(result);
3314}
3315
3316const Vector< sp<Layer> >&
3317SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3318 // Note: mStateLock is held here
3319 wp<IBinder> dpy;
3320 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3321 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3322 dpy = mDisplays.keyAt(i);
3323 break;
3324 }
3325 }
3326 if (dpy == NULL) {
3327 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3328 // Just use the primary display so we have something to return
3329 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3330 }
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003331 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003332}
3333
3334bool SurfaceFlinger::startDdmConnection()
3335{
3336 void* libddmconnection_dso =
3337 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3338 if (!libddmconnection_dso) {
3339 return false;
3340 }
3341 void (*DdmConnection_start)(const char* name);
3342 DdmConnection_start =
3343 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3344 if (!DdmConnection_start) {
3345 dlclose(libddmconnection_dso);
3346 return false;
3347 }
3348 (*DdmConnection_start)(getServiceName());
3349 return true;
3350}
3351
3352status_t SurfaceFlinger::onTransact(
3353 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3354{
3355 switch (code) {
3356 case CREATE_CONNECTION:
3357 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003358 case BOOT_FINISHED:
3359 case CLEAR_ANIMATION_FRAME_STATS:
3360 case GET_ANIMATION_FRAME_STATS:
3361 case SET_POWER_MODE:
3362 case GET_HDR_CAPABILITIES:
3363 {
3364 // codes that require permission check
3365 IPCThreadState* ipc = IPCThreadState::self();
3366 const int pid = ipc->getCallingPid();
3367 const int uid = ipc->getCallingUid();
3368 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3369 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3370 ALOGE("Permission Denial: "
3371 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3372 return PERMISSION_DENIED;
3373 }
3374 break;
3375 }
Robert Carr1db73f62016-12-21 12:58:51 -08003376 /*
3377 * Calling setTransactionState is safe, because you need to have been
3378 * granted a reference to Client* and Handle* to do anything with it.
3379 *
3380 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3381 */
3382 case SET_TRANSACTION_STATE:
3383 case CREATE_SCOPED_CONNECTION:
3384 {
3385 break;
3386 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003387 case CAPTURE_SCREEN:
3388 {
3389 // codes that require permission check
3390 IPCThreadState* ipc = IPCThreadState::self();
3391 const int pid = ipc->getCallingPid();
3392 const int uid = ipc->getCallingUid();
3393 if ((uid != AID_GRAPHICS) &&
3394 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3395 ALOGE("Permission Denial: "
3396 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3397 return PERMISSION_DENIED;
3398 }
3399 break;
3400 }
3401 }
3402
3403 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3404 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3405 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3406 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3407 IPCThreadState* ipc = IPCThreadState::self();
3408 const int pid = ipc->getCallingPid();
3409 const int uid = ipc->getCallingUid();
3410 ALOGE("Permission Denial: "
3411 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3412 return PERMISSION_DENIED;
3413 }
3414 int n;
3415 switch (code) {
3416 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3417 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3418 return NO_ERROR;
3419 case 1002: // SHOW_UPDATES
3420 n = data.readInt32();
3421 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3422 invalidateHwcGeometry();
3423 repaintEverything();
3424 return NO_ERROR;
3425 case 1004:{ // repaint everything
3426 repaintEverything();
3427 return NO_ERROR;
3428 }
3429 case 1005:{ // force transaction
3430 setTransactionFlags(
3431 eTransactionNeeded|
3432 eDisplayTransactionNeeded|
3433 eTraversalNeeded);
3434 return NO_ERROR;
3435 }
3436 case 1006:{ // send empty update
3437 signalRefresh();
3438 return NO_ERROR;
3439 }
3440 case 1008: // toggle use of hw composer
3441 n = data.readInt32();
3442 mDebugDisableHWC = n ? 1 : 0;
3443 invalidateHwcGeometry();
3444 repaintEverything();
3445 return NO_ERROR;
3446 case 1009: // toggle use of transform hint
3447 n = data.readInt32();
3448 mDebugDisableTransformHint = n ? 1 : 0;
3449 invalidateHwcGeometry();
3450 repaintEverything();
3451 return NO_ERROR;
3452 case 1010: // interrogate.
3453 reply->writeInt32(0);
3454 reply->writeInt32(0);
3455 reply->writeInt32(mDebugRegion);
3456 reply->writeInt32(0);
3457 reply->writeInt32(mDebugDisableHWC);
3458 return NO_ERROR;
3459 case 1013: {
3460 Mutex::Autolock _l(mStateLock);
3461 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3462 reply->writeInt32(hw->getPageFlipCount());
3463 return NO_ERROR;
3464 }
3465 case 1014: {
3466 // daltonize
3467 n = data.readInt32();
3468 switch (n % 10) {
3469 case 1:
3470 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3471 break;
3472 case 2:
3473 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3474 break;
3475 case 3:
3476 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3477 break;
3478 }
3479 if (n >= 10) {
3480 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3481 } else {
3482 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3483 }
3484 mDaltonize = n > 0;
3485 invalidateHwcGeometry();
3486 repaintEverything();
3487 return NO_ERROR;
3488 }
3489 case 1015: {
3490 // apply a color matrix
3491 n = data.readInt32();
3492 mHasColorMatrix = n ? 1 : 0;
3493 if (n) {
3494 // color matrix is sent as mat3 matrix followed by vec3
3495 // offset, then packed into a mat4 where the last row is
3496 // the offset and extra values are 0
3497 for (size_t i = 0 ; i < 4; i++) {
3498 for (size_t j = 0; j < 4; j++) {
3499 mColorMatrix[i][j] = data.readFloat();
3500 }
3501 }
3502 } else {
3503 mColorMatrix = mat4();
3504 }
3505 invalidateHwcGeometry();
3506 repaintEverything();
3507 return NO_ERROR;
3508 }
3509 // This is an experimental interface
3510 // Needs to be shifted to proper binder interface when we productize
3511 case 1016: {
3512 n = data.readInt32();
3513 mPrimaryDispSync.setRefreshSkipCount(n);
3514 return NO_ERROR;
3515 }
3516 case 1017: {
3517 n = data.readInt32();
3518 mForceFullDamage = static_cast<bool>(n);
3519 return NO_ERROR;
3520 }
3521 case 1018: { // Modify Choreographer's phase offset
3522 n = data.readInt32();
3523 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3524 return NO_ERROR;
3525 }
3526 case 1019: { // Modify SurfaceFlinger's phase offset
3527 n = data.readInt32();
3528 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3529 return NO_ERROR;
3530 }
3531 case 1020: { // Layer updates interceptor
3532 n = data.readInt32();
3533 if (n) {
3534 ALOGV("Interceptor enabled");
3535 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3536 }
3537 else{
3538 ALOGV("Interceptor disabled");
3539 mInterceptor.disable();
3540 }
3541 return NO_ERROR;
3542 }
3543 case 1021: { // Disable HWC virtual displays
3544 n = data.readInt32();
3545 mUseHwcVirtualDisplays = !n;
3546 return NO_ERROR;
3547 }
3548 }
3549 }
3550 return err;
3551}
3552
3553void SurfaceFlinger::repaintEverything() {
3554 android_atomic_or(1, &mRepaintEverything);
3555 signalTransaction();
3556}
3557
3558// ---------------------------------------------------------------------------
3559// Capture screen into an IGraphiBufferProducer
3560// ---------------------------------------------------------------------------
3561
3562/* The code below is here to handle b/8734824
3563 *
3564 * We create a IGraphicBufferProducer wrapper that forwards all calls
3565 * from the surfaceflinger thread to the calling binder thread, where they
3566 * are executed. This allows the calling thread in the calling process to be
3567 * reused and not depend on having "enough" binder threads to handle the
3568 * requests.
3569 */
3570class GraphicProducerWrapper : public BBinder, public MessageHandler {
3571 /* Parts of GraphicProducerWrapper are run on two different threads,
3572 * communicating by sending messages via Looper but also by shared member
3573 * data. Coherence maintenance is subtle and in places implicit (ugh).
3574 *
3575 * Don't rely on Looper's sendMessage/handleMessage providing
3576 * release/acquire semantics for any data not actually in the Message.
3577 * Data going from surfaceflinger to binder threads needs to be
3578 * synchronized explicitly.
3579 *
3580 * Barrier open/wait do provide release/acquire semantics. This provides
3581 * implicit synchronization for data coming back from binder to
3582 * surfaceflinger threads.
3583 */
3584
3585 sp<IGraphicBufferProducer> impl;
3586 sp<Looper> looper;
3587 status_t result;
3588 bool exitPending;
3589 bool exitRequested;
3590 Barrier barrier;
3591 uint32_t code;
3592 Parcel const* data;
3593 Parcel* reply;
3594
3595 enum {
3596 MSG_API_CALL,
3597 MSG_EXIT
3598 };
3599
3600 /*
3601 * Called on surfaceflinger thread. This is called by our "fake"
3602 * BpGraphicBufferProducer. We package the data and reply Parcel and
3603 * forward them to the binder thread.
3604 */
3605 virtual status_t transact(uint32_t code,
3606 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3607 this->code = code;
3608 this->data = &data;
3609 this->reply = reply;
3610 if (exitPending) {
3611 // if we've exited, we run the message synchronously right here.
3612 // note (JH): as far as I can tell from looking at the code, this
3613 // never actually happens. if it does, i'm not sure if it happens
3614 // on the surfaceflinger or binder thread.
3615 handleMessage(Message(MSG_API_CALL));
3616 } else {
3617 barrier.close();
3618 // Prevent stores to this->{code, data, reply} from being
3619 // reordered later than the construction of Message.
3620 atomic_thread_fence(memory_order_release);
3621 looper->sendMessage(this, Message(MSG_API_CALL));
3622 barrier.wait();
3623 }
3624 return result;
3625 }
3626
3627 /*
3628 * here we run on the binder thread. All we've got to do is
3629 * call the real BpGraphicBufferProducer.
3630 */
3631 virtual void handleMessage(const Message& message) {
3632 int what = message.what;
3633 // Prevent reads below from happening before the read from Message
3634 atomic_thread_fence(memory_order_acquire);
3635 if (what == MSG_API_CALL) {
3636 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3637 barrier.open();
3638 } else if (what == MSG_EXIT) {
3639 exitRequested = true;
3640 }
3641 }
3642
3643public:
3644 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3645 : impl(impl),
3646 looper(new Looper(true)),
3647 result(NO_ERROR),
3648 exitPending(false),
3649 exitRequested(false),
3650 code(0),
3651 data(NULL),
3652 reply(NULL)
3653 {}
3654
3655 // Binder thread
3656 status_t waitForResponse() {
3657 do {
3658 looper->pollOnce(-1);
3659 } while (!exitRequested);
3660 return result;
3661 }
3662
3663 // Client thread
3664 void exit(status_t result) {
3665 this->result = result;
3666 exitPending = true;
3667 // Ensure this->result is visible to the binder thread before it
3668 // handles the message.
3669 atomic_thread_fence(memory_order_release);
3670 looper->sendMessage(this, Message(MSG_EXIT));
3671 }
3672};
3673
3674
3675status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3676 const sp<IGraphicBufferProducer>& producer,
3677 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003678 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003679 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3680
3681 if (CC_UNLIKELY(display == 0))
3682 return BAD_VALUE;
3683
3684 if (CC_UNLIKELY(producer == 0))
3685 return BAD_VALUE;
3686
3687 // if we have secure windows on this display, never allow the screen capture
3688 // unless the producer interface is local (i.e.: we can take a screenshot for
3689 // ourselves).
3690 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3691
3692 // Convert to surfaceflinger's internal rotation type.
3693 Transform::orientation_flags rotationFlags;
3694 switch (rotation) {
3695 case ISurfaceComposer::eRotateNone:
3696 rotationFlags = Transform::ROT_0;
3697 break;
3698 case ISurfaceComposer::eRotate90:
3699 rotationFlags = Transform::ROT_90;
3700 break;
3701 case ISurfaceComposer::eRotate180:
3702 rotationFlags = Transform::ROT_180;
3703 break;
3704 case ISurfaceComposer::eRotate270:
3705 rotationFlags = Transform::ROT_270;
3706 break;
3707 default:
3708 rotationFlags = Transform::ROT_0;
3709 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3710 break;
3711 }
3712
3713 class MessageCaptureScreen : public MessageBase {
3714 SurfaceFlinger* flinger;
3715 sp<IBinder> display;
3716 sp<IGraphicBufferProducer> producer;
3717 Rect sourceCrop;
3718 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003719 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003720 bool useIdentityTransform;
3721 Transform::orientation_flags rotation;
3722 status_t result;
3723 bool isLocalScreenshot;
3724 public:
3725 MessageCaptureScreen(SurfaceFlinger* flinger,
3726 const sp<IBinder>& display,
3727 const sp<IGraphicBufferProducer>& producer,
3728 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003729 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003730 bool useIdentityTransform,
3731 Transform::orientation_flags rotation,
3732 bool isLocalScreenshot)
3733 : flinger(flinger), display(display), producer(producer),
3734 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3735 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3736 useIdentityTransform(useIdentityTransform),
3737 rotation(rotation), result(PERMISSION_DENIED),
3738 isLocalScreenshot(isLocalScreenshot)
3739 {
3740 }
3741 status_t getResult() const {
3742 return result;
3743 }
3744 virtual bool handler() {
3745 Mutex::Autolock _l(flinger->mStateLock);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003746 sp<const DisplayDevice> hw(flinger->getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003747 result = flinger->captureScreenImplLocked(hw, producer,
3748 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3749 useIdentityTransform, rotation, isLocalScreenshot);
3750 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3751 return true;
3752 }
3753 };
3754
3755 // this creates a "fake" BBinder which will serve as a "fake" remote
3756 // binder to receive the marshaled calls and forward them to the
3757 // real remote (a BpGraphicBufferProducer)
3758 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3759
3760 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3761 // which does the marshaling work forwards to our "fake remote" above.
3762 sp<MessageBase> msg = new MessageCaptureScreen(this,
3763 display, IGraphicBufferProducer::asInterface( wrapper ),
3764 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3765 useIdentityTransform, rotationFlags, isLocalScreenshot);
3766
3767 status_t res = postMessageAsync(msg);
3768 if (res == NO_ERROR) {
3769 res = wrapper->waitForResponse();
3770 }
3771 return res;
3772}
3773
3774
3775void SurfaceFlinger::renderScreenImplLocked(
3776 const sp<const DisplayDevice>& hw,
3777 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003778 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003779 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3780{
3781 ATRACE_CALL();
3782 RenderEngine& engine(getRenderEngine());
3783
3784 // get screen geometry
3785 const int32_t hw_w = hw->getWidth();
3786 const int32_t hw_h = hw->getHeight();
3787 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3788 static_cast<int32_t>(reqHeight) != hw_h;
3789
3790 // if a default or invalid sourceCrop is passed in, set reasonable values
3791 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3792 !sourceCrop.isValid()) {
3793 sourceCrop.setLeftTop(Point(0, 0));
3794 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3795 }
3796
3797 // ensure that sourceCrop is inside screen
3798 if (sourceCrop.left < 0) {
3799 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3800 }
3801 if (sourceCrop.right > hw_w) {
3802 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3803 }
3804 if (sourceCrop.top < 0) {
3805 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3806 }
3807 if (sourceCrop.bottom > hw_h) {
3808 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3809 }
3810
3811 // make sure to clear all GL error flags
3812 engine.checkErrors();
3813
3814 // set-up our viewport
3815 engine.setViewportAndProjection(
3816 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3817 engine.disableTexturing();
3818
3819 // redraw the screen entirely...
3820 engine.clearWithColor(0, 0, 0, 1);
3821
Robert Carr1f0a16a2016-10-24 16:27:39 -07003822 // We loop through the first level of layers without traversing,
3823 // as we need to interpret min/max layer Z in the top level Z space.
3824 for (const auto& layer : mDrawingState.layersSortedByZ) {
3825 if (layer->getLayerStack() != hw->getLayerStack()) {
3826 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003827 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003828 const Layer::State& state(layer->getDrawingState());
3829 if (state.z < minLayerZ || state.z > maxLayerZ) {
3830 continue;
3831 }
Dan Stoza412903f2017-04-27 13:42:17 -07003832 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003833 if (!layer->isVisible()) {
3834 return;
3835 }
3836 if (filtering) layer->setFiltering(true);
3837 layer->draw(hw, useIdentityTransform);
3838 if (filtering) layer->setFiltering(false);
3839 });
3840 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003841
3842 // compositionComplete is needed for older driver
3843 hw->compositionComplete();
3844 hw->setViewportAndProjection();
3845}
3846
3847
3848status_t SurfaceFlinger::captureScreenImplLocked(
3849 const sp<const DisplayDevice>& hw,
3850 const sp<IGraphicBufferProducer>& producer,
3851 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003852 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003853 bool useIdentityTransform, Transform::orientation_flags rotation,
3854 bool isLocalScreenshot)
3855{
3856 ATRACE_CALL();
3857
3858 // get screen geometry
3859 uint32_t hw_w = hw->getWidth();
3860 uint32_t hw_h = hw->getHeight();
3861
3862 if (rotation & Transform::ROT_90) {
3863 std::swap(hw_w, hw_h);
3864 }
3865
3866 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3867 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3868 reqWidth, reqHeight, hw_w, hw_h);
3869 return BAD_VALUE;
3870 }
3871
3872 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3873 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3874
3875 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003876 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003877 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003878 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3879 (state.z < minLayerZ || state.z > maxLayerZ)) {
3880 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003881 }
Dan Stoza412903f2017-04-27 13:42:17 -07003882 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003883 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3884 layer->isSecure());
3885 });
3886 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003887
3888 if (!isLocalScreenshot && secureLayerIsVisible) {
3889 ALOGW("FB is protected: PERMISSION_DENIED");
3890 return PERMISSION_DENIED;
3891 }
3892
3893 // create a surface (because we're a producer, and we need to
3894 // dequeue/queue a buffer)
3895 sp<Surface> sur = new Surface(producer, false);
3896 ANativeWindow* window = sur.get();
3897
3898 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3899 if (result == NO_ERROR) {
3900 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3901 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3902
3903 int err = 0;
3904 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3905 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3906 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3907 err |= native_window_set_usage(window, usage);
3908
3909 if (err == NO_ERROR) {
3910 ANativeWindowBuffer* buffer;
3911 /* TODO: Once we have the sync framework everywhere this can use
3912 * server-side waits on the fence that dequeueBuffer returns.
3913 */
3914 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3915 if (result == NO_ERROR) {
3916 int syncFd = -1;
3917 // create an EGLImage from the buffer so we can later
3918 // turn it into a texture
3919 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3920 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3921 if (image != EGL_NO_IMAGE_KHR) {
3922 // this binds the given EGLImage as a framebuffer for the
3923 // duration of this scope.
3924 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3925 if (imageBond.getStatus() == NO_ERROR) {
3926 // this will in fact render into our dequeued buffer
3927 // via an FBO, which means we didn't have to create
3928 // an EGLSurface and therefore we're not
3929 // dependent on the context's EGLConfig.
3930 renderScreenImplLocked(
3931 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3932 useIdentityTransform, rotation);
3933
3934 // Attempt to create a sync khr object that can produce a sync point. If that
3935 // isn't available, create a non-dupable sync object in the fallback path and
3936 // wait on it directly.
3937 EGLSyncKHR sync;
3938 if (!DEBUG_SCREENSHOTS) {
3939 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3940 // native fence fd will not be populated until flush() is done.
3941 getRenderEngine().flush();
3942 } else {
3943 sync = EGL_NO_SYNC_KHR;
3944 }
3945 if (sync != EGL_NO_SYNC_KHR) {
3946 // get the sync fd
3947 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3948 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3949 ALOGW("captureScreen: failed to dup sync khr object");
3950 syncFd = -1;
3951 }
3952 eglDestroySyncKHR(mEGLDisplay, sync);
3953 } else {
3954 // fallback path
3955 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3956 if (sync != EGL_NO_SYNC_KHR) {
3957 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3958 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3959 EGLint eglErr = eglGetError();
3960 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3961 ALOGW("captureScreen: fence wait timed out");
3962 } else {
3963 ALOGW_IF(eglErr != EGL_SUCCESS,
3964 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3965 }
3966 eglDestroySyncKHR(mEGLDisplay, sync);
3967 } else {
3968 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3969 }
3970 }
3971 if (DEBUG_SCREENSHOTS) {
3972 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3973 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3974 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3975 hw, minLayerZ, maxLayerZ);
3976 delete [] pixels;
3977 }
3978
3979 } else {
3980 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3981 result = INVALID_OPERATION;
3982 window->cancelBuffer(window, buffer, syncFd);
3983 buffer = NULL;
3984 }
3985 // destroy our image
3986 eglDestroyImageKHR(mEGLDisplay, image);
3987 } else {
3988 result = BAD_VALUE;
3989 }
3990 if (buffer) {
3991 // queueBuffer takes ownership of syncFd
3992 result = window->queueBuffer(window, buffer, syncFd);
3993 }
3994 }
3995 } else {
3996 result = BAD_VALUE;
3997 }
3998 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3999 }
4000
4001 return result;
4002}
4003
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004004void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08004005 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004006 if (DEBUG_SCREENSHOTS) {
4007 for (size_t y=0 ; y<h ; y++) {
4008 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4009 for (size_t x=0 ; x<w ; x++) {
4010 if (p[x] != 0xFF000000) return;
4011 }
4012 }
4013 ALOGE("*** we just took a black screenshot ***\n"
4014 "requested minz=%d, maxz=%d, layerStack=%d",
4015 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08004016 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004017 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004018 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004019 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4020 state.z <= maxLayerZ) {
Dan Stoza412903f2017-04-27 13:42:17 -07004021 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07004022 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
4023 layer->isVisible() ? '+' : '-',
4024 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004025 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07004026 i++;
4027 });
4028 }
4029 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004030 }
4031}
4032
4033// ---------------------------------------------------------------------------
4034
Dan Stoza412903f2017-04-27 13:42:17 -07004035void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4036 layersSortedByZ.traverseInZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004037}
4038
Dan Stoza412903f2017-04-27 13:42:17 -07004039void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4040 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004041}
4042
4043}; // namespace android
4044
4045
4046#if defined(__gl_h_)
4047#error "don't include gl/gl.h in this file"
4048#endif
4049
4050#if defined(__gl2_h_)
4051#error "don't include gl2/gl2.h in this file"
4052#endif