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