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