blob: ee938eff9ef6c697af3728052faebe9aa197d0df [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 Park8d455e92017-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
Marissa Wallc9d2db12017-09-18 13:26:15 -0700182 mPrimaryDispSync.init(hasSyncFramework, dispSyncPresentTimeOffset);
183
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000184 char value[PROPERTY_VALUE_MAX];
185
186 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
187 mGpuToCpuSupported = !atoi(value);
188
189 property_get("debug.sf.showupdates", value, "0");
190 mDebugRegion = atoi(value);
191
192 property_get("debug.sf.ddms", value, "0");
193 mDebugDDMS = atoi(value);
194 if (mDebugDDMS) {
195 if (!startDdmConnection()) {
196 // start failed, and DDMS debugging not enabled
197 mDebugDDMS = 0;
198 }
199 }
200 ALOGI_IF(mDebugRegion, "showupdates enabled");
201 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
202
Fabien Sanglard642b23d2017-02-09 12:29:39 -0800203 property_get("debug.sf.enable_hwc_vds", value, "0");
204 mUseHwcVirtualDisplays = atoi(value);
205 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800206
Fabien Sanglardc65dafa2017-02-07 14:06:39 -0800207 property_get("ro.sf.disable_triple_buffer", value, "1");
208 mLayerTripleBufferingDisabled = atoi(value);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800209 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000210}
211
212void SurfaceFlinger::onFirstRef()
213{
214 mEventQueue.init(this);
215}
216
217SurfaceFlinger::~SurfaceFlinger()
218{
219 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
220 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
221 eglTerminate(display);
222}
223
224void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
225{
226 // the window manager died on us. prepare its eulogy.
227
228 // restore initial conditions (default device unblank, etc)
229 initializeDisplays();
230
231 // restart the boot-animation
232 startBootAnim();
233}
234
Robert Carr1db73f62016-12-21 12:58:51 -0800235static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000236 status_t err = client->initCheck();
237 if (err == NO_ERROR) {
Robert Carr1db73f62016-12-21 12:58:51 -0800238 return client;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000239 }
Robert Carr1db73f62016-12-21 12:58:51 -0800240 return nullptr;
241}
242
243sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
244 return initClient(new Client(this));
245}
246
247sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
248 const sp<IGraphicBufferProducer>& gbp) {
249 if (authenticateSurfaceTexture(gbp) == false) {
250 return nullptr;
251 }
252 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
253 if (layer == nullptr) {
254 return nullptr;
255 }
256
257 return initClient(new Client(this, layer));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000258}
259
260sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
261 bool secure)
262{
263 class DisplayToken : public BBinder {
264 sp<SurfaceFlinger> flinger;
265 virtual ~DisplayToken() {
266 // no more references, this display must be terminated
267 Mutex::Autolock _l(flinger->mStateLock);
268 flinger->mCurrentState.displays.removeItem(this);
269 flinger->setTransactionFlags(eDisplayTransactionNeeded);
270 }
271 public:
272 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
273 : flinger(flinger) {
274 }
275 };
276
277 sp<BBinder> token = new DisplayToken(this);
278
279 Mutex::Autolock _l(mStateLock);
280 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
281 info.displayName = displayName;
282 mCurrentState.displays.add(token, info);
283 mInterceptor.saveDisplayCreation(info);
284 return token;
285}
286
287void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
288 Mutex::Autolock _l(mStateLock);
289
290 ssize_t idx = mCurrentState.displays.indexOfKey(display);
291 if (idx < 0) {
292 ALOGW("destroyDisplay: invalid display token");
293 return;
294 }
295
296 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
297 if (!info.isVirtualDisplay()) {
298 ALOGE("destroyDisplay called for non-virtual display");
299 return;
300 }
301 mInterceptor.saveDisplayDeletion(info.displayId);
302 mCurrentState.displays.removeItemsAt(idx);
303 setTransactionFlags(eDisplayTransactionNeeded);
304}
305
306void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
307 ALOGW_IF(mBuiltinDisplays[type],
308 "Overwriting display token for display type %d", type);
309 mBuiltinDisplays[type] = new BBinder();
310 // All non-virtual displays are currently considered secure.
311 DisplayDeviceState info(type, true);
Lloyd Pique03dfbd52017-12-14 17:15:36 -0800312 info.displayName =
313 type== DisplayDevice::DISPLAY_PRIMARY ? "Built-in Screen" : "External Screen";
314
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000315 mCurrentState.displays.add(mBuiltinDisplays[type], info);
316 mInterceptor.saveDisplayCreation(info);
317}
318
319sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
320 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
321 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
322 return NULL;
323 }
324 return mBuiltinDisplays[id];
325}
326
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000327void SurfaceFlinger::bootFinished()
328{
Wei Wangf9b05ee2017-07-19 20:59:39 -0700329 if (mStartPropertySetThread->join() != NO_ERROR) {
330 ALOGE("Join StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800331 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000332 const nsecs_t now = systemTime();
333 const nsecs_t duration = now - mBootTime;
334 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
335 mBootFinished = true;
336
337 // wait patiently for the window manager death
338 const String16 name("window");
339 sp<IBinder> window(defaultServiceManager()->getService(name));
340 if (window != 0) {
341 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
342 }
343
344 // stop boot animation
345 // formerly we would just kill the process, but we now ask it to exit so it
346 // can choose where to stop the animation.
347 property_set("service.bootanim.exit", "1");
348
349 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
350 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
351 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
352}
353
354void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
355 class MessageDestroyGLTexture : public MessageBase {
356 RenderEngine& engine;
357 uint32_t texture;
358 public:
359 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
360 : engine(engine), texture(texture) {
361 }
362 virtual bool handler() {
363 engine.deleteTextures(1, &texture);
364 return true;
365 }
366 };
367 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
368}
369
370class DispSyncSource : public VSyncSource, private DispSync::Callback {
371public:
372 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
373 const char* name) :
374 mName(name),
375 mValue(0),
376 mTraceVsync(traceVsync),
377 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
378 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
379 mDispSync(dispSync),
380 mCallbackMutex(),
381 mCallback(),
382 mVsyncMutex(),
383 mPhaseOffset(phaseOffset),
384 mEnabled(false) {}
385
386 virtual ~DispSyncSource() {}
387
388 virtual void setVSyncEnabled(bool enable) {
389 Mutex::Autolock lock(mVsyncMutex);
390 if (enable) {
391 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
392 static_cast<DispSync::Callback*>(this));
393 if (err != NO_ERROR) {
394 ALOGE("error registering vsync callback: %s (%d)",
395 strerror(-err), err);
396 }
397 //ATRACE_INT(mVsyncOnLabel.string(), 1);
398 } else {
399 status_t err = mDispSync->removeEventListener(
400 static_cast<DispSync::Callback*>(this));
401 if (err != NO_ERROR) {
402 ALOGE("error unregistering vsync callback: %s (%d)",
403 strerror(-err), err);
404 }
405 //ATRACE_INT(mVsyncOnLabel.string(), 0);
406 }
407 mEnabled = enable;
408 }
409
410 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
411 Mutex::Autolock lock(mCallbackMutex);
412 mCallback = callback;
413 }
414
415 virtual void setPhaseOffset(nsecs_t phaseOffset) {
416 Mutex::Autolock lock(mVsyncMutex);
417
418 // Normalize phaseOffset to [0, period)
419 auto period = mDispSync->getPeriod();
420 phaseOffset %= period;
421 if (phaseOffset < 0) {
422 // If we're here, then phaseOffset is in (-period, 0). After this
423 // operation, it will be in (0, period)
424 phaseOffset += period;
425 }
426 mPhaseOffset = phaseOffset;
427
428 // If we're not enabled, we don't need to mess with the listeners
429 if (!mEnabled) {
430 return;
431 }
432
433 // Remove the listener with the old offset
434 status_t err = mDispSync->removeEventListener(
435 static_cast<DispSync::Callback*>(this));
436 if (err != NO_ERROR) {
437 ALOGE("error unregistering vsync callback: %s (%d)",
438 strerror(-err), err);
439 }
440
441 // Add a listener with the new offset
442 err = mDispSync->addEventListener(mName, mPhaseOffset,
443 static_cast<DispSync::Callback*>(this));
444 if (err != NO_ERROR) {
445 ALOGE("error registering vsync callback: %s (%d)",
446 strerror(-err), err);
447 }
448 }
449
450private:
451 virtual void onDispSyncEvent(nsecs_t when) {
452 sp<VSyncSource::Callback> callback;
453 {
454 Mutex::Autolock lock(mCallbackMutex);
455 callback = mCallback;
456
457 if (mTraceVsync) {
458 mValue = (mValue + 1) % 2;
459 ATRACE_INT(mVsyncEventLabel.string(), mValue);
460 }
461 }
462
463 if (callback != NULL) {
464 callback->onVSyncEvent(when);
465 }
466 }
467
468 const char* const mName;
469
470 int mValue;
471
472 const bool mTraceVsync;
473 const String8 mVsyncOnLabel;
474 const String8 mVsyncEventLabel;
475
476 DispSync* mDispSync;
477
478 Mutex mCallbackMutex; // Protects the following
479 sp<VSyncSource::Callback> mCallback;
480
481 Mutex mVsyncMutex; // Protects the following
482 nsecs_t mPhaseOffset;
483 bool mEnabled;
484};
485
486class InjectVSyncSource : public VSyncSource {
487public:
488 InjectVSyncSource() {}
489
490 virtual ~InjectVSyncSource() {}
491
492 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
493 std::lock_guard<std::mutex> lock(mCallbackMutex);
494 mCallback = callback;
495 }
496
497 virtual void onInjectSyncEvent(nsecs_t when) {
498 std::lock_guard<std::mutex> lock(mCallbackMutex);
499 mCallback->onVSyncEvent(when);
500 }
501
502 virtual void setVSyncEnabled(bool) {}
503 virtual void setPhaseOffset(nsecs_t) {}
504
505private:
506 std::mutex mCallbackMutex; // Protects the following
507 sp<VSyncSource::Callback> mCallback;
508};
509
Wei Wangf9b05ee2017-07-19 20:59:39 -0700510// Do not call property_set on main thread which will be blocked by init
511// Use StartPropertySetThread instead.
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000512void SurfaceFlinger::init() {
513 ALOGI( "SurfaceFlinger's main thread ready to run. "
514 "Initializing graphics H/W...");
515
516 Mutex::Autolock _l(mStateLock);
517
518 // initialize EGL for the default display
519 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
520 eglInitialize(mEGLDisplay, NULL, NULL);
521
522 // start the EventThread
523 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
524 vsyncPhaseOffsetNs, true, "app");
525 mEventThread = new EventThread(vsyncSrc, *this, false);
526 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
527 sfVsyncPhaseOffsetNs, true, "sf");
528 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
529 mEventQueue.setEventThread(mSFEventThread);
530
Tim Murray22752852017-05-04 13:38:49 -0700531 // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000532 struct sched_param param = {0};
533 param.sched_priority = 2;
534 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
535 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
536 }
Tim Murray22752852017-05-04 13:38:49 -0700537 if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, &param) != 0) {
538 ALOGE("Couldn't set SCHED_FIFO for EventThread");
539 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000540
541 // Initialize the H/W composer object. There may or may not be an
542 // actual hardware composer underneath.
Steven Thomasb02664d2017-07-26 18:48:28 -0700543 mHwc.reset(new HWComposer(this,
544 *static_cast<HWComposer::EventHandler *>(this)));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000545
546 // get a RenderEngine for the given display / config (can't fail)
Kalle Raitabbdcf1f2017-05-22 15:47:46 -0700547 mRenderEngine = RenderEngine::create(mEGLDisplay,
548 mHwc->getVisualID(), 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000549
550 // retrieve the EGL context that was selected/created
551 mEGLContext = mRenderEngine->getEGLContext();
552
553 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
554 "couldn't create EGLContext");
555
556 // initialize our non-virtual displays
557 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
558 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
559 // set-up the displays that are already connected
560 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
561 // All non-virtual displays are currently considered secure.
562 bool isSecure = true;
563 createBuiltinDisplayLocked(type);
564 wp<IBinder> token = mBuiltinDisplays[i];
565
566 sp<IGraphicBufferProducer> producer;
567 sp<IGraphicBufferConsumer> consumer;
Mathias Agopian0556d792017-03-22 15:49:32 -0700568 BufferQueue::createBufferQueue(&producer, &consumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000569
570 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
571 consumer);
572 int32_t hwcId = allocateHwcDisplayId(type);
573 sp<DisplayDevice> hw = new DisplayDevice(this,
574 type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
575 fbs, producer,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -0600576 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000577 if (i > DisplayDevice::DISPLAY_PRIMARY) {
578 // FIXME: currently we don't get blank/unblank requests
579 // for displays other than the main display, so we always
580 // assume a connected display is unblanked.
581 ALOGD("marking display %zu as acquired/unblanked", i);
582 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
583 }
584 mDisplays.add(token, hw);
585 }
586 }
587
588 // make the GLContext current so that we can create textures when creating Layers
589 // (which may happens before we render something)
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -0700590 getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000591
592 mEventControlThread = new EventControlThread(this);
593 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
594
595 // set a fake vsync period if there is no HWComposer
596 if (mHwc->initCheck() != NO_ERROR) {
597 mPrimaryDispSync.setPeriod(16666667);
598 }
599
600 // initialize our drawing state
601 mDrawingState = mCurrentState;
602
603 // set initial conditions (e.g. unblank default device)
604 initializeDisplays();
605
606 mRenderEngine->primeCache();
607
Wei Wangf9b05ee2017-07-19 20:59:39 -0700608 // Inform native graphics APIs that the present timestamp is NOT supported:
609 mStartPropertySetThread = new StartPropertySetThread(false);
610 if (mStartPropertySetThread->Start() != NO_ERROR) {
611 ALOGE("Run StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800612 }
613
614 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000615}
616
617int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
618 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
619 type : mHwc->allocateDisplayId();
620}
621
622void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800623 // Start boot animation service by setting a property mailbox
624 // if property setting thread is already running, Start() will be just a NOP
Wei Wangf9b05ee2017-07-19 20:59:39 -0700625 mStartPropertySetThread->Start();
Wei Wangb254fa32017-01-31 17:43:23 -0800626 // Wait until property was set
Wei Wangf9b05ee2017-07-19 20:59:39 -0700627 if (mStartPropertySetThread->join() != NO_ERROR) {
628 ALOGE("Join StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800629 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000630}
631
632size_t SurfaceFlinger::getMaxTextureSize() const {
633 return mRenderEngine->getMaxTextureSize();
634}
635
636size_t SurfaceFlinger::getMaxViewportDims() const {
637 return mRenderEngine->getMaxViewportDims();
638}
639
640// ----------------------------------------------------------------------------
641
642bool SurfaceFlinger::authenticateSurfaceTexture(
643 const sp<IGraphicBufferProducer>& bufferProducer) const {
644 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800645 return authenticateSurfaceTextureLocked(bufferProducer);
646}
647
648bool SurfaceFlinger::authenticateSurfaceTextureLocked(
649 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000650 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
651 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
652}
653
Brian Anderson6b376712017-04-04 10:51:39 -0700654status_t SurfaceFlinger::getSupportedFrameTimestamps(
655 std::vector<FrameEvent>* outSupported) const {
656 *outSupported = {
657 FrameEvent::REQUESTED_PRESENT,
658 FrameEvent::ACQUIRE,
659 FrameEvent::LATCH,
660 FrameEvent::FIRST_REFRESH_START,
661 FrameEvent::LAST_REFRESH_START,
662 FrameEvent::GPU_COMPOSITION_DONE,
663 FrameEvent::DEQUEUE_READY,
664 FrameEvent::RELEASE,
665 };
666 return NO_ERROR;
667}
668
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000669status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
670 Vector<DisplayInfo>* configs) {
671 if ((configs == NULL) || (display.get() == NULL)) {
672 return BAD_VALUE;
673 }
674
675 int32_t type = getDisplayType(display);
676 if (type < 0) return type;
677
678 // TODO: Not sure if display density should handled by SF any longer
679 class Density {
680 static int getDensityFromProperty(char const* propName) {
681 char property[PROPERTY_VALUE_MAX];
682 int density = 0;
683 if (property_get(propName, property, NULL) > 0) {
684 density = atoi(property);
685 }
686 return density;
687 }
688 public:
689 static int getEmuDensity() {
690 return getDensityFromProperty("qemu.sf.lcd_density"); }
691 static int getBuildDensity() {
692 return getDensityFromProperty("ro.sf.lcd_density"); }
693 };
694
695 configs->clear();
696
697 const Vector<HWComposer::DisplayConfig>& hwConfigs =
698 getHwComposer().getConfigs(type);
699 for (size_t c = 0; c < hwConfigs.size(); ++c) {
700 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
701 DisplayInfo info = DisplayInfo();
702
703 float xdpi = hwConfig.xdpi;
704 float ydpi = hwConfig.ydpi;
705
706 if (type == DisplayDevice::DISPLAY_PRIMARY) {
707 // The density of the device is provided by a build property
708 float density = Density::getBuildDensity() / 160.0f;
709 if (density == 0) {
710 // the build doesn't provide a density -- this is wrong!
711 // use xdpi instead
712 ALOGE("ro.sf.lcd_density must be defined as a build property");
713 density = xdpi / 160.0f;
714 }
715 if (Density::getEmuDensity()) {
716 // if "qemu.sf.lcd_density" is specified, it overrides everything
717 xdpi = ydpi = density = Density::getEmuDensity();
718 density /= 160.0f;
719 }
720 info.density = density;
721
722 // TODO: this needs to go away (currently needed only by webkit)
723 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
724 info.orientation = hw->getOrientation();
725 } else {
726 // TODO: where should this value come from?
727 static const int TV_DENSITY = 213;
728 info.density = TV_DENSITY / 160.0f;
729 info.orientation = 0;
730 }
731
732 info.w = hwConfig.width;
733 info.h = hwConfig.height;
734 info.xdpi = xdpi;
735 info.ydpi = ydpi;
736 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800737 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000738
739 // This is how far in advance a buffer must be queued for
740 // presentation at a given time. If you want a buffer to appear
741 // on the screen at time N, you must submit the buffer before
742 // (N - presentationDeadline).
743 //
744 // Normally it's one full refresh period (to give SF a chance to
745 // latch the buffer), but this can be reduced by configuring a
746 // DispSync offset. Any additional delays introduced by the hardware
747 // composer or panel must be accounted for here.
748 //
749 // We add an additional 1ms to allow for processing time and
750 // differences between the ideal and actual refresh rate.
751 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800752 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000753
754 // All non-virtual displays are currently considered secure.
755 info.secure = true;
756
757 configs->push_back(info);
758 }
759
760 return NO_ERROR;
761}
762
763status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
764 DisplayStatInfo* stats) {
765 if (stats == NULL) {
766 return BAD_VALUE;
767 }
768
769 // FIXME for now we always return stats for the primary display
770 memset(stats, 0, sizeof(*stats));
771 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
772 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
773 return NO_ERROR;
774}
775
776int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -0700777 sp<const DisplayDevice> device(getDisplayDevice(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000778 if (device != NULL) {
779 return device->getActiveConfig();
780 }
781 return BAD_VALUE;
782}
783
784void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
785 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
786 this);
787 int32_t type = hw->getDisplayType();
788 int currentMode = hw->getActiveConfig();
789
790 if (mode == currentMode) {
791 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
792 return;
793 }
794
795 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
796 ALOGW("Trying to set config for virtual display");
797 return;
798 }
799
800 hw->setActiveConfig(mode);
801 getHwComposer().setActiveConfig(type, mode);
802}
803
804status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
805 class MessageSetActiveConfig: public MessageBase {
806 SurfaceFlinger& mFlinger;
807 sp<IBinder> mDisplay;
808 int mMode;
809 public:
810 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
811 int mode) :
812 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
813 virtual bool handler() {
814 Vector<DisplayInfo> configs;
815 mFlinger.getDisplayConfigs(mDisplay, &configs);
816 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
817 ALOGE("Attempt to set active config = %d for display with %zu configs",
818 mMode, configs.size());
819 }
820 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
821 if (hw == NULL) {
822 ALOGE("Attempt to set active config = %d for null display %p",
823 mMode, mDisplay.get());
824 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
825 ALOGW("Attempt to set active config = %d for virtual display",
826 mMode);
827 } else {
828 mFlinger.setActiveConfigInternal(hw, mMode);
829 }
830 return true;
831 }
832 };
833 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
834 postMessageSync(msg);
835 return NO_ERROR;
836}
837
838status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
839 Vector<android_color_mode_t>* outColorModes) {
840 if (outColorModes == nullptr || display.get() == nullptr) {
841 return BAD_VALUE;
842 }
843
844 int32_t type = getDisplayType(display);
845 if (type < 0) return type;
846
847 std::set<android_color_mode_t> colorModes;
848 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
849 colorModes.insert(hwConfig.colorMode);
850 }
851
852 outColorModes->clear();
853 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
854
855 return NO_ERROR;
856}
857
858android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
859 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
860
861 int32_t type = getDisplayType(display);
862 if (type < 0) return static_cast<android_color_mode_t>(type);
863
864 return getHwComposer().getColorMode(type);
865}
866
867status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
868 android_color_mode_t colorMode) {
869 if (display.get() == nullptr || colorMode < 0) {
870 return BAD_VALUE;
871 }
872
873 int32_t type = getDisplayType(display);
874 if (type < 0) return type;
875 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
876 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
877 desiredConfig.colorMode = colorMode;
878 for (size_t c = 0; c < hwConfigs.size(); ++c) {
879 const HWComposer::DisplayConfig config = hwConfigs[c];
880 if (config == desiredConfig) {
881 return setActiveConfig(display, c);
882 }
883 }
884 return BAD_VALUE;
885}
886
887status_t SurfaceFlinger::clearAnimationFrameStats() {
888 Mutex::Autolock _l(mStateLock);
889 mAnimFrameTracker.clearStats();
890 return NO_ERROR;
891}
892
893status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
894 Mutex::Autolock _l(mStateLock);
895 mAnimFrameTracker.getStats(outStats);
896 return NO_ERROR;
897}
898
899status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
900 HdrCapabilities* outCapabilities) const {
901 // HWC1 does not provide HDR capabilities
902 *outCapabilities = HdrCapabilities();
903 return NO_ERROR;
904}
905
906status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
907 if (enable == mInjectVSyncs) {
908 return NO_ERROR;
909 }
910
911 if (enable) {
912 mInjectVSyncs = enable;
913 ALOGV("VSync Injections enabled");
914 if (mVSyncInjector.get() == nullptr) {
915 mVSyncInjector = new InjectVSyncSource();
916 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
917 }
918 mEventQueue.setEventThread(mInjectorEventThread);
919 } else {
920 mInjectVSyncs = enable;
921 ALOGV("VSync Injections disabled");
922 mEventQueue.setEventThread(mSFEventThread);
923 mVSyncInjector.clear();
924 }
925 return NO_ERROR;
926}
927
928status_t SurfaceFlinger::injectVSync(nsecs_t when) {
929 if (!mInjectVSyncs) {
930 ALOGE("VSync Injections not enabled");
931 return BAD_VALUE;
932 }
933 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
934 ALOGV("Injecting VSync inside SurfaceFlinger");
935 mVSyncInjector->onInjectSyncEvent(when);
936 }
937 return NO_ERROR;
938}
939
Kalle Raitaa099a242017-01-11 11:17:29 -0800940status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const {
941 IPCThreadState* ipc = IPCThreadState::self();
942 const int pid = ipc->getCallingPid();
943 const int uid = ipc->getCallingUid();
944 if ((uid != AID_SHELL) &&
945 !PermissionCache::checkPermission(sDump, pid, uid)) {
946 ALOGE("Layer debug info permission denied for pid=%d, uid=%d", pid, uid);
947 return PERMISSION_DENIED;
948 }
949
950 // Try to acquire a lock for 1s, fail gracefully
951 status_t err = mStateLock.timedLock(s2ns(1));
952 bool locked = (err == NO_ERROR);
953 if (!locked) {
954 ALOGE("LayerDebugInfo: SurfaceFlinger unresponsive (%s [%d]) - exit", strerror(-err), err);
955 return TIMED_OUT;
956 }
957
958 outLayers->clear();
959 mCurrentState.traverseInZOrder([&](Layer* layer) {
960 outLayers->push_back(layer->getLayerDebugInfo());
961 });
962
963 mStateLock.unlock();
964
965 return NO_ERROR;
966}
967
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000968// ----------------------------------------------------------------------------
969
Jorim Jaggiaaef0982017-06-08 23:55:29 -0700970sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
971 ISurfaceComposer::VsyncSource vsyncSource) {
972 if (vsyncSource == eVsyncSourceSurfaceFlinger) {
973 return mSFEventThread->createEventConnection();
974 } else {
975 return mEventThread->createEventConnection();
976 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000977}
978
979// ----------------------------------------------------------------------------
980
981void SurfaceFlinger::waitForEvent() {
982 mEventQueue.waitMessage();
983}
984
985void SurfaceFlinger::signalTransaction() {
986 mEventQueue.invalidate();
987}
988
989void SurfaceFlinger::signalLayerUpdate() {
990 mEventQueue.invalidate();
991}
992
993void SurfaceFlinger::signalRefresh() {
994 mEventQueue.refresh();
995}
996
997status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
998 nsecs_t reltime, uint32_t /* flags */) {
999 return mEventQueue.postMessage(msg, reltime);
1000}
1001
1002status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
1003 nsecs_t reltime, uint32_t /* flags */) {
1004 status_t res = mEventQueue.postMessage(msg, reltime);
1005 if (res == NO_ERROR) {
1006 msg->wait();
1007 }
1008 return res;
1009}
1010
1011void SurfaceFlinger::run() {
1012 do {
1013 waitForEvent();
1014 } while (true);
1015}
1016
1017void SurfaceFlinger::enableHardwareVsync() {
1018 Mutex::Autolock _l(mHWVsyncLock);
1019 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
1020 mPrimaryDispSync.beginResync();
1021 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1022 mEventControlThread->setVsyncEnabled(true);
1023 mPrimaryHWVsyncEnabled = true;
1024 }
1025}
1026
1027void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
1028 Mutex::Autolock _l(mHWVsyncLock);
1029
1030 if (makeAvailable) {
1031 mHWVsyncAvailable = true;
1032 } else if (!mHWVsyncAvailable) {
1033 // Hardware vsync is not currently available, so abort the resync
1034 // attempt for now
1035 return;
1036 }
1037
1038 const nsecs_t period =
1039 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1040
1041 mPrimaryDispSync.reset();
1042 mPrimaryDispSync.setPeriod(period);
1043
1044 if (!mPrimaryHWVsyncEnabled) {
1045 mPrimaryDispSync.beginResync();
1046 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1047 mEventControlThread->setVsyncEnabled(true);
1048 mPrimaryHWVsyncEnabled = true;
1049 }
1050}
1051
1052void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1053 Mutex::Autolock _l(mHWVsyncLock);
1054 if (mPrimaryHWVsyncEnabled) {
1055 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1056 mEventControlThread->setVsyncEnabled(false);
1057 mPrimaryDispSync.endResync();
1058 mPrimaryHWVsyncEnabled = false;
1059 }
1060 if (makeUnavailable) {
1061 mHWVsyncAvailable = false;
1062 }
1063}
1064
1065void SurfaceFlinger::resyncWithRateLimit() {
1066 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1067 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1068 resyncToHardwareVsync(false);
1069 }
1070}
1071
Steven Thomas3cfac282017-02-06 12:29:30 -08001072void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1073 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001074 bool needsHwVsync = false;
1075
1076 { // Scope for the lock
1077 Mutex::Autolock _l(mHWVsyncLock);
1078 if (type == 0 && mPrimaryHWVsyncEnabled) {
1079 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1080 }
1081 }
1082
1083 if (needsHwVsync) {
1084 enableHardwareVsync();
1085 } else {
1086 disableHardwareVsync(false);
1087 }
1088}
1089
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001090void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
Brian Andersond0010582017-03-07 13:20:31 -08001091 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001092 *compositorTiming = mCompositorTiming;
1093}
1094
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001095void SurfaceFlinger::onHotplugReceived(HWComposer* /*composer*/, int type, bool connected) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001096 if (mEventThread == NULL) {
1097 // This is a temporary workaround for b/7145521. A non-null pointer
1098 // does not mean EventThread has finished initializing, so this
1099 // is not a correct fix.
1100 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1101 return;
1102 }
1103
1104 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1105 Mutex::Autolock _l(mStateLock);
1106 if (connected) {
1107 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1108 } else {
1109 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1110 mBuiltinDisplays[type].clear();
1111 }
1112 setTransactionFlags(eDisplayTransactionNeeded);
1113
1114 // Defer EventThread notification until SF has updated mDisplays.
1115 }
1116}
1117
Steven Thomas3cfac282017-02-06 12:29:30 -08001118void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1119 repaintEverything();
1120}
1121
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001122void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1123 ATRACE_CALL();
1124 getHwComposer().eventControl(disp, event, enabled);
1125}
1126
1127void SurfaceFlinger::onMessageReceived(int32_t what) {
1128 ATRACE_CALL();
1129 switch (what) {
1130 case MessageQueue::INVALIDATE: {
1131 bool refreshNeeded = handleMessageTransaction();
1132 refreshNeeded |= handleMessageInvalidate();
1133 refreshNeeded |= mRepaintEverything;
1134 if (refreshNeeded) {
1135 // Signal a refresh if a transaction modified the window state,
1136 // a new buffer was latched, or if HWC has requested a full
1137 // repaint
1138 signalRefresh();
1139 }
1140 break;
1141 }
1142 case MessageQueue::REFRESH: {
1143 handleMessageRefresh();
1144 break;
1145 }
1146 }
1147}
1148
1149bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001150 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001151 if (transactionFlags) {
1152 handleTransaction(transactionFlags);
1153 return true;
1154 }
1155 return false;
1156}
1157
1158bool SurfaceFlinger::handleMessageInvalidate() {
1159 ATRACE_CALL();
1160 return handlePageFlip();
1161}
1162
1163void SurfaceFlinger::handleMessageRefresh() {
1164 ATRACE_CALL();
1165
1166 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1167
Brian Andersond6927fb2016-07-23 23:37:30 -07001168 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001169 rebuildLayerStacks();
1170 setUpHWComposer();
1171 doDebugFlashRegions();
1172 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001173 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001174}
1175
1176void SurfaceFlinger::doDebugFlashRegions()
1177{
1178 // is debugging enabled
1179 if (CC_LIKELY(!mDebugRegion))
1180 return;
1181
1182 const bool repaintEverything = mRepaintEverything;
1183 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1184 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1185 if (hw->isDisplayOn()) {
1186 // transform the dirty region into this screen's coordinate space
1187 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1188 if (!dirtyRegion.isEmpty()) {
1189 // redraw the whole screen
1190 doComposeSurfaces(hw, Region(hw->bounds()));
1191
1192 // and draw the dirty region
1193 const int32_t height = hw->getHeight();
1194 RenderEngine& engine(getRenderEngine());
1195 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1196
1197 hw->compositionComplete();
1198 hw->swapBuffers(getHwComposer());
1199 }
1200 }
1201 }
1202
1203 postFramebuffer();
1204
1205 if (mDebugRegion > 1) {
1206 usleep(mDebugRegion * 1000);
1207 }
1208
1209 HWComposer& hwc(getHwComposer());
1210 if (hwc.initCheck() == NO_ERROR) {
1211 status_t err = hwc.prepare();
1212 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1213 }
1214}
1215
Brian Andersond6927fb2016-07-23 23:37:30 -07001216void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001217{
1218 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001219 mDrawingState.traverseInZOrder([&](Layer* layer) {
1220 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001221 needExtraInvalidate = true;
1222 }
Robert Carr2047fae2016-11-28 14:09:09 -08001223 });
1224
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001225 if (needExtraInvalidate) {
1226 signalLayerUpdate();
1227 }
1228}
1229
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001230void SurfaceFlinger::updateCompositorTiming(
1231 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1232 std::shared_ptr<FenceTime>& presentFenceTime) {
1233 // Update queue of past composite+present times and determine the
1234 // most recently known composite to present latency.
1235 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1236 nsecs_t compositeToPresentLatency = -1;
1237 while (!mCompositePresentTimes.empty()) {
1238 CompositePresentTime& cpt = mCompositePresentTimes.front();
1239 // Cached values should have been updated before calling this method,
1240 // which helps avoid duplicate syscalls.
1241 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1242 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1243 break;
1244 }
1245 compositeToPresentLatency = displayTime - cpt.composite;
1246 mCompositePresentTimes.pop();
1247 }
1248
1249 // Don't let mCompositePresentTimes grow unbounded, just in case.
1250 while (mCompositePresentTimes.size() > 16) {
1251 mCompositePresentTimes.pop();
1252 }
1253
Brian Andersond0010582017-03-07 13:20:31 -08001254 setCompositorTimingSnapped(
1255 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1256}
1257
1258void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1259 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001260 // Integer division and modulo round toward 0 not -inf, so we need to
1261 // treat negative and positive offsets differently.
Brian Andersond0010582017-03-07 13:20:31 -08001262 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001263 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1264 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1265
Brian Andersond0010582017-03-07 13:20:31 -08001266 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1267 if (idealLatency <= 0) {
1268 idealLatency = vsyncInterval;
1269 }
1270
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001271 // Snap the latency to a value that removes scheduling jitter from the
1272 // composition and present times, which often have >1ms of jitter.
1273 // Reducing jitter is important if an app attempts to extrapolate
1274 // something (such as user input) to an accurate diasplay time.
1275 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1276 // with (presentLatency % interval).
Brian Andersond0010582017-03-07 13:20:31 -08001277 nsecs_t bias = vsyncInterval / 2;
1278 int64_t extraVsyncs =
1279 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1280 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1281 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001282
Brian Andersond0010582017-03-07 13:20:31 -08001283 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001284 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1285 mCompositorTiming.interval = vsyncInterval;
Brian Andersond0010582017-03-07 13:20:31 -08001286 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001287}
1288
1289void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001290{
Brian Andersond6927fb2016-07-23 23:37:30 -07001291 const HWComposer& hwc = getHwComposer();
1292 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1293
Brian Andersonfbc80ae2017-05-26 16:23:54 -07001294 mGlCompositionDoneTimeline.updateSignalTimes();
Brian Anderson3d4039d2016-09-23 16:31:30 -07001295 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1296 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1297 glCompositionDoneFenceTime =
1298 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1299 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1300 } else {
1301 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1302 }
Brian Anderson3d4039d2016-09-23 16:31:30 -07001303
Brian Andersonfbc80ae2017-05-26 16:23:54 -07001304 mDisplayTimeline.updateSignalTimes();
Brian Anderson4e606e32017-03-16 15:34:57 -07001305 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1306 auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
Brian Anderson3d4039d2016-09-23 16:31:30 -07001307 mDisplayTimeline.push(retireFenceTime);
Brian Andersond6927fb2016-07-23 23:37:30 -07001308
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001309 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1310 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1311
1312 // We use the refreshStartTime which might be sampled a little later than
1313 // when we started doing work for this frame, but that should be okay
1314 // since updateCompositorTiming has snapping logic.
1315 updateCompositorTiming(
1316 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
Brian Andersond0010582017-03-07 13:20:31 -08001317 CompositorTiming compositorTiming;
1318 {
1319 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1320 compositorTiming = mCompositorTiming;
1321 }
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001322
Robert Carr2047fae2016-11-28 14:09:09 -08001323 mDrawingState.traverseInZOrder([&](Layer* layer) {
Brian Anderson4e606e32017-03-16 15:34:57 -07001324 // TODO(brianderson): The retire fence is incorrectly passed in as the
1325 // present fence. Fix this if this file lives on.
Robert Carr2047fae2016-11-28 14:09:09 -08001326 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson4e606e32017-03-16 15:34:57 -07001327 retireFenceTime, compositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001328 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001329 recordBufferingStats(layer->getName().string(),
1330 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001331 }
Robert Carr2047fae2016-11-28 14:09:09 -08001332 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001333
Brian Anderson4e606e32017-03-16 15:34:57 -07001334 if (retireFence->isValid()) {
Brian Andersonfbc80ae2017-05-26 16:23:54 -07001335 if (mPrimaryDispSync.addPresentFence(retireFenceTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001336 enableHardwareVsync();
1337 } else {
1338 disableHardwareVsync(false);
1339 }
1340 }
1341
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08001342 if (!hasSyncFramework) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001343 if (hw->isDisplayOn()) {
1344 enableHardwareVsync();
1345 }
1346 }
1347
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001348 if (mAnimCompositionPending) {
1349 mAnimCompositionPending = false;
1350
Brian Anderson3d4039d2016-09-23 16:31:30 -07001351 if (retireFenceTime->isValid()) {
1352 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001353 } else {
1354 // The HWC doesn't support present fences, so use the refresh
1355 // timestamp instead.
1356 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1357 mAnimFrameTracker.setActualPresentTime(presentTime);
1358 }
1359 mAnimFrameTracker.advanceFrame();
1360 }
1361
1362 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1363 return;
1364 }
1365
1366 nsecs_t currentTime = systemTime();
1367 if (mHasPoweredOff) {
1368 mHasPoweredOff = false;
1369 } else {
1370 nsecs_t period = mPrimaryDispSync.getPeriod();
1371 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1372 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1373 if (numPeriods < NUM_BUCKETS - 1) {
1374 mFrameBuckets[numPeriods] += elapsedTime;
1375 } else {
1376 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1377 }
1378 mTotalTime += elapsedTime;
1379 }
1380 mLastSwapTime = currentTime;
1381}
1382
1383void SurfaceFlinger::rebuildLayerStacks() {
1384 // rebuild the visible layer list per screen
1385 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1386 ATRACE_CALL();
1387 mVisibleRegionsDirty = false;
1388 invalidateHwcGeometry();
1389
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001390 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1391 Region opaqueRegion;
1392 Region dirtyRegion;
1393 Vector< sp<Layer> > layersSortedByZ;
1394 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1395 const Transform& tr(hw->getTransform());
1396 const Rect bounds(hw->getBounds());
1397 if (hw->isDisplayOn()) {
Chia-I Wuab0c3192017-08-01 11:29:00 -07001398 computeVisibleRegions(hw, dirtyRegion, opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001399
Robert Carr2047fae2016-11-28 14:09:09 -08001400 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001401 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001402 Region drawRegion(tr.transform(
1403 layer->visibleNonTransparentRegion));
1404 drawRegion.andSelf(bounds);
1405 if (!drawRegion.isEmpty()) {
1406 layersSortedByZ.add(layer);
1407 }
1408 }
Robert Carr2047fae2016-11-28 14:09:09 -08001409 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001410 }
1411 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1412 hw->undefinedRegion.set(bounds);
1413 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1414 hw->dirtyRegion.orSelf(dirtyRegion);
1415 }
1416 }
1417}
1418
1419void SurfaceFlinger::setUpHWComposer() {
1420 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1421 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1422 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1423 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1424
1425 // If nothing has changed (!dirty), don't recompose.
1426 // If something changed, but we don't currently have any visible layers,
1427 // and didn't when we last did a composition, then skip it this time.
1428 // The second rule does two things:
1429 // - When all layers are removed from a display, we'll emit one black
1430 // frame, then nothing more until we get new layers.
1431 // - When a display is created with a private layer stack, we won't
1432 // emit any black frames until a layer is added to the layer stack.
1433 bool mustRecompose = dirty && !(empty && wasEmpty);
1434
1435 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1436 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1437 mustRecompose ? "doing" : "skipping",
1438 dirty ? "+" : "-",
1439 empty ? "+" : "-",
1440 wasEmpty ? "+" : "-");
1441
1442 mDisplays[dpy]->beginFrame(mustRecompose);
1443
1444 if (mustRecompose) {
1445 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1446 }
1447 }
1448
1449 HWComposer& hwc(getHwComposer());
1450 if (hwc.initCheck() == NO_ERROR) {
1451 // build the h/w work list
1452 if (CC_UNLIKELY(mHwWorkListDirty)) {
1453 mHwWorkListDirty = false;
1454 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1455 sp<const DisplayDevice> hw(mDisplays[dpy]);
1456 const int32_t id = hw->getHwcDisplayId();
1457 if (id >= 0) {
1458 const Vector< sp<Layer> >& currentLayers(
1459 hw->getVisibleLayersSortedByZ());
1460 const size_t count = currentLayers.size();
1461 if (hwc.createWorkList(id, count) == NO_ERROR) {
1462 HWComposer::LayerListIterator cur = hwc.begin(id);
1463 const HWComposer::LayerListIterator end = hwc.end(id);
1464 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1465 const sp<Layer>& layer(currentLayers[i]);
1466 layer->setGeometry(hw, *cur);
1467 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1468 cur->setSkip(true);
1469 }
1470 }
1471 }
1472 }
1473 }
1474 }
1475
1476 // set the per-frame data
1477 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1478 sp<const DisplayDevice> hw(mDisplays[dpy]);
1479 const int32_t id = hw->getHwcDisplayId();
1480 if (id >= 0) {
1481 const Vector< sp<Layer> >& currentLayers(
1482 hw->getVisibleLayersSortedByZ());
1483 const size_t count = currentLayers.size();
1484 HWComposer::LayerListIterator cur = hwc.begin(id);
1485 const HWComposer::LayerListIterator end = hwc.end(id);
1486 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1487 /*
1488 * update the per-frame h/w composer data for each layer
1489 * and build the transparent region of the FB
1490 */
1491 const sp<Layer>& layer(currentLayers[i]);
1492 layer->setPerFrameData(hw, *cur);
1493 }
1494 }
1495 }
1496
1497 // If possible, attempt to use the cursor overlay on each display.
1498 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1499 sp<const DisplayDevice> hw(mDisplays[dpy]);
1500 const int32_t id = hw->getHwcDisplayId();
1501 if (id >= 0) {
1502 const Vector< sp<Layer> >& currentLayers(
1503 hw->getVisibleLayersSortedByZ());
1504 const size_t count = currentLayers.size();
1505 HWComposer::LayerListIterator cur = hwc.begin(id);
1506 const HWComposer::LayerListIterator end = hwc.end(id);
1507 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1508 const sp<Layer>& layer(currentLayers[i]);
1509 if (layer->isPotentialCursor()) {
1510 cur->setIsCursorLayerHint();
1511 break;
1512 }
1513 }
1514 }
1515 }
1516
1517 status_t err = hwc.prepare();
1518 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1519
1520 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1521 sp<const DisplayDevice> hw(mDisplays[dpy]);
1522 hw->prepareFrame(hwc);
1523 }
1524 }
1525}
1526
1527void SurfaceFlinger::doComposition() {
1528 ATRACE_CALL();
1529 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1530 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1531 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1532 if (hw->isDisplayOn()) {
1533 // transform the dirty region into this screen's coordinate space
1534 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1535
1536 // repaint the framebuffer (if needed)
1537 doDisplayComposition(hw, dirtyRegion);
1538
1539 hw->dirtyRegion.clear();
1540 hw->flip(hw->swapRegion);
1541 hw->swapRegion.clear();
1542 }
1543 // inform the h/w that we're done compositing
1544 hw->compositionComplete();
1545 }
1546 postFramebuffer();
1547}
1548
1549void SurfaceFlinger::postFramebuffer()
1550{
1551 ATRACE_CALL();
1552
1553 const nsecs_t now = systemTime();
1554 mDebugInSwapBuffers = now;
1555
1556 HWComposer& hwc(getHwComposer());
1557 if (hwc.initCheck() == NO_ERROR) {
1558 if (!hwc.supportsFramebufferTarget()) {
1559 // EGL spec says:
1560 // "surface must be bound to the calling thread's current context,
1561 // for the current rendering API."
1562 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1563 }
1564 hwc.commit();
1565 }
1566
1567 // make the default display current because the VirtualDisplayDevice code cannot
1568 // deal with dequeueBuffer() being called outside of the composition loop; however
1569 // the code below can call glFlush() which is allowed (and does in some case) call
1570 // dequeueBuffer().
1571 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1572
1573 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1574 sp<const DisplayDevice> hw(mDisplays[dpy]);
1575 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1576 hw->onSwapBuffersCompleted(hwc);
1577 const size_t count = currentLayers.size();
1578 int32_t id = hw->getHwcDisplayId();
1579 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1580 HWComposer::LayerListIterator cur = hwc.begin(id);
1581 const HWComposer::LayerListIterator end = hwc.end(id);
1582 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1583 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1584 }
1585 } else {
1586 for (size_t i = 0; i < count; i++) {
1587 currentLayers[i]->onLayerDisplayed(hw, NULL);
1588 }
1589 }
1590 }
1591
1592 mLastSwapBufferTime = systemTime() - now;
1593 mDebugInSwapBuffers = 0;
1594
1595 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1596 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1597 logFrameStats();
1598 }
1599}
1600
1601void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1602{
1603 ATRACE_CALL();
1604
1605 // here we keep a copy of the drawing state (that is the state that's
1606 // going to be overwritten by handleTransactionLocked()) outside of
1607 // mStateLock so that the side-effects of the State assignment
1608 // don't happen with mStateLock held (which can cause deadlocks).
1609 State drawingState(mDrawingState);
1610
1611 Mutex::Autolock _l(mStateLock);
1612 const nsecs_t now = systemTime();
1613 mDebugInTransaction = now;
1614
1615 // Here we're guaranteed that some transaction flags are set
1616 // so we can call handleTransactionLocked() unconditionally.
1617 // We call getTransactionFlags(), which will also clear the flags,
1618 // with mStateLock held to guarantee that mCurrentState won't change
1619 // until the transaction is committed.
1620
1621 transactionFlags = getTransactionFlags(eTransactionMask);
1622 handleTransactionLocked(transactionFlags);
1623
1624 mLastTransactionTime = systemTime() - now;
1625 mDebugInTransaction = 0;
1626 invalidateHwcGeometry();
1627 // here the transaction has been committed
1628}
1629
1630void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1631{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001632 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001633 mCurrentState.traverseInZOrder([](Layer* layer) {
1634 layer->notifyAvailableFrames();
1635 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001636
1637 /*
1638 * Traversal of the children
1639 * (perform the transaction for each of them if needed)
1640 */
1641
1642 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001643 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001644 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001645 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001646
1647 const uint32_t flags = layer->doTransaction(0);
1648 if (flags & Layer::eVisibleRegion)
1649 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001650 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001651 }
1652
1653 /*
1654 * Perform display own transactions if needed
1655 */
1656
1657 if (transactionFlags & eDisplayTransactionNeeded) {
1658 // here we take advantage of Vector's copy-on-write semantics to
1659 // improve performance by skipping the transaction entirely when
1660 // know that the lists are identical
1661 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1662 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1663 if (!curr.isIdenticalTo(draw)) {
1664 mVisibleRegionsDirty = true;
1665 const size_t cc = curr.size();
1666 size_t dc = draw.size();
1667
1668 // find the displays that were removed
1669 // (ie: in drawing state but not in current state)
1670 // also handle displays that changed
1671 // (ie: displays that are in both lists)
1672 for (size_t i=0 ; i<dc ; i++) {
1673 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1674 if (j < 0) {
1675 // in drawing state but not in current state
1676 if (!draw[i].isMainDisplay()) {
1677 // Call makeCurrent() on the primary display so we can
1678 // be sure that nothing associated with this display
1679 // is current.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001680 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001681 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001682 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001683 if (hw != NULL)
1684 hw->disconnect(getHwComposer());
1685 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1686 mEventThread->onHotplugReceived(draw[i].type, false);
1687 mDisplays.removeItem(draw.keyAt(i));
1688 } else {
1689 ALOGW("trying to remove the main display");
1690 }
1691 } else {
1692 // this display is in both lists. see if something changed.
1693 const DisplayDeviceState& state(curr[j]);
1694 const wp<IBinder>& display(curr.keyAt(j));
1695 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1696 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1697 if (state_binder != draw_binder) {
1698 // changing the surface is like destroying and
1699 // recreating the DisplayDevice, so we just remove it
1700 // from the drawing state, so that it get re-added
1701 // below.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001702 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001703 if (hw != NULL)
1704 hw->disconnect(getHwComposer());
1705 mDisplays.removeItem(display);
1706 mDrawingState.displays.removeItemsAt(i);
1707 dc--; i--;
1708 // at this point we must loop to the next item
1709 continue;
1710 }
1711
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001712 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001713 if (disp != NULL) {
1714 if (state.layerStack != draw[i].layerStack) {
1715 disp->setLayerStack(state.layerStack);
1716 }
1717 if ((state.orientation != draw[i].orientation)
1718 || (state.viewport != draw[i].viewport)
1719 || (state.frame != draw[i].frame))
1720 {
1721 disp->setProjection(state.orientation,
1722 state.viewport, state.frame);
1723 }
1724 if (state.width != draw[i].width || state.height != draw[i].height) {
1725 disp->setDisplaySize(state.width, state.height);
1726 }
1727 }
1728 }
1729 }
1730
1731 // find displays that were added
1732 // (ie: in current state but not in drawing state)
1733 for (size_t i=0 ; i<cc ; i++) {
1734 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1735 const DisplayDeviceState& state(curr[i]);
1736
1737 sp<DisplaySurface> dispSurface;
1738 sp<IGraphicBufferProducer> producer;
1739 sp<IGraphicBufferProducer> bqProducer;
1740 sp<IGraphicBufferConsumer> bqConsumer;
Mathias Agopian0556d792017-03-22 15:49:32 -07001741 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001742
1743 int32_t hwcDisplayId = -1;
1744 if (state.isVirtualDisplay()) {
1745 // Virtual displays without a surface are dormant:
1746 // they have external state (layer stack, projection,
1747 // etc.) but no internal state (i.e. a DisplayDevice).
1748 if (state.surface != NULL) {
1749
1750 int width = 0;
1751 int status = state.surface->query(
1752 NATIVE_WINDOW_WIDTH, &width);
1753 ALOGE_IF(status != NO_ERROR,
1754 "Unable to query width (%d)", status);
1755 int height = 0;
1756 status = state.surface->query(
1757 NATIVE_WINDOW_HEIGHT, &height);
1758 ALOGE_IF(status != NO_ERROR,
1759 "Unable to query height (%d)", status);
1760 if (mUseHwcVirtualDisplays &&
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08001761 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1762 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1763 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001764 hwcDisplayId = allocateHwcDisplayId(state.type);
1765 }
1766
1767 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1768 *mHwc, hwcDisplayId, state.surface,
1769 bqProducer, bqConsumer, state.displayName);
1770
1771 dispSurface = vds;
1772 producer = vds;
1773 }
1774 } else {
1775 ALOGE_IF(state.surface!=NULL,
1776 "adding a supported display, but rendering "
1777 "surface is provided (%p), ignoring it",
1778 state.surface.get());
1779 hwcDisplayId = allocateHwcDisplayId(state.type);
1780 // for supported (by hwc) displays we provide our
1781 // own rendering surface
1782 dispSurface = new FramebufferSurface(*mHwc, state.type,
1783 bqConsumer);
1784 producer = bqProducer;
1785 }
1786
1787 const wp<IBinder>& display(curr.keyAt(i));
1788 if (dispSurface != NULL) {
1789 sp<DisplayDevice> hw = new DisplayDevice(this,
1790 state.type, hwcDisplayId,
1791 mHwc->getFormat(hwcDisplayId), state.isSecure,
1792 display, dispSurface, producer,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -06001793 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001794 hw->setLayerStack(state.layerStack);
1795 hw->setProjection(state.orientation,
1796 state.viewport, state.frame);
1797 hw->setDisplayName(state.displayName);
1798 mDisplays.add(display, hw);
1799 if (state.isVirtualDisplay()) {
1800 if (hwcDisplayId >= 0) {
1801 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1802 hw->getWidth(), hw->getHeight(),
1803 hw->getFormat());
1804 }
1805 } else {
1806 mEventThread->onHotplugReceived(state.type, true);
1807 }
1808 }
1809 }
1810 }
1811 }
1812 }
1813
1814 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1815 // The transform hint might have changed for some layers
1816 // (either because a display has changed, or because a layer
1817 // as changed).
1818 //
1819 // Walk through all the layers in currentLayers,
1820 // and update their transform hint.
1821 //
1822 // If a layer is visible only on a single display, then that
1823 // display is used to calculate the hint, otherwise we use the
1824 // default display.
1825 //
1826 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1827 // the hint is set before we acquire a buffer from the surface texture.
1828 //
1829 // NOTE: layer transactions have taken place already, so we use their
1830 // drawing state. However, SurfaceFlinger's own transaction has not
1831 // happened yet, so we must use the current state layer list
1832 // (soon to become the drawing state list).
1833 //
1834 sp<const DisplayDevice> disp;
1835 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001836 bool first = true;
1837 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001838 // NOTE: we rely on the fact that layers are sorted by
1839 // layerStack first (so we don't have to traverse the list
1840 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001841 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001842 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001843 currentlayerStack = layerStack;
1844 // figure out if this layerstack is mirrored
1845 // (more than one display) if so, pick the default display,
1846 // if not, pick the only display it's on.
1847 disp.clear();
1848 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1849 sp<const DisplayDevice> hw(mDisplays[dpy]);
1850 if (hw->getLayerStack() == currentlayerStack) {
1851 if (disp == NULL) {
1852 disp = hw;
1853 } else {
1854 disp = NULL;
1855 break;
1856 }
1857 }
1858 }
1859 }
1860 if (disp == NULL) {
1861 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1862 // redraw after transform hint changes. See bug 8508397.
1863
1864 // could be null when this layer is using a layerStack
1865 // that is not visible on any display. Also can occur at
1866 // screen off/on times.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001867 disp = getDefaultDisplayDeviceLocked();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001868 }
1869 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001870
1871 first = false;
1872 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001873 }
1874
1875
1876 /*
1877 * Perform our own transaction if needed
1878 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001879
1880 if (mLayersAdded) {
1881 mLayersAdded = false;
1882 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001883 mVisibleRegionsDirty = true;
1884 }
1885
1886 // some layers might have been removed, so
1887 // we need to update the regions they're exposing.
1888 if (mLayersRemoved) {
1889 mLayersRemoved = false;
1890 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001891 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001892 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001893 // this layer is not visible anymore
1894 // TODO: we could traverse the tree from front to back and
1895 // compute the actual visible region
1896 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001897 Region visibleReg;
1898 visibleReg.set(layer->computeScreenBounds());
Chia-I Wuab0c3192017-08-01 11:29:00 -07001899 invalidateLayerStack(layer, visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001900 }
Robert Carr2047fae2016-11-28 14:09:09 -08001901 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001902 }
1903
1904 commitTransaction();
1905
1906 updateCursorAsync();
1907}
1908
1909void SurfaceFlinger::updateCursorAsync()
1910{
1911 HWComposer& hwc(getHwComposer());
1912 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1913 sp<const DisplayDevice> hw(mDisplays[dpy]);
1914 const int32_t id = hw->getHwcDisplayId();
1915 if (id < 0) {
1916 continue;
1917 }
1918 const Vector< sp<Layer> >& currentLayers(
1919 hw->getVisibleLayersSortedByZ());
1920 const size_t count = currentLayers.size();
1921 HWComposer::LayerListIterator cur = hwc.begin(id);
1922 const HWComposer::LayerListIterator end = hwc.end(id);
1923 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1924 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1925 continue;
1926 }
1927 const sp<Layer>& layer(currentLayers[i]);
1928 Rect cursorPos = layer->getPosition(hw);
1929 hwc.setCursorPositionAsync(id, cursorPos);
1930 break;
1931 }
1932 }
1933}
1934
1935void SurfaceFlinger::commitTransaction()
1936{
1937 if (!mLayersPendingRemoval.isEmpty()) {
1938 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001939 for (const auto& l : mLayersPendingRemoval) {
1940 recordBufferingStats(l->getName().string(),
1941 l->getOccupancyHistory(true));
1942 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001943 }
1944 mLayersPendingRemoval.clear();
1945 }
1946
1947 // If this transaction is part of a window animation then the next frame
1948 // we composite should be considered an animation as well.
1949 mAnimCompositionPending = mAnimTransactionPending;
1950
1951 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001952 mDrawingState.traverseInZOrder([](Layer* layer) {
1953 layer->commitChildList();
1954 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001955 mTransactionPending = false;
1956 mAnimTransactionPending = false;
1957 mTransactionCV.broadcast();
1958}
1959
Chia-I Wuab0c3192017-08-01 11:29:00 -07001960void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001961 Region& outDirtyRegion, Region& outOpaqueRegion)
1962{
1963 ATRACE_CALL();
1964
1965 Region aboveOpaqueLayers;
1966 Region aboveCoveredLayers;
1967 Region dirty;
1968
1969 outDirtyRegion.clear();
1970
Robert Carr2047fae2016-11-28 14:09:09 -08001971 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001972 // start with the whole surface at its current location
1973 const Layer::State& s(layer->getDrawingState());
1974
1975 // only consider the layers on the given layer stack
Chia-I Wuab0c3192017-08-01 11:29:00 -07001976 if (layer->getLayerStack() != displayDevice->getLayerStack())
Robert Carr2047fae2016-11-28 14:09:09 -08001977 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001978
1979 /*
1980 * opaqueRegion: area of a surface that is fully opaque.
1981 */
1982 Region opaqueRegion;
1983
1984 /*
1985 * visibleRegion: area of a surface that is visible on screen
1986 * and not fully transparent. This is essentially the layer's
1987 * footprint minus the opaque regions above it.
1988 * Areas covered by a translucent surface are considered visible.
1989 */
1990 Region visibleRegion;
1991
1992 /*
1993 * coveredRegion: area of a surface that is covered by all
1994 * visible regions above it (which includes the translucent areas).
1995 */
1996 Region coveredRegion;
1997
1998 /*
1999 * transparentRegion: area of a surface that is hinted to be completely
2000 * transparent. This is only used to tell when the layer has no visible
2001 * non-transparent regions and can be removed from the layer list. It
2002 * does not affect the visibleRegion of this layer or any layers
2003 * beneath it. The hint may not be correct if apps don't respect the
2004 * SurfaceView restrictions (which, sadly, some don't).
2005 */
2006 Region transparentRegion;
2007
2008
2009 // handle hidden surfaces by setting the visible region to empty
2010 if (CC_LIKELY(layer->isVisible())) {
2011 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002012 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002013 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002014 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002015 if (!visibleRegion.isEmpty()) {
2016 // Remove the transparent area from the visible region
2017 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002018 if (tr.preserveRects()) {
2019 // transform the transparent region
2020 transparentRegion = tr.transform(s.activeTransparentRegion);
2021 } else {
2022 // transformation too complex, can't do the
2023 // transparent region optimization.
2024 transparentRegion.clear();
2025 }
2026 }
2027
2028 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07002029 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002030 if (s.alpha==255 && !translucent &&
2031 ((layerOrientation & Transform::ROT_INVALID) == false)) {
2032 // the opaque region is the layer's footprint
2033 opaqueRegion = visibleRegion;
2034 }
2035 }
2036 }
2037
2038 // Clip the covered region to the visible region
2039 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2040
2041 // Update aboveCoveredLayers for next (lower) layer
2042 aboveCoveredLayers.orSelf(visibleRegion);
2043
2044 // subtract the opaque region covered by the layers above us
2045 visibleRegion.subtractSelf(aboveOpaqueLayers);
2046
2047 // compute this layer's dirty region
2048 if (layer->contentDirty) {
2049 // we need to invalidate the whole region
2050 dirty = visibleRegion;
2051 // as well, as the old visible region
2052 dirty.orSelf(layer->visibleRegion);
2053 layer->contentDirty = false;
2054 } else {
2055 /* compute the exposed region:
2056 * the exposed region consists of two components:
2057 * 1) what's VISIBLE now and was COVERED before
2058 * 2) what's EXPOSED now less what was EXPOSED before
2059 *
2060 * note that (1) is conservative, we start with the whole
2061 * visible region but only keep what used to be covered by
2062 * something -- which mean it may have been exposed.
2063 *
2064 * (2) handles areas that were not covered by anything but got
2065 * exposed because of a resize.
2066 */
2067 const Region newExposed = visibleRegion - coveredRegion;
2068 const Region oldVisibleRegion = layer->visibleRegion;
2069 const Region oldCoveredRegion = layer->coveredRegion;
2070 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2071 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2072 }
2073 dirty.subtractSelf(aboveOpaqueLayers);
2074
2075 // accumulate to the screen dirty region
2076 outDirtyRegion.orSelf(dirty);
2077
2078 // Update aboveOpaqueLayers for next (lower) layer
2079 aboveOpaqueLayers.orSelf(opaqueRegion);
2080
2081 // Store the visible region in screen space
2082 layer->setVisibleRegion(visibleRegion);
2083 layer->setCoveredRegion(coveredRegion);
2084 layer->setVisibleNonTransparentRegion(
2085 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002086 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002087
2088 outOpaqueRegion = aboveOpaqueLayers;
2089}
2090
Chia-I Wuab0c3192017-08-01 11:29:00 -07002091void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
2092 uint32_t layerStack = layer->getLayerStack();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002093 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2094 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2095 if (hw->getLayerStack() == layerStack) {
2096 hw->dirtyRegion.orSelf(dirty);
2097 }
2098 }
2099}
2100
2101bool SurfaceFlinger::handlePageFlip()
2102{
Brian Andersond6927fb2016-07-23 23:37:30 -07002103 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002104 Region dirtyRegion;
2105
2106 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002107 bool frameQueued = false;
2108
2109 // Store the set of layers that need updates. This set must not change as
2110 // buffers are being latched, as this could result in a deadlock.
2111 // Example: Two producers share the same command stream and:
2112 // 1.) Layer 0 is latched
2113 // 2.) Layer 0 gets a new frame
2114 // 2.) Layer 1 gets a new frame
2115 // 3.) Layer 1 is latched.
2116 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2117 // second frame. But layer 0's second frame could be waiting on display.
2118 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002119 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002120 if (layer->hasQueuedFrame()) {
2121 frameQueued = true;
2122 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002123 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002124 } else {
2125 layer->useEmptyDamage();
2126 }
2127 } else {
2128 layer->useEmptyDamage();
2129 }
Robert Carr2047fae2016-11-28 14:09:09 -08002130 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002131 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2132 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002133 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002134 layer->useSurfaceDamage();
Chia-I Wuab0c3192017-08-01 11:29:00 -07002135 invalidateLayerStack(layer, dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002136 }
2137
2138 mVisibleRegionsDirty |= visibleRegions;
2139
2140 // If we will need to wake up at some time in the future to deal with a
2141 // queued frame that shouldn't be displayed during this vsync period, wake
2142 // up during the next vsync period to check again.
2143 if (frameQueued && layersWithQueuedFrames.empty()) {
2144 signalLayerUpdate();
2145 }
2146
2147 // Only continue with the refresh if there is actually new work to do
2148 return !layersWithQueuedFrames.empty();
2149}
2150
2151void SurfaceFlinger::invalidateHwcGeometry()
2152{
2153 mHwWorkListDirty = true;
2154}
2155
2156
2157void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2158 const Region& inDirtyRegion)
2159{
2160 // We only need to actually compose the display if:
2161 // 1) It is being handled by hardware composer, which may need this to
2162 // keep its virtual display state machine in sync, or
2163 // 2) There is work to be done (the dirty region isn't empty)
2164 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2165 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2166 return;
2167 }
2168
2169 Region dirtyRegion(inDirtyRegion);
2170
2171 // compute the invalid region
2172 hw->swapRegion.orSelf(dirtyRegion);
2173
2174 uint32_t flags = hw->getFlags();
2175 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2176 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2177 // takes a rectangle, we must make sure to update that whole
2178 // rectangle in that case
2179 dirtyRegion.set(hw->swapRegion.bounds());
2180 } else {
2181 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2182 // We need to redraw the rectangle that will be updated
2183 // (pushed to the framebuffer).
2184 // This is needed because PARTIAL_UPDATES only takes one
2185 // rectangle instead of a region (see DisplayDevice::flip())
2186 dirtyRegion.set(hw->swapRegion.bounds());
2187 } else {
2188 // we need to redraw everything (the whole screen)
2189 dirtyRegion.set(hw->bounds());
2190 hw->swapRegion = dirtyRegion;
2191 }
2192 }
2193
2194 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2195 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2196 } else {
2197 RenderEngine& engine(getRenderEngine());
2198 mat4 colorMatrix = mColorMatrix;
2199 if (mDaltonize) {
2200 colorMatrix = colorMatrix * mDaltonizer();
2201 }
2202 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2203 doComposeSurfaces(hw, dirtyRegion);
2204 engine.setupColorTransform(oldMatrix);
2205 }
2206
2207 // update the swap region and clear the dirty region
2208 hw->swapRegion.orSelf(dirtyRegion);
2209
2210 // swap buffers (presentation)
2211 hw->swapBuffers(getHwComposer());
2212}
2213
2214bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2215{
2216 RenderEngine& engine(getRenderEngine());
2217 const int32_t id = hw->getHwcDisplayId();
2218 HWComposer& hwc(getHwComposer());
2219 HWComposer::LayerListIterator cur = hwc.begin(id);
2220 const HWComposer::LayerListIterator end = hwc.end(id);
2221
2222 bool hasGlesComposition = hwc.hasGlesComposition(id);
2223 if (hasGlesComposition) {
2224 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2225 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2226 hw->getDisplayName().string());
2227 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2228 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2229 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2230 }
2231 return false;
2232 }
2233
2234 // Never touch the framebuffer if we don't have any framebuffer layers
2235 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2236 if (hasHwcComposition) {
2237 // when using overlays, we assume a fully transparent framebuffer
2238 // NOTE: we could reduce how much we need to clear, for instance
2239 // remove where there are opaque FB layers. however, on some
2240 // GPUs doing a "clean slate" clear might be more efficient.
2241 // We'll revisit later if needed.
2242 engine.clearWithColor(0, 0, 0, 0);
2243 } else {
2244 // we start with the whole screen area
2245 const Region bounds(hw->getBounds());
2246
2247 // we remove the scissor part
2248 // we're left with the letterbox region
2249 // (common case is that letterbox ends-up being empty)
2250 const Region letterbox(bounds.subtract(hw->getScissor()));
2251
2252 // compute the area to clear
2253 Region region(hw->undefinedRegion.merge(letterbox));
2254
2255 // but limit it to the dirty region
2256 region.andSelf(dirty);
2257
2258 // screen is already cleared here
2259 if (!region.isEmpty()) {
2260 // can happen with SurfaceView
2261 drawWormhole(hw, region);
2262 }
2263 }
2264
2265 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2266 // just to be on the safe side, we don't set the
2267 // scissor on the main display. It should never be needed
2268 // anyways (though in theory it could since the API allows it).
2269 const Rect& bounds(hw->getBounds());
2270 const Rect& scissor(hw->getScissor());
2271 if (scissor != bounds) {
2272 // scissor doesn't match the screen's dimensions, so we
2273 // need to clear everything outside of it and enable
2274 // the GL scissor so we don't draw anything where we shouldn't
2275
2276 // enable scissor for this frame
2277 const uint32_t height = hw->getHeight();
2278 engine.setScissor(scissor.left, height - scissor.bottom,
2279 scissor.getWidth(), scissor.getHeight());
2280 }
2281 }
2282 }
2283
2284 /*
2285 * and then, render the layers targeted at the framebuffer
2286 */
2287
2288 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2289 const size_t count = layers.size();
2290 const Transform& tr = hw->getTransform();
2291 if (cur != end) {
2292 // we're using h/w composer
2293 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2294 const sp<Layer>& layer(layers[i]);
2295 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2296 if (!clip.isEmpty()) {
2297 switch (cur->getCompositionType()) {
2298 case HWC_CURSOR_OVERLAY:
2299 case HWC_OVERLAY: {
2300 const Layer::State& state(layer->getDrawingState());
2301 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2302 && i
2303 && layer->isOpaque(state) && (state.alpha == 0xFF)
2304 && hasGlesComposition) {
2305 // never clear the very first layer since we're
2306 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002307 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002308 }
2309 break;
2310 }
2311 case HWC_FRAMEBUFFER: {
2312 layer->draw(hw, clip);
2313 break;
2314 }
2315 case HWC_FRAMEBUFFER_TARGET: {
2316 // this should not happen as the iterator shouldn't
2317 // let us get there.
2318 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2319 break;
2320 }
2321 }
2322 }
2323 layer->setAcquireFence(hw, *cur);
2324 }
2325 } else {
2326 // we're not using h/w composer
2327 for (size_t i=0 ; i<count ; ++i) {
2328 const sp<Layer>& layer(layers[i]);
2329 const Region clip(dirty.intersect(
2330 tr.transform(layer->visibleRegion)));
2331 if (!clip.isEmpty()) {
2332 layer->draw(hw, clip);
2333 }
2334 }
2335 }
2336
2337 // disable scissor at the end of the frame
2338 engine.disableScissor();
2339 return true;
2340}
2341
2342void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2343 const int32_t height = hw->getHeight();
2344 RenderEngine& engine(getRenderEngine());
2345 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2346}
2347
2348status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2349 const sp<IBinder>& handle,
2350 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002351 const sp<Layer>& lbc,
2352 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002353{
2354 // add this layer to the current state list
2355 {
2356 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002357 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002358 return NO_MEMORY;
2359 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002360 if (parent == nullptr) {
2361 mCurrentState.layersSortedByZ.add(lbc);
2362 } else {
Chia-I Wufae51c42017-06-15 12:53:59 -07002363 if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) {
2364 ALOGE("addClientLayer called with a removed parent");
2365 return NAME_NOT_FOUND;
2366 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002367 parent->addChild(lbc);
2368 }
Chia-I Wufae51c42017-06-15 12:53:59 -07002369
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002370 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002371 mLayersAdded = true;
2372 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002373 }
2374
2375 // attach this layer to the client
2376 client->attachLayer(handle, lbc);
2377
2378 return NO_ERROR;
2379}
2380
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002381status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002382 Mutex::Autolock _l(mStateLock);
2383
Robert Carr1f0a16a2016-10-24 16:27:39 -07002384 const auto& p = layer->getParent();
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002385 ssize_t index;
2386 if (p != nullptr) {
2387 if (topLevelOnly) {
2388 return NO_ERROR;
2389 }
2390
Chia-I Wufae51c42017-06-15 12:53:59 -07002391 sp<Layer> ancestor = p;
2392 while (ancestor->getParent() != nullptr) {
2393 ancestor = ancestor->getParent();
2394 }
2395 if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
2396 ALOGE("removeLayer called with a layer whose parent has been removed");
2397 return NAME_NOT_FOUND;
2398 }
2399
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002400 index = p->removeChild(layer);
2401 } else {
2402 index = mCurrentState.layersSortedByZ.remove(layer);
2403 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002404
Robert Carr136e2f62017-02-08 17:54:29 -08002405 // As a matter of normal operation, the LayerCleaner will produce a second
2406 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2407 // so we will succeed in promoting it, but it's already been removed
2408 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2409 // otherwise something has gone wrong and we are leaking the layer.
2410 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002411 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2412 layer->getName().string(),
2413 (p != nullptr) ? p->getName().string() : "no-parent");
2414 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002415 } else if (index < 0) {
2416 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002417 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002418
Chia-I Wuc6657022017-08-15 11:18:17 -07002419 layer->onRemovedFromCurrentState();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002420 mLayersPendingRemoval.add(layer);
2421 mLayersRemoved = true;
Chia-I Wufae51c42017-06-15 12:53:59 -07002422 mNumLayers -= 1 + layer->getChildrenCount();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002423 setTransactionFlags(eTransactionNeeded);
2424 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002425}
2426
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002427uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002428 return android_atomic_release_load(&mTransactionFlags);
2429}
2430
2431uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2432 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2433}
2434
2435uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2436 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2437 if ((old & flags)==0) { // wake the server up
2438 signalTransaction();
2439 }
2440 return old;
2441}
2442
2443void SurfaceFlinger::setTransactionState(
2444 const Vector<ComposerState>& state,
2445 const Vector<DisplayState>& displays,
2446 uint32_t flags)
2447{
2448 ATRACE_CALL();
2449 Mutex::Autolock _l(mStateLock);
2450 uint32_t transactionFlags = 0;
2451
2452 if (flags & eAnimation) {
2453 // For window updates that are part of an animation we must wait for
2454 // previous animation "frames" to be handled.
2455 while (mAnimTransactionPending) {
2456 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2457 if (CC_UNLIKELY(err != NO_ERROR)) {
2458 // just in case something goes wrong in SF, return to the
2459 // caller after a few seconds.
2460 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2461 "waiting for previous animation frame");
2462 mAnimTransactionPending = false;
2463 break;
2464 }
2465 }
2466 }
2467
2468 size_t count = displays.size();
2469 for (size_t i=0 ; i<count ; i++) {
2470 const DisplayState& s(displays[i]);
2471 transactionFlags |= setDisplayStateLocked(s);
2472 }
2473
2474 count = state.size();
2475 for (size_t i=0 ; i<count ; i++) {
2476 const ComposerState& s(state[i]);
2477 // Here we need to check that the interface we're given is indeed
2478 // one of our own. A malicious client could give us a NULL
2479 // IInterface, or one of its own or even one of our own but a
2480 // different type. All these situations would cause us to crash.
2481 //
2482 // NOTE: it would be better to use RTTI as we could directly check
2483 // that we have a Client*. however, RTTI is disabled in Android.
2484 if (s.client != NULL) {
2485 sp<IBinder> binder = IInterface::asBinder(s.client);
2486 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002487 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002488 sp<Client> client( static_cast<Client *>(s.client.get()) );
2489 transactionFlags |= setClientStateLocked(client, s.state);
2490 }
2491 }
2492 }
2493 }
2494
2495 // If a synchronous transaction is explicitly requested without any changes,
2496 // force a transaction anyway. This can be used as a flush mechanism for
2497 // previous async transactions.
2498 if (transactionFlags == 0 && (flags & eSynchronous)) {
2499 transactionFlags = eTransactionNeeded;
2500 }
2501
2502 if (transactionFlags) {
2503 if (mInterceptor.isEnabled()) {
2504 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2505 }
2506
2507 // this triggers the transaction
2508 setTransactionFlags(transactionFlags);
2509
2510 // if this is a synchronous transaction, wait for it to take effect
2511 // before returning.
2512 if (flags & eSynchronous) {
2513 mTransactionPending = true;
2514 }
2515 if (flags & eAnimation) {
2516 mAnimTransactionPending = true;
2517 }
2518 while (mTransactionPending) {
2519 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2520 if (CC_UNLIKELY(err != NO_ERROR)) {
2521 // just in case something goes wrong in SF, return to the
2522 // called after a few seconds.
2523 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2524 mTransactionPending = false;
2525 break;
2526 }
2527 }
2528 }
2529}
2530
2531uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2532{
2533 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2534 if (dpyIdx < 0)
2535 return 0;
2536
2537 uint32_t flags = 0;
2538 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2539 if (disp.isValid()) {
2540 const uint32_t what = s.what;
2541 if (what & DisplayState::eSurfaceChanged) {
2542 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2543 disp.surface = s.surface;
2544 flags |= eDisplayTransactionNeeded;
2545 }
2546 }
2547 if (what & DisplayState::eLayerStackChanged) {
2548 if (disp.layerStack != s.layerStack) {
2549 disp.layerStack = s.layerStack;
2550 flags |= eDisplayTransactionNeeded;
2551 }
2552 }
2553 if (what & DisplayState::eDisplayProjectionChanged) {
2554 if (disp.orientation != s.orientation) {
2555 disp.orientation = s.orientation;
2556 flags |= eDisplayTransactionNeeded;
2557 }
2558 if (disp.frame != s.frame) {
2559 disp.frame = s.frame;
2560 flags |= eDisplayTransactionNeeded;
2561 }
2562 if (disp.viewport != s.viewport) {
2563 disp.viewport = s.viewport;
2564 flags |= eDisplayTransactionNeeded;
2565 }
2566 }
2567 if (what & DisplayState::eDisplaySizeChanged) {
2568 if (disp.width != s.width) {
2569 disp.width = s.width;
2570 flags |= eDisplayTransactionNeeded;
2571 }
2572 if (disp.height != s.height) {
2573 disp.height = s.height;
2574 flags |= eDisplayTransactionNeeded;
2575 }
2576 }
2577 }
2578 return flags;
2579}
2580
2581uint32_t SurfaceFlinger::setClientStateLocked(
2582 const sp<Client>& client,
2583 const layer_state_t& s)
2584{
2585 uint32_t flags = 0;
2586 sp<Layer> layer(client->getLayerUser(s.surface));
2587 if (layer != 0) {
2588 const uint32_t what = s.what;
2589 bool geometryAppliesWithResize =
2590 what & layer_state_t::eGeometryAppliesWithResize;
2591 if (what & layer_state_t::ePositionChanged) {
2592 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2593 flags |= eTraversalNeeded;
2594 }
2595 }
2596 if (what & layer_state_t::eLayerChanged) {
2597 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002598 const auto& p = layer->getParent();
2599 if (p == nullptr) {
2600 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2601 if (layer->setLayer(s.z) && idx >= 0) {
2602 mCurrentState.layersSortedByZ.removeAt(idx);
2603 mCurrentState.layersSortedByZ.add(layer);
2604 // we need traversal (state changed)
2605 // AND transaction (list changed)
2606 flags |= eTransactionNeeded|eTraversalNeeded;
2607 }
2608 } else {
2609 if (p->setChildLayer(layer, s.z)) {
2610 flags |= eTransactionNeeded|eTraversalNeeded;
2611 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002612 }
2613 }
chaviw64f7b422017-07-12 10:31:58 -07002614 if (what & layer_state_t::eRelativeLayerChanged) {
2615 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2616 if (layer->setRelativeLayer(s.relativeLayerHandle, s.z)) {
2617 mCurrentState.layersSortedByZ.removeAt(idx);
2618 mCurrentState.layersSortedByZ.add(layer);
2619 flags |= eTransactionNeeded|eTraversalNeeded;
2620 }
2621 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002622 if (what & layer_state_t::eSizeChanged) {
2623 if (layer->setSize(s.w, s.h)) {
2624 flags |= eTraversalNeeded;
2625 }
2626 }
2627 if (what & layer_state_t::eAlphaChanged) {
2628 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2629 flags |= eTraversalNeeded;
2630 }
2631 if (what & layer_state_t::eMatrixChanged) {
2632 if (layer->setMatrix(s.matrix))
2633 flags |= eTraversalNeeded;
2634 }
2635 if (what & layer_state_t::eTransparentRegionChanged) {
2636 if (layer->setTransparentRegionHint(s.transparentRegion))
2637 flags |= eTraversalNeeded;
2638 }
2639 if (what & layer_state_t::eFlagsChanged) {
2640 if (layer->setFlags(s.flags, s.mask))
2641 flags |= eTraversalNeeded;
2642 }
2643 if (what & layer_state_t::eCropChanged) {
2644 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2645 flags |= eTraversalNeeded;
2646 }
2647 if (what & layer_state_t::eFinalCropChanged) {
Robert Carr6fb9ca72017-03-22 18:23:23 -07002648 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002649 flags |= eTraversalNeeded;
2650 }
2651 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002652 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002653 // We only allow setting layer stacks for top level layers,
2654 // everything else inherits layer stack from its parent.
2655 if (layer->hasParent()) {
2656 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2657 layer->getName().string());
2658 } else if (idx < 0) {
2659 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2660 "that also does not appear in the top level layer list. Something"
2661 " has gone wrong.", layer->getName().string());
2662 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002663 mCurrentState.layersSortedByZ.removeAt(idx);
2664 mCurrentState.layersSortedByZ.add(layer);
2665 // we need traversal (state changed)
2666 // AND transaction (list changed)
2667 flags |= eTransactionNeeded|eTraversalNeeded;
2668 }
2669 }
2670 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002671 if (s.barrierHandle != nullptr) {
2672 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2673 } else if (s.barrierGbp != nullptr) {
2674 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2675 if (authenticateSurfaceTextureLocked(gbp)) {
2676 const auto& otherLayer =
2677 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2678 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2679 } else {
2680 ALOGE("Attempt to defer transaction to to an"
2681 " unrecognized GraphicBufferProducer");
2682 }
2683 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002684 // We don't trigger a traversal here because if no other state is
2685 // changed, we don't want this to cause any more work
2686 }
Robert Carr1db73f62016-12-21 12:58:51 -08002687 if (what & layer_state_t::eReparentChildren) {
2688 if (layer->reparentChildren(s.reparentHandle)) {
2689 flags |= eTransactionNeeded|eTraversalNeeded;
2690 }
2691 }
Robert Carr9524cb32017-02-13 11:32:32 -08002692 if (what & layer_state_t::eDetachChildren) {
2693 layer->detachChildren();
2694 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002695 if (what & layer_state_t::eOverrideScalingModeChanged) {
2696 layer->setOverrideScalingMode(s.overrideScalingMode);
2697 // We don't trigger a traversal here because if no other state is
2698 // changed, we don't want this to cause any more work
2699 }
2700 }
2701 return flags;
2702}
2703
2704status_t SurfaceFlinger::createLayer(
2705 const String8& name,
2706 const sp<Client>& client,
2707 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002708 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2709 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002710{
2711 if (int32_t(w|h) < 0) {
2712 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2713 int(w), int(h));
2714 return BAD_VALUE;
2715 }
2716
2717 status_t result = NO_ERROR;
2718
2719 sp<Layer> layer;
2720
Cody Northropbc755282017-03-31 12:00:08 -06002721 String8 uniqueName = getUniqueLayerName(name);
2722
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002723 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2724 case ISurfaceComposerClient::eFXSurfaceNormal:
2725 result = createNormalLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002726 uniqueName, w, h, flags, format,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002727 handle, gbp, &layer);
2728 break;
2729 case ISurfaceComposerClient::eFXSurfaceDim:
2730 result = createDimLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002731 uniqueName, w, h, flags,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002732 handle, gbp, &layer);
2733 break;
2734 default:
2735 result = BAD_VALUE;
2736 break;
2737 }
2738
2739 if (result != NO_ERROR) {
2740 return result;
2741 }
2742
Albert Chaulk479c60c2017-01-27 14:21:34 -05002743 layer->setInfo(windowType, ownerUid);
2744
Robert Carr1f0a16a2016-10-24 16:27:39 -07002745 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002746 if (result != NO_ERROR) {
2747 return result;
2748 }
2749 mInterceptor.saveSurfaceCreation(layer);
2750
2751 setTransactionFlags(eTransactionNeeded);
2752 return result;
2753}
2754
Cody Northropbc755282017-03-31 12:00:08 -06002755String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
2756{
2757 bool matchFound = true;
2758 uint32_t dupeCounter = 0;
2759
2760 // Tack on our counter whether there is a hit or not, so everyone gets a tag
2761 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
2762
2763 // Loop over layers until we're sure there is no matching name
2764 while (matchFound) {
2765 matchFound = false;
2766 mDrawingState.traverseInZOrder([&](Layer* layer) {
2767 if (layer->getName() == uniqueName) {
2768 matchFound = true;
2769 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
2770 }
2771 });
2772 }
2773
2774 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
2775
2776 return uniqueName;
2777}
2778
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002779status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2780 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2781 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2782{
2783 // initialize the surfaces
2784 switch (format) {
2785 case PIXEL_FORMAT_TRANSPARENT:
2786 case PIXEL_FORMAT_TRANSLUCENT:
2787 format = PIXEL_FORMAT_RGBA_8888;
2788 break;
2789 case PIXEL_FORMAT_OPAQUE:
2790 format = PIXEL_FORMAT_RGBX_8888;
2791 break;
2792 }
2793
2794 *outLayer = new Layer(this, client, name, w, h, flags);
2795 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2796 if (err == NO_ERROR) {
2797 *handle = (*outLayer)->getHandle();
2798 *gbp = (*outLayer)->getProducer();
2799 }
2800
2801 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2802 return err;
2803}
2804
2805status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2806 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2807 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2808{
2809 *outLayer = new LayerDim(this, client, name, w, h, flags);
2810 *handle = (*outLayer)->getHandle();
2811 *gbp = (*outLayer)->getProducer();
2812 return NO_ERROR;
2813}
2814
2815status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2816{
Robert Carr9524cb32017-02-13 11:32:32 -08002817 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002818 status_t err = NO_ERROR;
2819 sp<Layer> l(client->getLayerUser(handle));
2820 if (l != NULL) {
2821 mInterceptor.saveSurfaceDeletion(l);
2822 err = removeLayer(l);
2823 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2824 "error removing layer=%p (%s)", l.get(), strerror(-err));
2825 }
2826 return err;
2827}
2828
2829status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2830{
2831 // called by ~LayerCleaner() when all references to the IBinder (handle)
2832 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002833 sp<Layer> l = layer.promote();
2834 if (l == nullptr) {
2835 // The layer has already been removed, carry on
2836 return NO_ERROR;
Robert Carr9524cb32017-02-13 11:32:32 -08002837 }
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002838 // If we have a parent, then we can continue to live as long as it does.
2839 return removeLayer(l, true);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002840}
2841
2842// ---------------------------------------------------------------------------
2843
2844void SurfaceFlinger::onInitializeDisplays() {
2845 // reset screen orientation and use primary layer stack
2846 Vector<ComposerState> state;
2847 Vector<DisplayState> displays;
2848 DisplayState d;
2849 d.what = DisplayState::eDisplayProjectionChanged |
2850 DisplayState::eLayerStackChanged;
2851 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2852 d.layerStack = 0;
2853 d.orientation = DisplayState::eOrientationDefault;
2854 d.frame.makeInvalid();
2855 d.viewport.makeInvalid();
2856 d.width = 0;
2857 d.height = 0;
2858 displays.add(d);
2859 setTransactionState(state, displays, 0);
2860 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2861
2862 const nsecs_t period =
2863 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2864 mAnimFrameTracker.setDisplayRefreshPeriod(period);
Brian Andersond0010582017-03-07 13:20:31 -08002865
2866 // Use phase of 0 since phase is not known.
2867 // Use latency of 0, which will snap to the ideal latency.
2868 setCompositorTimingSnapped(0, period, 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002869}
2870
2871void SurfaceFlinger::initializeDisplays() {
2872 class MessageScreenInitialized : public MessageBase {
2873 SurfaceFlinger* flinger;
2874 public:
2875 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2876 virtual bool handler() {
2877 flinger->onInitializeDisplays();
2878 return true;
2879 }
2880 };
2881 sp<MessageBase> msg = new MessageScreenInitialized(this);
2882 postMessageAsync(msg); // we may be called from main thread, use async message
2883}
2884
2885void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2886 int mode) {
2887 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2888 this);
2889 int32_t type = hw->getDisplayType();
2890 int currentMode = hw->getPowerMode();
2891
2892 if (mode == currentMode) {
2893 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2894 return;
2895 }
2896
2897 hw->setPowerMode(mode);
2898 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2899 ALOGW("Trying to set power mode for virtual display");
2900 return;
2901 }
2902
2903 if (mInterceptor.isEnabled()) {
2904 Mutex::Autolock _l(mStateLock);
2905 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2906 if (idx < 0) {
2907 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2908 return;
2909 }
2910 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2911 }
2912
2913 if (currentMode == HWC_POWER_MODE_OFF) {
2914 // Turn on the display
2915 getHwComposer().setPowerMode(type, mode);
Matthew Bouyack38d49612017-05-12 12:49:32 -07002916 if (type == DisplayDevice::DISPLAY_PRIMARY &&
2917 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002918 // FIXME: eventthread only knows about the main display right now
2919 mEventThread->onScreenAcquired();
2920 resyncToHardwareVsync(true);
2921 }
2922
2923 mVisibleRegionsDirty = true;
2924 mHasPoweredOff = true;
2925 repaintEverything();
2926
2927 struct sched_param param = {0};
2928 param.sched_priority = 1;
2929 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2930 ALOGW("Couldn't set SCHED_FIFO on display on");
2931 }
2932 } else if (mode == HWC_POWER_MODE_OFF) {
2933 // Turn off the display
2934 struct sched_param param = {0};
2935 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2936 ALOGW("Couldn't set SCHED_OTHER on display off");
2937 }
2938
2939 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2940 disableHardwareVsync(true); // also cancels any in-progress resync
2941
2942 // FIXME: eventthread only knows about the main display right now
2943 mEventThread->onScreenReleased();
2944 }
2945
2946 getHwComposer().setPowerMode(type, mode);
2947 mVisibleRegionsDirty = true;
2948 // from this point on, SF will stop drawing on this display
Matthew Bouyack38d49612017-05-12 12:49:32 -07002949 } else if (mode == HWC_POWER_MODE_DOZE ||
2950 mode == HWC_POWER_MODE_NORMAL) {
Zheng Zhang8a43fe62017-03-17 11:19:39 +01002951 // Update display while dozing
2952 getHwComposer().setPowerMode(type, mode);
2953 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2954 // FIXME: eventthread only knows about the main display right now
2955 mEventThread->onScreenAcquired();
2956 resyncToHardwareVsync(true);
2957 }
2958 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
2959 // Leave display going to doze
2960 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2961 disableHardwareVsync(true); // also cancels any in-progress resync
2962 // FIXME: eventthread only knows about the main display right now
2963 mEventThread->onScreenReleased();
2964 }
2965 getHwComposer().setPowerMode(type, mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002966 } else {
Matthew Bouyack38d49612017-05-12 12:49:32 -07002967 ALOGE("Attempting to set unknown power mode: %d\n", mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002968 getHwComposer().setPowerMode(type, mode);
2969 }
2970}
2971
2972void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2973 class MessageSetPowerMode: public MessageBase {
2974 SurfaceFlinger& mFlinger;
2975 sp<IBinder> mDisplay;
2976 int mMode;
2977 public:
2978 MessageSetPowerMode(SurfaceFlinger& flinger,
2979 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2980 mDisplay(disp) { mMode = mode; }
2981 virtual bool handler() {
2982 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2983 if (hw == NULL) {
2984 ALOGE("Attempt to set power mode = %d for null display %p",
2985 mMode, mDisplay.get());
2986 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2987 ALOGW("Attempt to set power mode = %d for virtual display",
2988 mMode);
2989 } else {
2990 mFlinger.setPowerModeInternal(hw, mMode);
2991 }
2992 return true;
2993 }
2994 };
2995 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2996 postMessageSync(msg);
2997}
2998
2999// ---------------------------------------------------------------------------
3000
3001status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
3002{
3003 String8 result;
3004
3005 IPCThreadState* ipc = IPCThreadState::self();
3006 const int pid = ipc->getCallingPid();
3007 const int uid = ipc->getCallingUid();
3008 if ((uid != AID_SHELL) &&
3009 !PermissionCache::checkPermission(sDump, pid, uid)) {
3010 result.appendFormat("Permission Denial: "
3011 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
3012 } else {
3013 // Try to get the main lock, but give up after one second
3014 // (this would indicate SF is stuck, but we want to be able to
3015 // print something in dumpsys).
3016 status_t err = mStateLock.timedLock(s2ns(1));
3017 bool locked = (err == NO_ERROR);
3018 if (!locked) {
3019 result.appendFormat(
3020 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
3021 "dumping anyways (no locks held)\n", strerror(-err), err);
3022 }
3023
3024 bool dumpAll = true;
3025 size_t index = 0;
3026 size_t numArgs = args.size();
3027 if (numArgs) {
3028 if ((index < numArgs) &&
3029 (args[index] == String16("--list"))) {
3030 index++;
3031 listLayersLocked(args, index, result);
3032 dumpAll = false;
3033 }
3034
3035 if ((index < numArgs) &&
3036 (args[index] == String16("--latency"))) {
3037 index++;
3038 dumpStatsLocked(args, index, result);
3039 dumpAll = false;
3040 }
3041
3042 if ((index < numArgs) &&
3043 (args[index] == String16("--latency-clear"))) {
3044 index++;
3045 clearStatsLocked(args, index, result);
3046 dumpAll = false;
3047 }
3048
3049 if ((index < numArgs) &&
3050 (args[index] == String16("--dispsync"))) {
3051 index++;
3052 mPrimaryDispSync.dump(result);
3053 dumpAll = false;
3054 }
3055
3056 if ((index < numArgs) &&
3057 (args[index] == String16("--static-screen"))) {
3058 index++;
3059 dumpStaticScreenStats(result);
3060 dumpAll = false;
3061 }
3062
3063 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07003064 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003065 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07003066 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003067 dumpAll = false;
3068 }
3069 }
3070
3071 if (dumpAll) {
3072 dumpAllLocked(args, index, result);
3073 }
3074
3075 if (locked) {
3076 mStateLock.unlock();
3077 }
3078 }
3079 write(fd, result.string(), result.size());
3080 return NO_ERROR;
3081}
3082
3083void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3084 size_t& /* index */, String8& result) const
3085{
Robert Carr2047fae2016-11-28 14:09:09 -08003086 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003087 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08003088 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003089}
3090
3091void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3092 String8& result) const
3093{
3094 String8 name;
3095 if (index < args.size()) {
3096 name = String8(args[index]);
3097 index++;
3098 }
3099
3100 const nsecs_t period =
3101 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3102 result.appendFormat("%" PRId64 "\n", period);
3103
3104 if (name.isEmpty()) {
3105 mAnimFrameTracker.dumpStats(result);
3106 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08003107 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003108 if (name == layer->getName()) {
3109 layer->dumpFrameStats(result);
3110 }
Robert Carr2047fae2016-11-28 14:09:09 -08003111 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003112 }
3113}
3114
3115void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3116 String8& /* result */)
3117{
3118 String8 name;
3119 if (index < args.size()) {
3120 name = String8(args[index]);
3121 index++;
3122 }
3123
Robert Carr2047fae2016-11-28 14:09:09 -08003124 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003125 if (name.isEmpty() || (name == layer->getName())) {
3126 layer->clearFrameStats();
3127 }
Robert Carr2047fae2016-11-28 14:09:09 -08003128 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003129
3130 mAnimFrameTracker.clearStats();
3131}
3132
3133// This should only be called from the main thread. Otherwise it would need
3134// the lock and should use mCurrentState rather than mDrawingState.
3135void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003136 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003137 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003138 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003139
3140 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3141}
3142
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003143void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003144{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003145 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003146 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3147
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003148 if (isLayerTripleBufferingDisabled())
3149 result.append(" DISABLE_TRIPLE_BUFFERING");
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003150
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003151 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003152 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08003153 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08003154 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
Fabien Sanglard1971b632017-03-10 14:50:03 -08003155 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3156 maxFrameBufferAcquiredBuffers);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003157 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003158}
3159
3160void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3161{
3162 result.appendFormat("Static screen stats:\n");
3163 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3164 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3165 float percent = 100.0f *
3166 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3167 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3168 b + 1, bucketTimeSec, percent);
3169 }
3170 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3171 float percent = 100.0f *
3172 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3173 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3174 NUM_BUCKETS - 1, bucketTimeSec, percent);
3175}
3176
Brian Andersond6927fb2016-07-23 23:37:30 -07003177void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3178 result.appendFormat("Layer frame timestamps:\n");
3179
3180 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3181 const size_t count = currentLayers.size();
3182 for (size_t i=0 ; i<count ; i++) {
3183 currentLayers[i]->dumpFrameEvents(result);
3184 }
3185}
3186
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003187void SurfaceFlinger::recordBufferingStats(const char* layerName,
3188 std::vector<OccupancyTracker::Segment>&& history) {
3189 Mutex::Autolock lock(mBufferingStatsMutex);
3190 auto& stats = mBufferingStats[layerName];
3191 for (const auto& segment : history) {
3192 if (!segment.usedThirdBuffer) {
3193 stats.twoBufferTime += segment.totalTime;
3194 }
3195 if (segment.occupancyAverage < 1.0f) {
3196 stats.doubleBufferedTime += segment.totalTime;
3197 } else if (segment.occupancyAverage < 2.0f) {
3198 stats.tripleBufferedTime += segment.totalTime;
3199 }
3200 ++stats.numSegments;
3201 stats.totalTime += segment.totalTime;
3202 }
3203}
3204
3205void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3206 result.append("Buffering stats:\n");
3207 result.append(" [Layer name] <Active time> <Two buffer> "
3208 "<Double buffered> <Triple buffered>\n");
3209 Mutex::Autolock lock(mBufferingStatsMutex);
3210 typedef std::tuple<std::string, float, float, float> BufferTuple;
3211 std::map<float, BufferTuple, std::greater<float>> sorted;
3212 for (const auto& statsPair : mBufferingStats) {
3213 const char* name = statsPair.first.c_str();
3214 const BufferingStats& stats = statsPair.second;
3215 if (stats.numSegments == 0) {
3216 continue;
3217 }
3218 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3219 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3220 stats.totalTime;
3221 float doubleBufferRatio = static_cast<float>(
3222 stats.doubleBufferedTime) / stats.totalTime;
3223 float tripleBufferRatio = static_cast<float>(
3224 stats.tripleBufferedTime) / stats.totalTime;
3225 sorted.insert({activeTime, {name, twoBufferRatio,
3226 doubleBufferRatio, tripleBufferRatio}});
3227 }
3228 for (const auto& sortedPair : sorted) {
3229 float activeTime = sortedPair.first;
3230 const BufferTuple& values = sortedPair.second;
3231 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3232 std::get<0>(values).c_str(), activeTime,
3233 std::get<1>(values), std::get<2>(values),
3234 std::get<3>(values));
3235 }
3236 result.append("\n");
3237}
3238
3239void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3240 String8& result) const
3241{
3242 bool colorize = false;
3243 if (index < args.size()
3244 && (args[index] == String16("--color"))) {
3245 colorize = true;
3246 index++;
3247 }
3248
3249 Colorizer colorizer(colorize);
3250
3251 // figure out if we're stuck somewhere
3252 const nsecs_t now = systemTime();
3253 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3254 const nsecs_t inTransaction(mDebugInTransaction);
3255 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3256 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3257
3258 /*
3259 * Dump library configuration.
3260 */
3261
3262 colorizer.bold(result);
3263 result.append("Build configuration:");
3264 colorizer.reset(result);
3265 appendSfConfigString(result);
3266 appendUiConfigString(result);
3267 appendGuiConfigString(result);
3268 result.append("\n");
3269
3270 colorizer.bold(result);
3271 result.append("Sync configuration: ");
3272 colorizer.reset(result);
3273 result.append(SyncFeatures::getInstance().toString());
3274 result.append("\n");
3275
3276 colorizer.bold(result);
3277 result.append("DispSync configuration: ");
3278 colorizer.reset(result);
3279 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003280 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3281 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003282 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3283 result.append("\n");
3284
3285 // Dump static screen stats
3286 result.append("\n");
3287 dumpStaticScreenStats(result);
3288 result.append("\n");
3289
3290 dumpBufferingStats(result);
3291
3292 /*
3293 * Dump the visible layer list
3294 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003295 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003296 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003297 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003298 mCurrentState.traverseInZOrder([&](Layer* layer) {
Kalle Raitaa099a242017-01-11 11:17:29 -08003299 result.append(to_string(layer->getLayerDebugInfo()).c_str());
Robert Carr2047fae2016-11-28 14:09:09 -08003300 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003301
3302 /*
3303 * Dump Display state
3304 */
3305
3306 colorizer.bold(result);
3307 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3308 colorizer.reset(result);
3309 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3310 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3311 hw->dump(result);
3312 }
3313
3314 /*
3315 * Dump SurfaceFlinger global state
3316 */
3317
3318 colorizer.bold(result);
3319 result.append("SurfaceFlinger global state:\n");
3320 colorizer.reset(result);
3321
3322 HWComposer& hwc(getHwComposer());
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003323 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003324
3325 colorizer.bold(result);
3326 result.appendFormat("EGL implementation : %s\n",
3327 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3328 colorizer.reset(result);
3329 result.appendFormat("%s\n",
3330 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3331
3332 mRenderEngine->dump(result);
3333
3334 hw->undefinedRegion.dump(result, "undefinedRegion");
3335 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3336 hw->getOrientation(), hw->isDisplayOn());
3337 result.appendFormat(
3338 " last eglSwapBuffers() time: %f us\n"
3339 " last transaction time : %f us\n"
3340 " transaction-flags : %08x\n"
3341 " refresh-rate : %f fps\n"
3342 " x-dpi : %f\n"
3343 " y-dpi : %f\n"
3344 " gpu_to_cpu_unsupported : %d\n"
3345 ,
3346 mLastSwapBufferTime/1000.0,
3347 mLastTransactionTime/1000.0,
3348 mTransactionFlags,
3349 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3350 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3351 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3352 !mGpuToCpuSupported);
3353
3354 result.appendFormat(" eglSwapBuffers time: %f us\n",
3355 inSwapBuffersDuration/1000.0);
3356
3357 result.appendFormat(" transaction time: %f us\n",
3358 inTransactionDuration/1000.0);
3359
3360 /*
3361 * VSYNC state
3362 */
3363 mEventThread->dump(result);
3364
3365 /*
3366 * Dump HWComposer state
3367 */
3368 colorizer.bold(result);
3369 result.append("h/w composer state:\n");
3370 colorizer.reset(result);
3371 result.appendFormat(" h/w composer %s and %s\n",
3372 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3373 (mDebugDisableHWC || mDebugRegion || mDaltonize
3374 || mHasColorMatrix) ? "disabled" : "enabled");
3375 hwc.dump(result);
3376
3377 /*
3378 * Dump gralloc state
3379 */
3380 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3381 alloc.dump(result);
3382}
3383
3384const Vector< sp<Layer> >&
3385SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3386 // Note: mStateLock is held here
3387 wp<IBinder> dpy;
3388 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3389 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3390 dpy = mDisplays.keyAt(i);
3391 break;
3392 }
3393 }
3394 if (dpy == NULL) {
3395 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3396 // Just use the primary display so we have something to return
3397 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3398 }
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003399 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003400}
3401
3402bool SurfaceFlinger::startDdmConnection()
3403{
3404 void* libddmconnection_dso =
3405 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3406 if (!libddmconnection_dso) {
3407 return false;
3408 }
3409 void (*DdmConnection_start)(const char* name);
3410 DdmConnection_start =
3411 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3412 if (!DdmConnection_start) {
3413 dlclose(libddmconnection_dso);
3414 return false;
3415 }
3416 (*DdmConnection_start)(getServiceName());
3417 return true;
3418}
3419
3420status_t SurfaceFlinger::onTransact(
3421 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3422{
3423 switch (code) {
3424 case CREATE_CONNECTION:
3425 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003426 case BOOT_FINISHED:
3427 case CLEAR_ANIMATION_FRAME_STATS:
3428 case GET_ANIMATION_FRAME_STATS:
3429 case SET_POWER_MODE:
3430 case GET_HDR_CAPABILITIES:
3431 {
3432 // codes that require permission check
3433 IPCThreadState* ipc = IPCThreadState::self();
3434 const int pid = ipc->getCallingPid();
3435 const int uid = ipc->getCallingUid();
3436 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3437 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3438 ALOGE("Permission Denial: "
3439 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3440 return PERMISSION_DENIED;
3441 }
3442 break;
3443 }
Robert Carr1db73f62016-12-21 12:58:51 -08003444 /*
3445 * Calling setTransactionState is safe, because you need to have been
3446 * granted a reference to Client* and Handle* to do anything with it.
3447 *
3448 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3449 */
3450 case SET_TRANSACTION_STATE:
3451 case CREATE_SCOPED_CONNECTION:
3452 {
3453 break;
3454 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003455 case CAPTURE_SCREEN:
3456 {
3457 // codes that require permission check
3458 IPCThreadState* ipc = IPCThreadState::self();
3459 const int pid = ipc->getCallingPid();
3460 const int uid = ipc->getCallingUid();
3461 if ((uid != AID_GRAPHICS) &&
3462 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3463 ALOGE("Permission Denial: "
3464 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3465 return PERMISSION_DENIED;
3466 }
3467 break;
3468 }
3469 }
3470
3471 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3472 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3473 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3474 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3475 IPCThreadState* ipc = IPCThreadState::self();
3476 const int pid = ipc->getCallingPid();
3477 const int uid = ipc->getCallingUid();
3478 ALOGE("Permission Denial: "
3479 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3480 return PERMISSION_DENIED;
3481 }
3482 int n;
3483 switch (code) {
3484 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3485 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3486 return NO_ERROR;
3487 case 1002: // SHOW_UPDATES
3488 n = data.readInt32();
3489 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3490 invalidateHwcGeometry();
3491 repaintEverything();
3492 return NO_ERROR;
3493 case 1004:{ // repaint everything
3494 repaintEverything();
3495 return NO_ERROR;
3496 }
3497 case 1005:{ // force transaction
3498 setTransactionFlags(
3499 eTransactionNeeded|
3500 eDisplayTransactionNeeded|
3501 eTraversalNeeded);
3502 return NO_ERROR;
3503 }
3504 case 1006:{ // send empty update
3505 signalRefresh();
3506 return NO_ERROR;
3507 }
3508 case 1008: // toggle use of hw composer
3509 n = data.readInt32();
3510 mDebugDisableHWC = n ? 1 : 0;
3511 invalidateHwcGeometry();
3512 repaintEverything();
3513 return NO_ERROR;
3514 case 1009: // toggle use of transform hint
3515 n = data.readInt32();
3516 mDebugDisableTransformHint = n ? 1 : 0;
3517 invalidateHwcGeometry();
3518 repaintEverything();
3519 return NO_ERROR;
3520 case 1010: // interrogate.
3521 reply->writeInt32(0);
3522 reply->writeInt32(0);
3523 reply->writeInt32(mDebugRegion);
3524 reply->writeInt32(0);
3525 reply->writeInt32(mDebugDisableHWC);
3526 return NO_ERROR;
3527 case 1013: {
3528 Mutex::Autolock _l(mStateLock);
3529 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3530 reply->writeInt32(hw->getPageFlipCount());
3531 return NO_ERROR;
3532 }
3533 case 1014: {
3534 // daltonize
3535 n = data.readInt32();
3536 switch (n % 10) {
3537 case 1:
3538 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3539 break;
3540 case 2:
3541 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3542 break;
3543 case 3:
3544 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3545 break;
3546 }
3547 if (n >= 10) {
3548 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3549 } else {
3550 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3551 }
3552 mDaltonize = n > 0;
3553 invalidateHwcGeometry();
3554 repaintEverything();
3555 return NO_ERROR;
3556 }
3557 case 1015: {
3558 // apply a color matrix
3559 n = data.readInt32();
3560 mHasColorMatrix = n ? 1 : 0;
3561 if (n) {
3562 // color matrix is sent as mat3 matrix followed by vec3
3563 // offset, then packed into a mat4 where the last row is
3564 // the offset and extra values are 0
3565 for (size_t i = 0 ; i < 4; i++) {
3566 for (size_t j = 0; j < 4; j++) {
3567 mColorMatrix[i][j] = data.readFloat();
3568 }
3569 }
3570 } else {
3571 mColorMatrix = mat4();
3572 }
3573 invalidateHwcGeometry();
3574 repaintEverything();
3575 return NO_ERROR;
3576 }
3577 // This is an experimental interface
3578 // Needs to be shifted to proper binder interface when we productize
3579 case 1016: {
3580 n = data.readInt32();
3581 mPrimaryDispSync.setRefreshSkipCount(n);
3582 return NO_ERROR;
3583 }
3584 case 1017: {
3585 n = data.readInt32();
3586 mForceFullDamage = static_cast<bool>(n);
3587 return NO_ERROR;
3588 }
3589 case 1018: { // Modify Choreographer's phase offset
3590 n = data.readInt32();
3591 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3592 return NO_ERROR;
3593 }
3594 case 1019: { // Modify SurfaceFlinger's phase offset
3595 n = data.readInt32();
3596 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3597 return NO_ERROR;
3598 }
3599 case 1020: { // Layer updates interceptor
3600 n = data.readInt32();
3601 if (n) {
3602 ALOGV("Interceptor enabled");
3603 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3604 }
3605 else{
3606 ALOGV("Interceptor disabled");
3607 mInterceptor.disable();
3608 }
3609 return NO_ERROR;
3610 }
3611 case 1021: { // Disable HWC virtual displays
3612 n = data.readInt32();
3613 mUseHwcVirtualDisplays = !n;
3614 return NO_ERROR;
3615 }
3616 }
3617 }
3618 return err;
3619}
3620
3621void SurfaceFlinger::repaintEverything() {
3622 android_atomic_or(1, &mRepaintEverything);
3623 signalTransaction();
3624}
3625
3626// ---------------------------------------------------------------------------
3627// Capture screen into an IGraphiBufferProducer
3628// ---------------------------------------------------------------------------
3629
3630/* The code below is here to handle b/8734824
3631 *
3632 * We create a IGraphicBufferProducer wrapper that forwards all calls
3633 * from the surfaceflinger thread to the calling binder thread, where they
3634 * are executed. This allows the calling thread in the calling process to be
3635 * reused and not depend on having "enough" binder threads to handle the
3636 * requests.
3637 */
3638class GraphicProducerWrapper : public BBinder, public MessageHandler {
3639 /* Parts of GraphicProducerWrapper are run on two different threads,
3640 * communicating by sending messages via Looper but also by shared member
3641 * data. Coherence maintenance is subtle and in places implicit (ugh).
3642 *
3643 * Don't rely on Looper's sendMessage/handleMessage providing
3644 * release/acquire semantics for any data not actually in the Message.
3645 * Data going from surfaceflinger to binder threads needs to be
3646 * synchronized explicitly.
3647 *
3648 * Barrier open/wait do provide release/acquire semantics. This provides
3649 * implicit synchronization for data coming back from binder to
3650 * surfaceflinger threads.
3651 */
3652
3653 sp<IGraphicBufferProducer> impl;
3654 sp<Looper> looper;
3655 status_t result;
3656 bool exitPending;
3657 bool exitRequested;
3658 Barrier barrier;
3659 uint32_t code;
3660 Parcel const* data;
3661 Parcel* reply;
3662
3663 enum {
3664 MSG_API_CALL,
3665 MSG_EXIT
3666 };
3667
3668 /*
3669 * Called on surfaceflinger thread. This is called by our "fake"
3670 * BpGraphicBufferProducer. We package the data and reply Parcel and
3671 * forward them to the binder thread.
3672 */
3673 virtual status_t transact(uint32_t code,
3674 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3675 this->code = code;
3676 this->data = &data;
3677 this->reply = reply;
3678 if (exitPending) {
3679 // if we've exited, we run the message synchronously right here.
3680 // note (JH): as far as I can tell from looking at the code, this
3681 // never actually happens. if it does, i'm not sure if it happens
3682 // on the surfaceflinger or binder thread.
3683 handleMessage(Message(MSG_API_CALL));
3684 } else {
3685 barrier.close();
3686 // Prevent stores to this->{code, data, reply} from being
3687 // reordered later than the construction of Message.
3688 atomic_thread_fence(memory_order_release);
3689 looper->sendMessage(this, Message(MSG_API_CALL));
3690 barrier.wait();
3691 }
3692 return result;
3693 }
3694
3695 /*
3696 * here we run on the binder thread. All we've got to do is
3697 * call the real BpGraphicBufferProducer.
3698 */
3699 virtual void handleMessage(const Message& message) {
3700 int what = message.what;
3701 // Prevent reads below from happening before the read from Message
3702 atomic_thread_fence(memory_order_acquire);
3703 if (what == MSG_API_CALL) {
3704 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3705 barrier.open();
3706 } else if (what == MSG_EXIT) {
3707 exitRequested = true;
3708 }
3709 }
3710
3711public:
3712 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3713 : impl(impl),
3714 looper(new Looper(true)),
3715 result(NO_ERROR),
3716 exitPending(false),
3717 exitRequested(false),
3718 code(0),
3719 data(NULL),
3720 reply(NULL)
3721 {}
3722
3723 // Binder thread
3724 status_t waitForResponse() {
3725 do {
3726 looper->pollOnce(-1);
3727 } while (!exitRequested);
3728 return result;
3729 }
3730
3731 // Client thread
3732 void exit(status_t result) {
3733 this->result = result;
3734 exitPending = true;
3735 // Ensure this->result is visible to the binder thread before it
3736 // handles the message.
3737 atomic_thread_fence(memory_order_release);
3738 looper->sendMessage(this, Message(MSG_EXIT));
3739 }
3740};
3741
3742
3743status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3744 const sp<IGraphicBufferProducer>& producer,
3745 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003746 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003747 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3748
3749 if (CC_UNLIKELY(display == 0))
3750 return BAD_VALUE;
3751
3752 if (CC_UNLIKELY(producer == 0))
3753 return BAD_VALUE;
3754
3755 // if we have secure windows on this display, never allow the screen capture
3756 // unless the producer interface is local (i.e.: we can take a screenshot for
3757 // ourselves).
3758 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3759
3760 // Convert to surfaceflinger's internal rotation type.
3761 Transform::orientation_flags rotationFlags;
3762 switch (rotation) {
3763 case ISurfaceComposer::eRotateNone:
3764 rotationFlags = Transform::ROT_0;
3765 break;
3766 case ISurfaceComposer::eRotate90:
3767 rotationFlags = Transform::ROT_90;
3768 break;
3769 case ISurfaceComposer::eRotate180:
3770 rotationFlags = Transform::ROT_180;
3771 break;
3772 case ISurfaceComposer::eRotate270:
3773 rotationFlags = Transform::ROT_270;
3774 break;
3775 default:
3776 rotationFlags = Transform::ROT_0;
3777 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3778 break;
3779 }
3780
3781 class MessageCaptureScreen : public MessageBase {
3782 SurfaceFlinger* flinger;
3783 sp<IBinder> display;
3784 sp<IGraphicBufferProducer> producer;
3785 Rect sourceCrop;
3786 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003787 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003788 bool useIdentityTransform;
3789 Transform::orientation_flags rotation;
3790 status_t result;
3791 bool isLocalScreenshot;
3792 public:
3793 MessageCaptureScreen(SurfaceFlinger* flinger,
3794 const sp<IBinder>& display,
3795 const sp<IGraphicBufferProducer>& producer,
3796 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003797 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003798 bool useIdentityTransform,
3799 Transform::orientation_flags rotation,
3800 bool isLocalScreenshot)
3801 : flinger(flinger), display(display), producer(producer),
3802 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3803 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3804 useIdentityTransform(useIdentityTransform),
3805 rotation(rotation), result(PERMISSION_DENIED),
3806 isLocalScreenshot(isLocalScreenshot)
3807 {
3808 }
3809 status_t getResult() const {
3810 return result;
3811 }
3812 virtual bool handler() {
3813 Mutex::Autolock _l(flinger->mStateLock);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003814 sp<const DisplayDevice> hw(flinger->getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003815 result = flinger->captureScreenImplLocked(hw, producer,
3816 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3817 useIdentityTransform, rotation, isLocalScreenshot);
3818 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3819 return true;
3820 }
3821 };
3822
3823 // this creates a "fake" BBinder which will serve as a "fake" remote
3824 // binder to receive the marshaled calls and forward them to the
3825 // real remote (a BpGraphicBufferProducer)
3826 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3827
3828 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3829 // which does the marshaling work forwards to our "fake remote" above.
3830 sp<MessageBase> msg = new MessageCaptureScreen(this,
3831 display, IGraphicBufferProducer::asInterface( wrapper ),
3832 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3833 useIdentityTransform, rotationFlags, isLocalScreenshot);
3834
3835 status_t res = postMessageAsync(msg);
3836 if (res == NO_ERROR) {
3837 res = wrapper->waitForResponse();
3838 }
3839 return res;
3840}
3841
3842
3843void SurfaceFlinger::renderScreenImplLocked(
3844 const sp<const DisplayDevice>& hw,
3845 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003846 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003847 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3848{
3849 ATRACE_CALL();
3850 RenderEngine& engine(getRenderEngine());
3851
3852 // get screen geometry
3853 const int32_t hw_w = hw->getWidth();
3854 const int32_t hw_h = hw->getHeight();
3855 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3856 static_cast<int32_t>(reqHeight) != hw_h;
3857
3858 // if a default or invalid sourceCrop is passed in, set reasonable values
3859 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3860 !sourceCrop.isValid()) {
3861 sourceCrop.setLeftTop(Point(0, 0));
3862 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3863 }
3864
3865 // ensure that sourceCrop is inside screen
3866 if (sourceCrop.left < 0) {
3867 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3868 }
3869 if (sourceCrop.right > hw_w) {
3870 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3871 }
3872 if (sourceCrop.top < 0) {
3873 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3874 }
3875 if (sourceCrop.bottom > hw_h) {
3876 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3877 }
3878
3879 // make sure to clear all GL error flags
3880 engine.checkErrors();
3881
3882 // set-up our viewport
3883 engine.setViewportAndProjection(
3884 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3885 engine.disableTexturing();
3886
3887 // redraw the screen entirely...
3888 engine.clearWithColor(0, 0, 0, 1);
3889
Robert Carr1f0a16a2016-10-24 16:27:39 -07003890 // We loop through the first level of layers without traversing,
3891 // as we need to interpret min/max layer Z in the top level Z space.
3892 for (const auto& layer : mDrawingState.layersSortedByZ) {
3893 if (layer->getLayerStack() != hw->getLayerStack()) {
3894 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003895 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003896 const Layer::State& state(layer->getDrawingState());
3897 if (state.z < minLayerZ || state.z > maxLayerZ) {
3898 continue;
3899 }
Dan Stoza412903f2017-04-27 13:42:17 -07003900 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003901 if (!layer->isVisible()) {
3902 return;
3903 }
3904 if (filtering) layer->setFiltering(true);
3905 layer->draw(hw, useIdentityTransform);
3906 if (filtering) layer->setFiltering(false);
3907 });
3908 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003909
3910 // compositionComplete is needed for older driver
3911 hw->compositionComplete();
3912 hw->setViewportAndProjection();
3913}
3914
3915
3916status_t SurfaceFlinger::captureScreenImplLocked(
3917 const sp<const DisplayDevice>& hw,
3918 const sp<IGraphicBufferProducer>& producer,
3919 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003920 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003921 bool useIdentityTransform, Transform::orientation_flags rotation,
3922 bool isLocalScreenshot)
3923{
3924 ATRACE_CALL();
3925
3926 // get screen geometry
3927 uint32_t hw_w = hw->getWidth();
3928 uint32_t hw_h = hw->getHeight();
3929
3930 if (rotation & Transform::ROT_90) {
3931 std::swap(hw_w, hw_h);
3932 }
3933
3934 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3935 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3936 reqWidth, reqHeight, hw_w, hw_h);
3937 return BAD_VALUE;
3938 }
3939
3940 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3941 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3942
3943 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003944 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003945 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003946 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3947 (state.z < minLayerZ || state.z > maxLayerZ)) {
3948 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003949 }
Dan Stoza412903f2017-04-27 13:42:17 -07003950 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003951 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3952 layer->isSecure());
3953 });
3954 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003955
3956 if (!isLocalScreenshot && secureLayerIsVisible) {
3957 ALOGW("FB is protected: PERMISSION_DENIED");
3958 return PERMISSION_DENIED;
3959 }
3960
3961 // create a surface (because we're a producer, and we need to
3962 // dequeue/queue a buffer)
3963 sp<Surface> sur = new Surface(producer, false);
3964 ANativeWindow* window = sur.get();
3965
3966 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3967 if (result == NO_ERROR) {
3968 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3969 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3970
3971 int err = 0;
3972 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3973 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3974 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3975 err |= native_window_set_usage(window, usage);
3976
3977 if (err == NO_ERROR) {
3978 ANativeWindowBuffer* buffer;
3979 /* TODO: Once we have the sync framework everywhere this can use
3980 * server-side waits on the fence that dequeueBuffer returns.
3981 */
3982 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3983 if (result == NO_ERROR) {
3984 int syncFd = -1;
3985 // create an EGLImage from the buffer so we can later
3986 // turn it into a texture
3987 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3988 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3989 if (image != EGL_NO_IMAGE_KHR) {
3990 // this binds the given EGLImage as a framebuffer for the
3991 // duration of this scope.
3992 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3993 if (imageBond.getStatus() == NO_ERROR) {
3994 // this will in fact render into our dequeued buffer
3995 // via an FBO, which means we didn't have to create
3996 // an EGLSurface and therefore we're not
3997 // dependent on the context's EGLConfig.
3998 renderScreenImplLocked(
3999 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
4000 useIdentityTransform, rotation);
4001
4002 // Attempt to create a sync khr object that can produce a sync point. If that
4003 // isn't available, create a non-dupable sync object in the fallback path and
4004 // wait on it directly.
4005 EGLSyncKHR sync;
4006 if (!DEBUG_SCREENSHOTS) {
4007 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
4008 // native fence fd will not be populated until flush() is done.
4009 getRenderEngine().flush();
4010 } else {
4011 sync = EGL_NO_SYNC_KHR;
4012 }
4013 if (sync != EGL_NO_SYNC_KHR) {
4014 // get the sync fd
4015 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
4016 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
4017 ALOGW("captureScreen: failed to dup sync khr object");
4018 syncFd = -1;
4019 }
4020 eglDestroySyncKHR(mEGLDisplay, sync);
4021 } else {
4022 // fallback path
4023 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
4024 if (sync != EGL_NO_SYNC_KHR) {
4025 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
4026 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
4027 EGLint eglErr = eglGetError();
4028 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
4029 ALOGW("captureScreen: fence wait timed out");
4030 } else {
4031 ALOGW_IF(eglErr != EGL_SUCCESS,
4032 "captureScreen: error waiting on EGL fence: %#x", eglErr);
4033 }
4034 eglDestroySyncKHR(mEGLDisplay, sync);
4035 } else {
4036 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
4037 }
4038 }
4039 if (DEBUG_SCREENSHOTS) {
4040 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
4041 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
4042 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
4043 hw, minLayerZ, maxLayerZ);
4044 delete [] pixels;
4045 }
4046
4047 } else {
4048 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
4049 result = INVALID_OPERATION;
4050 window->cancelBuffer(window, buffer, syncFd);
4051 buffer = NULL;
4052 }
4053 // destroy our image
4054 eglDestroyImageKHR(mEGLDisplay, image);
4055 } else {
4056 result = BAD_VALUE;
4057 }
4058 if (buffer) {
4059 // queueBuffer takes ownership of syncFd
4060 result = window->queueBuffer(window, buffer, syncFd);
4061 }
4062 }
4063 } else {
4064 result = BAD_VALUE;
4065 }
4066 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
4067 }
4068
4069 return result;
4070}
4071
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004072void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08004073 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004074 if (DEBUG_SCREENSHOTS) {
4075 for (size_t y=0 ; y<h ; y++) {
4076 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4077 for (size_t x=0 ; x<w ; x++) {
4078 if (p[x] != 0xFF000000) return;
4079 }
4080 }
4081 ALOGE("*** we just took a black screenshot ***\n"
4082 "requested minz=%d, maxz=%d, layerStack=%d",
4083 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08004084 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004085 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004086 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004087 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4088 state.z <= maxLayerZ) {
Dan Stoza412903f2017-04-27 13:42:17 -07004089 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07004090 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
4091 layer->isVisible() ? '+' : '-',
4092 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004093 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07004094 i++;
4095 });
4096 }
4097 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004098 }
4099}
4100
4101// ---------------------------------------------------------------------------
4102
Dan Stoza412903f2017-04-27 13:42:17 -07004103void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4104 layersSortedByZ.traverseInZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004105}
4106
Dan Stoza412903f2017-04-27 13:42:17 -07004107void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4108 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004109}
4110
4111}; // namespace android
4112
4113
4114#if defined(__gl_h_)
4115#error "don't include gl/gl.h in this file"
4116#endif
4117
4118#if defined(__gl2_h_)
4119#error "don't include gl2/gl2.h in this file"
4120#endif