blob: 7cd58af78748bebff9b5943c4904cff7b43f457b [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>
Chia-I Wu527747d2017-03-13 20:38:48 +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 Sanglard9d96de42016-10-11 00:15:18 +0000115
116SurfaceFlinger::SurfaceFlinger()
117 : BnSurfaceComposer(),
118 mTransactionFlags(0),
119 mTransactionPending(false),
120 mAnimTransactionPending(false),
121 mLayersRemoved(false),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700122 mLayersAdded(false),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000123 mRepaintEverything(0),
124 mRenderEngine(NULL),
125 mBootTime(systemTime()),
126 mVisibleRegionsDirty(false),
127 mHwWorkListDirty(false),
128 mAnimCompositionPending(false),
129 mDebugRegion(0),
130 mDebugDDMS(0),
131 mDebugDisableHWC(0),
132 mDebugDisableTransformHint(0),
133 mDebugInSwapBuffers(0),
134 mLastSwapBufferTime(0),
135 mDebugInTransaction(0),
136 mLastTransactionTime(0),
137 mBootFinished(false),
138 mForceFullDamage(false),
Robert Carr0d480722017-01-10 16:42:54 -0800139 mInterceptor(this),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000140 mPrimaryDispSync("PrimaryDispSync"),
141 mPrimaryHWVsyncEnabled(false),
142 mHWVsyncAvailable(false),
143 mDaltonize(false),
144 mHasColorMatrix(false),
145 mHasPoweredOff(false),
146 mFrameBuckets(),
147 mTotalTime(0),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700148 mLastSwapTime(0),
149 mNumLayers(0)
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000150{
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800151 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
152 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
153
154 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
155 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
156
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000157 ALOGI("SurfaceFlinger is starting");
158
Fabien Sanglardc93afd52017-03-13 13:02:42 -0700159 useContextPriority = getBool< ISurfaceFlingerConfigs,
160 &ISurfaceFlingerConfigs::useContextPriority>(false);
161
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000162 char value[PROPERTY_VALUE_MAX];
163
164 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
165 mGpuToCpuSupported = !atoi(value);
166
167 property_get("debug.sf.showupdates", value, "0");
168 mDebugRegion = atoi(value);
169
170 property_get("debug.sf.ddms", value, "0");
171 mDebugDDMS = atoi(value);
172 if (mDebugDDMS) {
173 if (!startDdmConnection()) {
174 // start failed, and DDMS debugging not enabled
175 mDebugDDMS = 0;
176 }
177 }
178 ALOGI_IF(mDebugRegion, "showupdates enabled");
179 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
180
Fabien Sanglard642b23d2017-02-09 12:29:39 -0800181 property_get("debug.sf.enable_hwc_vds", value, "0");
182 mUseHwcVirtualDisplays = atoi(value);
183 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800184
Fabien Sanglardc65dafa2017-02-07 14:06:39 -0800185 property_get("ro.sf.disable_triple_buffer", value, "1");
186 mLayerTripleBufferingDisabled = atoi(value);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800187 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000188}
189
190void SurfaceFlinger::onFirstRef()
191{
192 mEventQueue.init(this);
193}
194
195SurfaceFlinger::~SurfaceFlinger()
196{
197 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
198 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
199 eglTerminate(display);
200}
201
202void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
203{
204 // the window manager died on us. prepare its eulogy.
205
206 // restore initial conditions (default device unblank, etc)
207 initializeDisplays();
208
209 // restart the boot-animation
210 startBootAnim();
211}
212
Robert Carr1db73f62016-12-21 12:58:51 -0800213static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000214 status_t err = client->initCheck();
215 if (err == NO_ERROR) {
Robert Carr1db73f62016-12-21 12:58:51 -0800216 return client;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000217 }
Robert Carr1db73f62016-12-21 12:58:51 -0800218 return nullptr;
219}
220
221sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
222 return initClient(new Client(this));
223}
224
225sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
226 const sp<IGraphicBufferProducer>& gbp) {
227 if (authenticateSurfaceTexture(gbp) == false) {
228 return nullptr;
229 }
230 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
231 if (layer == nullptr) {
232 return nullptr;
233 }
234
235 return initClient(new Client(this, layer));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000236}
237
238sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
239 bool secure)
240{
241 class DisplayToken : public BBinder {
242 sp<SurfaceFlinger> flinger;
243 virtual ~DisplayToken() {
244 // no more references, this display must be terminated
245 Mutex::Autolock _l(flinger->mStateLock);
246 flinger->mCurrentState.displays.removeItem(this);
247 flinger->setTransactionFlags(eDisplayTransactionNeeded);
248 }
249 public:
250 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
251 : flinger(flinger) {
252 }
253 };
254
255 sp<BBinder> token = new DisplayToken(this);
256
257 Mutex::Autolock _l(mStateLock);
258 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
259 info.displayName = displayName;
260 mCurrentState.displays.add(token, info);
261 mInterceptor.saveDisplayCreation(info);
262 return token;
263}
264
265void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
266 Mutex::Autolock _l(mStateLock);
267
268 ssize_t idx = mCurrentState.displays.indexOfKey(display);
269 if (idx < 0) {
270 ALOGW("destroyDisplay: invalid display token");
271 return;
272 }
273
274 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
275 if (!info.isVirtualDisplay()) {
276 ALOGE("destroyDisplay called for non-virtual display");
277 return;
278 }
279 mInterceptor.saveDisplayDeletion(info.displayId);
280 mCurrentState.displays.removeItemsAt(idx);
281 setTransactionFlags(eDisplayTransactionNeeded);
282}
283
284void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
285 ALOGW_IF(mBuiltinDisplays[type],
286 "Overwriting display token for display type %d", type);
287 mBuiltinDisplays[type] = new BBinder();
288 // All non-virtual displays are currently considered secure.
289 DisplayDeviceState info(type, true);
290 mCurrentState.displays.add(mBuiltinDisplays[type], info);
291 mInterceptor.saveDisplayCreation(info);
292}
293
294sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
295 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
296 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
297 return NULL;
298 }
299 return mBuiltinDisplays[id];
300}
301
Chia-I Wu527747d2017-03-13 20:38:48 +0000302sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc()
303{
304 sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc());
305 return gba;
306}
307
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000308void SurfaceFlinger::bootFinished()
309{
Wei Wangb254fa32017-01-31 17:43:23 -0800310 if (mStartBootAnimThread->join() != NO_ERROR) {
311 ALOGE("Join StartBootAnimThread failed!");
312 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000313 const nsecs_t now = systemTime();
314 const nsecs_t duration = now - mBootTime;
315 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
316 mBootFinished = true;
317
318 // wait patiently for the window manager death
319 const String16 name("window");
320 sp<IBinder> window(defaultServiceManager()->getService(name));
321 if (window != 0) {
322 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
323 }
324
325 // stop boot animation
326 // formerly we would just kill the process, but we now ask it to exit so it
327 // can choose where to stop the animation.
328 property_set("service.bootanim.exit", "1");
329
330 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
331 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
332 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
333}
334
335void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
336 class MessageDestroyGLTexture : public MessageBase {
337 RenderEngine& engine;
338 uint32_t texture;
339 public:
340 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
341 : engine(engine), texture(texture) {
342 }
343 virtual bool handler() {
344 engine.deleteTextures(1, &texture);
345 return true;
346 }
347 };
348 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
349}
350
351class DispSyncSource : public VSyncSource, private DispSync::Callback {
352public:
353 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
354 const char* name) :
355 mName(name),
356 mValue(0),
357 mTraceVsync(traceVsync),
358 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
359 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
360 mDispSync(dispSync),
361 mCallbackMutex(),
362 mCallback(),
363 mVsyncMutex(),
364 mPhaseOffset(phaseOffset),
365 mEnabled(false) {}
366
367 virtual ~DispSyncSource() {}
368
369 virtual void setVSyncEnabled(bool enable) {
370 Mutex::Autolock lock(mVsyncMutex);
371 if (enable) {
372 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
373 static_cast<DispSync::Callback*>(this));
374 if (err != NO_ERROR) {
375 ALOGE("error registering vsync callback: %s (%d)",
376 strerror(-err), err);
377 }
378 //ATRACE_INT(mVsyncOnLabel.string(), 1);
379 } else {
380 status_t err = mDispSync->removeEventListener(
381 static_cast<DispSync::Callback*>(this));
382 if (err != NO_ERROR) {
383 ALOGE("error unregistering vsync callback: %s (%d)",
384 strerror(-err), err);
385 }
386 //ATRACE_INT(mVsyncOnLabel.string(), 0);
387 }
388 mEnabled = enable;
389 }
390
391 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
392 Mutex::Autolock lock(mCallbackMutex);
393 mCallback = callback;
394 }
395
396 virtual void setPhaseOffset(nsecs_t phaseOffset) {
397 Mutex::Autolock lock(mVsyncMutex);
398
399 // Normalize phaseOffset to [0, period)
400 auto period = mDispSync->getPeriod();
401 phaseOffset %= period;
402 if (phaseOffset < 0) {
403 // If we're here, then phaseOffset is in (-period, 0). After this
404 // operation, it will be in (0, period)
405 phaseOffset += period;
406 }
407 mPhaseOffset = phaseOffset;
408
409 // If we're not enabled, we don't need to mess with the listeners
410 if (!mEnabled) {
411 return;
412 }
413
414 // Remove the listener with the old offset
415 status_t err = mDispSync->removeEventListener(
416 static_cast<DispSync::Callback*>(this));
417 if (err != NO_ERROR) {
418 ALOGE("error unregistering vsync callback: %s (%d)",
419 strerror(-err), err);
420 }
421
422 // Add a listener with the new offset
423 err = mDispSync->addEventListener(mName, mPhaseOffset,
424 static_cast<DispSync::Callback*>(this));
425 if (err != NO_ERROR) {
426 ALOGE("error registering vsync callback: %s (%d)",
427 strerror(-err), err);
428 }
429 }
430
431private:
432 virtual void onDispSyncEvent(nsecs_t when) {
433 sp<VSyncSource::Callback> callback;
434 {
435 Mutex::Autolock lock(mCallbackMutex);
436 callback = mCallback;
437
438 if (mTraceVsync) {
439 mValue = (mValue + 1) % 2;
440 ATRACE_INT(mVsyncEventLabel.string(), mValue);
441 }
442 }
443
444 if (callback != NULL) {
445 callback->onVSyncEvent(when);
446 }
447 }
448
449 const char* const mName;
450
451 int mValue;
452
453 const bool mTraceVsync;
454 const String8 mVsyncOnLabel;
455 const String8 mVsyncEventLabel;
456
457 DispSync* mDispSync;
458
459 Mutex mCallbackMutex; // Protects the following
460 sp<VSyncSource::Callback> mCallback;
461
462 Mutex mVsyncMutex; // Protects the following
463 nsecs_t mPhaseOffset;
464 bool mEnabled;
465};
466
467class InjectVSyncSource : public VSyncSource {
468public:
469 InjectVSyncSource() {}
470
471 virtual ~InjectVSyncSource() {}
472
473 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
474 std::lock_guard<std::mutex> lock(mCallbackMutex);
475 mCallback = callback;
476 }
477
478 virtual void onInjectSyncEvent(nsecs_t when) {
479 std::lock_guard<std::mutex> lock(mCallbackMutex);
480 mCallback->onVSyncEvent(when);
481 }
482
483 virtual void setVSyncEnabled(bool) {}
484 virtual void setPhaseOffset(nsecs_t) {}
485
486private:
487 std::mutex mCallbackMutex; // Protects the following
488 sp<VSyncSource::Callback> mCallback;
489};
490
491void SurfaceFlinger::init() {
492 ALOGI( "SurfaceFlinger's main thread ready to run. "
493 "Initializing graphics H/W...");
494
495 Mutex::Autolock _l(mStateLock);
496
497 // initialize EGL for the default display
498 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
499 eglInitialize(mEGLDisplay, NULL, NULL);
500
501 // start the EventThread
502 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
503 vsyncPhaseOffsetNs, true, "app");
504 mEventThread = new EventThread(vsyncSrc, *this, false);
505 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
506 sfVsyncPhaseOffsetNs, true, "sf");
507 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
508 mEventQueue.setEventThread(mSFEventThread);
509
510 // set SFEventThread to SCHED_FIFO to minimize jitter
511 struct sched_param param = {0};
512 param.sched_priority = 2;
513 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
514 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
515 }
516
517
518 // Initialize the H/W composer object. There may or may not be an
519 // actual hardware composer underneath.
520 mHwc = new HWComposer(this,
521 *static_cast<HWComposer::EventHandler *>(this));
522
523 // get a RenderEngine for the given display / config (can't fail)
524 mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID());
525
526 // retrieve the EGL context that was selected/created
527 mEGLContext = mRenderEngine->getEGLContext();
528
529 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
530 "couldn't create EGLContext");
531
532 // initialize our non-virtual displays
533 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
534 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
535 // set-up the displays that are already connected
536 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
537 // All non-virtual displays are currently considered secure.
538 bool isSecure = true;
539 createBuiltinDisplayLocked(type);
540 wp<IBinder> token = mBuiltinDisplays[i];
541
542 sp<IGraphicBufferProducer> producer;
543 sp<IGraphicBufferConsumer> consumer;
Chia-I Wu527747d2017-03-13 20:38:48 +0000544 BufferQueue::createBufferQueue(&producer, &consumer,
545 new GraphicBufferAlloc());
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000546
547 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
548 consumer);
549 int32_t hwcId = allocateHwcDisplayId(type);
550 sp<DisplayDevice> hw = new DisplayDevice(this,
551 type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
552 fbs, producer,
553 mRenderEngine->getEGLConfig());
554 if (i > DisplayDevice::DISPLAY_PRIMARY) {
555 // FIXME: currently we don't get blank/unblank requests
556 // for displays other than the main display, so we always
557 // assume a connected display is unblanked.
558 ALOGD("marking display %zu as acquired/unblanked", i);
559 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
560 }
561 mDisplays.add(token, hw);
562 }
563 }
564
565 // make the GLContext current so that we can create textures when creating Layers
566 // (which may happens before we render something)
567 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
568
569 mEventControlThread = new EventControlThread(this);
570 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
571
572 // set a fake vsync period if there is no HWComposer
573 if (mHwc->initCheck() != NO_ERROR) {
574 mPrimaryDispSync.setPeriod(16666667);
575 }
576
577 // initialize our drawing state
578 mDrawingState = mCurrentState;
579
580 // set initial conditions (e.g. unblank default device)
581 initializeDisplays();
582
583 mRenderEngine->primeCache();
584
Wei Wangb254fa32017-01-31 17:43:23 -0800585 mStartBootAnimThread = new StartBootAnimThread();
586 if (mStartBootAnimThread->Start() != NO_ERROR) {
587 ALOGE("Run StartBootAnimThread failed!");
588 }
589
590 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000591}
592
593int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
594 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
595 type : mHwc->allocateDisplayId();
596}
597
598void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800599 // Start boot animation service by setting a property mailbox
600 // if property setting thread is already running, Start() will be just a NOP
601 mStartBootAnimThread->Start();
602 // Wait until property was set
603 if (mStartBootAnimThread->join() != NO_ERROR) {
604 ALOGE("Join StartBootAnimThread failed!");
605 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000606}
607
608size_t SurfaceFlinger::getMaxTextureSize() const {
609 return mRenderEngine->getMaxTextureSize();
610}
611
612size_t SurfaceFlinger::getMaxViewportDims() const {
613 return mRenderEngine->getMaxViewportDims();
614}
615
616// ----------------------------------------------------------------------------
617
618bool SurfaceFlinger::authenticateSurfaceTexture(
619 const sp<IGraphicBufferProducer>& bufferProducer) const {
620 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800621 return authenticateSurfaceTextureLocked(bufferProducer);
622}
623
624bool SurfaceFlinger::authenticateSurfaceTextureLocked(
625 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000626 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
627 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
628}
629
Brian Anderson069b3652016-07-22 10:32:47 -0700630status_t SurfaceFlinger::getSupportedFrameTimestamps(
Brian Anderson3890c392016-07-25 12:48:08 -0700631 std::vector<FrameEvent>* outSupported) const {
Brian Anderson069b3652016-07-22 10:32:47 -0700632 *outSupported = {
Brian Anderson3890c392016-07-25 12:48:08 -0700633 FrameEvent::REQUESTED_PRESENT,
634 FrameEvent::ACQUIRE,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700635 FrameEvent::LATCH,
Brian Anderson3890c392016-07-25 12:48:08 -0700636 FrameEvent::FIRST_REFRESH_START,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700637 FrameEvent::LAST_REFRESH_START,
Brian Andersonb04c6f02016-10-21 12:57:46 -0700638 FrameEvent::GPU_COMPOSITION_DONE,
Brian Anderson3890c392016-07-25 12:48:08 -0700639 FrameEvent::DISPLAY_RETIRE,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700640 FrameEvent::DEQUEUE_READY,
Brian Anderson3890c392016-07-25 12:48:08 -0700641 FrameEvent::RELEASE,
Brian Anderson069b3652016-07-22 10:32:47 -0700642 };
643 return NO_ERROR;
644}
645
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000646status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
647 Vector<DisplayInfo>* configs) {
648 if ((configs == NULL) || (display.get() == NULL)) {
649 return BAD_VALUE;
650 }
651
652 int32_t type = getDisplayType(display);
653 if (type < 0) return type;
654
655 // TODO: Not sure if display density should handled by SF any longer
656 class Density {
657 static int getDensityFromProperty(char const* propName) {
658 char property[PROPERTY_VALUE_MAX];
659 int density = 0;
660 if (property_get(propName, property, NULL) > 0) {
661 density = atoi(property);
662 }
663 return density;
664 }
665 public:
666 static int getEmuDensity() {
667 return getDensityFromProperty("qemu.sf.lcd_density"); }
668 static int getBuildDensity() {
669 return getDensityFromProperty("ro.sf.lcd_density"); }
670 };
671
672 configs->clear();
673
674 const Vector<HWComposer::DisplayConfig>& hwConfigs =
675 getHwComposer().getConfigs(type);
676 for (size_t c = 0; c < hwConfigs.size(); ++c) {
677 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
678 DisplayInfo info = DisplayInfo();
679
680 float xdpi = hwConfig.xdpi;
681 float ydpi = hwConfig.ydpi;
682
683 if (type == DisplayDevice::DISPLAY_PRIMARY) {
684 // The density of the device is provided by a build property
685 float density = Density::getBuildDensity() / 160.0f;
686 if (density == 0) {
687 // the build doesn't provide a density -- this is wrong!
688 // use xdpi instead
689 ALOGE("ro.sf.lcd_density must be defined as a build property");
690 density = xdpi / 160.0f;
691 }
692 if (Density::getEmuDensity()) {
693 // if "qemu.sf.lcd_density" is specified, it overrides everything
694 xdpi = ydpi = density = Density::getEmuDensity();
695 density /= 160.0f;
696 }
697 info.density = density;
698
699 // TODO: this needs to go away (currently needed only by webkit)
700 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
701 info.orientation = hw->getOrientation();
702 } else {
703 // TODO: where should this value come from?
704 static const int TV_DENSITY = 213;
705 info.density = TV_DENSITY / 160.0f;
706 info.orientation = 0;
707 }
708
709 info.w = hwConfig.width;
710 info.h = hwConfig.height;
711 info.xdpi = xdpi;
712 info.ydpi = ydpi;
713 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800714 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000715
716 // This is how far in advance a buffer must be queued for
717 // presentation at a given time. If you want a buffer to appear
718 // on the screen at time N, you must submit the buffer before
719 // (N - presentationDeadline).
720 //
721 // Normally it's one full refresh period (to give SF a chance to
722 // latch the buffer), but this can be reduced by configuring a
723 // DispSync offset. Any additional delays introduced by the hardware
724 // composer or panel must be accounted for here.
725 //
726 // We add an additional 1ms to allow for processing time and
727 // differences between the ideal and actual refresh rate.
728 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800729 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000730
731 // All non-virtual displays are currently considered secure.
732 info.secure = true;
733
734 configs->push_back(info);
735 }
736
737 return NO_ERROR;
738}
739
740status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
741 DisplayStatInfo* stats) {
742 if (stats == NULL) {
743 return BAD_VALUE;
744 }
745
746 // FIXME for now we always return stats for the primary display
747 memset(stats, 0, sizeof(*stats));
748 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
749 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
750 return NO_ERROR;
751}
752
753int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
754 sp<DisplayDevice> device(getDisplayDevice(display));
755 if (device != NULL) {
756 return device->getActiveConfig();
757 }
758 return BAD_VALUE;
759}
760
761void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
762 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
763 this);
764 int32_t type = hw->getDisplayType();
765 int currentMode = hw->getActiveConfig();
766
767 if (mode == currentMode) {
768 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
769 return;
770 }
771
772 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
773 ALOGW("Trying to set config for virtual display");
774 return;
775 }
776
777 hw->setActiveConfig(mode);
778 getHwComposer().setActiveConfig(type, mode);
779}
780
781status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
782 class MessageSetActiveConfig: public MessageBase {
783 SurfaceFlinger& mFlinger;
784 sp<IBinder> mDisplay;
785 int mMode;
786 public:
787 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
788 int mode) :
789 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
790 virtual bool handler() {
791 Vector<DisplayInfo> configs;
792 mFlinger.getDisplayConfigs(mDisplay, &configs);
793 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
794 ALOGE("Attempt to set active config = %d for display with %zu configs",
795 mMode, configs.size());
796 }
797 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
798 if (hw == NULL) {
799 ALOGE("Attempt to set active config = %d for null display %p",
800 mMode, mDisplay.get());
801 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
802 ALOGW("Attempt to set active config = %d for virtual display",
803 mMode);
804 } else {
805 mFlinger.setActiveConfigInternal(hw, mMode);
806 }
807 return true;
808 }
809 };
810 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
811 postMessageSync(msg);
812 return NO_ERROR;
813}
814
815status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
816 Vector<android_color_mode_t>* outColorModes) {
817 if (outColorModes == nullptr || display.get() == nullptr) {
818 return BAD_VALUE;
819 }
820
821 int32_t type = getDisplayType(display);
822 if (type < 0) return type;
823
824 std::set<android_color_mode_t> colorModes;
825 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
826 colorModes.insert(hwConfig.colorMode);
827 }
828
829 outColorModes->clear();
830 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
831
832 return NO_ERROR;
833}
834
835android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
836 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
837
838 int32_t type = getDisplayType(display);
839 if (type < 0) return static_cast<android_color_mode_t>(type);
840
841 return getHwComposer().getColorMode(type);
842}
843
844status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
845 android_color_mode_t colorMode) {
846 if (display.get() == nullptr || colorMode < 0) {
847 return BAD_VALUE;
848 }
849
850 int32_t type = getDisplayType(display);
851 if (type < 0) return type;
852 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
853 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
854 desiredConfig.colorMode = colorMode;
855 for (size_t c = 0; c < hwConfigs.size(); ++c) {
856 const HWComposer::DisplayConfig config = hwConfigs[c];
857 if (config == desiredConfig) {
858 return setActiveConfig(display, c);
859 }
860 }
861 return BAD_VALUE;
862}
863
864status_t SurfaceFlinger::clearAnimationFrameStats() {
865 Mutex::Autolock _l(mStateLock);
866 mAnimFrameTracker.clearStats();
867 return NO_ERROR;
868}
869
870status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
871 Mutex::Autolock _l(mStateLock);
872 mAnimFrameTracker.getStats(outStats);
873 return NO_ERROR;
874}
875
876status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
877 HdrCapabilities* outCapabilities) const {
878 // HWC1 does not provide HDR capabilities
879 *outCapabilities = HdrCapabilities();
880 return NO_ERROR;
881}
882
883status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
884 if (enable == mInjectVSyncs) {
885 return NO_ERROR;
886 }
887
888 if (enable) {
889 mInjectVSyncs = enable;
890 ALOGV("VSync Injections enabled");
891 if (mVSyncInjector.get() == nullptr) {
892 mVSyncInjector = new InjectVSyncSource();
893 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
894 }
895 mEventQueue.setEventThread(mInjectorEventThread);
896 } else {
897 mInjectVSyncs = enable;
898 ALOGV("VSync Injections disabled");
899 mEventQueue.setEventThread(mSFEventThread);
900 mVSyncInjector.clear();
901 }
902 return NO_ERROR;
903}
904
905status_t SurfaceFlinger::injectVSync(nsecs_t when) {
906 if (!mInjectVSyncs) {
907 ALOGE("VSync Injections not enabled");
908 return BAD_VALUE;
909 }
910 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
911 ALOGV("Injecting VSync inside SurfaceFlinger");
912 mVSyncInjector->onInjectSyncEvent(when);
913 }
914 return NO_ERROR;
915}
916
917// ----------------------------------------------------------------------------
918
919sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
920 return mEventThread->createEventConnection();
921}
922
923// ----------------------------------------------------------------------------
924
925void SurfaceFlinger::waitForEvent() {
926 mEventQueue.waitMessage();
927}
928
929void SurfaceFlinger::signalTransaction() {
930 mEventQueue.invalidate();
931}
932
933void SurfaceFlinger::signalLayerUpdate() {
934 mEventQueue.invalidate();
935}
936
937void SurfaceFlinger::signalRefresh() {
938 mEventQueue.refresh();
939}
940
941status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
942 nsecs_t reltime, uint32_t /* flags */) {
943 return mEventQueue.postMessage(msg, reltime);
944}
945
946status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
947 nsecs_t reltime, uint32_t /* flags */) {
948 status_t res = mEventQueue.postMessage(msg, reltime);
949 if (res == NO_ERROR) {
950 msg->wait();
951 }
952 return res;
953}
954
955void SurfaceFlinger::run() {
956 do {
957 waitForEvent();
958 } while (true);
959}
960
961void SurfaceFlinger::enableHardwareVsync() {
962 Mutex::Autolock _l(mHWVsyncLock);
963 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
964 mPrimaryDispSync.beginResync();
965 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
966 mEventControlThread->setVsyncEnabled(true);
967 mPrimaryHWVsyncEnabled = true;
968 }
969}
970
971void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
972 Mutex::Autolock _l(mHWVsyncLock);
973
974 if (makeAvailable) {
975 mHWVsyncAvailable = true;
976 } else if (!mHWVsyncAvailable) {
977 // Hardware vsync is not currently available, so abort the resync
978 // attempt for now
979 return;
980 }
981
982 const nsecs_t period =
983 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
984
985 mPrimaryDispSync.reset();
986 mPrimaryDispSync.setPeriod(period);
987
988 if (!mPrimaryHWVsyncEnabled) {
989 mPrimaryDispSync.beginResync();
990 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
991 mEventControlThread->setVsyncEnabled(true);
992 mPrimaryHWVsyncEnabled = true;
993 }
994}
995
996void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
997 Mutex::Autolock _l(mHWVsyncLock);
998 if (mPrimaryHWVsyncEnabled) {
999 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1000 mEventControlThread->setVsyncEnabled(false);
1001 mPrimaryDispSync.endResync();
1002 mPrimaryHWVsyncEnabled = false;
1003 }
1004 if (makeUnavailable) {
1005 mHWVsyncAvailable = false;
1006 }
1007}
1008
1009void SurfaceFlinger::resyncWithRateLimit() {
1010 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1011 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1012 resyncToHardwareVsync(false);
1013 }
1014}
1015
Steven Thomas3cfac282017-02-06 12:29:30 -08001016void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1017 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001018 bool needsHwVsync = false;
1019
1020 { // Scope for the lock
1021 Mutex::Autolock _l(mHWVsyncLock);
1022 if (type == 0 && mPrimaryHWVsyncEnabled) {
1023 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1024 }
1025 }
1026
1027 if (needsHwVsync) {
1028 enableHardwareVsync();
1029 } else {
1030 disableHardwareVsync(false);
1031 }
1032}
1033
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001034void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
Brian Andersond0010582017-03-07 13:20:31 -08001035 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001036 *compositorTiming = mCompositorTiming;
1037}
1038
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001039void SurfaceFlinger::onHotplugReceived(int type, bool connected) {
1040 if (mEventThread == NULL) {
1041 // This is a temporary workaround for b/7145521. A non-null pointer
1042 // does not mean EventThread has finished initializing, so this
1043 // is not a correct fix.
1044 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1045 return;
1046 }
1047
1048 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1049 Mutex::Autolock _l(mStateLock);
1050 if (connected) {
1051 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1052 } else {
1053 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1054 mBuiltinDisplays[type].clear();
1055 }
1056 setTransactionFlags(eDisplayTransactionNeeded);
1057
1058 // Defer EventThread notification until SF has updated mDisplays.
1059 }
1060}
1061
Steven Thomas3cfac282017-02-06 12:29:30 -08001062void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1063 repaintEverything();
1064}
1065
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001066void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1067 ATRACE_CALL();
1068 getHwComposer().eventControl(disp, event, enabled);
1069}
1070
1071void SurfaceFlinger::onMessageReceived(int32_t what) {
1072 ATRACE_CALL();
1073 switch (what) {
1074 case MessageQueue::INVALIDATE: {
1075 bool refreshNeeded = handleMessageTransaction();
1076 refreshNeeded |= handleMessageInvalidate();
1077 refreshNeeded |= mRepaintEverything;
1078 if (refreshNeeded) {
1079 // Signal a refresh if a transaction modified the window state,
1080 // a new buffer was latched, or if HWC has requested a full
1081 // repaint
1082 signalRefresh();
1083 }
1084 break;
1085 }
1086 case MessageQueue::REFRESH: {
1087 handleMessageRefresh();
1088 break;
1089 }
1090 }
1091}
1092
1093bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001094 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001095 if (transactionFlags) {
1096 handleTransaction(transactionFlags);
1097 return true;
1098 }
1099 return false;
1100}
1101
1102bool SurfaceFlinger::handleMessageInvalidate() {
1103 ATRACE_CALL();
1104 return handlePageFlip();
1105}
1106
1107void SurfaceFlinger::handleMessageRefresh() {
1108 ATRACE_CALL();
1109
1110 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1111
Brian Andersond6927fb2016-07-23 23:37:30 -07001112 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001113 rebuildLayerStacks();
1114 setUpHWComposer();
1115 doDebugFlashRegions();
1116 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001117 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001118}
1119
1120void SurfaceFlinger::doDebugFlashRegions()
1121{
1122 // is debugging enabled
1123 if (CC_LIKELY(!mDebugRegion))
1124 return;
1125
1126 const bool repaintEverything = mRepaintEverything;
1127 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1128 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1129 if (hw->isDisplayOn()) {
1130 // transform the dirty region into this screen's coordinate space
1131 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1132 if (!dirtyRegion.isEmpty()) {
1133 // redraw the whole screen
1134 doComposeSurfaces(hw, Region(hw->bounds()));
1135
1136 // and draw the dirty region
1137 const int32_t height = hw->getHeight();
1138 RenderEngine& engine(getRenderEngine());
1139 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1140
1141 hw->compositionComplete();
1142 hw->swapBuffers(getHwComposer());
1143 }
1144 }
1145 }
1146
1147 postFramebuffer();
1148
1149 if (mDebugRegion > 1) {
1150 usleep(mDebugRegion * 1000);
1151 }
1152
1153 HWComposer& hwc(getHwComposer());
1154 if (hwc.initCheck() == NO_ERROR) {
1155 status_t err = hwc.prepare();
1156 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1157 }
1158}
1159
Brian Andersond6927fb2016-07-23 23:37:30 -07001160void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001161{
1162 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001163 mDrawingState.traverseInZOrder([&](Layer* layer) {
1164 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001165 needExtraInvalidate = true;
1166 }
Robert Carr2047fae2016-11-28 14:09:09 -08001167 });
1168
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001169 if (needExtraInvalidate) {
1170 signalLayerUpdate();
1171 }
1172}
1173
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001174void SurfaceFlinger::updateCompositorTiming(
1175 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1176 std::shared_ptr<FenceTime>& presentFenceTime) {
1177 // Update queue of past composite+present times and determine the
1178 // most recently known composite to present latency.
1179 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1180 nsecs_t compositeToPresentLatency = -1;
1181 while (!mCompositePresentTimes.empty()) {
1182 CompositePresentTime& cpt = mCompositePresentTimes.front();
1183 // Cached values should have been updated before calling this method,
1184 // which helps avoid duplicate syscalls.
1185 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1186 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1187 break;
1188 }
1189 compositeToPresentLatency = displayTime - cpt.composite;
1190 mCompositePresentTimes.pop();
1191 }
1192
1193 // Don't let mCompositePresentTimes grow unbounded, just in case.
1194 while (mCompositePresentTimes.size() > 16) {
1195 mCompositePresentTimes.pop();
1196 }
1197
Brian Andersond0010582017-03-07 13:20:31 -08001198 setCompositorTimingSnapped(
1199 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1200}
1201
1202void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1203 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001204 // Integer division and modulo round toward 0 not -inf, so we need to
1205 // treat negative and positive offsets differently.
Brian Andersond0010582017-03-07 13:20:31 -08001206 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001207 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1208 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1209
Brian Andersond0010582017-03-07 13:20:31 -08001210 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1211 if (idealLatency <= 0) {
1212 idealLatency = vsyncInterval;
1213 }
1214
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001215 // Snap the latency to a value that removes scheduling jitter from the
1216 // composition and present times, which often have >1ms of jitter.
1217 // Reducing jitter is important if an app attempts to extrapolate
1218 // something (such as user input) to an accurate diasplay time.
1219 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1220 // with (presentLatency % interval).
Brian Andersond0010582017-03-07 13:20:31 -08001221 nsecs_t bias = vsyncInterval / 2;
1222 int64_t extraVsyncs =
1223 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1224 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1225 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001226
Brian Andersond0010582017-03-07 13:20:31 -08001227 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001228 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1229 mCompositorTiming.interval = vsyncInterval;
Brian Andersond0010582017-03-07 13:20:31 -08001230 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001231}
1232
1233void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001234{
Brian Andersond6927fb2016-07-23 23:37:30 -07001235 const HWComposer& hwc = getHwComposer();
1236 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1237
Brian Anderson3d4039d2016-09-23 16:31:30 -07001238 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1239 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1240 glCompositionDoneFenceTime =
1241 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1242 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1243 } else {
1244 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1245 }
1246 mGlCompositionDoneTimeline.updateSignalTimes();
1247
1248 sp<Fence> displayFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1249 const std::shared_ptr<FenceTime>& presentFenceTime = FenceTime::NO_FENCE;
1250 auto retireFenceTime = std::make_shared<FenceTime>(displayFence);
1251 mDisplayTimeline.push(retireFenceTime);
1252 mDisplayTimeline.updateSignalTimes();
Brian Andersond6927fb2016-07-23 23:37:30 -07001253
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001254 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1255 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1256
1257 // We use the refreshStartTime which might be sampled a little later than
1258 // when we started doing work for this frame, but that should be okay
1259 // since updateCompositorTiming has snapping logic.
1260 updateCompositorTiming(
1261 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
Brian Andersond0010582017-03-07 13:20:31 -08001262 CompositorTiming compositorTiming;
1263 {
1264 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1265 compositorTiming = mCompositorTiming;
1266 }
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001267
Robert Carr2047fae2016-11-28 14:09:09 -08001268 mDrawingState.traverseInZOrder([&](Layer* layer) {
1269 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Andersond0010582017-03-07 13:20:31 -08001270 presentFenceTime, retireFenceTime, compositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001271 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001272 recordBufferingStats(layer->getName().string(),
1273 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001274 }
Robert Carr2047fae2016-11-28 14:09:09 -08001275 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001276
Brian Anderson3d4039d2016-09-23 16:31:30 -07001277 if (displayFence->isValid()) {
1278 if (mPrimaryDispSync.addPresentFence(displayFence)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001279 enableHardwareVsync();
1280 } else {
1281 disableHardwareVsync(false);
1282 }
1283 }
1284
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001285 if (kIgnorePresentFences) {
1286 if (hw->isDisplayOn()) {
1287 enableHardwareVsync();
1288 }
1289 }
1290
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001291 if (mAnimCompositionPending) {
1292 mAnimCompositionPending = false;
1293
Brian Anderson3d4039d2016-09-23 16:31:30 -07001294 if (retireFenceTime->isValid()) {
1295 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001296 } else {
1297 // The HWC doesn't support present fences, so use the refresh
1298 // timestamp instead.
1299 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1300 mAnimFrameTracker.setActualPresentTime(presentTime);
1301 }
1302 mAnimFrameTracker.advanceFrame();
1303 }
1304
1305 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1306 return;
1307 }
1308
1309 nsecs_t currentTime = systemTime();
1310 if (mHasPoweredOff) {
1311 mHasPoweredOff = false;
1312 } else {
1313 nsecs_t period = mPrimaryDispSync.getPeriod();
1314 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1315 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1316 if (numPeriods < NUM_BUCKETS - 1) {
1317 mFrameBuckets[numPeriods] += elapsedTime;
1318 } else {
1319 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1320 }
1321 mTotalTime += elapsedTime;
1322 }
1323 mLastSwapTime = currentTime;
1324}
1325
1326void SurfaceFlinger::rebuildLayerStacks() {
1327 // rebuild the visible layer list per screen
1328 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1329 ATRACE_CALL();
1330 mVisibleRegionsDirty = false;
1331 invalidateHwcGeometry();
1332
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001333 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1334 Region opaqueRegion;
1335 Region dirtyRegion;
1336 Vector< sp<Layer> > layersSortedByZ;
1337 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1338 const Transform& tr(hw->getTransform());
1339 const Rect bounds(hw->getBounds());
1340 if (hw->isDisplayOn()) {
Robert Carr2047fae2016-11-28 14:09:09 -08001341 computeVisibleRegions(hw->getLayerStack(), dirtyRegion,
1342 opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001343
Robert Carr2047fae2016-11-28 14:09:09 -08001344 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001345 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001346 Region drawRegion(tr.transform(
1347 layer->visibleNonTransparentRegion));
1348 drawRegion.andSelf(bounds);
1349 if (!drawRegion.isEmpty()) {
1350 layersSortedByZ.add(layer);
1351 }
1352 }
Robert Carr2047fae2016-11-28 14:09:09 -08001353 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001354 }
1355 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1356 hw->undefinedRegion.set(bounds);
1357 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1358 hw->dirtyRegion.orSelf(dirtyRegion);
1359 }
1360 }
1361}
1362
1363void SurfaceFlinger::setUpHWComposer() {
1364 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1365 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1366 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1367 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1368
1369 // If nothing has changed (!dirty), don't recompose.
1370 // If something changed, but we don't currently have any visible layers,
1371 // and didn't when we last did a composition, then skip it this time.
1372 // The second rule does two things:
1373 // - When all layers are removed from a display, we'll emit one black
1374 // frame, then nothing more until we get new layers.
1375 // - When a display is created with a private layer stack, we won't
1376 // emit any black frames until a layer is added to the layer stack.
1377 bool mustRecompose = dirty && !(empty && wasEmpty);
1378
1379 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1380 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1381 mustRecompose ? "doing" : "skipping",
1382 dirty ? "+" : "-",
1383 empty ? "+" : "-",
1384 wasEmpty ? "+" : "-");
1385
1386 mDisplays[dpy]->beginFrame(mustRecompose);
1387
1388 if (mustRecompose) {
1389 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1390 }
1391 }
1392
1393 HWComposer& hwc(getHwComposer());
1394 if (hwc.initCheck() == NO_ERROR) {
1395 // build the h/w work list
1396 if (CC_UNLIKELY(mHwWorkListDirty)) {
1397 mHwWorkListDirty = false;
1398 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1399 sp<const DisplayDevice> hw(mDisplays[dpy]);
1400 const int32_t id = hw->getHwcDisplayId();
1401 if (id >= 0) {
1402 const Vector< sp<Layer> >& currentLayers(
1403 hw->getVisibleLayersSortedByZ());
1404 const size_t count = currentLayers.size();
1405 if (hwc.createWorkList(id, count) == NO_ERROR) {
1406 HWComposer::LayerListIterator cur = hwc.begin(id);
1407 const HWComposer::LayerListIterator end = hwc.end(id);
1408 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1409 const sp<Layer>& layer(currentLayers[i]);
1410 layer->setGeometry(hw, *cur);
1411 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1412 cur->setSkip(true);
1413 }
1414 }
1415 }
1416 }
1417 }
1418 }
1419
1420 // set the per-frame data
1421 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1422 sp<const DisplayDevice> hw(mDisplays[dpy]);
1423 const int32_t id = hw->getHwcDisplayId();
1424 if (id >= 0) {
1425 const Vector< sp<Layer> >& currentLayers(
1426 hw->getVisibleLayersSortedByZ());
1427 const size_t count = currentLayers.size();
1428 HWComposer::LayerListIterator cur = hwc.begin(id);
1429 const HWComposer::LayerListIterator end = hwc.end(id);
1430 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1431 /*
1432 * update the per-frame h/w composer data for each layer
1433 * and build the transparent region of the FB
1434 */
1435 const sp<Layer>& layer(currentLayers[i]);
1436 layer->setPerFrameData(hw, *cur);
1437 }
1438 }
1439 }
1440
1441 // If possible, attempt to use the cursor overlay on each display.
1442 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1443 sp<const DisplayDevice> hw(mDisplays[dpy]);
1444 const int32_t id = hw->getHwcDisplayId();
1445 if (id >= 0) {
1446 const Vector< sp<Layer> >& currentLayers(
1447 hw->getVisibleLayersSortedByZ());
1448 const size_t count = currentLayers.size();
1449 HWComposer::LayerListIterator cur = hwc.begin(id);
1450 const HWComposer::LayerListIterator end = hwc.end(id);
1451 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1452 const sp<Layer>& layer(currentLayers[i]);
1453 if (layer->isPotentialCursor()) {
1454 cur->setIsCursorLayerHint();
1455 break;
1456 }
1457 }
1458 }
1459 }
1460
1461 status_t err = hwc.prepare();
1462 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1463
1464 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1465 sp<const DisplayDevice> hw(mDisplays[dpy]);
1466 hw->prepareFrame(hwc);
1467 }
1468 }
1469}
1470
1471void SurfaceFlinger::doComposition() {
1472 ATRACE_CALL();
1473 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1474 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1475 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1476 if (hw->isDisplayOn()) {
1477 // transform the dirty region into this screen's coordinate space
1478 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1479
1480 // repaint the framebuffer (if needed)
1481 doDisplayComposition(hw, dirtyRegion);
1482
1483 hw->dirtyRegion.clear();
1484 hw->flip(hw->swapRegion);
1485 hw->swapRegion.clear();
1486 }
1487 // inform the h/w that we're done compositing
1488 hw->compositionComplete();
1489 }
1490 postFramebuffer();
1491}
1492
1493void SurfaceFlinger::postFramebuffer()
1494{
1495 ATRACE_CALL();
1496
1497 const nsecs_t now = systemTime();
1498 mDebugInSwapBuffers = now;
1499
1500 HWComposer& hwc(getHwComposer());
1501 if (hwc.initCheck() == NO_ERROR) {
1502 if (!hwc.supportsFramebufferTarget()) {
1503 // EGL spec says:
1504 // "surface must be bound to the calling thread's current context,
1505 // for the current rendering API."
1506 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1507 }
1508 hwc.commit();
1509 }
1510
1511 // make the default display current because the VirtualDisplayDevice code cannot
1512 // deal with dequeueBuffer() being called outside of the composition loop; however
1513 // the code below can call glFlush() which is allowed (and does in some case) call
1514 // dequeueBuffer().
1515 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1516
1517 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1518 sp<const DisplayDevice> hw(mDisplays[dpy]);
1519 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1520 hw->onSwapBuffersCompleted(hwc);
1521 const size_t count = currentLayers.size();
1522 int32_t id = hw->getHwcDisplayId();
1523 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1524 HWComposer::LayerListIterator cur = hwc.begin(id);
1525 const HWComposer::LayerListIterator end = hwc.end(id);
1526 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1527 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1528 }
1529 } else {
1530 for (size_t i = 0; i < count; i++) {
1531 currentLayers[i]->onLayerDisplayed(hw, NULL);
1532 }
1533 }
1534 }
1535
1536 mLastSwapBufferTime = systemTime() - now;
1537 mDebugInSwapBuffers = 0;
1538
1539 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1540 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1541 logFrameStats();
1542 }
1543}
1544
1545void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1546{
1547 ATRACE_CALL();
1548
1549 // here we keep a copy of the drawing state (that is the state that's
1550 // going to be overwritten by handleTransactionLocked()) outside of
1551 // mStateLock so that the side-effects of the State assignment
1552 // don't happen with mStateLock held (which can cause deadlocks).
1553 State drawingState(mDrawingState);
1554
1555 Mutex::Autolock _l(mStateLock);
1556 const nsecs_t now = systemTime();
1557 mDebugInTransaction = now;
1558
1559 // Here we're guaranteed that some transaction flags are set
1560 // so we can call handleTransactionLocked() unconditionally.
1561 // We call getTransactionFlags(), which will also clear the flags,
1562 // with mStateLock held to guarantee that mCurrentState won't change
1563 // until the transaction is committed.
1564
1565 transactionFlags = getTransactionFlags(eTransactionMask);
1566 handleTransactionLocked(transactionFlags);
1567
1568 mLastTransactionTime = systemTime() - now;
1569 mDebugInTransaction = 0;
1570 invalidateHwcGeometry();
1571 // here the transaction has been committed
1572}
1573
1574void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1575{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001576 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001577 mCurrentState.traverseInZOrder([](Layer* layer) {
1578 layer->notifyAvailableFrames();
1579 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001580
1581 /*
1582 * Traversal of the children
1583 * (perform the transaction for each of them if needed)
1584 */
1585
1586 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001587 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001588 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001589 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001590
1591 const uint32_t flags = layer->doTransaction(0);
1592 if (flags & Layer::eVisibleRegion)
1593 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001594 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001595 }
1596
1597 /*
1598 * Perform display own transactions if needed
1599 */
1600
1601 if (transactionFlags & eDisplayTransactionNeeded) {
1602 // here we take advantage of Vector's copy-on-write semantics to
1603 // improve performance by skipping the transaction entirely when
1604 // know that the lists are identical
1605 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1606 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1607 if (!curr.isIdenticalTo(draw)) {
1608 mVisibleRegionsDirty = true;
1609 const size_t cc = curr.size();
1610 size_t dc = draw.size();
1611
1612 // find the displays that were removed
1613 // (ie: in drawing state but not in current state)
1614 // also handle displays that changed
1615 // (ie: displays that are in both lists)
1616 for (size_t i=0 ; i<dc ; i++) {
1617 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1618 if (j < 0) {
1619 // in drawing state but not in current state
1620 if (!draw[i].isMainDisplay()) {
1621 // Call makeCurrent() on the primary display so we can
1622 // be sure that nothing associated with this display
1623 // is current.
1624 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1625 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1626 sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1627 if (hw != NULL)
1628 hw->disconnect(getHwComposer());
1629 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1630 mEventThread->onHotplugReceived(draw[i].type, false);
1631 mDisplays.removeItem(draw.keyAt(i));
1632 } else {
1633 ALOGW("trying to remove the main display");
1634 }
1635 } else {
1636 // this display is in both lists. see if something changed.
1637 const DisplayDeviceState& state(curr[j]);
1638 const wp<IBinder>& display(curr.keyAt(j));
1639 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1640 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1641 if (state_binder != draw_binder) {
1642 // changing the surface is like destroying and
1643 // recreating the DisplayDevice, so we just remove it
1644 // from the drawing state, so that it get re-added
1645 // below.
1646 sp<DisplayDevice> hw(getDisplayDevice(display));
1647 if (hw != NULL)
1648 hw->disconnect(getHwComposer());
1649 mDisplays.removeItem(display);
1650 mDrawingState.displays.removeItemsAt(i);
1651 dc--; i--;
1652 // at this point we must loop to the next item
1653 continue;
1654 }
1655
1656 const sp<DisplayDevice> disp(getDisplayDevice(display));
1657 if (disp != NULL) {
1658 if (state.layerStack != draw[i].layerStack) {
1659 disp->setLayerStack(state.layerStack);
1660 }
1661 if ((state.orientation != draw[i].orientation)
1662 || (state.viewport != draw[i].viewport)
1663 || (state.frame != draw[i].frame))
1664 {
1665 disp->setProjection(state.orientation,
1666 state.viewport, state.frame);
1667 }
1668 if (state.width != draw[i].width || state.height != draw[i].height) {
1669 disp->setDisplaySize(state.width, state.height);
1670 }
1671 }
1672 }
1673 }
1674
1675 // find displays that were added
1676 // (ie: in current state but not in drawing state)
1677 for (size_t i=0 ; i<cc ; i++) {
1678 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1679 const DisplayDeviceState& state(curr[i]);
1680
1681 sp<DisplaySurface> dispSurface;
1682 sp<IGraphicBufferProducer> producer;
1683 sp<IGraphicBufferProducer> bqProducer;
1684 sp<IGraphicBufferConsumer> bqConsumer;
Chia-I Wu527747d2017-03-13 20:38:48 +00001685 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer,
1686 new GraphicBufferAlloc());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001687
1688 int32_t hwcDisplayId = -1;
1689 if (state.isVirtualDisplay()) {
1690 // Virtual displays without a surface are dormant:
1691 // they have external state (layer stack, projection,
1692 // etc.) but no internal state (i.e. a DisplayDevice).
1693 if (state.surface != NULL) {
1694
1695 int width = 0;
1696 int status = state.surface->query(
1697 NATIVE_WINDOW_WIDTH, &width);
1698 ALOGE_IF(status != NO_ERROR,
1699 "Unable to query width (%d)", status);
1700 int height = 0;
1701 status = state.surface->query(
1702 NATIVE_WINDOW_HEIGHT, &height);
1703 ALOGE_IF(status != NO_ERROR,
1704 "Unable to query height (%d)", status);
1705 if (mUseHwcVirtualDisplays &&
1706 (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 ||
1707 (width <= MAX_VIRTUAL_DISPLAY_DIMENSION &&
1708 height <= MAX_VIRTUAL_DISPLAY_DIMENSION))) {
1709 hwcDisplayId = allocateHwcDisplayId(state.type);
1710 }
1711
1712 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1713 *mHwc, hwcDisplayId, state.surface,
1714 bqProducer, bqConsumer, state.displayName);
1715
1716 dispSurface = vds;
1717 producer = vds;
1718 }
1719 } else {
1720 ALOGE_IF(state.surface!=NULL,
1721 "adding a supported display, but rendering "
1722 "surface is provided (%p), ignoring it",
1723 state.surface.get());
1724 hwcDisplayId = allocateHwcDisplayId(state.type);
1725 // for supported (by hwc) displays we provide our
1726 // own rendering surface
1727 dispSurface = new FramebufferSurface(*mHwc, state.type,
1728 bqConsumer);
1729 producer = bqProducer;
1730 }
1731
1732 const wp<IBinder>& display(curr.keyAt(i));
1733 if (dispSurface != NULL) {
1734 sp<DisplayDevice> hw = new DisplayDevice(this,
1735 state.type, hwcDisplayId,
1736 mHwc->getFormat(hwcDisplayId), state.isSecure,
1737 display, dispSurface, producer,
1738 mRenderEngine->getEGLConfig());
1739 hw->setLayerStack(state.layerStack);
1740 hw->setProjection(state.orientation,
1741 state.viewport, state.frame);
1742 hw->setDisplayName(state.displayName);
1743 mDisplays.add(display, hw);
1744 if (state.isVirtualDisplay()) {
1745 if (hwcDisplayId >= 0) {
1746 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1747 hw->getWidth(), hw->getHeight(),
1748 hw->getFormat());
1749 }
1750 } else {
1751 mEventThread->onHotplugReceived(state.type, true);
1752 }
1753 }
1754 }
1755 }
1756 }
1757 }
1758
1759 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1760 // The transform hint might have changed for some layers
1761 // (either because a display has changed, or because a layer
1762 // as changed).
1763 //
1764 // Walk through all the layers in currentLayers,
1765 // and update their transform hint.
1766 //
1767 // If a layer is visible only on a single display, then that
1768 // display is used to calculate the hint, otherwise we use the
1769 // default display.
1770 //
1771 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1772 // the hint is set before we acquire a buffer from the surface texture.
1773 //
1774 // NOTE: layer transactions have taken place already, so we use their
1775 // drawing state. However, SurfaceFlinger's own transaction has not
1776 // happened yet, so we must use the current state layer list
1777 // (soon to become the drawing state list).
1778 //
1779 sp<const DisplayDevice> disp;
1780 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001781 bool first = true;
1782 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001783 // NOTE: we rely on the fact that layers are sorted by
1784 // layerStack first (so we don't have to traverse the list
1785 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001786 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001787 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001788 currentlayerStack = layerStack;
1789 // figure out if this layerstack is mirrored
1790 // (more than one display) if so, pick the default display,
1791 // if not, pick the only display it's on.
1792 disp.clear();
1793 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1794 sp<const DisplayDevice> hw(mDisplays[dpy]);
1795 if (hw->getLayerStack() == currentlayerStack) {
1796 if (disp == NULL) {
1797 disp = hw;
1798 } else {
1799 disp = NULL;
1800 break;
1801 }
1802 }
1803 }
1804 }
1805 if (disp == NULL) {
1806 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1807 // redraw after transform hint changes. See bug 8508397.
1808
1809 // could be null when this layer is using a layerStack
1810 // that is not visible on any display. Also can occur at
1811 // screen off/on times.
1812 disp = getDefaultDisplayDevice();
1813 }
1814 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001815
1816 first = false;
1817 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001818 }
1819
1820
1821 /*
1822 * Perform our own transaction if needed
1823 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001824
1825 if (mLayersAdded) {
1826 mLayersAdded = false;
1827 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001828 mVisibleRegionsDirty = true;
1829 }
1830
1831 // some layers might have been removed, so
1832 // we need to update the regions they're exposing.
1833 if (mLayersRemoved) {
1834 mLayersRemoved = false;
1835 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001836 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001837 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001838 // this layer is not visible anymore
1839 // TODO: we could traverse the tree from front to back and
1840 // compute the actual visible region
1841 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001842 Region visibleReg;
1843 visibleReg.set(layer->computeScreenBounds());
1844 invalidateLayerStack(layer->getLayerStack(), visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001845 }
Robert Carr2047fae2016-11-28 14:09:09 -08001846 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001847 }
1848
1849 commitTransaction();
1850
1851 updateCursorAsync();
1852}
1853
1854void SurfaceFlinger::updateCursorAsync()
1855{
1856 HWComposer& hwc(getHwComposer());
1857 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1858 sp<const DisplayDevice> hw(mDisplays[dpy]);
1859 const int32_t id = hw->getHwcDisplayId();
1860 if (id < 0) {
1861 continue;
1862 }
1863 const Vector< sp<Layer> >& currentLayers(
1864 hw->getVisibleLayersSortedByZ());
1865 const size_t count = currentLayers.size();
1866 HWComposer::LayerListIterator cur = hwc.begin(id);
1867 const HWComposer::LayerListIterator end = hwc.end(id);
1868 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1869 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1870 continue;
1871 }
1872 const sp<Layer>& layer(currentLayers[i]);
1873 Rect cursorPos = layer->getPosition(hw);
1874 hwc.setCursorPositionAsync(id, cursorPos);
1875 break;
1876 }
1877 }
1878}
1879
1880void SurfaceFlinger::commitTransaction()
1881{
1882 if (!mLayersPendingRemoval.isEmpty()) {
1883 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001884 for (const auto& l : mLayersPendingRemoval) {
1885 recordBufferingStats(l->getName().string(),
1886 l->getOccupancyHistory(true));
1887 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001888 }
1889 mLayersPendingRemoval.clear();
1890 }
1891
1892 // If this transaction is part of a window animation then the next frame
1893 // we composite should be considered an animation as well.
1894 mAnimCompositionPending = mAnimTransactionPending;
1895
1896 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001897 mDrawingState.traverseInZOrder([](Layer* layer) {
1898 layer->commitChildList();
1899 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001900 mTransactionPending = false;
1901 mAnimTransactionPending = false;
1902 mTransactionCV.broadcast();
1903}
1904
Robert Carr2047fae2016-11-28 14:09:09 -08001905void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001906 Region& outDirtyRegion, Region& outOpaqueRegion)
1907{
1908 ATRACE_CALL();
1909
1910 Region aboveOpaqueLayers;
1911 Region aboveCoveredLayers;
1912 Region dirty;
1913
1914 outDirtyRegion.clear();
1915
Robert Carr2047fae2016-11-28 14:09:09 -08001916 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001917 // start with the whole surface at its current location
1918 const Layer::State& s(layer->getDrawingState());
1919
1920 // only consider the layers on the given layer stack
Robert Carr1f0a16a2016-10-24 16:27:39 -07001921 if (layer->getLayerStack() != layerStack)
Robert Carr2047fae2016-11-28 14:09:09 -08001922 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001923
1924 /*
1925 * opaqueRegion: area of a surface that is fully opaque.
1926 */
1927 Region opaqueRegion;
1928
1929 /*
1930 * visibleRegion: area of a surface that is visible on screen
1931 * and not fully transparent. This is essentially the layer's
1932 * footprint minus the opaque regions above it.
1933 * Areas covered by a translucent surface are considered visible.
1934 */
1935 Region visibleRegion;
1936
1937 /*
1938 * coveredRegion: area of a surface that is covered by all
1939 * visible regions above it (which includes the translucent areas).
1940 */
1941 Region coveredRegion;
1942
1943 /*
1944 * transparentRegion: area of a surface that is hinted to be completely
1945 * transparent. This is only used to tell when the layer has no visible
1946 * non-transparent regions and can be removed from the layer list. It
1947 * does not affect the visibleRegion of this layer or any layers
1948 * beneath it. The hint may not be correct if apps don't respect the
1949 * SurfaceView restrictions (which, sadly, some don't).
1950 */
1951 Region transparentRegion;
1952
1953
1954 // handle hidden surfaces by setting the visible region to empty
1955 if (CC_LIKELY(layer->isVisible())) {
1956 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001957 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001958 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001959 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001960 if (!visibleRegion.isEmpty()) {
1961 // Remove the transparent area from the visible region
1962 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001963 if (tr.preserveRects()) {
1964 // transform the transparent region
1965 transparentRegion = tr.transform(s.activeTransparentRegion);
1966 } else {
1967 // transformation too complex, can't do the
1968 // transparent region optimization.
1969 transparentRegion.clear();
1970 }
1971 }
1972
1973 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001974 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001975 if (s.alpha==255 && !translucent &&
1976 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1977 // the opaque region is the layer's footprint
1978 opaqueRegion = visibleRegion;
1979 }
1980 }
1981 }
1982
1983 // Clip the covered region to the visible region
1984 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1985
1986 // Update aboveCoveredLayers for next (lower) layer
1987 aboveCoveredLayers.orSelf(visibleRegion);
1988
1989 // subtract the opaque region covered by the layers above us
1990 visibleRegion.subtractSelf(aboveOpaqueLayers);
1991
1992 // compute this layer's dirty region
1993 if (layer->contentDirty) {
1994 // we need to invalidate the whole region
1995 dirty = visibleRegion;
1996 // as well, as the old visible region
1997 dirty.orSelf(layer->visibleRegion);
1998 layer->contentDirty = false;
1999 } else {
2000 /* compute the exposed region:
2001 * the exposed region consists of two components:
2002 * 1) what's VISIBLE now and was COVERED before
2003 * 2) what's EXPOSED now less what was EXPOSED before
2004 *
2005 * note that (1) is conservative, we start with the whole
2006 * visible region but only keep what used to be covered by
2007 * something -- which mean it may have been exposed.
2008 *
2009 * (2) handles areas that were not covered by anything but got
2010 * exposed because of a resize.
2011 */
2012 const Region newExposed = visibleRegion - coveredRegion;
2013 const Region oldVisibleRegion = layer->visibleRegion;
2014 const Region oldCoveredRegion = layer->coveredRegion;
2015 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2016 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2017 }
2018 dirty.subtractSelf(aboveOpaqueLayers);
2019
2020 // accumulate to the screen dirty region
2021 outDirtyRegion.orSelf(dirty);
2022
2023 // Update aboveOpaqueLayers for next (lower) layer
2024 aboveOpaqueLayers.orSelf(opaqueRegion);
2025
2026 // Store the visible region in screen space
2027 layer->setVisibleRegion(visibleRegion);
2028 layer->setCoveredRegion(coveredRegion);
2029 layer->setVisibleNonTransparentRegion(
2030 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002031 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002032
2033 outOpaqueRegion = aboveOpaqueLayers;
2034}
2035
2036void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2037 const Region& dirty) {
2038 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2039 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2040 if (hw->getLayerStack() == layerStack) {
2041 hw->dirtyRegion.orSelf(dirty);
2042 }
2043 }
2044}
2045
2046bool SurfaceFlinger::handlePageFlip()
2047{
Brian Andersond6927fb2016-07-23 23:37:30 -07002048 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002049 Region dirtyRegion;
2050
2051 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002052 bool frameQueued = false;
2053
2054 // Store the set of layers that need updates. This set must not change as
2055 // buffers are being latched, as this could result in a deadlock.
2056 // Example: Two producers share the same command stream and:
2057 // 1.) Layer 0 is latched
2058 // 2.) Layer 0 gets a new frame
2059 // 2.) Layer 1 gets a new frame
2060 // 3.) Layer 1 is latched.
2061 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2062 // second frame. But layer 0's second frame could be waiting on display.
2063 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002064 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002065 if (layer->hasQueuedFrame()) {
2066 frameQueued = true;
2067 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002068 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002069 } else {
2070 layer->useEmptyDamage();
2071 }
2072 } else {
2073 layer->useEmptyDamage();
2074 }
Robert Carr2047fae2016-11-28 14:09:09 -08002075 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002076 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2077 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002078 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002079 layer->useSurfaceDamage();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002080 invalidateLayerStack(layer->getLayerStack(), dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002081 }
2082
2083 mVisibleRegionsDirty |= visibleRegions;
2084
2085 // If we will need to wake up at some time in the future to deal with a
2086 // queued frame that shouldn't be displayed during this vsync period, wake
2087 // up during the next vsync period to check again.
2088 if (frameQueued && layersWithQueuedFrames.empty()) {
2089 signalLayerUpdate();
2090 }
2091
2092 // Only continue with the refresh if there is actually new work to do
2093 return !layersWithQueuedFrames.empty();
2094}
2095
2096void SurfaceFlinger::invalidateHwcGeometry()
2097{
2098 mHwWorkListDirty = true;
2099}
2100
2101
2102void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2103 const Region& inDirtyRegion)
2104{
2105 // We only need to actually compose the display if:
2106 // 1) It is being handled by hardware composer, which may need this to
2107 // keep its virtual display state machine in sync, or
2108 // 2) There is work to be done (the dirty region isn't empty)
2109 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2110 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2111 return;
2112 }
2113
2114 Region dirtyRegion(inDirtyRegion);
2115
2116 // compute the invalid region
2117 hw->swapRegion.orSelf(dirtyRegion);
2118
2119 uint32_t flags = hw->getFlags();
2120 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2121 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2122 // takes a rectangle, we must make sure to update that whole
2123 // rectangle in that case
2124 dirtyRegion.set(hw->swapRegion.bounds());
2125 } else {
2126 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2127 // We need to redraw the rectangle that will be updated
2128 // (pushed to the framebuffer).
2129 // This is needed because PARTIAL_UPDATES only takes one
2130 // rectangle instead of a region (see DisplayDevice::flip())
2131 dirtyRegion.set(hw->swapRegion.bounds());
2132 } else {
2133 // we need to redraw everything (the whole screen)
2134 dirtyRegion.set(hw->bounds());
2135 hw->swapRegion = dirtyRegion;
2136 }
2137 }
2138
2139 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2140 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2141 } else {
2142 RenderEngine& engine(getRenderEngine());
2143 mat4 colorMatrix = mColorMatrix;
2144 if (mDaltonize) {
2145 colorMatrix = colorMatrix * mDaltonizer();
2146 }
2147 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2148 doComposeSurfaces(hw, dirtyRegion);
2149 engine.setupColorTransform(oldMatrix);
2150 }
2151
2152 // update the swap region and clear the dirty region
2153 hw->swapRegion.orSelf(dirtyRegion);
2154
2155 // swap buffers (presentation)
2156 hw->swapBuffers(getHwComposer());
2157}
2158
2159bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2160{
2161 RenderEngine& engine(getRenderEngine());
2162 const int32_t id = hw->getHwcDisplayId();
2163 HWComposer& hwc(getHwComposer());
2164 HWComposer::LayerListIterator cur = hwc.begin(id);
2165 const HWComposer::LayerListIterator end = hwc.end(id);
2166
2167 bool hasGlesComposition = hwc.hasGlesComposition(id);
2168 if (hasGlesComposition) {
2169 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2170 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2171 hw->getDisplayName().string());
2172 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2173 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2174 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2175 }
2176 return false;
2177 }
2178
2179 // Never touch the framebuffer if we don't have any framebuffer layers
2180 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2181 if (hasHwcComposition) {
2182 // when using overlays, we assume a fully transparent framebuffer
2183 // NOTE: we could reduce how much we need to clear, for instance
2184 // remove where there are opaque FB layers. however, on some
2185 // GPUs doing a "clean slate" clear might be more efficient.
2186 // We'll revisit later if needed.
2187 engine.clearWithColor(0, 0, 0, 0);
2188 } else {
2189 // we start with the whole screen area
2190 const Region bounds(hw->getBounds());
2191
2192 // we remove the scissor part
2193 // we're left with the letterbox region
2194 // (common case is that letterbox ends-up being empty)
2195 const Region letterbox(bounds.subtract(hw->getScissor()));
2196
2197 // compute the area to clear
2198 Region region(hw->undefinedRegion.merge(letterbox));
2199
2200 // but limit it to the dirty region
2201 region.andSelf(dirty);
2202
2203 // screen is already cleared here
2204 if (!region.isEmpty()) {
2205 // can happen with SurfaceView
2206 drawWormhole(hw, region);
2207 }
2208 }
2209
2210 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2211 // just to be on the safe side, we don't set the
2212 // scissor on the main display. It should never be needed
2213 // anyways (though in theory it could since the API allows it).
2214 const Rect& bounds(hw->getBounds());
2215 const Rect& scissor(hw->getScissor());
2216 if (scissor != bounds) {
2217 // scissor doesn't match the screen's dimensions, so we
2218 // need to clear everything outside of it and enable
2219 // the GL scissor so we don't draw anything where we shouldn't
2220
2221 // enable scissor for this frame
2222 const uint32_t height = hw->getHeight();
2223 engine.setScissor(scissor.left, height - scissor.bottom,
2224 scissor.getWidth(), scissor.getHeight());
2225 }
2226 }
2227 }
2228
2229 /*
2230 * and then, render the layers targeted at the framebuffer
2231 */
2232
2233 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2234 const size_t count = layers.size();
2235 const Transform& tr = hw->getTransform();
2236 if (cur != end) {
2237 // we're using h/w composer
2238 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2239 const sp<Layer>& layer(layers[i]);
2240 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2241 if (!clip.isEmpty()) {
2242 switch (cur->getCompositionType()) {
2243 case HWC_CURSOR_OVERLAY:
2244 case HWC_OVERLAY: {
2245 const Layer::State& state(layer->getDrawingState());
2246 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2247 && i
2248 && layer->isOpaque(state) && (state.alpha == 0xFF)
2249 && hasGlesComposition) {
2250 // never clear the very first layer since we're
2251 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002252 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002253 }
2254 break;
2255 }
2256 case HWC_FRAMEBUFFER: {
2257 layer->draw(hw, clip);
2258 break;
2259 }
2260 case HWC_FRAMEBUFFER_TARGET: {
2261 // this should not happen as the iterator shouldn't
2262 // let us get there.
2263 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2264 break;
2265 }
2266 }
2267 }
2268 layer->setAcquireFence(hw, *cur);
2269 }
2270 } else {
2271 // we're not using h/w composer
2272 for (size_t i=0 ; i<count ; ++i) {
2273 const sp<Layer>& layer(layers[i]);
2274 const Region clip(dirty.intersect(
2275 tr.transform(layer->visibleRegion)));
2276 if (!clip.isEmpty()) {
2277 layer->draw(hw, clip);
2278 }
2279 }
2280 }
2281
2282 // disable scissor at the end of the frame
2283 engine.disableScissor();
2284 return true;
2285}
2286
2287void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2288 const int32_t height = hw->getHeight();
2289 RenderEngine& engine(getRenderEngine());
2290 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2291}
2292
2293status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2294 const sp<IBinder>& handle,
2295 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002296 const sp<Layer>& lbc,
2297 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002298{
2299 // add this layer to the current state list
2300 {
2301 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002302 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002303 return NO_MEMORY;
2304 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002305 if (parent == nullptr) {
2306 mCurrentState.layersSortedByZ.add(lbc);
2307 } else {
2308 parent->addChild(lbc);
2309 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002310 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002311 mLayersAdded = true;
2312 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002313 }
2314
2315 // attach this layer to the client
2316 client->attachLayer(handle, lbc);
2317
2318 return NO_ERROR;
2319}
2320
Robert Carr9524cb32017-02-13 11:32:32 -08002321status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002322 Mutex::Autolock _l(mStateLock);
2323
Robert Carr1f0a16a2016-10-24 16:27:39 -07002324 const auto& p = layer->getParent();
2325 const ssize_t index = (p != nullptr) ? p->removeChild(layer) :
2326 mCurrentState.layersSortedByZ.remove(layer);
2327
Robert Carr136e2f62017-02-08 17:54:29 -08002328 // As a matter of normal operation, the LayerCleaner will produce a second
2329 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2330 // so we will succeed in promoting it, but it's already been removed
2331 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2332 // otherwise something has gone wrong and we are leaking the layer.
2333 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002334 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2335 layer->getName().string(),
2336 (p != nullptr) ? p->getName().string() : "no-parent");
2337 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002338 } else if (index < 0) {
2339 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002340 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002341
2342 mLayersPendingRemoval.add(layer);
2343 mLayersRemoved = true;
2344 mNumLayers--;
2345 setTransactionFlags(eTransactionNeeded);
2346 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002347}
2348
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002349uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002350 return android_atomic_release_load(&mTransactionFlags);
2351}
2352
2353uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2354 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2355}
2356
2357uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2358 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2359 if ((old & flags)==0) { // wake the server up
2360 signalTransaction();
2361 }
2362 return old;
2363}
2364
2365void SurfaceFlinger::setTransactionState(
2366 const Vector<ComposerState>& state,
2367 const Vector<DisplayState>& displays,
2368 uint32_t flags)
2369{
2370 ATRACE_CALL();
2371 Mutex::Autolock _l(mStateLock);
2372 uint32_t transactionFlags = 0;
2373
2374 if (flags & eAnimation) {
2375 // For window updates that are part of an animation we must wait for
2376 // previous animation "frames" to be handled.
2377 while (mAnimTransactionPending) {
2378 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2379 if (CC_UNLIKELY(err != NO_ERROR)) {
2380 // just in case something goes wrong in SF, return to the
2381 // caller after a few seconds.
2382 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2383 "waiting for previous animation frame");
2384 mAnimTransactionPending = false;
2385 break;
2386 }
2387 }
2388 }
2389
2390 size_t count = displays.size();
2391 for (size_t i=0 ; i<count ; i++) {
2392 const DisplayState& s(displays[i]);
2393 transactionFlags |= setDisplayStateLocked(s);
2394 }
2395
2396 count = state.size();
2397 for (size_t i=0 ; i<count ; i++) {
2398 const ComposerState& s(state[i]);
2399 // Here we need to check that the interface we're given is indeed
2400 // one of our own. A malicious client could give us a NULL
2401 // IInterface, or one of its own or even one of our own but a
2402 // different type. All these situations would cause us to crash.
2403 //
2404 // NOTE: it would be better to use RTTI as we could directly check
2405 // that we have a Client*. however, RTTI is disabled in Android.
2406 if (s.client != NULL) {
2407 sp<IBinder> binder = IInterface::asBinder(s.client);
2408 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002409 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002410 sp<Client> client( static_cast<Client *>(s.client.get()) );
2411 transactionFlags |= setClientStateLocked(client, s.state);
2412 }
2413 }
2414 }
2415 }
2416
2417 // If a synchronous transaction is explicitly requested without any changes,
2418 // force a transaction anyway. This can be used as a flush mechanism for
2419 // previous async transactions.
2420 if (transactionFlags == 0 && (flags & eSynchronous)) {
2421 transactionFlags = eTransactionNeeded;
2422 }
2423
2424 if (transactionFlags) {
2425 if (mInterceptor.isEnabled()) {
2426 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2427 }
2428
2429 // this triggers the transaction
2430 setTransactionFlags(transactionFlags);
2431
2432 // if this is a synchronous transaction, wait for it to take effect
2433 // before returning.
2434 if (flags & eSynchronous) {
2435 mTransactionPending = true;
2436 }
2437 if (flags & eAnimation) {
2438 mAnimTransactionPending = true;
2439 }
2440 while (mTransactionPending) {
2441 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2442 if (CC_UNLIKELY(err != NO_ERROR)) {
2443 // just in case something goes wrong in SF, return to the
2444 // called after a few seconds.
2445 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2446 mTransactionPending = false;
2447 break;
2448 }
2449 }
2450 }
2451}
2452
2453uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2454{
2455 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2456 if (dpyIdx < 0)
2457 return 0;
2458
2459 uint32_t flags = 0;
2460 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2461 if (disp.isValid()) {
2462 const uint32_t what = s.what;
2463 if (what & DisplayState::eSurfaceChanged) {
2464 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2465 disp.surface = s.surface;
2466 flags |= eDisplayTransactionNeeded;
2467 }
2468 }
2469 if (what & DisplayState::eLayerStackChanged) {
2470 if (disp.layerStack != s.layerStack) {
2471 disp.layerStack = s.layerStack;
2472 flags |= eDisplayTransactionNeeded;
2473 }
2474 }
2475 if (what & DisplayState::eDisplayProjectionChanged) {
2476 if (disp.orientation != s.orientation) {
2477 disp.orientation = s.orientation;
2478 flags |= eDisplayTransactionNeeded;
2479 }
2480 if (disp.frame != s.frame) {
2481 disp.frame = s.frame;
2482 flags |= eDisplayTransactionNeeded;
2483 }
2484 if (disp.viewport != s.viewport) {
2485 disp.viewport = s.viewport;
2486 flags |= eDisplayTransactionNeeded;
2487 }
2488 }
2489 if (what & DisplayState::eDisplaySizeChanged) {
2490 if (disp.width != s.width) {
2491 disp.width = s.width;
2492 flags |= eDisplayTransactionNeeded;
2493 }
2494 if (disp.height != s.height) {
2495 disp.height = s.height;
2496 flags |= eDisplayTransactionNeeded;
2497 }
2498 }
2499 }
2500 return flags;
2501}
2502
2503uint32_t SurfaceFlinger::setClientStateLocked(
2504 const sp<Client>& client,
2505 const layer_state_t& s)
2506{
2507 uint32_t flags = 0;
2508 sp<Layer> layer(client->getLayerUser(s.surface));
2509 if (layer != 0) {
2510 const uint32_t what = s.what;
2511 bool geometryAppliesWithResize =
2512 what & layer_state_t::eGeometryAppliesWithResize;
2513 if (what & layer_state_t::ePositionChanged) {
2514 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2515 flags |= eTraversalNeeded;
2516 }
2517 }
2518 if (what & layer_state_t::eLayerChanged) {
2519 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002520 const auto& p = layer->getParent();
2521 if (p == nullptr) {
2522 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2523 if (layer->setLayer(s.z) && idx >= 0) {
2524 mCurrentState.layersSortedByZ.removeAt(idx);
2525 mCurrentState.layersSortedByZ.add(layer);
2526 // we need traversal (state changed)
2527 // AND transaction (list changed)
2528 flags |= eTransactionNeeded|eTraversalNeeded;
2529 }
2530 } else {
2531 if (p->setChildLayer(layer, s.z)) {
2532 flags |= eTransactionNeeded|eTraversalNeeded;
2533 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002534 }
2535 }
2536 if (what & layer_state_t::eSizeChanged) {
2537 if (layer->setSize(s.w, s.h)) {
2538 flags |= eTraversalNeeded;
2539 }
2540 }
2541 if (what & layer_state_t::eAlphaChanged) {
2542 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2543 flags |= eTraversalNeeded;
2544 }
2545 if (what & layer_state_t::eMatrixChanged) {
2546 if (layer->setMatrix(s.matrix))
2547 flags |= eTraversalNeeded;
2548 }
2549 if (what & layer_state_t::eTransparentRegionChanged) {
2550 if (layer->setTransparentRegionHint(s.transparentRegion))
2551 flags |= eTraversalNeeded;
2552 }
2553 if (what & layer_state_t::eFlagsChanged) {
2554 if (layer->setFlags(s.flags, s.mask))
2555 flags |= eTraversalNeeded;
2556 }
2557 if (what & layer_state_t::eCropChanged) {
2558 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2559 flags |= eTraversalNeeded;
2560 }
2561 if (what & layer_state_t::eFinalCropChanged) {
2562 if (layer->setFinalCrop(s.finalCrop))
2563 flags |= eTraversalNeeded;
2564 }
2565 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002566 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002567 // We only allow setting layer stacks for top level layers,
2568 // everything else inherits layer stack from its parent.
2569 if (layer->hasParent()) {
2570 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2571 layer->getName().string());
2572 } else if (idx < 0) {
2573 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2574 "that also does not appear in the top level layer list. Something"
2575 " has gone wrong.", layer->getName().string());
2576 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002577 mCurrentState.layersSortedByZ.removeAt(idx);
2578 mCurrentState.layersSortedByZ.add(layer);
2579 // we need traversal (state changed)
2580 // AND transaction (list changed)
2581 flags |= eTransactionNeeded|eTraversalNeeded;
2582 }
2583 }
2584 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002585 if (s.barrierHandle != nullptr) {
2586 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2587 } else if (s.barrierGbp != nullptr) {
2588 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2589 if (authenticateSurfaceTextureLocked(gbp)) {
2590 const auto& otherLayer =
2591 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2592 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2593 } else {
2594 ALOGE("Attempt to defer transaction to to an"
2595 " unrecognized GraphicBufferProducer");
2596 }
2597 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002598 // We don't trigger a traversal here because if no other state is
2599 // changed, we don't want this to cause any more work
2600 }
Robert Carr1db73f62016-12-21 12:58:51 -08002601 if (what & layer_state_t::eReparentChildren) {
2602 if (layer->reparentChildren(s.reparentHandle)) {
2603 flags |= eTransactionNeeded|eTraversalNeeded;
2604 }
2605 }
Robert Carr9524cb32017-02-13 11:32:32 -08002606 if (what & layer_state_t::eDetachChildren) {
2607 layer->detachChildren();
2608 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002609 if (what & layer_state_t::eOverrideScalingModeChanged) {
2610 layer->setOverrideScalingMode(s.overrideScalingMode);
2611 // We don't trigger a traversal here because if no other state is
2612 // changed, we don't want this to cause any more work
2613 }
2614 }
2615 return flags;
2616}
2617
2618status_t SurfaceFlinger::createLayer(
2619 const String8& name,
2620 const sp<Client>& client,
2621 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002622 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2623 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002624{
2625 if (int32_t(w|h) < 0) {
2626 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2627 int(w), int(h));
2628 return BAD_VALUE;
2629 }
2630
2631 status_t result = NO_ERROR;
2632
2633 sp<Layer> layer;
2634
2635 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2636 case ISurfaceComposerClient::eFXSurfaceNormal:
2637 result = createNormalLayer(client,
2638 name, w, h, flags, format,
2639 handle, gbp, &layer);
2640 break;
2641 case ISurfaceComposerClient::eFXSurfaceDim:
2642 result = createDimLayer(client,
2643 name, w, h, flags,
2644 handle, gbp, &layer);
2645 break;
2646 default:
2647 result = BAD_VALUE;
2648 break;
2649 }
2650
2651 if (result != NO_ERROR) {
2652 return result;
2653 }
2654
Albert Chaulk479c60c2017-01-27 14:21:34 -05002655 layer->setInfo(windowType, ownerUid);
2656
Robert Carr1f0a16a2016-10-24 16:27:39 -07002657 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002658 if (result != NO_ERROR) {
2659 return result;
2660 }
2661 mInterceptor.saveSurfaceCreation(layer);
2662
2663 setTransactionFlags(eTransactionNeeded);
2664 return result;
2665}
2666
2667status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2668 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2669 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2670{
2671 // initialize the surfaces
2672 switch (format) {
2673 case PIXEL_FORMAT_TRANSPARENT:
2674 case PIXEL_FORMAT_TRANSLUCENT:
2675 format = PIXEL_FORMAT_RGBA_8888;
2676 break;
2677 case PIXEL_FORMAT_OPAQUE:
2678 format = PIXEL_FORMAT_RGBX_8888;
2679 break;
2680 }
2681
2682 *outLayer = new Layer(this, client, name, w, h, flags);
2683 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2684 if (err == NO_ERROR) {
2685 *handle = (*outLayer)->getHandle();
2686 *gbp = (*outLayer)->getProducer();
2687 }
2688
2689 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2690 return err;
2691}
2692
2693status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2694 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2695 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2696{
2697 *outLayer = new LayerDim(this, client, name, w, h, flags);
2698 *handle = (*outLayer)->getHandle();
2699 *gbp = (*outLayer)->getProducer();
2700 return NO_ERROR;
2701}
2702
2703status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2704{
Robert Carr9524cb32017-02-13 11:32:32 -08002705 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002706 status_t err = NO_ERROR;
2707 sp<Layer> l(client->getLayerUser(handle));
2708 if (l != NULL) {
2709 mInterceptor.saveSurfaceDeletion(l);
2710 err = removeLayer(l);
2711 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2712 "error removing layer=%p (%s)", l.get(), strerror(-err));
2713 }
2714 return err;
2715}
2716
2717status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2718{
2719 // called by ~LayerCleaner() when all references to the IBinder (handle)
2720 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002721 sp<Layer> l = layer.promote();
2722 if (l == nullptr) {
2723 // The layer has already been removed, carry on
2724 return NO_ERROR;
2725 } if (l->getParent() != nullptr) {
2726 // If we have a parent, then we can continue to live as long as it does.
2727 return NO_ERROR;
2728 }
2729 return removeLayer(l);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002730}
2731
2732// ---------------------------------------------------------------------------
2733
2734void SurfaceFlinger::onInitializeDisplays() {
2735 // reset screen orientation and use primary layer stack
2736 Vector<ComposerState> state;
2737 Vector<DisplayState> displays;
2738 DisplayState d;
2739 d.what = DisplayState::eDisplayProjectionChanged |
2740 DisplayState::eLayerStackChanged;
2741 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2742 d.layerStack = 0;
2743 d.orientation = DisplayState::eOrientationDefault;
2744 d.frame.makeInvalid();
2745 d.viewport.makeInvalid();
2746 d.width = 0;
2747 d.height = 0;
2748 displays.add(d);
2749 setTransactionState(state, displays, 0);
2750 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2751
2752 const nsecs_t period =
2753 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2754 mAnimFrameTracker.setDisplayRefreshPeriod(period);
Brian Andersond0010582017-03-07 13:20:31 -08002755
2756 // Use phase of 0 since phase is not known.
2757 // Use latency of 0, which will snap to the ideal latency.
2758 setCompositorTimingSnapped(0, period, 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002759}
2760
2761void SurfaceFlinger::initializeDisplays() {
2762 class MessageScreenInitialized : public MessageBase {
2763 SurfaceFlinger* flinger;
2764 public:
2765 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2766 virtual bool handler() {
2767 flinger->onInitializeDisplays();
2768 return true;
2769 }
2770 };
2771 sp<MessageBase> msg = new MessageScreenInitialized(this);
2772 postMessageAsync(msg); // we may be called from main thread, use async message
2773}
2774
2775void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2776 int mode) {
2777 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2778 this);
2779 int32_t type = hw->getDisplayType();
2780 int currentMode = hw->getPowerMode();
2781
2782 if (mode == currentMode) {
2783 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2784 return;
2785 }
2786
2787 hw->setPowerMode(mode);
2788 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2789 ALOGW("Trying to set power mode for virtual display");
2790 return;
2791 }
2792
2793 if (mInterceptor.isEnabled()) {
2794 Mutex::Autolock _l(mStateLock);
2795 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2796 if (idx < 0) {
2797 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2798 return;
2799 }
2800 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2801 }
2802
2803 if (currentMode == HWC_POWER_MODE_OFF) {
2804 // Turn on the display
2805 getHwComposer().setPowerMode(type, mode);
2806 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2807 // FIXME: eventthread only knows about the main display right now
2808 mEventThread->onScreenAcquired();
2809 resyncToHardwareVsync(true);
2810 }
2811
2812 mVisibleRegionsDirty = true;
2813 mHasPoweredOff = true;
2814 repaintEverything();
2815
2816 struct sched_param param = {0};
2817 param.sched_priority = 1;
2818 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2819 ALOGW("Couldn't set SCHED_FIFO on display on");
2820 }
2821 } else if (mode == HWC_POWER_MODE_OFF) {
2822 // Turn off the display
2823 struct sched_param param = {0};
2824 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2825 ALOGW("Couldn't set SCHED_OTHER on display off");
2826 }
2827
2828 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2829 disableHardwareVsync(true); // also cancels any in-progress resync
2830
2831 // FIXME: eventthread only knows about the main display right now
2832 mEventThread->onScreenReleased();
2833 }
2834
2835 getHwComposer().setPowerMode(type, mode);
2836 mVisibleRegionsDirty = true;
2837 // from this point on, SF will stop drawing on this display
2838 } else {
2839 getHwComposer().setPowerMode(type, mode);
2840 }
2841}
2842
2843void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2844 class MessageSetPowerMode: public MessageBase {
2845 SurfaceFlinger& mFlinger;
2846 sp<IBinder> mDisplay;
2847 int mMode;
2848 public:
2849 MessageSetPowerMode(SurfaceFlinger& flinger,
2850 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2851 mDisplay(disp) { mMode = mode; }
2852 virtual bool handler() {
2853 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2854 if (hw == NULL) {
2855 ALOGE("Attempt to set power mode = %d for null display %p",
2856 mMode, mDisplay.get());
2857 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2858 ALOGW("Attempt to set power mode = %d for virtual display",
2859 mMode);
2860 } else {
2861 mFlinger.setPowerModeInternal(hw, mMode);
2862 }
2863 return true;
2864 }
2865 };
2866 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2867 postMessageSync(msg);
2868}
2869
2870// ---------------------------------------------------------------------------
2871
2872status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2873{
2874 String8 result;
2875
2876 IPCThreadState* ipc = IPCThreadState::self();
2877 const int pid = ipc->getCallingPid();
2878 const int uid = ipc->getCallingUid();
2879 if ((uid != AID_SHELL) &&
2880 !PermissionCache::checkPermission(sDump, pid, uid)) {
2881 result.appendFormat("Permission Denial: "
2882 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2883 } else {
2884 // Try to get the main lock, but give up after one second
2885 // (this would indicate SF is stuck, but we want to be able to
2886 // print something in dumpsys).
2887 status_t err = mStateLock.timedLock(s2ns(1));
2888 bool locked = (err == NO_ERROR);
2889 if (!locked) {
2890 result.appendFormat(
2891 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2892 "dumping anyways (no locks held)\n", strerror(-err), err);
2893 }
2894
2895 bool dumpAll = true;
2896 size_t index = 0;
2897 size_t numArgs = args.size();
2898 if (numArgs) {
2899 if ((index < numArgs) &&
2900 (args[index] == String16("--list"))) {
2901 index++;
2902 listLayersLocked(args, index, result);
2903 dumpAll = false;
2904 }
2905
2906 if ((index < numArgs) &&
2907 (args[index] == String16("--latency"))) {
2908 index++;
2909 dumpStatsLocked(args, index, result);
2910 dumpAll = false;
2911 }
2912
2913 if ((index < numArgs) &&
2914 (args[index] == String16("--latency-clear"))) {
2915 index++;
2916 clearStatsLocked(args, index, result);
2917 dumpAll = false;
2918 }
2919
2920 if ((index < numArgs) &&
2921 (args[index] == String16("--dispsync"))) {
2922 index++;
2923 mPrimaryDispSync.dump(result);
2924 dumpAll = false;
2925 }
2926
2927 if ((index < numArgs) &&
2928 (args[index] == String16("--static-screen"))) {
2929 index++;
2930 dumpStaticScreenStats(result);
2931 dumpAll = false;
2932 }
2933
2934 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07002935 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002936 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07002937 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002938 dumpAll = false;
2939 }
2940 }
2941
2942 if (dumpAll) {
2943 dumpAllLocked(args, index, result);
2944 }
2945
2946 if (locked) {
2947 mStateLock.unlock();
2948 }
2949 }
2950 write(fd, result.string(), result.size());
2951 return NO_ERROR;
2952}
2953
2954void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2955 size_t& /* index */, String8& result) const
2956{
Robert Carr2047fae2016-11-28 14:09:09 -08002957 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002958 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08002959 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002960}
2961
2962void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2963 String8& result) const
2964{
2965 String8 name;
2966 if (index < args.size()) {
2967 name = String8(args[index]);
2968 index++;
2969 }
2970
2971 const nsecs_t period =
2972 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2973 result.appendFormat("%" PRId64 "\n", period);
2974
2975 if (name.isEmpty()) {
2976 mAnimFrameTracker.dumpStats(result);
2977 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08002978 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002979 if (name == layer->getName()) {
2980 layer->dumpFrameStats(result);
2981 }
Robert Carr2047fae2016-11-28 14:09:09 -08002982 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002983 }
2984}
2985
2986void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
2987 String8& /* result */)
2988{
2989 String8 name;
2990 if (index < args.size()) {
2991 name = String8(args[index]);
2992 index++;
2993 }
2994
Robert Carr2047fae2016-11-28 14:09:09 -08002995 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002996 if (name.isEmpty() || (name == layer->getName())) {
2997 layer->clearFrameStats();
2998 }
Robert Carr2047fae2016-11-28 14:09:09 -08002999 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003000
3001 mAnimFrameTracker.clearStats();
3002}
3003
3004// This should only be called from the main thread. Otherwise it would need
3005// the lock and should use mCurrentState rather than mDrawingState.
3006void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003007 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003008 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003009 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003010
3011 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3012}
3013
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003014void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003015{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003016 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003017 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3018
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003019 if (isLayerTripleBufferingDisabled())
3020 result.append(" DISABLE_TRIPLE_BUFFERING");
3021 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003022}
3023
3024void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3025{
3026 result.appendFormat("Static screen stats:\n");
3027 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3028 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3029 float percent = 100.0f *
3030 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3031 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3032 b + 1, bucketTimeSec, percent);
3033 }
3034 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3035 float percent = 100.0f *
3036 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3037 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3038 NUM_BUCKETS - 1, bucketTimeSec, percent);
3039}
3040
Brian Andersond6927fb2016-07-23 23:37:30 -07003041void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3042 result.appendFormat("Layer frame timestamps:\n");
3043
3044 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3045 const size_t count = currentLayers.size();
3046 for (size_t i=0 ; i<count ; i++) {
3047 currentLayers[i]->dumpFrameEvents(result);
3048 }
3049}
3050
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003051void SurfaceFlinger::recordBufferingStats(const char* layerName,
3052 std::vector<OccupancyTracker::Segment>&& history) {
3053 Mutex::Autolock lock(mBufferingStatsMutex);
3054 auto& stats = mBufferingStats[layerName];
3055 for (const auto& segment : history) {
3056 if (!segment.usedThirdBuffer) {
3057 stats.twoBufferTime += segment.totalTime;
3058 }
3059 if (segment.occupancyAverage < 1.0f) {
3060 stats.doubleBufferedTime += segment.totalTime;
3061 } else if (segment.occupancyAverage < 2.0f) {
3062 stats.tripleBufferedTime += segment.totalTime;
3063 }
3064 ++stats.numSegments;
3065 stats.totalTime += segment.totalTime;
3066 }
3067}
3068
3069void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3070 result.append("Buffering stats:\n");
3071 result.append(" [Layer name] <Active time> <Two buffer> "
3072 "<Double buffered> <Triple buffered>\n");
3073 Mutex::Autolock lock(mBufferingStatsMutex);
3074 typedef std::tuple<std::string, float, float, float> BufferTuple;
3075 std::map<float, BufferTuple, std::greater<float>> sorted;
3076 for (const auto& statsPair : mBufferingStats) {
3077 const char* name = statsPair.first.c_str();
3078 const BufferingStats& stats = statsPair.second;
3079 if (stats.numSegments == 0) {
3080 continue;
3081 }
3082 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3083 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3084 stats.totalTime;
3085 float doubleBufferRatio = static_cast<float>(
3086 stats.doubleBufferedTime) / stats.totalTime;
3087 float tripleBufferRatio = static_cast<float>(
3088 stats.tripleBufferedTime) / stats.totalTime;
3089 sorted.insert({activeTime, {name, twoBufferRatio,
3090 doubleBufferRatio, tripleBufferRatio}});
3091 }
3092 for (const auto& sortedPair : sorted) {
3093 float activeTime = sortedPair.first;
3094 const BufferTuple& values = sortedPair.second;
3095 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3096 std::get<0>(values).c_str(), activeTime,
3097 std::get<1>(values), std::get<2>(values),
3098 std::get<3>(values));
3099 }
3100 result.append("\n");
3101}
3102
3103void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3104 String8& result) const
3105{
3106 bool colorize = false;
3107 if (index < args.size()
3108 && (args[index] == String16("--color"))) {
3109 colorize = true;
3110 index++;
3111 }
3112
3113 Colorizer colorizer(colorize);
3114
3115 // figure out if we're stuck somewhere
3116 const nsecs_t now = systemTime();
3117 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3118 const nsecs_t inTransaction(mDebugInTransaction);
3119 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3120 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3121
3122 /*
3123 * Dump library configuration.
3124 */
3125
3126 colorizer.bold(result);
3127 result.append("Build configuration:");
3128 colorizer.reset(result);
3129 appendSfConfigString(result);
3130 appendUiConfigString(result);
3131 appendGuiConfigString(result);
3132 result.append("\n");
3133
3134 colorizer.bold(result);
3135 result.append("Sync configuration: ");
3136 colorizer.reset(result);
3137 result.append(SyncFeatures::getInstance().toString());
3138 result.append("\n");
3139
3140 colorizer.bold(result);
3141 result.append("DispSync configuration: ");
3142 colorizer.reset(result);
3143 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
3144 "present offset %d ns (refresh %" PRId64 " ns)",
3145 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, PRESENT_TIME_OFFSET_FROM_VSYNC_NS,
3146 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3147 result.append("\n");
3148
3149 // Dump static screen stats
3150 result.append("\n");
3151 dumpStaticScreenStats(result);
3152 result.append("\n");
3153
3154 dumpBufferingStats(result);
3155
3156 /*
3157 * Dump the visible layer list
3158 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003159 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003160 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003161 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003162 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003163 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003164 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003165
3166 /*
3167 * Dump Display state
3168 */
3169
3170 colorizer.bold(result);
3171 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3172 colorizer.reset(result);
3173 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3174 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3175 hw->dump(result);
3176 }
3177
3178 /*
3179 * Dump SurfaceFlinger global state
3180 */
3181
3182 colorizer.bold(result);
3183 result.append("SurfaceFlinger global state:\n");
3184 colorizer.reset(result);
3185
3186 HWComposer& hwc(getHwComposer());
3187 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3188
3189 colorizer.bold(result);
3190 result.appendFormat("EGL implementation : %s\n",
3191 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3192 colorizer.reset(result);
3193 result.appendFormat("%s\n",
3194 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3195
3196 mRenderEngine->dump(result);
3197
3198 hw->undefinedRegion.dump(result, "undefinedRegion");
3199 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3200 hw->getOrientation(), hw->isDisplayOn());
3201 result.appendFormat(
3202 " last eglSwapBuffers() time: %f us\n"
3203 " last transaction time : %f us\n"
3204 " transaction-flags : %08x\n"
3205 " refresh-rate : %f fps\n"
3206 " x-dpi : %f\n"
3207 " y-dpi : %f\n"
3208 " gpu_to_cpu_unsupported : %d\n"
3209 ,
3210 mLastSwapBufferTime/1000.0,
3211 mLastTransactionTime/1000.0,
3212 mTransactionFlags,
3213 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3214 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3215 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3216 !mGpuToCpuSupported);
3217
3218 result.appendFormat(" eglSwapBuffers time: %f us\n",
3219 inSwapBuffersDuration/1000.0);
3220
3221 result.appendFormat(" transaction time: %f us\n",
3222 inTransactionDuration/1000.0);
3223
3224 /*
3225 * VSYNC state
3226 */
3227 mEventThread->dump(result);
3228
3229 /*
3230 * Dump HWComposer state
3231 */
3232 colorizer.bold(result);
3233 result.append("h/w composer state:\n");
3234 colorizer.reset(result);
3235 result.appendFormat(" h/w composer %s and %s\n",
3236 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3237 (mDebugDisableHWC || mDebugRegion || mDaltonize
3238 || mHasColorMatrix) ? "disabled" : "enabled");
3239 hwc.dump(result);
3240
3241 /*
3242 * Dump gralloc state
3243 */
3244 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3245 alloc.dump(result);
3246}
3247
3248const Vector< sp<Layer> >&
3249SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3250 // Note: mStateLock is held here
3251 wp<IBinder> dpy;
3252 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3253 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3254 dpy = mDisplays.keyAt(i);
3255 break;
3256 }
3257 }
3258 if (dpy == NULL) {
3259 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3260 // Just use the primary display so we have something to return
3261 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3262 }
3263 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
3264}
3265
3266bool SurfaceFlinger::startDdmConnection()
3267{
3268 void* libddmconnection_dso =
3269 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3270 if (!libddmconnection_dso) {
3271 return false;
3272 }
3273 void (*DdmConnection_start)(const char* name);
3274 DdmConnection_start =
3275 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3276 if (!DdmConnection_start) {
3277 dlclose(libddmconnection_dso);
3278 return false;
3279 }
3280 (*DdmConnection_start)(getServiceName());
3281 return true;
3282}
3283
3284status_t SurfaceFlinger::onTransact(
3285 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3286{
3287 switch (code) {
3288 case CREATE_CONNECTION:
3289 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003290 case BOOT_FINISHED:
3291 case CLEAR_ANIMATION_FRAME_STATS:
3292 case GET_ANIMATION_FRAME_STATS:
3293 case SET_POWER_MODE:
3294 case GET_HDR_CAPABILITIES:
3295 {
3296 // codes that require permission check
3297 IPCThreadState* ipc = IPCThreadState::self();
3298 const int pid = ipc->getCallingPid();
3299 const int uid = ipc->getCallingUid();
3300 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3301 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3302 ALOGE("Permission Denial: "
3303 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3304 return PERMISSION_DENIED;
3305 }
3306 break;
3307 }
Robert Carr1db73f62016-12-21 12:58:51 -08003308 /*
3309 * Calling setTransactionState is safe, because you need to have been
3310 * granted a reference to Client* and Handle* to do anything with it.
3311 *
3312 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3313 */
3314 case SET_TRANSACTION_STATE:
3315 case CREATE_SCOPED_CONNECTION:
3316 {
3317 break;
3318 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003319 case CAPTURE_SCREEN:
3320 {
3321 // codes that require permission check
3322 IPCThreadState* ipc = IPCThreadState::self();
3323 const int pid = ipc->getCallingPid();
3324 const int uid = ipc->getCallingUid();
3325 if ((uid != AID_GRAPHICS) &&
3326 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3327 ALOGE("Permission Denial: "
3328 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3329 return PERMISSION_DENIED;
3330 }
3331 break;
3332 }
3333 }
3334
3335 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3336 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3337 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3338 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3339 IPCThreadState* ipc = IPCThreadState::self();
3340 const int pid = ipc->getCallingPid();
3341 const int uid = ipc->getCallingUid();
3342 ALOGE("Permission Denial: "
3343 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3344 return PERMISSION_DENIED;
3345 }
3346 int n;
3347 switch (code) {
3348 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3349 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3350 return NO_ERROR;
3351 case 1002: // SHOW_UPDATES
3352 n = data.readInt32();
3353 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3354 invalidateHwcGeometry();
3355 repaintEverything();
3356 return NO_ERROR;
3357 case 1004:{ // repaint everything
3358 repaintEverything();
3359 return NO_ERROR;
3360 }
3361 case 1005:{ // force transaction
3362 setTransactionFlags(
3363 eTransactionNeeded|
3364 eDisplayTransactionNeeded|
3365 eTraversalNeeded);
3366 return NO_ERROR;
3367 }
3368 case 1006:{ // send empty update
3369 signalRefresh();
3370 return NO_ERROR;
3371 }
3372 case 1008: // toggle use of hw composer
3373 n = data.readInt32();
3374 mDebugDisableHWC = n ? 1 : 0;
3375 invalidateHwcGeometry();
3376 repaintEverything();
3377 return NO_ERROR;
3378 case 1009: // toggle use of transform hint
3379 n = data.readInt32();
3380 mDebugDisableTransformHint = n ? 1 : 0;
3381 invalidateHwcGeometry();
3382 repaintEverything();
3383 return NO_ERROR;
3384 case 1010: // interrogate.
3385 reply->writeInt32(0);
3386 reply->writeInt32(0);
3387 reply->writeInt32(mDebugRegion);
3388 reply->writeInt32(0);
3389 reply->writeInt32(mDebugDisableHWC);
3390 return NO_ERROR;
3391 case 1013: {
3392 Mutex::Autolock _l(mStateLock);
3393 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3394 reply->writeInt32(hw->getPageFlipCount());
3395 return NO_ERROR;
3396 }
3397 case 1014: {
3398 // daltonize
3399 n = data.readInt32();
3400 switch (n % 10) {
3401 case 1:
3402 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3403 break;
3404 case 2:
3405 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3406 break;
3407 case 3:
3408 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3409 break;
3410 }
3411 if (n >= 10) {
3412 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3413 } else {
3414 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3415 }
3416 mDaltonize = n > 0;
3417 invalidateHwcGeometry();
3418 repaintEverything();
3419 return NO_ERROR;
3420 }
3421 case 1015: {
3422 // apply a color matrix
3423 n = data.readInt32();
3424 mHasColorMatrix = n ? 1 : 0;
3425 if (n) {
3426 // color matrix is sent as mat3 matrix followed by vec3
3427 // offset, then packed into a mat4 where the last row is
3428 // the offset and extra values are 0
3429 for (size_t i = 0 ; i < 4; i++) {
3430 for (size_t j = 0; j < 4; j++) {
3431 mColorMatrix[i][j] = data.readFloat();
3432 }
3433 }
3434 } else {
3435 mColorMatrix = mat4();
3436 }
3437 invalidateHwcGeometry();
3438 repaintEverything();
3439 return NO_ERROR;
3440 }
3441 // This is an experimental interface
3442 // Needs to be shifted to proper binder interface when we productize
3443 case 1016: {
3444 n = data.readInt32();
3445 mPrimaryDispSync.setRefreshSkipCount(n);
3446 return NO_ERROR;
3447 }
3448 case 1017: {
3449 n = data.readInt32();
3450 mForceFullDamage = static_cast<bool>(n);
3451 return NO_ERROR;
3452 }
3453 case 1018: { // Modify Choreographer's phase offset
3454 n = data.readInt32();
3455 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3456 return NO_ERROR;
3457 }
3458 case 1019: { // Modify SurfaceFlinger's phase offset
3459 n = data.readInt32();
3460 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3461 return NO_ERROR;
3462 }
3463 case 1020: { // Layer updates interceptor
3464 n = data.readInt32();
3465 if (n) {
3466 ALOGV("Interceptor enabled");
3467 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3468 }
3469 else{
3470 ALOGV("Interceptor disabled");
3471 mInterceptor.disable();
3472 }
3473 return NO_ERROR;
3474 }
3475 case 1021: { // Disable HWC virtual displays
3476 n = data.readInt32();
3477 mUseHwcVirtualDisplays = !n;
3478 return NO_ERROR;
3479 }
3480 }
3481 }
3482 return err;
3483}
3484
3485void SurfaceFlinger::repaintEverything() {
3486 android_atomic_or(1, &mRepaintEverything);
3487 signalTransaction();
3488}
3489
3490// ---------------------------------------------------------------------------
3491// Capture screen into an IGraphiBufferProducer
3492// ---------------------------------------------------------------------------
3493
3494/* The code below is here to handle b/8734824
3495 *
3496 * We create a IGraphicBufferProducer wrapper that forwards all calls
3497 * from the surfaceflinger thread to the calling binder thread, where they
3498 * are executed. This allows the calling thread in the calling process to be
3499 * reused and not depend on having "enough" binder threads to handle the
3500 * requests.
3501 */
3502class GraphicProducerWrapper : public BBinder, public MessageHandler {
3503 /* Parts of GraphicProducerWrapper are run on two different threads,
3504 * communicating by sending messages via Looper but also by shared member
3505 * data. Coherence maintenance is subtle and in places implicit (ugh).
3506 *
3507 * Don't rely on Looper's sendMessage/handleMessage providing
3508 * release/acquire semantics for any data not actually in the Message.
3509 * Data going from surfaceflinger to binder threads needs to be
3510 * synchronized explicitly.
3511 *
3512 * Barrier open/wait do provide release/acquire semantics. This provides
3513 * implicit synchronization for data coming back from binder to
3514 * surfaceflinger threads.
3515 */
3516
3517 sp<IGraphicBufferProducer> impl;
3518 sp<Looper> looper;
3519 status_t result;
3520 bool exitPending;
3521 bool exitRequested;
3522 Barrier barrier;
3523 uint32_t code;
3524 Parcel const* data;
3525 Parcel* reply;
3526
3527 enum {
3528 MSG_API_CALL,
3529 MSG_EXIT
3530 };
3531
3532 /*
3533 * Called on surfaceflinger thread. This is called by our "fake"
3534 * BpGraphicBufferProducer. We package the data and reply Parcel and
3535 * forward them to the binder thread.
3536 */
3537 virtual status_t transact(uint32_t code,
3538 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3539 this->code = code;
3540 this->data = &data;
3541 this->reply = reply;
3542 if (exitPending) {
3543 // if we've exited, we run the message synchronously right here.
3544 // note (JH): as far as I can tell from looking at the code, this
3545 // never actually happens. if it does, i'm not sure if it happens
3546 // on the surfaceflinger or binder thread.
3547 handleMessage(Message(MSG_API_CALL));
3548 } else {
3549 barrier.close();
3550 // Prevent stores to this->{code, data, reply} from being
3551 // reordered later than the construction of Message.
3552 atomic_thread_fence(memory_order_release);
3553 looper->sendMessage(this, Message(MSG_API_CALL));
3554 barrier.wait();
3555 }
3556 return result;
3557 }
3558
3559 /*
3560 * here we run on the binder thread. All we've got to do is
3561 * call the real BpGraphicBufferProducer.
3562 */
3563 virtual void handleMessage(const Message& message) {
3564 int what = message.what;
3565 // Prevent reads below from happening before the read from Message
3566 atomic_thread_fence(memory_order_acquire);
3567 if (what == MSG_API_CALL) {
3568 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3569 barrier.open();
3570 } else if (what == MSG_EXIT) {
3571 exitRequested = true;
3572 }
3573 }
3574
3575public:
3576 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3577 : impl(impl),
3578 looper(new Looper(true)),
3579 result(NO_ERROR),
3580 exitPending(false),
3581 exitRequested(false),
3582 code(0),
3583 data(NULL),
3584 reply(NULL)
3585 {}
3586
3587 // Binder thread
3588 status_t waitForResponse() {
3589 do {
3590 looper->pollOnce(-1);
3591 } while (!exitRequested);
3592 return result;
3593 }
3594
3595 // Client thread
3596 void exit(status_t result) {
3597 this->result = result;
3598 exitPending = true;
3599 // Ensure this->result is visible to the binder thread before it
3600 // handles the message.
3601 atomic_thread_fence(memory_order_release);
3602 looper->sendMessage(this, Message(MSG_EXIT));
3603 }
3604};
3605
3606
3607status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3608 const sp<IGraphicBufferProducer>& producer,
3609 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003610 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003611 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3612
3613 if (CC_UNLIKELY(display == 0))
3614 return BAD_VALUE;
3615
3616 if (CC_UNLIKELY(producer == 0))
3617 return BAD_VALUE;
3618
3619 // if we have secure windows on this display, never allow the screen capture
3620 // unless the producer interface is local (i.e.: we can take a screenshot for
3621 // ourselves).
3622 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3623
3624 // Convert to surfaceflinger's internal rotation type.
3625 Transform::orientation_flags rotationFlags;
3626 switch (rotation) {
3627 case ISurfaceComposer::eRotateNone:
3628 rotationFlags = Transform::ROT_0;
3629 break;
3630 case ISurfaceComposer::eRotate90:
3631 rotationFlags = Transform::ROT_90;
3632 break;
3633 case ISurfaceComposer::eRotate180:
3634 rotationFlags = Transform::ROT_180;
3635 break;
3636 case ISurfaceComposer::eRotate270:
3637 rotationFlags = Transform::ROT_270;
3638 break;
3639 default:
3640 rotationFlags = Transform::ROT_0;
3641 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3642 break;
3643 }
3644
3645 class MessageCaptureScreen : public MessageBase {
3646 SurfaceFlinger* flinger;
3647 sp<IBinder> display;
3648 sp<IGraphicBufferProducer> producer;
3649 Rect sourceCrop;
3650 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003651 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003652 bool useIdentityTransform;
3653 Transform::orientation_flags rotation;
3654 status_t result;
3655 bool isLocalScreenshot;
3656 public:
3657 MessageCaptureScreen(SurfaceFlinger* flinger,
3658 const sp<IBinder>& display,
3659 const sp<IGraphicBufferProducer>& producer,
3660 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003661 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003662 bool useIdentityTransform,
3663 Transform::orientation_flags rotation,
3664 bool isLocalScreenshot)
3665 : flinger(flinger), display(display), producer(producer),
3666 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3667 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3668 useIdentityTransform(useIdentityTransform),
3669 rotation(rotation), result(PERMISSION_DENIED),
3670 isLocalScreenshot(isLocalScreenshot)
3671 {
3672 }
3673 status_t getResult() const {
3674 return result;
3675 }
3676 virtual bool handler() {
3677 Mutex::Autolock _l(flinger->mStateLock);
3678 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3679 result = flinger->captureScreenImplLocked(hw, producer,
3680 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3681 useIdentityTransform, rotation, isLocalScreenshot);
3682 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3683 return true;
3684 }
3685 };
3686
3687 // this creates a "fake" BBinder which will serve as a "fake" remote
3688 // binder to receive the marshaled calls and forward them to the
3689 // real remote (a BpGraphicBufferProducer)
3690 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3691
3692 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3693 // which does the marshaling work forwards to our "fake remote" above.
3694 sp<MessageBase> msg = new MessageCaptureScreen(this,
3695 display, IGraphicBufferProducer::asInterface( wrapper ),
3696 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3697 useIdentityTransform, rotationFlags, isLocalScreenshot);
3698
3699 status_t res = postMessageAsync(msg);
3700 if (res == NO_ERROR) {
3701 res = wrapper->waitForResponse();
3702 }
3703 return res;
3704}
3705
3706
3707void SurfaceFlinger::renderScreenImplLocked(
3708 const sp<const DisplayDevice>& hw,
3709 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003710 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003711 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3712{
3713 ATRACE_CALL();
3714 RenderEngine& engine(getRenderEngine());
3715
3716 // get screen geometry
3717 const int32_t hw_w = hw->getWidth();
3718 const int32_t hw_h = hw->getHeight();
3719 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3720 static_cast<int32_t>(reqHeight) != hw_h;
3721
3722 // if a default or invalid sourceCrop is passed in, set reasonable values
3723 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3724 !sourceCrop.isValid()) {
3725 sourceCrop.setLeftTop(Point(0, 0));
3726 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3727 }
3728
3729 // ensure that sourceCrop is inside screen
3730 if (sourceCrop.left < 0) {
3731 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3732 }
3733 if (sourceCrop.right > hw_w) {
3734 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3735 }
3736 if (sourceCrop.top < 0) {
3737 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3738 }
3739 if (sourceCrop.bottom > hw_h) {
3740 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3741 }
3742
3743 // make sure to clear all GL error flags
3744 engine.checkErrors();
3745
3746 // set-up our viewport
3747 engine.setViewportAndProjection(
3748 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3749 engine.disableTexturing();
3750
3751 // redraw the screen entirely...
3752 engine.clearWithColor(0, 0, 0, 1);
3753
Robert Carr1f0a16a2016-10-24 16:27:39 -07003754 // We loop through the first level of layers without traversing,
3755 // as we need to interpret min/max layer Z in the top level Z space.
3756 for (const auto& layer : mDrawingState.layersSortedByZ) {
3757 if (layer->getLayerStack() != hw->getLayerStack()) {
3758 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003759 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003760 const Layer::State& state(layer->getDrawingState());
3761 if (state.z < minLayerZ || state.z > maxLayerZ) {
3762 continue;
3763 }
3764 layer->traverseInZOrder([&](Layer* layer) {
3765 if (!layer->isVisible()) {
3766 return;
3767 }
3768 if (filtering) layer->setFiltering(true);
3769 layer->draw(hw, useIdentityTransform);
3770 if (filtering) layer->setFiltering(false);
3771 });
3772 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003773
3774 // compositionComplete is needed for older driver
3775 hw->compositionComplete();
3776 hw->setViewportAndProjection();
3777}
3778
3779
3780status_t SurfaceFlinger::captureScreenImplLocked(
3781 const sp<const DisplayDevice>& hw,
3782 const sp<IGraphicBufferProducer>& producer,
3783 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003784 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003785 bool useIdentityTransform, Transform::orientation_flags rotation,
3786 bool isLocalScreenshot)
3787{
3788 ATRACE_CALL();
3789
3790 // get screen geometry
3791 uint32_t hw_w = hw->getWidth();
3792 uint32_t hw_h = hw->getHeight();
3793
3794 if (rotation & Transform::ROT_90) {
3795 std::swap(hw_w, hw_h);
3796 }
3797
3798 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3799 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3800 reqWidth, reqHeight, hw_w, hw_h);
3801 return BAD_VALUE;
3802 }
3803
3804 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3805 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3806
3807 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003808 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003809 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003810 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3811 (state.z < minLayerZ || state.z > maxLayerZ)) {
3812 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003813 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003814 layer->traverseInZOrder([&](Layer *layer) {
3815 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3816 layer->isSecure());
3817 });
3818 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003819
3820 if (!isLocalScreenshot && secureLayerIsVisible) {
3821 ALOGW("FB is protected: PERMISSION_DENIED");
3822 return PERMISSION_DENIED;
3823 }
3824
3825 // create a surface (because we're a producer, and we need to
3826 // dequeue/queue a buffer)
3827 sp<Surface> sur = new Surface(producer, false);
3828 ANativeWindow* window = sur.get();
3829
3830 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3831 if (result == NO_ERROR) {
3832 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3833 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3834
3835 int err = 0;
3836 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3837 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3838 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3839 err |= native_window_set_usage(window, usage);
3840
3841 if (err == NO_ERROR) {
3842 ANativeWindowBuffer* buffer;
3843 /* TODO: Once we have the sync framework everywhere this can use
3844 * server-side waits on the fence that dequeueBuffer returns.
3845 */
3846 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3847 if (result == NO_ERROR) {
3848 int syncFd = -1;
3849 // create an EGLImage from the buffer so we can later
3850 // turn it into a texture
3851 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3852 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3853 if (image != EGL_NO_IMAGE_KHR) {
3854 // this binds the given EGLImage as a framebuffer for the
3855 // duration of this scope.
3856 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3857 if (imageBond.getStatus() == NO_ERROR) {
3858 // this will in fact render into our dequeued buffer
3859 // via an FBO, which means we didn't have to create
3860 // an EGLSurface and therefore we're not
3861 // dependent on the context's EGLConfig.
3862 renderScreenImplLocked(
3863 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3864 useIdentityTransform, rotation);
3865
3866 // Attempt to create a sync khr object that can produce a sync point. If that
3867 // isn't available, create a non-dupable sync object in the fallback path and
3868 // wait on it directly.
3869 EGLSyncKHR sync;
3870 if (!DEBUG_SCREENSHOTS) {
3871 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3872 // native fence fd will not be populated until flush() is done.
3873 getRenderEngine().flush();
3874 } else {
3875 sync = EGL_NO_SYNC_KHR;
3876 }
3877 if (sync != EGL_NO_SYNC_KHR) {
3878 // get the sync fd
3879 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3880 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3881 ALOGW("captureScreen: failed to dup sync khr object");
3882 syncFd = -1;
3883 }
3884 eglDestroySyncKHR(mEGLDisplay, sync);
3885 } else {
3886 // fallback path
3887 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3888 if (sync != EGL_NO_SYNC_KHR) {
3889 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3890 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3891 EGLint eglErr = eglGetError();
3892 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3893 ALOGW("captureScreen: fence wait timed out");
3894 } else {
3895 ALOGW_IF(eglErr != EGL_SUCCESS,
3896 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3897 }
3898 eglDestroySyncKHR(mEGLDisplay, sync);
3899 } else {
3900 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3901 }
3902 }
3903 if (DEBUG_SCREENSHOTS) {
3904 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3905 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3906 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3907 hw, minLayerZ, maxLayerZ);
3908 delete [] pixels;
3909 }
3910
3911 } else {
3912 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3913 result = INVALID_OPERATION;
3914 window->cancelBuffer(window, buffer, syncFd);
3915 buffer = NULL;
3916 }
3917 // destroy our image
3918 eglDestroyImageKHR(mEGLDisplay, image);
3919 } else {
3920 result = BAD_VALUE;
3921 }
3922 if (buffer) {
3923 // queueBuffer takes ownership of syncFd
3924 result = window->queueBuffer(window, buffer, syncFd);
3925 }
3926 }
3927 } else {
3928 result = BAD_VALUE;
3929 }
3930 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3931 }
3932
3933 return result;
3934}
3935
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003936void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08003937 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003938 if (DEBUG_SCREENSHOTS) {
3939 for (size_t y=0 ; y<h ; y++) {
3940 uint32_t const * p = (uint32_t const *)vaddr + y*s;
3941 for (size_t x=0 ; x<w ; x++) {
3942 if (p[x] != 0xFF000000) return;
3943 }
3944 }
3945 ALOGE("*** we just took a black screenshot ***\n"
3946 "requested minz=%d, maxz=%d, layerStack=%d",
3947 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08003948 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003949 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003950 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003951 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
3952 state.z <= maxLayerZ) {
3953 layer->traverseInZOrder([&](Layer* layer) {
3954 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3955 layer->isVisible() ? '+' : '-',
3956 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003957 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003958 i++;
3959 });
3960 }
3961 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003962 }
3963}
3964
3965// ---------------------------------------------------------------------------
3966
Robert Carr2047fae2016-11-28 14:09:09 -08003967void SurfaceFlinger::State::traverseInZOrder(const std::function<void(Layer*)>& consume) const {
3968 layersSortedByZ.traverseInZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003969}
3970
Robert Carr2047fae2016-11-28 14:09:09 -08003971void SurfaceFlinger::State::traverseInReverseZOrder(const std::function<void(Layer*)>& consume) const {
3972 layersSortedByZ.traverseInReverseZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003973}
3974
3975}; // namespace android
3976
3977
3978#if defined(__gl_h_)
3979#error "don't include gl/gl.h in this file"
3980#endif
3981
3982#if defined(__gl2_h_)
3983#error "don't include gl2/gl2.h in this file"
3984#endif