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