blob: 0b3a0d0d3859b9a0cec470924100665014807882 [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
2872 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2873 disableHardwareVsync(true); // also cancels any in-progress resync
2874
2875 // FIXME: eventthread only knows about the main display right now
2876 mEventThread->onScreenReleased();
2877 }
2878
2879 getHwComposer().setPowerMode(type, mode);
2880 mVisibleRegionsDirty = true;
2881 // from this point on, SF will stop drawing on this display
Matthew Bouyack38d49612017-05-12 12:49:32 -07002882 } else if (mode == HWC_POWER_MODE_DOZE ||
2883 mode == HWC_POWER_MODE_NORMAL) {
Zheng Zhang8a43fe62017-03-17 11:19:39 +01002884 // Update display while dozing
2885 getHwComposer().setPowerMode(type, mode);
2886 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2887 // FIXME: eventthread only knows about the main display right now
2888 mEventThread->onScreenAcquired();
2889 resyncToHardwareVsync(true);
2890 }
2891 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
2892 // Leave display going to doze
2893 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2894 disableHardwareVsync(true); // also cancels any in-progress resync
2895 // FIXME: eventthread only knows about the main display right now
2896 mEventThread->onScreenReleased();
2897 }
2898 getHwComposer().setPowerMode(type, mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002899 } else {
Matthew Bouyack38d49612017-05-12 12:49:32 -07002900 ALOGE("Attempting to set unknown power mode: %d\n", mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002901 getHwComposer().setPowerMode(type, mode);
2902 }
2903}
2904
2905void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2906 class MessageSetPowerMode: public MessageBase {
2907 SurfaceFlinger& mFlinger;
2908 sp<IBinder> mDisplay;
2909 int mMode;
2910 public:
2911 MessageSetPowerMode(SurfaceFlinger& flinger,
2912 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2913 mDisplay(disp) { mMode = mode; }
2914 virtual bool handler() {
2915 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2916 if (hw == NULL) {
2917 ALOGE("Attempt to set power mode = %d for null display %p",
2918 mMode, mDisplay.get());
2919 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2920 ALOGW("Attempt to set power mode = %d for virtual display",
2921 mMode);
2922 } else {
2923 mFlinger.setPowerModeInternal(hw, mMode);
2924 }
2925 return true;
2926 }
2927 };
2928 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2929 postMessageSync(msg);
2930}
2931
2932// ---------------------------------------------------------------------------
2933
2934status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2935{
2936 String8 result;
2937
2938 IPCThreadState* ipc = IPCThreadState::self();
2939 const int pid = ipc->getCallingPid();
2940 const int uid = ipc->getCallingUid();
2941 if ((uid != AID_SHELL) &&
2942 !PermissionCache::checkPermission(sDump, pid, uid)) {
2943 result.appendFormat("Permission Denial: "
2944 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2945 } else {
2946 // Try to get the main lock, but give up after one second
2947 // (this would indicate SF is stuck, but we want to be able to
2948 // print something in dumpsys).
2949 status_t err = mStateLock.timedLock(s2ns(1));
2950 bool locked = (err == NO_ERROR);
2951 if (!locked) {
2952 result.appendFormat(
2953 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2954 "dumping anyways (no locks held)\n", strerror(-err), err);
2955 }
2956
2957 bool dumpAll = true;
2958 size_t index = 0;
2959 size_t numArgs = args.size();
2960 if (numArgs) {
2961 if ((index < numArgs) &&
2962 (args[index] == String16("--list"))) {
2963 index++;
2964 listLayersLocked(args, index, result);
2965 dumpAll = false;
2966 }
2967
2968 if ((index < numArgs) &&
2969 (args[index] == String16("--latency"))) {
2970 index++;
2971 dumpStatsLocked(args, index, result);
2972 dumpAll = false;
2973 }
2974
2975 if ((index < numArgs) &&
2976 (args[index] == String16("--latency-clear"))) {
2977 index++;
2978 clearStatsLocked(args, index, result);
2979 dumpAll = false;
2980 }
2981
2982 if ((index < numArgs) &&
2983 (args[index] == String16("--dispsync"))) {
2984 index++;
2985 mPrimaryDispSync.dump(result);
2986 dumpAll = false;
2987 }
2988
2989 if ((index < numArgs) &&
2990 (args[index] == String16("--static-screen"))) {
2991 index++;
2992 dumpStaticScreenStats(result);
2993 dumpAll = false;
2994 }
2995
2996 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07002997 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002998 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07002999 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003000 dumpAll = false;
3001 }
3002 }
3003
3004 if (dumpAll) {
3005 dumpAllLocked(args, index, result);
3006 }
3007
3008 if (locked) {
3009 mStateLock.unlock();
3010 }
3011 }
3012 write(fd, result.string(), result.size());
3013 return NO_ERROR;
3014}
3015
3016void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3017 size_t& /* index */, String8& result) const
3018{
Robert Carr2047fae2016-11-28 14:09:09 -08003019 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003020 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08003021 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003022}
3023
3024void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3025 String8& result) const
3026{
3027 String8 name;
3028 if (index < args.size()) {
3029 name = String8(args[index]);
3030 index++;
3031 }
3032
3033 const nsecs_t period =
3034 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3035 result.appendFormat("%" PRId64 "\n", period);
3036
3037 if (name.isEmpty()) {
3038 mAnimFrameTracker.dumpStats(result);
3039 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08003040 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003041 if (name == layer->getName()) {
3042 layer->dumpFrameStats(result);
3043 }
Robert Carr2047fae2016-11-28 14:09:09 -08003044 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003045 }
3046}
3047
3048void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3049 String8& /* result */)
3050{
3051 String8 name;
3052 if (index < args.size()) {
3053 name = String8(args[index]);
3054 index++;
3055 }
3056
Robert Carr2047fae2016-11-28 14:09:09 -08003057 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003058 if (name.isEmpty() || (name == layer->getName())) {
3059 layer->clearFrameStats();
3060 }
Robert Carr2047fae2016-11-28 14:09:09 -08003061 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003062
3063 mAnimFrameTracker.clearStats();
3064}
3065
3066// This should only be called from the main thread. Otherwise it would need
3067// the lock and should use mCurrentState rather than mDrawingState.
3068void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003069 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003070 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003071 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003072
3073 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3074}
3075
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003076void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003077{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003078 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003079 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3080
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003081 if (isLayerTripleBufferingDisabled())
3082 result.append(" DISABLE_TRIPLE_BUFFERING");
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003083
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003084 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003085 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08003086 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08003087 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
Fabien Sanglard1971b632017-03-10 14:50:03 -08003088 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3089 maxFrameBufferAcquiredBuffers);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003090 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003091}
3092
3093void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3094{
3095 result.appendFormat("Static screen stats:\n");
3096 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3097 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3098 float percent = 100.0f *
3099 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3100 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3101 b + 1, bucketTimeSec, percent);
3102 }
3103 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3104 float percent = 100.0f *
3105 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3106 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3107 NUM_BUCKETS - 1, bucketTimeSec, percent);
3108}
3109
Brian Andersond6927fb2016-07-23 23:37:30 -07003110void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3111 result.appendFormat("Layer frame timestamps:\n");
3112
3113 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3114 const size_t count = currentLayers.size();
3115 for (size_t i=0 ; i<count ; i++) {
3116 currentLayers[i]->dumpFrameEvents(result);
3117 }
3118}
3119
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003120void SurfaceFlinger::recordBufferingStats(const char* layerName,
3121 std::vector<OccupancyTracker::Segment>&& history) {
3122 Mutex::Autolock lock(mBufferingStatsMutex);
3123 auto& stats = mBufferingStats[layerName];
3124 for (const auto& segment : history) {
3125 if (!segment.usedThirdBuffer) {
3126 stats.twoBufferTime += segment.totalTime;
3127 }
3128 if (segment.occupancyAverage < 1.0f) {
3129 stats.doubleBufferedTime += segment.totalTime;
3130 } else if (segment.occupancyAverage < 2.0f) {
3131 stats.tripleBufferedTime += segment.totalTime;
3132 }
3133 ++stats.numSegments;
3134 stats.totalTime += segment.totalTime;
3135 }
3136}
3137
3138void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3139 result.append("Buffering stats:\n");
3140 result.append(" [Layer name] <Active time> <Two buffer> "
3141 "<Double buffered> <Triple buffered>\n");
3142 Mutex::Autolock lock(mBufferingStatsMutex);
3143 typedef std::tuple<std::string, float, float, float> BufferTuple;
3144 std::map<float, BufferTuple, std::greater<float>> sorted;
3145 for (const auto& statsPair : mBufferingStats) {
3146 const char* name = statsPair.first.c_str();
3147 const BufferingStats& stats = statsPair.second;
3148 if (stats.numSegments == 0) {
3149 continue;
3150 }
3151 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3152 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3153 stats.totalTime;
3154 float doubleBufferRatio = static_cast<float>(
3155 stats.doubleBufferedTime) / stats.totalTime;
3156 float tripleBufferRatio = static_cast<float>(
3157 stats.tripleBufferedTime) / stats.totalTime;
3158 sorted.insert({activeTime, {name, twoBufferRatio,
3159 doubleBufferRatio, tripleBufferRatio}});
3160 }
3161 for (const auto& sortedPair : sorted) {
3162 float activeTime = sortedPair.first;
3163 const BufferTuple& values = sortedPair.second;
3164 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3165 std::get<0>(values).c_str(), activeTime,
3166 std::get<1>(values), std::get<2>(values),
3167 std::get<3>(values));
3168 }
3169 result.append("\n");
3170}
3171
3172void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3173 String8& result) const
3174{
3175 bool colorize = false;
3176 if (index < args.size()
3177 && (args[index] == String16("--color"))) {
3178 colorize = true;
3179 index++;
3180 }
3181
3182 Colorizer colorizer(colorize);
3183
3184 // figure out if we're stuck somewhere
3185 const nsecs_t now = systemTime();
3186 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3187 const nsecs_t inTransaction(mDebugInTransaction);
3188 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3189 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3190
3191 /*
3192 * Dump library configuration.
3193 */
3194
3195 colorizer.bold(result);
3196 result.append("Build configuration:");
3197 colorizer.reset(result);
3198 appendSfConfigString(result);
3199 appendUiConfigString(result);
3200 appendGuiConfigString(result);
3201 result.append("\n");
3202
3203 colorizer.bold(result);
3204 result.append("Sync configuration: ");
3205 colorizer.reset(result);
3206 result.append(SyncFeatures::getInstance().toString());
3207 result.append("\n");
3208
3209 colorizer.bold(result);
3210 result.append("DispSync configuration: ");
3211 colorizer.reset(result);
3212 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003213 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3214 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003215 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3216 result.append("\n");
3217
3218 // Dump static screen stats
3219 result.append("\n");
3220 dumpStaticScreenStats(result);
3221 result.append("\n");
3222
3223 dumpBufferingStats(result);
3224
3225 /*
3226 * Dump the visible layer list
3227 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003228 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003229 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003230 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003231 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003232 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003233 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003234
3235 /*
3236 * Dump Display state
3237 */
3238
3239 colorizer.bold(result);
3240 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3241 colorizer.reset(result);
3242 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3243 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3244 hw->dump(result);
3245 }
3246
3247 /*
3248 * Dump SurfaceFlinger global state
3249 */
3250
3251 colorizer.bold(result);
3252 result.append("SurfaceFlinger global state:\n");
3253 colorizer.reset(result);
3254
3255 HWComposer& hwc(getHwComposer());
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003256 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003257
3258 colorizer.bold(result);
3259 result.appendFormat("EGL implementation : %s\n",
3260 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3261 colorizer.reset(result);
3262 result.appendFormat("%s\n",
3263 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3264
3265 mRenderEngine->dump(result);
3266
3267 hw->undefinedRegion.dump(result, "undefinedRegion");
3268 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3269 hw->getOrientation(), hw->isDisplayOn());
3270 result.appendFormat(
3271 " last eglSwapBuffers() time: %f us\n"
3272 " last transaction time : %f us\n"
3273 " transaction-flags : %08x\n"
3274 " refresh-rate : %f fps\n"
3275 " x-dpi : %f\n"
3276 " y-dpi : %f\n"
3277 " gpu_to_cpu_unsupported : %d\n"
3278 ,
3279 mLastSwapBufferTime/1000.0,
3280 mLastTransactionTime/1000.0,
3281 mTransactionFlags,
3282 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3283 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3284 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3285 !mGpuToCpuSupported);
3286
3287 result.appendFormat(" eglSwapBuffers time: %f us\n",
3288 inSwapBuffersDuration/1000.0);
3289
3290 result.appendFormat(" transaction time: %f us\n",
3291 inTransactionDuration/1000.0);
3292
3293 /*
3294 * VSYNC state
3295 */
3296 mEventThread->dump(result);
3297
3298 /*
3299 * Dump HWComposer state
3300 */
3301 colorizer.bold(result);
3302 result.append("h/w composer state:\n");
3303 colorizer.reset(result);
3304 result.appendFormat(" h/w composer %s and %s\n",
3305 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3306 (mDebugDisableHWC || mDebugRegion || mDaltonize
3307 || mHasColorMatrix) ? "disabled" : "enabled");
3308 hwc.dump(result);
3309
3310 /*
3311 * Dump gralloc state
3312 */
3313 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3314 alloc.dump(result);
3315}
3316
3317const Vector< sp<Layer> >&
3318SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3319 // Note: mStateLock is held here
3320 wp<IBinder> dpy;
3321 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3322 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3323 dpy = mDisplays.keyAt(i);
3324 break;
3325 }
3326 }
3327 if (dpy == NULL) {
3328 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3329 // Just use the primary display so we have something to return
3330 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3331 }
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003332 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003333}
3334
3335bool SurfaceFlinger::startDdmConnection()
3336{
3337 void* libddmconnection_dso =
3338 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3339 if (!libddmconnection_dso) {
3340 return false;
3341 }
3342 void (*DdmConnection_start)(const char* name);
3343 DdmConnection_start =
3344 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3345 if (!DdmConnection_start) {
3346 dlclose(libddmconnection_dso);
3347 return false;
3348 }
3349 (*DdmConnection_start)(getServiceName());
3350 return true;
3351}
3352
3353status_t SurfaceFlinger::onTransact(
3354 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3355{
3356 switch (code) {
3357 case CREATE_CONNECTION:
3358 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003359 case BOOT_FINISHED:
3360 case CLEAR_ANIMATION_FRAME_STATS:
3361 case GET_ANIMATION_FRAME_STATS:
3362 case SET_POWER_MODE:
3363 case GET_HDR_CAPABILITIES:
3364 {
3365 // codes that require permission check
3366 IPCThreadState* ipc = IPCThreadState::self();
3367 const int pid = ipc->getCallingPid();
3368 const int uid = ipc->getCallingUid();
3369 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3370 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3371 ALOGE("Permission Denial: "
3372 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3373 return PERMISSION_DENIED;
3374 }
3375 break;
3376 }
Robert Carr1db73f62016-12-21 12:58:51 -08003377 /*
3378 * Calling setTransactionState is safe, because you need to have been
3379 * granted a reference to Client* and Handle* to do anything with it.
3380 *
3381 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3382 */
3383 case SET_TRANSACTION_STATE:
3384 case CREATE_SCOPED_CONNECTION:
3385 {
3386 break;
3387 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003388 case CAPTURE_SCREEN:
3389 {
3390 // codes that require permission check
3391 IPCThreadState* ipc = IPCThreadState::self();
3392 const int pid = ipc->getCallingPid();
3393 const int uid = ipc->getCallingUid();
3394 if ((uid != AID_GRAPHICS) &&
3395 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3396 ALOGE("Permission Denial: "
3397 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3398 return PERMISSION_DENIED;
3399 }
3400 break;
3401 }
3402 }
3403
3404 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3405 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3406 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3407 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3408 IPCThreadState* ipc = IPCThreadState::self();
3409 const int pid = ipc->getCallingPid();
3410 const int uid = ipc->getCallingUid();
3411 ALOGE("Permission Denial: "
3412 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3413 return PERMISSION_DENIED;
3414 }
3415 int n;
3416 switch (code) {
3417 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3418 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3419 return NO_ERROR;
3420 case 1002: // SHOW_UPDATES
3421 n = data.readInt32();
3422 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3423 invalidateHwcGeometry();
3424 repaintEverything();
3425 return NO_ERROR;
3426 case 1004:{ // repaint everything
3427 repaintEverything();
3428 return NO_ERROR;
3429 }
3430 case 1005:{ // force transaction
3431 setTransactionFlags(
3432 eTransactionNeeded|
3433 eDisplayTransactionNeeded|
3434 eTraversalNeeded);
3435 return NO_ERROR;
3436 }
3437 case 1006:{ // send empty update
3438 signalRefresh();
3439 return NO_ERROR;
3440 }
3441 case 1008: // toggle use of hw composer
3442 n = data.readInt32();
3443 mDebugDisableHWC = n ? 1 : 0;
3444 invalidateHwcGeometry();
3445 repaintEverything();
3446 return NO_ERROR;
3447 case 1009: // toggle use of transform hint
3448 n = data.readInt32();
3449 mDebugDisableTransformHint = n ? 1 : 0;
3450 invalidateHwcGeometry();
3451 repaintEverything();
3452 return NO_ERROR;
3453 case 1010: // interrogate.
3454 reply->writeInt32(0);
3455 reply->writeInt32(0);
3456 reply->writeInt32(mDebugRegion);
3457 reply->writeInt32(0);
3458 reply->writeInt32(mDebugDisableHWC);
3459 return NO_ERROR;
3460 case 1013: {
3461 Mutex::Autolock _l(mStateLock);
3462 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3463 reply->writeInt32(hw->getPageFlipCount());
3464 return NO_ERROR;
3465 }
3466 case 1014: {
3467 // daltonize
3468 n = data.readInt32();
3469 switch (n % 10) {
3470 case 1:
3471 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3472 break;
3473 case 2:
3474 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3475 break;
3476 case 3:
3477 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3478 break;
3479 }
3480 if (n >= 10) {
3481 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3482 } else {
3483 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3484 }
3485 mDaltonize = n > 0;
3486 invalidateHwcGeometry();
3487 repaintEverything();
3488 return NO_ERROR;
3489 }
3490 case 1015: {
3491 // apply a color matrix
3492 n = data.readInt32();
3493 mHasColorMatrix = n ? 1 : 0;
3494 if (n) {
3495 // color matrix is sent as mat3 matrix followed by vec3
3496 // offset, then packed into a mat4 where the last row is
3497 // the offset and extra values are 0
3498 for (size_t i = 0 ; i < 4; i++) {
3499 for (size_t j = 0; j < 4; j++) {
3500 mColorMatrix[i][j] = data.readFloat();
3501 }
3502 }
3503 } else {
3504 mColorMatrix = mat4();
3505 }
3506 invalidateHwcGeometry();
3507 repaintEverything();
3508 return NO_ERROR;
3509 }
3510 // This is an experimental interface
3511 // Needs to be shifted to proper binder interface when we productize
3512 case 1016: {
3513 n = data.readInt32();
3514 mPrimaryDispSync.setRefreshSkipCount(n);
3515 return NO_ERROR;
3516 }
3517 case 1017: {
3518 n = data.readInt32();
3519 mForceFullDamage = static_cast<bool>(n);
3520 return NO_ERROR;
3521 }
3522 case 1018: { // Modify Choreographer's phase offset
3523 n = data.readInt32();
3524 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3525 return NO_ERROR;
3526 }
3527 case 1019: { // Modify SurfaceFlinger's phase offset
3528 n = data.readInt32();
3529 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3530 return NO_ERROR;
3531 }
3532 case 1020: { // Layer updates interceptor
3533 n = data.readInt32();
3534 if (n) {
3535 ALOGV("Interceptor enabled");
3536 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3537 }
3538 else{
3539 ALOGV("Interceptor disabled");
3540 mInterceptor.disable();
3541 }
3542 return NO_ERROR;
3543 }
3544 case 1021: { // Disable HWC virtual displays
3545 n = data.readInt32();
3546 mUseHwcVirtualDisplays = !n;
3547 return NO_ERROR;
3548 }
3549 }
3550 }
3551 return err;
3552}
3553
3554void SurfaceFlinger::repaintEverything() {
3555 android_atomic_or(1, &mRepaintEverything);
3556 signalTransaction();
3557}
3558
3559// ---------------------------------------------------------------------------
3560// Capture screen into an IGraphiBufferProducer
3561// ---------------------------------------------------------------------------
3562
3563/* The code below is here to handle b/8734824
3564 *
3565 * We create a IGraphicBufferProducer wrapper that forwards all calls
3566 * from the surfaceflinger thread to the calling binder thread, where they
3567 * are executed. This allows the calling thread in the calling process to be
3568 * reused and not depend on having "enough" binder threads to handle the
3569 * requests.
3570 */
3571class GraphicProducerWrapper : public BBinder, public MessageHandler {
3572 /* Parts of GraphicProducerWrapper are run on two different threads,
3573 * communicating by sending messages via Looper but also by shared member
3574 * data. Coherence maintenance is subtle and in places implicit (ugh).
3575 *
3576 * Don't rely on Looper's sendMessage/handleMessage providing
3577 * release/acquire semantics for any data not actually in the Message.
3578 * Data going from surfaceflinger to binder threads needs to be
3579 * synchronized explicitly.
3580 *
3581 * Barrier open/wait do provide release/acquire semantics. This provides
3582 * implicit synchronization for data coming back from binder to
3583 * surfaceflinger threads.
3584 */
3585
3586 sp<IGraphicBufferProducer> impl;
3587 sp<Looper> looper;
3588 status_t result;
3589 bool exitPending;
3590 bool exitRequested;
3591 Barrier barrier;
3592 uint32_t code;
3593 Parcel const* data;
3594 Parcel* reply;
3595
3596 enum {
3597 MSG_API_CALL,
3598 MSG_EXIT
3599 };
3600
3601 /*
3602 * Called on surfaceflinger thread. This is called by our "fake"
3603 * BpGraphicBufferProducer. We package the data and reply Parcel and
3604 * forward them to the binder thread.
3605 */
3606 virtual status_t transact(uint32_t code,
3607 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3608 this->code = code;
3609 this->data = &data;
3610 this->reply = reply;
3611 if (exitPending) {
3612 // if we've exited, we run the message synchronously right here.
3613 // note (JH): as far as I can tell from looking at the code, this
3614 // never actually happens. if it does, i'm not sure if it happens
3615 // on the surfaceflinger or binder thread.
3616 handleMessage(Message(MSG_API_CALL));
3617 } else {
3618 barrier.close();
3619 // Prevent stores to this->{code, data, reply} from being
3620 // reordered later than the construction of Message.
3621 atomic_thread_fence(memory_order_release);
3622 looper->sendMessage(this, Message(MSG_API_CALL));
3623 barrier.wait();
3624 }
3625 return result;
3626 }
3627
3628 /*
3629 * here we run on the binder thread. All we've got to do is
3630 * call the real BpGraphicBufferProducer.
3631 */
3632 virtual void handleMessage(const Message& message) {
3633 int what = message.what;
3634 // Prevent reads below from happening before the read from Message
3635 atomic_thread_fence(memory_order_acquire);
3636 if (what == MSG_API_CALL) {
3637 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3638 barrier.open();
3639 } else if (what == MSG_EXIT) {
3640 exitRequested = true;
3641 }
3642 }
3643
3644public:
3645 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3646 : impl(impl),
3647 looper(new Looper(true)),
3648 result(NO_ERROR),
3649 exitPending(false),
3650 exitRequested(false),
3651 code(0),
3652 data(NULL),
3653 reply(NULL)
3654 {}
3655
3656 // Binder thread
3657 status_t waitForResponse() {
3658 do {
3659 looper->pollOnce(-1);
3660 } while (!exitRequested);
3661 return result;
3662 }
3663
3664 // Client thread
3665 void exit(status_t result) {
3666 this->result = result;
3667 exitPending = true;
3668 // Ensure this->result is visible to the binder thread before it
3669 // handles the message.
3670 atomic_thread_fence(memory_order_release);
3671 looper->sendMessage(this, Message(MSG_EXIT));
3672 }
3673};
3674
3675
3676status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3677 const sp<IGraphicBufferProducer>& producer,
3678 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003679 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003680 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3681
3682 if (CC_UNLIKELY(display == 0))
3683 return BAD_VALUE;
3684
3685 if (CC_UNLIKELY(producer == 0))
3686 return BAD_VALUE;
3687
3688 // if we have secure windows on this display, never allow the screen capture
3689 // unless the producer interface is local (i.e.: we can take a screenshot for
3690 // ourselves).
3691 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3692
3693 // Convert to surfaceflinger's internal rotation type.
3694 Transform::orientation_flags rotationFlags;
3695 switch (rotation) {
3696 case ISurfaceComposer::eRotateNone:
3697 rotationFlags = Transform::ROT_0;
3698 break;
3699 case ISurfaceComposer::eRotate90:
3700 rotationFlags = Transform::ROT_90;
3701 break;
3702 case ISurfaceComposer::eRotate180:
3703 rotationFlags = Transform::ROT_180;
3704 break;
3705 case ISurfaceComposer::eRotate270:
3706 rotationFlags = Transform::ROT_270;
3707 break;
3708 default:
3709 rotationFlags = Transform::ROT_0;
3710 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3711 break;
3712 }
3713
3714 class MessageCaptureScreen : public MessageBase {
3715 SurfaceFlinger* flinger;
3716 sp<IBinder> display;
3717 sp<IGraphicBufferProducer> producer;
3718 Rect sourceCrop;
3719 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003720 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003721 bool useIdentityTransform;
3722 Transform::orientation_flags rotation;
3723 status_t result;
3724 bool isLocalScreenshot;
3725 public:
3726 MessageCaptureScreen(SurfaceFlinger* flinger,
3727 const sp<IBinder>& display,
3728 const sp<IGraphicBufferProducer>& producer,
3729 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003730 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003731 bool useIdentityTransform,
3732 Transform::orientation_flags rotation,
3733 bool isLocalScreenshot)
3734 : flinger(flinger), display(display), producer(producer),
3735 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3736 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3737 useIdentityTransform(useIdentityTransform),
3738 rotation(rotation), result(PERMISSION_DENIED),
3739 isLocalScreenshot(isLocalScreenshot)
3740 {
3741 }
3742 status_t getResult() const {
3743 return result;
3744 }
3745 virtual bool handler() {
3746 Mutex::Autolock _l(flinger->mStateLock);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003747 sp<const DisplayDevice> hw(flinger->getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003748 result = flinger->captureScreenImplLocked(hw, producer,
3749 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3750 useIdentityTransform, rotation, isLocalScreenshot);
3751 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3752 return true;
3753 }
3754 };
3755
3756 // this creates a "fake" BBinder which will serve as a "fake" remote
3757 // binder to receive the marshaled calls and forward them to the
3758 // real remote (a BpGraphicBufferProducer)
3759 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3760
3761 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3762 // which does the marshaling work forwards to our "fake remote" above.
3763 sp<MessageBase> msg = new MessageCaptureScreen(this,
3764 display, IGraphicBufferProducer::asInterface( wrapper ),
3765 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3766 useIdentityTransform, rotationFlags, isLocalScreenshot);
3767
3768 status_t res = postMessageAsync(msg);
3769 if (res == NO_ERROR) {
3770 res = wrapper->waitForResponse();
3771 }
3772 return res;
3773}
3774
3775
3776void SurfaceFlinger::renderScreenImplLocked(
3777 const sp<const DisplayDevice>& hw,
3778 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003779 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003780 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3781{
3782 ATRACE_CALL();
3783 RenderEngine& engine(getRenderEngine());
3784
3785 // get screen geometry
3786 const int32_t hw_w = hw->getWidth();
3787 const int32_t hw_h = hw->getHeight();
3788 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3789 static_cast<int32_t>(reqHeight) != hw_h;
3790
3791 // if a default or invalid sourceCrop is passed in, set reasonable values
3792 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3793 !sourceCrop.isValid()) {
3794 sourceCrop.setLeftTop(Point(0, 0));
3795 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3796 }
3797
3798 // ensure that sourceCrop is inside screen
3799 if (sourceCrop.left < 0) {
3800 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3801 }
3802 if (sourceCrop.right > hw_w) {
3803 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3804 }
3805 if (sourceCrop.top < 0) {
3806 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3807 }
3808 if (sourceCrop.bottom > hw_h) {
3809 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3810 }
3811
3812 // make sure to clear all GL error flags
3813 engine.checkErrors();
3814
3815 // set-up our viewport
3816 engine.setViewportAndProjection(
3817 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3818 engine.disableTexturing();
3819
3820 // redraw the screen entirely...
3821 engine.clearWithColor(0, 0, 0, 1);
3822
Robert Carr1f0a16a2016-10-24 16:27:39 -07003823 // We loop through the first level of layers without traversing,
3824 // as we need to interpret min/max layer Z in the top level Z space.
3825 for (const auto& layer : mDrawingState.layersSortedByZ) {
3826 if (layer->getLayerStack() != hw->getLayerStack()) {
3827 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003828 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003829 const Layer::State& state(layer->getDrawingState());
3830 if (state.z < minLayerZ || state.z > maxLayerZ) {
3831 continue;
3832 }
Dan Stoza412903f2017-04-27 13:42:17 -07003833 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003834 if (!layer->isVisible()) {
3835 return;
3836 }
3837 if (filtering) layer->setFiltering(true);
3838 layer->draw(hw, useIdentityTransform);
3839 if (filtering) layer->setFiltering(false);
3840 });
3841 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003842
3843 // compositionComplete is needed for older driver
3844 hw->compositionComplete();
3845 hw->setViewportAndProjection();
3846}
3847
3848
3849status_t SurfaceFlinger::captureScreenImplLocked(
3850 const sp<const DisplayDevice>& hw,
3851 const sp<IGraphicBufferProducer>& producer,
3852 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003853 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003854 bool useIdentityTransform, Transform::orientation_flags rotation,
3855 bool isLocalScreenshot)
3856{
3857 ATRACE_CALL();
3858
3859 // get screen geometry
3860 uint32_t hw_w = hw->getWidth();
3861 uint32_t hw_h = hw->getHeight();
3862
3863 if (rotation & Transform::ROT_90) {
3864 std::swap(hw_w, hw_h);
3865 }
3866
3867 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3868 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3869 reqWidth, reqHeight, hw_w, hw_h);
3870 return BAD_VALUE;
3871 }
3872
3873 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3874 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3875
3876 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003877 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003878 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003879 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3880 (state.z < minLayerZ || state.z > maxLayerZ)) {
3881 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003882 }
Dan Stoza412903f2017-04-27 13:42:17 -07003883 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003884 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3885 layer->isSecure());
3886 });
3887 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003888
3889 if (!isLocalScreenshot && secureLayerIsVisible) {
3890 ALOGW("FB is protected: PERMISSION_DENIED");
3891 return PERMISSION_DENIED;
3892 }
3893
3894 // create a surface (because we're a producer, and we need to
3895 // dequeue/queue a buffer)
3896 sp<Surface> sur = new Surface(producer, false);
3897 ANativeWindow* window = sur.get();
3898
3899 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3900 if (result == NO_ERROR) {
3901 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3902 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3903
3904 int err = 0;
3905 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3906 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3907 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3908 err |= native_window_set_usage(window, usage);
3909
3910 if (err == NO_ERROR) {
3911 ANativeWindowBuffer* buffer;
3912 /* TODO: Once we have the sync framework everywhere this can use
3913 * server-side waits on the fence that dequeueBuffer returns.
3914 */
3915 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3916 if (result == NO_ERROR) {
3917 int syncFd = -1;
3918 // create an EGLImage from the buffer so we can later
3919 // turn it into a texture
3920 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3921 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3922 if (image != EGL_NO_IMAGE_KHR) {
3923 // this binds the given EGLImage as a framebuffer for the
3924 // duration of this scope.
3925 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3926 if (imageBond.getStatus() == NO_ERROR) {
3927 // this will in fact render into our dequeued buffer
3928 // via an FBO, which means we didn't have to create
3929 // an EGLSurface and therefore we're not
3930 // dependent on the context's EGLConfig.
3931 renderScreenImplLocked(
3932 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3933 useIdentityTransform, rotation);
3934
3935 // Attempt to create a sync khr object that can produce a sync point. If that
3936 // isn't available, create a non-dupable sync object in the fallback path and
3937 // wait on it directly.
3938 EGLSyncKHR sync;
3939 if (!DEBUG_SCREENSHOTS) {
3940 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3941 // native fence fd will not be populated until flush() is done.
3942 getRenderEngine().flush();
3943 } else {
3944 sync = EGL_NO_SYNC_KHR;
3945 }
3946 if (sync != EGL_NO_SYNC_KHR) {
3947 // get the sync fd
3948 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3949 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3950 ALOGW("captureScreen: failed to dup sync khr object");
3951 syncFd = -1;
3952 }
3953 eglDestroySyncKHR(mEGLDisplay, sync);
3954 } else {
3955 // fallback path
3956 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3957 if (sync != EGL_NO_SYNC_KHR) {
3958 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3959 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3960 EGLint eglErr = eglGetError();
3961 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3962 ALOGW("captureScreen: fence wait timed out");
3963 } else {
3964 ALOGW_IF(eglErr != EGL_SUCCESS,
3965 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3966 }
3967 eglDestroySyncKHR(mEGLDisplay, sync);
3968 } else {
3969 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3970 }
3971 }
3972 if (DEBUG_SCREENSHOTS) {
3973 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3974 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3975 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3976 hw, minLayerZ, maxLayerZ);
3977 delete [] pixels;
3978 }
3979
3980 } else {
3981 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3982 result = INVALID_OPERATION;
3983 window->cancelBuffer(window, buffer, syncFd);
3984 buffer = NULL;
3985 }
3986 // destroy our image
3987 eglDestroyImageKHR(mEGLDisplay, image);
3988 } else {
3989 result = BAD_VALUE;
3990 }
3991 if (buffer) {
3992 // queueBuffer takes ownership of syncFd
3993 result = window->queueBuffer(window, buffer, syncFd);
3994 }
3995 }
3996 } else {
3997 result = BAD_VALUE;
3998 }
3999 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
4000 }
4001
4002 return result;
4003}
4004
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004005void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08004006 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004007 if (DEBUG_SCREENSHOTS) {
4008 for (size_t y=0 ; y<h ; y++) {
4009 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4010 for (size_t x=0 ; x<w ; x++) {
4011 if (p[x] != 0xFF000000) return;
4012 }
4013 }
4014 ALOGE("*** we just took a black screenshot ***\n"
4015 "requested minz=%d, maxz=%d, layerStack=%d",
4016 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08004017 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004018 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004019 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004020 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4021 state.z <= maxLayerZ) {
Dan Stoza412903f2017-04-27 13:42:17 -07004022 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07004023 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
4024 layer->isVisible() ? '+' : '-',
4025 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004026 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07004027 i++;
4028 });
4029 }
4030 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004031 }
4032}
4033
4034// ---------------------------------------------------------------------------
4035
Dan Stoza412903f2017-04-27 13:42:17 -07004036void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4037 layersSortedByZ.traverseInZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004038}
4039
Dan Stoza412903f2017-04-27 13:42:17 -07004040void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4041 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004042}
4043
4044}; // namespace android
4045
4046
4047#if defined(__gl_h_)
4048#error "don't include gl/gl.h in this file"
4049#endif
4050
4051#if defined(__gl2_h_)
4052#error "don't include gl2/gl2.h in this file"
4053#endif