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