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