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