blob: a6c0b9c686f8c92281ed96cbd6b818593466afac [file] [log] [blame]
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define ATRACE_TAG ATRACE_TAG_GRAPHICS
18
Mark Salyzyn7823e122016-09-29 08:08:05 -070019#include <dlfcn.h>
20#include <errno.h>
21#include <inttypes.h>
22#include <math.h>
23#include <stdatomic.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000024#include <stdint.h>
25#include <sys/types.h>
Dan Stoza9e56aa02015-11-02 13:00:03 -080026
Fabien Sanglard9d96de42016-10-11 00:15:18 +000027#include <mutex>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000028
29#include <EGL/egl.h>
30
Fabien Sanglard9d96de42016-10-11 00:15:18 +000031#include <cutils/properties.h>
Mark Salyzyn7823e122016-09-29 08:08:05 -070032#include <log/log.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000033
34#include <binder/IPCThreadState.h>
35#include <binder/IServiceManager.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000036#include <binder/PermissionCache.h>
37
38#include <ui/DisplayInfo.h>
39#include <ui/DisplayStatInfo.h>
40
Fabien Sanglard9d96de42016-10-11 00:15:18 +000041#include <gui/BufferQueue.h>
42#include <gui/GuiConfig.h>
43#include <gui/IDisplayEventConnection.h>
44#include <gui/Surface.h>
Romain Guyf8b4ca52017-03-16 18:39:20 +000045#include <gui/GraphicBufferAlloc.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
Romain Guyf8b4ca52017-03-16 18:39:20 +0000322sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc()
323{
324 sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc());
325 return gba;
326}
327
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000328void SurfaceFlinger::bootFinished()
329{
Wei Wangb254fa32017-01-31 17:43:23 -0800330 if (mStartBootAnimThread->join() != NO_ERROR) {
331 ALOGE("Join StartBootAnimThread failed!");
332 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000333 const nsecs_t now = systemTime();
334 const nsecs_t duration = now - mBootTime;
335 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
336 mBootFinished = true;
337
338 // wait patiently for the window manager death
339 const String16 name("window");
340 sp<IBinder> window(defaultServiceManager()->getService(name));
341 if (window != 0) {
342 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
343 }
344
345 // stop boot animation
346 // formerly we would just kill the process, but we now ask it to exit so it
347 // can choose where to stop the animation.
348 property_set("service.bootanim.exit", "1");
349
350 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
351 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
352 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
353}
354
355void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
356 class MessageDestroyGLTexture : public MessageBase {
357 RenderEngine& engine;
358 uint32_t texture;
359 public:
360 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
361 : engine(engine), texture(texture) {
362 }
363 virtual bool handler() {
364 engine.deleteTextures(1, &texture);
365 return true;
366 }
367 };
368 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
369}
370
371class DispSyncSource : public VSyncSource, private DispSync::Callback {
372public:
373 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
374 const char* name) :
375 mName(name),
376 mValue(0),
377 mTraceVsync(traceVsync),
378 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
379 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
380 mDispSync(dispSync),
381 mCallbackMutex(),
382 mCallback(),
383 mVsyncMutex(),
384 mPhaseOffset(phaseOffset),
385 mEnabled(false) {}
386
387 virtual ~DispSyncSource() {}
388
389 virtual void setVSyncEnabled(bool enable) {
390 Mutex::Autolock lock(mVsyncMutex);
391 if (enable) {
392 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
393 static_cast<DispSync::Callback*>(this));
394 if (err != NO_ERROR) {
395 ALOGE("error registering vsync callback: %s (%d)",
396 strerror(-err), err);
397 }
398 //ATRACE_INT(mVsyncOnLabel.string(), 1);
399 } else {
400 status_t err = mDispSync->removeEventListener(
401 static_cast<DispSync::Callback*>(this));
402 if (err != NO_ERROR) {
403 ALOGE("error unregistering vsync callback: %s (%d)",
404 strerror(-err), err);
405 }
406 //ATRACE_INT(mVsyncOnLabel.string(), 0);
407 }
408 mEnabled = enable;
409 }
410
411 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
412 Mutex::Autolock lock(mCallbackMutex);
413 mCallback = callback;
414 }
415
416 virtual void setPhaseOffset(nsecs_t phaseOffset) {
417 Mutex::Autolock lock(mVsyncMutex);
418
419 // Normalize phaseOffset to [0, period)
420 auto period = mDispSync->getPeriod();
421 phaseOffset %= period;
422 if (phaseOffset < 0) {
423 // If we're here, then phaseOffset is in (-period, 0). After this
424 // operation, it will be in (0, period)
425 phaseOffset += period;
426 }
427 mPhaseOffset = phaseOffset;
428
429 // If we're not enabled, we don't need to mess with the listeners
430 if (!mEnabled) {
431 return;
432 }
433
434 // Remove the listener with the old offset
435 status_t err = mDispSync->removeEventListener(
436 static_cast<DispSync::Callback*>(this));
437 if (err != NO_ERROR) {
438 ALOGE("error unregistering vsync callback: %s (%d)",
439 strerror(-err), err);
440 }
441
442 // Add a listener with the new offset
443 err = mDispSync->addEventListener(mName, mPhaseOffset,
444 static_cast<DispSync::Callback*>(this));
445 if (err != NO_ERROR) {
446 ALOGE("error registering vsync callback: %s (%d)",
447 strerror(-err), err);
448 }
449 }
450
451private:
452 virtual void onDispSyncEvent(nsecs_t when) {
453 sp<VSyncSource::Callback> callback;
454 {
455 Mutex::Autolock lock(mCallbackMutex);
456 callback = mCallback;
457
458 if (mTraceVsync) {
459 mValue = (mValue + 1) % 2;
460 ATRACE_INT(mVsyncEventLabel.string(), mValue);
461 }
462 }
463
464 if (callback != NULL) {
465 callback->onVSyncEvent(when);
466 }
467 }
468
469 const char* const mName;
470
471 int mValue;
472
473 const bool mTraceVsync;
474 const String8 mVsyncOnLabel;
475 const String8 mVsyncEventLabel;
476
477 DispSync* mDispSync;
478
479 Mutex mCallbackMutex; // Protects the following
480 sp<VSyncSource::Callback> mCallback;
481
482 Mutex mVsyncMutex; // Protects the following
483 nsecs_t mPhaseOffset;
484 bool mEnabled;
485};
486
487class InjectVSyncSource : public VSyncSource {
488public:
489 InjectVSyncSource() {}
490
491 virtual ~InjectVSyncSource() {}
492
493 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
494 std::lock_guard<std::mutex> lock(mCallbackMutex);
495 mCallback = callback;
496 }
497
498 virtual void onInjectSyncEvent(nsecs_t when) {
499 std::lock_guard<std::mutex> lock(mCallbackMutex);
500 mCallback->onVSyncEvent(when);
501 }
502
503 virtual void setVSyncEnabled(bool) {}
504 virtual void setPhaseOffset(nsecs_t) {}
505
506private:
507 std::mutex mCallbackMutex; // Protects the following
508 sp<VSyncSource::Callback> mCallback;
509};
510
511void SurfaceFlinger::init() {
512 ALOGI( "SurfaceFlinger's main thread ready to run. "
513 "Initializing graphics H/W...");
514
515 Mutex::Autolock _l(mStateLock);
516
517 // initialize EGL for the default display
518 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
519 eglInitialize(mEGLDisplay, NULL, NULL);
520
521 // start the EventThread
522 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
523 vsyncPhaseOffsetNs, true, "app");
524 mEventThread = new EventThread(vsyncSrc, *this, false);
525 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
526 sfVsyncPhaseOffsetNs, true, "sf");
527 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
528 mEventQueue.setEventThread(mSFEventThread);
529
530 // set SFEventThread to SCHED_FIFO to minimize jitter
531 struct sched_param param = {0};
532 param.sched_priority = 2;
533 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
534 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
535 }
536
537
538 // Initialize the H/W composer object. There may or may not be an
539 // actual hardware composer underneath.
540 mHwc = new HWComposer(this,
541 *static_cast<HWComposer::EventHandler *>(this));
542
543 // get a RenderEngine for the given display / config (can't fail)
544 mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID());
545
546 // retrieve the EGL context that was selected/created
547 mEGLContext = mRenderEngine->getEGLContext();
548
549 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
550 "couldn't create EGLContext");
551
552 // initialize our non-virtual displays
553 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
554 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
555 // set-up the displays that are already connected
556 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
557 // All non-virtual displays are currently considered secure.
558 bool isSecure = true;
559 createBuiltinDisplayLocked(type);
560 wp<IBinder> token = mBuiltinDisplays[i];
561
562 sp<IGraphicBufferProducer> producer;
563 sp<IGraphicBufferConsumer> consumer;
Romain Guyf8b4ca52017-03-16 18:39:20 +0000564 BufferQueue::createBufferQueue(&producer, &consumer,
565 new GraphicBufferAlloc());
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000566
567 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
568 consumer);
569 int32_t hwcId = allocateHwcDisplayId(type);
570 sp<DisplayDevice> hw = new DisplayDevice(this,
571 type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
572 fbs, producer,
573 mRenderEngine->getEGLConfig());
574 if (i > DisplayDevice::DISPLAY_PRIMARY) {
575 // FIXME: currently we don't get blank/unblank requests
576 // for displays other than the main display, so we always
577 // assume a connected display is unblanked.
578 ALOGD("marking display %zu as acquired/unblanked", i);
579 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
580 }
581 mDisplays.add(token, hw);
582 }
583 }
584
585 // make the GLContext current so that we can create textures when creating Layers
586 // (which may happens before we render something)
587 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
588
589 mEventControlThread = new EventControlThread(this);
590 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
591
592 // set a fake vsync period if there is no HWComposer
593 if (mHwc->initCheck() != NO_ERROR) {
594 mPrimaryDispSync.setPeriod(16666667);
595 }
596
597 // initialize our drawing state
598 mDrawingState = mCurrentState;
599
600 // set initial conditions (e.g. unblank default device)
601 initializeDisplays();
602
603 mRenderEngine->primeCache();
604
Wei Wangb254fa32017-01-31 17:43:23 -0800605 mStartBootAnimThread = new StartBootAnimThread();
606 if (mStartBootAnimThread->Start() != NO_ERROR) {
607 ALOGE("Run StartBootAnimThread failed!");
608 }
609
610 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000611}
612
613int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
614 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
615 type : mHwc->allocateDisplayId();
616}
617
618void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800619 // Start boot animation service by setting a property mailbox
620 // if property setting thread is already running, Start() will be just a NOP
621 mStartBootAnimThread->Start();
622 // Wait until property was set
623 if (mStartBootAnimThread->join() != NO_ERROR) {
624 ALOGE("Join StartBootAnimThread failed!");
625 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000626}
627
628size_t SurfaceFlinger::getMaxTextureSize() const {
629 return mRenderEngine->getMaxTextureSize();
630}
631
632size_t SurfaceFlinger::getMaxViewportDims() const {
633 return mRenderEngine->getMaxViewportDims();
634}
635
636// ----------------------------------------------------------------------------
637
638bool SurfaceFlinger::authenticateSurfaceTexture(
639 const sp<IGraphicBufferProducer>& bufferProducer) const {
640 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800641 return authenticateSurfaceTextureLocked(bufferProducer);
642}
643
644bool SurfaceFlinger::authenticateSurfaceTextureLocked(
645 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000646 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
647 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
648}
649
650status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
651 Vector<DisplayInfo>* configs) {
652 if ((configs == NULL) || (display.get() == NULL)) {
653 return BAD_VALUE;
654 }
655
656 int32_t type = getDisplayType(display);
657 if (type < 0) return type;
658
659 // TODO: Not sure if display density should handled by SF any longer
660 class Density {
661 static int getDensityFromProperty(char const* propName) {
662 char property[PROPERTY_VALUE_MAX];
663 int density = 0;
664 if (property_get(propName, property, NULL) > 0) {
665 density = atoi(property);
666 }
667 return density;
668 }
669 public:
670 static int getEmuDensity() {
671 return getDensityFromProperty("qemu.sf.lcd_density"); }
672 static int getBuildDensity() {
673 return getDensityFromProperty("ro.sf.lcd_density"); }
674 };
675
676 configs->clear();
677
678 const Vector<HWComposer::DisplayConfig>& hwConfigs =
679 getHwComposer().getConfigs(type);
680 for (size_t c = 0; c < hwConfigs.size(); ++c) {
681 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
682 DisplayInfo info = DisplayInfo();
683
684 float xdpi = hwConfig.xdpi;
685 float ydpi = hwConfig.ydpi;
686
687 if (type == DisplayDevice::DISPLAY_PRIMARY) {
688 // The density of the device is provided by a build property
689 float density = Density::getBuildDensity() / 160.0f;
690 if (density == 0) {
691 // the build doesn't provide a density -- this is wrong!
692 // use xdpi instead
693 ALOGE("ro.sf.lcd_density must be defined as a build property");
694 density = xdpi / 160.0f;
695 }
696 if (Density::getEmuDensity()) {
697 // if "qemu.sf.lcd_density" is specified, it overrides everything
698 xdpi = ydpi = density = Density::getEmuDensity();
699 density /= 160.0f;
700 }
701 info.density = density;
702
703 // TODO: this needs to go away (currently needed only by webkit)
704 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
705 info.orientation = hw->getOrientation();
706 } else {
707 // TODO: where should this value come from?
708 static const int TV_DENSITY = 213;
709 info.density = TV_DENSITY / 160.0f;
710 info.orientation = 0;
711 }
712
713 info.w = hwConfig.width;
714 info.h = hwConfig.height;
715 info.xdpi = xdpi;
716 info.ydpi = ydpi;
717 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800718 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000719
720 // This is how far in advance a buffer must be queued for
721 // presentation at a given time. If you want a buffer to appear
722 // on the screen at time N, you must submit the buffer before
723 // (N - presentationDeadline).
724 //
725 // Normally it's one full refresh period (to give SF a chance to
726 // latch the buffer), but this can be reduced by configuring a
727 // DispSync offset. Any additional delays introduced by the hardware
728 // composer or panel must be accounted for here.
729 //
730 // We add an additional 1ms to allow for processing time and
731 // differences between the ideal and actual refresh rate.
732 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800733 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000734
735 // All non-virtual displays are currently considered secure.
736 info.secure = true;
737
738 configs->push_back(info);
739 }
740
741 return NO_ERROR;
742}
743
744status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
745 DisplayStatInfo* stats) {
746 if (stats == NULL) {
747 return BAD_VALUE;
748 }
749
750 // FIXME for now we always return stats for the primary display
751 memset(stats, 0, sizeof(*stats));
752 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
753 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
754 return NO_ERROR;
755}
756
757int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
758 sp<DisplayDevice> device(getDisplayDevice(display));
759 if (device != NULL) {
760 return device->getActiveConfig();
761 }
762 return BAD_VALUE;
763}
764
765void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
766 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
767 this);
768 int32_t type = hw->getDisplayType();
769 int currentMode = hw->getActiveConfig();
770
771 if (mode == currentMode) {
772 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
773 return;
774 }
775
776 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
777 ALOGW("Trying to set config for virtual display");
778 return;
779 }
780
781 hw->setActiveConfig(mode);
782 getHwComposer().setActiveConfig(type, mode);
783}
784
785status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
786 class MessageSetActiveConfig: public MessageBase {
787 SurfaceFlinger& mFlinger;
788 sp<IBinder> mDisplay;
789 int mMode;
790 public:
791 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
792 int mode) :
793 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
794 virtual bool handler() {
795 Vector<DisplayInfo> configs;
796 mFlinger.getDisplayConfigs(mDisplay, &configs);
797 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
798 ALOGE("Attempt to set active config = %d for display with %zu configs",
799 mMode, configs.size());
800 }
801 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
802 if (hw == NULL) {
803 ALOGE("Attempt to set active config = %d for null display %p",
804 mMode, mDisplay.get());
805 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
806 ALOGW("Attempt to set active config = %d for virtual display",
807 mMode);
808 } else {
809 mFlinger.setActiveConfigInternal(hw, mMode);
810 }
811 return true;
812 }
813 };
814 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
815 postMessageSync(msg);
816 return NO_ERROR;
817}
818
819status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
820 Vector<android_color_mode_t>* outColorModes) {
821 if (outColorModes == nullptr || display.get() == nullptr) {
822 return BAD_VALUE;
823 }
824
825 int32_t type = getDisplayType(display);
826 if (type < 0) return type;
827
828 std::set<android_color_mode_t> colorModes;
829 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
830 colorModes.insert(hwConfig.colorMode);
831 }
832
833 outColorModes->clear();
834 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
835
836 return NO_ERROR;
837}
838
839android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
840 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
841
842 int32_t type = getDisplayType(display);
843 if (type < 0) return static_cast<android_color_mode_t>(type);
844
845 return getHwComposer().getColorMode(type);
846}
847
848status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
849 android_color_mode_t colorMode) {
850 if (display.get() == nullptr || colorMode < 0) {
851 return BAD_VALUE;
852 }
853
854 int32_t type = getDisplayType(display);
855 if (type < 0) return type;
856 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
857 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
858 desiredConfig.colorMode = colorMode;
859 for (size_t c = 0; c < hwConfigs.size(); ++c) {
860 const HWComposer::DisplayConfig config = hwConfigs[c];
861 if (config == desiredConfig) {
862 return setActiveConfig(display, c);
863 }
864 }
865 return BAD_VALUE;
866}
867
868status_t SurfaceFlinger::clearAnimationFrameStats() {
869 Mutex::Autolock _l(mStateLock);
870 mAnimFrameTracker.clearStats();
871 return NO_ERROR;
872}
873
874status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
875 Mutex::Autolock _l(mStateLock);
876 mAnimFrameTracker.getStats(outStats);
877 return NO_ERROR;
878}
879
880status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
881 HdrCapabilities* outCapabilities) const {
882 // HWC1 does not provide HDR capabilities
883 *outCapabilities = HdrCapabilities();
884 return NO_ERROR;
885}
886
887status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
888 if (enable == mInjectVSyncs) {
889 return NO_ERROR;
890 }
891
892 if (enable) {
893 mInjectVSyncs = enable;
894 ALOGV("VSync Injections enabled");
895 if (mVSyncInjector.get() == nullptr) {
896 mVSyncInjector = new InjectVSyncSource();
897 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
898 }
899 mEventQueue.setEventThread(mInjectorEventThread);
900 } else {
901 mInjectVSyncs = enable;
902 ALOGV("VSync Injections disabled");
903 mEventQueue.setEventThread(mSFEventThread);
904 mVSyncInjector.clear();
905 }
906 return NO_ERROR;
907}
908
909status_t SurfaceFlinger::injectVSync(nsecs_t when) {
910 if (!mInjectVSyncs) {
911 ALOGE("VSync Injections not enabled");
912 return BAD_VALUE;
913 }
914 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
915 ALOGV("Injecting VSync inside SurfaceFlinger");
916 mVSyncInjector->onInjectSyncEvent(when);
917 }
918 return NO_ERROR;
919}
920
921// ----------------------------------------------------------------------------
922
923sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
924 return mEventThread->createEventConnection();
925}
926
927// ----------------------------------------------------------------------------
928
929void SurfaceFlinger::waitForEvent() {
930 mEventQueue.waitMessage();
931}
932
933void SurfaceFlinger::signalTransaction() {
934 mEventQueue.invalidate();
935}
936
937void SurfaceFlinger::signalLayerUpdate() {
938 mEventQueue.invalidate();
939}
940
941void SurfaceFlinger::signalRefresh() {
942 mEventQueue.refresh();
943}
944
945status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
946 nsecs_t reltime, uint32_t /* flags */) {
947 return mEventQueue.postMessage(msg, reltime);
948}
949
950status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
951 nsecs_t reltime, uint32_t /* flags */) {
952 status_t res = mEventQueue.postMessage(msg, reltime);
953 if (res == NO_ERROR) {
954 msg->wait();
955 }
956 return res;
957}
958
959void SurfaceFlinger::run() {
960 do {
961 waitForEvent();
962 } while (true);
963}
964
965void SurfaceFlinger::enableHardwareVsync() {
966 Mutex::Autolock _l(mHWVsyncLock);
967 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
968 mPrimaryDispSync.beginResync();
969 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
970 mEventControlThread->setVsyncEnabled(true);
971 mPrimaryHWVsyncEnabled = true;
972 }
973}
974
975void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
976 Mutex::Autolock _l(mHWVsyncLock);
977
978 if (makeAvailable) {
979 mHWVsyncAvailable = true;
980 } else if (!mHWVsyncAvailable) {
981 // Hardware vsync is not currently available, so abort the resync
982 // attempt for now
983 return;
984 }
985
986 const nsecs_t period =
987 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
988
989 mPrimaryDispSync.reset();
990 mPrimaryDispSync.setPeriod(period);
991
992 if (!mPrimaryHWVsyncEnabled) {
993 mPrimaryDispSync.beginResync();
994 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
995 mEventControlThread->setVsyncEnabled(true);
996 mPrimaryHWVsyncEnabled = true;
997 }
998}
999
1000void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1001 Mutex::Autolock _l(mHWVsyncLock);
1002 if (mPrimaryHWVsyncEnabled) {
1003 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1004 mEventControlThread->setVsyncEnabled(false);
1005 mPrimaryDispSync.endResync();
1006 mPrimaryHWVsyncEnabled = false;
1007 }
1008 if (makeUnavailable) {
1009 mHWVsyncAvailable = false;
1010 }
1011}
1012
1013void SurfaceFlinger::resyncWithRateLimit() {
1014 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1015 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1016 resyncToHardwareVsync(false);
1017 }
1018}
1019
Steven Thomas3cfac282017-02-06 12:29:30 -08001020void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1021 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001022 bool needsHwVsync = false;
1023
1024 { // Scope for the lock
1025 Mutex::Autolock _l(mHWVsyncLock);
1026 if (type == 0 && mPrimaryHWVsyncEnabled) {
1027 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1028 }
1029 }
1030
1031 if (needsHwVsync) {
1032 enableHardwareVsync();
1033 } else {
1034 disableHardwareVsync(false);
1035 }
1036}
1037
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001038void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
Brian Andersond0010582017-03-07 13:20:31 -08001039 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001040 *compositorTiming = mCompositorTiming;
1041}
1042
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001043void SurfaceFlinger::onHotplugReceived(int type, bool connected) {
1044 if (mEventThread == NULL) {
1045 // This is a temporary workaround for b/7145521. A non-null pointer
1046 // does not mean EventThread has finished initializing, so this
1047 // is not a correct fix.
1048 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1049 return;
1050 }
1051
1052 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1053 Mutex::Autolock _l(mStateLock);
1054 if (connected) {
1055 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1056 } else {
1057 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1058 mBuiltinDisplays[type].clear();
1059 }
1060 setTransactionFlags(eDisplayTransactionNeeded);
1061
1062 // Defer EventThread notification until SF has updated mDisplays.
1063 }
1064}
1065
Steven Thomas3cfac282017-02-06 12:29:30 -08001066void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1067 repaintEverything();
1068}
1069
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001070void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1071 ATRACE_CALL();
1072 getHwComposer().eventControl(disp, event, enabled);
1073}
1074
1075void SurfaceFlinger::onMessageReceived(int32_t what) {
1076 ATRACE_CALL();
1077 switch (what) {
1078 case MessageQueue::INVALIDATE: {
1079 bool refreshNeeded = handleMessageTransaction();
1080 refreshNeeded |= handleMessageInvalidate();
1081 refreshNeeded |= mRepaintEverything;
1082 if (refreshNeeded) {
1083 // Signal a refresh if a transaction modified the window state,
1084 // a new buffer was latched, or if HWC has requested a full
1085 // repaint
1086 signalRefresh();
1087 }
1088 break;
1089 }
1090 case MessageQueue::REFRESH: {
1091 handleMessageRefresh();
1092 break;
1093 }
1094 }
1095}
1096
1097bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001098 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001099 if (transactionFlags) {
1100 handleTransaction(transactionFlags);
1101 return true;
1102 }
1103 return false;
1104}
1105
1106bool SurfaceFlinger::handleMessageInvalidate() {
1107 ATRACE_CALL();
1108 return handlePageFlip();
1109}
1110
1111void SurfaceFlinger::handleMessageRefresh() {
1112 ATRACE_CALL();
1113
1114 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1115
Brian Andersond6927fb2016-07-23 23:37:30 -07001116 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001117 rebuildLayerStacks();
1118 setUpHWComposer();
1119 doDebugFlashRegions();
1120 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001121 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001122}
1123
1124void SurfaceFlinger::doDebugFlashRegions()
1125{
1126 // is debugging enabled
1127 if (CC_LIKELY(!mDebugRegion))
1128 return;
1129
1130 const bool repaintEverything = mRepaintEverything;
1131 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1132 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1133 if (hw->isDisplayOn()) {
1134 // transform the dirty region into this screen's coordinate space
1135 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1136 if (!dirtyRegion.isEmpty()) {
1137 // redraw the whole screen
1138 doComposeSurfaces(hw, Region(hw->bounds()));
1139
1140 // and draw the dirty region
1141 const int32_t height = hw->getHeight();
1142 RenderEngine& engine(getRenderEngine());
1143 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1144
1145 hw->compositionComplete();
1146 hw->swapBuffers(getHwComposer());
1147 }
1148 }
1149 }
1150
1151 postFramebuffer();
1152
1153 if (mDebugRegion > 1) {
1154 usleep(mDebugRegion * 1000);
1155 }
1156
1157 HWComposer& hwc(getHwComposer());
1158 if (hwc.initCheck() == NO_ERROR) {
1159 status_t err = hwc.prepare();
1160 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1161 }
1162}
1163
Brian Andersond6927fb2016-07-23 23:37:30 -07001164void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001165{
1166 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001167 mDrawingState.traverseInZOrder([&](Layer* layer) {
1168 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001169 needExtraInvalidate = true;
1170 }
Robert Carr2047fae2016-11-28 14:09:09 -08001171 });
1172
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001173 if (needExtraInvalidate) {
1174 signalLayerUpdate();
1175 }
1176}
1177
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001178void SurfaceFlinger::updateCompositorTiming(
1179 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1180 std::shared_ptr<FenceTime>& presentFenceTime) {
1181 // Update queue of past composite+present times and determine the
1182 // most recently known composite to present latency.
1183 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1184 nsecs_t compositeToPresentLatency = -1;
1185 while (!mCompositePresentTimes.empty()) {
1186 CompositePresentTime& cpt = mCompositePresentTimes.front();
1187 // Cached values should have been updated before calling this method,
1188 // which helps avoid duplicate syscalls.
1189 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1190 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1191 break;
1192 }
1193 compositeToPresentLatency = displayTime - cpt.composite;
1194 mCompositePresentTimes.pop();
1195 }
1196
1197 // Don't let mCompositePresentTimes grow unbounded, just in case.
1198 while (mCompositePresentTimes.size() > 16) {
1199 mCompositePresentTimes.pop();
1200 }
1201
Brian Andersond0010582017-03-07 13:20:31 -08001202 setCompositorTimingSnapped(
1203 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1204}
1205
1206void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1207 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001208 // Integer division and modulo round toward 0 not -inf, so we need to
1209 // treat negative and positive offsets differently.
Brian Andersond0010582017-03-07 13:20:31 -08001210 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001211 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1212 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1213
Brian Andersond0010582017-03-07 13:20:31 -08001214 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1215 if (idealLatency <= 0) {
1216 idealLatency = vsyncInterval;
1217 }
1218
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001219 // Snap the latency to a value that removes scheduling jitter from the
1220 // composition and present times, which often have >1ms of jitter.
1221 // Reducing jitter is important if an app attempts to extrapolate
1222 // something (such as user input) to an accurate diasplay time.
1223 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1224 // with (presentLatency % interval).
Brian Andersond0010582017-03-07 13:20:31 -08001225 nsecs_t bias = vsyncInterval / 2;
1226 int64_t extraVsyncs =
1227 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1228 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1229 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001230
Brian Andersond0010582017-03-07 13:20:31 -08001231 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001232 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1233 mCompositorTiming.interval = vsyncInterval;
Brian Andersond0010582017-03-07 13:20:31 -08001234 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001235}
1236
1237void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001238{
Brian Andersond6927fb2016-07-23 23:37:30 -07001239 const HWComposer& hwc = getHwComposer();
1240 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1241
Brian Anderson3d4039d2016-09-23 16:31:30 -07001242 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1243 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1244 glCompositionDoneFenceTime =
1245 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1246 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1247 } else {
1248 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1249 }
1250 mGlCompositionDoneTimeline.updateSignalTimes();
1251
Brian Anderson4e606e32017-03-16 15:34:57 -07001252 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1253 auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
Brian Anderson3d4039d2016-09-23 16:31:30 -07001254 mDisplayTimeline.push(retireFenceTime);
1255 mDisplayTimeline.updateSignalTimes();
Brian Andersond6927fb2016-07-23 23:37:30 -07001256
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001257 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1258 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1259
1260 // We use the refreshStartTime which might be sampled a little later than
1261 // when we started doing work for this frame, but that should be okay
1262 // since updateCompositorTiming has snapping logic.
1263 updateCompositorTiming(
1264 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
Brian Andersond0010582017-03-07 13:20:31 -08001265 CompositorTiming compositorTiming;
1266 {
1267 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1268 compositorTiming = mCompositorTiming;
1269 }
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001270
Robert Carr2047fae2016-11-28 14:09:09 -08001271 mDrawingState.traverseInZOrder([&](Layer* layer) {
Brian Anderson4e606e32017-03-16 15:34:57 -07001272 // TODO(brianderson): The retire fence is incorrectly passed in as the
1273 // present fence. Fix this if this file lives on.
Robert Carr2047fae2016-11-28 14:09:09 -08001274 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson4e606e32017-03-16 15:34:57 -07001275 retireFenceTime, compositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001276 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001277 recordBufferingStats(layer->getName().string(),
1278 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001279 }
Robert Carr2047fae2016-11-28 14:09:09 -08001280 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001281
Brian Anderson4e606e32017-03-16 15:34:57 -07001282 if (retireFence->isValid()) {
1283 if (mPrimaryDispSync.addPresentFence(retireFence)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001284 enableHardwareVsync();
1285 } else {
1286 disableHardwareVsync(false);
1287 }
1288 }
1289
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08001290 if (!hasSyncFramework) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001291 if (hw->isDisplayOn()) {
1292 enableHardwareVsync();
1293 }
1294 }
1295
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001296 if (mAnimCompositionPending) {
1297 mAnimCompositionPending = false;
1298
Brian Anderson3d4039d2016-09-23 16:31:30 -07001299 if (retireFenceTime->isValid()) {
1300 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001301 } else {
1302 // The HWC doesn't support present fences, so use the refresh
1303 // timestamp instead.
1304 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1305 mAnimFrameTracker.setActualPresentTime(presentTime);
1306 }
1307 mAnimFrameTracker.advanceFrame();
1308 }
1309
1310 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1311 return;
1312 }
1313
1314 nsecs_t currentTime = systemTime();
1315 if (mHasPoweredOff) {
1316 mHasPoweredOff = false;
1317 } else {
1318 nsecs_t period = mPrimaryDispSync.getPeriod();
1319 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1320 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1321 if (numPeriods < NUM_BUCKETS - 1) {
1322 mFrameBuckets[numPeriods] += elapsedTime;
1323 } else {
1324 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1325 }
1326 mTotalTime += elapsedTime;
1327 }
1328 mLastSwapTime = currentTime;
1329}
1330
1331void SurfaceFlinger::rebuildLayerStacks() {
1332 // rebuild the visible layer list per screen
1333 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1334 ATRACE_CALL();
1335 mVisibleRegionsDirty = false;
1336 invalidateHwcGeometry();
1337
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001338 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1339 Region opaqueRegion;
1340 Region dirtyRegion;
1341 Vector< sp<Layer> > layersSortedByZ;
1342 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1343 const Transform& tr(hw->getTransform());
1344 const Rect bounds(hw->getBounds());
1345 if (hw->isDisplayOn()) {
Robert Carr2047fae2016-11-28 14:09:09 -08001346 computeVisibleRegions(hw->getLayerStack(), dirtyRegion,
1347 opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001348
Robert Carr2047fae2016-11-28 14:09:09 -08001349 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001350 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001351 Region drawRegion(tr.transform(
1352 layer->visibleNonTransparentRegion));
1353 drawRegion.andSelf(bounds);
1354 if (!drawRegion.isEmpty()) {
1355 layersSortedByZ.add(layer);
1356 }
1357 }
Robert Carr2047fae2016-11-28 14:09:09 -08001358 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001359 }
1360 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1361 hw->undefinedRegion.set(bounds);
1362 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1363 hw->dirtyRegion.orSelf(dirtyRegion);
1364 }
1365 }
1366}
1367
1368void SurfaceFlinger::setUpHWComposer() {
1369 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1370 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1371 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1372 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1373
1374 // If nothing has changed (!dirty), don't recompose.
1375 // If something changed, but we don't currently have any visible layers,
1376 // and didn't when we last did a composition, then skip it this time.
1377 // The second rule does two things:
1378 // - When all layers are removed from a display, we'll emit one black
1379 // frame, then nothing more until we get new layers.
1380 // - When a display is created with a private layer stack, we won't
1381 // emit any black frames until a layer is added to the layer stack.
1382 bool mustRecompose = dirty && !(empty && wasEmpty);
1383
1384 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1385 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1386 mustRecompose ? "doing" : "skipping",
1387 dirty ? "+" : "-",
1388 empty ? "+" : "-",
1389 wasEmpty ? "+" : "-");
1390
1391 mDisplays[dpy]->beginFrame(mustRecompose);
1392
1393 if (mustRecompose) {
1394 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1395 }
1396 }
1397
1398 HWComposer& hwc(getHwComposer());
1399 if (hwc.initCheck() == NO_ERROR) {
1400 // build the h/w work list
1401 if (CC_UNLIKELY(mHwWorkListDirty)) {
1402 mHwWorkListDirty = false;
1403 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1404 sp<const DisplayDevice> hw(mDisplays[dpy]);
1405 const int32_t id = hw->getHwcDisplayId();
1406 if (id >= 0) {
1407 const Vector< sp<Layer> >& currentLayers(
1408 hw->getVisibleLayersSortedByZ());
1409 const size_t count = currentLayers.size();
1410 if (hwc.createWorkList(id, count) == NO_ERROR) {
1411 HWComposer::LayerListIterator cur = hwc.begin(id);
1412 const HWComposer::LayerListIterator end = hwc.end(id);
1413 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1414 const sp<Layer>& layer(currentLayers[i]);
1415 layer->setGeometry(hw, *cur);
1416 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1417 cur->setSkip(true);
1418 }
1419 }
1420 }
1421 }
1422 }
1423 }
1424
1425 // set the per-frame data
1426 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1427 sp<const DisplayDevice> hw(mDisplays[dpy]);
1428 const int32_t id = hw->getHwcDisplayId();
1429 if (id >= 0) {
1430 const Vector< sp<Layer> >& currentLayers(
1431 hw->getVisibleLayersSortedByZ());
1432 const size_t count = currentLayers.size();
1433 HWComposer::LayerListIterator cur = hwc.begin(id);
1434 const HWComposer::LayerListIterator end = hwc.end(id);
1435 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1436 /*
1437 * update the per-frame h/w composer data for each layer
1438 * and build the transparent region of the FB
1439 */
1440 const sp<Layer>& layer(currentLayers[i]);
1441 layer->setPerFrameData(hw, *cur);
1442 }
1443 }
1444 }
1445
1446 // If possible, attempt to use the cursor overlay on each display.
1447 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1448 sp<const DisplayDevice> hw(mDisplays[dpy]);
1449 const int32_t id = hw->getHwcDisplayId();
1450 if (id >= 0) {
1451 const Vector< sp<Layer> >& currentLayers(
1452 hw->getVisibleLayersSortedByZ());
1453 const size_t count = currentLayers.size();
1454 HWComposer::LayerListIterator cur = hwc.begin(id);
1455 const HWComposer::LayerListIterator end = hwc.end(id);
1456 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1457 const sp<Layer>& layer(currentLayers[i]);
1458 if (layer->isPotentialCursor()) {
1459 cur->setIsCursorLayerHint();
1460 break;
1461 }
1462 }
1463 }
1464 }
1465
1466 status_t err = hwc.prepare();
1467 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1468
1469 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1470 sp<const DisplayDevice> hw(mDisplays[dpy]);
1471 hw->prepareFrame(hwc);
1472 }
1473 }
1474}
1475
1476void SurfaceFlinger::doComposition() {
1477 ATRACE_CALL();
1478 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1479 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1480 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1481 if (hw->isDisplayOn()) {
1482 // transform the dirty region into this screen's coordinate space
1483 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1484
1485 // repaint the framebuffer (if needed)
1486 doDisplayComposition(hw, dirtyRegion);
1487
1488 hw->dirtyRegion.clear();
1489 hw->flip(hw->swapRegion);
1490 hw->swapRegion.clear();
1491 }
1492 // inform the h/w that we're done compositing
1493 hw->compositionComplete();
1494 }
1495 postFramebuffer();
1496}
1497
1498void SurfaceFlinger::postFramebuffer()
1499{
1500 ATRACE_CALL();
1501
1502 const nsecs_t now = systemTime();
1503 mDebugInSwapBuffers = now;
1504
1505 HWComposer& hwc(getHwComposer());
1506 if (hwc.initCheck() == NO_ERROR) {
1507 if (!hwc.supportsFramebufferTarget()) {
1508 // EGL spec says:
1509 // "surface must be bound to the calling thread's current context,
1510 // for the current rendering API."
1511 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1512 }
1513 hwc.commit();
1514 }
1515
1516 // make the default display current because the VirtualDisplayDevice code cannot
1517 // deal with dequeueBuffer() being called outside of the composition loop; however
1518 // the code below can call glFlush() which is allowed (and does in some case) call
1519 // dequeueBuffer().
1520 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1521
1522 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1523 sp<const DisplayDevice> hw(mDisplays[dpy]);
1524 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1525 hw->onSwapBuffersCompleted(hwc);
1526 const size_t count = currentLayers.size();
1527 int32_t id = hw->getHwcDisplayId();
1528 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1529 HWComposer::LayerListIterator cur = hwc.begin(id);
1530 const HWComposer::LayerListIterator end = hwc.end(id);
1531 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1532 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1533 }
1534 } else {
1535 for (size_t i = 0; i < count; i++) {
1536 currentLayers[i]->onLayerDisplayed(hw, NULL);
1537 }
1538 }
1539 }
1540
1541 mLastSwapBufferTime = systemTime() - now;
1542 mDebugInSwapBuffers = 0;
1543
1544 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1545 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1546 logFrameStats();
1547 }
1548}
1549
1550void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1551{
1552 ATRACE_CALL();
1553
1554 // here we keep a copy of the drawing state (that is the state that's
1555 // going to be overwritten by handleTransactionLocked()) outside of
1556 // mStateLock so that the side-effects of the State assignment
1557 // don't happen with mStateLock held (which can cause deadlocks).
1558 State drawingState(mDrawingState);
1559
1560 Mutex::Autolock _l(mStateLock);
1561 const nsecs_t now = systemTime();
1562 mDebugInTransaction = now;
1563
1564 // Here we're guaranteed that some transaction flags are set
1565 // so we can call handleTransactionLocked() unconditionally.
1566 // We call getTransactionFlags(), which will also clear the flags,
1567 // with mStateLock held to guarantee that mCurrentState won't change
1568 // until the transaction is committed.
1569
1570 transactionFlags = getTransactionFlags(eTransactionMask);
1571 handleTransactionLocked(transactionFlags);
1572
1573 mLastTransactionTime = systemTime() - now;
1574 mDebugInTransaction = 0;
1575 invalidateHwcGeometry();
1576 // here the transaction has been committed
1577}
1578
1579void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1580{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001581 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001582 mCurrentState.traverseInZOrder([](Layer* layer) {
1583 layer->notifyAvailableFrames();
1584 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001585
1586 /*
1587 * Traversal of the children
1588 * (perform the transaction for each of them if needed)
1589 */
1590
1591 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001592 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001593 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001594 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001595
1596 const uint32_t flags = layer->doTransaction(0);
1597 if (flags & Layer::eVisibleRegion)
1598 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001599 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001600 }
1601
1602 /*
1603 * Perform display own transactions if needed
1604 */
1605
1606 if (transactionFlags & eDisplayTransactionNeeded) {
1607 // here we take advantage of Vector's copy-on-write semantics to
1608 // improve performance by skipping the transaction entirely when
1609 // know that the lists are identical
1610 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1611 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1612 if (!curr.isIdenticalTo(draw)) {
1613 mVisibleRegionsDirty = true;
1614 const size_t cc = curr.size();
1615 size_t dc = draw.size();
1616
1617 // find the displays that were removed
1618 // (ie: in drawing state but not in current state)
1619 // also handle displays that changed
1620 // (ie: displays that are in both lists)
1621 for (size_t i=0 ; i<dc ; i++) {
1622 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1623 if (j < 0) {
1624 // in drawing state but not in current state
1625 if (!draw[i].isMainDisplay()) {
1626 // Call makeCurrent() on the primary display so we can
1627 // be sure that nothing associated with this display
1628 // is current.
1629 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1630 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1631 sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1632 if (hw != NULL)
1633 hw->disconnect(getHwComposer());
1634 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1635 mEventThread->onHotplugReceived(draw[i].type, false);
1636 mDisplays.removeItem(draw.keyAt(i));
1637 } else {
1638 ALOGW("trying to remove the main display");
1639 }
1640 } else {
1641 // this display is in both lists. see if something changed.
1642 const DisplayDeviceState& state(curr[j]);
1643 const wp<IBinder>& display(curr.keyAt(j));
1644 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1645 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1646 if (state_binder != draw_binder) {
1647 // changing the surface is like destroying and
1648 // recreating the DisplayDevice, so we just remove it
1649 // from the drawing state, so that it get re-added
1650 // below.
1651 sp<DisplayDevice> hw(getDisplayDevice(display));
1652 if (hw != NULL)
1653 hw->disconnect(getHwComposer());
1654 mDisplays.removeItem(display);
1655 mDrawingState.displays.removeItemsAt(i);
1656 dc--; i--;
1657 // at this point we must loop to the next item
1658 continue;
1659 }
1660
1661 const sp<DisplayDevice> disp(getDisplayDevice(display));
1662 if (disp != NULL) {
1663 if (state.layerStack != draw[i].layerStack) {
1664 disp->setLayerStack(state.layerStack);
1665 }
1666 if ((state.orientation != draw[i].orientation)
1667 || (state.viewport != draw[i].viewport)
1668 || (state.frame != draw[i].frame))
1669 {
1670 disp->setProjection(state.orientation,
1671 state.viewport, state.frame);
1672 }
1673 if (state.width != draw[i].width || state.height != draw[i].height) {
1674 disp->setDisplaySize(state.width, state.height);
1675 }
1676 }
1677 }
1678 }
1679
1680 // find displays that were added
1681 // (ie: in current state but not in drawing state)
1682 for (size_t i=0 ; i<cc ; i++) {
1683 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1684 const DisplayDeviceState& state(curr[i]);
1685
1686 sp<DisplaySurface> dispSurface;
1687 sp<IGraphicBufferProducer> producer;
1688 sp<IGraphicBufferProducer> bqProducer;
1689 sp<IGraphicBufferConsumer> bqConsumer;
Romain Guyf8b4ca52017-03-16 18:39:20 +00001690 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer,
1691 new GraphicBufferAlloc());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001692
1693 int32_t hwcDisplayId = -1;
1694 if (state.isVirtualDisplay()) {
1695 // Virtual displays without a surface are dormant:
1696 // they have external state (layer stack, projection,
1697 // etc.) but no internal state (i.e. a DisplayDevice).
1698 if (state.surface != NULL) {
1699
1700 int width = 0;
1701 int status = state.surface->query(
1702 NATIVE_WINDOW_WIDTH, &width);
1703 ALOGE_IF(status != NO_ERROR,
1704 "Unable to query width (%d)", status);
1705 int height = 0;
1706 status = state.surface->query(
1707 NATIVE_WINDOW_HEIGHT, &height);
1708 ALOGE_IF(status != NO_ERROR,
1709 "Unable to query height (%d)", status);
1710 if (mUseHwcVirtualDisplays &&
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08001711 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1712 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1713 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001714 hwcDisplayId = allocateHwcDisplayId(state.type);
1715 }
1716
1717 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1718 *mHwc, hwcDisplayId, state.surface,
1719 bqProducer, bqConsumer, state.displayName);
1720
1721 dispSurface = vds;
1722 producer = vds;
1723 }
1724 } else {
1725 ALOGE_IF(state.surface!=NULL,
1726 "adding a supported display, but rendering "
1727 "surface is provided (%p), ignoring it",
1728 state.surface.get());
1729 hwcDisplayId = allocateHwcDisplayId(state.type);
1730 // for supported (by hwc) displays we provide our
1731 // own rendering surface
1732 dispSurface = new FramebufferSurface(*mHwc, state.type,
1733 bqConsumer);
1734 producer = bqProducer;
1735 }
1736
1737 const wp<IBinder>& display(curr.keyAt(i));
1738 if (dispSurface != NULL) {
1739 sp<DisplayDevice> hw = new DisplayDevice(this,
1740 state.type, hwcDisplayId,
1741 mHwc->getFormat(hwcDisplayId), state.isSecure,
1742 display, dispSurface, producer,
1743 mRenderEngine->getEGLConfig());
1744 hw->setLayerStack(state.layerStack);
1745 hw->setProjection(state.orientation,
1746 state.viewport, state.frame);
1747 hw->setDisplayName(state.displayName);
1748 mDisplays.add(display, hw);
1749 if (state.isVirtualDisplay()) {
1750 if (hwcDisplayId >= 0) {
1751 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1752 hw->getWidth(), hw->getHeight(),
1753 hw->getFormat());
1754 }
1755 } else {
1756 mEventThread->onHotplugReceived(state.type, true);
1757 }
1758 }
1759 }
1760 }
1761 }
1762 }
1763
1764 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1765 // The transform hint might have changed for some layers
1766 // (either because a display has changed, or because a layer
1767 // as changed).
1768 //
1769 // Walk through all the layers in currentLayers,
1770 // and update their transform hint.
1771 //
1772 // If a layer is visible only on a single display, then that
1773 // display is used to calculate the hint, otherwise we use the
1774 // default display.
1775 //
1776 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1777 // the hint is set before we acquire a buffer from the surface texture.
1778 //
1779 // NOTE: layer transactions have taken place already, so we use their
1780 // drawing state. However, SurfaceFlinger's own transaction has not
1781 // happened yet, so we must use the current state layer list
1782 // (soon to become the drawing state list).
1783 //
1784 sp<const DisplayDevice> disp;
1785 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001786 bool first = true;
1787 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001788 // NOTE: we rely on the fact that layers are sorted by
1789 // layerStack first (so we don't have to traverse the list
1790 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001791 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001792 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001793 currentlayerStack = layerStack;
1794 // figure out if this layerstack is mirrored
1795 // (more than one display) if so, pick the default display,
1796 // if not, pick the only display it's on.
1797 disp.clear();
1798 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1799 sp<const DisplayDevice> hw(mDisplays[dpy]);
1800 if (hw->getLayerStack() == currentlayerStack) {
1801 if (disp == NULL) {
1802 disp = hw;
1803 } else {
1804 disp = NULL;
1805 break;
1806 }
1807 }
1808 }
1809 }
1810 if (disp == NULL) {
1811 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1812 // redraw after transform hint changes. See bug 8508397.
1813
1814 // could be null when this layer is using a layerStack
1815 // that is not visible on any display. Also can occur at
1816 // screen off/on times.
1817 disp = getDefaultDisplayDevice();
1818 }
1819 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001820
1821 first = false;
1822 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001823 }
1824
1825
1826 /*
1827 * Perform our own transaction if needed
1828 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001829
1830 if (mLayersAdded) {
1831 mLayersAdded = false;
1832 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001833 mVisibleRegionsDirty = true;
1834 }
1835
1836 // some layers might have been removed, so
1837 // we need to update the regions they're exposing.
1838 if (mLayersRemoved) {
1839 mLayersRemoved = false;
1840 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001841 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001842 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001843 // this layer is not visible anymore
1844 // TODO: we could traverse the tree from front to back and
1845 // compute the actual visible region
1846 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001847 Region visibleReg;
1848 visibleReg.set(layer->computeScreenBounds());
1849 invalidateLayerStack(layer->getLayerStack(), visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001850 }
Robert Carr2047fae2016-11-28 14:09:09 -08001851 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001852 }
1853
1854 commitTransaction();
1855
1856 updateCursorAsync();
1857}
1858
1859void SurfaceFlinger::updateCursorAsync()
1860{
1861 HWComposer& hwc(getHwComposer());
1862 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1863 sp<const DisplayDevice> hw(mDisplays[dpy]);
1864 const int32_t id = hw->getHwcDisplayId();
1865 if (id < 0) {
1866 continue;
1867 }
1868 const Vector< sp<Layer> >& currentLayers(
1869 hw->getVisibleLayersSortedByZ());
1870 const size_t count = currentLayers.size();
1871 HWComposer::LayerListIterator cur = hwc.begin(id);
1872 const HWComposer::LayerListIterator end = hwc.end(id);
1873 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1874 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1875 continue;
1876 }
1877 const sp<Layer>& layer(currentLayers[i]);
1878 Rect cursorPos = layer->getPosition(hw);
1879 hwc.setCursorPositionAsync(id, cursorPos);
1880 break;
1881 }
1882 }
1883}
1884
1885void SurfaceFlinger::commitTransaction()
1886{
1887 if (!mLayersPendingRemoval.isEmpty()) {
1888 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001889 for (const auto& l : mLayersPendingRemoval) {
1890 recordBufferingStats(l->getName().string(),
1891 l->getOccupancyHistory(true));
1892 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001893 }
1894 mLayersPendingRemoval.clear();
1895 }
1896
1897 // If this transaction is part of a window animation then the next frame
1898 // we composite should be considered an animation as well.
1899 mAnimCompositionPending = mAnimTransactionPending;
1900
1901 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001902 mDrawingState.traverseInZOrder([](Layer* layer) {
1903 layer->commitChildList();
1904 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001905 mTransactionPending = false;
1906 mAnimTransactionPending = false;
1907 mTransactionCV.broadcast();
1908}
1909
Robert Carr2047fae2016-11-28 14:09:09 -08001910void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001911 Region& outDirtyRegion, Region& outOpaqueRegion)
1912{
1913 ATRACE_CALL();
1914
1915 Region aboveOpaqueLayers;
1916 Region aboveCoveredLayers;
1917 Region dirty;
1918
1919 outDirtyRegion.clear();
1920
Robert Carr2047fae2016-11-28 14:09:09 -08001921 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001922 // start with the whole surface at its current location
1923 const Layer::State& s(layer->getDrawingState());
1924
1925 // only consider the layers on the given layer stack
Robert Carr1f0a16a2016-10-24 16:27:39 -07001926 if (layer->getLayerStack() != layerStack)
Robert Carr2047fae2016-11-28 14:09:09 -08001927 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001928
1929 /*
1930 * opaqueRegion: area of a surface that is fully opaque.
1931 */
1932 Region opaqueRegion;
1933
1934 /*
1935 * visibleRegion: area of a surface that is visible on screen
1936 * and not fully transparent. This is essentially the layer's
1937 * footprint minus the opaque regions above it.
1938 * Areas covered by a translucent surface are considered visible.
1939 */
1940 Region visibleRegion;
1941
1942 /*
1943 * coveredRegion: area of a surface that is covered by all
1944 * visible regions above it (which includes the translucent areas).
1945 */
1946 Region coveredRegion;
1947
1948 /*
1949 * transparentRegion: area of a surface that is hinted to be completely
1950 * transparent. This is only used to tell when the layer has no visible
1951 * non-transparent regions and can be removed from the layer list. It
1952 * does not affect the visibleRegion of this layer or any layers
1953 * beneath it. The hint may not be correct if apps don't respect the
1954 * SurfaceView restrictions (which, sadly, some don't).
1955 */
1956 Region transparentRegion;
1957
1958
1959 // handle hidden surfaces by setting the visible region to empty
1960 if (CC_LIKELY(layer->isVisible())) {
1961 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001962 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001963 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001964 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001965 if (!visibleRegion.isEmpty()) {
1966 // Remove the transparent area from the visible region
1967 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001968 if (tr.preserveRects()) {
1969 // transform the transparent region
1970 transparentRegion = tr.transform(s.activeTransparentRegion);
1971 } else {
1972 // transformation too complex, can't do the
1973 // transparent region optimization.
1974 transparentRegion.clear();
1975 }
1976 }
1977
1978 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001979 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001980 if (s.alpha==255 && !translucent &&
1981 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1982 // the opaque region is the layer's footprint
1983 opaqueRegion = visibleRegion;
1984 }
1985 }
1986 }
1987
1988 // Clip the covered region to the visible region
1989 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1990
1991 // Update aboveCoveredLayers for next (lower) layer
1992 aboveCoveredLayers.orSelf(visibleRegion);
1993
1994 // subtract the opaque region covered by the layers above us
1995 visibleRegion.subtractSelf(aboveOpaqueLayers);
1996
1997 // compute this layer's dirty region
1998 if (layer->contentDirty) {
1999 // we need to invalidate the whole region
2000 dirty = visibleRegion;
2001 // as well, as the old visible region
2002 dirty.orSelf(layer->visibleRegion);
2003 layer->contentDirty = false;
2004 } else {
2005 /* compute the exposed region:
2006 * the exposed region consists of two components:
2007 * 1) what's VISIBLE now and was COVERED before
2008 * 2) what's EXPOSED now less what was EXPOSED before
2009 *
2010 * note that (1) is conservative, we start with the whole
2011 * visible region but only keep what used to be covered by
2012 * something -- which mean it may have been exposed.
2013 *
2014 * (2) handles areas that were not covered by anything but got
2015 * exposed because of a resize.
2016 */
2017 const Region newExposed = visibleRegion - coveredRegion;
2018 const Region oldVisibleRegion = layer->visibleRegion;
2019 const Region oldCoveredRegion = layer->coveredRegion;
2020 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2021 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2022 }
2023 dirty.subtractSelf(aboveOpaqueLayers);
2024
2025 // accumulate to the screen dirty region
2026 outDirtyRegion.orSelf(dirty);
2027
2028 // Update aboveOpaqueLayers for next (lower) layer
2029 aboveOpaqueLayers.orSelf(opaqueRegion);
2030
2031 // Store the visible region in screen space
2032 layer->setVisibleRegion(visibleRegion);
2033 layer->setCoveredRegion(coveredRegion);
2034 layer->setVisibleNonTransparentRegion(
2035 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002036 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002037
2038 outOpaqueRegion = aboveOpaqueLayers;
2039}
2040
2041void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2042 const Region& dirty) {
2043 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2044 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2045 if (hw->getLayerStack() == layerStack) {
2046 hw->dirtyRegion.orSelf(dirty);
2047 }
2048 }
2049}
2050
2051bool SurfaceFlinger::handlePageFlip()
2052{
Brian Andersond6927fb2016-07-23 23:37:30 -07002053 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002054 Region dirtyRegion;
2055
2056 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002057 bool frameQueued = false;
2058
2059 // Store the set of layers that need updates. This set must not change as
2060 // buffers are being latched, as this could result in a deadlock.
2061 // Example: Two producers share the same command stream and:
2062 // 1.) Layer 0 is latched
2063 // 2.) Layer 0 gets a new frame
2064 // 2.) Layer 1 gets a new frame
2065 // 3.) Layer 1 is latched.
2066 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2067 // second frame. But layer 0's second frame could be waiting on display.
2068 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002069 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002070 if (layer->hasQueuedFrame()) {
2071 frameQueued = true;
2072 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002073 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002074 } else {
2075 layer->useEmptyDamage();
2076 }
2077 } else {
2078 layer->useEmptyDamage();
2079 }
Robert Carr2047fae2016-11-28 14:09:09 -08002080 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002081 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2082 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002083 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002084 layer->useSurfaceDamage();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002085 invalidateLayerStack(layer->getLayerStack(), dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002086 }
2087
2088 mVisibleRegionsDirty |= visibleRegions;
2089
2090 // If we will need to wake up at some time in the future to deal with a
2091 // queued frame that shouldn't be displayed during this vsync period, wake
2092 // up during the next vsync period to check again.
2093 if (frameQueued && layersWithQueuedFrames.empty()) {
2094 signalLayerUpdate();
2095 }
2096
2097 // Only continue with the refresh if there is actually new work to do
2098 return !layersWithQueuedFrames.empty();
2099}
2100
2101void SurfaceFlinger::invalidateHwcGeometry()
2102{
2103 mHwWorkListDirty = true;
2104}
2105
2106
2107void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2108 const Region& inDirtyRegion)
2109{
2110 // We only need to actually compose the display if:
2111 // 1) It is being handled by hardware composer, which may need this to
2112 // keep its virtual display state machine in sync, or
2113 // 2) There is work to be done (the dirty region isn't empty)
2114 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2115 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2116 return;
2117 }
2118
2119 Region dirtyRegion(inDirtyRegion);
2120
2121 // compute the invalid region
2122 hw->swapRegion.orSelf(dirtyRegion);
2123
2124 uint32_t flags = hw->getFlags();
2125 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2126 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2127 // takes a rectangle, we must make sure to update that whole
2128 // rectangle in that case
2129 dirtyRegion.set(hw->swapRegion.bounds());
2130 } else {
2131 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2132 // We need to redraw the rectangle that will be updated
2133 // (pushed to the framebuffer).
2134 // This is needed because PARTIAL_UPDATES only takes one
2135 // rectangle instead of a region (see DisplayDevice::flip())
2136 dirtyRegion.set(hw->swapRegion.bounds());
2137 } else {
2138 // we need to redraw everything (the whole screen)
2139 dirtyRegion.set(hw->bounds());
2140 hw->swapRegion = dirtyRegion;
2141 }
2142 }
2143
2144 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2145 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2146 } else {
2147 RenderEngine& engine(getRenderEngine());
2148 mat4 colorMatrix = mColorMatrix;
2149 if (mDaltonize) {
2150 colorMatrix = colorMatrix * mDaltonizer();
2151 }
2152 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2153 doComposeSurfaces(hw, dirtyRegion);
2154 engine.setupColorTransform(oldMatrix);
2155 }
2156
2157 // update the swap region and clear the dirty region
2158 hw->swapRegion.orSelf(dirtyRegion);
2159
2160 // swap buffers (presentation)
2161 hw->swapBuffers(getHwComposer());
2162}
2163
2164bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2165{
2166 RenderEngine& engine(getRenderEngine());
2167 const int32_t id = hw->getHwcDisplayId();
2168 HWComposer& hwc(getHwComposer());
2169 HWComposer::LayerListIterator cur = hwc.begin(id);
2170 const HWComposer::LayerListIterator end = hwc.end(id);
2171
2172 bool hasGlesComposition = hwc.hasGlesComposition(id);
2173 if (hasGlesComposition) {
2174 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2175 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2176 hw->getDisplayName().string());
2177 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2178 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2179 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2180 }
2181 return false;
2182 }
2183
2184 // Never touch the framebuffer if we don't have any framebuffer layers
2185 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2186 if (hasHwcComposition) {
2187 // when using overlays, we assume a fully transparent framebuffer
2188 // NOTE: we could reduce how much we need to clear, for instance
2189 // remove where there are opaque FB layers. however, on some
2190 // GPUs doing a "clean slate" clear might be more efficient.
2191 // We'll revisit later if needed.
2192 engine.clearWithColor(0, 0, 0, 0);
2193 } else {
2194 // we start with the whole screen area
2195 const Region bounds(hw->getBounds());
2196
2197 // we remove the scissor part
2198 // we're left with the letterbox region
2199 // (common case is that letterbox ends-up being empty)
2200 const Region letterbox(bounds.subtract(hw->getScissor()));
2201
2202 // compute the area to clear
2203 Region region(hw->undefinedRegion.merge(letterbox));
2204
2205 // but limit it to the dirty region
2206 region.andSelf(dirty);
2207
2208 // screen is already cleared here
2209 if (!region.isEmpty()) {
2210 // can happen with SurfaceView
2211 drawWormhole(hw, region);
2212 }
2213 }
2214
2215 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2216 // just to be on the safe side, we don't set the
2217 // scissor on the main display. It should never be needed
2218 // anyways (though in theory it could since the API allows it).
2219 const Rect& bounds(hw->getBounds());
2220 const Rect& scissor(hw->getScissor());
2221 if (scissor != bounds) {
2222 // scissor doesn't match the screen's dimensions, so we
2223 // need to clear everything outside of it and enable
2224 // the GL scissor so we don't draw anything where we shouldn't
2225
2226 // enable scissor for this frame
2227 const uint32_t height = hw->getHeight();
2228 engine.setScissor(scissor.left, height - scissor.bottom,
2229 scissor.getWidth(), scissor.getHeight());
2230 }
2231 }
2232 }
2233
2234 /*
2235 * and then, render the layers targeted at the framebuffer
2236 */
2237
2238 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2239 const size_t count = layers.size();
2240 const Transform& tr = hw->getTransform();
2241 if (cur != end) {
2242 // we're using h/w composer
2243 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2244 const sp<Layer>& layer(layers[i]);
2245 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2246 if (!clip.isEmpty()) {
2247 switch (cur->getCompositionType()) {
2248 case HWC_CURSOR_OVERLAY:
2249 case HWC_OVERLAY: {
2250 const Layer::State& state(layer->getDrawingState());
2251 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2252 && i
2253 && layer->isOpaque(state) && (state.alpha == 0xFF)
2254 && hasGlesComposition) {
2255 // never clear the very first layer since we're
2256 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002257 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002258 }
2259 break;
2260 }
2261 case HWC_FRAMEBUFFER: {
2262 layer->draw(hw, clip);
2263 break;
2264 }
2265 case HWC_FRAMEBUFFER_TARGET: {
2266 // this should not happen as the iterator shouldn't
2267 // let us get there.
2268 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2269 break;
2270 }
2271 }
2272 }
2273 layer->setAcquireFence(hw, *cur);
2274 }
2275 } else {
2276 // we're not using h/w composer
2277 for (size_t i=0 ; i<count ; ++i) {
2278 const sp<Layer>& layer(layers[i]);
2279 const Region clip(dirty.intersect(
2280 tr.transform(layer->visibleRegion)));
2281 if (!clip.isEmpty()) {
2282 layer->draw(hw, clip);
2283 }
2284 }
2285 }
2286
2287 // disable scissor at the end of the frame
2288 engine.disableScissor();
2289 return true;
2290}
2291
2292void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2293 const int32_t height = hw->getHeight();
2294 RenderEngine& engine(getRenderEngine());
2295 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2296}
2297
2298status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2299 const sp<IBinder>& handle,
2300 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002301 const sp<Layer>& lbc,
2302 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002303{
2304 // add this layer to the current state list
2305 {
2306 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002307 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002308 return NO_MEMORY;
2309 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002310 if (parent == nullptr) {
2311 mCurrentState.layersSortedByZ.add(lbc);
2312 } else {
2313 parent->addChild(lbc);
2314 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002315 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002316 mLayersAdded = true;
2317 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002318 }
2319
2320 // attach this layer to the client
2321 client->attachLayer(handle, lbc);
2322
2323 return NO_ERROR;
2324}
2325
Robert Carr9524cb32017-02-13 11:32:32 -08002326status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002327 Mutex::Autolock _l(mStateLock);
2328
Robert Carr1f0a16a2016-10-24 16:27:39 -07002329 const auto& p = layer->getParent();
2330 const ssize_t index = (p != nullptr) ? p->removeChild(layer) :
2331 mCurrentState.layersSortedByZ.remove(layer);
2332
Robert Carr136e2f62017-02-08 17:54:29 -08002333 // As a matter of normal operation, the LayerCleaner will produce a second
2334 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2335 // so we will succeed in promoting it, but it's already been removed
2336 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2337 // otherwise something has gone wrong and we are leaking the layer.
2338 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002339 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2340 layer->getName().string(),
2341 (p != nullptr) ? p->getName().string() : "no-parent");
2342 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002343 } else if (index < 0) {
2344 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002345 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002346
2347 mLayersPendingRemoval.add(layer);
2348 mLayersRemoved = true;
2349 mNumLayers--;
2350 setTransactionFlags(eTransactionNeeded);
2351 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002352}
2353
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002354uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002355 return android_atomic_release_load(&mTransactionFlags);
2356}
2357
2358uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2359 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2360}
2361
2362uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2363 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2364 if ((old & flags)==0) { // wake the server up
2365 signalTransaction();
2366 }
2367 return old;
2368}
2369
2370void SurfaceFlinger::setTransactionState(
2371 const Vector<ComposerState>& state,
2372 const Vector<DisplayState>& displays,
2373 uint32_t flags)
2374{
2375 ATRACE_CALL();
2376 Mutex::Autolock _l(mStateLock);
2377 uint32_t transactionFlags = 0;
2378
2379 if (flags & eAnimation) {
2380 // For window updates that are part of an animation we must wait for
2381 // previous animation "frames" to be handled.
2382 while (mAnimTransactionPending) {
2383 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2384 if (CC_UNLIKELY(err != NO_ERROR)) {
2385 // just in case something goes wrong in SF, return to the
2386 // caller after a few seconds.
2387 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2388 "waiting for previous animation frame");
2389 mAnimTransactionPending = false;
2390 break;
2391 }
2392 }
2393 }
2394
2395 size_t count = displays.size();
2396 for (size_t i=0 ; i<count ; i++) {
2397 const DisplayState& s(displays[i]);
2398 transactionFlags |= setDisplayStateLocked(s);
2399 }
2400
2401 count = state.size();
2402 for (size_t i=0 ; i<count ; i++) {
2403 const ComposerState& s(state[i]);
2404 // Here we need to check that the interface we're given is indeed
2405 // one of our own. A malicious client could give us a NULL
2406 // IInterface, or one of its own or even one of our own but a
2407 // different type. All these situations would cause us to crash.
2408 //
2409 // NOTE: it would be better to use RTTI as we could directly check
2410 // that we have a Client*. however, RTTI is disabled in Android.
2411 if (s.client != NULL) {
2412 sp<IBinder> binder = IInterface::asBinder(s.client);
2413 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002414 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002415 sp<Client> client( static_cast<Client *>(s.client.get()) );
2416 transactionFlags |= setClientStateLocked(client, s.state);
2417 }
2418 }
2419 }
2420 }
2421
2422 // If a synchronous transaction is explicitly requested without any changes,
2423 // force a transaction anyway. This can be used as a flush mechanism for
2424 // previous async transactions.
2425 if (transactionFlags == 0 && (flags & eSynchronous)) {
2426 transactionFlags = eTransactionNeeded;
2427 }
2428
2429 if (transactionFlags) {
2430 if (mInterceptor.isEnabled()) {
2431 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2432 }
2433
2434 // this triggers the transaction
2435 setTransactionFlags(transactionFlags);
2436
2437 // if this is a synchronous transaction, wait for it to take effect
2438 // before returning.
2439 if (flags & eSynchronous) {
2440 mTransactionPending = true;
2441 }
2442 if (flags & eAnimation) {
2443 mAnimTransactionPending = true;
2444 }
2445 while (mTransactionPending) {
2446 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2447 if (CC_UNLIKELY(err != NO_ERROR)) {
2448 // just in case something goes wrong in SF, return to the
2449 // called after a few seconds.
2450 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2451 mTransactionPending = false;
2452 break;
2453 }
2454 }
2455 }
2456}
2457
2458uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2459{
2460 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2461 if (dpyIdx < 0)
2462 return 0;
2463
2464 uint32_t flags = 0;
2465 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2466 if (disp.isValid()) {
2467 const uint32_t what = s.what;
2468 if (what & DisplayState::eSurfaceChanged) {
2469 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2470 disp.surface = s.surface;
2471 flags |= eDisplayTransactionNeeded;
2472 }
2473 }
2474 if (what & DisplayState::eLayerStackChanged) {
2475 if (disp.layerStack != s.layerStack) {
2476 disp.layerStack = s.layerStack;
2477 flags |= eDisplayTransactionNeeded;
2478 }
2479 }
2480 if (what & DisplayState::eDisplayProjectionChanged) {
2481 if (disp.orientation != s.orientation) {
2482 disp.orientation = s.orientation;
2483 flags |= eDisplayTransactionNeeded;
2484 }
2485 if (disp.frame != s.frame) {
2486 disp.frame = s.frame;
2487 flags |= eDisplayTransactionNeeded;
2488 }
2489 if (disp.viewport != s.viewport) {
2490 disp.viewport = s.viewport;
2491 flags |= eDisplayTransactionNeeded;
2492 }
2493 }
2494 if (what & DisplayState::eDisplaySizeChanged) {
2495 if (disp.width != s.width) {
2496 disp.width = s.width;
2497 flags |= eDisplayTransactionNeeded;
2498 }
2499 if (disp.height != s.height) {
2500 disp.height = s.height;
2501 flags |= eDisplayTransactionNeeded;
2502 }
2503 }
2504 }
2505 return flags;
2506}
2507
2508uint32_t SurfaceFlinger::setClientStateLocked(
2509 const sp<Client>& client,
2510 const layer_state_t& s)
2511{
2512 uint32_t flags = 0;
2513 sp<Layer> layer(client->getLayerUser(s.surface));
2514 if (layer != 0) {
2515 const uint32_t what = s.what;
2516 bool geometryAppliesWithResize =
2517 what & layer_state_t::eGeometryAppliesWithResize;
2518 if (what & layer_state_t::ePositionChanged) {
2519 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2520 flags |= eTraversalNeeded;
2521 }
2522 }
2523 if (what & layer_state_t::eLayerChanged) {
2524 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002525 const auto& p = layer->getParent();
2526 if (p == nullptr) {
2527 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2528 if (layer->setLayer(s.z) && idx >= 0) {
2529 mCurrentState.layersSortedByZ.removeAt(idx);
2530 mCurrentState.layersSortedByZ.add(layer);
2531 // we need traversal (state changed)
2532 // AND transaction (list changed)
2533 flags |= eTransactionNeeded|eTraversalNeeded;
2534 }
2535 } else {
2536 if (p->setChildLayer(layer, s.z)) {
2537 flags |= eTransactionNeeded|eTraversalNeeded;
2538 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002539 }
2540 }
2541 if (what & layer_state_t::eSizeChanged) {
2542 if (layer->setSize(s.w, s.h)) {
2543 flags |= eTraversalNeeded;
2544 }
2545 }
2546 if (what & layer_state_t::eAlphaChanged) {
2547 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2548 flags |= eTraversalNeeded;
2549 }
2550 if (what & layer_state_t::eMatrixChanged) {
2551 if (layer->setMatrix(s.matrix))
2552 flags |= eTraversalNeeded;
2553 }
2554 if (what & layer_state_t::eTransparentRegionChanged) {
2555 if (layer->setTransparentRegionHint(s.transparentRegion))
2556 flags |= eTraversalNeeded;
2557 }
2558 if (what & layer_state_t::eFlagsChanged) {
2559 if (layer->setFlags(s.flags, s.mask))
2560 flags |= eTraversalNeeded;
2561 }
2562 if (what & layer_state_t::eCropChanged) {
2563 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2564 flags |= eTraversalNeeded;
2565 }
2566 if (what & layer_state_t::eFinalCropChanged) {
Robert Carr6fb9ca72017-03-22 18:23:23 -07002567 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002568 flags |= eTraversalNeeded;
2569 }
2570 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002571 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002572 // We only allow setting layer stacks for top level layers,
2573 // everything else inherits layer stack from its parent.
2574 if (layer->hasParent()) {
2575 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2576 layer->getName().string());
2577 } else if (idx < 0) {
2578 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2579 "that also does not appear in the top level layer list. Something"
2580 " has gone wrong.", layer->getName().string());
2581 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002582 mCurrentState.layersSortedByZ.removeAt(idx);
2583 mCurrentState.layersSortedByZ.add(layer);
2584 // we need traversal (state changed)
2585 // AND transaction (list changed)
2586 flags |= eTransactionNeeded|eTraversalNeeded;
2587 }
2588 }
2589 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002590 if (s.barrierHandle != nullptr) {
2591 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2592 } else if (s.barrierGbp != nullptr) {
2593 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2594 if (authenticateSurfaceTextureLocked(gbp)) {
2595 const auto& otherLayer =
2596 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2597 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2598 } else {
2599 ALOGE("Attempt to defer transaction to to an"
2600 " unrecognized GraphicBufferProducer");
2601 }
2602 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002603 // We don't trigger a traversal here because if no other state is
2604 // changed, we don't want this to cause any more work
2605 }
Robert Carr1db73f62016-12-21 12:58:51 -08002606 if (what & layer_state_t::eReparentChildren) {
2607 if (layer->reparentChildren(s.reparentHandle)) {
2608 flags |= eTransactionNeeded|eTraversalNeeded;
2609 }
2610 }
Robert Carr9524cb32017-02-13 11:32:32 -08002611 if (what & layer_state_t::eDetachChildren) {
2612 layer->detachChildren();
2613 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002614 if (what & layer_state_t::eOverrideScalingModeChanged) {
2615 layer->setOverrideScalingMode(s.overrideScalingMode);
2616 // We don't trigger a traversal here because if no other state is
2617 // changed, we don't want this to cause any more work
2618 }
2619 }
2620 return flags;
2621}
2622
2623status_t SurfaceFlinger::createLayer(
2624 const String8& name,
2625 const sp<Client>& client,
2626 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002627 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2628 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002629{
2630 if (int32_t(w|h) < 0) {
2631 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2632 int(w), int(h));
2633 return BAD_VALUE;
2634 }
2635
2636 status_t result = NO_ERROR;
2637
2638 sp<Layer> layer;
2639
Cody Northropbc755282017-03-31 12:00:08 -06002640 String8 uniqueName = getUniqueLayerName(name);
2641
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002642 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2643 case ISurfaceComposerClient::eFXSurfaceNormal:
2644 result = createNormalLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002645 uniqueName, w, h, flags, format,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002646 handle, gbp, &layer);
2647 break;
2648 case ISurfaceComposerClient::eFXSurfaceDim:
2649 result = createDimLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002650 uniqueName, w, h, flags,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002651 handle, gbp, &layer);
2652 break;
2653 default:
2654 result = BAD_VALUE;
2655 break;
2656 }
2657
2658 if (result != NO_ERROR) {
2659 return result;
2660 }
2661
Albert Chaulk479c60c2017-01-27 14:21:34 -05002662 layer->setInfo(windowType, ownerUid);
2663
Robert Carr1f0a16a2016-10-24 16:27:39 -07002664 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002665 if (result != NO_ERROR) {
2666 return result;
2667 }
2668 mInterceptor.saveSurfaceCreation(layer);
2669
2670 setTransactionFlags(eTransactionNeeded);
2671 return result;
2672}
2673
Cody Northropbc755282017-03-31 12:00:08 -06002674String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
2675{
2676 bool matchFound = true;
2677 uint32_t dupeCounter = 0;
2678
2679 // Tack on our counter whether there is a hit or not, so everyone gets a tag
2680 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
2681
2682 // Loop over layers until we're sure there is no matching name
2683 while (matchFound) {
2684 matchFound = false;
2685 mDrawingState.traverseInZOrder([&](Layer* layer) {
2686 if (layer->getName() == uniqueName) {
2687 matchFound = true;
2688 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
2689 }
2690 });
2691 }
2692
2693 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
2694
2695 return uniqueName;
2696}
2697
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002698status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2699 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2700 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2701{
2702 // initialize the surfaces
2703 switch (format) {
2704 case PIXEL_FORMAT_TRANSPARENT:
2705 case PIXEL_FORMAT_TRANSLUCENT:
2706 format = PIXEL_FORMAT_RGBA_8888;
2707 break;
2708 case PIXEL_FORMAT_OPAQUE:
2709 format = PIXEL_FORMAT_RGBX_8888;
2710 break;
2711 }
2712
2713 *outLayer = new Layer(this, client, name, w, h, flags);
2714 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2715 if (err == NO_ERROR) {
2716 *handle = (*outLayer)->getHandle();
2717 *gbp = (*outLayer)->getProducer();
2718 }
2719
2720 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2721 return err;
2722}
2723
2724status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2725 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2726 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2727{
2728 *outLayer = new LayerDim(this, client, name, w, h, flags);
2729 *handle = (*outLayer)->getHandle();
2730 *gbp = (*outLayer)->getProducer();
2731 return NO_ERROR;
2732}
2733
2734status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2735{
Robert Carr9524cb32017-02-13 11:32:32 -08002736 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002737 status_t err = NO_ERROR;
2738 sp<Layer> l(client->getLayerUser(handle));
2739 if (l != NULL) {
2740 mInterceptor.saveSurfaceDeletion(l);
2741 err = removeLayer(l);
2742 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2743 "error removing layer=%p (%s)", l.get(), strerror(-err));
2744 }
2745 return err;
2746}
2747
2748status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2749{
2750 // called by ~LayerCleaner() when all references to the IBinder (handle)
2751 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002752 sp<Layer> l = layer.promote();
2753 if (l == nullptr) {
2754 // The layer has already been removed, carry on
2755 return NO_ERROR;
2756 } if (l->getParent() != nullptr) {
2757 // If we have a parent, then we can continue to live as long as it does.
2758 return NO_ERROR;
2759 }
2760 return removeLayer(l);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002761}
2762
2763// ---------------------------------------------------------------------------
2764
2765void SurfaceFlinger::onInitializeDisplays() {
2766 // reset screen orientation and use primary layer stack
2767 Vector<ComposerState> state;
2768 Vector<DisplayState> displays;
2769 DisplayState d;
2770 d.what = DisplayState::eDisplayProjectionChanged |
2771 DisplayState::eLayerStackChanged;
2772 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2773 d.layerStack = 0;
2774 d.orientation = DisplayState::eOrientationDefault;
2775 d.frame.makeInvalid();
2776 d.viewport.makeInvalid();
2777 d.width = 0;
2778 d.height = 0;
2779 displays.add(d);
2780 setTransactionState(state, displays, 0);
2781 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2782
2783 const nsecs_t period =
2784 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2785 mAnimFrameTracker.setDisplayRefreshPeriod(period);
Brian Andersond0010582017-03-07 13:20:31 -08002786
2787 // Use phase of 0 since phase is not known.
2788 // Use latency of 0, which will snap to the ideal latency.
2789 setCompositorTimingSnapped(0, period, 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002790}
2791
2792void SurfaceFlinger::initializeDisplays() {
2793 class MessageScreenInitialized : public MessageBase {
2794 SurfaceFlinger* flinger;
2795 public:
2796 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2797 virtual bool handler() {
2798 flinger->onInitializeDisplays();
2799 return true;
2800 }
2801 };
2802 sp<MessageBase> msg = new MessageScreenInitialized(this);
2803 postMessageAsync(msg); // we may be called from main thread, use async message
2804}
2805
2806void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2807 int mode) {
2808 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2809 this);
2810 int32_t type = hw->getDisplayType();
2811 int currentMode = hw->getPowerMode();
2812
2813 if (mode == currentMode) {
2814 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2815 return;
2816 }
2817
2818 hw->setPowerMode(mode);
2819 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2820 ALOGW("Trying to set power mode for virtual display");
2821 return;
2822 }
2823
2824 if (mInterceptor.isEnabled()) {
2825 Mutex::Autolock _l(mStateLock);
2826 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2827 if (idx < 0) {
2828 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2829 return;
2830 }
2831 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2832 }
2833
2834 if (currentMode == HWC_POWER_MODE_OFF) {
2835 // Turn on the display
2836 getHwComposer().setPowerMode(type, mode);
2837 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2838 // FIXME: eventthread only knows about the main display right now
2839 mEventThread->onScreenAcquired();
2840 resyncToHardwareVsync(true);
2841 }
2842
2843 mVisibleRegionsDirty = true;
2844 mHasPoweredOff = true;
2845 repaintEverything();
2846
2847 struct sched_param param = {0};
2848 param.sched_priority = 1;
2849 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2850 ALOGW("Couldn't set SCHED_FIFO on display on");
2851 }
2852 } else if (mode == HWC_POWER_MODE_OFF) {
2853 // Turn off the display
2854 struct sched_param param = {0};
2855 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2856 ALOGW("Couldn't set SCHED_OTHER on display off");
2857 }
2858
2859 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2860 disableHardwareVsync(true); // also cancels any in-progress resync
2861
2862 // FIXME: eventthread only knows about the main display right now
2863 mEventThread->onScreenReleased();
2864 }
2865
2866 getHwComposer().setPowerMode(type, mode);
2867 mVisibleRegionsDirty = true;
2868 // from this point on, SF will stop drawing on this display
2869 } else {
2870 getHwComposer().setPowerMode(type, mode);
2871 }
2872}
2873
2874void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2875 class MessageSetPowerMode: public MessageBase {
2876 SurfaceFlinger& mFlinger;
2877 sp<IBinder> mDisplay;
2878 int mMode;
2879 public:
2880 MessageSetPowerMode(SurfaceFlinger& flinger,
2881 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2882 mDisplay(disp) { mMode = mode; }
2883 virtual bool handler() {
2884 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2885 if (hw == NULL) {
2886 ALOGE("Attempt to set power mode = %d for null display %p",
2887 mMode, mDisplay.get());
2888 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2889 ALOGW("Attempt to set power mode = %d for virtual display",
2890 mMode);
2891 } else {
2892 mFlinger.setPowerModeInternal(hw, mMode);
2893 }
2894 return true;
2895 }
2896 };
2897 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2898 postMessageSync(msg);
2899}
2900
2901// ---------------------------------------------------------------------------
2902
2903status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2904{
2905 String8 result;
2906
2907 IPCThreadState* ipc = IPCThreadState::self();
2908 const int pid = ipc->getCallingPid();
2909 const int uid = ipc->getCallingUid();
2910 if ((uid != AID_SHELL) &&
2911 !PermissionCache::checkPermission(sDump, pid, uid)) {
2912 result.appendFormat("Permission Denial: "
2913 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2914 } else {
2915 // Try to get the main lock, but give up after one second
2916 // (this would indicate SF is stuck, but we want to be able to
2917 // print something in dumpsys).
2918 status_t err = mStateLock.timedLock(s2ns(1));
2919 bool locked = (err == NO_ERROR);
2920 if (!locked) {
2921 result.appendFormat(
2922 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2923 "dumping anyways (no locks held)\n", strerror(-err), err);
2924 }
2925
2926 bool dumpAll = true;
2927 size_t index = 0;
2928 size_t numArgs = args.size();
2929 if (numArgs) {
2930 if ((index < numArgs) &&
2931 (args[index] == String16("--list"))) {
2932 index++;
2933 listLayersLocked(args, index, result);
2934 dumpAll = false;
2935 }
2936
2937 if ((index < numArgs) &&
2938 (args[index] == String16("--latency"))) {
2939 index++;
2940 dumpStatsLocked(args, index, result);
2941 dumpAll = false;
2942 }
2943
2944 if ((index < numArgs) &&
2945 (args[index] == String16("--latency-clear"))) {
2946 index++;
2947 clearStatsLocked(args, index, result);
2948 dumpAll = false;
2949 }
2950
2951 if ((index < numArgs) &&
2952 (args[index] == String16("--dispsync"))) {
2953 index++;
2954 mPrimaryDispSync.dump(result);
2955 dumpAll = false;
2956 }
2957
2958 if ((index < numArgs) &&
2959 (args[index] == String16("--static-screen"))) {
2960 index++;
2961 dumpStaticScreenStats(result);
2962 dumpAll = false;
2963 }
2964
2965 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07002966 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002967 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07002968 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002969 dumpAll = false;
2970 }
2971 }
2972
2973 if (dumpAll) {
2974 dumpAllLocked(args, index, result);
2975 }
2976
2977 if (locked) {
2978 mStateLock.unlock();
2979 }
2980 }
2981 write(fd, result.string(), result.size());
2982 return NO_ERROR;
2983}
2984
2985void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2986 size_t& /* index */, String8& result) const
2987{
Robert Carr2047fae2016-11-28 14:09:09 -08002988 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002989 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08002990 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002991}
2992
2993void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2994 String8& result) const
2995{
2996 String8 name;
2997 if (index < args.size()) {
2998 name = String8(args[index]);
2999 index++;
3000 }
3001
3002 const nsecs_t period =
3003 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3004 result.appendFormat("%" PRId64 "\n", period);
3005
3006 if (name.isEmpty()) {
3007 mAnimFrameTracker.dumpStats(result);
3008 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08003009 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003010 if (name == layer->getName()) {
3011 layer->dumpFrameStats(result);
3012 }
Robert Carr2047fae2016-11-28 14:09:09 -08003013 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003014 }
3015}
3016
3017void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3018 String8& /* result */)
3019{
3020 String8 name;
3021 if (index < args.size()) {
3022 name = String8(args[index]);
3023 index++;
3024 }
3025
Robert Carr2047fae2016-11-28 14:09:09 -08003026 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003027 if (name.isEmpty() || (name == layer->getName())) {
3028 layer->clearFrameStats();
3029 }
Robert Carr2047fae2016-11-28 14:09:09 -08003030 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003031
3032 mAnimFrameTracker.clearStats();
3033}
3034
3035// This should only be called from the main thread. Otherwise it would need
3036// the lock and should use mCurrentState rather than mDrawingState.
3037void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003038 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003039 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003040 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003041
3042 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3043}
3044
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003045void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003046{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003047 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003048 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3049
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003050 if (isLayerTripleBufferingDisabled())
3051 result.append(" DISABLE_TRIPLE_BUFFERING");
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003052
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003053 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003054 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08003055 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08003056 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
Fabien Sanglard1971b632017-03-10 14:50:03 -08003057 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3058 maxFrameBufferAcquiredBuffers);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003059 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003060}
3061
3062void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3063{
3064 result.appendFormat("Static screen stats:\n");
3065 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3066 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3067 float percent = 100.0f *
3068 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3069 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3070 b + 1, bucketTimeSec, percent);
3071 }
3072 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3073 float percent = 100.0f *
3074 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3075 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3076 NUM_BUCKETS - 1, bucketTimeSec, percent);
3077}
3078
Brian Andersond6927fb2016-07-23 23:37:30 -07003079void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3080 result.appendFormat("Layer frame timestamps:\n");
3081
3082 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3083 const size_t count = currentLayers.size();
3084 for (size_t i=0 ; i<count ; i++) {
3085 currentLayers[i]->dumpFrameEvents(result);
3086 }
3087}
3088
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003089void SurfaceFlinger::recordBufferingStats(const char* layerName,
3090 std::vector<OccupancyTracker::Segment>&& history) {
3091 Mutex::Autolock lock(mBufferingStatsMutex);
3092 auto& stats = mBufferingStats[layerName];
3093 for (const auto& segment : history) {
3094 if (!segment.usedThirdBuffer) {
3095 stats.twoBufferTime += segment.totalTime;
3096 }
3097 if (segment.occupancyAverage < 1.0f) {
3098 stats.doubleBufferedTime += segment.totalTime;
3099 } else if (segment.occupancyAverage < 2.0f) {
3100 stats.tripleBufferedTime += segment.totalTime;
3101 }
3102 ++stats.numSegments;
3103 stats.totalTime += segment.totalTime;
3104 }
3105}
3106
3107void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3108 result.append("Buffering stats:\n");
3109 result.append(" [Layer name] <Active time> <Two buffer> "
3110 "<Double buffered> <Triple buffered>\n");
3111 Mutex::Autolock lock(mBufferingStatsMutex);
3112 typedef std::tuple<std::string, float, float, float> BufferTuple;
3113 std::map<float, BufferTuple, std::greater<float>> sorted;
3114 for (const auto& statsPair : mBufferingStats) {
3115 const char* name = statsPair.first.c_str();
3116 const BufferingStats& stats = statsPair.second;
3117 if (stats.numSegments == 0) {
3118 continue;
3119 }
3120 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3121 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3122 stats.totalTime;
3123 float doubleBufferRatio = static_cast<float>(
3124 stats.doubleBufferedTime) / stats.totalTime;
3125 float tripleBufferRatio = static_cast<float>(
3126 stats.tripleBufferedTime) / stats.totalTime;
3127 sorted.insert({activeTime, {name, twoBufferRatio,
3128 doubleBufferRatio, tripleBufferRatio}});
3129 }
3130 for (const auto& sortedPair : sorted) {
3131 float activeTime = sortedPair.first;
3132 const BufferTuple& values = sortedPair.second;
3133 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3134 std::get<0>(values).c_str(), activeTime,
3135 std::get<1>(values), std::get<2>(values),
3136 std::get<3>(values));
3137 }
3138 result.append("\n");
3139}
3140
3141void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3142 String8& result) const
3143{
3144 bool colorize = false;
3145 if (index < args.size()
3146 && (args[index] == String16("--color"))) {
3147 colorize = true;
3148 index++;
3149 }
3150
3151 Colorizer colorizer(colorize);
3152
3153 // figure out if we're stuck somewhere
3154 const nsecs_t now = systemTime();
3155 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3156 const nsecs_t inTransaction(mDebugInTransaction);
3157 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3158 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3159
3160 /*
3161 * Dump library configuration.
3162 */
3163
3164 colorizer.bold(result);
3165 result.append("Build configuration:");
3166 colorizer.reset(result);
3167 appendSfConfigString(result);
3168 appendUiConfigString(result);
3169 appendGuiConfigString(result);
3170 result.append("\n");
3171
3172 colorizer.bold(result);
3173 result.append("Sync configuration: ");
3174 colorizer.reset(result);
3175 result.append(SyncFeatures::getInstance().toString());
3176 result.append("\n");
3177
3178 colorizer.bold(result);
3179 result.append("DispSync configuration: ");
3180 colorizer.reset(result);
3181 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003182 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3183 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003184 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3185 result.append("\n");
3186
3187 // Dump static screen stats
3188 result.append("\n");
3189 dumpStaticScreenStats(result);
3190 result.append("\n");
3191
3192 dumpBufferingStats(result);
3193
3194 /*
3195 * Dump the visible layer list
3196 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003197 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003198 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003199 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003200 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003201 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003202 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003203
3204 /*
3205 * Dump Display state
3206 */
3207
3208 colorizer.bold(result);
3209 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3210 colorizer.reset(result);
3211 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3212 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3213 hw->dump(result);
3214 }
3215
3216 /*
3217 * Dump SurfaceFlinger global state
3218 */
3219
3220 colorizer.bold(result);
3221 result.append("SurfaceFlinger global state:\n");
3222 colorizer.reset(result);
3223
3224 HWComposer& hwc(getHwComposer());
3225 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3226
3227 colorizer.bold(result);
3228 result.appendFormat("EGL implementation : %s\n",
3229 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3230 colorizer.reset(result);
3231 result.appendFormat("%s\n",
3232 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3233
3234 mRenderEngine->dump(result);
3235
3236 hw->undefinedRegion.dump(result, "undefinedRegion");
3237 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3238 hw->getOrientation(), hw->isDisplayOn());
3239 result.appendFormat(
3240 " last eglSwapBuffers() time: %f us\n"
3241 " last transaction time : %f us\n"
3242 " transaction-flags : %08x\n"
3243 " refresh-rate : %f fps\n"
3244 " x-dpi : %f\n"
3245 " y-dpi : %f\n"
3246 " gpu_to_cpu_unsupported : %d\n"
3247 ,
3248 mLastSwapBufferTime/1000.0,
3249 mLastTransactionTime/1000.0,
3250 mTransactionFlags,
3251 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3252 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3253 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3254 !mGpuToCpuSupported);
3255
3256 result.appendFormat(" eglSwapBuffers time: %f us\n",
3257 inSwapBuffersDuration/1000.0);
3258
3259 result.appendFormat(" transaction time: %f us\n",
3260 inTransactionDuration/1000.0);
3261
3262 /*
3263 * VSYNC state
3264 */
3265 mEventThread->dump(result);
3266
3267 /*
3268 * Dump HWComposer state
3269 */
3270 colorizer.bold(result);
3271 result.append("h/w composer state:\n");
3272 colorizer.reset(result);
3273 result.appendFormat(" h/w composer %s and %s\n",
3274 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3275 (mDebugDisableHWC || mDebugRegion || mDaltonize
3276 || mHasColorMatrix) ? "disabled" : "enabled");
3277 hwc.dump(result);
3278
3279 /*
3280 * Dump gralloc state
3281 */
3282 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3283 alloc.dump(result);
3284}
3285
3286const Vector< sp<Layer> >&
3287SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3288 // Note: mStateLock is held here
3289 wp<IBinder> dpy;
3290 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3291 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3292 dpy = mDisplays.keyAt(i);
3293 break;
3294 }
3295 }
3296 if (dpy == NULL) {
3297 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3298 // Just use the primary display so we have something to return
3299 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3300 }
3301 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
3302}
3303
3304bool SurfaceFlinger::startDdmConnection()
3305{
3306 void* libddmconnection_dso =
3307 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3308 if (!libddmconnection_dso) {
3309 return false;
3310 }
3311 void (*DdmConnection_start)(const char* name);
3312 DdmConnection_start =
3313 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3314 if (!DdmConnection_start) {
3315 dlclose(libddmconnection_dso);
3316 return false;
3317 }
3318 (*DdmConnection_start)(getServiceName());
3319 return true;
3320}
3321
3322status_t SurfaceFlinger::onTransact(
3323 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3324{
3325 switch (code) {
3326 case CREATE_CONNECTION:
3327 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003328 case BOOT_FINISHED:
3329 case CLEAR_ANIMATION_FRAME_STATS:
3330 case GET_ANIMATION_FRAME_STATS:
3331 case SET_POWER_MODE:
3332 case GET_HDR_CAPABILITIES:
3333 {
3334 // codes that require permission check
3335 IPCThreadState* ipc = IPCThreadState::self();
3336 const int pid = ipc->getCallingPid();
3337 const int uid = ipc->getCallingUid();
3338 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3339 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3340 ALOGE("Permission Denial: "
3341 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3342 return PERMISSION_DENIED;
3343 }
3344 break;
3345 }
Robert Carr1db73f62016-12-21 12:58:51 -08003346 /*
3347 * Calling setTransactionState is safe, because you need to have been
3348 * granted a reference to Client* and Handle* to do anything with it.
3349 *
3350 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3351 */
3352 case SET_TRANSACTION_STATE:
3353 case CREATE_SCOPED_CONNECTION:
3354 {
3355 break;
3356 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003357 case CAPTURE_SCREEN:
3358 {
3359 // codes that require permission check
3360 IPCThreadState* ipc = IPCThreadState::self();
3361 const int pid = ipc->getCallingPid();
3362 const int uid = ipc->getCallingUid();
3363 if ((uid != AID_GRAPHICS) &&
3364 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3365 ALOGE("Permission Denial: "
3366 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3367 return PERMISSION_DENIED;
3368 }
3369 break;
3370 }
3371 }
3372
3373 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3374 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3375 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3376 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3377 IPCThreadState* ipc = IPCThreadState::self();
3378 const int pid = ipc->getCallingPid();
3379 const int uid = ipc->getCallingUid();
3380 ALOGE("Permission Denial: "
3381 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3382 return PERMISSION_DENIED;
3383 }
3384 int n;
3385 switch (code) {
3386 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3387 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3388 return NO_ERROR;
3389 case 1002: // SHOW_UPDATES
3390 n = data.readInt32();
3391 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3392 invalidateHwcGeometry();
3393 repaintEverything();
3394 return NO_ERROR;
3395 case 1004:{ // repaint everything
3396 repaintEverything();
3397 return NO_ERROR;
3398 }
3399 case 1005:{ // force transaction
3400 setTransactionFlags(
3401 eTransactionNeeded|
3402 eDisplayTransactionNeeded|
3403 eTraversalNeeded);
3404 return NO_ERROR;
3405 }
3406 case 1006:{ // send empty update
3407 signalRefresh();
3408 return NO_ERROR;
3409 }
3410 case 1008: // toggle use of hw composer
3411 n = data.readInt32();
3412 mDebugDisableHWC = n ? 1 : 0;
3413 invalidateHwcGeometry();
3414 repaintEverything();
3415 return NO_ERROR;
3416 case 1009: // toggle use of transform hint
3417 n = data.readInt32();
3418 mDebugDisableTransformHint = n ? 1 : 0;
3419 invalidateHwcGeometry();
3420 repaintEverything();
3421 return NO_ERROR;
3422 case 1010: // interrogate.
3423 reply->writeInt32(0);
3424 reply->writeInt32(0);
3425 reply->writeInt32(mDebugRegion);
3426 reply->writeInt32(0);
3427 reply->writeInt32(mDebugDisableHWC);
3428 return NO_ERROR;
3429 case 1013: {
3430 Mutex::Autolock _l(mStateLock);
3431 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3432 reply->writeInt32(hw->getPageFlipCount());
3433 return NO_ERROR;
3434 }
3435 case 1014: {
3436 // daltonize
3437 n = data.readInt32();
3438 switch (n % 10) {
3439 case 1:
3440 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3441 break;
3442 case 2:
3443 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3444 break;
3445 case 3:
3446 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3447 break;
3448 }
3449 if (n >= 10) {
3450 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3451 } else {
3452 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3453 }
3454 mDaltonize = n > 0;
3455 invalidateHwcGeometry();
3456 repaintEverything();
3457 return NO_ERROR;
3458 }
3459 case 1015: {
3460 // apply a color matrix
3461 n = data.readInt32();
3462 mHasColorMatrix = n ? 1 : 0;
3463 if (n) {
3464 // color matrix is sent as mat3 matrix followed by vec3
3465 // offset, then packed into a mat4 where the last row is
3466 // the offset and extra values are 0
3467 for (size_t i = 0 ; i < 4; i++) {
3468 for (size_t j = 0; j < 4; j++) {
3469 mColorMatrix[i][j] = data.readFloat();
3470 }
3471 }
3472 } else {
3473 mColorMatrix = mat4();
3474 }
3475 invalidateHwcGeometry();
3476 repaintEverything();
3477 return NO_ERROR;
3478 }
3479 // This is an experimental interface
3480 // Needs to be shifted to proper binder interface when we productize
3481 case 1016: {
3482 n = data.readInt32();
3483 mPrimaryDispSync.setRefreshSkipCount(n);
3484 return NO_ERROR;
3485 }
3486 case 1017: {
3487 n = data.readInt32();
3488 mForceFullDamage = static_cast<bool>(n);
3489 return NO_ERROR;
3490 }
3491 case 1018: { // Modify Choreographer's phase offset
3492 n = data.readInt32();
3493 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3494 return NO_ERROR;
3495 }
3496 case 1019: { // Modify SurfaceFlinger's phase offset
3497 n = data.readInt32();
3498 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3499 return NO_ERROR;
3500 }
3501 case 1020: { // Layer updates interceptor
3502 n = data.readInt32();
3503 if (n) {
3504 ALOGV("Interceptor enabled");
3505 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3506 }
3507 else{
3508 ALOGV("Interceptor disabled");
3509 mInterceptor.disable();
3510 }
3511 return NO_ERROR;
3512 }
3513 case 1021: { // Disable HWC virtual displays
3514 n = data.readInt32();
3515 mUseHwcVirtualDisplays = !n;
3516 return NO_ERROR;
3517 }
3518 }
3519 }
3520 return err;
3521}
3522
3523void SurfaceFlinger::repaintEverything() {
3524 android_atomic_or(1, &mRepaintEverything);
3525 signalTransaction();
3526}
3527
3528// ---------------------------------------------------------------------------
3529// Capture screen into an IGraphiBufferProducer
3530// ---------------------------------------------------------------------------
3531
3532/* The code below is here to handle b/8734824
3533 *
3534 * We create a IGraphicBufferProducer wrapper that forwards all calls
3535 * from the surfaceflinger thread to the calling binder thread, where they
3536 * are executed. This allows the calling thread in the calling process to be
3537 * reused and not depend on having "enough" binder threads to handle the
3538 * requests.
3539 */
3540class GraphicProducerWrapper : public BBinder, public MessageHandler {
3541 /* Parts of GraphicProducerWrapper are run on two different threads,
3542 * communicating by sending messages via Looper but also by shared member
3543 * data. Coherence maintenance is subtle and in places implicit (ugh).
3544 *
3545 * Don't rely on Looper's sendMessage/handleMessage providing
3546 * release/acquire semantics for any data not actually in the Message.
3547 * Data going from surfaceflinger to binder threads needs to be
3548 * synchronized explicitly.
3549 *
3550 * Barrier open/wait do provide release/acquire semantics. This provides
3551 * implicit synchronization for data coming back from binder to
3552 * surfaceflinger threads.
3553 */
3554
3555 sp<IGraphicBufferProducer> impl;
3556 sp<Looper> looper;
3557 status_t result;
3558 bool exitPending;
3559 bool exitRequested;
3560 Barrier barrier;
3561 uint32_t code;
3562 Parcel const* data;
3563 Parcel* reply;
3564
3565 enum {
3566 MSG_API_CALL,
3567 MSG_EXIT
3568 };
3569
3570 /*
3571 * Called on surfaceflinger thread. This is called by our "fake"
3572 * BpGraphicBufferProducer. We package the data and reply Parcel and
3573 * forward them to the binder thread.
3574 */
3575 virtual status_t transact(uint32_t code,
3576 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3577 this->code = code;
3578 this->data = &data;
3579 this->reply = reply;
3580 if (exitPending) {
3581 // if we've exited, we run the message synchronously right here.
3582 // note (JH): as far as I can tell from looking at the code, this
3583 // never actually happens. if it does, i'm not sure if it happens
3584 // on the surfaceflinger or binder thread.
3585 handleMessage(Message(MSG_API_CALL));
3586 } else {
3587 barrier.close();
3588 // Prevent stores to this->{code, data, reply} from being
3589 // reordered later than the construction of Message.
3590 atomic_thread_fence(memory_order_release);
3591 looper->sendMessage(this, Message(MSG_API_CALL));
3592 barrier.wait();
3593 }
3594 return result;
3595 }
3596
3597 /*
3598 * here we run on the binder thread. All we've got to do is
3599 * call the real BpGraphicBufferProducer.
3600 */
3601 virtual void handleMessage(const Message& message) {
3602 int what = message.what;
3603 // Prevent reads below from happening before the read from Message
3604 atomic_thread_fence(memory_order_acquire);
3605 if (what == MSG_API_CALL) {
3606 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3607 barrier.open();
3608 } else if (what == MSG_EXIT) {
3609 exitRequested = true;
3610 }
3611 }
3612
3613public:
3614 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3615 : impl(impl),
3616 looper(new Looper(true)),
3617 result(NO_ERROR),
3618 exitPending(false),
3619 exitRequested(false),
3620 code(0),
3621 data(NULL),
3622 reply(NULL)
3623 {}
3624
3625 // Binder thread
3626 status_t waitForResponse() {
3627 do {
3628 looper->pollOnce(-1);
3629 } while (!exitRequested);
3630 return result;
3631 }
3632
3633 // Client thread
3634 void exit(status_t result) {
3635 this->result = result;
3636 exitPending = true;
3637 // Ensure this->result is visible to the binder thread before it
3638 // handles the message.
3639 atomic_thread_fence(memory_order_release);
3640 looper->sendMessage(this, Message(MSG_EXIT));
3641 }
3642};
3643
3644
3645status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3646 const sp<IGraphicBufferProducer>& producer,
3647 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003648 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003649 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3650
3651 if (CC_UNLIKELY(display == 0))
3652 return BAD_VALUE;
3653
3654 if (CC_UNLIKELY(producer == 0))
3655 return BAD_VALUE;
3656
3657 // if we have secure windows on this display, never allow the screen capture
3658 // unless the producer interface is local (i.e.: we can take a screenshot for
3659 // ourselves).
3660 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3661
3662 // Convert to surfaceflinger's internal rotation type.
3663 Transform::orientation_flags rotationFlags;
3664 switch (rotation) {
3665 case ISurfaceComposer::eRotateNone:
3666 rotationFlags = Transform::ROT_0;
3667 break;
3668 case ISurfaceComposer::eRotate90:
3669 rotationFlags = Transform::ROT_90;
3670 break;
3671 case ISurfaceComposer::eRotate180:
3672 rotationFlags = Transform::ROT_180;
3673 break;
3674 case ISurfaceComposer::eRotate270:
3675 rotationFlags = Transform::ROT_270;
3676 break;
3677 default:
3678 rotationFlags = Transform::ROT_0;
3679 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3680 break;
3681 }
3682
3683 class MessageCaptureScreen : public MessageBase {
3684 SurfaceFlinger* flinger;
3685 sp<IBinder> display;
3686 sp<IGraphicBufferProducer> producer;
3687 Rect sourceCrop;
3688 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003689 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003690 bool useIdentityTransform;
3691 Transform::orientation_flags rotation;
3692 status_t result;
3693 bool isLocalScreenshot;
3694 public:
3695 MessageCaptureScreen(SurfaceFlinger* flinger,
3696 const sp<IBinder>& display,
3697 const sp<IGraphicBufferProducer>& producer,
3698 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003699 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003700 bool useIdentityTransform,
3701 Transform::orientation_flags rotation,
3702 bool isLocalScreenshot)
3703 : flinger(flinger), display(display), producer(producer),
3704 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3705 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3706 useIdentityTransform(useIdentityTransform),
3707 rotation(rotation), result(PERMISSION_DENIED),
3708 isLocalScreenshot(isLocalScreenshot)
3709 {
3710 }
3711 status_t getResult() const {
3712 return result;
3713 }
3714 virtual bool handler() {
3715 Mutex::Autolock _l(flinger->mStateLock);
3716 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3717 result = flinger->captureScreenImplLocked(hw, producer,
3718 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3719 useIdentityTransform, rotation, isLocalScreenshot);
3720 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3721 return true;
3722 }
3723 };
3724
3725 // this creates a "fake" BBinder which will serve as a "fake" remote
3726 // binder to receive the marshaled calls and forward them to the
3727 // real remote (a BpGraphicBufferProducer)
3728 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3729
3730 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3731 // which does the marshaling work forwards to our "fake remote" above.
3732 sp<MessageBase> msg = new MessageCaptureScreen(this,
3733 display, IGraphicBufferProducer::asInterface( wrapper ),
3734 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3735 useIdentityTransform, rotationFlags, isLocalScreenshot);
3736
3737 status_t res = postMessageAsync(msg);
3738 if (res == NO_ERROR) {
3739 res = wrapper->waitForResponse();
3740 }
3741 return res;
3742}
3743
3744
3745void SurfaceFlinger::renderScreenImplLocked(
3746 const sp<const DisplayDevice>& hw,
3747 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003748 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003749 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3750{
3751 ATRACE_CALL();
3752 RenderEngine& engine(getRenderEngine());
3753
3754 // get screen geometry
3755 const int32_t hw_w = hw->getWidth();
3756 const int32_t hw_h = hw->getHeight();
3757 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3758 static_cast<int32_t>(reqHeight) != hw_h;
3759
3760 // if a default or invalid sourceCrop is passed in, set reasonable values
3761 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3762 !sourceCrop.isValid()) {
3763 sourceCrop.setLeftTop(Point(0, 0));
3764 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3765 }
3766
3767 // ensure that sourceCrop is inside screen
3768 if (sourceCrop.left < 0) {
3769 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3770 }
3771 if (sourceCrop.right > hw_w) {
3772 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3773 }
3774 if (sourceCrop.top < 0) {
3775 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3776 }
3777 if (sourceCrop.bottom > hw_h) {
3778 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3779 }
3780
3781 // make sure to clear all GL error flags
3782 engine.checkErrors();
3783
3784 // set-up our viewport
3785 engine.setViewportAndProjection(
3786 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3787 engine.disableTexturing();
3788
3789 // redraw the screen entirely...
3790 engine.clearWithColor(0, 0, 0, 1);
3791
Robert Carr1f0a16a2016-10-24 16:27:39 -07003792 // We loop through the first level of layers without traversing,
3793 // as we need to interpret min/max layer Z in the top level Z space.
3794 for (const auto& layer : mDrawingState.layersSortedByZ) {
3795 if (layer->getLayerStack() != hw->getLayerStack()) {
3796 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003797 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003798 const Layer::State& state(layer->getDrawingState());
3799 if (state.z < minLayerZ || state.z > maxLayerZ) {
3800 continue;
3801 }
3802 layer->traverseInZOrder([&](Layer* layer) {
3803 if (!layer->isVisible()) {
3804 return;
3805 }
3806 if (filtering) layer->setFiltering(true);
3807 layer->draw(hw, useIdentityTransform);
3808 if (filtering) layer->setFiltering(false);
3809 });
3810 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003811
3812 // compositionComplete is needed for older driver
3813 hw->compositionComplete();
3814 hw->setViewportAndProjection();
3815}
3816
3817
3818status_t SurfaceFlinger::captureScreenImplLocked(
3819 const sp<const DisplayDevice>& hw,
3820 const sp<IGraphicBufferProducer>& producer,
3821 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003822 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003823 bool useIdentityTransform, Transform::orientation_flags rotation,
3824 bool isLocalScreenshot)
3825{
3826 ATRACE_CALL();
3827
3828 // get screen geometry
3829 uint32_t hw_w = hw->getWidth();
3830 uint32_t hw_h = hw->getHeight();
3831
3832 if (rotation & Transform::ROT_90) {
3833 std::swap(hw_w, hw_h);
3834 }
3835
3836 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3837 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3838 reqWidth, reqHeight, hw_w, hw_h);
3839 return BAD_VALUE;
3840 }
3841
3842 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3843 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3844
3845 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003846 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003847 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003848 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3849 (state.z < minLayerZ || state.z > maxLayerZ)) {
3850 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003851 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003852 layer->traverseInZOrder([&](Layer *layer) {
3853 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3854 layer->isSecure());
3855 });
3856 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003857
3858 if (!isLocalScreenshot && secureLayerIsVisible) {
3859 ALOGW("FB is protected: PERMISSION_DENIED");
3860 return PERMISSION_DENIED;
3861 }
3862
3863 // create a surface (because we're a producer, and we need to
3864 // dequeue/queue a buffer)
3865 sp<Surface> sur = new Surface(producer, false);
3866 ANativeWindow* window = sur.get();
3867
3868 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3869 if (result == NO_ERROR) {
3870 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3871 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3872
3873 int err = 0;
3874 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3875 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3876 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3877 err |= native_window_set_usage(window, usage);
3878
3879 if (err == NO_ERROR) {
3880 ANativeWindowBuffer* buffer;
3881 /* TODO: Once we have the sync framework everywhere this can use
3882 * server-side waits on the fence that dequeueBuffer returns.
3883 */
3884 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3885 if (result == NO_ERROR) {
3886 int syncFd = -1;
3887 // create an EGLImage from the buffer so we can later
3888 // turn it into a texture
3889 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3890 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3891 if (image != EGL_NO_IMAGE_KHR) {
3892 // this binds the given EGLImage as a framebuffer for the
3893 // duration of this scope.
3894 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3895 if (imageBond.getStatus() == NO_ERROR) {
3896 // this will in fact render into our dequeued buffer
3897 // via an FBO, which means we didn't have to create
3898 // an EGLSurface and therefore we're not
3899 // dependent on the context's EGLConfig.
3900 renderScreenImplLocked(
3901 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3902 useIdentityTransform, rotation);
3903
3904 // Attempt to create a sync khr object that can produce a sync point. If that
3905 // isn't available, create a non-dupable sync object in the fallback path and
3906 // wait on it directly.
3907 EGLSyncKHR sync;
3908 if (!DEBUG_SCREENSHOTS) {
3909 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3910 // native fence fd will not be populated until flush() is done.
3911 getRenderEngine().flush();
3912 } else {
3913 sync = EGL_NO_SYNC_KHR;
3914 }
3915 if (sync != EGL_NO_SYNC_KHR) {
3916 // get the sync fd
3917 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3918 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3919 ALOGW("captureScreen: failed to dup sync khr object");
3920 syncFd = -1;
3921 }
3922 eglDestroySyncKHR(mEGLDisplay, sync);
3923 } else {
3924 // fallback path
3925 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3926 if (sync != EGL_NO_SYNC_KHR) {
3927 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3928 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3929 EGLint eglErr = eglGetError();
3930 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3931 ALOGW("captureScreen: fence wait timed out");
3932 } else {
3933 ALOGW_IF(eglErr != EGL_SUCCESS,
3934 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3935 }
3936 eglDestroySyncKHR(mEGLDisplay, sync);
3937 } else {
3938 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3939 }
3940 }
3941 if (DEBUG_SCREENSHOTS) {
3942 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3943 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3944 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3945 hw, minLayerZ, maxLayerZ);
3946 delete [] pixels;
3947 }
3948
3949 } else {
3950 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3951 result = INVALID_OPERATION;
3952 window->cancelBuffer(window, buffer, syncFd);
3953 buffer = NULL;
3954 }
3955 // destroy our image
3956 eglDestroyImageKHR(mEGLDisplay, image);
3957 } else {
3958 result = BAD_VALUE;
3959 }
3960 if (buffer) {
3961 // queueBuffer takes ownership of syncFd
3962 result = window->queueBuffer(window, buffer, syncFd);
3963 }
3964 }
3965 } else {
3966 result = BAD_VALUE;
3967 }
3968 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3969 }
3970
3971 return result;
3972}
3973
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003974void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08003975 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003976 if (DEBUG_SCREENSHOTS) {
3977 for (size_t y=0 ; y<h ; y++) {
3978 uint32_t const * p = (uint32_t const *)vaddr + y*s;
3979 for (size_t x=0 ; x<w ; x++) {
3980 if (p[x] != 0xFF000000) return;
3981 }
3982 }
3983 ALOGE("*** we just took a black screenshot ***\n"
3984 "requested minz=%d, maxz=%d, layerStack=%d",
3985 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08003986 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003987 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003988 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003989 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
3990 state.z <= maxLayerZ) {
3991 layer->traverseInZOrder([&](Layer* layer) {
3992 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3993 layer->isVisible() ? '+' : '-',
3994 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003995 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003996 i++;
3997 });
3998 }
3999 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004000 }
4001}
4002
4003// ---------------------------------------------------------------------------
4004
Robert Carr2047fae2016-11-28 14:09:09 -08004005void SurfaceFlinger::State::traverseInZOrder(const std::function<void(Layer*)>& consume) const {
4006 layersSortedByZ.traverseInZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004007}
4008
Robert Carr2047fae2016-11-28 14:09:09 -08004009void SurfaceFlinger::State::traverseInReverseZOrder(const std::function<void(Layer*)>& consume) const {
4010 layersSortedByZ.traverseInReverseZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004011}
4012
4013}; // namespace android
4014
4015
4016#if defined(__gl_h_)
4017#error "don't include gl/gl.h in this file"
4018#endif
4019
4020#if defined(__gl2_h_)
4021#error "don't include gl2/gl2.h in this file"
4022#endif