blob: 71aa52dee687a41bd1b9646b7534a83c35e27e4b [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>
Kalle Raitaa099a242017-01-11 11:17:29 -080044#include <gui/LayerDebugInfo.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000045#include <gui/Surface.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000046
47#include <ui/GraphicBufferAllocator.h>
48#include <ui/HdrCapabilities.h>
49#include <ui/PixelFormat.h>
50#include <ui/UiConfig.h>
51
52#include <utils/misc.h>
53#include <utils/String8.h>
54#include <utils/String16.h>
55#include <utils/StopWatch.h>
56#include <utils/Timers.h>
57#include <utils/Trace.h>
58
59#include <private/android_filesystem_config.h>
60#include <private/gui/SyncFeatures.h>
61
62#include <set>
63
64#include "Client.h"
65#include "clz.h"
66#include "Colorizer.h"
67#include "DdmConnection.h"
68#include "DisplayDevice.h"
69#include "DispSync.h"
70#include "EventControlThread.h"
71#include "EventThread.h"
72#include "Layer.h"
Robert Carr1f0a16a2016-10-24 16:27:39 -070073#include "LayerVector.h"
Fabien Sanglard9d96de42016-10-11 00:15:18 +000074#include "LayerDim.h"
Robert Carr1db73f62016-12-21 12:58:51 -080075#include "MonitoredProducer.h"
Fabien Sanglard9d96de42016-10-11 00:15:18 +000076#include "SurfaceFlinger.h"
77
78#include "DisplayHardware/FramebufferSurface.h"
79#include "DisplayHardware/HWComposer.h"
80#include "DisplayHardware/VirtualDisplaySurface.h"
81
82#include "Effects/Daltonizer.h"
83
84#include "RenderEngine/RenderEngine.h"
85#include <cutils/compiler.h>
86
Fabien Sanglard0cc19382017-03-06 11:54:40 -080087#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
88#include <configstore/Utils.h>
89
Fabien Sanglard9d96de42016-10-11 00:15:18 +000090#define DISPLAY_COUNT 1
91
92/*
93 * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
94 * black pixels.
95 */
96#define DEBUG_SCREENSHOTS false
97
Jiyong Park00b15b82017-08-10 20:30:56 +090098extern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
Fabien Sanglard9d96de42016-10-11 00:15:18 +000099
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000100namespace android {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000101// ---------------------------------------------------------------------------
102
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800103using namespace android::hardware::configstore;
104using namespace android::hardware::configstore::V1_0;
105
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000106const String16 sHardwareTest("android.permission.HARDWARE_TEST");
107const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
108const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
109const String16 sDump("android.permission.DUMP");
110
111// ---------------------------------------------------------------------------
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800112int64_t SurfaceFlinger::vsyncPhaseOffsetNs;
113int64_t SurfaceFlinger::sfVsyncPhaseOffsetNs;
Fabien Sanglardc93afd52017-03-13 13:02:42 -0700114bool SurfaceFlinger::useContextPriority;
Fabien Sanglardc45a7d92017-03-14 13:24:22 -0700115int64_t SurfaceFlinger::dispSyncPresentTimeOffset;
Fabien Sanglarda34ed632017-03-14 11:43:52 -0700116bool SurfaceFlinger::useHwcForRgbToYuv;
Fabien Sanglardc8e387e2017-03-10 10:30:28 -0800117uint64_t SurfaceFlinger::maxVirtualDisplaySize;
Fabien Sanglardcbf153b2017-03-10 17:57:12 -0800118bool SurfaceFlinger::hasSyncFramework;
Fabien Sanglard1971b632017-03-10 14:50:03 -0800119int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000120
121SurfaceFlinger::SurfaceFlinger()
122 : BnSurfaceComposer(),
123 mTransactionFlags(0),
124 mTransactionPending(false),
125 mAnimTransactionPending(false),
126 mLayersRemoved(false),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700127 mLayersAdded(false),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000128 mRepaintEverything(0),
129 mRenderEngine(NULL),
130 mBootTime(systemTime()),
131 mVisibleRegionsDirty(false),
132 mHwWorkListDirty(false),
133 mAnimCompositionPending(false),
134 mDebugRegion(0),
135 mDebugDDMS(0),
136 mDebugDisableHWC(0),
137 mDebugDisableTransformHint(0),
138 mDebugInSwapBuffers(0),
139 mLastSwapBufferTime(0),
140 mDebugInTransaction(0),
141 mLastTransactionTime(0),
142 mBootFinished(false),
143 mForceFullDamage(false),
Robert Carr0d480722017-01-10 16:42:54 -0800144 mInterceptor(this),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000145 mPrimaryDispSync("PrimaryDispSync"),
146 mPrimaryHWVsyncEnabled(false),
147 mHWVsyncAvailable(false),
148 mDaltonize(false),
149 mHasColorMatrix(false),
150 mHasPoweredOff(false),
151 mFrameBuckets(),
152 mTotalTime(0),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700153 mLastSwapTime(0),
154 mNumLayers(0)
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000155{
Fabien Sanglardc8e387e2017-03-10 10:30:28 -0800156 ALOGI("SurfaceFlinger is starting");
157
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800158 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
159 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
160
161 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
162 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
163
Fabien Sanglardc8e387e2017-03-10 10:30:28 -0800164 maxVirtualDisplaySize = getUInt64<ISurfaceFlingerConfigs,
165 &ISurfaceFlingerConfigs::maxVirtualDisplaySize>(0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000166
Fabien Sanglardcbf153b2017-03-10 17:57:12 -0800167 hasSyncFramework = getBool< ISurfaceFlingerConfigs,
168 &ISurfaceFlingerConfigs::hasSyncFramework>(true);
169
Fabien Sanglardc93afd52017-03-13 13:02:42 -0700170 useContextPriority = getBool< ISurfaceFlingerConfigs,
171 &ISurfaceFlingerConfigs::useContextPriority>(false);
172
Fabien Sanglardc45a7d92017-03-14 13:24:22 -0700173 dispSyncPresentTimeOffset = getInt64< ISurfaceFlingerConfigs,
174 &ISurfaceFlingerConfigs::presentTimeOffsetFromVSyncNs>(0);
175
Fabien Sanglarda34ed632017-03-14 11:43:52 -0700176 useHwcForRgbToYuv = getBool< ISurfaceFlingerConfigs,
177 &ISurfaceFlingerConfigs::useHwcForRGBtoYUV>(false);
178
Fabien Sanglard1971b632017-03-10 14:50:03 -0800179 maxFrameBufferAcquiredBuffers = getInt64< ISurfaceFlingerConfigs,
180 &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2);
181
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000182 char value[PROPERTY_VALUE_MAX];
183
184 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
185 mGpuToCpuSupported = !atoi(value);
186
187 property_get("debug.sf.showupdates", value, "0");
188 mDebugRegion = atoi(value);
189
190 property_get("debug.sf.ddms", value, "0");
191 mDebugDDMS = atoi(value);
192 if (mDebugDDMS) {
193 if (!startDdmConnection()) {
194 // start failed, and DDMS debugging not enabled
195 mDebugDDMS = 0;
196 }
197 }
198 ALOGI_IF(mDebugRegion, "showupdates enabled");
199 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
200
Fabien Sanglard642b23d2017-02-09 12:29:39 -0800201 property_get("debug.sf.enable_hwc_vds", value, "0");
202 mUseHwcVirtualDisplays = atoi(value);
203 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800204
Fabien Sanglardc65dafa2017-02-07 14:06:39 -0800205 property_get("ro.sf.disable_triple_buffer", value, "1");
206 mLayerTripleBufferingDisabled = atoi(value);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800207 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000208}
209
210void SurfaceFlinger::onFirstRef()
211{
212 mEventQueue.init(this);
213}
214
215SurfaceFlinger::~SurfaceFlinger()
216{
217 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
218 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
219 eglTerminate(display);
220}
221
222void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
223{
224 // the window manager died on us. prepare its eulogy.
225
226 // restore initial conditions (default device unblank, etc)
227 initializeDisplays();
228
229 // restart the boot-animation
230 startBootAnim();
231}
232
Robert Carr1db73f62016-12-21 12:58:51 -0800233static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000234 status_t err = client->initCheck();
235 if (err == NO_ERROR) {
Robert Carr1db73f62016-12-21 12:58:51 -0800236 return client;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000237 }
Robert Carr1db73f62016-12-21 12:58:51 -0800238 return nullptr;
239}
240
241sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
242 return initClient(new Client(this));
243}
244
245sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
246 const sp<IGraphicBufferProducer>& gbp) {
247 if (authenticateSurfaceTexture(gbp) == false) {
248 return nullptr;
249 }
250 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
251 if (layer == nullptr) {
252 return nullptr;
253 }
254
255 return initClient(new Client(this, layer));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000256}
257
258sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
259 bool secure)
260{
261 class DisplayToken : public BBinder {
262 sp<SurfaceFlinger> flinger;
263 virtual ~DisplayToken() {
264 // no more references, this display must be terminated
265 Mutex::Autolock _l(flinger->mStateLock);
266 flinger->mCurrentState.displays.removeItem(this);
267 flinger->setTransactionFlags(eDisplayTransactionNeeded);
268 }
269 public:
270 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
271 : flinger(flinger) {
272 }
273 };
274
275 sp<BBinder> token = new DisplayToken(this);
276
277 Mutex::Autolock _l(mStateLock);
278 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
279 info.displayName = displayName;
280 mCurrentState.displays.add(token, info);
281 mInterceptor.saveDisplayCreation(info);
282 return token;
283}
284
285void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
286 Mutex::Autolock _l(mStateLock);
287
288 ssize_t idx = mCurrentState.displays.indexOfKey(display);
289 if (idx < 0) {
290 ALOGW("destroyDisplay: invalid display token");
291 return;
292 }
293
294 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
295 if (!info.isVirtualDisplay()) {
296 ALOGE("destroyDisplay called for non-virtual display");
297 return;
298 }
299 mInterceptor.saveDisplayDeletion(info.displayId);
300 mCurrentState.displays.removeItemsAt(idx);
301 setTransactionFlags(eDisplayTransactionNeeded);
302}
303
304void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
305 ALOGW_IF(mBuiltinDisplays[type],
306 "Overwriting display token for display type %d", type);
307 mBuiltinDisplays[type] = new BBinder();
308 // All non-virtual displays are currently considered secure.
309 DisplayDeviceState info(type, true);
310 mCurrentState.displays.add(mBuiltinDisplays[type], info);
311 mInterceptor.saveDisplayCreation(info);
312}
313
314sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
315 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
316 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
317 return NULL;
318 }
319 return mBuiltinDisplays[id];
320}
321
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000322void SurfaceFlinger::bootFinished()
323{
Wei Wangf9b05ee2017-07-19 20:59:39 -0700324 if (mStartPropertySetThread->join() != NO_ERROR) {
325 ALOGE("Join StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800326 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000327 const nsecs_t now = systemTime();
328 const nsecs_t duration = now - mBootTime;
329 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
330 mBootFinished = true;
331
332 // wait patiently for the window manager death
333 const String16 name("window");
334 sp<IBinder> window(defaultServiceManager()->getService(name));
335 if (window != 0) {
336 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
337 }
338
339 // stop boot animation
340 // formerly we would just kill the process, but we now ask it to exit so it
341 // can choose where to stop the animation.
342 property_set("service.bootanim.exit", "1");
343
344 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
345 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
346 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
347}
348
349void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
350 class MessageDestroyGLTexture : public MessageBase {
351 RenderEngine& engine;
352 uint32_t texture;
353 public:
354 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
355 : engine(engine), texture(texture) {
356 }
357 virtual bool handler() {
358 engine.deleteTextures(1, &texture);
359 return true;
360 }
361 };
362 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
363}
364
365class DispSyncSource : public VSyncSource, private DispSync::Callback {
366public:
367 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
368 const char* name) :
369 mName(name),
370 mValue(0),
371 mTraceVsync(traceVsync),
372 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
373 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
374 mDispSync(dispSync),
375 mCallbackMutex(),
376 mCallback(),
377 mVsyncMutex(),
378 mPhaseOffset(phaseOffset),
379 mEnabled(false) {}
380
381 virtual ~DispSyncSource() {}
382
383 virtual void setVSyncEnabled(bool enable) {
384 Mutex::Autolock lock(mVsyncMutex);
385 if (enable) {
386 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
387 static_cast<DispSync::Callback*>(this));
388 if (err != NO_ERROR) {
389 ALOGE("error registering vsync callback: %s (%d)",
390 strerror(-err), err);
391 }
392 //ATRACE_INT(mVsyncOnLabel.string(), 1);
393 } else {
394 status_t err = mDispSync->removeEventListener(
395 static_cast<DispSync::Callback*>(this));
396 if (err != NO_ERROR) {
397 ALOGE("error unregistering vsync callback: %s (%d)",
398 strerror(-err), err);
399 }
400 //ATRACE_INT(mVsyncOnLabel.string(), 0);
401 }
402 mEnabled = enable;
403 }
404
405 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
406 Mutex::Autolock lock(mCallbackMutex);
407 mCallback = callback;
408 }
409
410 virtual void setPhaseOffset(nsecs_t phaseOffset) {
411 Mutex::Autolock lock(mVsyncMutex);
412
413 // Normalize phaseOffset to [0, period)
414 auto period = mDispSync->getPeriod();
415 phaseOffset %= period;
416 if (phaseOffset < 0) {
417 // If we're here, then phaseOffset is in (-period, 0). After this
418 // operation, it will be in (0, period)
419 phaseOffset += period;
420 }
421 mPhaseOffset = phaseOffset;
422
423 // If we're not enabled, we don't need to mess with the listeners
424 if (!mEnabled) {
425 return;
426 }
427
428 // Remove the listener with the old offset
429 status_t err = mDispSync->removeEventListener(
430 static_cast<DispSync::Callback*>(this));
431 if (err != NO_ERROR) {
432 ALOGE("error unregistering vsync callback: %s (%d)",
433 strerror(-err), err);
434 }
435
436 // Add a listener with the new offset
437 err = mDispSync->addEventListener(mName, mPhaseOffset,
438 static_cast<DispSync::Callback*>(this));
439 if (err != NO_ERROR) {
440 ALOGE("error registering vsync callback: %s (%d)",
441 strerror(-err), err);
442 }
443 }
444
445private:
446 virtual void onDispSyncEvent(nsecs_t when) {
447 sp<VSyncSource::Callback> callback;
448 {
449 Mutex::Autolock lock(mCallbackMutex);
450 callback = mCallback;
451
452 if (mTraceVsync) {
453 mValue = (mValue + 1) % 2;
454 ATRACE_INT(mVsyncEventLabel.string(), mValue);
455 }
456 }
457
458 if (callback != NULL) {
459 callback->onVSyncEvent(when);
460 }
461 }
462
463 const char* const mName;
464
465 int mValue;
466
467 const bool mTraceVsync;
468 const String8 mVsyncOnLabel;
469 const String8 mVsyncEventLabel;
470
471 DispSync* mDispSync;
472
473 Mutex mCallbackMutex; // Protects the following
474 sp<VSyncSource::Callback> mCallback;
475
476 Mutex mVsyncMutex; // Protects the following
477 nsecs_t mPhaseOffset;
478 bool mEnabled;
479};
480
481class InjectVSyncSource : public VSyncSource {
482public:
483 InjectVSyncSource() {}
484
485 virtual ~InjectVSyncSource() {}
486
487 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
488 std::lock_guard<std::mutex> lock(mCallbackMutex);
489 mCallback = callback;
490 }
491
492 virtual void onInjectSyncEvent(nsecs_t when) {
493 std::lock_guard<std::mutex> lock(mCallbackMutex);
494 mCallback->onVSyncEvent(when);
495 }
496
497 virtual void setVSyncEnabled(bool) {}
498 virtual void setPhaseOffset(nsecs_t) {}
499
500private:
501 std::mutex mCallbackMutex; // Protects the following
502 sp<VSyncSource::Callback> mCallback;
503};
504
Wei Wangf9b05ee2017-07-19 20:59:39 -0700505// Do not call property_set on main thread which will be blocked by init
506// Use StartPropertySetThread instead.
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000507void SurfaceFlinger::init() {
508 ALOGI( "SurfaceFlinger's main thread ready to run. "
509 "Initializing graphics H/W...");
510
511 Mutex::Autolock _l(mStateLock);
512
513 // initialize EGL for the default display
514 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
515 eglInitialize(mEGLDisplay, NULL, NULL);
516
517 // start the EventThread
518 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
519 vsyncPhaseOffsetNs, true, "app");
520 mEventThread = new EventThread(vsyncSrc, *this, false);
521 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
522 sfVsyncPhaseOffsetNs, true, "sf");
523 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
524 mEventQueue.setEventThread(mSFEventThread);
525
Tim Murray22752852017-05-04 13:38:49 -0700526 // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000527 struct sched_param param = {0};
528 param.sched_priority = 2;
529 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
530 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
531 }
Tim Murray22752852017-05-04 13:38:49 -0700532 if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, &param) != 0) {
533 ALOGE("Couldn't set SCHED_FIFO for EventThread");
534 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000535
536 // Initialize the H/W composer object. There may or may not be an
537 // actual hardware composer underneath.
Steven Thomasb02664d2017-07-26 18:48:28 -0700538 mHwc.reset(new HWComposer(this,
539 *static_cast<HWComposer::EventHandler *>(this)));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000540
541 // get a RenderEngine for the given display / config (can't fail)
Kalle Raitabbdcf1f2017-05-22 15:47:46 -0700542 mRenderEngine = RenderEngine::create(mEGLDisplay,
543 mHwc->getVisualID(), 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000544
545 // retrieve the EGL context that was selected/created
546 mEGLContext = mRenderEngine->getEGLContext();
547
548 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
549 "couldn't create EGLContext");
550
551 // 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 Wangf9b05ee2017-07-19 20:59:39 -0700603 // Inform native graphics APIs that the present timestamp is NOT supported:
604 mStartPropertySetThread = new StartPropertySetThread(false);
605 if (mStartPropertySetThread->Start() != NO_ERROR) {
606 ALOGE("Run StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800607 }
608
609 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000610}
611
612int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
613 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
614 type : mHwc->allocateDisplayId();
615}
616
617void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800618 // Start boot animation service by setting a property mailbox
619 // if property setting thread is already running, Start() will be just a NOP
Wei Wangf9b05ee2017-07-19 20:59:39 -0700620 mStartPropertySetThread->Start();
Wei Wangb254fa32017-01-31 17:43:23 -0800621 // Wait until property was set
Wei Wangf9b05ee2017-07-19 20:59:39 -0700622 if (mStartPropertySetThread->join() != NO_ERROR) {
623 ALOGE("Join StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800624 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000625}
626
627size_t SurfaceFlinger::getMaxTextureSize() const {
628 return mRenderEngine->getMaxTextureSize();
629}
630
631size_t SurfaceFlinger::getMaxViewportDims() const {
632 return mRenderEngine->getMaxViewportDims();
633}
634
635// ----------------------------------------------------------------------------
636
637bool SurfaceFlinger::authenticateSurfaceTexture(
638 const sp<IGraphicBufferProducer>& bufferProducer) const {
639 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800640 return authenticateSurfaceTextureLocked(bufferProducer);
641}
642
643bool SurfaceFlinger::authenticateSurfaceTextureLocked(
644 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000645 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
646 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
647}
648
Brian Anderson6b376712017-04-04 10:51:39 -0700649status_t SurfaceFlinger::getSupportedFrameTimestamps(
650 std::vector<FrameEvent>* outSupported) const {
651 *outSupported = {
652 FrameEvent::REQUESTED_PRESENT,
653 FrameEvent::ACQUIRE,
654 FrameEvent::LATCH,
655 FrameEvent::FIRST_REFRESH_START,
656 FrameEvent::LAST_REFRESH_START,
657 FrameEvent::GPU_COMPOSITION_DONE,
658 FrameEvent::DEQUEUE_READY,
659 FrameEvent::RELEASE,
660 };
661 return NO_ERROR;
662}
663
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000664status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
665 Vector<DisplayInfo>* configs) {
666 if ((configs == NULL) || (display.get() == NULL)) {
667 return BAD_VALUE;
668 }
669
670 int32_t type = getDisplayType(display);
671 if (type < 0) return type;
672
673 // TODO: Not sure if display density should handled by SF any longer
674 class Density {
675 static int getDensityFromProperty(char const* propName) {
676 char property[PROPERTY_VALUE_MAX];
677 int density = 0;
678 if (property_get(propName, property, NULL) > 0) {
679 density = atoi(property);
680 }
681 return density;
682 }
683 public:
684 static int getEmuDensity() {
685 return getDensityFromProperty("qemu.sf.lcd_density"); }
686 static int getBuildDensity() {
687 return getDensityFromProperty("ro.sf.lcd_density"); }
688 };
689
690 configs->clear();
691
692 const Vector<HWComposer::DisplayConfig>& hwConfigs =
693 getHwComposer().getConfigs(type);
694 for (size_t c = 0; c < hwConfigs.size(); ++c) {
695 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
696 DisplayInfo info = DisplayInfo();
697
698 float xdpi = hwConfig.xdpi;
699 float ydpi = hwConfig.ydpi;
700
701 if (type == DisplayDevice::DISPLAY_PRIMARY) {
702 // The density of the device is provided by a build property
703 float density = Density::getBuildDensity() / 160.0f;
704 if (density == 0) {
705 // the build doesn't provide a density -- this is wrong!
706 // use xdpi instead
707 ALOGE("ro.sf.lcd_density must be defined as a build property");
708 density = xdpi / 160.0f;
709 }
710 if (Density::getEmuDensity()) {
711 // if "qemu.sf.lcd_density" is specified, it overrides everything
712 xdpi = ydpi = density = Density::getEmuDensity();
713 density /= 160.0f;
714 }
715 info.density = density;
716
717 // TODO: this needs to go away (currently needed only by webkit)
718 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
719 info.orientation = hw->getOrientation();
720 } else {
721 // TODO: where should this value come from?
722 static const int TV_DENSITY = 213;
723 info.density = TV_DENSITY / 160.0f;
724 info.orientation = 0;
725 }
726
727 info.w = hwConfig.width;
728 info.h = hwConfig.height;
729 info.xdpi = xdpi;
730 info.ydpi = ydpi;
731 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800732 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000733
734 // This is how far in advance a buffer must be queued for
735 // presentation at a given time. If you want a buffer to appear
736 // on the screen at time N, you must submit the buffer before
737 // (N - presentationDeadline).
738 //
739 // Normally it's one full refresh period (to give SF a chance to
740 // latch the buffer), but this can be reduced by configuring a
741 // DispSync offset. Any additional delays introduced by the hardware
742 // composer or panel must be accounted for here.
743 //
744 // We add an additional 1ms to allow for processing time and
745 // differences between the ideal and actual refresh rate.
746 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800747 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000748
749 // All non-virtual displays are currently considered secure.
750 info.secure = true;
751
752 configs->push_back(info);
753 }
754
755 return NO_ERROR;
756}
757
758status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
759 DisplayStatInfo* stats) {
760 if (stats == NULL) {
761 return BAD_VALUE;
762 }
763
764 // FIXME for now we always return stats for the primary display
765 memset(stats, 0, sizeof(*stats));
766 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
767 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
768 return NO_ERROR;
769}
770
771int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -0700772 sp<const DisplayDevice> device(getDisplayDevice(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000773 if (device != NULL) {
774 return device->getActiveConfig();
775 }
776 return BAD_VALUE;
777}
778
779void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
780 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
781 this);
782 int32_t type = hw->getDisplayType();
783 int currentMode = hw->getActiveConfig();
784
785 if (mode == currentMode) {
786 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
787 return;
788 }
789
790 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
791 ALOGW("Trying to set config for virtual display");
792 return;
793 }
794
795 hw->setActiveConfig(mode);
796 getHwComposer().setActiveConfig(type, mode);
797}
798
799status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
800 class MessageSetActiveConfig: public MessageBase {
801 SurfaceFlinger& mFlinger;
802 sp<IBinder> mDisplay;
803 int mMode;
804 public:
805 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
806 int mode) :
807 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
808 virtual bool handler() {
809 Vector<DisplayInfo> configs;
810 mFlinger.getDisplayConfigs(mDisplay, &configs);
811 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
812 ALOGE("Attempt to set active config = %d for display with %zu configs",
813 mMode, configs.size());
814 }
815 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
816 if (hw == NULL) {
817 ALOGE("Attempt to set active config = %d for null display %p",
818 mMode, mDisplay.get());
819 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
820 ALOGW("Attempt to set active config = %d for virtual display",
821 mMode);
822 } else {
823 mFlinger.setActiveConfigInternal(hw, mMode);
824 }
825 return true;
826 }
827 };
828 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
829 postMessageSync(msg);
830 return NO_ERROR;
831}
832
833status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
834 Vector<android_color_mode_t>* outColorModes) {
835 if (outColorModes == nullptr || display.get() == nullptr) {
836 return BAD_VALUE;
837 }
838
839 int32_t type = getDisplayType(display);
840 if (type < 0) return type;
841
842 std::set<android_color_mode_t> colorModes;
843 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
844 colorModes.insert(hwConfig.colorMode);
845 }
846
847 outColorModes->clear();
848 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
849
850 return NO_ERROR;
851}
852
853android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
854 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
855
856 int32_t type = getDisplayType(display);
857 if (type < 0) return static_cast<android_color_mode_t>(type);
858
859 return getHwComposer().getColorMode(type);
860}
861
862status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
863 android_color_mode_t colorMode) {
864 if (display.get() == nullptr || colorMode < 0) {
865 return BAD_VALUE;
866 }
867
868 int32_t type = getDisplayType(display);
869 if (type < 0) return type;
870 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
871 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
872 desiredConfig.colorMode = colorMode;
873 for (size_t c = 0; c < hwConfigs.size(); ++c) {
874 const HWComposer::DisplayConfig config = hwConfigs[c];
875 if (config == desiredConfig) {
876 return setActiveConfig(display, c);
877 }
878 }
879 return BAD_VALUE;
880}
881
882status_t SurfaceFlinger::clearAnimationFrameStats() {
883 Mutex::Autolock _l(mStateLock);
884 mAnimFrameTracker.clearStats();
885 return NO_ERROR;
886}
887
888status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
889 Mutex::Autolock _l(mStateLock);
890 mAnimFrameTracker.getStats(outStats);
891 return NO_ERROR;
892}
893
894status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
895 HdrCapabilities* outCapabilities) const {
896 // HWC1 does not provide HDR capabilities
897 *outCapabilities = HdrCapabilities();
898 return NO_ERROR;
899}
900
901status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
902 if (enable == mInjectVSyncs) {
903 return NO_ERROR;
904 }
905
906 if (enable) {
907 mInjectVSyncs = enable;
908 ALOGV("VSync Injections enabled");
909 if (mVSyncInjector.get() == nullptr) {
910 mVSyncInjector = new InjectVSyncSource();
911 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
912 }
913 mEventQueue.setEventThread(mInjectorEventThread);
914 } else {
915 mInjectVSyncs = enable;
916 ALOGV("VSync Injections disabled");
917 mEventQueue.setEventThread(mSFEventThread);
918 mVSyncInjector.clear();
919 }
920 return NO_ERROR;
921}
922
923status_t SurfaceFlinger::injectVSync(nsecs_t when) {
924 if (!mInjectVSyncs) {
925 ALOGE("VSync Injections not enabled");
926 return BAD_VALUE;
927 }
928 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
929 ALOGV("Injecting VSync inside SurfaceFlinger");
930 mVSyncInjector->onInjectSyncEvent(when);
931 }
932 return NO_ERROR;
933}
934
Kalle Raitaa099a242017-01-11 11:17:29 -0800935status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const {
936 IPCThreadState* ipc = IPCThreadState::self();
937 const int pid = ipc->getCallingPid();
938 const int uid = ipc->getCallingUid();
939 if ((uid != AID_SHELL) &&
940 !PermissionCache::checkPermission(sDump, pid, uid)) {
941 ALOGE("Layer debug info permission denied for pid=%d, uid=%d", pid, uid);
942 return PERMISSION_DENIED;
943 }
944
945 // Try to acquire a lock for 1s, fail gracefully
946 status_t err = mStateLock.timedLock(s2ns(1));
947 bool locked = (err == NO_ERROR);
948 if (!locked) {
949 ALOGE("LayerDebugInfo: SurfaceFlinger unresponsive (%s [%d]) - exit", strerror(-err), err);
950 return TIMED_OUT;
951 }
952
953 outLayers->clear();
954 mCurrentState.traverseInZOrder([&](Layer* layer) {
955 outLayers->push_back(layer->getLayerDebugInfo());
956 });
957
958 mStateLock.unlock();
959
960 return NO_ERROR;
961}
962
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000963// ----------------------------------------------------------------------------
964
Jorim Jaggiaaef0982017-06-08 23:55:29 -0700965sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
966 ISurfaceComposer::VsyncSource vsyncSource) {
967 if (vsyncSource == eVsyncSourceSurfaceFlinger) {
968 return mSFEventThread->createEventConnection();
969 } else {
970 return mEventThread->createEventConnection();
971 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000972}
973
974// ----------------------------------------------------------------------------
975
976void SurfaceFlinger::waitForEvent() {
977 mEventQueue.waitMessage();
978}
979
980void SurfaceFlinger::signalTransaction() {
981 mEventQueue.invalidate();
982}
983
984void SurfaceFlinger::signalLayerUpdate() {
985 mEventQueue.invalidate();
986}
987
988void SurfaceFlinger::signalRefresh() {
989 mEventQueue.refresh();
990}
991
992status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
993 nsecs_t reltime, uint32_t /* flags */) {
994 return mEventQueue.postMessage(msg, reltime);
995}
996
997status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
998 nsecs_t reltime, uint32_t /* flags */) {
999 status_t res = mEventQueue.postMessage(msg, reltime);
1000 if (res == NO_ERROR) {
1001 msg->wait();
1002 }
1003 return res;
1004}
1005
1006void SurfaceFlinger::run() {
1007 do {
1008 waitForEvent();
1009 } while (true);
1010}
1011
1012void SurfaceFlinger::enableHardwareVsync() {
1013 Mutex::Autolock _l(mHWVsyncLock);
1014 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
1015 mPrimaryDispSync.beginResync();
1016 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1017 mEventControlThread->setVsyncEnabled(true);
1018 mPrimaryHWVsyncEnabled = true;
1019 }
1020}
1021
1022void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
1023 Mutex::Autolock _l(mHWVsyncLock);
1024
1025 if (makeAvailable) {
1026 mHWVsyncAvailable = true;
1027 } else if (!mHWVsyncAvailable) {
1028 // Hardware vsync is not currently available, so abort the resync
1029 // attempt for now
1030 return;
1031 }
1032
1033 const nsecs_t period =
1034 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1035
1036 mPrimaryDispSync.reset();
1037 mPrimaryDispSync.setPeriod(period);
1038
1039 if (!mPrimaryHWVsyncEnabled) {
1040 mPrimaryDispSync.beginResync();
1041 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1042 mEventControlThread->setVsyncEnabled(true);
1043 mPrimaryHWVsyncEnabled = true;
1044 }
1045}
1046
1047void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1048 Mutex::Autolock _l(mHWVsyncLock);
1049 if (mPrimaryHWVsyncEnabled) {
1050 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1051 mEventControlThread->setVsyncEnabled(false);
1052 mPrimaryDispSync.endResync();
1053 mPrimaryHWVsyncEnabled = false;
1054 }
1055 if (makeUnavailable) {
1056 mHWVsyncAvailable = false;
1057 }
1058}
1059
1060void SurfaceFlinger::resyncWithRateLimit() {
1061 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1062 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1063 resyncToHardwareVsync(false);
1064 }
1065}
1066
Steven Thomas3cfac282017-02-06 12:29:30 -08001067void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1068 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001069 bool needsHwVsync = false;
1070
1071 { // Scope for the lock
1072 Mutex::Autolock _l(mHWVsyncLock);
1073 if (type == 0 && mPrimaryHWVsyncEnabled) {
1074 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1075 }
1076 }
1077
1078 if (needsHwVsync) {
1079 enableHardwareVsync();
1080 } else {
1081 disableHardwareVsync(false);
1082 }
1083}
1084
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001085void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
Brian Andersond0010582017-03-07 13:20:31 -08001086 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001087 *compositorTiming = mCompositorTiming;
1088}
1089
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001090void SurfaceFlinger::onHotplugReceived(HWComposer* /*composer*/, int type, bool connected) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001091 if (mEventThread == NULL) {
1092 // This is a temporary workaround for b/7145521. A non-null pointer
1093 // does not mean EventThread has finished initializing, so this
1094 // is not a correct fix.
1095 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1096 return;
1097 }
1098
1099 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1100 Mutex::Autolock _l(mStateLock);
1101 if (connected) {
1102 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1103 } else {
1104 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1105 mBuiltinDisplays[type].clear();
1106 }
1107 setTransactionFlags(eDisplayTransactionNeeded);
1108
1109 // Defer EventThread notification until SF has updated mDisplays.
1110 }
1111}
1112
Steven Thomas3cfac282017-02-06 12:29:30 -08001113void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1114 repaintEverything();
1115}
1116
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001117void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1118 ATRACE_CALL();
1119 getHwComposer().eventControl(disp, event, enabled);
1120}
1121
1122void SurfaceFlinger::onMessageReceived(int32_t what) {
1123 ATRACE_CALL();
1124 switch (what) {
1125 case MessageQueue::INVALIDATE: {
1126 bool refreshNeeded = handleMessageTransaction();
1127 refreshNeeded |= handleMessageInvalidate();
1128 refreshNeeded |= mRepaintEverything;
1129 if (refreshNeeded) {
1130 // Signal a refresh if a transaction modified the window state,
1131 // a new buffer was latched, or if HWC has requested a full
1132 // repaint
1133 signalRefresh();
1134 }
1135 break;
1136 }
1137 case MessageQueue::REFRESH: {
1138 handleMessageRefresh();
1139 break;
1140 }
1141 }
1142}
1143
1144bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001145 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001146 if (transactionFlags) {
1147 handleTransaction(transactionFlags);
1148 return true;
1149 }
1150 return false;
1151}
1152
1153bool SurfaceFlinger::handleMessageInvalidate() {
1154 ATRACE_CALL();
1155 return handlePageFlip();
1156}
1157
1158void SurfaceFlinger::handleMessageRefresh() {
1159 ATRACE_CALL();
1160
1161 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1162
Brian Andersond6927fb2016-07-23 23:37:30 -07001163 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001164 rebuildLayerStacks();
1165 setUpHWComposer();
1166 doDebugFlashRegions();
1167 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001168 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001169}
1170
1171void SurfaceFlinger::doDebugFlashRegions()
1172{
1173 // is debugging enabled
1174 if (CC_LIKELY(!mDebugRegion))
1175 return;
1176
1177 const bool repaintEverything = mRepaintEverything;
1178 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1179 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1180 if (hw->isDisplayOn()) {
1181 // transform the dirty region into this screen's coordinate space
1182 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1183 if (!dirtyRegion.isEmpty()) {
1184 // redraw the whole screen
1185 doComposeSurfaces(hw, Region(hw->bounds()));
1186
1187 // and draw the dirty region
1188 const int32_t height = hw->getHeight();
1189 RenderEngine& engine(getRenderEngine());
1190 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1191
1192 hw->compositionComplete();
1193 hw->swapBuffers(getHwComposer());
1194 }
1195 }
1196 }
1197
1198 postFramebuffer();
1199
1200 if (mDebugRegion > 1) {
1201 usleep(mDebugRegion * 1000);
1202 }
1203
1204 HWComposer& hwc(getHwComposer());
1205 if (hwc.initCheck() == NO_ERROR) {
1206 status_t err = hwc.prepare();
1207 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1208 }
1209}
1210
Brian Andersond6927fb2016-07-23 23:37:30 -07001211void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001212{
1213 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001214 mDrawingState.traverseInZOrder([&](Layer* layer) {
1215 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001216 needExtraInvalidate = true;
1217 }
Robert Carr2047fae2016-11-28 14:09:09 -08001218 });
1219
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001220 if (needExtraInvalidate) {
1221 signalLayerUpdate();
1222 }
1223}
1224
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001225void SurfaceFlinger::updateCompositorTiming(
1226 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1227 std::shared_ptr<FenceTime>& presentFenceTime) {
1228 // Update queue of past composite+present times and determine the
1229 // most recently known composite to present latency.
1230 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1231 nsecs_t compositeToPresentLatency = -1;
1232 while (!mCompositePresentTimes.empty()) {
1233 CompositePresentTime& cpt = mCompositePresentTimes.front();
1234 // Cached values should have been updated before calling this method,
1235 // which helps avoid duplicate syscalls.
1236 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1237 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1238 break;
1239 }
1240 compositeToPresentLatency = displayTime - cpt.composite;
1241 mCompositePresentTimes.pop();
1242 }
1243
1244 // Don't let mCompositePresentTimes grow unbounded, just in case.
1245 while (mCompositePresentTimes.size() > 16) {
1246 mCompositePresentTimes.pop();
1247 }
1248
Brian Andersond0010582017-03-07 13:20:31 -08001249 setCompositorTimingSnapped(
1250 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1251}
1252
1253void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1254 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001255 // Integer division and modulo round toward 0 not -inf, so we need to
1256 // treat negative and positive offsets differently.
Brian Andersond0010582017-03-07 13:20:31 -08001257 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001258 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1259 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1260
Brian Andersond0010582017-03-07 13:20:31 -08001261 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1262 if (idealLatency <= 0) {
1263 idealLatency = vsyncInterval;
1264 }
1265
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001266 // Snap the latency to a value that removes scheduling jitter from the
1267 // composition and present times, which often have >1ms of jitter.
1268 // Reducing jitter is important if an app attempts to extrapolate
1269 // something (such as user input) to an accurate diasplay time.
1270 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1271 // with (presentLatency % interval).
Brian Andersond0010582017-03-07 13:20:31 -08001272 nsecs_t bias = vsyncInterval / 2;
1273 int64_t extraVsyncs =
1274 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1275 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1276 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001277
Brian Andersond0010582017-03-07 13:20:31 -08001278 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001279 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1280 mCompositorTiming.interval = vsyncInterval;
Brian Andersond0010582017-03-07 13:20:31 -08001281 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001282}
1283
1284void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001285{
Brian Andersond6927fb2016-07-23 23:37:30 -07001286 const HWComposer& hwc = getHwComposer();
1287 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1288
Brian Andersonfbc80ae2017-05-26 16:23:54 -07001289 mGlCompositionDoneTimeline.updateSignalTimes();
Brian Anderson3d4039d2016-09-23 16:31:30 -07001290 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1291 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1292 glCompositionDoneFenceTime =
1293 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1294 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1295 } else {
1296 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1297 }
Brian Anderson3d4039d2016-09-23 16:31:30 -07001298
Brian Andersonfbc80ae2017-05-26 16:23:54 -07001299 mDisplayTimeline.updateSignalTimes();
Brian Anderson4e606e32017-03-16 15:34:57 -07001300 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1301 auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
Brian Anderson3d4039d2016-09-23 16:31:30 -07001302 mDisplayTimeline.push(retireFenceTime);
Brian Andersond6927fb2016-07-23 23:37:30 -07001303
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001304 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1305 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1306
1307 // We use the refreshStartTime which might be sampled a little later than
1308 // when we started doing work for this frame, but that should be okay
1309 // since updateCompositorTiming has snapping logic.
1310 updateCompositorTiming(
1311 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
Brian Andersond0010582017-03-07 13:20:31 -08001312 CompositorTiming compositorTiming;
1313 {
1314 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1315 compositorTiming = mCompositorTiming;
1316 }
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001317
Robert Carr2047fae2016-11-28 14:09:09 -08001318 mDrawingState.traverseInZOrder([&](Layer* layer) {
Brian Anderson4e606e32017-03-16 15:34:57 -07001319 // TODO(brianderson): The retire fence is incorrectly passed in as the
1320 // present fence. Fix this if this file lives on.
Robert Carr2047fae2016-11-28 14:09:09 -08001321 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson4e606e32017-03-16 15:34:57 -07001322 retireFenceTime, compositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001323 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001324 recordBufferingStats(layer->getName().string(),
1325 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001326 }
Robert Carr2047fae2016-11-28 14:09:09 -08001327 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001328
Brian Anderson4e606e32017-03-16 15:34:57 -07001329 if (retireFence->isValid()) {
Brian Andersonfbc80ae2017-05-26 16:23:54 -07001330 if (mPrimaryDispSync.addPresentFence(retireFenceTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001331 enableHardwareVsync();
1332 } else {
1333 disableHardwareVsync(false);
1334 }
1335 }
1336
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08001337 if (!hasSyncFramework) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001338 if (hw->isDisplayOn()) {
1339 enableHardwareVsync();
1340 }
1341 }
1342
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001343 if (mAnimCompositionPending) {
1344 mAnimCompositionPending = false;
1345
Brian Anderson3d4039d2016-09-23 16:31:30 -07001346 if (retireFenceTime->isValid()) {
1347 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001348 } else {
1349 // The HWC doesn't support present fences, so use the refresh
1350 // timestamp instead.
1351 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1352 mAnimFrameTracker.setActualPresentTime(presentTime);
1353 }
1354 mAnimFrameTracker.advanceFrame();
1355 }
1356
1357 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1358 return;
1359 }
1360
1361 nsecs_t currentTime = systemTime();
1362 if (mHasPoweredOff) {
1363 mHasPoweredOff = false;
1364 } else {
1365 nsecs_t period = mPrimaryDispSync.getPeriod();
1366 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1367 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1368 if (numPeriods < NUM_BUCKETS - 1) {
1369 mFrameBuckets[numPeriods] += elapsedTime;
1370 } else {
1371 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1372 }
1373 mTotalTime += elapsedTime;
1374 }
1375 mLastSwapTime = currentTime;
1376}
1377
1378void SurfaceFlinger::rebuildLayerStacks() {
1379 // rebuild the visible layer list per screen
1380 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1381 ATRACE_CALL();
1382 mVisibleRegionsDirty = false;
1383 invalidateHwcGeometry();
1384
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001385 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1386 Region opaqueRegion;
1387 Region dirtyRegion;
1388 Vector< sp<Layer> > layersSortedByZ;
1389 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1390 const Transform& tr(hw->getTransform());
1391 const Rect bounds(hw->getBounds());
1392 if (hw->isDisplayOn()) {
Chia-I Wuab0c3192017-08-01 11:29:00 -07001393 computeVisibleRegions(hw, dirtyRegion, opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001394
Robert Carr2047fae2016-11-28 14:09:09 -08001395 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001396 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001397 Region drawRegion(tr.transform(
1398 layer->visibleNonTransparentRegion));
1399 drawRegion.andSelf(bounds);
1400 if (!drawRegion.isEmpty()) {
1401 layersSortedByZ.add(layer);
1402 }
1403 }
Robert Carr2047fae2016-11-28 14:09:09 -08001404 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001405 }
1406 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1407 hw->undefinedRegion.set(bounds);
1408 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1409 hw->dirtyRegion.orSelf(dirtyRegion);
1410 }
1411 }
1412}
1413
1414void SurfaceFlinger::setUpHWComposer() {
1415 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1416 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1417 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1418 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1419
1420 // If nothing has changed (!dirty), don't recompose.
1421 // If something changed, but we don't currently have any visible layers,
1422 // and didn't when we last did a composition, then skip it this time.
1423 // The second rule does two things:
1424 // - When all layers are removed from a display, we'll emit one black
1425 // frame, then nothing more until we get new layers.
1426 // - When a display is created with a private layer stack, we won't
1427 // emit any black frames until a layer is added to the layer stack.
1428 bool mustRecompose = dirty && !(empty && wasEmpty);
1429
1430 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1431 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1432 mustRecompose ? "doing" : "skipping",
1433 dirty ? "+" : "-",
1434 empty ? "+" : "-",
1435 wasEmpty ? "+" : "-");
1436
1437 mDisplays[dpy]->beginFrame(mustRecompose);
1438
1439 if (mustRecompose) {
1440 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1441 }
1442 }
1443
1444 HWComposer& hwc(getHwComposer());
1445 if (hwc.initCheck() == NO_ERROR) {
1446 // build the h/w work list
1447 if (CC_UNLIKELY(mHwWorkListDirty)) {
1448 mHwWorkListDirty = false;
1449 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1450 sp<const DisplayDevice> hw(mDisplays[dpy]);
1451 const int32_t id = hw->getHwcDisplayId();
1452 if (id >= 0) {
1453 const Vector< sp<Layer> >& currentLayers(
1454 hw->getVisibleLayersSortedByZ());
1455 const size_t count = currentLayers.size();
1456 if (hwc.createWorkList(id, count) == NO_ERROR) {
1457 HWComposer::LayerListIterator cur = hwc.begin(id);
1458 const HWComposer::LayerListIterator end = hwc.end(id);
1459 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1460 const sp<Layer>& layer(currentLayers[i]);
1461 layer->setGeometry(hw, *cur);
1462 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1463 cur->setSkip(true);
1464 }
1465 }
1466 }
1467 }
1468 }
1469 }
1470
1471 // set the per-frame data
1472 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1473 sp<const DisplayDevice> hw(mDisplays[dpy]);
1474 const int32_t id = hw->getHwcDisplayId();
1475 if (id >= 0) {
1476 const Vector< sp<Layer> >& currentLayers(
1477 hw->getVisibleLayersSortedByZ());
1478 const size_t count = currentLayers.size();
1479 HWComposer::LayerListIterator cur = hwc.begin(id);
1480 const HWComposer::LayerListIterator end = hwc.end(id);
1481 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1482 /*
1483 * update the per-frame h/w composer data for each layer
1484 * and build the transparent region of the FB
1485 */
1486 const sp<Layer>& layer(currentLayers[i]);
1487 layer->setPerFrameData(hw, *cur);
1488 }
1489 }
1490 }
1491
1492 // If possible, attempt to use the cursor overlay on each display.
1493 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1494 sp<const DisplayDevice> hw(mDisplays[dpy]);
1495 const int32_t id = hw->getHwcDisplayId();
1496 if (id >= 0) {
1497 const Vector< sp<Layer> >& currentLayers(
1498 hw->getVisibleLayersSortedByZ());
1499 const size_t count = currentLayers.size();
1500 HWComposer::LayerListIterator cur = hwc.begin(id);
1501 const HWComposer::LayerListIterator end = hwc.end(id);
1502 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1503 const sp<Layer>& layer(currentLayers[i]);
1504 if (layer->isPotentialCursor()) {
1505 cur->setIsCursorLayerHint();
1506 break;
1507 }
1508 }
1509 }
1510 }
1511
1512 status_t err = hwc.prepare();
1513 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1514
1515 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1516 sp<const DisplayDevice> hw(mDisplays[dpy]);
1517 hw->prepareFrame(hwc);
1518 }
1519 }
1520}
1521
1522void SurfaceFlinger::doComposition() {
1523 ATRACE_CALL();
1524 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1525 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1526 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1527 if (hw->isDisplayOn()) {
1528 // transform the dirty region into this screen's coordinate space
1529 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1530
1531 // repaint the framebuffer (if needed)
1532 doDisplayComposition(hw, dirtyRegion);
1533
1534 hw->dirtyRegion.clear();
1535 hw->flip(hw->swapRegion);
1536 hw->swapRegion.clear();
1537 }
1538 // inform the h/w that we're done compositing
1539 hw->compositionComplete();
1540 }
1541 postFramebuffer();
1542}
1543
1544void SurfaceFlinger::postFramebuffer()
1545{
1546 ATRACE_CALL();
1547
1548 const nsecs_t now = systemTime();
1549 mDebugInSwapBuffers = now;
1550
1551 HWComposer& hwc(getHwComposer());
1552 if (hwc.initCheck() == NO_ERROR) {
1553 if (!hwc.supportsFramebufferTarget()) {
1554 // EGL spec says:
1555 // "surface must be bound to the calling thread's current context,
1556 // for the current rendering API."
1557 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1558 }
1559 hwc.commit();
1560 }
1561
1562 // make the default display current because the VirtualDisplayDevice code cannot
1563 // deal with dequeueBuffer() being called outside of the composition loop; however
1564 // the code below can call glFlush() which is allowed (and does in some case) call
1565 // dequeueBuffer().
1566 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1567
1568 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1569 sp<const DisplayDevice> hw(mDisplays[dpy]);
1570 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1571 hw->onSwapBuffersCompleted(hwc);
1572 const size_t count = currentLayers.size();
1573 int32_t id = hw->getHwcDisplayId();
1574 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1575 HWComposer::LayerListIterator cur = hwc.begin(id);
1576 const HWComposer::LayerListIterator end = hwc.end(id);
1577 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1578 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1579 }
1580 } else {
1581 for (size_t i = 0; i < count; i++) {
1582 currentLayers[i]->onLayerDisplayed(hw, NULL);
1583 }
1584 }
1585 }
1586
1587 mLastSwapBufferTime = systemTime() - now;
1588 mDebugInSwapBuffers = 0;
1589
1590 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1591 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1592 logFrameStats();
1593 }
1594}
1595
1596void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1597{
1598 ATRACE_CALL();
1599
1600 // here we keep a copy of the drawing state (that is the state that's
1601 // going to be overwritten by handleTransactionLocked()) outside of
1602 // mStateLock so that the side-effects of the State assignment
1603 // don't happen with mStateLock held (which can cause deadlocks).
1604 State drawingState(mDrawingState);
1605
1606 Mutex::Autolock _l(mStateLock);
1607 const nsecs_t now = systemTime();
1608 mDebugInTransaction = now;
1609
1610 // Here we're guaranteed that some transaction flags are set
1611 // so we can call handleTransactionLocked() unconditionally.
1612 // We call getTransactionFlags(), which will also clear the flags,
1613 // with mStateLock held to guarantee that mCurrentState won't change
1614 // until the transaction is committed.
1615
1616 transactionFlags = getTransactionFlags(eTransactionMask);
1617 handleTransactionLocked(transactionFlags);
1618
1619 mLastTransactionTime = systemTime() - now;
1620 mDebugInTransaction = 0;
1621 invalidateHwcGeometry();
1622 // here the transaction has been committed
1623}
1624
1625void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1626{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001627 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001628 mCurrentState.traverseInZOrder([](Layer* layer) {
1629 layer->notifyAvailableFrames();
1630 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001631
1632 /*
1633 * Traversal of the children
1634 * (perform the transaction for each of them if needed)
1635 */
1636
1637 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001638 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001639 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001640 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001641
1642 const uint32_t flags = layer->doTransaction(0);
1643 if (flags & Layer::eVisibleRegion)
1644 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001645 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001646 }
1647
1648 /*
1649 * Perform display own transactions if needed
1650 */
1651
1652 if (transactionFlags & eDisplayTransactionNeeded) {
1653 // here we take advantage of Vector's copy-on-write semantics to
1654 // improve performance by skipping the transaction entirely when
1655 // know that the lists are identical
1656 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1657 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1658 if (!curr.isIdenticalTo(draw)) {
1659 mVisibleRegionsDirty = true;
1660 const size_t cc = curr.size();
1661 size_t dc = draw.size();
1662
1663 // find the displays that were removed
1664 // (ie: in drawing state but not in current state)
1665 // also handle displays that changed
1666 // (ie: displays that are in both lists)
1667 for (size_t i=0 ; i<dc ; i++) {
1668 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1669 if (j < 0) {
1670 // in drawing state but not in current state
1671 if (!draw[i].isMainDisplay()) {
1672 // Call makeCurrent() on the primary display so we can
1673 // be sure that nothing associated with this display
1674 // is current.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001675 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001676 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001677 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001678 if (hw != NULL)
1679 hw->disconnect(getHwComposer());
1680 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1681 mEventThread->onHotplugReceived(draw[i].type, false);
1682 mDisplays.removeItem(draw.keyAt(i));
1683 } else {
1684 ALOGW("trying to remove the main display");
1685 }
1686 } else {
1687 // this display is in both lists. see if something changed.
1688 const DisplayDeviceState& state(curr[j]);
1689 const wp<IBinder>& display(curr.keyAt(j));
1690 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1691 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1692 if (state_binder != draw_binder) {
1693 // changing the surface is like destroying and
1694 // recreating the DisplayDevice, so we just remove it
1695 // from the drawing state, so that it get re-added
1696 // below.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001697 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001698 if (hw != NULL)
1699 hw->disconnect(getHwComposer());
1700 mDisplays.removeItem(display);
1701 mDrawingState.displays.removeItemsAt(i);
1702 dc--; i--;
1703 // at this point we must loop to the next item
1704 continue;
1705 }
1706
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001707 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001708 if (disp != NULL) {
1709 if (state.layerStack != draw[i].layerStack) {
1710 disp->setLayerStack(state.layerStack);
1711 }
1712 if ((state.orientation != draw[i].orientation)
1713 || (state.viewport != draw[i].viewport)
1714 || (state.frame != draw[i].frame))
1715 {
1716 disp->setProjection(state.orientation,
1717 state.viewport, state.frame);
1718 }
1719 if (state.width != draw[i].width || state.height != draw[i].height) {
1720 disp->setDisplaySize(state.width, state.height);
1721 }
1722 }
1723 }
1724 }
1725
1726 // find displays that were added
1727 // (ie: in current state but not in drawing state)
1728 for (size_t i=0 ; i<cc ; i++) {
1729 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1730 const DisplayDeviceState& state(curr[i]);
1731
1732 sp<DisplaySurface> dispSurface;
1733 sp<IGraphicBufferProducer> producer;
1734 sp<IGraphicBufferProducer> bqProducer;
1735 sp<IGraphicBufferConsumer> bqConsumer;
Mathias Agopian0556d792017-03-22 15:49:32 -07001736 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001737
1738 int32_t hwcDisplayId = -1;
1739 if (state.isVirtualDisplay()) {
1740 // Virtual displays without a surface are dormant:
1741 // they have external state (layer stack, projection,
1742 // etc.) but no internal state (i.e. a DisplayDevice).
1743 if (state.surface != NULL) {
1744
1745 int width = 0;
1746 int status = state.surface->query(
1747 NATIVE_WINDOW_WIDTH, &width);
1748 ALOGE_IF(status != NO_ERROR,
1749 "Unable to query width (%d)", status);
1750 int height = 0;
1751 status = state.surface->query(
1752 NATIVE_WINDOW_HEIGHT, &height);
1753 ALOGE_IF(status != NO_ERROR,
1754 "Unable to query height (%d)", status);
1755 if (mUseHwcVirtualDisplays &&
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08001756 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1757 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1758 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001759 hwcDisplayId = allocateHwcDisplayId(state.type);
1760 }
1761
1762 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1763 *mHwc, hwcDisplayId, state.surface,
1764 bqProducer, bqConsumer, state.displayName);
1765
1766 dispSurface = vds;
1767 producer = vds;
1768 }
1769 } else {
1770 ALOGE_IF(state.surface!=NULL,
1771 "adding a supported display, but rendering "
1772 "surface is provided (%p), ignoring it",
1773 state.surface.get());
1774 hwcDisplayId = allocateHwcDisplayId(state.type);
1775 // for supported (by hwc) displays we provide our
1776 // own rendering surface
1777 dispSurface = new FramebufferSurface(*mHwc, state.type,
1778 bqConsumer);
1779 producer = bqProducer;
1780 }
1781
1782 const wp<IBinder>& display(curr.keyAt(i));
1783 if (dispSurface != NULL) {
1784 sp<DisplayDevice> hw = new DisplayDevice(this,
1785 state.type, hwcDisplayId,
1786 mHwc->getFormat(hwcDisplayId), state.isSecure,
1787 display, dispSurface, producer,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -06001788 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001789 hw->setLayerStack(state.layerStack);
1790 hw->setProjection(state.orientation,
1791 state.viewport, state.frame);
1792 hw->setDisplayName(state.displayName);
1793 mDisplays.add(display, hw);
1794 if (state.isVirtualDisplay()) {
1795 if (hwcDisplayId >= 0) {
1796 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1797 hw->getWidth(), hw->getHeight(),
1798 hw->getFormat());
1799 }
1800 } else {
1801 mEventThread->onHotplugReceived(state.type, true);
1802 }
1803 }
1804 }
1805 }
1806 }
1807 }
1808
1809 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1810 // The transform hint might have changed for some layers
1811 // (either because a display has changed, or because a layer
1812 // as changed).
1813 //
1814 // Walk through all the layers in currentLayers,
1815 // and update their transform hint.
1816 //
1817 // If a layer is visible only on a single display, then that
1818 // display is used to calculate the hint, otherwise we use the
1819 // default display.
1820 //
1821 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1822 // the hint is set before we acquire a buffer from the surface texture.
1823 //
1824 // NOTE: layer transactions have taken place already, so we use their
1825 // drawing state. However, SurfaceFlinger's own transaction has not
1826 // happened yet, so we must use the current state layer list
1827 // (soon to become the drawing state list).
1828 //
1829 sp<const DisplayDevice> disp;
1830 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001831 bool first = true;
1832 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001833 // NOTE: we rely on the fact that layers are sorted by
1834 // layerStack first (so we don't have to traverse the list
1835 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001836 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001837 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001838 currentlayerStack = layerStack;
1839 // figure out if this layerstack is mirrored
1840 // (more than one display) if so, pick the default display,
1841 // if not, pick the only display it's on.
1842 disp.clear();
1843 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1844 sp<const DisplayDevice> hw(mDisplays[dpy]);
1845 if (hw->getLayerStack() == currentlayerStack) {
1846 if (disp == NULL) {
1847 disp = hw;
1848 } else {
1849 disp = NULL;
1850 break;
1851 }
1852 }
1853 }
1854 }
1855 if (disp == NULL) {
1856 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1857 // redraw after transform hint changes. See bug 8508397.
1858
1859 // could be null when this layer is using a layerStack
1860 // that is not visible on any display. Also can occur at
1861 // screen off/on times.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001862 disp = getDefaultDisplayDeviceLocked();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001863 }
1864 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001865
1866 first = false;
1867 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001868 }
1869
1870
1871 /*
1872 * Perform our own transaction if needed
1873 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001874
1875 if (mLayersAdded) {
1876 mLayersAdded = false;
1877 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001878 mVisibleRegionsDirty = true;
1879 }
1880
1881 // some layers might have been removed, so
1882 // we need to update the regions they're exposing.
1883 if (mLayersRemoved) {
1884 mLayersRemoved = false;
1885 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001886 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001887 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001888 // this layer is not visible anymore
1889 // TODO: we could traverse the tree from front to back and
1890 // compute the actual visible region
1891 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001892 Region visibleReg;
1893 visibleReg.set(layer->computeScreenBounds());
Chia-I Wuab0c3192017-08-01 11:29:00 -07001894 invalidateLayerStack(layer, visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001895 }
Robert Carr2047fae2016-11-28 14:09:09 -08001896 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001897 }
1898
1899 commitTransaction();
1900
1901 updateCursorAsync();
1902}
1903
1904void SurfaceFlinger::updateCursorAsync()
1905{
1906 HWComposer& hwc(getHwComposer());
1907 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1908 sp<const DisplayDevice> hw(mDisplays[dpy]);
1909 const int32_t id = hw->getHwcDisplayId();
1910 if (id < 0) {
1911 continue;
1912 }
1913 const Vector< sp<Layer> >& currentLayers(
1914 hw->getVisibleLayersSortedByZ());
1915 const size_t count = currentLayers.size();
1916 HWComposer::LayerListIterator cur = hwc.begin(id);
1917 const HWComposer::LayerListIterator end = hwc.end(id);
1918 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1919 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1920 continue;
1921 }
1922 const sp<Layer>& layer(currentLayers[i]);
1923 Rect cursorPos = layer->getPosition(hw);
1924 hwc.setCursorPositionAsync(id, cursorPos);
1925 break;
1926 }
1927 }
1928}
1929
1930void SurfaceFlinger::commitTransaction()
1931{
1932 if (!mLayersPendingRemoval.isEmpty()) {
1933 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001934 for (const auto& l : mLayersPendingRemoval) {
1935 recordBufferingStats(l->getName().string(),
1936 l->getOccupancyHistory(true));
1937 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001938 }
1939 mLayersPendingRemoval.clear();
1940 }
1941
1942 // If this transaction is part of a window animation then the next frame
1943 // we composite should be considered an animation as well.
1944 mAnimCompositionPending = mAnimTransactionPending;
1945
1946 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001947 mDrawingState.traverseInZOrder([](Layer* layer) {
1948 layer->commitChildList();
1949 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001950 mTransactionPending = false;
1951 mAnimTransactionPending = false;
1952 mTransactionCV.broadcast();
1953}
1954
Chia-I Wuab0c3192017-08-01 11:29:00 -07001955void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001956 Region& outDirtyRegion, Region& outOpaqueRegion)
1957{
1958 ATRACE_CALL();
1959
1960 Region aboveOpaqueLayers;
1961 Region aboveCoveredLayers;
1962 Region dirty;
1963
1964 outDirtyRegion.clear();
1965
Robert Carr2047fae2016-11-28 14:09:09 -08001966 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001967 // start with the whole surface at its current location
1968 const Layer::State& s(layer->getDrawingState());
1969
1970 // only consider the layers on the given layer stack
Chia-I Wuab0c3192017-08-01 11:29:00 -07001971 if (layer->getLayerStack() != displayDevice->getLayerStack())
Robert Carr2047fae2016-11-28 14:09:09 -08001972 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001973
1974 /*
1975 * opaqueRegion: area of a surface that is fully opaque.
1976 */
1977 Region opaqueRegion;
1978
1979 /*
1980 * visibleRegion: area of a surface that is visible on screen
1981 * and not fully transparent. This is essentially the layer's
1982 * footprint minus the opaque regions above it.
1983 * Areas covered by a translucent surface are considered visible.
1984 */
1985 Region visibleRegion;
1986
1987 /*
1988 * coveredRegion: area of a surface that is covered by all
1989 * visible regions above it (which includes the translucent areas).
1990 */
1991 Region coveredRegion;
1992
1993 /*
1994 * transparentRegion: area of a surface that is hinted to be completely
1995 * transparent. This is only used to tell when the layer has no visible
1996 * non-transparent regions and can be removed from the layer list. It
1997 * does not affect the visibleRegion of this layer or any layers
1998 * beneath it. The hint may not be correct if apps don't respect the
1999 * SurfaceView restrictions (which, sadly, some don't).
2000 */
2001 Region transparentRegion;
2002
2003
2004 // handle hidden surfaces by setting the visible region to empty
2005 if (CC_LIKELY(layer->isVisible())) {
2006 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002007 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002008 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002009 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002010 if (!visibleRegion.isEmpty()) {
2011 // Remove the transparent area from the visible region
2012 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002013 if (tr.preserveRects()) {
2014 // transform the transparent region
2015 transparentRegion = tr.transform(s.activeTransparentRegion);
2016 } else {
2017 // transformation too complex, can't do the
2018 // transparent region optimization.
2019 transparentRegion.clear();
2020 }
2021 }
2022
2023 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07002024 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002025 if (s.alpha==255 && !translucent &&
2026 ((layerOrientation & Transform::ROT_INVALID) == false)) {
2027 // the opaque region is the layer's footprint
2028 opaqueRegion = visibleRegion;
2029 }
2030 }
2031 }
2032
2033 // Clip the covered region to the visible region
2034 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2035
2036 // Update aboveCoveredLayers for next (lower) layer
2037 aboveCoveredLayers.orSelf(visibleRegion);
2038
2039 // subtract the opaque region covered by the layers above us
2040 visibleRegion.subtractSelf(aboveOpaqueLayers);
2041
2042 // compute this layer's dirty region
2043 if (layer->contentDirty) {
2044 // we need to invalidate the whole region
2045 dirty = visibleRegion;
2046 // as well, as the old visible region
2047 dirty.orSelf(layer->visibleRegion);
2048 layer->contentDirty = false;
2049 } else {
2050 /* compute the exposed region:
2051 * the exposed region consists of two components:
2052 * 1) what's VISIBLE now and was COVERED before
2053 * 2) what's EXPOSED now less what was EXPOSED before
2054 *
2055 * note that (1) is conservative, we start with the whole
2056 * visible region but only keep what used to be covered by
2057 * something -- which mean it may have been exposed.
2058 *
2059 * (2) handles areas that were not covered by anything but got
2060 * exposed because of a resize.
2061 */
2062 const Region newExposed = visibleRegion - coveredRegion;
2063 const Region oldVisibleRegion = layer->visibleRegion;
2064 const Region oldCoveredRegion = layer->coveredRegion;
2065 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2066 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2067 }
2068 dirty.subtractSelf(aboveOpaqueLayers);
2069
2070 // accumulate to the screen dirty region
2071 outDirtyRegion.orSelf(dirty);
2072
2073 // Update aboveOpaqueLayers for next (lower) layer
2074 aboveOpaqueLayers.orSelf(opaqueRegion);
2075
2076 // Store the visible region in screen space
2077 layer->setVisibleRegion(visibleRegion);
2078 layer->setCoveredRegion(coveredRegion);
2079 layer->setVisibleNonTransparentRegion(
2080 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002081 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002082
2083 outOpaqueRegion = aboveOpaqueLayers;
2084}
2085
Chia-I Wuab0c3192017-08-01 11:29:00 -07002086void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
2087 uint32_t layerStack = layer->getLayerStack();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002088 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2089 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2090 if (hw->getLayerStack() == layerStack) {
2091 hw->dirtyRegion.orSelf(dirty);
2092 }
2093 }
2094}
2095
2096bool SurfaceFlinger::handlePageFlip()
2097{
Brian Andersond6927fb2016-07-23 23:37:30 -07002098 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002099 Region dirtyRegion;
2100
2101 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002102 bool frameQueued = false;
2103
2104 // Store the set of layers that need updates. This set must not change as
2105 // buffers are being latched, as this could result in a deadlock.
2106 // Example: Two producers share the same command stream and:
2107 // 1.) Layer 0 is latched
2108 // 2.) Layer 0 gets a new frame
2109 // 2.) Layer 1 gets a new frame
2110 // 3.) Layer 1 is latched.
2111 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2112 // second frame. But layer 0's second frame could be waiting on display.
2113 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002114 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002115 if (layer->hasQueuedFrame()) {
2116 frameQueued = true;
2117 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002118 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002119 } else {
2120 layer->useEmptyDamage();
2121 }
2122 } else {
2123 layer->useEmptyDamage();
2124 }
Robert Carr2047fae2016-11-28 14:09:09 -08002125 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002126 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2127 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002128 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002129 layer->useSurfaceDamage();
Chia-I Wuab0c3192017-08-01 11:29:00 -07002130 invalidateLayerStack(layer, dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002131 }
2132
2133 mVisibleRegionsDirty |= visibleRegions;
2134
2135 // If we will need to wake up at some time in the future to deal with a
2136 // queued frame that shouldn't be displayed during this vsync period, wake
2137 // up during the next vsync period to check again.
2138 if (frameQueued && layersWithQueuedFrames.empty()) {
2139 signalLayerUpdate();
2140 }
2141
2142 // Only continue with the refresh if there is actually new work to do
2143 return !layersWithQueuedFrames.empty();
2144}
2145
2146void SurfaceFlinger::invalidateHwcGeometry()
2147{
2148 mHwWorkListDirty = true;
2149}
2150
2151
2152void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2153 const Region& inDirtyRegion)
2154{
2155 // We only need to actually compose the display if:
2156 // 1) It is being handled by hardware composer, which may need this to
2157 // keep its virtual display state machine in sync, or
2158 // 2) There is work to be done (the dirty region isn't empty)
2159 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2160 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2161 return;
2162 }
2163
2164 Region dirtyRegion(inDirtyRegion);
2165
2166 // compute the invalid region
2167 hw->swapRegion.orSelf(dirtyRegion);
2168
2169 uint32_t flags = hw->getFlags();
2170 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2171 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2172 // takes a rectangle, we must make sure to update that whole
2173 // rectangle in that case
2174 dirtyRegion.set(hw->swapRegion.bounds());
2175 } else {
2176 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2177 // We need to redraw the rectangle that will be updated
2178 // (pushed to the framebuffer).
2179 // This is needed because PARTIAL_UPDATES only takes one
2180 // rectangle instead of a region (see DisplayDevice::flip())
2181 dirtyRegion.set(hw->swapRegion.bounds());
2182 } else {
2183 // we need to redraw everything (the whole screen)
2184 dirtyRegion.set(hw->bounds());
2185 hw->swapRegion = dirtyRegion;
2186 }
2187 }
2188
2189 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2190 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2191 } else {
2192 RenderEngine& engine(getRenderEngine());
2193 mat4 colorMatrix = mColorMatrix;
2194 if (mDaltonize) {
2195 colorMatrix = colorMatrix * mDaltonizer();
2196 }
2197 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2198 doComposeSurfaces(hw, dirtyRegion);
2199 engine.setupColorTransform(oldMatrix);
2200 }
2201
2202 // update the swap region and clear the dirty region
2203 hw->swapRegion.orSelf(dirtyRegion);
2204
2205 // swap buffers (presentation)
2206 hw->swapBuffers(getHwComposer());
2207}
2208
2209bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2210{
2211 RenderEngine& engine(getRenderEngine());
2212 const int32_t id = hw->getHwcDisplayId();
2213 HWComposer& hwc(getHwComposer());
2214 HWComposer::LayerListIterator cur = hwc.begin(id);
2215 const HWComposer::LayerListIterator end = hwc.end(id);
2216
2217 bool hasGlesComposition = hwc.hasGlesComposition(id);
2218 if (hasGlesComposition) {
2219 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2220 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2221 hw->getDisplayName().string());
2222 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2223 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2224 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2225 }
2226 return false;
2227 }
2228
2229 // Never touch the framebuffer if we don't have any framebuffer layers
2230 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2231 if (hasHwcComposition) {
2232 // when using overlays, we assume a fully transparent framebuffer
2233 // NOTE: we could reduce how much we need to clear, for instance
2234 // remove where there are opaque FB layers. however, on some
2235 // GPUs doing a "clean slate" clear might be more efficient.
2236 // We'll revisit later if needed.
2237 engine.clearWithColor(0, 0, 0, 0);
2238 } else {
2239 // we start with the whole screen area
2240 const Region bounds(hw->getBounds());
2241
2242 // we remove the scissor part
2243 // we're left with the letterbox region
2244 // (common case is that letterbox ends-up being empty)
2245 const Region letterbox(bounds.subtract(hw->getScissor()));
2246
2247 // compute the area to clear
2248 Region region(hw->undefinedRegion.merge(letterbox));
2249
2250 // but limit it to the dirty region
2251 region.andSelf(dirty);
2252
2253 // screen is already cleared here
2254 if (!region.isEmpty()) {
2255 // can happen with SurfaceView
2256 drawWormhole(hw, region);
2257 }
2258 }
2259
2260 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2261 // just to be on the safe side, we don't set the
2262 // scissor on the main display. It should never be needed
2263 // anyways (though in theory it could since the API allows it).
2264 const Rect& bounds(hw->getBounds());
2265 const Rect& scissor(hw->getScissor());
2266 if (scissor != bounds) {
2267 // scissor doesn't match the screen's dimensions, so we
2268 // need to clear everything outside of it and enable
2269 // the GL scissor so we don't draw anything where we shouldn't
2270
2271 // enable scissor for this frame
2272 const uint32_t height = hw->getHeight();
2273 engine.setScissor(scissor.left, height - scissor.bottom,
2274 scissor.getWidth(), scissor.getHeight());
2275 }
2276 }
2277 }
2278
2279 /*
2280 * and then, render the layers targeted at the framebuffer
2281 */
2282
2283 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2284 const size_t count = layers.size();
2285 const Transform& tr = hw->getTransform();
2286 if (cur != end) {
2287 // we're using h/w composer
2288 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2289 const sp<Layer>& layer(layers[i]);
2290 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2291 if (!clip.isEmpty()) {
2292 switch (cur->getCompositionType()) {
2293 case HWC_CURSOR_OVERLAY:
2294 case HWC_OVERLAY: {
2295 const Layer::State& state(layer->getDrawingState());
2296 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2297 && i
2298 && layer->isOpaque(state) && (state.alpha == 0xFF)
2299 && hasGlesComposition) {
2300 // never clear the very first layer since we're
2301 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002302 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002303 }
2304 break;
2305 }
2306 case HWC_FRAMEBUFFER: {
2307 layer->draw(hw, clip);
2308 break;
2309 }
2310 case HWC_FRAMEBUFFER_TARGET: {
2311 // this should not happen as the iterator shouldn't
2312 // let us get there.
2313 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2314 break;
2315 }
2316 }
2317 }
2318 layer->setAcquireFence(hw, *cur);
2319 }
2320 } else {
2321 // we're not using h/w composer
2322 for (size_t i=0 ; i<count ; ++i) {
2323 const sp<Layer>& layer(layers[i]);
2324 const Region clip(dirty.intersect(
2325 tr.transform(layer->visibleRegion)));
2326 if (!clip.isEmpty()) {
2327 layer->draw(hw, clip);
2328 }
2329 }
2330 }
2331
2332 // disable scissor at the end of the frame
2333 engine.disableScissor();
2334 return true;
2335}
2336
2337void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2338 const int32_t height = hw->getHeight();
2339 RenderEngine& engine(getRenderEngine());
2340 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2341}
2342
2343status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2344 const sp<IBinder>& handle,
2345 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002346 const sp<Layer>& lbc,
2347 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002348{
2349 // add this layer to the current state list
2350 {
2351 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002352 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002353 return NO_MEMORY;
2354 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002355 if (parent == nullptr) {
2356 mCurrentState.layersSortedByZ.add(lbc);
2357 } else {
Chia-I Wufae51c42017-06-15 12:53:59 -07002358 if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) {
2359 ALOGE("addClientLayer called with a removed parent");
2360 return NAME_NOT_FOUND;
2361 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002362 parent->addChild(lbc);
2363 }
Chia-I Wufae51c42017-06-15 12:53:59 -07002364
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002365 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002366 mLayersAdded = true;
2367 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002368 }
2369
2370 // attach this layer to the client
2371 client->attachLayer(handle, lbc);
2372
2373 return NO_ERROR;
2374}
2375
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002376status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002377 Mutex::Autolock _l(mStateLock);
2378
Robert Carr1f0a16a2016-10-24 16:27:39 -07002379 const auto& p = layer->getParent();
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002380 ssize_t index;
2381 if (p != nullptr) {
2382 if (topLevelOnly) {
2383 return NO_ERROR;
2384 }
2385
Chia-I Wufae51c42017-06-15 12:53:59 -07002386 sp<Layer> ancestor = p;
2387 while (ancestor->getParent() != nullptr) {
2388 ancestor = ancestor->getParent();
2389 }
2390 if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
2391 ALOGE("removeLayer called with a layer whose parent has been removed");
2392 return NAME_NOT_FOUND;
2393 }
2394
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002395 index = p->removeChild(layer);
2396 } else {
2397 index = mCurrentState.layersSortedByZ.remove(layer);
2398 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002399
Robert Carr136e2f62017-02-08 17:54:29 -08002400 // As a matter of normal operation, the LayerCleaner will produce a second
2401 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2402 // so we will succeed in promoting it, but it's already been removed
2403 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2404 // otherwise something has gone wrong and we are leaking the layer.
2405 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002406 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2407 layer->getName().string(),
2408 (p != nullptr) ? p->getName().string() : "no-parent");
2409 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002410 } else if (index < 0) {
2411 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002412 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002413
Chia-I Wuc6657022017-08-15 11:18:17 -07002414 layer->onRemovedFromCurrentState();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002415 mLayersPendingRemoval.add(layer);
2416 mLayersRemoved = true;
Chia-I Wufae51c42017-06-15 12:53:59 -07002417 mNumLayers -= 1 + layer->getChildrenCount();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002418 setTransactionFlags(eTransactionNeeded);
2419 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002420}
2421
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002422uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002423 return android_atomic_release_load(&mTransactionFlags);
2424}
2425
2426uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2427 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2428}
2429
2430uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2431 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2432 if ((old & flags)==0) { // wake the server up
2433 signalTransaction();
2434 }
2435 return old;
2436}
2437
2438void SurfaceFlinger::setTransactionState(
2439 const Vector<ComposerState>& state,
2440 const Vector<DisplayState>& displays,
2441 uint32_t flags)
2442{
2443 ATRACE_CALL();
2444 Mutex::Autolock _l(mStateLock);
2445 uint32_t transactionFlags = 0;
2446
2447 if (flags & eAnimation) {
2448 // For window updates that are part of an animation we must wait for
2449 // previous animation "frames" to be handled.
2450 while (mAnimTransactionPending) {
2451 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2452 if (CC_UNLIKELY(err != NO_ERROR)) {
2453 // just in case something goes wrong in SF, return to the
2454 // caller after a few seconds.
2455 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2456 "waiting for previous animation frame");
2457 mAnimTransactionPending = false;
2458 break;
2459 }
2460 }
2461 }
2462
2463 size_t count = displays.size();
2464 for (size_t i=0 ; i<count ; i++) {
2465 const DisplayState& s(displays[i]);
2466 transactionFlags |= setDisplayStateLocked(s);
2467 }
2468
2469 count = state.size();
2470 for (size_t i=0 ; i<count ; i++) {
2471 const ComposerState& s(state[i]);
2472 // Here we need to check that the interface we're given is indeed
2473 // one of our own. A malicious client could give us a NULL
2474 // IInterface, or one of its own or even one of our own but a
2475 // different type. All these situations would cause us to crash.
2476 //
2477 // NOTE: it would be better to use RTTI as we could directly check
2478 // that we have a Client*. however, RTTI is disabled in Android.
2479 if (s.client != NULL) {
2480 sp<IBinder> binder = IInterface::asBinder(s.client);
2481 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002482 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002483 sp<Client> client( static_cast<Client *>(s.client.get()) );
2484 transactionFlags |= setClientStateLocked(client, s.state);
2485 }
2486 }
2487 }
2488 }
2489
2490 // If a synchronous transaction is explicitly requested without any changes,
2491 // force a transaction anyway. This can be used as a flush mechanism for
2492 // previous async transactions.
2493 if (transactionFlags == 0 && (flags & eSynchronous)) {
2494 transactionFlags = eTransactionNeeded;
2495 }
2496
2497 if (transactionFlags) {
2498 if (mInterceptor.isEnabled()) {
2499 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2500 }
2501
2502 // this triggers the transaction
2503 setTransactionFlags(transactionFlags);
2504
2505 // if this is a synchronous transaction, wait for it to take effect
2506 // before returning.
2507 if (flags & eSynchronous) {
2508 mTransactionPending = true;
2509 }
2510 if (flags & eAnimation) {
2511 mAnimTransactionPending = true;
2512 }
2513 while (mTransactionPending) {
2514 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2515 if (CC_UNLIKELY(err != NO_ERROR)) {
2516 // just in case something goes wrong in SF, return to the
2517 // called after a few seconds.
2518 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2519 mTransactionPending = false;
2520 break;
2521 }
2522 }
2523 }
2524}
2525
2526uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2527{
2528 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2529 if (dpyIdx < 0)
2530 return 0;
2531
2532 uint32_t flags = 0;
2533 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2534 if (disp.isValid()) {
2535 const uint32_t what = s.what;
2536 if (what & DisplayState::eSurfaceChanged) {
2537 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2538 disp.surface = s.surface;
2539 flags |= eDisplayTransactionNeeded;
2540 }
2541 }
2542 if (what & DisplayState::eLayerStackChanged) {
2543 if (disp.layerStack != s.layerStack) {
2544 disp.layerStack = s.layerStack;
2545 flags |= eDisplayTransactionNeeded;
2546 }
2547 }
2548 if (what & DisplayState::eDisplayProjectionChanged) {
2549 if (disp.orientation != s.orientation) {
2550 disp.orientation = s.orientation;
2551 flags |= eDisplayTransactionNeeded;
2552 }
2553 if (disp.frame != s.frame) {
2554 disp.frame = s.frame;
2555 flags |= eDisplayTransactionNeeded;
2556 }
2557 if (disp.viewport != s.viewport) {
2558 disp.viewport = s.viewport;
2559 flags |= eDisplayTransactionNeeded;
2560 }
2561 }
2562 if (what & DisplayState::eDisplaySizeChanged) {
2563 if (disp.width != s.width) {
2564 disp.width = s.width;
2565 flags |= eDisplayTransactionNeeded;
2566 }
2567 if (disp.height != s.height) {
2568 disp.height = s.height;
2569 flags |= eDisplayTransactionNeeded;
2570 }
2571 }
2572 }
2573 return flags;
2574}
2575
2576uint32_t SurfaceFlinger::setClientStateLocked(
2577 const sp<Client>& client,
2578 const layer_state_t& s)
2579{
2580 uint32_t flags = 0;
2581 sp<Layer> layer(client->getLayerUser(s.surface));
2582 if (layer != 0) {
2583 const uint32_t what = s.what;
2584 bool geometryAppliesWithResize =
2585 what & layer_state_t::eGeometryAppliesWithResize;
2586 if (what & layer_state_t::ePositionChanged) {
2587 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2588 flags |= eTraversalNeeded;
2589 }
2590 }
2591 if (what & layer_state_t::eLayerChanged) {
2592 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002593 const auto& p = layer->getParent();
2594 if (p == nullptr) {
2595 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2596 if (layer->setLayer(s.z) && idx >= 0) {
2597 mCurrentState.layersSortedByZ.removeAt(idx);
2598 mCurrentState.layersSortedByZ.add(layer);
2599 // we need traversal (state changed)
2600 // AND transaction (list changed)
2601 flags |= eTransactionNeeded|eTraversalNeeded;
2602 }
2603 } else {
2604 if (p->setChildLayer(layer, s.z)) {
2605 flags |= eTransactionNeeded|eTraversalNeeded;
2606 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002607 }
2608 }
chaviw64f7b422017-07-12 10:31:58 -07002609 if (what & layer_state_t::eRelativeLayerChanged) {
2610 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2611 if (layer->setRelativeLayer(s.relativeLayerHandle, s.z)) {
2612 mCurrentState.layersSortedByZ.removeAt(idx);
2613 mCurrentState.layersSortedByZ.add(layer);
2614 flags |= eTransactionNeeded|eTraversalNeeded;
2615 }
2616 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002617 if (what & layer_state_t::eSizeChanged) {
2618 if (layer->setSize(s.w, s.h)) {
2619 flags |= eTraversalNeeded;
2620 }
2621 }
2622 if (what & layer_state_t::eAlphaChanged) {
2623 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2624 flags |= eTraversalNeeded;
2625 }
2626 if (what & layer_state_t::eMatrixChanged) {
2627 if (layer->setMatrix(s.matrix))
2628 flags |= eTraversalNeeded;
2629 }
2630 if (what & layer_state_t::eTransparentRegionChanged) {
2631 if (layer->setTransparentRegionHint(s.transparentRegion))
2632 flags |= eTraversalNeeded;
2633 }
2634 if (what & layer_state_t::eFlagsChanged) {
2635 if (layer->setFlags(s.flags, s.mask))
2636 flags |= eTraversalNeeded;
2637 }
2638 if (what & layer_state_t::eCropChanged) {
2639 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2640 flags |= eTraversalNeeded;
2641 }
2642 if (what & layer_state_t::eFinalCropChanged) {
Robert Carr6fb9ca72017-03-22 18:23:23 -07002643 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002644 flags |= eTraversalNeeded;
2645 }
2646 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002647 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002648 // We only allow setting layer stacks for top level layers,
2649 // everything else inherits layer stack from its parent.
2650 if (layer->hasParent()) {
2651 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2652 layer->getName().string());
2653 } else if (idx < 0) {
2654 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2655 "that also does not appear in the top level layer list. Something"
2656 " has gone wrong.", layer->getName().string());
2657 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002658 mCurrentState.layersSortedByZ.removeAt(idx);
2659 mCurrentState.layersSortedByZ.add(layer);
2660 // we need traversal (state changed)
2661 // AND transaction (list changed)
2662 flags |= eTransactionNeeded|eTraversalNeeded;
2663 }
2664 }
2665 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002666 if (s.barrierHandle != nullptr) {
2667 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2668 } else if (s.barrierGbp != nullptr) {
2669 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2670 if (authenticateSurfaceTextureLocked(gbp)) {
2671 const auto& otherLayer =
2672 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2673 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2674 } else {
2675 ALOGE("Attempt to defer transaction to to an"
2676 " unrecognized GraphicBufferProducer");
2677 }
2678 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002679 // We don't trigger a traversal here because if no other state is
2680 // changed, we don't want this to cause any more work
2681 }
chaviw06178942017-07-27 10:25:59 -07002682 // Always re-parent the children that explicitly requested to get
2683 // re-parented before the general re-parent of all children.
2684 if (what & layer_state_t::eReparentChild) {
2685 if (layer->reparentChild(s.parentHandleForChild, s.childHandle)) {
2686 flags |= eTransactionNeeded|eTraversalNeeded;
2687 }
2688 }
Robert Carr1db73f62016-12-21 12:58:51 -08002689 if (what & layer_state_t::eReparentChildren) {
2690 if (layer->reparentChildren(s.reparentHandle)) {
2691 flags |= eTransactionNeeded|eTraversalNeeded;
2692 }
2693 }
Robert Carr9524cb32017-02-13 11:32:32 -08002694 if (what & layer_state_t::eDetachChildren) {
2695 layer->detachChildren();
2696 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002697 if (what & layer_state_t::eOverrideScalingModeChanged) {
2698 layer->setOverrideScalingMode(s.overrideScalingMode);
2699 // We don't trigger a traversal here because if no other state is
2700 // changed, we don't want this to cause any more work
2701 }
2702 }
2703 return flags;
2704}
2705
2706status_t SurfaceFlinger::createLayer(
2707 const String8& name,
2708 const sp<Client>& client,
2709 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002710 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2711 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002712{
2713 if (int32_t(w|h) < 0) {
2714 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2715 int(w), int(h));
2716 return BAD_VALUE;
2717 }
2718
2719 status_t result = NO_ERROR;
2720
2721 sp<Layer> layer;
2722
Cody Northropbc755282017-03-31 12:00:08 -06002723 String8 uniqueName = getUniqueLayerName(name);
2724
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002725 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2726 case ISurfaceComposerClient::eFXSurfaceNormal:
2727 result = createNormalLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002728 uniqueName, w, h, flags, format,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002729 handle, gbp, &layer);
2730 break;
2731 case ISurfaceComposerClient::eFXSurfaceDim:
2732 result = createDimLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002733 uniqueName, w, h, flags,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002734 handle, gbp, &layer);
2735 break;
2736 default:
2737 result = BAD_VALUE;
2738 break;
2739 }
2740
2741 if (result != NO_ERROR) {
2742 return result;
2743 }
2744
Albert Chaulk479c60c2017-01-27 14:21:34 -05002745 layer->setInfo(windowType, ownerUid);
2746
Robert Carr1f0a16a2016-10-24 16:27:39 -07002747 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002748 if (result != NO_ERROR) {
2749 return result;
2750 }
2751 mInterceptor.saveSurfaceCreation(layer);
2752
2753 setTransactionFlags(eTransactionNeeded);
2754 return result;
2755}
2756
Cody Northropbc755282017-03-31 12:00:08 -06002757String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
2758{
2759 bool matchFound = true;
2760 uint32_t dupeCounter = 0;
2761
2762 // Tack on our counter whether there is a hit or not, so everyone gets a tag
2763 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
2764
2765 // Loop over layers until we're sure there is no matching name
2766 while (matchFound) {
2767 matchFound = false;
2768 mDrawingState.traverseInZOrder([&](Layer* layer) {
2769 if (layer->getName() == uniqueName) {
2770 matchFound = true;
2771 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
2772 }
2773 });
2774 }
2775
2776 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
2777
2778 return uniqueName;
2779}
2780
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002781status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2782 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2783 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2784{
2785 // initialize the surfaces
2786 switch (format) {
2787 case PIXEL_FORMAT_TRANSPARENT:
2788 case PIXEL_FORMAT_TRANSLUCENT:
2789 format = PIXEL_FORMAT_RGBA_8888;
2790 break;
2791 case PIXEL_FORMAT_OPAQUE:
2792 format = PIXEL_FORMAT_RGBX_8888;
2793 break;
2794 }
2795
2796 *outLayer = new Layer(this, client, name, w, h, flags);
2797 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2798 if (err == NO_ERROR) {
2799 *handle = (*outLayer)->getHandle();
2800 *gbp = (*outLayer)->getProducer();
2801 }
2802
2803 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2804 return err;
2805}
2806
2807status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2808 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2809 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2810{
2811 *outLayer = new LayerDim(this, client, name, w, h, flags);
2812 *handle = (*outLayer)->getHandle();
2813 *gbp = (*outLayer)->getProducer();
2814 return NO_ERROR;
2815}
2816
2817status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2818{
Robert Carr9524cb32017-02-13 11:32:32 -08002819 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002820 status_t err = NO_ERROR;
2821 sp<Layer> l(client->getLayerUser(handle));
2822 if (l != NULL) {
2823 mInterceptor.saveSurfaceDeletion(l);
2824 err = removeLayer(l);
2825 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2826 "error removing layer=%p (%s)", l.get(), strerror(-err));
2827 }
2828 return err;
2829}
2830
2831status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2832{
2833 // called by ~LayerCleaner() when all references to the IBinder (handle)
2834 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002835 sp<Layer> l = layer.promote();
2836 if (l == nullptr) {
2837 // The layer has already been removed, carry on
2838 return NO_ERROR;
Robert Carr9524cb32017-02-13 11:32:32 -08002839 }
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002840 // If we have a parent, then we can continue to live as long as it does.
2841 return removeLayer(l, true);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002842}
2843
2844// ---------------------------------------------------------------------------
2845
2846void SurfaceFlinger::onInitializeDisplays() {
2847 // reset screen orientation and use primary layer stack
2848 Vector<ComposerState> state;
2849 Vector<DisplayState> displays;
2850 DisplayState d;
2851 d.what = DisplayState::eDisplayProjectionChanged |
2852 DisplayState::eLayerStackChanged;
2853 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2854 d.layerStack = 0;
2855 d.orientation = DisplayState::eOrientationDefault;
2856 d.frame.makeInvalid();
2857 d.viewport.makeInvalid();
2858 d.width = 0;
2859 d.height = 0;
2860 displays.add(d);
2861 setTransactionState(state, displays, 0);
2862 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2863
2864 const nsecs_t period =
2865 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2866 mAnimFrameTracker.setDisplayRefreshPeriod(period);
Brian Andersond0010582017-03-07 13:20:31 -08002867
2868 // Use phase of 0 since phase is not known.
2869 // Use latency of 0, which will snap to the ideal latency.
2870 setCompositorTimingSnapped(0, period, 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002871}
2872
2873void SurfaceFlinger::initializeDisplays() {
2874 class MessageScreenInitialized : public MessageBase {
2875 SurfaceFlinger* flinger;
2876 public:
2877 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2878 virtual bool handler() {
2879 flinger->onInitializeDisplays();
2880 return true;
2881 }
2882 };
2883 sp<MessageBase> msg = new MessageScreenInitialized(this);
2884 postMessageAsync(msg); // we may be called from main thread, use async message
2885}
2886
2887void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2888 int mode) {
2889 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2890 this);
2891 int32_t type = hw->getDisplayType();
2892 int currentMode = hw->getPowerMode();
2893
2894 if (mode == currentMode) {
2895 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2896 return;
2897 }
2898
2899 hw->setPowerMode(mode);
2900 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2901 ALOGW("Trying to set power mode for virtual display");
2902 return;
2903 }
2904
2905 if (mInterceptor.isEnabled()) {
2906 Mutex::Autolock _l(mStateLock);
2907 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2908 if (idx < 0) {
2909 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2910 return;
2911 }
2912 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2913 }
2914
2915 if (currentMode == HWC_POWER_MODE_OFF) {
2916 // Turn on the display
2917 getHwComposer().setPowerMode(type, mode);
Matthew Bouyack38d49612017-05-12 12:49:32 -07002918 if (type == DisplayDevice::DISPLAY_PRIMARY &&
2919 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002920 // FIXME: eventthread only knows about the main display right now
2921 mEventThread->onScreenAcquired();
2922 resyncToHardwareVsync(true);
2923 }
2924
2925 mVisibleRegionsDirty = true;
2926 mHasPoweredOff = true;
2927 repaintEverything();
2928
2929 struct sched_param param = {0};
2930 param.sched_priority = 1;
2931 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2932 ALOGW("Couldn't set SCHED_FIFO on display on");
2933 }
2934 } else if (mode == HWC_POWER_MODE_OFF) {
2935 // Turn off the display
2936 struct sched_param param = {0};
2937 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2938 ALOGW("Couldn't set SCHED_OTHER on display off");
2939 }
2940
2941 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2942 disableHardwareVsync(true); // also cancels any in-progress resync
2943
2944 // FIXME: eventthread only knows about the main display right now
2945 mEventThread->onScreenReleased();
2946 }
2947
2948 getHwComposer().setPowerMode(type, mode);
2949 mVisibleRegionsDirty = true;
2950 // from this point on, SF will stop drawing on this display
Matthew Bouyack38d49612017-05-12 12:49:32 -07002951 } else if (mode == HWC_POWER_MODE_DOZE ||
2952 mode == HWC_POWER_MODE_NORMAL) {
Zheng Zhang8a43fe62017-03-17 11:19:39 +01002953 // Update display while dozing
2954 getHwComposer().setPowerMode(type, mode);
2955 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2956 // FIXME: eventthread only knows about the main display right now
2957 mEventThread->onScreenAcquired();
2958 resyncToHardwareVsync(true);
2959 }
2960 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
2961 // Leave display going to doze
2962 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2963 disableHardwareVsync(true); // also cancels any in-progress resync
2964 // FIXME: eventthread only knows about the main display right now
2965 mEventThread->onScreenReleased();
2966 }
2967 getHwComposer().setPowerMode(type, mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002968 } else {
Matthew Bouyack38d49612017-05-12 12:49:32 -07002969 ALOGE("Attempting to set unknown power mode: %d\n", mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002970 getHwComposer().setPowerMode(type, mode);
2971 }
2972}
2973
2974void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2975 class MessageSetPowerMode: public MessageBase {
2976 SurfaceFlinger& mFlinger;
2977 sp<IBinder> mDisplay;
2978 int mMode;
2979 public:
2980 MessageSetPowerMode(SurfaceFlinger& flinger,
2981 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2982 mDisplay(disp) { mMode = mode; }
2983 virtual bool handler() {
2984 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2985 if (hw == NULL) {
2986 ALOGE("Attempt to set power mode = %d for null display %p",
2987 mMode, mDisplay.get());
2988 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2989 ALOGW("Attempt to set power mode = %d for virtual display",
2990 mMode);
2991 } else {
2992 mFlinger.setPowerModeInternal(hw, mMode);
2993 }
2994 return true;
2995 }
2996 };
2997 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2998 postMessageSync(msg);
2999}
3000
3001// ---------------------------------------------------------------------------
3002
3003status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
3004{
3005 String8 result;
3006
3007 IPCThreadState* ipc = IPCThreadState::self();
3008 const int pid = ipc->getCallingPid();
3009 const int uid = ipc->getCallingUid();
3010 if ((uid != AID_SHELL) &&
3011 !PermissionCache::checkPermission(sDump, pid, uid)) {
3012 result.appendFormat("Permission Denial: "
3013 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
3014 } else {
3015 // Try to get the main lock, but give up after one second
3016 // (this would indicate SF is stuck, but we want to be able to
3017 // print something in dumpsys).
3018 status_t err = mStateLock.timedLock(s2ns(1));
3019 bool locked = (err == NO_ERROR);
3020 if (!locked) {
3021 result.appendFormat(
3022 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
3023 "dumping anyways (no locks held)\n", strerror(-err), err);
3024 }
3025
3026 bool dumpAll = true;
3027 size_t index = 0;
3028 size_t numArgs = args.size();
3029 if (numArgs) {
3030 if ((index < numArgs) &&
3031 (args[index] == String16("--list"))) {
3032 index++;
3033 listLayersLocked(args, index, result);
3034 dumpAll = false;
3035 }
3036
3037 if ((index < numArgs) &&
3038 (args[index] == String16("--latency"))) {
3039 index++;
3040 dumpStatsLocked(args, index, result);
3041 dumpAll = false;
3042 }
3043
3044 if ((index < numArgs) &&
3045 (args[index] == String16("--latency-clear"))) {
3046 index++;
3047 clearStatsLocked(args, index, result);
3048 dumpAll = false;
3049 }
3050
3051 if ((index < numArgs) &&
3052 (args[index] == String16("--dispsync"))) {
3053 index++;
3054 mPrimaryDispSync.dump(result);
3055 dumpAll = false;
3056 }
3057
3058 if ((index < numArgs) &&
3059 (args[index] == String16("--static-screen"))) {
3060 index++;
3061 dumpStaticScreenStats(result);
3062 dumpAll = false;
3063 }
3064
3065 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07003066 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003067 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07003068 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003069 dumpAll = false;
3070 }
3071 }
3072
3073 if (dumpAll) {
3074 dumpAllLocked(args, index, result);
3075 }
3076
3077 if (locked) {
3078 mStateLock.unlock();
3079 }
3080 }
3081 write(fd, result.string(), result.size());
3082 return NO_ERROR;
3083}
3084
3085void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3086 size_t& /* index */, String8& result) const
3087{
Robert Carr2047fae2016-11-28 14:09:09 -08003088 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003089 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08003090 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003091}
3092
3093void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3094 String8& result) const
3095{
3096 String8 name;
3097 if (index < args.size()) {
3098 name = String8(args[index]);
3099 index++;
3100 }
3101
3102 const nsecs_t period =
3103 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3104 result.appendFormat("%" PRId64 "\n", period);
3105
3106 if (name.isEmpty()) {
3107 mAnimFrameTracker.dumpStats(result);
3108 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08003109 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003110 if (name == layer->getName()) {
3111 layer->dumpFrameStats(result);
3112 }
Robert Carr2047fae2016-11-28 14:09:09 -08003113 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003114 }
3115}
3116
3117void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3118 String8& /* result */)
3119{
3120 String8 name;
3121 if (index < args.size()) {
3122 name = String8(args[index]);
3123 index++;
3124 }
3125
Robert Carr2047fae2016-11-28 14:09:09 -08003126 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003127 if (name.isEmpty() || (name == layer->getName())) {
3128 layer->clearFrameStats();
3129 }
Robert Carr2047fae2016-11-28 14:09:09 -08003130 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003131
3132 mAnimFrameTracker.clearStats();
3133}
3134
3135// This should only be called from the main thread. Otherwise it would need
3136// the lock and should use mCurrentState rather than mDrawingState.
3137void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003138 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003139 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003140 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003141
3142 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3143}
3144
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003145void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003146{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003147 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003148 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3149
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003150 if (isLayerTripleBufferingDisabled())
3151 result.append(" DISABLE_TRIPLE_BUFFERING");
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003152
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003153 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003154 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08003155 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08003156 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
Fabien Sanglard1971b632017-03-10 14:50:03 -08003157 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3158 maxFrameBufferAcquiredBuffers);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003159 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003160}
3161
3162void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3163{
3164 result.appendFormat("Static screen stats:\n");
3165 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3166 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3167 float percent = 100.0f *
3168 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3169 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3170 b + 1, bucketTimeSec, percent);
3171 }
3172 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3173 float percent = 100.0f *
3174 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3175 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3176 NUM_BUCKETS - 1, bucketTimeSec, percent);
3177}
3178
Brian Andersond6927fb2016-07-23 23:37:30 -07003179void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3180 result.appendFormat("Layer frame timestamps:\n");
3181
3182 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3183 const size_t count = currentLayers.size();
3184 for (size_t i=0 ; i<count ; i++) {
3185 currentLayers[i]->dumpFrameEvents(result);
3186 }
3187}
3188
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003189void SurfaceFlinger::recordBufferingStats(const char* layerName,
3190 std::vector<OccupancyTracker::Segment>&& history) {
3191 Mutex::Autolock lock(mBufferingStatsMutex);
3192 auto& stats = mBufferingStats[layerName];
3193 for (const auto& segment : history) {
3194 if (!segment.usedThirdBuffer) {
3195 stats.twoBufferTime += segment.totalTime;
3196 }
3197 if (segment.occupancyAverage < 1.0f) {
3198 stats.doubleBufferedTime += segment.totalTime;
3199 } else if (segment.occupancyAverage < 2.0f) {
3200 stats.tripleBufferedTime += segment.totalTime;
3201 }
3202 ++stats.numSegments;
3203 stats.totalTime += segment.totalTime;
3204 }
3205}
3206
3207void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3208 result.append("Buffering stats:\n");
3209 result.append(" [Layer name] <Active time> <Two buffer> "
3210 "<Double buffered> <Triple buffered>\n");
3211 Mutex::Autolock lock(mBufferingStatsMutex);
3212 typedef std::tuple<std::string, float, float, float> BufferTuple;
3213 std::map<float, BufferTuple, std::greater<float>> sorted;
3214 for (const auto& statsPair : mBufferingStats) {
3215 const char* name = statsPair.first.c_str();
3216 const BufferingStats& stats = statsPair.second;
3217 if (stats.numSegments == 0) {
3218 continue;
3219 }
3220 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3221 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3222 stats.totalTime;
3223 float doubleBufferRatio = static_cast<float>(
3224 stats.doubleBufferedTime) / stats.totalTime;
3225 float tripleBufferRatio = static_cast<float>(
3226 stats.tripleBufferedTime) / stats.totalTime;
3227 sorted.insert({activeTime, {name, twoBufferRatio,
3228 doubleBufferRatio, tripleBufferRatio}});
3229 }
3230 for (const auto& sortedPair : sorted) {
3231 float activeTime = sortedPair.first;
3232 const BufferTuple& values = sortedPair.second;
3233 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3234 std::get<0>(values).c_str(), activeTime,
3235 std::get<1>(values), std::get<2>(values),
3236 std::get<3>(values));
3237 }
3238 result.append("\n");
3239}
3240
3241void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3242 String8& result) const
3243{
3244 bool colorize = false;
3245 if (index < args.size()
3246 && (args[index] == String16("--color"))) {
3247 colorize = true;
3248 index++;
3249 }
3250
3251 Colorizer colorizer(colorize);
3252
3253 // figure out if we're stuck somewhere
3254 const nsecs_t now = systemTime();
3255 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3256 const nsecs_t inTransaction(mDebugInTransaction);
3257 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3258 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3259
3260 /*
3261 * Dump library configuration.
3262 */
3263
3264 colorizer.bold(result);
3265 result.append("Build configuration:");
3266 colorizer.reset(result);
3267 appendSfConfigString(result);
3268 appendUiConfigString(result);
3269 appendGuiConfigString(result);
3270 result.append("\n");
3271
3272 colorizer.bold(result);
3273 result.append("Sync configuration: ");
3274 colorizer.reset(result);
3275 result.append(SyncFeatures::getInstance().toString());
3276 result.append("\n");
3277
3278 colorizer.bold(result);
3279 result.append("DispSync configuration: ");
3280 colorizer.reset(result);
3281 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003282 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3283 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003284 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3285 result.append("\n");
3286
3287 // Dump static screen stats
3288 result.append("\n");
3289 dumpStaticScreenStats(result);
3290 result.append("\n");
3291
3292 dumpBufferingStats(result);
3293
3294 /*
3295 * Dump the visible layer list
3296 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003297 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003298 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003299 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003300 mCurrentState.traverseInZOrder([&](Layer* layer) {
Kalle Raitaa099a242017-01-11 11:17:29 -08003301 result.append(to_string(layer->getLayerDebugInfo()).c_str());
Robert Carr2047fae2016-11-28 14:09:09 -08003302 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003303
3304 /*
3305 * Dump Display state
3306 */
3307
3308 colorizer.bold(result);
3309 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3310 colorizer.reset(result);
3311 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3312 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3313 hw->dump(result);
3314 }
3315
3316 /*
3317 * Dump SurfaceFlinger global state
3318 */
3319
3320 colorizer.bold(result);
3321 result.append("SurfaceFlinger global state:\n");
3322 colorizer.reset(result);
3323
3324 HWComposer& hwc(getHwComposer());
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003325 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003326
3327 colorizer.bold(result);
3328 result.appendFormat("EGL implementation : %s\n",
3329 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3330 colorizer.reset(result);
3331 result.appendFormat("%s\n",
3332 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3333
3334 mRenderEngine->dump(result);
3335
3336 hw->undefinedRegion.dump(result, "undefinedRegion");
3337 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3338 hw->getOrientation(), hw->isDisplayOn());
3339 result.appendFormat(
3340 " last eglSwapBuffers() time: %f us\n"
3341 " last transaction time : %f us\n"
3342 " transaction-flags : %08x\n"
3343 " refresh-rate : %f fps\n"
3344 " x-dpi : %f\n"
3345 " y-dpi : %f\n"
3346 " gpu_to_cpu_unsupported : %d\n"
3347 ,
3348 mLastSwapBufferTime/1000.0,
3349 mLastTransactionTime/1000.0,
3350 mTransactionFlags,
3351 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3352 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3353 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3354 !mGpuToCpuSupported);
3355
3356 result.appendFormat(" eglSwapBuffers time: %f us\n",
3357 inSwapBuffersDuration/1000.0);
3358
3359 result.appendFormat(" transaction time: %f us\n",
3360 inTransactionDuration/1000.0);
3361
3362 /*
3363 * VSYNC state
3364 */
3365 mEventThread->dump(result);
3366
3367 /*
3368 * Dump HWComposer state
3369 */
3370 colorizer.bold(result);
3371 result.append("h/w composer state:\n");
3372 colorizer.reset(result);
3373 result.appendFormat(" h/w composer %s and %s\n",
3374 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3375 (mDebugDisableHWC || mDebugRegion || mDaltonize
3376 || mHasColorMatrix) ? "disabled" : "enabled");
3377 hwc.dump(result);
3378
3379 /*
3380 * Dump gralloc state
3381 */
3382 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3383 alloc.dump(result);
3384}
3385
3386const Vector< sp<Layer> >&
3387SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3388 // Note: mStateLock is held here
3389 wp<IBinder> dpy;
3390 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3391 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3392 dpy = mDisplays.keyAt(i);
3393 break;
3394 }
3395 }
3396 if (dpy == NULL) {
3397 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3398 // Just use the primary display so we have something to return
3399 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3400 }
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003401 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003402}
3403
3404bool SurfaceFlinger::startDdmConnection()
3405{
3406 void* libddmconnection_dso =
3407 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3408 if (!libddmconnection_dso) {
3409 return false;
3410 }
3411 void (*DdmConnection_start)(const char* name);
3412 DdmConnection_start =
3413 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3414 if (!DdmConnection_start) {
3415 dlclose(libddmconnection_dso);
3416 return false;
3417 }
3418 (*DdmConnection_start)(getServiceName());
3419 return true;
3420}
3421
3422status_t SurfaceFlinger::onTransact(
3423 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3424{
3425 switch (code) {
3426 case CREATE_CONNECTION:
3427 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003428 case BOOT_FINISHED:
3429 case CLEAR_ANIMATION_FRAME_STATS:
3430 case GET_ANIMATION_FRAME_STATS:
3431 case SET_POWER_MODE:
3432 case GET_HDR_CAPABILITIES:
3433 {
3434 // codes that require permission check
3435 IPCThreadState* ipc = IPCThreadState::self();
3436 const int pid = ipc->getCallingPid();
3437 const int uid = ipc->getCallingUid();
3438 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3439 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3440 ALOGE("Permission Denial: "
3441 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3442 return PERMISSION_DENIED;
3443 }
3444 break;
3445 }
Robert Carr1db73f62016-12-21 12:58:51 -08003446 /*
3447 * Calling setTransactionState is safe, because you need to have been
3448 * granted a reference to Client* and Handle* to do anything with it.
3449 *
3450 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3451 */
3452 case SET_TRANSACTION_STATE:
3453 case CREATE_SCOPED_CONNECTION:
3454 {
3455 break;
3456 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003457 case CAPTURE_SCREEN:
3458 {
3459 // codes that require permission check
3460 IPCThreadState* ipc = IPCThreadState::self();
3461 const int pid = ipc->getCallingPid();
3462 const int uid = ipc->getCallingUid();
3463 if ((uid != AID_GRAPHICS) &&
3464 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3465 ALOGE("Permission Denial: "
3466 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3467 return PERMISSION_DENIED;
3468 }
3469 break;
3470 }
3471 }
3472
3473 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3474 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3475 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3476 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3477 IPCThreadState* ipc = IPCThreadState::self();
3478 const int pid = ipc->getCallingPid();
3479 const int uid = ipc->getCallingUid();
3480 ALOGE("Permission Denial: "
3481 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3482 return PERMISSION_DENIED;
3483 }
3484 int n;
3485 switch (code) {
3486 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3487 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3488 return NO_ERROR;
3489 case 1002: // SHOW_UPDATES
3490 n = data.readInt32();
3491 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3492 invalidateHwcGeometry();
3493 repaintEverything();
3494 return NO_ERROR;
3495 case 1004:{ // repaint everything
3496 repaintEverything();
3497 return NO_ERROR;
3498 }
3499 case 1005:{ // force transaction
3500 setTransactionFlags(
3501 eTransactionNeeded|
3502 eDisplayTransactionNeeded|
3503 eTraversalNeeded);
3504 return NO_ERROR;
3505 }
3506 case 1006:{ // send empty update
3507 signalRefresh();
3508 return NO_ERROR;
3509 }
3510 case 1008: // toggle use of hw composer
3511 n = data.readInt32();
3512 mDebugDisableHWC = n ? 1 : 0;
3513 invalidateHwcGeometry();
3514 repaintEverything();
3515 return NO_ERROR;
3516 case 1009: // toggle use of transform hint
3517 n = data.readInt32();
3518 mDebugDisableTransformHint = n ? 1 : 0;
3519 invalidateHwcGeometry();
3520 repaintEverything();
3521 return NO_ERROR;
3522 case 1010: // interrogate.
3523 reply->writeInt32(0);
3524 reply->writeInt32(0);
3525 reply->writeInt32(mDebugRegion);
3526 reply->writeInt32(0);
3527 reply->writeInt32(mDebugDisableHWC);
3528 return NO_ERROR;
3529 case 1013: {
3530 Mutex::Autolock _l(mStateLock);
3531 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3532 reply->writeInt32(hw->getPageFlipCount());
3533 return NO_ERROR;
3534 }
3535 case 1014: {
3536 // daltonize
3537 n = data.readInt32();
3538 switch (n % 10) {
3539 case 1:
3540 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3541 break;
3542 case 2:
3543 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3544 break;
3545 case 3:
3546 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3547 break;
3548 }
3549 if (n >= 10) {
3550 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3551 } else {
3552 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3553 }
3554 mDaltonize = n > 0;
3555 invalidateHwcGeometry();
3556 repaintEverything();
3557 return NO_ERROR;
3558 }
3559 case 1015: {
3560 // apply a color matrix
3561 n = data.readInt32();
3562 mHasColorMatrix = n ? 1 : 0;
3563 if (n) {
3564 // color matrix is sent as mat3 matrix followed by vec3
3565 // offset, then packed into a mat4 where the last row is
3566 // the offset and extra values are 0
3567 for (size_t i = 0 ; i < 4; i++) {
3568 for (size_t j = 0; j < 4; j++) {
3569 mColorMatrix[i][j] = data.readFloat();
3570 }
3571 }
3572 } else {
3573 mColorMatrix = mat4();
3574 }
3575 invalidateHwcGeometry();
3576 repaintEverything();
3577 return NO_ERROR;
3578 }
3579 // This is an experimental interface
3580 // Needs to be shifted to proper binder interface when we productize
3581 case 1016: {
3582 n = data.readInt32();
3583 mPrimaryDispSync.setRefreshSkipCount(n);
3584 return NO_ERROR;
3585 }
3586 case 1017: {
3587 n = data.readInt32();
3588 mForceFullDamage = static_cast<bool>(n);
3589 return NO_ERROR;
3590 }
3591 case 1018: { // Modify Choreographer's phase offset
3592 n = data.readInt32();
3593 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3594 return NO_ERROR;
3595 }
3596 case 1019: { // Modify SurfaceFlinger's phase offset
3597 n = data.readInt32();
3598 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3599 return NO_ERROR;
3600 }
3601 case 1020: { // Layer updates interceptor
3602 n = data.readInt32();
3603 if (n) {
3604 ALOGV("Interceptor enabled");
3605 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3606 }
3607 else{
3608 ALOGV("Interceptor disabled");
3609 mInterceptor.disable();
3610 }
3611 return NO_ERROR;
3612 }
3613 case 1021: { // Disable HWC virtual displays
3614 n = data.readInt32();
3615 mUseHwcVirtualDisplays = !n;
3616 return NO_ERROR;
3617 }
3618 }
3619 }
3620 return err;
3621}
3622
3623void SurfaceFlinger::repaintEverything() {
3624 android_atomic_or(1, &mRepaintEverything);
3625 signalTransaction();
3626}
3627
3628// ---------------------------------------------------------------------------
3629// Capture screen into an IGraphiBufferProducer
3630// ---------------------------------------------------------------------------
3631
3632/* The code below is here to handle b/8734824
3633 *
3634 * We create a IGraphicBufferProducer wrapper that forwards all calls
3635 * from the surfaceflinger thread to the calling binder thread, where they
3636 * are executed. This allows the calling thread in the calling process to be
3637 * reused and not depend on having "enough" binder threads to handle the
3638 * requests.
3639 */
3640class GraphicProducerWrapper : public BBinder, public MessageHandler {
3641 /* Parts of GraphicProducerWrapper are run on two different threads,
3642 * communicating by sending messages via Looper but also by shared member
3643 * data. Coherence maintenance is subtle and in places implicit (ugh).
3644 *
3645 * Don't rely on Looper's sendMessage/handleMessage providing
3646 * release/acquire semantics for any data not actually in the Message.
3647 * Data going from surfaceflinger to binder threads needs to be
3648 * synchronized explicitly.
3649 *
3650 * Barrier open/wait do provide release/acquire semantics. This provides
3651 * implicit synchronization for data coming back from binder to
3652 * surfaceflinger threads.
3653 */
3654
3655 sp<IGraphicBufferProducer> impl;
3656 sp<Looper> looper;
3657 status_t result;
3658 bool exitPending;
3659 bool exitRequested;
3660 Barrier barrier;
3661 uint32_t code;
3662 Parcel const* data;
3663 Parcel* reply;
3664
3665 enum {
3666 MSG_API_CALL,
3667 MSG_EXIT
3668 };
3669
3670 /*
3671 * Called on surfaceflinger thread. This is called by our "fake"
3672 * BpGraphicBufferProducer. We package the data and reply Parcel and
3673 * forward them to the binder thread.
3674 */
3675 virtual status_t transact(uint32_t code,
3676 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3677 this->code = code;
3678 this->data = &data;
3679 this->reply = reply;
3680 if (exitPending) {
3681 // if we've exited, we run the message synchronously right here.
3682 // note (JH): as far as I can tell from looking at the code, this
3683 // never actually happens. if it does, i'm not sure if it happens
3684 // on the surfaceflinger or binder thread.
3685 handleMessage(Message(MSG_API_CALL));
3686 } else {
3687 barrier.close();
3688 // Prevent stores to this->{code, data, reply} from being
3689 // reordered later than the construction of Message.
3690 atomic_thread_fence(memory_order_release);
3691 looper->sendMessage(this, Message(MSG_API_CALL));
3692 barrier.wait();
3693 }
3694 return result;
3695 }
3696
3697 /*
3698 * here we run on the binder thread. All we've got to do is
3699 * call the real BpGraphicBufferProducer.
3700 */
3701 virtual void handleMessage(const Message& message) {
3702 int what = message.what;
3703 // Prevent reads below from happening before the read from Message
3704 atomic_thread_fence(memory_order_acquire);
3705 if (what == MSG_API_CALL) {
3706 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3707 barrier.open();
3708 } else if (what == MSG_EXIT) {
3709 exitRequested = true;
3710 }
3711 }
3712
3713public:
3714 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3715 : impl(impl),
3716 looper(new Looper(true)),
3717 result(NO_ERROR),
3718 exitPending(false),
3719 exitRequested(false),
3720 code(0),
3721 data(NULL),
3722 reply(NULL)
3723 {}
3724
3725 // Binder thread
3726 status_t waitForResponse() {
3727 do {
3728 looper->pollOnce(-1);
3729 } while (!exitRequested);
3730 return result;
3731 }
3732
3733 // Client thread
3734 void exit(status_t result) {
3735 this->result = result;
3736 exitPending = true;
3737 // Ensure this->result is visible to the binder thread before it
3738 // handles the message.
3739 atomic_thread_fence(memory_order_release);
3740 looper->sendMessage(this, Message(MSG_EXIT));
3741 }
3742};
3743
3744
3745status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3746 const sp<IGraphicBufferProducer>& producer,
3747 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003748 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003749 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3750
3751 if (CC_UNLIKELY(display == 0))
3752 return BAD_VALUE;
3753
3754 if (CC_UNLIKELY(producer == 0))
3755 return BAD_VALUE;
3756
3757 // if we have secure windows on this display, never allow the screen capture
3758 // unless the producer interface is local (i.e.: we can take a screenshot for
3759 // ourselves).
3760 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3761
3762 // Convert to surfaceflinger's internal rotation type.
3763 Transform::orientation_flags rotationFlags;
3764 switch (rotation) {
3765 case ISurfaceComposer::eRotateNone:
3766 rotationFlags = Transform::ROT_0;
3767 break;
3768 case ISurfaceComposer::eRotate90:
3769 rotationFlags = Transform::ROT_90;
3770 break;
3771 case ISurfaceComposer::eRotate180:
3772 rotationFlags = Transform::ROT_180;
3773 break;
3774 case ISurfaceComposer::eRotate270:
3775 rotationFlags = Transform::ROT_270;
3776 break;
3777 default:
3778 rotationFlags = Transform::ROT_0;
3779 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3780 break;
3781 }
3782
3783 class MessageCaptureScreen : public MessageBase {
3784 SurfaceFlinger* flinger;
3785 sp<IBinder> display;
3786 sp<IGraphicBufferProducer> producer;
3787 Rect sourceCrop;
3788 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003789 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003790 bool useIdentityTransform;
3791 Transform::orientation_flags rotation;
3792 status_t result;
3793 bool isLocalScreenshot;
3794 public:
3795 MessageCaptureScreen(SurfaceFlinger* flinger,
3796 const sp<IBinder>& display,
3797 const sp<IGraphicBufferProducer>& producer,
3798 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003799 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003800 bool useIdentityTransform,
3801 Transform::orientation_flags rotation,
3802 bool isLocalScreenshot)
3803 : flinger(flinger), display(display), producer(producer),
3804 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3805 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3806 useIdentityTransform(useIdentityTransform),
3807 rotation(rotation), result(PERMISSION_DENIED),
3808 isLocalScreenshot(isLocalScreenshot)
3809 {
3810 }
3811 status_t getResult() const {
3812 return result;
3813 }
3814 virtual bool handler() {
3815 Mutex::Autolock _l(flinger->mStateLock);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003816 sp<const DisplayDevice> hw(flinger->getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003817 result = flinger->captureScreenImplLocked(hw, producer,
3818 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3819 useIdentityTransform, rotation, isLocalScreenshot);
3820 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3821 return true;
3822 }
3823 };
3824
3825 // this creates a "fake" BBinder which will serve as a "fake" remote
3826 // binder to receive the marshaled calls and forward them to the
3827 // real remote (a BpGraphicBufferProducer)
3828 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3829
3830 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3831 // which does the marshaling work forwards to our "fake remote" above.
3832 sp<MessageBase> msg = new MessageCaptureScreen(this,
3833 display, IGraphicBufferProducer::asInterface( wrapper ),
3834 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3835 useIdentityTransform, rotationFlags, isLocalScreenshot);
3836
3837 status_t res = postMessageAsync(msg);
3838 if (res == NO_ERROR) {
3839 res = wrapper->waitForResponse();
3840 }
3841 return res;
3842}
3843
3844
3845void SurfaceFlinger::renderScreenImplLocked(
3846 const sp<const DisplayDevice>& hw,
3847 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003848 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003849 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3850{
3851 ATRACE_CALL();
3852 RenderEngine& engine(getRenderEngine());
3853
3854 // get screen geometry
3855 const int32_t hw_w = hw->getWidth();
3856 const int32_t hw_h = hw->getHeight();
3857 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3858 static_cast<int32_t>(reqHeight) != hw_h;
3859
3860 // if a default or invalid sourceCrop is passed in, set reasonable values
3861 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3862 !sourceCrop.isValid()) {
3863 sourceCrop.setLeftTop(Point(0, 0));
3864 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3865 }
3866
3867 // ensure that sourceCrop is inside screen
3868 if (sourceCrop.left < 0) {
3869 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3870 }
3871 if (sourceCrop.right > hw_w) {
3872 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3873 }
3874 if (sourceCrop.top < 0) {
3875 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3876 }
3877 if (sourceCrop.bottom > hw_h) {
3878 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3879 }
3880
3881 // make sure to clear all GL error flags
3882 engine.checkErrors();
3883
3884 // set-up our viewport
3885 engine.setViewportAndProjection(
3886 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3887 engine.disableTexturing();
3888
3889 // redraw the screen entirely...
3890 engine.clearWithColor(0, 0, 0, 1);
3891
Robert Carr1f0a16a2016-10-24 16:27:39 -07003892 // We loop through the first level of layers without traversing,
3893 // as we need to interpret min/max layer Z in the top level Z space.
3894 for (const auto& layer : mDrawingState.layersSortedByZ) {
3895 if (layer->getLayerStack() != hw->getLayerStack()) {
3896 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003897 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003898 const Layer::State& state(layer->getDrawingState());
3899 if (state.z < minLayerZ || state.z > maxLayerZ) {
3900 continue;
3901 }
Dan Stoza412903f2017-04-27 13:42:17 -07003902 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003903 if (!layer->isVisible()) {
3904 return;
3905 }
3906 if (filtering) layer->setFiltering(true);
3907 layer->draw(hw, useIdentityTransform);
3908 if (filtering) layer->setFiltering(false);
3909 });
3910 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003911
3912 // compositionComplete is needed for older driver
3913 hw->compositionComplete();
3914 hw->setViewportAndProjection();
3915}
3916
3917
3918status_t SurfaceFlinger::captureScreenImplLocked(
3919 const sp<const DisplayDevice>& hw,
3920 const sp<IGraphicBufferProducer>& producer,
3921 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003922 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003923 bool useIdentityTransform, Transform::orientation_flags rotation,
3924 bool isLocalScreenshot)
3925{
3926 ATRACE_CALL();
3927
3928 // get screen geometry
3929 uint32_t hw_w = hw->getWidth();
3930 uint32_t hw_h = hw->getHeight();
3931
3932 if (rotation & Transform::ROT_90) {
3933 std::swap(hw_w, hw_h);
3934 }
3935
3936 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3937 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3938 reqWidth, reqHeight, hw_w, hw_h);
3939 return BAD_VALUE;
3940 }
3941
3942 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3943 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3944
3945 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003946 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003947 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003948 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3949 (state.z < minLayerZ || state.z > maxLayerZ)) {
3950 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003951 }
Dan Stoza412903f2017-04-27 13:42:17 -07003952 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003953 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3954 layer->isSecure());
3955 });
3956 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003957
3958 if (!isLocalScreenshot && secureLayerIsVisible) {
3959 ALOGW("FB is protected: PERMISSION_DENIED");
3960 return PERMISSION_DENIED;
3961 }
3962
3963 // create a surface (because we're a producer, and we need to
3964 // dequeue/queue a buffer)
3965 sp<Surface> sur = new Surface(producer, false);
3966 ANativeWindow* window = sur.get();
3967
3968 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3969 if (result == NO_ERROR) {
3970 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3971 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3972
3973 int err = 0;
3974 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3975 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3976 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3977 err |= native_window_set_usage(window, usage);
3978
3979 if (err == NO_ERROR) {
3980 ANativeWindowBuffer* buffer;
3981 /* TODO: Once we have the sync framework everywhere this can use
3982 * server-side waits on the fence that dequeueBuffer returns.
3983 */
3984 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3985 if (result == NO_ERROR) {
3986 int syncFd = -1;
3987 // create an EGLImage from the buffer so we can later
3988 // turn it into a texture
3989 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3990 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3991 if (image != EGL_NO_IMAGE_KHR) {
3992 // this binds the given EGLImage as a framebuffer for the
3993 // duration of this scope.
3994 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3995 if (imageBond.getStatus() == NO_ERROR) {
3996 // this will in fact render into our dequeued buffer
3997 // via an FBO, which means we didn't have to create
3998 // an EGLSurface and therefore we're not
3999 // dependent on the context's EGLConfig.
4000 renderScreenImplLocked(
4001 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
4002 useIdentityTransform, rotation);
4003
4004 // Attempt to create a sync khr object that can produce a sync point. If that
4005 // isn't available, create a non-dupable sync object in the fallback path and
4006 // wait on it directly.
4007 EGLSyncKHR sync;
4008 if (!DEBUG_SCREENSHOTS) {
4009 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
4010 // native fence fd will not be populated until flush() is done.
4011 getRenderEngine().flush();
4012 } else {
4013 sync = EGL_NO_SYNC_KHR;
4014 }
4015 if (sync != EGL_NO_SYNC_KHR) {
4016 // get the sync fd
4017 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
4018 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
4019 ALOGW("captureScreen: failed to dup sync khr object");
4020 syncFd = -1;
4021 }
4022 eglDestroySyncKHR(mEGLDisplay, sync);
4023 } else {
4024 // fallback path
4025 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
4026 if (sync != EGL_NO_SYNC_KHR) {
4027 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
4028 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
4029 EGLint eglErr = eglGetError();
4030 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
4031 ALOGW("captureScreen: fence wait timed out");
4032 } else {
4033 ALOGW_IF(eglErr != EGL_SUCCESS,
4034 "captureScreen: error waiting on EGL fence: %#x", eglErr);
4035 }
4036 eglDestroySyncKHR(mEGLDisplay, sync);
4037 } else {
4038 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
4039 }
4040 }
4041 if (DEBUG_SCREENSHOTS) {
4042 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
4043 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
4044 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
4045 hw, minLayerZ, maxLayerZ);
4046 delete [] pixels;
4047 }
4048
4049 } else {
4050 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
4051 result = INVALID_OPERATION;
4052 window->cancelBuffer(window, buffer, syncFd);
4053 buffer = NULL;
4054 }
4055 // destroy our image
4056 eglDestroyImageKHR(mEGLDisplay, image);
4057 } else {
4058 result = BAD_VALUE;
4059 }
4060 if (buffer) {
4061 // queueBuffer takes ownership of syncFd
4062 result = window->queueBuffer(window, buffer, syncFd);
4063 }
4064 }
4065 } else {
4066 result = BAD_VALUE;
4067 }
4068 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
4069 }
4070
4071 return result;
4072}
4073
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004074void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08004075 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004076 if (DEBUG_SCREENSHOTS) {
4077 for (size_t y=0 ; y<h ; y++) {
4078 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4079 for (size_t x=0 ; x<w ; x++) {
4080 if (p[x] != 0xFF000000) return;
4081 }
4082 }
4083 ALOGE("*** we just took a black screenshot ***\n"
4084 "requested minz=%d, maxz=%d, layerStack=%d",
4085 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08004086 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004087 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004088 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004089 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4090 state.z <= maxLayerZ) {
Dan Stoza412903f2017-04-27 13:42:17 -07004091 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07004092 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
4093 layer->isVisible() ? '+' : '-',
4094 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004095 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07004096 i++;
4097 });
4098 }
4099 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004100 }
4101}
4102
4103// ---------------------------------------------------------------------------
4104
Dan Stoza412903f2017-04-27 13:42:17 -07004105void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4106 layersSortedByZ.traverseInZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004107}
4108
Dan Stoza412903f2017-04-27 13:42:17 -07004109void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4110 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004111}
4112
4113}; // namespace android
4114
4115
4116#if defined(__gl_h_)
4117#error "don't include gl/gl.h in this file"
4118#endif
4119
4120#if defined(__gl2_h_)
4121#error "don't include gl2/gl2.h in this file"
4122#endif