blob: a9000c07a821373424b701b4ffa2803ed696fa05 [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,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -0600573 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000574 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)
Stephen Kiazyk8d6c16d2017-04-05 16:46:49 -0700587 getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000588
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
Brian Anderson6b376712017-04-04 10:51:39 -0700650status_t SurfaceFlinger::getSupportedFrameTimestamps(
651 std::vector<FrameEvent>* outSupported) const {
652 *outSupported = {
653 FrameEvent::REQUESTED_PRESENT,
654 FrameEvent::ACQUIRE,
655 FrameEvent::LATCH,
656 FrameEvent::FIRST_REFRESH_START,
657 FrameEvent::LAST_REFRESH_START,
658 FrameEvent::GPU_COMPOSITION_DONE,
659 FrameEvent::DEQUEUE_READY,
660 FrameEvent::RELEASE,
661 };
662 return NO_ERROR;
663}
664
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000665status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
666 Vector<DisplayInfo>* configs) {
667 if ((configs == NULL) || (display.get() == NULL)) {
668 return BAD_VALUE;
669 }
670
671 int32_t type = getDisplayType(display);
672 if (type < 0) return type;
673
674 // TODO: Not sure if display density should handled by SF any longer
675 class Density {
676 static int getDensityFromProperty(char const* propName) {
677 char property[PROPERTY_VALUE_MAX];
678 int density = 0;
679 if (property_get(propName, property, NULL) > 0) {
680 density = atoi(property);
681 }
682 return density;
683 }
684 public:
685 static int getEmuDensity() {
686 return getDensityFromProperty("qemu.sf.lcd_density"); }
687 static int getBuildDensity() {
688 return getDensityFromProperty("ro.sf.lcd_density"); }
689 };
690
691 configs->clear();
692
693 const Vector<HWComposer::DisplayConfig>& hwConfigs =
694 getHwComposer().getConfigs(type);
695 for (size_t c = 0; c < hwConfigs.size(); ++c) {
696 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
697 DisplayInfo info = DisplayInfo();
698
699 float xdpi = hwConfig.xdpi;
700 float ydpi = hwConfig.ydpi;
701
702 if (type == DisplayDevice::DISPLAY_PRIMARY) {
703 // The density of the device is provided by a build property
704 float density = Density::getBuildDensity() / 160.0f;
705 if (density == 0) {
706 // the build doesn't provide a density -- this is wrong!
707 // use xdpi instead
708 ALOGE("ro.sf.lcd_density must be defined as a build property");
709 density = xdpi / 160.0f;
710 }
711 if (Density::getEmuDensity()) {
712 // if "qemu.sf.lcd_density" is specified, it overrides everything
713 xdpi = ydpi = density = Density::getEmuDensity();
714 density /= 160.0f;
715 }
716 info.density = density;
717
718 // TODO: this needs to go away (currently needed only by webkit)
719 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
720 info.orientation = hw->getOrientation();
721 } else {
722 // TODO: where should this value come from?
723 static const int TV_DENSITY = 213;
724 info.density = TV_DENSITY / 160.0f;
725 info.orientation = 0;
726 }
727
728 info.w = hwConfig.width;
729 info.h = hwConfig.height;
730 info.xdpi = xdpi;
731 info.ydpi = ydpi;
732 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800733 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000734
735 // This is how far in advance a buffer must be queued for
736 // presentation at a given time. If you want a buffer to appear
737 // on the screen at time N, you must submit the buffer before
738 // (N - presentationDeadline).
739 //
740 // Normally it's one full refresh period (to give SF a chance to
741 // latch the buffer), but this can be reduced by configuring a
742 // DispSync offset. Any additional delays introduced by the hardware
743 // composer or panel must be accounted for here.
744 //
745 // We add an additional 1ms to allow for processing time and
746 // differences between the ideal and actual refresh rate.
747 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800748 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000749
750 // All non-virtual displays are currently considered secure.
751 info.secure = true;
752
753 configs->push_back(info);
754 }
755
756 return NO_ERROR;
757}
758
759status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
760 DisplayStatInfo* stats) {
761 if (stats == NULL) {
762 return BAD_VALUE;
763 }
764
765 // FIXME for now we always return stats for the primary display
766 memset(stats, 0, sizeof(*stats));
767 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
768 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
769 return NO_ERROR;
770}
771
772int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
773 sp<DisplayDevice> device(getDisplayDevice(display));
774 if (device != NULL) {
775 return device->getActiveConfig();
776 }
777 return BAD_VALUE;
778}
779
780void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
781 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
782 this);
783 int32_t type = hw->getDisplayType();
784 int currentMode = hw->getActiveConfig();
785
786 if (mode == currentMode) {
787 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
788 return;
789 }
790
791 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
792 ALOGW("Trying to set config for virtual display");
793 return;
794 }
795
796 hw->setActiveConfig(mode);
797 getHwComposer().setActiveConfig(type, mode);
798}
799
800status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
801 class MessageSetActiveConfig: public MessageBase {
802 SurfaceFlinger& mFlinger;
803 sp<IBinder> mDisplay;
804 int mMode;
805 public:
806 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
807 int mode) :
808 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
809 virtual bool handler() {
810 Vector<DisplayInfo> configs;
811 mFlinger.getDisplayConfigs(mDisplay, &configs);
812 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
813 ALOGE("Attempt to set active config = %d for display with %zu configs",
814 mMode, configs.size());
815 }
816 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
817 if (hw == NULL) {
818 ALOGE("Attempt to set active config = %d for null display %p",
819 mMode, mDisplay.get());
820 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
821 ALOGW("Attempt to set active config = %d for virtual display",
822 mMode);
823 } else {
824 mFlinger.setActiveConfigInternal(hw, mMode);
825 }
826 return true;
827 }
828 };
829 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
830 postMessageSync(msg);
831 return NO_ERROR;
832}
833
834status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
835 Vector<android_color_mode_t>* outColorModes) {
836 if (outColorModes == nullptr || display.get() == nullptr) {
837 return BAD_VALUE;
838 }
839
840 int32_t type = getDisplayType(display);
841 if (type < 0) return type;
842
843 std::set<android_color_mode_t> colorModes;
844 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
845 colorModes.insert(hwConfig.colorMode);
846 }
847
848 outColorModes->clear();
849 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
850
851 return NO_ERROR;
852}
853
854android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
855 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
856
857 int32_t type = getDisplayType(display);
858 if (type < 0) return static_cast<android_color_mode_t>(type);
859
860 return getHwComposer().getColorMode(type);
861}
862
863status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
864 android_color_mode_t colorMode) {
865 if (display.get() == nullptr || colorMode < 0) {
866 return BAD_VALUE;
867 }
868
869 int32_t type = getDisplayType(display);
870 if (type < 0) return type;
871 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
872 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
873 desiredConfig.colorMode = colorMode;
874 for (size_t c = 0; c < hwConfigs.size(); ++c) {
875 const HWComposer::DisplayConfig config = hwConfigs[c];
876 if (config == desiredConfig) {
877 return setActiveConfig(display, c);
878 }
879 }
880 return BAD_VALUE;
881}
882
883status_t SurfaceFlinger::clearAnimationFrameStats() {
884 Mutex::Autolock _l(mStateLock);
885 mAnimFrameTracker.clearStats();
886 return NO_ERROR;
887}
888
889status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
890 Mutex::Autolock _l(mStateLock);
891 mAnimFrameTracker.getStats(outStats);
892 return NO_ERROR;
893}
894
895status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
896 HdrCapabilities* outCapabilities) const {
897 // HWC1 does not provide HDR capabilities
898 *outCapabilities = HdrCapabilities();
899 return NO_ERROR;
900}
901
902status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
903 if (enable == mInjectVSyncs) {
904 return NO_ERROR;
905 }
906
907 if (enable) {
908 mInjectVSyncs = enable;
909 ALOGV("VSync Injections enabled");
910 if (mVSyncInjector.get() == nullptr) {
911 mVSyncInjector = new InjectVSyncSource();
912 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
913 }
914 mEventQueue.setEventThread(mInjectorEventThread);
915 } else {
916 mInjectVSyncs = enable;
917 ALOGV("VSync Injections disabled");
918 mEventQueue.setEventThread(mSFEventThread);
919 mVSyncInjector.clear();
920 }
921 return NO_ERROR;
922}
923
924status_t SurfaceFlinger::injectVSync(nsecs_t when) {
925 if (!mInjectVSyncs) {
926 ALOGE("VSync Injections not enabled");
927 return BAD_VALUE;
928 }
929 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
930 ALOGV("Injecting VSync inside SurfaceFlinger");
931 mVSyncInjector->onInjectSyncEvent(when);
932 }
933 return NO_ERROR;
934}
935
936// ----------------------------------------------------------------------------
937
938sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
939 return mEventThread->createEventConnection();
940}
941
942// ----------------------------------------------------------------------------
943
944void SurfaceFlinger::waitForEvent() {
945 mEventQueue.waitMessage();
946}
947
948void SurfaceFlinger::signalTransaction() {
949 mEventQueue.invalidate();
950}
951
952void SurfaceFlinger::signalLayerUpdate() {
953 mEventQueue.invalidate();
954}
955
956void SurfaceFlinger::signalRefresh() {
957 mEventQueue.refresh();
958}
959
960status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
961 nsecs_t reltime, uint32_t /* flags */) {
962 return mEventQueue.postMessage(msg, reltime);
963}
964
965status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
966 nsecs_t reltime, uint32_t /* flags */) {
967 status_t res = mEventQueue.postMessage(msg, reltime);
968 if (res == NO_ERROR) {
969 msg->wait();
970 }
971 return res;
972}
973
974void SurfaceFlinger::run() {
975 do {
976 waitForEvent();
977 } while (true);
978}
979
980void SurfaceFlinger::enableHardwareVsync() {
981 Mutex::Autolock _l(mHWVsyncLock);
982 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
983 mPrimaryDispSync.beginResync();
984 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
985 mEventControlThread->setVsyncEnabled(true);
986 mPrimaryHWVsyncEnabled = true;
987 }
988}
989
990void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
991 Mutex::Autolock _l(mHWVsyncLock);
992
993 if (makeAvailable) {
994 mHWVsyncAvailable = true;
995 } else if (!mHWVsyncAvailable) {
996 // Hardware vsync is not currently available, so abort the resync
997 // attempt for now
998 return;
999 }
1000
1001 const nsecs_t period =
1002 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1003
1004 mPrimaryDispSync.reset();
1005 mPrimaryDispSync.setPeriod(period);
1006
1007 if (!mPrimaryHWVsyncEnabled) {
1008 mPrimaryDispSync.beginResync();
1009 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1010 mEventControlThread->setVsyncEnabled(true);
1011 mPrimaryHWVsyncEnabled = true;
1012 }
1013}
1014
1015void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1016 Mutex::Autolock _l(mHWVsyncLock);
1017 if (mPrimaryHWVsyncEnabled) {
1018 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1019 mEventControlThread->setVsyncEnabled(false);
1020 mPrimaryDispSync.endResync();
1021 mPrimaryHWVsyncEnabled = false;
1022 }
1023 if (makeUnavailable) {
1024 mHWVsyncAvailable = false;
1025 }
1026}
1027
1028void SurfaceFlinger::resyncWithRateLimit() {
1029 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1030 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1031 resyncToHardwareVsync(false);
1032 }
1033}
1034
Steven Thomas3cfac282017-02-06 12:29:30 -08001035void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1036 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001037 bool needsHwVsync = false;
1038
1039 { // Scope for the lock
1040 Mutex::Autolock _l(mHWVsyncLock);
1041 if (type == 0 && mPrimaryHWVsyncEnabled) {
1042 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1043 }
1044 }
1045
1046 if (needsHwVsync) {
1047 enableHardwareVsync();
1048 } else {
1049 disableHardwareVsync(false);
1050 }
1051}
1052
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001053void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
Brian Andersond0010582017-03-07 13:20:31 -08001054 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001055 *compositorTiming = mCompositorTiming;
1056}
1057
Stephen Kiazyk8d6c16d2017-04-05 16:46:49 -07001058void SurfaceFlinger::onHotplugReceived(HWComposer* /*composer*/, int type, bool connected) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001059 if (mEventThread == NULL) {
1060 // This is a temporary workaround for b/7145521. A non-null pointer
1061 // does not mean EventThread has finished initializing, so this
1062 // is not a correct fix.
1063 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1064 return;
1065 }
1066
1067 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1068 Mutex::Autolock _l(mStateLock);
1069 if (connected) {
1070 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1071 } else {
1072 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1073 mBuiltinDisplays[type].clear();
1074 }
1075 setTransactionFlags(eDisplayTransactionNeeded);
1076
1077 // Defer EventThread notification until SF has updated mDisplays.
1078 }
1079}
1080
Steven Thomas3cfac282017-02-06 12:29:30 -08001081void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1082 repaintEverything();
1083}
1084
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001085void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1086 ATRACE_CALL();
1087 getHwComposer().eventControl(disp, event, enabled);
1088}
1089
1090void SurfaceFlinger::onMessageReceived(int32_t what) {
1091 ATRACE_CALL();
1092 switch (what) {
1093 case MessageQueue::INVALIDATE: {
1094 bool refreshNeeded = handleMessageTransaction();
1095 refreshNeeded |= handleMessageInvalidate();
1096 refreshNeeded |= mRepaintEverything;
1097 if (refreshNeeded) {
1098 // Signal a refresh if a transaction modified the window state,
1099 // a new buffer was latched, or if HWC has requested a full
1100 // repaint
1101 signalRefresh();
1102 }
1103 break;
1104 }
1105 case MessageQueue::REFRESH: {
1106 handleMessageRefresh();
1107 break;
1108 }
1109 }
1110}
1111
1112bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001113 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001114 if (transactionFlags) {
1115 handleTransaction(transactionFlags);
1116 return true;
1117 }
1118 return false;
1119}
1120
1121bool SurfaceFlinger::handleMessageInvalidate() {
1122 ATRACE_CALL();
1123 return handlePageFlip();
1124}
1125
1126void SurfaceFlinger::handleMessageRefresh() {
1127 ATRACE_CALL();
1128
1129 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1130
Brian Andersond6927fb2016-07-23 23:37:30 -07001131 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001132 rebuildLayerStacks();
1133 setUpHWComposer();
1134 doDebugFlashRegions();
1135 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001136 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001137}
1138
1139void SurfaceFlinger::doDebugFlashRegions()
1140{
1141 // is debugging enabled
1142 if (CC_LIKELY(!mDebugRegion))
1143 return;
1144
1145 const bool repaintEverything = mRepaintEverything;
1146 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1147 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1148 if (hw->isDisplayOn()) {
1149 // transform the dirty region into this screen's coordinate space
1150 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1151 if (!dirtyRegion.isEmpty()) {
1152 // redraw the whole screen
1153 doComposeSurfaces(hw, Region(hw->bounds()));
1154
1155 // and draw the dirty region
1156 const int32_t height = hw->getHeight();
1157 RenderEngine& engine(getRenderEngine());
1158 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1159
1160 hw->compositionComplete();
1161 hw->swapBuffers(getHwComposer());
1162 }
1163 }
1164 }
1165
1166 postFramebuffer();
1167
1168 if (mDebugRegion > 1) {
1169 usleep(mDebugRegion * 1000);
1170 }
1171
1172 HWComposer& hwc(getHwComposer());
1173 if (hwc.initCheck() == NO_ERROR) {
1174 status_t err = hwc.prepare();
1175 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1176 }
1177}
1178
Brian Andersond6927fb2016-07-23 23:37:30 -07001179void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001180{
1181 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001182 mDrawingState.traverseInZOrder([&](Layer* layer) {
1183 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001184 needExtraInvalidate = true;
1185 }
Robert Carr2047fae2016-11-28 14:09:09 -08001186 });
1187
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001188 if (needExtraInvalidate) {
1189 signalLayerUpdate();
1190 }
1191}
1192
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001193void SurfaceFlinger::updateCompositorTiming(
1194 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1195 std::shared_ptr<FenceTime>& presentFenceTime) {
1196 // Update queue of past composite+present times and determine the
1197 // most recently known composite to present latency.
1198 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1199 nsecs_t compositeToPresentLatency = -1;
1200 while (!mCompositePresentTimes.empty()) {
1201 CompositePresentTime& cpt = mCompositePresentTimes.front();
1202 // Cached values should have been updated before calling this method,
1203 // which helps avoid duplicate syscalls.
1204 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1205 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1206 break;
1207 }
1208 compositeToPresentLatency = displayTime - cpt.composite;
1209 mCompositePresentTimes.pop();
1210 }
1211
1212 // Don't let mCompositePresentTimes grow unbounded, just in case.
1213 while (mCompositePresentTimes.size() > 16) {
1214 mCompositePresentTimes.pop();
1215 }
1216
Brian Andersond0010582017-03-07 13:20:31 -08001217 setCompositorTimingSnapped(
1218 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1219}
1220
1221void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1222 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001223 // Integer division and modulo round toward 0 not -inf, so we need to
1224 // treat negative and positive offsets differently.
Brian Andersond0010582017-03-07 13:20:31 -08001225 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001226 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1227 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1228
Brian Andersond0010582017-03-07 13:20:31 -08001229 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1230 if (idealLatency <= 0) {
1231 idealLatency = vsyncInterval;
1232 }
1233
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001234 // Snap the latency to a value that removes scheduling jitter from the
1235 // composition and present times, which often have >1ms of jitter.
1236 // Reducing jitter is important if an app attempts to extrapolate
1237 // something (such as user input) to an accurate diasplay time.
1238 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1239 // with (presentLatency % interval).
Brian Andersond0010582017-03-07 13:20:31 -08001240 nsecs_t bias = vsyncInterval / 2;
1241 int64_t extraVsyncs =
1242 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1243 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1244 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001245
Brian Andersond0010582017-03-07 13:20:31 -08001246 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001247 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1248 mCompositorTiming.interval = vsyncInterval;
Brian Andersond0010582017-03-07 13:20:31 -08001249 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001250}
1251
1252void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001253{
Brian Andersond6927fb2016-07-23 23:37:30 -07001254 const HWComposer& hwc = getHwComposer();
1255 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1256
Brian Anderson3d4039d2016-09-23 16:31:30 -07001257 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1258 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1259 glCompositionDoneFenceTime =
1260 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1261 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1262 } else {
1263 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1264 }
1265 mGlCompositionDoneTimeline.updateSignalTimes();
1266
Brian Anderson4e606e32017-03-16 15:34:57 -07001267 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1268 auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
Brian Anderson3d4039d2016-09-23 16:31:30 -07001269 mDisplayTimeline.push(retireFenceTime);
1270 mDisplayTimeline.updateSignalTimes();
Brian Andersond6927fb2016-07-23 23:37:30 -07001271
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001272 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1273 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1274
1275 // We use the refreshStartTime which might be sampled a little later than
1276 // when we started doing work for this frame, but that should be okay
1277 // since updateCompositorTiming has snapping logic.
1278 updateCompositorTiming(
1279 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
Brian Andersond0010582017-03-07 13:20:31 -08001280 CompositorTiming compositorTiming;
1281 {
1282 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1283 compositorTiming = mCompositorTiming;
1284 }
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001285
Robert Carr2047fae2016-11-28 14:09:09 -08001286 mDrawingState.traverseInZOrder([&](Layer* layer) {
Brian Anderson4e606e32017-03-16 15:34:57 -07001287 // TODO(brianderson): The retire fence is incorrectly passed in as the
1288 // present fence. Fix this if this file lives on.
Robert Carr2047fae2016-11-28 14:09:09 -08001289 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson4e606e32017-03-16 15:34:57 -07001290 retireFenceTime, compositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001291 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001292 recordBufferingStats(layer->getName().string(),
1293 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001294 }
Robert Carr2047fae2016-11-28 14:09:09 -08001295 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001296
Brian Anderson4e606e32017-03-16 15:34:57 -07001297 if (retireFence->isValid()) {
1298 if (mPrimaryDispSync.addPresentFence(retireFence)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001299 enableHardwareVsync();
1300 } else {
1301 disableHardwareVsync(false);
1302 }
1303 }
1304
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08001305 if (!hasSyncFramework) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001306 if (hw->isDisplayOn()) {
1307 enableHardwareVsync();
1308 }
1309 }
1310
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001311 if (mAnimCompositionPending) {
1312 mAnimCompositionPending = false;
1313
Brian Anderson3d4039d2016-09-23 16:31:30 -07001314 if (retireFenceTime->isValid()) {
1315 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001316 } else {
1317 // The HWC doesn't support present fences, so use the refresh
1318 // timestamp instead.
1319 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1320 mAnimFrameTracker.setActualPresentTime(presentTime);
1321 }
1322 mAnimFrameTracker.advanceFrame();
1323 }
1324
1325 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1326 return;
1327 }
1328
1329 nsecs_t currentTime = systemTime();
1330 if (mHasPoweredOff) {
1331 mHasPoweredOff = false;
1332 } else {
1333 nsecs_t period = mPrimaryDispSync.getPeriod();
1334 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1335 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1336 if (numPeriods < NUM_BUCKETS - 1) {
1337 mFrameBuckets[numPeriods] += elapsedTime;
1338 } else {
1339 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1340 }
1341 mTotalTime += elapsedTime;
1342 }
1343 mLastSwapTime = currentTime;
1344}
1345
1346void SurfaceFlinger::rebuildLayerStacks() {
1347 // rebuild the visible layer list per screen
1348 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1349 ATRACE_CALL();
1350 mVisibleRegionsDirty = false;
1351 invalidateHwcGeometry();
1352
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001353 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1354 Region opaqueRegion;
1355 Region dirtyRegion;
1356 Vector< sp<Layer> > layersSortedByZ;
1357 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1358 const Transform& tr(hw->getTransform());
1359 const Rect bounds(hw->getBounds());
1360 if (hw->isDisplayOn()) {
Robert Carr2047fae2016-11-28 14:09:09 -08001361 computeVisibleRegions(hw->getLayerStack(), dirtyRegion,
1362 opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001363
Robert Carr2047fae2016-11-28 14:09:09 -08001364 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001365 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001366 Region drawRegion(tr.transform(
1367 layer->visibleNonTransparentRegion));
1368 drawRegion.andSelf(bounds);
1369 if (!drawRegion.isEmpty()) {
1370 layersSortedByZ.add(layer);
1371 }
1372 }
Robert Carr2047fae2016-11-28 14:09:09 -08001373 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001374 }
1375 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1376 hw->undefinedRegion.set(bounds);
1377 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1378 hw->dirtyRegion.orSelf(dirtyRegion);
1379 }
1380 }
1381}
1382
1383void SurfaceFlinger::setUpHWComposer() {
1384 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1385 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1386 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1387 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1388
1389 // If nothing has changed (!dirty), don't recompose.
1390 // If something changed, but we don't currently have any visible layers,
1391 // and didn't when we last did a composition, then skip it this time.
1392 // The second rule does two things:
1393 // - When all layers are removed from a display, we'll emit one black
1394 // frame, then nothing more until we get new layers.
1395 // - When a display is created with a private layer stack, we won't
1396 // emit any black frames until a layer is added to the layer stack.
1397 bool mustRecompose = dirty && !(empty && wasEmpty);
1398
1399 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1400 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1401 mustRecompose ? "doing" : "skipping",
1402 dirty ? "+" : "-",
1403 empty ? "+" : "-",
1404 wasEmpty ? "+" : "-");
1405
1406 mDisplays[dpy]->beginFrame(mustRecompose);
1407
1408 if (mustRecompose) {
1409 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1410 }
1411 }
1412
1413 HWComposer& hwc(getHwComposer());
1414 if (hwc.initCheck() == NO_ERROR) {
1415 // build the h/w work list
1416 if (CC_UNLIKELY(mHwWorkListDirty)) {
1417 mHwWorkListDirty = false;
1418 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1419 sp<const DisplayDevice> hw(mDisplays[dpy]);
1420 const int32_t id = hw->getHwcDisplayId();
1421 if (id >= 0) {
1422 const Vector< sp<Layer> >& currentLayers(
1423 hw->getVisibleLayersSortedByZ());
1424 const size_t count = currentLayers.size();
1425 if (hwc.createWorkList(id, count) == NO_ERROR) {
1426 HWComposer::LayerListIterator cur = hwc.begin(id);
1427 const HWComposer::LayerListIterator end = hwc.end(id);
1428 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1429 const sp<Layer>& layer(currentLayers[i]);
1430 layer->setGeometry(hw, *cur);
1431 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1432 cur->setSkip(true);
1433 }
1434 }
1435 }
1436 }
1437 }
1438 }
1439
1440 // set the per-frame data
1441 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1442 sp<const DisplayDevice> hw(mDisplays[dpy]);
1443 const int32_t id = hw->getHwcDisplayId();
1444 if (id >= 0) {
1445 const Vector< sp<Layer> >& currentLayers(
1446 hw->getVisibleLayersSortedByZ());
1447 const size_t count = currentLayers.size();
1448 HWComposer::LayerListIterator cur = hwc.begin(id);
1449 const HWComposer::LayerListIterator end = hwc.end(id);
1450 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1451 /*
1452 * update the per-frame h/w composer data for each layer
1453 * and build the transparent region of the FB
1454 */
1455 const sp<Layer>& layer(currentLayers[i]);
1456 layer->setPerFrameData(hw, *cur);
1457 }
1458 }
1459 }
1460
1461 // If possible, attempt to use the cursor overlay on each display.
1462 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1463 sp<const DisplayDevice> hw(mDisplays[dpy]);
1464 const int32_t id = hw->getHwcDisplayId();
1465 if (id >= 0) {
1466 const Vector< sp<Layer> >& currentLayers(
1467 hw->getVisibleLayersSortedByZ());
1468 const size_t count = currentLayers.size();
1469 HWComposer::LayerListIterator cur = hwc.begin(id);
1470 const HWComposer::LayerListIterator end = hwc.end(id);
1471 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1472 const sp<Layer>& layer(currentLayers[i]);
1473 if (layer->isPotentialCursor()) {
1474 cur->setIsCursorLayerHint();
1475 break;
1476 }
1477 }
1478 }
1479 }
1480
1481 status_t err = hwc.prepare();
1482 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1483
1484 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1485 sp<const DisplayDevice> hw(mDisplays[dpy]);
1486 hw->prepareFrame(hwc);
1487 }
1488 }
1489}
1490
1491void SurfaceFlinger::doComposition() {
1492 ATRACE_CALL();
1493 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1494 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1495 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1496 if (hw->isDisplayOn()) {
1497 // transform the dirty region into this screen's coordinate space
1498 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1499
1500 // repaint the framebuffer (if needed)
1501 doDisplayComposition(hw, dirtyRegion);
1502
1503 hw->dirtyRegion.clear();
1504 hw->flip(hw->swapRegion);
1505 hw->swapRegion.clear();
1506 }
1507 // inform the h/w that we're done compositing
1508 hw->compositionComplete();
1509 }
1510 postFramebuffer();
1511}
1512
1513void SurfaceFlinger::postFramebuffer()
1514{
1515 ATRACE_CALL();
1516
1517 const nsecs_t now = systemTime();
1518 mDebugInSwapBuffers = now;
1519
1520 HWComposer& hwc(getHwComposer());
1521 if (hwc.initCheck() == NO_ERROR) {
1522 if (!hwc.supportsFramebufferTarget()) {
1523 // EGL spec says:
1524 // "surface must be bound to the calling thread's current context,
1525 // for the current rendering API."
1526 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1527 }
1528 hwc.commit();
1529 }
1530
1531 // make the default display current because the VirtualDisplayDevice code cannot
1532 // deal with dequeueBuffer() being called outside of the composition loop; however
1533 // the code below can call glFlush() which is allowed (and does in some case) call
1534 // dequeueBuffer().
1535 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1536
1537 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1538 sp<const DisplayDevice> hw(mDisplays[dpy]);
1539 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1540 hw->onSwapBuffersCompleted(hwc);
1541 const size_t count = currentLayers.size();
1542 int32_t id = hw->getHwcDisplayId();
1543 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1544 HWComposer::LayerListIterator cur = hwc.begin(id);
1545 const HWComposer::LayerListIterator end = hwc.end(id);
1546 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1547 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1548 }
1549 } else {
1550 for (size_t i = 0; i < count; i++) {
1551 currentLayers[i]->onLayerDisplayed(hw, NULL);
1552 }
1553 }
1554 }
1555
1556 mLastSwapBufferTime = systemTime() - now;
1557 mDebugInSwapBuffers = 0;
1558
1559 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1560 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1561 logFrameStats();
1562 }
1563}
1564
1565void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1566{
1567 ATRACE_CALL();
1568
1569 // here we keep a copy of the drawing state (that is the state that's
1570 // going to be overwritten by handleTransactionLocked()) outside of
1571 // mStateLock so that the side-effects of the State assignment
1572 // don't happen with mStateLock held (which can cause deadlocks).
1573 State drawingState(mDrawingState);
1574
1575 Mutex::Autolock _l(mStateLock);
1576 const nsecs_t now = systemTime();
1577 mDebugInTransaction = now;
1578
1579 // Here we're guaranteed that some transaction flags are set
1580 // so we can call handleTransactionLocked() unconditionally.
1581 // We call getTransactionFlags(), which will also clear the flags,
1582 // with mStateLock held to guarantee that mCurrentState won't change
1583 // until the transaction is committed.
1584
1585 transactionFlags = getTransactionFlags(eTransactionMask);
1586 handleTransactionLocked(transactionFlags);
1587
1588 mLastTransactionTime = systemTime() - now;
1589 mDebugInTransaction = 0;
1590 invalidateHwcGeometry();
1591 // here the transaction has been committed
1592}
1593
1594void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1595{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001596 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001597 mCurrentState.traverseInZOrder([](Layer* layer) {
1598 layer->notifyAvailableFrames();
1599 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001600
1601 /*
1602 * Traversal of the children
1603 * (perform the transaction for each of them if needed)
1604 */
1605
1606 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001607 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001608 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001609 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001610
1611 const uint32_t flags = layer->doTransaction(0);
1612 if (flags & Layer::eVisibleRegion)
1613 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001614 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001615 }
1616
1617 /*
1618 * Perform display own transactions if needed
1619 */
1620
1621 if (transactionFlags & eDisplayTransactionNeeded) {
1622 // here we take advantage of Vector's copy-on-write semantics to
1623 // improve performance by skipping the transaction entirely when
1624 // know that the lists are identical
1625 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1626 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1627 if (!curr.isIdenticalTo(draw)) {
1628 mVisibleRegionsDirty = true;
1629 const size_t cc = curr.size();
1630 size_t dc = draw.size();
1631
1632 // find the displays that were removed
1633 // (ie: in drawing state but not in current state)
1634 // also handle displays that changed
1635 // (ie: displays that are in both lists)
1636 for (size_t i=0 ; i<dc ; i++) {
1637 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1638 if (j < 0) {
1639 // in drawing state but not in current state
1640 if (!draw[i].isMainDisplay()) {
1641 // Call makeCurrent() on the primary display so we can
1642 // be sure that nothing associated with this display
1643 // is current.
1644 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1645 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1646 sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1647 if (hw != NULL)
1648 hw->disconnect(getHwComposer());
1649 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1650 mEventThread->onHotplugReceived(draw[i].type, false);
1651 mDisplays.removeItem(draw.keyAt(i));
1652 } else {
1653 ALOGW("trying to remove the main display");
1654 }
1655 } else {
1656 // this display is in both lists. see if something changed.
1657 const DisplayDeviceState& state(curr[j]);
1658 const wp<IBinder>& display(curr.keyAt(j));
1659 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1660 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1661 if (state_binder != draw_binder) {
1662 // changing the surface is like destroying and
1663 // recreating the DisplayDevice, so we just remove it
1664 // from the drawing state, so that it get re-added
1665 // below.
1666 sp<DisplayDevice> hw(getDisplayDevice(display));
1667 if (hw != NULL)
1668 hw->disconnect(getHwComposer());
1669 mDisplays.removeItem(display);
1670 mDrawingState.displays.removeItemsAt(i);
1671 dc--; i--;
1672 // at this point we must loop to the next item
1673 continue;
1674 }
1675
1676 const sp<DisplayDevice> disp(getDisplayDevice(display));
1677 if (disp != NULL) {
1678 if (state.layerStack != draw[i].layerStack) {
1679 disp->setLayerStack(state.layerStack);
1680 }
1681 if ((state.orientation != draw[i].orientation)
1682 || (state.viewport != draw[i].viewport)
1683 || (state.frame != draw[i].frame))
1684 {
1685 disp->setProjection(state.orientation,
1686 state.viewport, state.frame);
1687 }
1688 if (state.width != draw[i].width || state.height != draw[i].height) {
1689 disp->setDisplaySize(state.width, state.height);
1690 }
1691 }
1692 }
1693 }
1694
1695 // find displays that were added
1696 // (ie: in current state but not in drawing state)
1697 for (size_t i=0 ; i<cc ; i++) {
1698 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1699 const DisplayDeviceState& state(curr[i]);
1700
1701 sp<DisplaySurface> dispSurface;
1702 sp<IGraphicBufferProducer> producer;
1703 sp<IGraphicBufferProducer> bqProducer;
1704 sp<IGraphicBufferConsumer> bqConsumer;
Romain Guyf8b4ca52017-03-16 18:39:20 +00001705 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer,
1706 new GraphicBufferAlloc());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001707
1708 int32_t hwcDisplayId = -1;
1709 if (state.isVirtualDisplay()) {
1710 // Virtual displays without a surface are dormant:
1711 // they have external state (layer stack, projection,
1712 // etc.) but no internal state (i.e. a DisplayDevice).
1713 if (state.surface != NULL) {
1714
1715 int width = 0;
1716 int status = state.surface->query(
1717 NATIVE_WINDOW_WIDTH, &width);
1718 ALOGE_IF(status != NO_ERROR,
1719 "Unable to query width (%d)", status);
1720 int height = 0;
1721 status = state.surface->query(
1722 NATIVE_WINDOW_HEIGHT, &height);
1723 ALOGE_IF(status != NO_ERROR,
1724 "Unable to query height (%d)", status);
1725 if (mUseHwcVirtualDisplays &&
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08001726 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1727 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1728 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001729 hwcDisplayId = allocateHwcDisplayId(state.type);
1730 }
1731
1732 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1733 *mHwc, hwcDisplayId, state.surface,
1734 bqProducer, bqConsumer, state.displayName);
1735
1736 dispSurface = vds;
1737 producer = vds;
1738 }
1739 } else {
1740 ALOGE_IF(state.surface!=NULL,
1741 "adding a supported display, but rendering "
1742 "surface is provided (%p), ignoring it",
1743 state.surface.get());
1744 hwcDisplayId = allocateHwcDisplayId(state.type);
1745 // for supported (by hwc) displays we provide our
1746 // own rendering surface
1747 dispSurface = new FramebufferSurface(*mHwc, state.type,
1748 bqConsumer);
1749 producer = bqProducer;
1750 }
1751
1752 const wp<IBinder>& display(curr.keyAt(i));
1753 if (dispSurface != NULL) {
1754 sp<DisplayDevice> hw = new DisplayDevice(this,
1755 state.type, hwcDisplayId,
1756 mHwc->getFormat(hwcDisplayId), state.isSecure,
1757 display, dispSurface, producer,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -06001758 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001759 hw->setLayerStack(state.layerStack);
1760 hw->setProjection(state.orientation,
1761 state.viewport, state.frame);
1762 hw->setDisplayName(state.displayName);
1763 mDisplays.add(display, hw);
1764 if (state.isVirtualDisplay()) {
1765 if (hwcDisplayId >= 0) {
1766 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1767 hw->getWidth(), hw->getHeight(),
1768 hw->getFormat());
1769 }
1770 } else {
1771 mEventThread->onHotplugReceived(state.type, true);
1772 }
1773 }
1774 }
1775 }
1776 }
1777 }
1778
1779 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1780 // The transform hint might have changed for some layers
1781 // (either because a display has changed, or because a layer
1782 // as changed).
1783 //
1784 // Walk through all the layers in currentLayers,
1785 // and update their transform hint.
1786 //
1787 // If a layer is visible only on a single display, then that
1788 // display is used to calculate the hint, otherwise we use the
1789 // default display.
1790 //
1791 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1792 // the hint is set before we acquire a buffer from the surface texture.
1793 //
1794 // NOTE: layer transactions have taken place already, so we use their
1795 // drawing state. However, SurfaceFlinger's own transaction has not
1796 // happened yet, so we must use the current state layer list
1797 // (soon to become the drawing state list).
1798 //
1799 sp<const DisplayDevice> disp;
1800 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001801 bool first = true;
1802 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001803 // NOTE: we rely on the fact that layers are sorted by
1804 // layerStack first (so we don't have to traverse the list
1805 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001806 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001807 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001808 currentlayerStack = layerStack;
1809 // figure out if this layerstack is mirrored
1810 // (more than one display) if so, pick the default display,
1811 // if not, pick the only display it's on.
1812 disp.clear();
1813 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1814 sp<const DisplayDevice> hw(mDisplays[dpy]);
1815 if (hw->getLayerStack() == currentlayerStack) {
1816 if (disp == NULL) {
1817 disp = hw;
1818 } else {
1819 disp = NULL;
1820 break;
1821 }
1822 }
1823 }
1824 }
1825 if (disp == NULL) {
1826 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1827 // redraw after transform hint changes. See bug 8508397.
1828
1829 // could be null when this layer is using a layerStack
1830 // that is not visible on any display. Also can occur at
1831 // screen off/on times.
1832 disp = getDefaultDisplayDevice();
1833 }
1834 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001835
1836 first = false;
1837 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001838 }
1839
1840
1841 /*
1842 * Perform our own transaction if needed
1843 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001844
1845 if (mLayersAdded) {
1846 mLayersAdded = false;
1847 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001848 mVisibleRegionsDirty = true;
1849 }
1850
1851 // some layers might have been removed, so
1852 // we need to update the regions they're exposing.
1853 if (mLayersRemoved) {
1854 mLayersRemoved = false;
1855 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001856 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001857 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001858 // this layer is not visible anymore
1859 // TODO: we could traverse the tree from front to back and
1860 // compute the actual visible region
1861 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001862 Region visibleReg;
1863 visibleReg.set(layer->computeScreenBounds());
1864 invalidateLayerStack(layer->getLayerStack(), visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001865 }
Robert Carr2047fae2016-11-28 14:09:09 -08001866 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001867 }
1868
1869 commitTransaction();
1870
1871 updateCursorAsync();
1872}
1873
1874void SurfaceFlinger::updateCursorAsync()
1875{
1876 HWComposer& hwc(getHwComposer());
1877 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1878 sp<const DisplayDevice> hw(mDisplays[dpy]);
1879 const int32_t id = hw->getHwcDisplayId();
1880 if (id < 0) {
1881 continue;
1882 }
1883 const Vector< sp<Layer> >& currentLayers(
1884 hw->getVisibleLayersSortedByZ());
1885 const size_t count = currentLayers.size();
1886 HWComposer::LayerListIterator cur = hwc.begin(id);
1887 const HWComposer::LayerListIterator end = hwc.end(id);
1888 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1889 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1890 continue;
1891 }
1892 const sp<Layer>& layer(currentLayers[i]);
1893 Rect cursorPos = layer->getPosition(hw);
1894 hwc.setCursorPositionAsync(id, cursorPos);
1895 break;
1896 }
1897 }
1898}
1899
1900void SurfaceFlinger::commitTransaction()
1901{
1902 if (!mLayersPendingRemoval.isEmpty()) {
1903 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001904 for (const auto& l : mLayersPendingRemoval) {
1905 recordBufferingStats(l->getName().string(),
1906 l->getOccupancyHistory(true));
1907 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001908 }
1909 mLayersPendingRemoval.clear();
1910 }
1911
1912 // If this transaction is part of a window animation then the next frame
1913 // we composite should be considered an animation as well.
1914 mAnimCompositionPending = mAnimTransactionPending;
1915
1916 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001917 mDrawingState.traverseInZOrder([](Layer* layer) {
1918 layer->commitChildList();
1919 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001920 mTransactionPending = false;
1921 mAnimTransactionPending = false;
1922 mTransactionCV.broadcast();
1923}
1924
Robert Carr2047fae2016-11-28 14:09:09 -08001925void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001926 Region& outDirtyRegion, Region& outOpaqueRegion)
1927{
1928 ATRACE_CALL();
1929
1930 Region aboveOpaqueLayers;
1931 Region aboveCoveredLayers;
1932 Region dirty;
1933
1934 outDirtyRegion.clear();
1935
Robert Carr2047fae2016-11-28 14:09:09 -08001936 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001937 // start with the whole surface at its current location
1938 const Layer::State& s(layer->getDrawingState());
1939
1940 // only consider the layers on the given layer stack
Robert Carr1f0a16a2016-10-24 16:27:39 -07001941 if (layer->getLayerStack() != layerStack)
Robert Carr2047fae2016-11-28 14:09:09 -08001942 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001943
1944 /*
1945 * opaqueRegion: area of a surface that is fully opaque.
1946 */
1947 Region opaqueRegion;
1948
1949 /*
1950 * visibleRegion: area of a surface that is visible on screen
1951 * and not fully transparent. This is essentially the layer's
1952 * footprint minus the opaque regions above it.
1953 * Areas covered by a translucent surface are considered visible.
1954 */
1955 Region visibleRegion;
1956
1957 /*
1958 * coveredRegion: area of a surface that is covered by all
1959 * visible regions above it (which includes the translucent areas).
1960 */
1961 Region coveredRegion;
1962
1963 /*
1964 * transparentRegion: area of a surface that is hinted to be completely
1965 * transparent. This is only used to tell when the layer has no visible
1966 * non-transparent regions and can be removed from the layer list. It
1967 * does not affect the visibleRegion of this layer or any layers
1968 * beneath it. The hint may not be correct if apps don't respect the
1969 * SurfaceView restrictions (which, sadly, some don't).
1970 */
1971 Region transparentRegion;
1972
1973
1974 // handle hidden surfaces by setting the visible region to empty
1975 if (CC_LIKELY(layer->isVisible())) {
1976 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001977 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001978 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001979 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001980 if (!visibleRegion.isEmpty()) {
1981 // Remove the transparent area from the visible region
1982 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001983 if (tr.preserveRects()) {
1984 // transform the transparent region
1985 transparentRegion = tr.transform(s.activeTransparentRegion);
1986 } else {
1987 // transformation too complex, can't do the
1988 // transparent region optimization.
1989 transparentRegion.clear();
1990 }
1991 }
1992
1993 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001994 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001995 if (s.alpha==255 && !translucent &&
1996 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1997 // the opaque region is the layer's footprint
1998 opaqueRegion = visibleRegion;
1999 }
2000 }
2001 }
2002
2003 // Clip the covered region to the visible region
2004 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2005
2006 // Update aboveCoveredLayers for next (lower) layer
2007 aboveCoveredLayers.orSelf(visibleRegion);
2008
2009 // subtract the opaque region covered by the layers above us
2010 visibleRegion.subtractSelf(aboveOpaqueLayers);
2011
2012 // compute this layer's dirty region
2013 if (layer->contentDirty) {
2014 // we need to invalidate the whole region
2015 dirty = visibleRegion;
2016 // as well, as the old visible region
2017 dirty.orSelf(layer->visibleRegion);
2018 layer->contentDirty = false;
2019 } else {
2020 /* compute the exposed region:
2021 * the exposed region consists of two components:
2022 * 1) what's VISIBLE now and was COVERED before
2023 * 2) what's EXPOSED now less what was EXPOSED before
2024 *
2025 * note that (1) is conservative, we start with the whole
2026 * visible region but only keep what used to be covered by
2027 * something -- which mean it may have been exposed.
2028 *
2029 * (2) handles areas that were not covered by anything but got
2030 * exposed because of a resize.
2031 */
2032 const Region newExposed = visibleRegion - coveredRegion;
2033 const Region oldVisibleRegion = layer->visibleRegion;
2034 const Region oldCoveredRegion = layer->coveredRegion;
2035 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2036 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2037 }
2038 dirty.subtractSelf(aboveOpaqueLayers);
2039
2040 // accumulate to the screen dirty region
2041 outDirtyRegion.orSelf(dirty);
2042
2043 // Update aboveOpaqueLayers for next (lower) layer
2044 aboveOpaqueLayers.orSelf(opaqueRegion);
2045
2046 // Store the visible region in screen space
2047 layer->setVisibleRegion(visibleRegion);
2048 layer->setCoveredRegion(coveredRegion);
2049 layer->setVisibleNonTransparentRegion(
2050 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002051 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002052
2053 outOpaqueRegion = aboveOpaqueLayers;
2054}
2055
2056void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2057 const Region& dirty) {
2058 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2059 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2060 if (hw->getLayerStack() == layerStack) {
2061 hw->dirtyRegion.orSelf(dirty);
2062 }
2063 }
2064}
2065
2066bool SurfaceFlinger::handlePageFlip()
2067{
Brian Andersond6927fb2016-07-23 23:37:30 -07002068 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002069 Region dirtyRegion;
2070
2071 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002072 bool frameQueued = false;
2073
2074 // Store the set of layers that need updates. This set must not change as
2075 // buffers are being latched, as this could result in a deadlock.
2076 // Example: Two producers share the same command stream and:
2077 // 1.) Layer 0 is latched
2078 // 2.) Layer 0 gets a new frame
2079 // 2.) Layer 1 gets a new frame
2080 // 3.) Layer 1 is latched.
2081 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2082 // second frame. But layer 0's second frame could be waiting on display.
2083 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002084 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002085 if (layer->hasQueuedFrame()) {
2086 frameQueued = true;
2087 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002088 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002089 } else {
2090 layer->useEmptyDamage();
2091 }
2092 } else {
2093 layer->useEmptyDamage();
2094 }
Robert Carr2047fae2016-11-28 14:09:09 -08002095 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002096 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2097 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002098 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002099 layer->useSurfaceDamage();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002100 invalidateLayerStack(layer->getLayerStack(), dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002101 }
2102
2103 mVisibleRegionsDirty |= visibleRegions;
2104
2105 // If we will need to wake up at some time in the future to deal with a
2106 // queued frame that shouldn't be displayed during this vsync period, wake
2107 // up during the next vsync period to check again.
2108 if (frameQueued && layersWithQueuedFrames.empty()) {
2109 signalLayerUpdate();
2110 }
2111
2112 // Only continue with the refresh if there is actually new work to do
2113 return !layersWithQueuedFrames.empty();
2114}
2115
2116void SurfaceFlinger::invalidateHwcGeometry()
2117{
2118 mHwWorkListDirty = true;
2119}
2120
2121
2122void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2123 const Region& inDirtyRegion)
2124{
2125 // We only need to actually compose the display if:
2126 // 1) It is being handled by hardware composer, which may need this to
2127 // keep its virtual display state machine in sync, or
2128 // 2) There is work to be done (the dirty region isn't empty)
2129 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2130 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2131 return;
2132 }
2133
2134 Region dirtyRegion(inDirtyRegion);
2135
2136 // compute the invalid region
2137 hw->swapRegion.orSelf(dirtyRegion);
2138
2139 uint32_t flags = hw->getFlags();
2140 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2141 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2142 // takes a rectangle, we must make sure to update that whole
2143 // rectangle in that case
2144 dirtyRegion.set(hw->swapRegion.bounds());
2145 } else {
2146 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2147 // We need to redraw the rectangle that will be updated
2148 // (pushed to the framebuffer).
2149 // This is needed because PARTIAL_UPDATES only takes one
2150 // rectangle instead of a region (see DisplayDevice::flip())
2151 dirtyRegion.set(hw->swapRegion.bounds());
2152 } else {
2153 // we need to redraw everything (the whole screen)
2154 dirtyRegion.set(hw->bounds());
2155 hw->swapRegion = dirtyRegion;
2156 }
2157 }
2158
2159 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2160 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2161 } else {
2162 RenderEngine& engine(getRenderEngine());
2163 mat4 colorMatrix = mColorMatrix;
2164 if (mDaltonize) {
2165 colorMatrix = colorMatrix * mDaltonizer();
2166 }
2167 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2168 doComposeSurfaces(hw, dirtyRegion);
2169 engine.setupColorTransform(oldMatrix);
2170 }
2171
2172 // update the swap region and clear the dirty region
2173 hw->swapRegion.orSelf(dirtyRegion);
2174
2175 // swap buffers (presentation)
2176 hw->swapBuffers(getHwComposer());
2177}
2178
2179bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2180{
2181 RenderEngine& engine(getRenderEngine());
2182 const int32_t id = hw->getHwcDisplayId();
2183 HWComposer& hwc(getHwComposer());
2184 HWComposer::LayerListIterator cur = hwc.begin(id);
2185 const HWComposer::LayerListIterator end = hwc.end(id);
2186
2187 bool hasGlesComposition = hwc.hasGlesComposition(id);
2188 if (hasGlesComposition) {
2189 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2190 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2191 hw->getDisplayName().string());
2192 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2193 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2194 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2195 }
2196 return false;
2197 }
2198
2199 // Never touch the framebuffer if we don't have any framebuffer layers
2200 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2201 if (hasHwcComposition) {
2202 // when using overlays, we assume a fully transparent framebuffer
2203 // NOTE: we could reduce how much we need to clear, for instance
2204 // remove where there are opaque FB layers. however, on some
2205 // GPUs doing a "clean slate" clear might be more efficient.
2206 // We'll revisit later if needed.
2207 engine.clearWithColor(0, 0, 0, 0);
2208 } else {
2209 // we start with the whole screen area
2210 const Region bounds(hw->getBounds());
2211
2212 // we remove the scissor part
2213 // we're left with the letterbox region
2214 // (common case is that letterbox ends-up being empty)
2215 const Region letterbox(bounds.subtract(hw->getScissor()));
2216
2217 // compute the area to clear
2218 Region region(hw->undefinedRegion.merge(letterbox));
2219
2220 // but limit it to the dirty region
2221 region.andSelf(dirty);
2222
2223 // screen is already cleared here
2224 if (!region.isEmpty()) {
2225 // can happen with SurfaceView
2226 drawWormhole(hw, region);
2227 }
2228 }
2229
2230 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2231 // just to be on the safe side, we don't set the
2232 // scissor on the main display. It should never be needed
2233 // anyways (though in theory it could since the API allows it).
2234 const Rect& bounds(hw->getBounds());
2235 const Rect& scissor(hw->getScissor());
2236 if (scissor != bounds) {
2237 // scissor doesn't match the screen's dimensions, so we
2238 // need to clear everything outside of it and enable
2239 // the GL scissor so we don't draw anything where we shouldn't
2240
2241 // enable scissor for this frame
2242 const uint32_t height = hw->getHeight();
2243 engine.setScissor(scissor.left, height - scissor.bottom,
2244 scissor.getWidth(), scissor.getHeight());
2245 }
2246 }
2247 }
2248
2249 /*
2250 * and then, render the layers targeted at the framebuffer
2251 */
2252
2253 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2254 const size_t count = layers.size();
2255 const Transform& tr = hw->getTransform();
2256 if (cur != end) {
2257 // we're using h/w composer
2258 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2259 const sp<Layer>& layer(layers[i]);
2260 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2261 if (!clip.isEmpty()) {
2262 switch (cur->getCompositionType()) {
2263 case HWC_CURSOR_OVERLAY:
2264 case HWC_OVERLAY: {
2265 const Layer::State& state(layer->getDrawingState());
2266 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2267 && i
2268 && layer->isOpaque(state) && (state.alpha == 0xFF)
2269 && hasGlesComposition) {
2270 // never clear the very first layer since we're
2271 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002272 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002273 }
2274 break;
2275 }
2276 case HWC_FRAMEBUFFER: {
2277 layer->draw(hw, clip);
2278 break;
2279 }
2280 case HWC_FRAMEBUFFER_TARGET: {
2281 // this should not happen as the iterator shouldn't
2282 // let us get there.
2283 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2284 break;
2285 }
2286 }
2287 }
2288 layer->setAcquireFence(hw, *cur);
2289 }
2290 } else {
2291 // we're not using h/w composer
2292 for (size_t i=0 ; i<count ; ++i) {
2293 const sp<Layer>& layer(layers[i]);
2294 const Region clip(dirty.intersect(
2295 tr.transform(layer->visibleRegion)));
2296 if (!clip.isEmpty()) {
2297 layer->draw(hw, clip);
2298 }
2299 }
2300 }
2301
2302 // disable scissor at the end of the frame
2303 engine.disableScissor();
2304 return true;
2305}
2306
2307void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2308 const int32_t height = hw->getHeight();
2309 RenderEngine& engine(getRenderEngine());
2310 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2311}
2312
2313status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2314 const sp<IBinder>& handle,
2315 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002316 const sp<Layer>& lbc,
2317 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002318{
2319 // add this layer to the current state list
2320 {
2321 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002322 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002323 return NO_MEMORY;
2324 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002325 if (parent == nullptr) {
2326 mCurrentState.layersSortedByZ.add(lbc);
2327 } else {
2328 parent->addChild(lbc);
2329 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002330 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002331 mLayersAdded = true;
2332 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002333 }
2334
2335 // attach this layer to the client
2336 client->attachLayer(handle, lbc);
2337
2338 return NO_ERROR;
2339}
2340
Robert Carr9524cb32017-02-13 11:32:32 -08002341status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002342 Mutex::Autolock _l(mStateLock);
2343
Robert Carr1f0a16a2016-10-24 16:27:39 -07002344 const auto& p = layer->getParent();
2345 const ssize_t index = (p != nullptr) ? p->removeChild(layer) :
2346 mCurrentState.layersSortedByZ.remove(layer);
2347
Robert Carr136e2f62017-02-08 17:54:29 -08002348 // As a matter of normal operation, the LayerCleaner will produce a second
2349 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2350 // so we will succeed in promoting it, but it's already been removed
2351 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2352 // otherwise something has gone wrong and we are leaking the layer.
2353 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002354 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2355 layer->getName().string(),
2356 (p != nullptr) ? p->getName().string() : "no-parent");
2357 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002358 } else if (index < 0) {
2359 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002360 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002361
2362 mLayersPendingRemoval.add(layer);
2363 mLayersRemoved = true;
2364 mNumLayers--;
2365 setTransactionFlags(eTransactionNeeded);
2366 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002367}
2368
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002369uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002370 return android_atomic_release_load(&mTransactionFlags);
2371}
2372
2373uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2374 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2375}
2376
2377uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2378 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2379 if ((old & flags)==0) { // wake the server up
2380 signalTransaction();
2381 }
2382 return old;
2383}
2384
2385void SurfaceFlinger::setTransactionState(
2386 const Vector<ComposerState>& state,
2387 const Vector<DisplayState>& displays,
2388 uint32_t flags)
2389{
2390 ATRACE_CALL();
2391 Mutex::Autolock _l(mStateLock);
2392 uint32_t transactionFlags = 0;
2393
2394 if (flags & eAnimation) {
2395 // For window updates that are part of an animation we must wait for
2396 // previous animation "frames" to be handled.
2397 while (mAnimTransactionPending) {
2398 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2399 if (CC_UNLIKELY(err != NO_ERROR)) {
2400 // just in case something goes wrong in SF, return to the
2401 // caller after a few seconds.
2402 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2403 "waiting for previous animation frame");
2404 mAnimTransactionPending = false;
2405 break;
2406 }
2407 }
2408 }
2409
2410 size_t count = displays.size();
2411 for (size_t i=0 ; i<count ; i++) {
2412 const DisplayState& s(displays[i]);
2413 transactionFlags |= setDisplayStateLocked(s);
2414 }
2415
2416 count = state.size();
2417 for (size_t i=0 ; i<count ; i++) {
2418 const ComposerState& s(state[i]);
2419 // Here we need to check that the interface we're given is indeed
2420 // one of our own. A malicious client could give us a NULL
2421 // IInterface, or one of its own or even one of our own but a
2422 // different type. All these situations would cause us to crash.
2423 //
2424 // NOTE: it would be better to use RTTI as we could directly check
2425 // that we have a Client*. however, RTTI is disabled in Android.
2426 if (s.client != NULL) {
2427 sp<IBinder> binder = IInterface::asBinder(s.client);
2428 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002429 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002430 sp<Client> client( static_cast<Client *>(s.client.get()) );
2431 transactionFlags |= setClientStateLocked(client, s.state);
2432 }
2433 }
2434 }
2435 }
2436
2437 // If a synchronous transaction is explicitly requested without any changes,
2438 // force a transaction anyway. This can be used as a flush mechanism for
2439 // previous async transactions.
2440 if (transactionFlags == 0 && (flags & eSynchronous)) {
2441 transactionFlags = eTransactionNeeded;
2442 }
2443
2444 if (transactionFlags) {
2445 if (mInterceptor.isEnabled()) {
2446 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2447 }
2448
2449 // this triggers the transaction
2450 setTransactionFlags(transactionFlags);
2451
2452 // if this is a synchronous transaction, wait for it to take effect
2453 // before returning.
2454 if (flags & eSynchronous) {
2455 mTransactionPending = true;
2456 }
2457 if (flags & eAnimation) {
2458 mAnimTransactionPending = true;
2459 }
2460 while (mTransactionPending) {
2461 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2462 if (CC_UNLIKELY(err != NO_ERROR)) {
2463 // just in case something goes wrong in SF, return to the
2464 // called after a few seconds.
2465 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2466 mTransactionPending = false;
2467 break;
2468 }
2469 }
2470 }
2471}
2472
2473uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2474{
2475 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2476 if (dpyIdx < 0)
2477 return 0;
2478
2479 uint32_t flags = 0;
2480 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2481 if (disp.isValid()) {
2482 const uint32_t what = s.what;
2483 if (what & DisplayState::eSurfaceChanged) {
2484 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2485 disp.surface = s.surface;
2486 flags |= eDisplayTransactionNeeded;
2487 }
2488 }
2489 if (what & DisplayState::eLayerStackChanged) {
2490 if (disp.layerStack != s.layerStack) {
2491 disp.layerStack = s.layerStack;
2492 flags |= eDisplayTransactionNeeded;
2493 }
2494 }
2495 if (what & DisplayState::eDisplayProjectionChanged) {
2496 if (disp.orientation != s.orientation) {
2497 disp.orientation = s.orientation;
2498 flags |= eDisplayTransactionNeeded;
2499 }
2500 if (disp.frame != s.frame) {
2501 disp.frame = s.frame;
2502 flags |= eDisplayTransactionNeeded;
2503 }
2504 if (disp.viewport != s.viewport) {
2505 disp.viewport = s.viewport;
2506 flags |= eDisplayTransactionNeeded;
2507 }
2508 }
2509 if (what & DisplayState::eDisplaySizeChanged) {
2510 if (disp.width != s.width) {
2511 disp.width = s.width;
2512 flags |= eDisplayTransactionNeeded;
2513 }
2514 if (disp.height != s.height) {
2515 disp.height = s.height;
2516 flags |= eDisplayTransactionNeeded;
2517 }
2518 }
2519 }
2520 return flags;
2521}
2522
2523uint32_t SurfaceFlinger::setClientStateLocked(
2524 const sp<Client>& client,
2525 const layer_state_t& s)
2526{
2527 uint32_t flags = 0;
2528 sp<Layer> layer(client->getLayerUser(s.surface));
2529 if (layer != 0) {
2530 const uint32_t what = s.what;
2531 bool geometryAppliesWithResize =
2532 what & layer_state_t::eGeometryAppliesWithResize;
2533 if (what & layer_state_t::ePositionChanged) {
2534 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2535 flags |= eTraversalNeeded;
2536 }
2537 }
2538 if (what & layer_state_t::eLayerChanged) {
2539 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002540 const auto& p = layer->getParent();
2541 if (p == nullptr) {
2542 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2543 if (layer->setLayer(s.z) && idx >= 0) {
2544 mCurrentState.layersSortedByZ.removeAt(idx);
2545 mCurrentState.layersSortedByZ.add(layer);
2546 // we need traversal (state changed)
2547 // AND transaction (list changed)
2548 flags |= eTransactionNeeded|eTraversalNeeded;
2549 }
2550 } else {
2551 if (p->setChildLayer(layer, s.z)) {
2552 flags |= eTransactionNeeded|eTraversalNeeded;
2553 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002554 }
2555 }
2556 if (what & layer_state_t::eSizeChanged) {
2557 if (layer->setSize(s.w, s.h)) {
2558 flags |= eTraversalNeeded;
2559 }
2560 }
2561 if (what & layer_state_t::eAlphaChanged) {
2562 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2563 flags |= eTraversalNeeded;
2564 }
2565 if (what & layer_state_t::eMatrixChanged) {
2566 if (layer->setMatrix(s.matrix))
2567 flags |= eTraversalNeeded;
2568 }
2569 if (what & layer_state_t::eTransparentRegionChanged) {
2570 if (layer->setTransparentRegionHint(s.transparentRegion))
2571 flags |= eTraversalNeeded;
2572 }
2573 if (what & layer_state_t::eFlagsChanged) {
2574 if (layer->setFlags(s.flags, s.mask))
2575 flags |= eTraversalNeeded;
2576 }
2577 if (what & layer_state_t::eCropChanged) {
2578 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2579 flags |= eTraversalNeeded;
2580 }
2581 if (what & layer_state_t::eFinalCropChanged) {
Robert Carr6fb9ca72017-03-22 18:23:23 -07002582 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002583 flags |= eTraversalNeeded;
2584 }
2585 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002586 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002587 // We only allow setting layer stacks for top level layers,
2588 // everything else inherits layer stack from its parent.
2589 if (layer->hasParent()) {
2590 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2591 layer->getName().string());
2592 } else if (idx < 0) {
2593 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2594 "that also does not appear in the top level layer list. Something"
2595 " has gone wrong.", layer->getName().string());
2596 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002597 mCurrentState.layersSortedByZ.removeAt(idx);
2598 mCurrentState.layersSortedByZ.add(layer);
2599 // we need traversal (state changed)
2600 // AND transaction (list changed)
2601 flags |= eTransactionNeeded|eTraversalNeeded;
2602 }
2603 }
2604 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002605 if (s.barrierHandle != nullptr) {
2606 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2607 } else if (s.barrierGbp != nullptr) {
2608 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2609 if (authenticateSurfaceTextureLocked(gbp)) {
2610 const auto& otherLayer =
2611 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2612 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2613 } else {
2614 ALOGE("Attempt to defer transaction to to an"
2615 " unrecognized GraphicBufferProducer");
2616 }
2617 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002618 // We don't trigger a traversal here because if no other state is
2619 // changed, we don't want this to cause any more work
2620 }
Robert Carr1db73f62016-12-21 12:58:51 -08002621 if (what & layer_state_t::eReparentChildren) {
2622 if (layer->reparentChildren(s.reparentHandle)) {
2623 flags |= eTransactionNeeded|eTraversalNeeded;
2624 }
2625 }
Robert Carr9524cb32017-02-13 11:32:32 -08002626 if (what & layer_state_t::eDetachChildren) {
2627 layer->detachChildren();
2628 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002629 if (what & layer_state_t::eOverrideScalingModeChanged) {
2630 layer->setOverrideScalingMode(s.overrideScalingMode);
2631 // We don't trigger a traversal here because if no other state is
2632 // changed, we don't want this to cause any more work
2633 }
2634 }
2635 return flags;
2636}
2637
2638status_t SurfaceFlinger::createLayer(
2639 const String8& name,
2640 const sp<Client>& client,
2641 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002642 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2643 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002644{
2645 if (int32_t(w|h) < 0) {
2646 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2647 int(w), int(h));
2648 return BAD_VALUE;
2649 }
2650
2651 status_t result = NO_ERROR;
2652
2653 sp<Layer> layer;
2654
Cody Northropbc755282017-03-31 12:00:08 -06002655 String8 uniqueName = getUniqueLayerName(name);
2656
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002657 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2658 case ISurfaceComposerClient::eFXSurfaceNormal:
2659 result = createNormalLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002660 uniqueName, w, h, flags, format,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002661 handle, gbp, &layer);
2662 break;
2663 case ISurfaceComposerClient::eFXSurfaceDim:
2664 result = createDimLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002665 uniqueName, w, h, flags,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002666 handle, gbp, &layer);
2667 break;
2668 default:
2669 result = BAD_VALUE;
2670 break;
2671 }
2672
2673 if (result != NO_ERROR) {
2674 return result;
2675 }
2676
Albert Chaulk479c60c2017-01-27 14:21:34 -05002677 layer->setInfo(windowType, ownerUid);
2678
Robert Carr1f0a16a2016-10-24 16:27:39 -07002679 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002680 if (result != NO_ERROR) {
2681 return result;
2682 }
2683 mInterceptor.saveSurfaceCreation(layer);
2684
2685 setTransactionFlags(eTransactionNeeded);
2686 return result;
2687}
2688
Cody Northropbc755282017-03-31 12:00:08 -06002689String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
2690{
2691 bool matchFound = true;
2692 uint32_t dupeCounter = 0;
2693
2694 // Tack on our counter whether there is a hit or not, so everyone gets a tag
2695 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
2696
2697 // Loop over layers until we're sure there is no matching name
2698 while (matchFound) {
2699 matchFound = false;
2700 mDrawingState.traverseInZOrder([&](Layer* layer) {
2701 if (layer->getName() == uniqueName) {
2702 matchFound = true;
2703 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
2704 }
2705 });
2706 }
2707
2708 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
2709
2710 return uniqueName;
2711}
2712
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002713status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2714 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2715 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2716{
2717 // initialize the surfaces
2718 switch (format) {
2719 case PIXEL_FORMAT_TRANSPARENT:
2720 case PIXEL_FORMAT_TRANSLUCENT:
2721 format = PIXEL_FORMAT_RGBA_8888;
2722 break;
2723 case PIXEL_FORMAT_OPAQUE:
2724 format = PIXEL_FORMAT_RGBX_8888;
2725 break;
2726 }
2727
2728 *outLayer = new Layer(this, client, name, w, h, flags);
2729 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2730 if (err == NO_ERROR) {
2731 *handle = (*outLayer)->getHandle();
2732 *gbp = (*outLayer)->getProducer();
2733 }
2734
2735 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2736 return err;
2737}
2738
2739status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2740 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2741 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2742{
2743 *outLayer = new LayerDim(this, client, name, w, h, flags);
2744 *handle = (*outLayer)->getHandle();
2745 *gbp = (*outLayer)->getProducer();
2746 return NO_ERROR;
2747}
2748
2749status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2750{
Robert Carr9524cb32017-02-13 11:32:32 -08002751 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002752 status_t err = NO_ERROR;
2753 sp<Layer> l(client->getLayerUser(handle));
2754 if (l != NULL) {
2755 mInterceptor.saveSurfaceDeletion(l);
2756 err = removeLayer(l);
2757 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2758 "error removing layer=%p (%s)", l.get(), strerror(-err));
2759 }
2760 return err;
2761}
2762
2763status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2764{
2765 // called by ~LayerCleaner() when all references to the IBinder (handle)
2766 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002767 sp<Layer> l = layer.promote();
2768 if (l == nullptr) {
2769 // The layer has already been removed, carry on
2770 return NO_ERROR;
2771 } if (l->getParent() != nullptr) {
2772 // If we have a parent, then we can continue to live as long as it does.
2773 return NO_ERROR;
2774 }
2775 return removeLayer(l);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002776}
2777
2778// ---------------------------------------------------------------------------
2779
2780void SurfaceFlinger::onInitializeDisplays() {
2781 // reset screen orientation and use primary layer stack
2782 Vector<ComposerState> state;
2783 Vector<DisplayState> displays;
2784 DisplayState d;
2785 d.what = DisplayState::eDisplayProjectionChanged |
2786 DisplayState::eLayerStackChanged;
2787 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2788 d.layerStack = 0;
2789 d.orientation = DisplayState::eOrientationDefault;
2790 d.frame.makeInvalid();
2791 d.viewport.makeInvalid();
2792 d.width = 0;
2793 d.height = 0;
2794 displays.add(d);
2795 setTransactionState(state, displays, 0);
2796 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2797
2798 const nsecs_t period =
2799 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2800 mAnimFrameTracker.setDisplayRefreshPeriod(period);
Brian Andersond0010582017-03-07 13:20:31 -08002801
2802 // Use phase of 0 since phase is not known.
2803 // Use latency of 0, which will snap to the ideal latency.
2804 setCompositorTimingSnapped(0, period, 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002805}
2806
2807void SurfaceFlinger::initializeDisplays() {
2808 class MessageScreenInitialized : public MessageBase {
2809 SurfaceFlinger* flinger;
2810 public:
2811 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2812 virtual bool handler() {
2813 flinger->onInitializeDisplays();
2814 return true;
2815 }
2816 };
2817 sp<MessageBase> msg = new MessageScreenInitialized(this);
2818 postMessageAsync(msg); // we may be called from main thread, use async message
2819}
2820
2821void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2822 int mode) {
2823 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2824 this);
2825 int32_t type = hw->getDisplayType();
2826 int currentMode = hw->getPowerMode();
2827
2828 if (mode == currentMode) {
2829 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2830 return;
2831 }
2832
2833 hw->setPowerMode(mode);
2834 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2835 ALOGW("Trying to set power mode for virtual display");
2836 return;
2837 }
2838
2839 if (mInterceptor.isEnabled()) {
2840 Mutex::Autolock _l(mStateLock);
2841 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2842 if (idx < 0) {
2843 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2844 return;
2845 }
2846 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2847 }
2848
2849 if (currentMode == HWC_POWER_MODE_OFF) {
2850 // Turn on the display
2851 getHwComposer().setPowerMode(type, mode);
2852 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2853 // FIXME: eventthread only knows about the main display right now
2854 mEventThread->onScreenAcquired();
2855 resyncToHardwareVsync(true);
2856 }
2857
2858 mVisibleRegionsDirty = true;
2859 mHasPoweredOff = true;
2860 repaintEverything();
2861
2862 struct sched_param param = {0};
2863 param.sched_priority = 1;
2864 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2865 ALOGW("Couldn't set SCHED_FIFO on display on");
2866 }
2867 } else if (mode == HWC_POWER_MODE_OFF) {
2868 // Turn off the display
2869 struct sched_param param = {0};
2870 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2871 ALOGW("Couldn't set SCHED_OTHER on display off");
2872 }
2873
2874 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2875 disableHardwareVsync(true); // also cancels any in-progress resync
2876
2877 // FIXME: eventthread only knows about the main display right now
2878 mEventThread->onScreenReleased();
2879 }
2880
2881 getHwComposer().setPowerMode(type, mode);
2882 mVisibleRegionsDirty = true;
2883 // from this point on, SF will stop drawing on this display
2884 } else {
2885 getHwComposer().setPowerMode(type, mode);
2886 }
2887}
2888
2889void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2890 class MessageSetPowerMode: public MessageBase {
2891 SurfaceFlinger& mFlinger;
2892 sp<IBinder> mDisplay;
2893 int mMode;
2894 public:
2895 MessageSetPowerMode(SurfaceFlinger& flinger,
2896 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2897 mDisplay(disp) { mMode = mode; }
2898 virtual bool handler() {
2899 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2900 if (hw == NULL) {
2901 ALOGE("Attempt to set power mode = %d for null display %p",
2902 mMode, mDisplay.get());
2903 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2904 ALOGW("Attempt to set power mode = %d for virtual display",
2905 mMode);
2906 } else {
2907 mFlinger.setPowerModeInternal(hw, mMode);
2908 }
2909 return true;
2910 }
2911 };
2912 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2913 postMessageSync(msg);
2914}
2915
2916// ---------------------------------------------------------------------------
2917
2918status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2919{
2920 String8 result;
2921
2922 IPCThreadState* ipc = IPCThreadState::self();
2923 const int pid = ipc->getCallingPid();
2924 const int uid = ipc->getCallingUid();
2925 if ((uid != AID_SHELL) &&
2926 !PermissionCache::checkPermission(sDump, pid, uid)) {
2927 result.appendFormat("Permission Denial: "
2928 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2929 } else {
2930 // Try to get the main lock, but give up after one second
2931 // (this would indicate SF is stuck, but we want to be able to
2932 // print something in dumpsys).
2933 status_t err = mStateLock.timedLock(s2ns(1));
2934 bool locked = (err == NO_ERROR);
2935 if (!locked) {
2936 result.appendFormat(
2937 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2938 "dumping anyways (no locks held)\n", strerror(-err), err);
2939 }
2940
2941 bool dumpAll = true;
2942 size_t index = 0;
2943 size_t numArgs = args.size();
2944 if (numArgs) {
2945 if ((index < numArgs) &&
2946 (args[index] == String16("--list"))) {
2947 index++;
2948 listLayersLocked(args, index, result);
2949 dumpAll = false;
2950 }
2951
2952 if ((index < numArgs) &&
2953 (args[index] == String16("--latency"))) {
2954 index++;
2955 dumpStatsLocked(args, index, result);
2956 dumpAll = false;
2957 }
2958
2959 if ((index < numArgs) &&
2960 (args[index] == String16("--latency-clear"))) {
2961 index++;
2962 clearStatsLocked(args, index, result);
2963 dumpAll = false;
2964 }
2965
2966 if ((index < numArgs) &&
2967 (args[index] == String16("--dispsync"))) {
2968 index++;
2969 mPrimaryDispSync.dump(result);
2970 dumpAll = false;
2971 }
2972
2973 if ((index < numArgs) &&
2974 (args[index] == String16("--static-screen"))) {
2975 index++;
2976 dumpStaticScreenStats(result);
2977 dumpAll = false;
2978 }
2979
2980 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07002981 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002982 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07002983 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002984 dumpAll = false;
2985 }
2986 }
2987
2988 if (dumpAll) {
2989 dumpAllLocked(args, index, result);
2990 }
2991
2992 if (locked) {
2993 mStateLock.unlock();
2994 }
2995 }
2996 write(fd, result.string(), result.size());
2997 return NO_ERROR;
2998}
2999
3000void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3001 size_t& /* index */, String8& result) const
3002{
Robert Carr2047fae2016-11-28 14:09:09 -08003003 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003004 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08003005 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003006}
3007
3008void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3009 String8& result) const
3010{
3011 String8 name;
3012 if (index < args.size()) {
3013 name = String8(args[index]);
3014 index++;
3015 }
3016
3017 const nsecs_t period =
3018 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3019 result.appendFormat("%" PRId64 "\n", period);
3020
3021 if (name.isEmpty()) {
3022 mAnimFrameTracker.dumpStats(result);
3023 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08003024 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003025 if (name == layer->getName()) {
3026 layer->dumpFrameStats(result);
3027 }
Robert Carr2047fae2016-11-28 14:09:09 -08003028 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003029 }
3030}
3031
3032void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3033 String8& /* result */)
3034{
3035 String8 name;
3036 if (index < args.size()) {
3037 name = String8(args[index]);
3038 index++;
3039 }
3040
Robert Carr2047fae2016-11-28 14:09:09 -08003041 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003042 if (name.isEmpty() || (name == layer->getName())) {
3043 layer->clearFrameStats();
3044 }
Robert Carr2047fae2016-11-28 14:09:09 -08003045 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003046
3047 mAnimFrameTracker.clearStats();
3048}
3049
3050// This should only be called from the main thread. Otherwise it would need
3051// the lock and should use mCurrentState rather than mDrawingState.
3052void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003053 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003054 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003055 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003056
3057 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3058}
3059
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003060void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003061{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003062 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003063 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3064
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003065 if (isLayerTripleBufferingDisabled())
3066 result.append(" DISABLE_TRIPLE_BUFFERING");
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003067
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003068 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003069 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08003070 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08003071 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
Fabien Sanglard1971b632017-03-10 14:50:03 -08003072 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3073 maxFrameBufferAcquiredBuffers);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003074 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003075}
3076
3077void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3078{
3079 result.appendFormat("Static screen stats:\n");
3080 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3081 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3082 float percent = 100.0f *
3083 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3084 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3085 b + 1, bucketTimeSec, percent);
3086 }
3087 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3088 float percent = 100.0f *
3089 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3090 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3091 NUM_BUCKETS - 1, bucketTimeSec, percent);
3092}
3093
Brian Andersond6927fb2016-07-23 23:37:30 -07003094void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3095 result.appendFormat("Layer frame timestamps:\n");
3096
3097 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3098 const size_t count = currentLayers.size();
3099 for (size_t i=0 ; i<count ; i++) {
3100 currentLayers[i]->dumpFrameEvents(result);
3101 }
3102}
3103
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003104void SurfaceFlinger::recordBufferingStats(const char* layerName,
3105 std::vector<OccupancyTracker::Segment>&& history) {
3106 Mutex::Autolock lock(mBufferingStatsMutex);
3107 auto& stats = mBufferingStats[layerName];
3108 for (const auto& segment : history) {
3109 if (!segment.usedThirdBuffer) {
3110 stats.twoBufferTime += segment.totalTime;
3111 }
3112 if (segment.occupancyAverage < 1.0f) {
3113 stats.doubleBufferedTime += segment.totalTime;
3114 } else if (segment.occupancyAverage < 2.0f) {
3115 stats.tripleBufferedTime += segment.totalTime;
3116 }
3117 ++stats.numSegments;
3118 stats.totalTime += segment.totalTime;
3119 }
3120}
3121
3122void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3123 result.append("Buffering stats:\n");
3124 result.append(" [Layer name] <Active time> <Two buffer> "
3125 "<Double buffered> <Triple buffered>\n");
3126 Mutex::Autolock lock(mBufferingStatsMutex);
3127 typedef std::tuple<std::string, float, float, float> BufferTuple;
3128 std::map<float, BufferTuple, std::greater<float>> sorted;
3129 for (const auto& statsPair : mBufferingStats) {
3130 const char* name = statsPair.first.c_str();
3131 const BufferingStats& stats = statsPair.second;
3132 if (stats.numSegments == 0) {
3133 continue;
3134 }
3135 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3136 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3137 stats.totalTime;
3138 float doubleBufferRatio = static_cast<float>(
3139 stats.doubleBufferedTime) / stats.totalTime;
3140 float tripleBufferRatio = static_cast<float>(
3141 stats.tripleBufferedTime) / stats.totalTime;
3142 sorted.insert({activeTime, {name, twoBufferRatio,
3143 doubleBufferRatio, tripleBufferRatio}});
3144 }
3145 for (const auto& sortedPair : sorted) {
3146 float activeTime = sortedPair.first;
3147 const BufferTuple& values = sortedPair.second;
3148 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3149 std::get<0>(values).c_str(), activeTime,
3150 std::get<1>(values), std::get<2>(values),
3151 std::get<3>(values));
3152 }
3153 result.append("\n");
3154}
3155
3156void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3157 String8& result) const
3158{
3159 bool colorize = false;
3160 if (index < args.size()
3161 && (args[index] == String16("--color"))) {
3162 colorize = true;
3163 index++;
3164 }
3165
3166 Colorizer colorizer(colorize);
3167
3168 // figure out if we're stuck somewhere
3169 const nsecs_t now = systemTime();
3170 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3171 const nsecs_t inTransaction(mDebugInTransaction);
3172 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3173 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3174
3175 /*
3176 * Dump library configuration.
3177 */
3178
3179 colorizer.bold(result);
3180 result.append("Build configuration:");
3181 colorizer.reset(result);
3182 appendSfConfigString(result);
3183 appendUiConfigString(result);
3184 appendGuiConfigString(result);
3185 result.append("\n");
3186
3187 colorizer.bold(result);
3188 result.append("Sync configuration: ");
3189 colorizer.reset(result);
3190 result.append(SyncFeatures::getInstance().toString());
3191 result.append("\n");
3192
3193 colorizer.bold(result);
3194 result.append("DispSync configuration: ");
3195 colorizer.reset(result);
3196 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003197 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3198 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003199 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3200 result.append("\n");
3201
3202 // Dump static screen stats
3203 result.append("\n");
3204 dumpStaticScreenStats(result);
3205 result.append("\n");
3206
3207 dumpBufferingStats(result);
3208
3209 /*
3210 * Dump the visible layer list
3211 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003212 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003213 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003214 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003215 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003216 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003217 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003218
3219 /*
3220 * Dump Display state
3221 */
3222
3223 colorizer.bold(result);
3224 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3225 colorizer.reset(result);
3226 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3227 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3228 hw->dump(result);
3229 }
3230
3231 /*
3232 * Dump SurfaceFlinger global state
3233 */
3234
3235 colorizer.bold(result);
3236 result.append("SurfaceFlinger global state:\n");
3237 colorizer.reset(result);
3238
3239 HWComposer& hwc(getHwComposer());
Stephen Kiazyk8d6c16d2017-04-05 16:46:49 -07003240 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003241
3242 colorizer.bold(result);
3243 result.appendFormat("EGL implementation : %s\n",
3244 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3245 colorizer.reset(result);
3246 result.appendFormat("%s\n",
3247 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3248
3249 mRenderEngine->dump(result);
3250
3251 hw->undefinedRegion.dump(result, "undefinedRegion");
3252 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3253 hw->getOrientation(), hw->isDisplayOn());
3254 result.appendFormat(
3255 " last eglSwapBuffers() time: %f us\n"
3256 " last transaction time : %f us\n"
3257 " transaction-flags : %08x\n"
3258 " refresh-rate : %f fps\n"
3259 " x-dpi : %f\n"
3260 " y-dpi : %f\n"
3261 " gpu_to_cpu_unsupported : %d\n"
3262 ,
3263 mLastSwapBufferTime/1000.0,
3264 mLastTransactionTime/1000.0,
3265 mTransactionFlags,
3266 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3267 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3268 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3269 !mGpuToCpuSupported);
3270
3271 result.appendFormat(" eglSwapBuffers time: %f us\n",
3272 inSwapBuffersDuration/1000.0);
3273
3274 result.appendFormat(" transaction time: %f us\n",
3275 inTransactionDuration/1000.0);
3276
3277 /*
3278 * VSYNC state
3279 */
3280 mEventThread->dump(result);
3281
3282 /*
3283 * Dump HWComposer state
3284 */
3285 colorizer.bold(result);
3286 result.append("h/w composer state:\n");
3287 colorizer.reset(result);
3288 result.appendFormat(" h/w composer %s and %s\n",
3289 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3290 (mDebugDisableHWC || mDebugRegion || mDaltonize
3291 || mHasColorMatrix) ? "disabled" : "enabled");
3292 hwc.dump(result);
3293
3294 /*
3295 * Dump gralloc state
3296 */
3297 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3298 alloc.dump(result);
3299}
3300
3301const Vector< sp<Layer> >&
3302SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3303 // Note: mStateLock is held here
3304 wp<IBinder> dpy;
3305 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3306 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3307 dpy = mDisplays.keyAt(i);
3308 break;
3309 }
3310 }
3311 if (dpy == NULL) {
3312 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3313 // Just use the primary display so we have something to return
3314 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3315 }
3316 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
3317}
3318
3319bool SurfaceFlinger::startDdmConnection()
3320{
3321 void* libddmconnection_dso =
3322 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3323 if (!libddmconnection_dso) {
3324 return false;
3325 }
3326 void (*DdmConnection_start)(const char* name);
3327 DdmConnection_start =
3328 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3329 if (!DdmConnection_start) {
3330 dlclose(libddmconnection_dso);
3331 return false;
3332 }
3333 (*DdmConnection_start)(getServiceName());
3334 return true;
3335}
3336
3337status_t SurfaceFlinger::onTransact(
3338 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3339{
3340 switch (code) {
3341 case CREATE_CONNECTION:
3342 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003343 case BOOT_FINISHED:
3344 case CLEAR_ANIMATION_FRAME_STATS:
3345 case GET_ANIMATION_FRAME_STATS:
3346 case SET_POWER_MODE:
3347 case GET_HDR_CAPABILITIES:
3348 {
3349 // codes that require permission check
3350 IPCThreadState* ipc = IPCThreadState::self();
3351 const int pid = ipc->getCallingPid();
3352 const int uid = ipc->getCallingUid();
3353 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3354 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3355 ALOGE("Permission Denial: "
3356 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3357 return PERMISSION_DENIED;
3358 }
3359 break;
3360 }
Robert Carr1db73f62016-12-21 12:58:51 -08003361 /*
3362 * Calling setTransactionState is safe, because you need to have been
3363 * granted a reference to Client* and Handle* to do anything with it.
3364 *
3365 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3366 */
3367 case SET_TRANSACTION_STATE:
3368 case CREATE_SCOPED_CONNECTION:
3369 {
3370 break;
3371 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003372 case CAPTURE_SCREEN:
3373 {
3374 // codes that require permission check
3375 IPCThreadState* ipc = IPCThreadState::self();
3376 const int pid = ipc->getCallingPid();
3377 const int uid = ipc->getCallingUid();
3378 if ((uid != AID_GRAPHICS) &&
3379 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3380 ALOGE("Permission Denial: "
3381 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3382 return PERMISSION_DENIED;
3383 }
3384 break;
3385 }
3386 }
3387
3388 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3389 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3390 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3391 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3392 IPCThreadState* ipc = IPCThreadState::self();
3393 const int pid = ipc->getCallingPid();
3394 const int uid = ipc->getCallingUid();
3395 ALOGE("Permission Denial: "
3396 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3397 return PERMISSION_DENIED;
3398 }
3399 int n;
3400 switch (code) {
3401 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3402 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3403 return NO_ERROR;
3404 case 1002: // SHOW_UPDATES
3405 n = data.readInt32();
3406 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3407 invalidateHwcGeometry();
3408 repaintEverything();
3409 return NO_ERROR;
3410 case 1004:{ // repaint everything
3411 repaintEverything();
3412 return NO_ERROR;
3413 }
3414 case 1005:{ // force transaction
3415 setTransactionFlags(
3416 eTransactionNeeded|
3417 eDisplayTransactionNeeded|
3418 eTraversalNeeded);
3419 return NO_ERROR;
3420 }
3421 case 1006:{ // send empty update
3422 signalRefresh();
3423 return NO_ERROR;
3424 }
3425 case 1008: // toggle use of hw composer
3426 n = data.readInt32();
3427 mDebugDisableHWC = n ? 1 : 0;
3428 invalidateHwcGeometry();
3429 repaintEverything();
3430 return NO_ERROR;
3431 case 1009: // toggle use of transform hint
3432 n = data.readInt32();
3433 mDebugDisableTransformHint = n ? 1 : 0;
3434 invalidateHwcGeometry();
3435 repaintEverything();
3436 return NO_ERROR;
3437 case 1010: // interrogate.
3438 reply->writeInt32(0);
3439 reply->writeInt32(0);
3440 reply->writeInt32(mDebugRegion);
3441 reply->writeInt32(0);
3442 reply->writeInt32(mDebugDisableHWC);
3443 return NO_ERROR;
3444 case 1013: {
3445 Mutex::Autolock _l(mStateLock);
3446 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3447 reply->writeInt32(hw->getPageFlipCount());
3448 return NO_ERROR;
3449 }
3450 case 1014: {
3451 // daltonize
3452 n = data.readInt32();
3453 switch (n % 10) {
3454 case 1:
3455 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3456 break;
3457 case 2:
3458 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3459 break;
3460 case 3:
3461 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3462 break;
3463 }
3464 if (n >= 10) {
3465 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3466 } else {
3467 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3468 }
3469 mDaltonize = n > 0;
3470 invalidateHwcGeometry();
3471 repaintEverything();
3472 return NO_ERROR;
3473 }
3474 case 1015: {
3475 // apply a color matrix
3476 n = data.readInt32();
3477 mHasColorMatrix = n ? 1 : 0;
3478 if (n) {
3479 // color matrix is sent as mat3 matrix followed by vec3
3480 // offset, then packed into a mat4 where the last row is
3481 // the offset and extra values are 0
3482 for (size_t i = 0 ; i < 4; i++) {
3483 for (size_t j = 0; j < 4; j++) {
3484 mColorMatrix[i][j] = data.readFloat();
3485 }
3486 }
3487 } else {
3488 mColorMatrix = mat4();
3489 }
3490 invalidateHwcGeometry();
3491 repaintEverything();
3492 return NO_ERROR;
3493 }
3494 // This is an experimental interface
3495 // Needs to be shifted to proper binder interface when we productize
3496 case 1016: {
3497 n = data.readInt32();
3498 mPrimaryDispSync.setRefreshSkipCount(n);
3499 return NO_ERROR;
3500 }
3501 case 1017: {
3502 n = data.readInt32();
3503 mForceFullDamage = static_cast<bool>(n);
3504 return NO_ERROR;
3505 }
3506 case 1018: { // Modify Choreographer's phase offset
3507 n = data.readInt32();
3508 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3509 return NO_ERROR;
3510 }
3511 case 1019: { // Modify SurfaceFlinger's phase offset
3512 n = data.readInt32();
3513 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3514 return NO_ERROR;
3515 }
3516 case 1020: { // Layer updates interceptor
3517 n = data.readInt32();
3518 if (n) {
3519 ALOGV("Interceptor enabled");
3520 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3521 }
3522 else{
3523 ALOGV("Interceptor disabled");
3524 mInterceptor.disable();
3525 }
3526 return NO_ERROR;
3527 }
3528 case 1021: { // Disable HWC virtual displays
3529 n = data.readInt32();
3530 mUseHwcVirtualDisplays = !n;
3531 return NO_ERROR;
3532 }
3533 }
3534 }
3535 return err;
3536}
3537
3538void SurfaceFlinger::repaintEverything() {
3539 android_atomic_or(1, &mRepaintEverything);
3540 signalTransaction();
3541}
3542
3543// ---------------------------------------------------------------------------
3544// Capture screen into an IGraphiBufferProducer
3545// ---------------------------------------------------------------------------
3546
3547/* The code below is here to handle b/8734824
3548 *
3549 * We create a IGraphicBufferProducer wrapper that forwards all calls
3550 * from the surfaceflinger thread to the calling binder thread, where they
3551 * are executed. This allows the calling thread in the calling process to be
3552 * reused and not depend on having "enough" binder threads to handle the
3553 * requests.
3554 */
3555class GraphicProducerWrapper : public BBinder, public MessageHandler {
3556 /* Parts of GraphicProducerWrapper are run on two different threads,
3557 * communicating by sending messages via Looper but also by shared member
3558 * data. Coherence maintenance is subtle and in places implicit (ugh).
3559 *
3560 * Don't rely on Looper's sendMessage/handleMessage providing
3561 * release/acquire semantics for any data not actually in the Message.
3562 * Data going from surfaceflinger to binder threads needs to be
3563 * synchronized explicitly.
3564 *
3565 * Barrier open/wait do provide release/acquire semantics. This provides
3566 * implicit synchronization for data coming back from binder to
3567 * surfaceflinger threads.
3568 */
3569
3570 sp<IGraphicBufferProducer> impl;
3571 sp<Looper> looper;
3572 status_t result;
3573 bool exitPending;
3574 bool exitRequested;
3575 Barrier barrier;
3576 uint32_t code;
3577 Parcel const* data;
3578 Parcel* reply;
3579
3580 enum {
3581 MSG_API_CALL,
3582 MSG_EXIT
3583 };
3584
3585 /*
3586 * Called on surfaceflinger thread. This is called by our "fake"
3587 * BpGraphicBufferProducer. We package the data and reply Parcel and
3588 * forward them to the binder thread.
3589 */
3590 virtual status_t transact(uint32_t code,
3591 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3592 this->code = code;
3593 this->data = &data;
3594 this->reply = reply;
3595 if (exitPending) {
3596 // if we've exited, we run the message synchronously right here.
3597 // note (JH): as far as I can tell from looking at the code, this
3598 // never actually happens. if it does, i'm not sure if it happens
3599 // on the surfaceflinger or binder thread.
3600 handleMessage(Message(MSG_API_CALL));
3601 } else {
3602 barrier.close();
3603 // Prevent stores to this->{code, data, reply} from being
3604 // reordered later than the construction of Message.
3605 atomic_thread_fence(memory_order_release);
3606 looper->sendMessage(this, Message(MSG_API_CALL));
3607 barrier.wait();
3608 }
3609 return result;
3610 }
3611
3612 /*
3613 * here we run on the binder thread. All we've got to do is
3614 * call the real BpGraphicBufferProducer.
3615 */
3616 virtual void handleMessage(const Message& message) {
3617 int what = message.what;
3618 // Prevent reads below from happening before the read from Message
3619 atomic_thread_fence(memory_order_acquire);
3620 if (what == MSG_API_CALL) {
3621 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3622 barrier.open();
3623 } else if (what == MSG_EXIT) {
3624 exitRequested = true;
3625 }
3626 }
3627
3628public:
3629 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3630 : impl(impl),
3631 looper(new Looper(true)),
3632 result(NO_ERROR),
3633 exitPending(false),
3634 exitRequested(false),
3635 code(0),
3636 data(NULL),
3637 reply(NULL)
3638 {}
3639
3640 // Binder thread
3641 status_t waitForResponse() {
3642 do {
3643 looper->pollOnce(-1);
3644 } while (!exitRequested);
3645 return result;
3646 }
3647
3648 // Client thread
3649 void exit(status_t result) {
3650 this->result = result;
3651 exitPending = true;
3652 // Ensure this->result is visible to the binder thread before it
3653 // handles the message.
3654 atomic_thread_fence(memory_order_release);
3655 looper->sendMessage(this, Message(MSG_EXIT));
3656 }
3657};
3658
3659
3660status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3661 const sp<IGraphicBufferProducer>& producer,
3662 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003663 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003664 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3665
3666 if (CC_UNLIKELY(display == 0))
3667 return BAD_VALUE;
3668
3669 if (CC_UNLIKELY(producer == 0))
3670 return BAD_VALUE;
3671
3672 // if we have secure windows on this display, never allow the screen capture
3673 // unless the producer interface is local (i.e.: we can take a screenshot for
3674 // ourselves).
3675 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3676
3677 // Convert to surfaceflinger's internal rotation type.
3678 Transform::orientation_flags rotationFlags;
3679 switch (rotation) {
3680 case ISurfaceComposer::eRotateNone:
3681 rotationFlags = Transform::ROT_0;
3682 break;
3683 case ISurfaceComposer::eRotate90:
3684 rotationFlags = Transform::ROT_90;
3685 break;
3686 case ISurfaceComposer::eRotate180:
3687 rotationFlags = Transform::ROT_180;
3688 break;
3689 case ISurfaceComposer::eRotate270:
3690 rotationFlags = Transform::ROT_270;
3691 break;
3692 default:
3693 rotationFlags = Transform::ROT_0;
3694 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3695 break;
3696 }
3697
3698 class MessageCaptureScreen : public MessageBase {
3699 SurfaceFlinger* flinger;
3700 sp<IBinder> display;
3701 sp<IGraphicBufferProducer> producer;
3702 Rect sourceCrop;
3703 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003704 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003705 bool useIdentityTransform;
3706 Transform::orientation_flags rotation;
3707 status_t result;
3708 bool isLocalScreenshot;
3709 public:
3710 MessageCaptureScreen(SurfaceFlinger* flinger,
3711 const sp<IBinder>& display,
3712 const sp<IGraphicBufferProducer>& producer,
3713 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003714 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003715 bool useIdentityTransform,
3716 Transform::orientation_flags rotation,
3717 bool isLocalScreenshot)
3718 : flinger(flinger), display(display), producer(producer),
3719 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3720 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3721 useIdentityTransform(useIdentityTransform),
3722 rotation(rotation), result(PERMISSION_DENIED),
3723 isLocalScreenshot(isLocalScreenshot)
3724 {
3725 }
3726 status_t getResult() const {
3727 return result;
3728 }
3729 virtual bool handler() {
3730 Mutex::Autolock _l(flinger->mStateLock);
3731 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3732 result = flinger->captureScreenImplLocked(hw, producer,
3733 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3734 useIdentityTransform, rotation, isLocalScreenshot);
3735 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3736 return true;
3737 }
3738 };
3739
3740 // this creates a "fake" BBinder which will serve as a "fake" remote
3741 // binder to receive the marshaled calls and forward them to the
3742 // real remote (a BpGraphicBufferProducer)
3743 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3744
3745 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3746 // which does the marshaling work forwards to our "fake remote" above.
3747 sp<MessageBase> msg = new MessageCaptureScreen(this,
3748 display, IGraphicBufferProducer::asInterface( wrapper ),
3749 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3750 useIdentityTransform, rotationFlags, isLocalScreenshot);
3751
3752 status_t res = postMessageAsync(msg);
3753 if (res == NO_ERROR) {
3754 res = wrapper->waitForResponse();
3755 }
3756 return res;
3757}
3758
3759
3760void SurfaceFlinger::renderScreenImplLocked(
3761 const sp<const DisplayDevice>& hw,
3762 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003763 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003764 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3765{
3766 ATRACE_CALL();
3767 RenderEngine& engine(getRenderEngine());
3768
3769 // get screen geometry
3770 const int32_t hw_w = hw->getWidth();
3771 const int32_t hw_h = hw->getHeight();
3772 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3773 static_cast<int32_t>(reqHeight) != hw_h;
3774
3775 // if a default or invalid sourceCrop is passed in, set reasonable values
3776 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3777 !sourceCrop.isValid()) {
3778 sourceCrop.setLeftTop(Point(0, 0));
3779 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3780 }
3781
3782 // ensure that sourceCrop is inside screen
3783 if (sourceCrop.left < 0) {
3784 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3785 }
3786 if (sourceCrop.right > hw_w) {
3787 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3788 }
3789 if (sourceCrop.top < 0) {
3790 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3791 }
3792 if (sourceCrop.bottom > hw_h) {
3793 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3794 }
3795
3796 // make sure to clear all GL error flags
3797 engine.checkErrors();
3798
3799 // set-up our viewport
3800 engine.setViewportAndProjection(
3801 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3802 engine.disableTexturing();
3803
3804 // redraw the screen entirely...
3805 engine.clearWithColor(0, 0, 0, 1);
3806
Robert Carr1f0a16a2016-10-24 16:27:39 -07003807 // We loop through the first level of layers without traversing,
3808 // as we need to interpret min/max layer Z in the top level Z space.
3809 for (const auto& layer : mDrawingState.layersSortedByZ) {
3810 if (layer->getLayerStack() != hw->getLayerStack()) {
3811 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003812 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003813 const Layer::State& state(layer->getDrawingState());
3814 if (state.z < minLayerZ || state.z > maxLayerZ) {
3815 continue;
3816 }
3817 layer->traverseInZOrder([&](Layer* layer) {
3818 if (!layer->isVisible()) {
3819 return;
3820 }
3821 if (filtering) layer->setFiltering(true);
3822 layer->draw(hw, useIdentityTransform);
3823 if (filtering) layer->setFiltering(false);
3824 });
3825 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003826
3827 // compositionComplete is needed for older driver
3828 hw->compositionComplete();
3829 hw->setViewportAndProjection();
3830}
3831
3832
3833status_t SurfaceFlinger::captureScreenImplLocked(
3834 const sp<const DisplayDevice>& hw,
3835 const sp<IGraphicBufferProducer>& producer,
3836 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003837 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003838 bool useIdentityTransform, Transform::orientation_flags rotation,
3839 bool isLocalScreenshot)
3840{
3841 ATRACE_CALL();
3842
3843 // get screen geometry
3844 uint32_t hw_w = hw->getWidth();
3845 uint32_t hw_h = hw->getHeight();
3846
3847 if (rotation & Transform::ROT_90) {
3848 std::swap(hw_w, hw_h);
3849 }
3850
3851 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3852 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3853 reqWidth, reqHeight, hw_w, hw_h);
3854 return BAD_VALUE;
3855 }
3856
3857 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3858 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3859
3860 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003861 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003862 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003863 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3864 (state.z < minLayerZ || state.z > maxLayerZ)) {
3865 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003866 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003867 layer->traverseInZOrder([&](Layer *layer) {
3868 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3869 layer->isSecure());
3870 });
3871 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003872
3873 if (!isLocalScreenshot && secureLayerIsVisible) {
3874 ALOGW("FB is protected: PERMISSION_DENIED");
3875 return PERMISSION_DENIED;
3876 }
3877
3878 // create a surface (because we're a producer, and we need to
3879 // dequeue/queue a buffer)
3880 sp<Surface> sur = new Surface(producer, false);
3881 ANativeWindow* window = sur.get();
3882
3883 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3884 if (result == NO_ERROR) {
3885 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3886 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3887
3888 int err = 0;
3889 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3890 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3891 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3892 err |= native_window_set_usage(window, usage);
3893
3894 if (err == NO_ERROR) {
3895 ANativeWindowBuffer* buffer;
3896 /* TODO: Once we have the sync framework everywhere this can use
3897 * server-side waits on the fence that dequeueBuffer returns.
3898 */
3899 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3900 if (result == NO_ERROR) {
3901 int syncFd = -1;
3902 // create an EGLImage from the buffer so we can later
3903 // turn it into a texture
3904 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3905 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3906 if (image != EGL_NO_IMAGE_KHR) {
3907 // this binds the given EGLImage as a framebuffer for the
3908 // duration of this scope.
3909 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3910 if (imageBond.getStatus() == NO_ERROR) {
3911 // this will in fact render into our dequeued buffer
3912 // via an FBO, which means we didn't have to create
3913 // an EGLSurface and therefore we're not
3914 // dependent on the context's EGLConfig.
3915 renderScreenImplLocked(
3916 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3917 useIdentityTransform, rotation);
3918
3919 // Attempt to create a sync khr object that can produce a sync point. If that
3920 // isn't available, create a non-dupable sync object in the fallback path and
3921 // wait on it directly.
3922 EGLSyncKHR sync;
3923 if (!DEBUG_SCREENSHOTS) {
3924 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3925 // native fence fd will not be populated until flush() is done.
3926 getRenderEngine().flush();
3927 } else {
3928 sync = EGL_NO_SYNC_KHR;
3929 }
3930 if (sync != EGL_NO_SYNC_KHR) {
3931 // get the sync fd
3932 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3933 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3934 ALOGW("captureScreen: failed to dup sync khr object");
3935 syncFd = -1;
3936 }
3937 eglDestroySyncKHR(mEGLDisplay, sync);
3938 } else {
3939 // fallback path
3940 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3941 if (sync != EGL_NO_SYNC_KHR) {
3942 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3943 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3944 EGLint eglErr = eglGetError();
3945 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3946 ALOGW("captureScreen: fence wait timed out");
3947 } else {
3948 ALOGW_IF(eglErr != EGL_SUCCESS,
3949 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3950 }
3951 eglDestroySyncKHR(mEGLDisplay, sync);
3952 } else {
3953 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3954 }
3955 }
3956 if (DEBUG_SCREENSHOTS) {
3957 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3958 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3959 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3960 hw, minLayerZ, maxLayerZ);
3961 delete [] pixels;
3962 }
3963
3964 } else {
3965 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3966 result = INVALID_OPERATION;
3967 window->cancelBuffer(window, buffer, syncFd);
3968 buffer = NULL;
3969 }
3970 // destroy our image
3971 eglDestroyImageKHR(mEGLDisplay, image);
3972 } else {
3973 result = BAD_VALUE;
3974 }
3975 if (buffer) {
3976 // queueBuffer takes ownership of syncFd
3977 result = window->queueBuffer(window, buffer, syncFd);
3978 }
3979 }
3980 } else {
3981 result = BAD_VALUE;
3982 }
3983 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3984 }
3985
3986 return result;
3987}
3988
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003989void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08003990 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003991 if (DEBUG_SCREENSHOTS) {
3992 for (size_t y=0 ; y<h ; y++) {
3993 uint32_t const * p = (uint32_t const *)vaddr + y*s;
3994 for (size_t x=0 ; x<w ; x++) {
3995 if (p[x] != 0xFF000000) return;
3996 }
3997 }
3998 ALOGE("*** we just took a black screenshot ***\n"
3999 "requested minz=%d, maxz=%d, layerStack=%d",
4000 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08004001 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004002 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004003 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004004 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4005 state.z <= maxLayerZ) {
4006 layer->traverseInZOrder([&](Layer* layer) {
4007 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
4008 layer->isVisible() ? '+' : '-',
4009 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004010 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07004011 i++;
4012 });
4013 }
4014 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004015 }
4016}
4017
4018// ---------------------------------------------------------------------------
4019
Robert Carr2047fae2016-11-28 14:09:09 -08004020void SurfaceFlinger::State::traverseInZOrder(const std::function<void(Layer*)>& consume) const {
4021 layersSortedByZ.traverseInZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004022}
4023
Robert Carr2047fae2016-11-28 14:09:09 -08004024void SurfaceFlinger::State::traverseInReverseZOrder(const std::function<void(Layer*)>& consume) const {
4025 layersSortedByZ.traverseInReverseZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004026}
4027
4028}; // namespace android
4029
4030
4031#if defined(__gl_h_)
4032#error "don't include gl/gl.h in this file"
4033#endif
4034
4035#if defined(__gl2_h_)
4036#error "don't include gl2/gl2.h in this file"
4037#endif