blob: c567e61661a1a98670211fcbcb87f2b46d909cb8 [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>
Chia-I Wu527747d2017-03-13 20:38:48 +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 Sanglard9d96de42016-10-11 00:15:18 +0000115
116SurfaceFlinger::SurfaceFlinger()
117 : BnSurfaceComposer(),
118 mTransactionFlags(0),
119 mTransactionPending(false),
120 mAnimTransactionPending(false),
121 mLayersRemoved(false),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700122 mLayersAdded(false),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000123 mRepaintEverything(0),
124 mRenderEngine(NULL),
125 mBootTime(systemTime()),
126 mVisibleRegionsDirty(false),
127 mHwWorkListDirty(false),
128 mAnimCompositionPending(false),
129 mDebugRegion(0),
130 mDebugDDMS(0),
131 mDebugDisableHWC(0),
132 mDebugDisableTransformHint(0),
133 mDebugInSwapBuffers(0),
134 mLastSwapBufferTime(0),
135 mDebugInTransaction(0),
136 mLastTransactionTime(0),
137 mBootFinished(false),
138 mForceFullDamage(false),
Robert Carr0d480722017-01-10 16:42:54 -0800139 mInterceptor(this),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000140 mPrimaryDispSync("PrimaryDispSync"),
141 mPrimaryHWVsyncEnabled(false),
142 mHWVsyncAvailable(false),
143 mDaltonize(false),
144 mHasColorMatrix(false),
145 mHasPoweredOff(false),
146 mFrameBuckets(),
147 mTotalTime(0),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700148 mLastSwapTime(0),
149 mNumLayers(0)
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000150{
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800151 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
152 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
153
154 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
155 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
156
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000157 ALOGI("SurfaceFlinger is starting");
158
Fabien Sanglardc93afd52017-03-13 13:02:42 -0700159 useContextPriority = getBool< ISurfaceFlingerConfigs,
160 &ISurfaceFlingerConfigs::useContextPriority>(false);
161
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000162 char value[PROPERTY_VALUE_MAX];
163
164 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
165 mGpuToCpuSupported = !atoi(value);
166
167 property_get("debug.sf.showupdates", value, "0");
168 mDebugRegion = atoi(value);
169
170 property_get("debug.sf.ddms", value, "0");
171 mDebugDDMS = atoi(value);
172 if (mDebugDDMS) {
173 if (!startDdmConnection()) {
174 // start failed, and DDMS debugging not enabled
175 mDebugDDMS = 0;
176 }
177 }
178 ALOGI_IF(mDebugRegion, "showupdates enabled");
179 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
180
Fabien Sanglard642b23d2017-02-09 12:29:39 -0800181 property_get("debug.sf.enable_hwc_vds", value, "0");
182 mUseHwcVirtualDisplays = atoi(value);
183 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800184
Fabien Sanglardc65dafa2017-02-07 14:06:39 -0800185 property_get("ro.sf.disable_triple_buffer", value, "1");
186 mLayerTripleBufferingDisabled = atoi(value);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800187 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000188}
189
190void SurfaceFlinger::onFirstRef()
191{
192 mEventQueue.init(this);
193}
194
195SurfaceFlinger::~SurfaceFlinger()
196{
197 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
198 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
199 eglTerminate(display);
200}
201
202void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
203{
204 // the window manager died on us. prepare its eulogy.
205
206 // restore initial conditions (default device unblank, etc)
207 initializeDisplays();
208
209 // restart the boot-animation
210 startBootAnim();
211}
212
Robert Carr1db73f62016-12-21 12:58:51 -0800213static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000214 status_t err = client->initCheck();
215 if (err == NO_ERROR) {
Robert Carr1db73f62016-12-21 12:58:51 -0800216 return client;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000217 }
Robert Carr1db73f62016-12-21 12:58:51 -0800218 return nullptr;
219}
220
221sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
222 return initClient(new Client(this));
223}
224
225sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
226 const sp<IGraphicBufferProducer>& gbp) {
227 if (authenticateSurfaceTexture(gbp) == false) {
228 return nullptr;
229 }
230 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
231 if (layer == nullptr) {
232 return nullptr;
233 }
234
235 return initClient(new Client(this, layer));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000236}
237
238sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
239 bool secure)
240{
241 class DisplayToken : public BBinder {
242 sp<SurfaceFlinger> flinger;
243 virtual ~DisplayToken() {
244 // no more references, this display must be terminated
245 Mutex::Autolock _l(flinger->mStateLock);
246 flinger->mCurrentState.displays.removeItem(this);
247 flinger->setTransactionFlags(eDisplayTransactionNeeded);
248 }
249 public:
250 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
251 : flinger(flinger) {
252 }
253 };
254
255 sp<BBinder> token = new DisplayToken(this);
256
257 Mutex::Autolock _l(mStateLock);
258 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
259 info.displayName = displayName;
260 mCurrentState.displays.add(token, info);
261 mInterceptor.saveDisplayCreation(info);
262 return token;
263}
264
265void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
266 Mutex::Autolock _l(mStateLock);
267
268 ssize_t idx = mCurrentState.displays.indexOfKey(display);
269 if (idx < 0) {
270 ALOGW("destroyDisplay: invalid display token");
271 return;
272 }
273
274 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
275 if (!info.isVirtualDisplay()) {
276 ALOGE("destroyDisplay called for non-virtual display");
277 return;
278 }
279 mInterceptor.saveDisplayDeletion(info.displayId);
280 mCurrentState.displays.removeItemsAt(idx);
281 setTransactionFlags(eDisplayTransactionNeeded);
282}
283
284void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
285 ALOGW_IF(mBuiltinDisplays[type],
286 "Overwriting display token for display type %d", type);
287 mBuiltinDisplays[type] = new BBinder();
288 // All non-virtual displays are currently considered secure.
289 DisplayDeviceState info(type, true);
290 mCurrentState.displays.add(mBuiltinDisplays[type], info);
291 mInterceptor.saveDisplayCreation(info);
292}
293
294sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
295 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
296 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
297 return NULL;
298 }
299 return mBuiltinDisplays[id];
300}
301
Chia-I Wu527747d2017-03-13 20:38:48 +0000302sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc()
303{
304 sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc());
305 return gba;
306}
307
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000308void SurfaceFlinger::bootFinished()
309{
Wei Wangb254fa32017-01-31 17:43:23 -0800310 if (mStartBootAnimThread->join() != NO_ERROR) {
311 ALOGE("Join StartBootAnimThread failed!");
312 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000313 const nsecs_t now = systemTime();
314 const nsecs_t duration = now - mBootTime;
315 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
316 mBootFinished = true;
317
318 // wait patiently for the window manager death
319 const String16 name("window");
320 sp<IBinder> window(defaultServiceManager()->getService(name));
321 if (window != 0) {
322 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
323 }
324
325 // stop boot animation
326 // formerly we would just kill the process, but we now ask it to exit so it
327 // can choose where to stop the animation.
328 property_set("service.bootanim.exit", "1");
329
330 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
331 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
332 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
333}
334
335void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
336 class MessageDestroyGLTexture : public MessageBase {
337 RenderEngine& engine;
338 uint32_t texture;
339 public:
340 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
341 : engine(engine), texture(texture) {
342 }
343 virtual bool handler() {
344 engine.deleteTextures(1, &texture);
345 return true;
346 }
347 };
348 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
349}
350
351class DispSyncSource : public VSyncSource, private DispSync::Callback {
352public:
353 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
354 const char* name) :
355 mName(name),
356 mValue(0),
357 mTraceVsync(traceVsync),
358 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
359 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
360 mDispSync(dispSync),
361 mCallbackMutex(),
362 mCallback(),
363 mVsyncMutex(),
364 mPhaseOffset(phaseOffset),
365 mEnabled(false) {}
366
367 virtual ~DispSyncSource() {}
368
369 virtual void setVSyncEnabled(bool enable) {
370 Mutex::Autolock lock(mVsyncMutex);
371 if (enable) {
372 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
373 static_cast<DispSync::Callback*>(this));
374 if (err != NO_ERROR) {
375 ALOGE("error registering vsync callback: %s (%d)",
376 strerror(-err), err);
377 }
378 //ATRACE_INT(mVsyncOnLabel.string(), 1);
379 } else {
380 status_t err = mDispSync->removeEventListener(
381 static_cast<DispSync::Callback*>(this));
382 if (err != NO_ERROR) {
383 ALOGE("error unregistering vsync callback: %s (%d)",
384 strerror(-err), err);
385 }
386 //ATRACE_INT(mVsyncOnLabel.string(), 0);
387 }
388 mEnabled = enable;
389 }
390
391 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
392 Mutex::Autolock lock(mCallbackMutex);
393 mCallback = callback;
394 }
395
396 virtual void setPhaseOffset(nsecs_t phaseOffset) {
397 Mutex::Autolock lock(mVsyncMutex);
398
399 // Normalize phaseOffset to [0, period)
400 auto period = mDispSync->getPeriod();
401 phaseOffset %= period;
402 if (phaseOffset < 0) {
403 // If we're here, then phaseOffset is in (-period, 0). After this
404 // operation, it will be in (0, period)
405 phaseOffset += period;
406 }
407 mPhaseOffset = phaseOffset;
408
409 // If we're not enabled, we don't need to mess with the listeners
410 if (!mEnabled) {
411 return;
412 }
413
414 // Remove the listener with the old offset
415 status_t err = mDispSync->removeEventListener(
416 static_cast<DispSync::Callback*>(this));
417 if (err != NO_ERROR) {
418 ALOGE("error unregistering vsync callback: %s (%d)",
419 strerror(-err), err);
420 }
421
422 // Add a listener with the new offset
423 err = mDispSync->addEventListener(mName, mPhaseOffset,
424 static_cast<DispSync::Callback*>(this));
425 if (err != NO_ERROR) {
426 ALOGE("error registering vsync callback: %s (%d)",
427 strerror(-err), err);
428 }
429 }
430
431private:
432 virtual void onDispSyncEvent(nsecs_t when) {
433 sp<VSyncSource::Callback> callback;
434 {
435 Mutex::Autolock lock(mCallbackMutex);
436 callback = mCallback;
437
438 if (mTraceVsync) {
439 mValue = (mValue + 1) % 2;
440 ATRACE_INT(mVsyncEventLabel.string(), mValue);
441 }
442 }
443
444 if (callback != NULL) {
445 callback->onVSyncEvent(when);
446 }
447 }
448
449 const char* const mName;
450
451 int mValue;
452
453 const bool mTraceVsync;
454 const String8 mVsyncOnLabel;
455 const String8 mVsyncEventLabel;
456
457 DispSync* mDispSync;
458
459 Mutex mCallbackMutex; // Protects the following
460 sp<VSyncSource::Callback> mCallback;
461
462 Mutex mVsyncMutex; // Protects the following
463 nsecs_t mPhaseOffset;
464 bool mEnabled;
465};
466
467class InjectVSyncSource : public VSyncSource {
468public:
469 InjectVSyncSource() {}
470
471 virtual ~InjectVSyncSource() {}
472
473 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
474 std::lock_guard<std::mutex> lock(mCallbackMutex);
475 mCallback = callback;
476 }
477
478 virtual void onInjectSyncEvent(nsecs_t when) {
479 std::lock_guard<std::mutex> lock(mCallbackMutex);
480 mCallback->onVSyncEvent(when);
481 }
482
483 virtual void setVSyncEnabled(bool) {}
484 virtual void setPhaseOffset(nsecs_t) {}
485
486private:
487 std::mutex mCallbackMutex; // Protects the following
488 sp<VSyncSource::Callback> mCallback;
489};
490
491void SurfaceFlinger::init() {
492 ALOGI( "SurfaceFlinger's main thread ready to run. "
493 "Initializing graphics H/W...");
494
495 Mutex::Autolock _l(mStateLock);
496
497 // initialize EGL for the default display
498 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
499 eglInitialize(mEGLDisplay, NULL, NULL);
500
501 // start the EventThread
502 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
503 vsyncPhaseOffsetNs, true, "app");
504 mEventThread = new EventThread(vsyncSrc, *this, false);
505 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
506 sfVsyncPhaseOffsetNs, true, "sf");
507 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
508 mEventQueue.setEventThread(mSFEventThread);
509
510 // set SFEventThread to SCHED_FIFO to minimize jitter
511 struct sched_param param = {0};
512 param.sched_priority = 2;
513 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
514 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
515 }
516
517
518 // Initialize the H/W composer object. There may or may not be an
519 // actual hardware composer underneath.
520 mHwc = new HWComposer(this,
521 *static_cast<HWComposer::EventHandler *>(this));
522
523 // get a RenderEngine for the given display / config (can't fail)
524 mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID());
525
526 // retrieve the EGL context that was selected/created
527 mEGLContext = mRenderEngine->getEGLContext();
528
529 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
530 "couldn't create EGLContext");
531
532 // initialize our non-virtual displays
533 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
534 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
535 // set-up the displays that are already connected
536 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
537 // All non-virtual displays are currently considered secure.
538 bool isSecure = true;
539 createBuiltinDisplayLocked(type);
540 wp<IBinder> token = mBuiltinDisplays[i];
541
542 sp<IGraphicBufferProducer> producer;
543 sp<IGraphicBufferConsumer> consumer;
Chia-I Wu527747d2017-03-13 20:38:48 +0000544 BufferQueue::createBufferQueue(&producer, &consumer,
545 new GraphicBufferAlloc());
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000546
547 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
548 consumer);
549 int32_t hwcId = allocateHwcDisplayId(type);
550 sp<DisplayDevice> hw = new DisplayDevice(this,
551 type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
552 fbs, producer,
553 mRenderEngine->getEGLConfig());
554 if (i > DisplayDevice::DISPLAY_PRIMARY) {
555 // FIXME: currently we don't get blank/unblank requests
556 // for displays other than the main display, so we always
557 // assume a connected display is unblanked.
558 ALOGD("marking display %zu as acquired/unblanked", i);
559 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
560 }
561 mDisplays.add(token, hw);
562 }
563 }
564
565 // make the GLContext current so that we can create textures when creating Layers
566 // (which may happens before we render something)
567 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
568
569 mEventControlThread = new EventControlThread(this);
570 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
571
572 // set a fake vsync period if there is no HWComposer
573 if (mHwc->initCheck() != NO_ERROR) {
574 mPrimaryDispSync.setPeriod(16666667);
575 }
576
577 // initialize our drawing state
578 mDrawingState = mCurrentState;
579
580 // set initial conditions (e.g. unblank default device)
581 initializeDisplays();
582
583 mRenderEngine->primeCache();
584
Wei Wangb254fa32017-01-31 17:43:23 -0800585 mStartBootAnimThread = new StartBootAnimThread();
586 if (mStartBootAnimThread->Start() != NO_ERROR) {
587 ALOGE("Run StartBootAnimThread failed!");
588 }
589
590 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000591}
592
593int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
594 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
595 type : mHwc->allocateDisplayId();
596}
597
598void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800599 // Start boot animation service by setting a property mailbox
600 // if property setting thread is already running, Start() will be just a NOP
601 mStartBootAnimThread->Start();
602 // Wait until property was set
603 if (mStartBootAnimThread->join() != NO_ERROR) {
604 ALOGE("Join StartBootAnimThread failed!");
605 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000606}
607
608size_t SurfaceFlinger::getMaxTextureSize() const {
609 return mRenderEngine->getMaxTextureSize();
610}
611
612size_t SurfaceFlinger::getMaxViewportDims() const {
613 return mRenderEngine->getMaxViewportDims();
614}
615
616// ----------------------------------------------------------------------------
617
618bool SurfaceFlinger::authenticateSurfaceTexture(
619 const sp<IGraphicBufferProducer>& bufferProducer) const {
620 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800621 return authenticateSurfaceTextureLocked(bufferProducer);
622}
623
624bool SurfaceFlinger::authenticateSurfaceTextureLocked(
625 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000626 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
627 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
628}
629
Brian Anderson069b3652016-07-22 10:32:47 -0700630status_t SurfaceFlinger::getSupportedFrameTimestamps(
Brian Anderson3890c392016-07-25 12:48:08 -0700631 std::vector<FrameEvent>* outSupported) const {
Brian Anderson069b3652016-07-22 10:32:47 -0700632 *outSupported = {
Brian Anderson3890c392016-07-25 12:48:08 -0700633 FrameEvent::REQUESTED_PRESENT,
634 FrameEvent::ACQUIRE,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700635 FrameEvent::LATCH,
Brian Anderson3890c392016-07-25 12:48:08 -0700636 FrameEvent::FIRST_REFRESH_START,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700637 FrameEvent::LAST_REFRESH_START,
Brian Andersonb04c6f02016-10-21 12:57:46 -0700638 FrameEvent::GPU_COMPOSITION_DONE,
Brian Anderson3890c392016-07-25 12:48:08 -0700639 FrameEvent::DISPLAY_RETIRE,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700640 FrameEvent::DEQUEUE_READY,
Brian Anderson3890c392016-07-25 12:48:08 -0700641 FrameEvent::RELEASE,
Brian Anderson069b3652016-07-22 10:32:47 -0700642 };
643 return NO_ERROR;
644}
645
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000646status_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) {
1035 std::lock_guard<std::mutex> lock(mCompositeTimingLock);
1036 *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
1198 // Integer division and modulo round toward 0 not -inf, so we need to
1199 // treat negative and positive offsets differently.
1200 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs >= 0) ?
1201 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1202 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1203
1204 // Snap the latency to a value that removes scheduling jitter from the
1205 // composition and present times, which often have >1ms of jitter.
1206 // Reducing jitter is important if an app attempts to extrapolate
1207 // something (such as user input) to an accurate diasplay time.
1208 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1209 // with (presentLatency % interval).
1210 nsecs_t snappedCompositeToPresentLatency = -1;
1211 if (compositeToPresentLatency >= 0) {
1212 nsecs_t bias = vsyncInterval / 2;
1213 int64_t extraVsyncs =
1214 (compositeToPresentLatency - idealLatency + bias) /
1215 vsyncInterval;
1216 nsecs_t extraLatency = extraVsyncs * vsyncInterval;
1217 snappedCompositeToPresentLatency = idealLatency + extraLatency;
1218 }
1219
1220 std::lock_guard<std::mutex> lock(mCompositeTimingLock);
1221 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1222 mCompositorTiming.interval = vsyncInterval;
1223 if (snappedCompositeToPresentLatency >= 0) {
1224 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
1225 }
1226}
1227
1228void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001229{
Brian Andersond6927fb2016-07-23 23:37:30 -07001230 const HWComposer& hwc = getHwComposer();
1231 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1232
Brian Anderson3d4039d2016-09-23 16:31:30 -07001233 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1234 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1235 glCompositionDoneFenceTime =
1236 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1237 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1238 } else {
1239 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1240 }
1241 mGlCompositionDoneTimeline.updateSignalTimes();
1242
1243 sp<Fence> displayFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1244 const std::shared_ptr<FenceTime>& presentFenceTime = FenceTime::NO_FENCE;
1245 auto retireFenceTime = std::make_shared<FenceTime>(displayFence);
1246 mDisplayTimeline.push(retireFenceTime);
1247 mDisplayTimeline.updateSignalTimes();
Brian Andersond6927fb2016-07-23 23:37:30 -07001248
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001249 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1250 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1251
1252 // We use the refreshStartTime which might be sampled a little later than
1253 // when we started doing work for this frame, but that should be okay
1254 // since updateCompositorTiming has snapping logic.
1255 updateCompositorTiming(
1256 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
1257
Robert Carr2047fae2016-11-28 14:09:09 -08001258 mDrawingState.traverseInZOrder([&](Layer* layer) {
1259 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001260 presentFenceTime, retireFenceTime, mCompositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001261 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001262 recordBufferingStats(layer->getName().string(),
1263 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001264 }
Robert Carr2047fae2016-11-28 14:09:09 -08001265 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001266
Brian Anderson3d4039d2016-09-23 16:31:30 -07001267 if (displayFence->isValid()) {
1268 if (mPrimaryDispSync.addPresentFence(displayFence)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001269 enableHardwareVsync();
1270 } else {
1271 disableHardwareVsync(false);
1272 }
1273 }
1274
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001275 if (kIgnorePresentFences) {
1276 if (hw->isDisplayOn()) {
1277 enableHardwareVsync();
1278 }
1279 }
1280
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001281 if (mAnimCompositionPending) {
1282 mAnimCompositionPending = false;
1283
Brian Anderson3d4039d2016-09-23 16:31:30 -07001284 if (retireFenceTime->isValid()) {
1285 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001286 } else {
1287 // The HWC doesn't support present fences, so use the refresh
1288 // timestamp instead.
1289 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1290 mAnimFrameTracker.setActualPresentTime(presentTime);
1291 }
1292 mAnimFrameTracker.advanceFrame();
1293 }
1294
1295 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1296 return;
1297 }
1298
1299 nsecs_t currentTime = systemTime();
1300 if (mHasPoweredOff) {
1301 mHasPoweredOff = false;
1302 } else {
1303 nsecs_t period = mPrimaryDispSync.getPeriod();
1304 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1305 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1306 if (numPeriods < NUM_BUCKETS - 1) {
1307 mFrameBuckets[numPeriods] += elapsedTime;
1308 } else {
1309 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1310 }
1311 mTotalTime += elapsedTime;
1312 }
1313 mLastSwapTime = currentTime;
1314}
1315
1316void SurfaceFlinger::rebuildLayerStacks() {
1317 // rebuild the visible layer list per screen
1318 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1319 ATRACE_CALL();
1320 mVisibleRegionsDirty = false;
1321 invalidateHwcGeometry();
1322
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001323 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1324 Region opaqueRegion;
1325 Region dirtyRegion;
1326 Vector< sp<Layer> > layersSortedByZ;
1327 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1328 const Transform& tr(hw->getTransform());
1329 const Rect bounds(hw->getBounds());
1330 if (hw->isDisplayOn()) {
Robert Carr2047fae2016-11-28 14:09:09 -08001331 computeVisibleRegions(hw->getLayerStack(), dirtyRegion,
1332 opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001333
Robert Carr2047fae2016-11-28 14:09:09 -08001334 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001335 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001336 Region drawRegion(tr.transform(
1337 layer->visibleNonTransparentRegion));
1338 drawRegion.andSelf(bounds);
1339 if (!drawRegion.isEmpty()) {
1340 layersSortedByZ.add(layer);
1341 }
1342 }
Robert Carr2047fae2016-11-28 14:09:09 -08001343 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001344 }
1345 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1346 hw->undefinedRegion.set(bounds);
1347 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1348 hw->dirtyRegion.orSelf(dirtyRegion);
1349 }
1350 }
1351}
1352
1353void SurfaceFlinger::setUpHWComposer() {
1354 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1355 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1356 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1357 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1358
1359 // If nothing has changed (!dirty), don't recompose.
1360 // If something changed, but we don't currently have any visible layers,
1361 // and didn't when we last did a composition, then skip it this time.
1362 // The second rule does two things:
1363 // - When all layers are removed from a display, we'll emit one black
1364 // frame, then nothing more until we get new layers.
1365 // - When a display is created with a private layer stack, we won't
1366 // emit any black frames until a layer is added to the layer stack.
1367 bool mustRecompose = dirty && !(empty && wasEmpty);
1368
1369 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1370 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1371 mustRecompose ? "doing" : "skipping",
1372 dirty ? "+" : "-",
1373 empty ? "+" : "-",
1374 wasEmpty ? "+" : "-");
1375
1376 mDisplays[dpy]->beginFrame(mustRecompose);
1377
1378 if (mustRecompose) {
1379 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1380 }
1381 }
1382
1383 HWComposer& hwc(getHwComposer());
1384 if (hwc.initCheck() == NO_ERROR) {
1385 // build the h/w work list
1386 if (CC_UNLIKELY(mHwWorkListDirty)) {
1387 mHwWorkListDirty = false;
1388 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1389 sp<const DisplayDevice> hw(mDisplays[dpy]);
1390 const int32_t id = hw->getHwcDisplayId();
1391 if (id >= 0) {
1392 const Vector< sp<Layer> >& currentLayers(
1393 hw->getVisibleLayersSortedByZ());
1394 const size_t count = currentLayers.size();
1395 if (hwc.createWorkList(id, count) == NO_ERROR) {
1396 HWComposer::LayerListIterator cur = hwc.begin(id);
1397 const HWComposer::LayerListIterator end = hwc.end(id);
1398 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1399 const sp<Layer>& layer(currentLayers[i]);
1400 layer->setGeometry(hw, *cur);
1401 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1402 cur->setSkip(true);
1403 }
1404 }
1405 }
1406 }
1407 }
1408 }
1409
1410 // set the per-frame data
1411 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1412 sp<const DisplayDevice> hw(mDisplays[dpy]);
1413 const int32_t id = hw->getHwcDisplayId();
1414 if (id >= 0) {
1415 const Vector< sp<Layer> >& currentLayers(
1416 hw->getVisibleLayersSortedByZ());
1417 const size_t count = currentLayers.size();
1418 HWComposer::LayerListIterator cur = hwc.begin(id);
1419 const HWComposer::LayerListIterator end = hwc.end(id);
1420 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1421 /*
1422 * update the per-frame h/w composer data for each layer
1423 * and build the transparent region of the FB
1424 */
1425 const sp<Layer>& layer(currentLayers[i]);
1426 layer->setPerFrameData(hw, *cur);
1427 }
1428 }
1429 }
1430
1431 // If possible, attempt to use the cursor overlay on each display.
1432 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1433 sp<const DisplayDevice> hw(mDisplays[dpy]);
1434 const int32_t id = hw->getHwcDisplayId();
1435 if (id >= 0) {
1436 const Vector< sp<Layer> >& currentLayers(
1437 hw->getVisibleLayersSortedByZ());
1438 const size_t count = currentLayers.size();
1439 HWComposer::LayerListIterator cur = hwc.begin(id);
1440 const HWComposer::LayerListIterator end = hwc.end(id);
1441 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1442 const sp<Layer>& layer(currentLayers[i]);
1443 if (layer->isPotentialCursor()) {
1444 cur->setIsCursorLayerHint();
1445 break;
1446 }
1447 }
1448 }
1449 }
1450
1451 status_t err = hwc.prepare();
1452 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1453
1454 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1455 sp<const DisplayDevice> hw(mDisplays[dpy]);
1456 hw->prepareFrame(hwc);
1457 }
1458 }
1459}
1460
1461void SurfaceFlinger::doComposition() {
1462 ATRACE_CALL();
1463 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1464 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1465 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1466 if (hw->isDisplayOn()) {
1467 // transform the dirty region into this screen's coordinate space
1468 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1469
1470 // repaint the framebuffer (if needed)
1471 doDisplayComposition(hw, dirtyRegion);
1472
1473 hw->dirtyRegion.clear();
1474 hw->flip(hw->swapRegion);
1475 hw->swapRegion.clear();
1476 }
1477 // inform the h/w that we're done compositing
1478 hw->compositionComplete();
1479 }
1480 postFramebuffer();
1481}
1482
1483void SurfaceFlinger::postFramebuffer()
1484{
1485 ATRACE_CALL();
1486
1487 const nsecs_t now = systemTime();
1488 mDebugInSwapBuffers = now;
1489
1490 HWComposer& hwc(getHwComposer());
1491 if (hwc.initCheck() == NO_ERROR) {
1492 if (!hwc.supportsFramebufferTarget()) {
1493 // EGL spec says:
1494 // "surface must be bound to the calling thread's current context,
1495 // for the current rendering API."
1496 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1497 }
1498 hwc.commit();
1499 }
1500
1501 // make the default display current because the VirtualDisplayDevice code cannot
1502 // deal with dequeueBuffer() being called outside of the composition loop; however
1503 // the code below can call glFlush() which is allowed (and does in some case) call
1504 // dequeueBuffer().
1505 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1506
1507 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1508 sp<const DisplayDevice> hw(mDisplays[dpy]);
1509 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1510 hw->onSwapBuffersCompleted(hwc);
1511 const size_t count = currentLayers.size();
1512 int32_t id = hw->getHwcDisplayId();
1513 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1514 HWComposer::LayerListIterator cur = hwc.begin(id);
1515 const HWComposer::LayerListIterator end = hwc.end(id);
1516 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1517 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1518 }
1519 } else {
1520 for (size_t i = 0; i < count; i++) {
1521 currentLayers[i]->onLayerDisplayed(hw, NULL);
1522 }
1523 }
1524 }
1525
1526 mLastSwapBufferTime = systemTime() - now;
1527 mDebugInSwapBuffers = 0;
1528
1529 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1530 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1531 logFrameStats();
1532 }
1533}
1534
1535void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1536{
1537 ATRACE_CALL();
1538
1539 // here we keep a copy of the drawing state (that is the state that's
1540 // going to be overwritten by handleTransactionLocked()) outside of
1541 // mStateLock so that the side-effects of the State assignment
1542 // don't happen with mStateLock held (which can cause deadlocks).
1543 State drawingState(mDrawingState);
1544
1545 Mutex::Autolock _l(mStateLock);
1546 const nsecs_t now = systemTime();
1547 mDebugInTransaction = now;
1548
1549 // Here we're guaranteed that some transaction flags are set
1550 // so we can call handleTransactionLocked() unconditionally.
1551 // We call getTransactionFlags(), which will also clear the flags,
1552 // with mStateLock held to guarantee that mCurrentState won't change
1553 // until the transaction is committed.
1554
1555 transactionFlags = getTransactionFlags(eTransactionMask);
1556 handleTransactionLocked(transactionFlags);
1557
1558 mLastTransactionTime = systemTime() - now;
1559 mDebugInTransaction = 0;
1560 invalidateHwcGeometry();
1561 // here the transaction has been committed
1562}
1563
1564void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1565{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001566 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001567 mCurrentState.traverseInZOrder([](Layer* layer) {
1568 layer->notifyAvailableFrames();
1569 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001570
1571 /*
1572 * Traversal of the children
1573 * (perform the transaction for each of them if needed)
1574 */
1575
1576 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001577 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001578 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001579 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001580
1581 const uint32_t flags = layer->doTransaction(0);
1582 if (flags & Layer::eVisibleRegion)
1583 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001584 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001585 }
1586
1587 /*
1588 * Perform display own transactions if needed
1589 */
1590
1591 if (transactionFlags & eDisplayTransactionNeeded) {
1592 // here we take advantage of Vector's copy-on-write semantics to
1593 // improve performance by skipping the transaction entirely when
1594 // know that the lists are identical
1595 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1596 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1597 if (!curr.isIdenticalTo(draw)) {
1598 mVisibleRegionsDirty = true;
1599 const size_t cc = curr.size();
1600 size_t dc = draw.size();
1601
1602 // find the displays that were removed
1603 // (ie: in drawing state but not in current state)
1604 // also handle displays that changed
1605 // (ie: displays that are in both lists)
1606 for (size_t i=0 ; i<dc ; i++) {
1607 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1608 if (j < 0) {
1609 // in drawing state but not in current state
1610 if (!draw[i].isMainDisplay()) {
1611 // Call makeCurrent() on the primary display so we can
1612 // be sure that nothing associated with this display
1613 // is current.
1614 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1615 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1616 sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1617 if (hw != NULL)
1618 hw->disconnect(getHwComposer());
1619 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1620 mEventThread->onHotplugReceived(draw[i].type, false);
1621 mDisplays.removeItem(draw.keyAt(i));
1622 } else {
1623 ALOGW("trying to remove the main display");
1624 }
1625 } else {
1626 // this display is in both lists. see if something changed.
1627 const DisplayDeviceState& state(curr[j]);
1628 const wp<IBinder>& display(curr.keyAt(j));
1629 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1630 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1631 if (state_binder != draw_binder) {
1632 // changing the surface is like destroying and
1633 // recreating the DisplayDevice, so we just remove it
1634 // from the drawing state, so that it get re-added
1635 // below.
1636 sp<DisplayDevice> hw(getDisplayDevice(display));
1637 if (hw != NULL)
1638 hw->disconnect(getHwComposer());
1639 mDisplays.removeItem(display);
1640 mDrawingState.displays.removeItemsAt(i);
1641 dc--; i--;
1642 // at this point we must loop to the next item
1643 continue;
1644 }
1645
1646 const sp<DisplayDevice> disp(getDisplayDevice(display));
1647 if (disp != NULL) {
1648 if (state.layerStack != draw[i].layerStack) {
1649 disp->setLayerStack(state.layerStack);
1650 }
1651 if ((state.orientation != draw[i].orientation)
1652 || (state.viewport != draw[i].viewport)
1653 || (state.frame != draw[i].frame))
1654 {
1655 disp->setProjection(state.orientation,
1656 state.viewport, state.frame);
1657 }
1658 if (state.width != draw[i].width || state.height != draw[i].height) {
1659 disp->setDisplaySize(state.width, state.height);
1660 }
1661 }
1662 }
1663 }
1664
1665 // find displays that were added
1666 // (ie: in current state but not in drawing state)
1667 for (size_t i=0 ; i<cc ; i++) {
1668 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1669 const DisplayDeviceState& state(curr[i]);
1670
1671 sp<DisplaySurface> dispSurface;
1672 sp<IGraphicBufferProducer> producer;
1673 sp<IGraphicBufferProducer> bqProducer;
1674 sp<IGraphicBufferConsumer> bqConsumer;
Chia-I Wu527747d2017-03-13 20:38:48 +00001675 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer,
1676 new GraphicBufferAlloc());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001677
1678 int32_t hwcDisplayId = -1;
1679 if (state.isVirtualDisplay()) {
1680 // Virtual displays without a surface are dormant:
1681 // they have external state (layer stack, projection,
1682 // etc.) but no internal state (i.e. a DisplayDevice).
1683 if (state.surface != NULL) {
1684
1685 int width = 0;
1686 int status = state.surface->query(
1687 NATIVE_WINDOW_WIDTH, &width);
1688 ALOGE_IF(status != NO_ERROR,
1689 "Unable to query width (%d)", status);
1690 int height = 0;
1691 status = state.surface->query(
1692 NATIVE_WINDOW_HEIGHT, &height);
1693 ALOGE_IF(status != NO_ERROR,
1694 "Unable to query height (%d)", status);
1695 if (mUseHwcVirtualDisplays &&
1696 (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 ||
1697 (width <= MAX_VIRTUAL_DISPLAY_DIMENSION &&
1698 height <= MAX_VIRTUAL_DISPLAY_DIMENSION))) {
1699 hwcDisplayId = allocateHwcDisplayId(state.type);
1700 }
1701
1702 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1703 *mHwc, hwcDisplayId, state.surface,
1704 bqProducer, bqConsumer, state.displayName);
1705
1706 dispSurface = vds;
1707 producer = vds;
1708 }
1709 } else {
1710 ALOGE_IF(state.surface!=NULL,
1711 "adding a supported display, but rendering "
1712 "surface is provided (%p), ignoring it",
1713 state.surface.get());
1714 hwcDisplayId = allocateHwcDisplayId(state.type);
1715 // for supported (by hwc) displays we provide our
1716 // own rendering surface
1717 dispSurface = new FramebufferSurface(*mHwc, state.type,
1718 bqConsumer);
1719 producer = bqProducer;
1720 }
1721
1722 const wp<IBinder>& display(curr.keyAt(i));
1723 if (dispSurface != NULL) {
1724 sp<DisplayDevice> hw = new DisplayDevice(this,
1725 state.type, hwcDisplayId,
1726 mHwc->getFormat(hwcDisplayId), state.isSecure,
1727 display, dispSurface, producer,
1728 mRenderEngine->getEGLConfig());
1729 hw->setLayerStack(state.layerStack);
1730 hw->setProjection(state.orientation,
1731 state.viewport, state.frame);
1732 hw->setDisplayName(state.displayName);
1733 mDisplays.add(display, hw);
1734 if (state.isVirtualDisplay()) {
1735 if (hwcDisplayId >= 0) {
1736 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1737 hw->getWidth(), hw->getHeight(),
1738 hw->getFormat());
1739 }
1740 } else {
1741 mEventThread->onHotplugReceived(state.type, true);
1742 }
1743 }
1744 }
1745 }
1746 }
1747 }
1748
1749 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1750 // The transform hint might have changed for some layers
1751 // (either because a display has changed, or because a layer
1752 // as changed).
1753 //
1754 // Walk through all the layers in currentLayers,
1755 // and update their transform hint.
1756 //
1757 // If a layer is visible only on a single display, then that
1758 // display is used to calculate the hint, otherwise we use the
1759 // default display.
1760 //
1761 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1762 // the hint is set before we acquire a buffer from the surface texture.
1763 //
1764 // NOTE: layer transactions have taken place already, so we use their
1765 // drawing state. However, SurfaceFlinger's own transaction has not
1766 // happened yet, so we must use the current state layer list
1767 // (soon to become the drawing state list).
1768 //
1769 sp<const DisplayDevice> disp;
1770 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001771 bool first = true;
1772 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001773 // NOTE: we rely on the fact that layers are sorted by
1774 // layerStack first (so we don't have to traverse the list
1775 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001776 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001777 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001778 currentlayerStack = layerStack;
1779 // figure out if this layerstack is mirrored
1780 // (more than one display) if so, pick the default display,
1781 // if not, pick the only display it's on.
1782 disp.clear();
1783 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1784 sp<const DisplayDevice> hw(mDisplays[dpy]);
1785 if (hw->getLayerStack() == currentlayerStack) {
1786 if (disp == NULL) {
1787 disp = hw;
1788 } else {
1789 disp = NULL;
1790 break;
1791 }
1792 }
1793 }
1794 }
1795 if (disp == NULL) {
1796 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1797 // redraw after transform hint changes. See bug 8508397.
1798
1799 // could be null when this layer is using a layerStack
1800 // that is not visible on any display. Also can occur at
1801 // screen off/on times.
1802 disp = getDefaultDisplayDevice();
1803 }
1804 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001805
1806 first = false;
1807 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001808 }
1809
1810
1811 /*
1812 * Perform our own transaction if needed
1813 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001814
1815 if (mLayersAdded) {
1816 mLayersAdded = false;
1817 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001818 mVisibleRegionsDirty = true;
1819 }
1820
1821 // some layers might have been removed, so
1822 // we need to update the regions they're exposing.
1823 if (mLayersRemoved) {
1824 mLayersRemoved = false;
1825 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001826 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001827 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001828 // this layer is not visible anymore
1829 // TODO: we could traverse the tree from front to back and
1830 // compute the actual visible region
1831 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001832 Region visibleReg;
1833 visibleReg.set(layer->computeScreenBounds());
1834 invalidateLayerStack(layer->getLayerStack(), visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001835 }
Robert Carr2047fae2016-11-28 14:09:09 -08001836 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001837 }
1838
1839 commitTransaction();
1840
1841 updateCursorAsync();
1842}
1843
1844void SurfaceFlinger::updateCursorAsync()
1845{
1846 HWComposer& hwc(getHwComposer());
1847 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1848 sp<const DisplayDevice> hw(mDisplays[dpy]);
1849 const int32_t id = hw->getHwcDisplayId();
1850 if (id < 0) {
1851 continue;
1852 }
1853 const Vector< sp<Layer> >& currentLayers(
1854 hw->getVisibleLayersSortedByZ());
1855 const size_t count = currentLayers.size();
1856 HWComposer::LayerListIterator cur = hwc.begin(id);
1857 const HWComposer::LayerListIterator end = hwc.end(id);
1858 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1859 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1860 continue;
1861 }
1862 const sp<Layer>& layer(currentLayers[i]);
1863 Rect cursorPos = layer->getPosition(hw);
1864 hwc.setCursorPositionAsync(id, cursorPos);
1865 break;
1866 }
1867 }
1868}
1869
1870void SurfaceFlinger::commitTransaction()
1871{
1872 if (!mLayersPendingRemoval.isEmpty()) {
1873 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001874 for (const auto& l : mLayersPendingRemoval) {
1875 recordBufferingStats(l->getName().string(),
1876 l->getOccupancyHistory(true));
1877 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001878 }
1879 mLayersPendingRemoval.clear();
1880 }
1881
1882 // If this transaction is part of a window animation then the next frame
1883 // we composite should be considered an animation as well.
1884 mAnimCompositionPending = mAnimTransactionPending;
1885
1886 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001887 mDrawingState.traverseInZOrder([](Layer* layer) {
1888 layer->commitChildList();
1889 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001890 mTransactionPending = false;
1891 mAnimTransactionPending = false;
1892 mTransactionCV.broadcast();
1893}
1894
Robert Carr2047fae2016-11-28 14:09:09 -08001895void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001896 Region& outDirtyRegion, Region& outOpaqueRegion)
1897{
1898 ATRACE_CALL();
1899
1900 Region aboveOpaqueLayers;
1901 Region aboveCoveredLayers;
1902 Region dirty;
1903
1904 outDirtyRegion.clear();
1905
Robert Carr2047fae2016-11-28 14:09:09 -08001906 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001907 // start with the whole surface at its current location
1908 const Layer::State& s(layer->getDrawingState());
1909
1910 // only consider the layers on the given layer stack
Robert Carr1f0a16a2016-10-24 16:27:39 -07001911 if (layer->getLayerStack() != layerStack)
Robert Carr2047fae2016-11-28 14:09:09 -08001912 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001913
1914 /*
1915 * opaqueRegion: area of a surface that is fully opaque.
1916 */
1917 Region opaqueRegion;
1918
1919 /*
1920 * visibleRegion: area of a surface that is visible on screen
1921 * and not fully transparent. This is essentially the layer's
1922 * footprint minus the opaque regions above it.
1923 * Areas covered by a translucent surface are considered visible.
1924 */
1925 Region visibleRegion;
1926
1927 /*
1928 * coveredRegion: area of a surface that is covered by all
1929 * visible regions above it (which includes the translucent areas).
1930 */
1931 Region coveredRegion;
1932
1933 /*
1934 * transparentRegion: area of a surface that is hinted to be completely
1935 * transparent. This is only used to tell when the layer has no visible
1936 * non-transparent regions and can be removed from the layer list. It
1937 * does not affect the visibleRegion of this layer or any layers
1938 * beneath it. The hint may not be correct if apps don't respect the
1939 * SurfaceView restrictions (which, sadly, some don't).
1940 */
1941 Region transparentRegion;
1942
1943
1944 // handle hidden surfaces by setting the visible region to empty
1945 if (CC_LIKELY(layer->isVisible())) {
1946 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001947 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001948 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001949 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001950 if (!visibleRegion.isEmpty()) {
1951 // Remove the transparent area from the visible region
1952 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001953 if (tr.preserveRects()) {
1954 // transform the transparent region
1955 transparentRegion = tr.transform(s.activeTransparentRegion);
1956 } else {
1957 // transformation too complex, can't do the
1958 // transparent region optimization.
1959 transparentRegion.clear();
1960 }
1961 }
1962
1963 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001964 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001965 if (s.alpha==255 && !translucent &&
1966 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1967 // the opaque region is the layer's footprint
1968 opaqueRegion = visibleRegion;
1969 }
1970 }
1971 }
1972
1973 // Clip the covered region to the visible region
1974 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1975
1976 // Update aboveCoveredLayers for next (lower) layer
1977 aboveCoveredLayers.orSelf(visibleRegion);
1978
1979 // subtract the opaque region covered by the layers above us
1980 visibleRegion.subtractSelf(aboveOpaqueLayers);
1981
1982 // compute this layer's dirty region
1983 if (layer->contentDirty) {
1984 // we need to invalidate the whole region
1985 dirty = visibleRegion;
1986 // as well, as the old visible region
1987 dirty.orSelf(layer->visibleRegion);
1988 layer->contentDirty = false;
1989 } else {
1990 /* compute the exposed region:
1991 * the exposed region consists of two components:
1992 * 1) what's VISIBLE now and was COVERED before
1993 * 2) what's EXPOSED now less what was EXPOSED before
1994 *
1995 * note that (1) is conservative, we start with the whole
1996 * visible region but only keep what used to be covered by
1997 * something -- which mean it may have been exposed.
1998 *
1999 * (2) handles areas that were not covered by anything but got
2000 * exposed because of a resize.
2001 */
2002 const Region newExposed = visibleRegion - coveredRegion;
2003 const Region oldVisibleRegion = layer->visibleRegion;
2004 const Region oldCoveredRegion = layer->coveredRegion;
2005 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2006 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2007 }
2008 dirty.subtractSelf(aboveOpaqueLayers);
2009
2010 // accumulate to the screen dirty region
2011 outDirtyRegion.orSelf(dirty);
2012
2013 // Update aboveOpaqueLayers for next (lower) layer
2014 aboveOpaqueLayers.orSelf(opaqueRegion);
2015
2016 // Store the visible region in screen space
2017 layer->setVisibleRegion(visibleRegion);
2018 layer->setCoveredRegion(coveredRegion);
2019 layer->setVisibleNonTransparentRegion(
2020 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002021 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002022
2023 outOpaqueRegion = aboveOpaqueLayers;
2024}
2025
2026void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2027 const Region& dirty) {
2028 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2029 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2030 if (hw->getLayerStack() == layerStack) {
2031 hw->dirtyRegion.orSelf(dirty);
2032 }
2033 }
2034}
2035
2036bool SurfaceFlinger::handlePageFlip()
2037{
Brian Andersond6927fb2016-07-23 23:37:30 -07002038 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002039 Region dirtyRegion;
2040
2041 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002042 bool frameQueued = false;
2043
2044 // Store the set of layers that need updates. This set must not change as
2045 // buffers are being latched, as this could result in a deadlock.
2046 // Example: Two producers share the same command stream and:
2047 // 1.) Layer 0 is latched
2048 // 2.) Layer 0 gets a new frame
2049 // 2.) Layer 1 gets a new frame
2050 // 3.) Layer 1 is latched.
2051 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2052 // second frame. But layer 0's second frame could be waiting on display.
2053 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002054 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002055 if (layer->hasQueuedFrame()) {
2056 frameQueued = true;
2057 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002058 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002059 } else {
2060 layer->useEmptyDamage();
2061 }
2062 } else {
2063 layer->useEmptyDamage();
2064 }
Robert Carr2047fae2016-11-28 14:09:09 -08002065 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002066 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2067 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002068 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002069 layer->useSurfaceDamage();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002070 invalidateLayerStack(layer->getLayerStack(), dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002071 }
2072
2073 mVisibleRegionsDirty |= visibleRegions;
2074
2075 // If we will need to wake up at some time in the future to deal with a
2076 // queued frame that shouldn't be displayed during this vsync period, wake
2077 // up during the next vsync period to check again.
2078 if (frameQueued && layersWithQueuedFrames.empty()) {
2079 signalLayerUpdate();
2080 }
2081
2082 // Only continue with the refresh if there is actually new work to do
2083 return !layersWithQueuedFrames.empty();
2084}
2085
2086void SurfaceFlinger::invalidateHwcGeometry()
2087{
2088 mHwWorkListDirty = true;
2089}
2090
2091
2092void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2093 const Region& inDirtyRegion)
2094{
2095 // We only need to actually compose the display if:
2096 // 1) It is being handled by hardware composer, which may need this to
2097 // keep its virtual display state machine in sync, or
2098 // 2) There is work to be done (the dirty region isn't empty)
2099 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2100 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2101 return;
2102 }
2103
2104 Region dirtyRegion(inDirtyRegion);
2105
2106 // compute the invalid region
2107 hw->swapRegion.orSelf(dirtyRegion);
2108
2109 uint32_t flags = hw->getFlags();
2110 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2111 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2112 // takes a rectangle, we must make sure to update that whole
2113 // rectangle in that case
2114 dirtyRegion.set(hw->swapRegion.bounds());
2115 } else {
2116 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2117 // We need to redraw the rectangle that will be updated
2118 // (pushed to the framebuffer).
2119 // This is needed because PARTIAL_UPDATES only takes one
2120 // rectangle instead of a region (see DisplayDevice::flip())
2121 dirtyRegion.set(hw->swapRegion.bounds());
2122 } else {
2123 // we need to redraw everything (the whole screen)
2124 dirtyRegion.set(hw->bounds());
2125 hw->swapRegion = dirtyRegion;
2126 }
2127 }
2128
2129 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2130 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2131 } else {
2132 RenderEngine& engine(getRenderEngine());
2133 mat4 colorMatrix = mColorMatrix;
2134 if (mDaltonize) {
2135 colorMatrix = colorMatrix * mDaltonizer();
2136 }
2137 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2138 doComposeSurfaces(hw, dirtyRegion);
2139 engine.setupColorTransform(oldMatrix);
2140 }
2141
2142 // update the swap region and clear the dirty region
2143 hw->swapRegion.orSelf(dirtyRegion);
2144
2145 // swap buffers (presentation)
2146 hw->swapBuffers(getHwComposer());
2147}
2148
2149bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2150{
2151 RenderEngine& engine(getRenderEngine());
2152 const int32_t id = hw->getHwcDisplayId();
2153 HWComposer& hwc(getHwComposer());
2154 HWComposer::LayerListIterator cur = hwc.begin(id);
2155 const HWComposer::LayerListIterator end = hwc.end(id);
2156
2157 bool hasGlesComposition = hwc.hasGlesComposition(id);
2158 if (hasGlesComposition) {
2159 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2160 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2161 hw->getDisplayName().string());
2162 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2163 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2164 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2165 }
2166 return false;
2167 }
2168
2169 // Never touch the framebuffer if we don't have any framebuffer layers
2170 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2171 if (hasHwcComposition) {
2172 // when using overlays, we assume a fully transparent framebuffer
2173 // NOTE: we could reduce how much we need to clear, for instance
2174 // remove where there are opaque FB layers. however, on some
2175 // GPUs doing a "clean slate" clear might be more efficient.
2176 // We'll revisit later if needed.
2177 engine.clearWithColor(0, 0, 0, 0);
2178 } else {
2179 // we start with the whole screen area
2180 const Region bounds(hw->getBounds());
2181
2182 // we remove the scissor part
2183 // we're left with the letterbox region
2184 // (common case is that letterbox ends-up being empty)
2185 const Region letterbox(bounds.subtract(hw->getScissor()));
2186
2187 // compute the area to clear
2188 Region region(hw->undefinedRegion.merge(letterbox));
2189
2190 // but limit it to the dirty region
2191 region.andSelf(dirty);
2192
2193 // screen is already cleared here
2194 if (!region.isEmpty()) {
2195 // can happen with SurfaceView
2196 drawWormhole(hw, region);
2197 }
2198 }
2199
2200 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2201 // just to be on the safe side, we don't set the
2202 // scissor on the main display. It should never be needed
2203 // anyways (though in theory it could since the API allows it).
2204 const Rect& bounds(hw->getBounds());
2205 const Rect& scissor(hw->getScissor());
2206 if (scissor != bounds) {
2207 // scissor doesn't match the screen's dimensions, so we
2208 // need to clear everything outside of it and enable
2209 // the GL scissor so we don't draw anything where we shouldn't
2210
2211 // enable scissor for this frame
2212 const uint32_t height = hw->getHeight();
2213 engine.setScissor(scissor.left, height - scissor.bottom,
2214 scissor.getWidth(), scissor.getHeight());
2215 }
2216 }
2217 }
2218
2219 /*
2220 * and then, render the layers targeted at the framebuffer
2221 */
2222
2223 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2224 const size_t count = layers.size();
2225 const Transform& tr = hw->getTransform();
2226 if (cur != end) {
2227 // we're using h/w composer
2228 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2229 const sp<Layer>& layer(layers[i]);
2230 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2231 if (!clip.isEmpty()) {
2232 switch (cur->getCompositionType()) {
2233 case HWC_CURSOR_OVERLAY:
2234 case HWC_OVERLAY: {
2235 const Layer::State& state(layer->getDrawingState());
2236 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2237 && i
2238 && layer->isOpaque(state) && (state.alpha == 0xFF)
2239 && hasGlesComposition) {
2240 // never clear the very first layer since we're
2241 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002242 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002243 }
2244 break;
2245 }
2246 case HWC_FRAMEBUFFER: {
2247 layer->draw(hw, clip);
2248 break;
2249 }
2250 case HWC_FRAMEBUFFER_TARGET: {
2251 // this should not happen as the iterator shouldn't
2252 // let us get there.
2253 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2254 break;
2255 }
2256 }
2257 }
2258 layer->setAcquireFence(hw, *cur);
2259 }
2260 } else {
2261 // we're not using h/w composer
2262 for (size_t i=0 ; i<count ; ++i) {
2263 const sp<Layer>& layer(layers[i]);
2264 const Region clip(dirty.intersect(
2265 tr.transform(layer->visibleRegion)));
2266 if (!clip.isEmpty()) {
2267 layer->draw(hw, clip);
2268 }
2269 }
2270 }
2271
2272 // disable scissor at the end of the frame
2273 engine.disableScissor();
2274 return true;
2275}
2276
2277void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2278 const int32_t height = hw->getHeight();
2279 RenderEngine& engine(getRenderEngine());
2280 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2281}
2282
2283status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2284 const sp<IBinder>& handle,
2285 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002286 const sp<Layer>& lbc,
2287 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002288{
2289 // add this layer to the current state list
2290 {
2291 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002292 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002293 return NO_MEMORY;
2294 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002295 if (parent == nullptr) {
2296 mCurrentState.layersSortedByZ.add(lbc);
2297 } else {
2298 parent->addChild(lbc);
2299 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002300 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002301 mLayersAdded = true;
2302 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002303 }
2304
2305 // attach this layer to the client
2306 client->attachLayer(handle, lbc);
2307
2308 return NO_ERROR;
2309}
2310
Robert Carr9524cb32017-02-13 11:32:32 -08002311status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002312 Mutex::Autolock _l(mStateLock);
2313
Robert Carr1f0a16a2016-10-24 16:27:39 -07002314 const auto& p = layer->getParent();
2315 const ssize_t index = (p != nullptr) ? p->removeChild(layer) :
2316 mCurrentState.layersSortedByZ.remove(layer);
2317
Robert Carr136e2f62017-02-08 17:54:29 -08002318 // As a matter of normal operation, the LayerCleaner will produce a second
2319 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2320 // so we will succeed in promoting it, but it's already been removed
2321 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2322 // otherwise something has gone wrong and we are leaking the layer.
2323 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002324 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2325 layer->getName().string(),
2326 (p != nullptr) ? p->getName().string() : "no-parent");
2327 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002328 } else if (index < 0) {
2329 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002330 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002331
2332 mLayersPendingRemoval.add(layer);
2333 mLayersRemoved = true;
2334 mNumLayers--;
2335 setTransactionFlags(eTransactionNeeded);
2336 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002337}
2338
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002339uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002340 return android_atomic_release_load(&mTransactionFlags);
2341}
2342
2343uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2344 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2345}
2346
2347uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2348 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2349 if ((old & flags)==0) { // wake the server up
2350 signalTransaction();
2351 }
2352 return old;
2353}
2354
2355void SurfaceFlinger::setTransactionState(
2356 const Vector<ComposerState>& state,
2357 const Vector<DisplayState>& displays,
2358 uint32_t flags)
2359{
2360 ATRACE_CALL();
2361 Mutex::Autolock _l(mStateLock);
2362 uint32_t transactionFlags = 0;
2363
2364 if (flags & eAnimation) {
2365 // For window updates that are part of an animation we must wait for
2366 // previous animation "frames" to be handled.
2367 while (mAnimTransactionPending) {
2368 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2369 if (CC_UNLIKELY(err != NO_ERROR)) {
2370 // just in case something goes wrong in SF, return to the
2371 // caller after a few seconds.
2372 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2373 "waiting for previous animation frame");
2374 mAnimTransactionPending = false;
2375 break;
2376 }
2377 }
2378 }
2379
2380 size_t count = displays.size();
2381 for (size_t i=0 ; i<count ; i++) {
2382 const DisplayState& s(displays[i]);
2383 transactionFlags |= setDisplayStateLocked(s);
2384 }
2385
2386 count = state.size();
2387 for (size_t i=0 ; i<count ; i++) {
2388 const ComposerState& s(state[i]);
2389 // Here we need to check that the interface we're given is indeed
2390 // one of our own. A malicious client could give us a NULL
2391 // IInterface, or one of its own or even one of our own but a
2392 // different type. All these situations would cause us to crash.
2393 //
2394 // NOTE: it would be better to use RTTI as we could directly check
2395 // that we have a Client*. however, RTTI is disabled in Android.
2396 if (s.client != NULL) {
2397 sp<IBinder> binder = IInterface::asBinder(s.client);
2398 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002399 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002400 sp<Client> client( static_cast<Client *>(s.client.get()) );
2401 transactionFlags |= setClientStateLocked(client, s.state);
2402 }
2403 }
2404 }
2405 }
2406
2407 // If a synchronous transaction is explicitly requested without any changes,
2408 // force a transaction anyway. This can be used as a flush mechanism for
2409 // previous async transactions.
2410 if (transactionFlags == 0 && (flags & eSynchronous)) {
2411 transactionFlags = eTransactionNeeded;
2412 }
2413
2414 if (transactionFlags) {
2415 if (mInterceptor.isEnabled()) {
2416 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2417 }
2418
2419 // this triggers the transaction
2420 setTransactionFlags(transactionFlags);
2421
2422 // if this is a synchronous transaction, wait for it to take effect
2423 // before returning.
2424 if (flags & eSynchronous) {
2425 mTransactionPending = true;
2426 }
2427 if (flags & eAnimation) {
2428 mAnimTransactionPending = true;
2429 }
2430 while (mTransactionPending) {
2431 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2432 if (CC_UNLIKELY(err != NO_ERROR)) {
2433 // just in case something goes wrong in SF, return to the
2434 // called after a few seconds.
2435 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2436 mTransactionPending = false;
2437 break;
2438 }
2439 }
2440 }
2441}
2442
2443uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2444{
2445 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2446 if (dpyIdx < 0)
2447 return 0;
2448
2449 uint32_t flags = 0;
2450 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2451 if (disp.isValid()) {
2452 const uint32_t what = s.what;
2453 if (what & DisplayState::eSurfaceChanged) {
2454 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2455 disp.surface = s.surface;
2456 flags |= eDisplayTransactionNeeded;
2457 }
2458 }
2459 if (what & DisplayState::eLayerStackChanged) {
2460 if (disp.layerStack != s.layerStack) {
2461 disp.layerStack = s.layerStack;
2462 flags |= eDisplayTransactionNeeded;
2463 }
2464 }
2465 if (what & DisplayState::eDisplayProjectionChanged) {
2466 if (disp.orientation != s.orientation) {
2467 disp.orientation = s.orientation;
2468 flags |= eDisplayTransactionNeeded;
2469 }
2470 if (disp.frame != s.frame) {
2471 disp.frame = s.frame;
2472 flags |= eDisplayTransactionNeeded;
2473 }
2474 if (disp.viewport != s.viewport) {
2475 disp.viewport = s.viewport;
2476 flags |= eDisplayTransactionNeeded;
2477 }
2478 }
2479 if (what & DisplayState::eDisplaySizeChanged) {
2480 if (disp.width != s.width) {
2481 disp.width = s.width;
2482 flags |= eDisplayTransactionNeeded;
2483 }
2484 if (disp.height != s.height) {
2485 disp.height = s.height;
2486 flags |= eDisplayTransactionNeeded;
2487 }
2488 }
2489 }
2490 return flags;
2491}
2492
2493uint32_t SurfaceFlinger::setClientStateLocked(
2494 const sp<Client>& client,
2495 const layer_state_t& s)
2496{
2497 uint32_t flags = 0;
2498 sp<Layer> layer(client->getLayerUser(s.surface));
2499 if (layer != 0) {
2500 const uint32_t what = s.what;
2501 bool geometryAppliesWithResize =
2502 what & layer_state_t::eGeometryAppliesWithResize;
2503 if (what & layer_state_t::ePositionChanged) {
2504 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2505 flags |= eTraversalNeeded;
2506 }
2507 }
2508 if (what & layer_state_t::eLayerChanged) {
2509 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002510 const auto& p = layer->getParent();
2511 if (p == nullptr) {
2512 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2513 if (layer->setLayer(s.z) && idx >= 0) {
2514 mCurrentState.layersSortedByZ.removeAt(idx);
2515 mCurrentState.layersSortedByZ.add(layer);
2516 // we need traversal (state changed)
2517 // AND transaction (list changed)
2518 flags |= eTransactionNeeded|eTraversalNeeded;
2519 }
2520 } else {
2521 if (p->setChildLayer(layer, s.z)) {
2522 flags |= eTransactionNeeded|eTraversalNeeded;
2523 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002524 }
2525 }
2526 if (what & layer_state_t::eSizeChanged) {
2527 if (layer->setSize(s.w, s.h)) {
2528 flags |= eTraversalNeeded;
2529 }
2530 }
2531 if (what & layer_state_t::eAlphaChanged) {
2532 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2533 flags |= eTraversalNeeded;
2534 }
2535 if (what & layer_state_t::eMatrixChanged) {
2536 if (layer->setMatrix(s.matrix))
2537 flags |= eTraversalNeeded;
2538 }
2539 if (what & layer_state_t::eTransparentRegionChanged) {
2540 if (layer->setTransparentRegionHint(s.transparentRegion))
2541 flags |= eTraversalNeeded;
2542 }
2543 if (what & layer_state_t::eFlagsChanged) {
2544 if (layer->setFlags(s.flags, s.mask))
2545 flags |= eTraversalNeeded;
2546 }
2547 if (what & layer_state_t::eCropChanged) {
2548 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2549 flags |= eTraversalNeeded;
2550 }
2551 if (what & layer_state_t::eFinalCropChanged) {
2552 if (layer->setFinalCrop(s.finalCrop))
2553 flags |= eTraversalNeeded;
2554 }
2555 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002556 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002557 // We only allow setting layer stacks for top level layers,
2558 // everything else inherits layer stack from its parent.
2559 if (layer->hasParent()) {
2560 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2561 layer->getName().string());
2562 } else if (idx < 0) {
2563 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2564 "that also does not appear in the top level layer list. Something"
2565 " has gone wrong.", layer->getName().string());
2566 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002567 mCurrentState.layersSortedByZ.removeAt(idx);
2568 mCurrentState.layersSortedByZ.add(layer);
2569 // we need traversal (state changed)
2570 // AND transaction (list changed)
2571 flags |= eTransactionNeeded|eTraversalNeeded;
2572 }
2573 }
2574 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002575 if (s.barrierHandle != nullptr) {
2576 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2577 } else if (s.barrierGbp != nullptr) {
2578 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2579 if (authenticateSurfaceTextureLocked(gbp)) {
2580 const auto& otherLayer =
2581 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2582 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2583 } else {
2584 ALOGE("Attempt to defer transaction to to an"
2585 " unrecognized GraphicBufferProducer");
2586 }
2587 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002588 // We don't trigger a traversal here because if no other state is
2589 // changed, we don't want this to cause any more work
2590 }
Robert Carr1db73f62016-12-21 12:58:51 -08002591 if (what & layer_state_t::eReparentChildren) {
2592 if (layer->reparentChildren(s.reparentHandle)) {
2593 flags |= eTransactionNeeded|eTraversalNeeded;
2594 }
2595 }
Robert Carr9524cb32017-02-13 11:32:32 -08002596 if (what & layer_state_t::eDetachChildren) {
2597 layer->detachChildren();
2598 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002599 if (what & layer_state_t::eOverrideScalingModeChanged) {
2600 layer->setOverrideScalingMode(s.overrideScalingMode);
2601 // We don't trigger a traversal here because if no other state is
2602 // changed, we don't want this to cause any more work
2603 }
2604 }
2605 return flags;
2606}
2607
2608status_t SurfaceFlinger::createLayer(
2609 const String8& name,
2610 const sp<Client>& client,
2611 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002612 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2613 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002614{
2615 if (int32_t(w|h) < 0) {
2616 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2617 int(w), int(h));
2618 return BAD_VALUE;
2619 }
2620
2621 status_t result = NO_ERROR;
2622
2623 sp<Layer> layer;
2624
2625 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2626 case ISurfaceComposerClient::eFXSurfaceNormal:
2627 result = createNormalLayer(client,
2628 name, w, h, flags, format,
2629 handle, gbp, &layer);
2630 break;
2631 case ISurfaceComposerClient::eFXSurfaceDim:
2632 result = createDimLayer(client,
2633 name, w, h, flags,
2634 handle, gbp, &layer);
2635 break;
2636 default:
2637 result = BAD_VALUE;
2638 break;
2639 }
2640
2641 if (result != NO_ERROR) {
2642 return result;
2643 }
2644
Albert Chaulk479c60c2017-01-27 14:21:34 -05002645 layer->setInfo(windowType, ownerUid);
2646
Robert Carr1f0a16a2016-10-24 16:27:39 -07002647 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002648 if (result != NO_ERROR) {
2649 return result;
2650 }
2651 mInterceptor.saveSurfaceCreation(layer);
2652
2653 setTransactionFlags(eTransactionNeeded);
2654 return result;
2655}
2656
2657status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2658 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2659 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2660{
2661 // initialize the surfaces
2662 switch (format) {
2663 case PIXEL_FORMAT_TRANSPARENT:
2664 case PIXEL_FORMAT_TRANSLUCENT:
2665 format = PIXEL_FORMAT_RGBA_8888;
2666 break;
2667 case PIXEL_FORMAT_OPAQUE:
2668 format = PIXEL_FORMAT_RGBX_8888;
2669 break;
2670 }
2671
2672 *outLayer = new Layer(this, client, name, w, h, flags);
2673 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2674 if (err == NO_ERROR) {
2675 *handle = (*outLayer)->getHandle();
2676 *gbp = (*outLayer)->getProducer();
2677 }
2678
2679 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2680 return err;
2681}
2682
2683status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2684 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2685 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2686{
2687 *outLayer = new LayerDim(this, client, name, w, h, flags);
2688 *handle = (*outLayer)->getHandle();
2689 *gbp = (*outLayer)->getProducer();
2690 return NO_ERROR;
2691}
2692
2693status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2694{
Robert Carr9524cb32017-02-13 11:32:32 -08002695 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002696 status_t err = NO_ERROR;
2697 sp<Layer> l(client->getLayerUser(handle));
2698 if (l != NULL) {
2699 mInterceptor.saveSurfaceDeletion(l);
2700 err = removeLayer(l);
2701 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2702 "error removing layer=%p (%s)", l.get(), strerror(-err));
2703 }
2704 return err;
2705}
2706
2707status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2708{
2709 // called by ~LayerCleaner() when all references to the IBinder (handle)
2710 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002711 sp<Layer> l = layer.promote();
2712 if (l == nullptr) {
2713 // The layer has already been removed, carry on
2714 return NO_ERROR;
2715 } if (l->getParent() != nullptr) {
2716 // If we have a parent, then we can continue to live as long as it does.
2717 return NO_ERROR;
2718 }
2719 return removeLayer(l);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002720}
2721
2722// ---------------------------------------------------------------------------
2723
2724void SurfaceFlinger::onInitializeDisplays() {
2725 // reset screen orientation and use primary layer stack
2726 Vector<ComposerState> state;
2727 Vector<DisplayState> displays;
2728 DisplayState d;
2729 d.what = DisplayState::eDisplayProjectionChanged |
2730 DisplayState::eLayerStackChanged;
2731 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2732 d.layerStack = 0;
2733 d.orientation = DisplayState::eOrientationDefault;
2734 d.frame.makeInvalid();
2735 d.viewport.makeInvalid();
2736 d.width = 0;
2737 d.height = 0;
2738 displays.add(d);
2739 setTransactionState(state, displays, 0);
2740 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2741
2742 const nsecs_t period =
2743 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2744 mAnimFrameTracker.setDisplayRefreshPeriod(period);
2745}
2746
2747void SurfaceFlinger::initializeDisplays() {
2748 class MessageScreenInitialized : public MessageBase {
2749 SurfaceFlinger* flinger;
2750 public:
2751 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2752 virtual bool handler() {
2753 flinger->onInitializeDisplays();
2754 return true;
2755 }
2756 };
2757 sp<MessageBase> msg = new MessageScreenInitialized(this);
2758 postMessageAsync(msg); // we may be called from main thread, use async message
2759}
2760
2761void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2762 int mode) {
2763 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2764 this);
2765 int32_t type = hw->getDisplayType();
2766 int currentMode = hw->getPowerMode();
2767
2768 if (mode == currentMode) {
2769 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2770 return;
2771 }
2772
2773 hw->setPowerMode(mode);
2774 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2775 ALOGW("Trying to set power mode for virtual display");
2776 return;
2777 }
2778
2779 if (mInterceptor.isEnabled()) {
2780 Mutex::Autolock _l(mStateLock);
2781 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2782 if (idx < 0) {
2783 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2784 return;
2785 }
2786 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2787 }
2788
2789 if (currentMode == HWC_POWER_MODE_OFF) {
2790 // Turn on the display
2791 getHwComposer().setPowerMode(type, mode);
2792 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2793 // FIXME: eventthread only knows about the main display right now
2794 mEventThread->onScreenAcquired();
2795 resyncToHardwareVsync(true);
2796 }
2797
2798 mVisibleRegionsDirty = true;
2799 mHasPoweredOff = true;
2800 repaintEverything();
2801
2802 struct sched_param param = {0};
2803 param.sched_priority = 1;
2804 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2805 ALOGW("Couldn't set SCHED_FIFO on display on");
2806 }
2807 } else if (mode == HWC_POWER_MODE_OFF) {
2808 // Turn off the display
2809 struct sched_param param = {0};
2810 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2811 ALOGW("Couldn't set SCHED_OTHER on display off");
2812 }
2813
2814 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2815 disableHardwareVsync(true); // also cancels any in-progress resync
2816
2817 // FIXME: eventthread only knows about the main display right now
2818 mEventThread->onScreenReleased();
2819 }
2820
2821 getHwComposer().setPowerMode(type, mode);
2822 mVisibleRegionsDirty = true;
2823 // from this point on, SF will stop drawing on this display
2824 } else {
2825 getHwComposer().setPowerMode(type, mode);
2826 }
2827}
2828
2829void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2830 class MessageSetPowerMode: public MessageBase {
2831 SurfaceFlinger& mFlinger;
2832 sp<IBinder> mDisplay;
2833 int mMode;
2834 public:
2835 MessageSetPowerMode(SurfaceFlinger& flinger,
2836 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2837 mDisplay(disp) { mMode = mode; }
2838 virtual bool handler() {
2839 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2840 if (hw == NULL) {
2841 ALOGE("Attempt to set power mode = %d for null display %p",
2842 mMode, mDisplay.get());
2843 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2844 ALOGW("Attempt to set power mode = %d for virtual display",
2845 mMode);
2846 } else {
2847 mFlinger.setPowerModeInternal(hw, mMode);
2848 }
2849 return true;
2850 }
2851 };
2852 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2853 postMessageSync(msg);
2854}
2855
2856// ---------------------------------------------------------------------------
2857
2858status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2859{
2860 String8 result;
2861
2862 IPCThreadState* ipc = IPCThreadState::self();
2863 const int pid = ipc->getCallingPid();
2864 const int uid = ipc->getCallingUid();
2865 if ((uid != AID_SHELL) &&
2866 !PermissionCache::checkPermission(sDump, pid, uid)) {
2867 result.appendFormat("Permission Denial: "
2868 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2869 } else {
2870 // Try to get the main lock, but give up after one second
2871 // (this would indicate SF is stuck, but we want to be able to
2872 // print something in dumpsys).
2873 status_t err = mStateLock.timedLock(s2ns(1));
2874 bool locked = (err == NO_ERROR);
2875 if (!locked) {
2876 result.appendFormat(
2877 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2878 "dumping anyways (no locks held)\n", strerror(-err), err);
2879 }
2880
2881 bool dumpAll = true;
2882 size_t index = 0;
2883 size_t numArgs = args.size();
2884 if (numArgs) {
2885 if ((index < numArgs) &&
2886 (args[index] == String16("--list"))) {
2887 index++;
2888 listLayersLocked(args, index, result);
2889 dumpAll = false;
2890 }
2891
2892 if ((index < numArgs) &&
2893 (args[index] == String16("--latency"))) {
2894 index++;
2895 dumpStatsLocked(args, index, result);
2896 dumpAll = false;
2897 }
2898
2899 if ((index < numArgs) &&
2900 (args[index] == String16("--latency-clear"))) {
2901 index++;
2902 clearStatsLocked(args, index, result);
2903 dumpAll = false;
2904 }
2905
2906 if ((index < numArgs) &&
2907 (args[index] == String16("--dispsync"))) {
2908 index++;
2909 mPrimaryDispSync.dump(result);
2910 dumpAll = false;
2911 }
2912
2913 if ((index < numArgs) &&
2914 (args[index] == String16("--static-screen"))) {
2915 index++;
2916 dumpStaticScreenStats(result);
2917 dumpAll = false;
2918 }
2919
2920 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07002921 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002922 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07002923 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002924 dumpAll = false;
2925 }
2926 }
2927
2928 if (dumpAll) {
2929 dumpAllLocked(args, index, result);
2930 }
2931
2932 if (locked) {
2933 mStateLock.unlock();
2934 }
2935 }
2936 write(fd, result.string(), result.size());
2937 return NO_ERROR;
2938}
2939
2940void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2941 size_t& /* index */, String8& result) const
2942{
Robert Carr2047fae2016-11-28 14:09:09 -08002943 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002944 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08002945 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002946}
2947
2948void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2949 String8& result) const
2950{
2951 String8 name;
2952 if (index < args.size()) {
2953 name = String8(args[index]);
2954 index++;
2955 }
2956
2957 const nsecs_t period =
2958 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2959 result.appendFormat("%" PRId64 "\n", period);
2960
2961 if (name.isEmpty()) {
2962 mAnimFrameTracker.dumpStats(result);
2963 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08002964 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002965 if (name == layer->getName()) {
2966 layer->dumpFrameStats(result);
2967 }
Robert Carr2047fae2016-11-28 14:09:09 -08002968 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002969 }
2970}
2971
2972void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
2973 String8& /* result */)
2974{
2975 String8 name;
2976 if (index < args.size()) {
2977 name = String8(args[index]);
2978 index++;
2979 }
2980
Robert Carr2047fae2016-11-28 14:09:09 -08002981 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002982 if (name.isEmpty() || (name == layer->getName())) {
2983 layer->clearFrameStats();
2984 }
Robert Carr2047fae2016-11-28 14:09:09 -08002985 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002986
2987 mAnimFrameTracker.clearStats();
2988}
2989
2990// This should only be called from the main thread. Otherwise it would need
2991// the lock and should use mCurrentState rather than mDrawingState.
2992void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08002993 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002994 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08002995 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002996
2997 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
2998}
2999
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003000void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003001{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003002 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003003 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3004
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003005 if (isLayerTripleBufferingDisabled())
3006 result.append(" DISABLE_TRIPLE_BUFFERING");
3007 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003008}
3009
3010void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3011{
3012 result.appendFormat("Static screen stats:\n");
3013 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3014 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3015 float percent = 100.0f *
3016 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3017 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3018 b + 1, bucketTimeSec, percent);
3019 }
3020 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3021 float percent = 100.0f *
3022 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3023 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3024 NUM_BUCKETS - 1, bucketTimeSec, percent);
3025}
3026
Brian Andersond6927fb2016-07-23 23:37:30 -07003027void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3028 result.appendFormat("Layer frame timestamps:\n");
3029
3030 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3031 const size_t count = currentLayers.size();
3032 for (size_t i=0 ; i<count ; i++) {
3033 currentLayers[i]->dumpFrameEvents(result);
3034 }
3035}
3036
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003037void SurfaceFlinger::recordBufferingStats(const char* layerName,
3038 std::vector<OccupancyTracker::Segment>&& history) {
3039 Mutex::Autolock lock(mBufferingStatsMutex);
3040 auto& stats = mBufferingStats[layerName];
3041 for (const auto& segment : history) {
3042 if (!segment.usedThirdBuffer) {
3043 stats.twoBufferTime += segment.totalTime;
3044 }
3045 if (segment.occupancyAverage < 1.0f) {
3046 stats.doubleBufferedTime += segment.totalTime;
3047 } else if (segment.occupancyAverage < 2.0f) {
3048 stats.tripleBufferedTime += segment.totalTime;
3049 }
3050 ++stats.numSegments;
3051 stats.totalTime += segment.totalTime;
3052 }
3053}
3054
3055void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3056 result.append("Buffering stats:\n");
3057 result.append(" [Layer name] <Active time> <Two buffer> "
3058 "<Double buffered> <Triple buffered>\n");
3059 Mutex::Autolock lock(mBufferingStatsMutex);
3060 typedef std::tuple<std::string, float, float, float> BufferTuple;
3061 std::map<float, BufferTuple, std::greater<float>> sorted;
3062 for (const auto& statsPair : mBufferingStats) {
3063 const char* name = statsPair.first.c_str();
3064 const BufferingStats& stats = statsPair.second;
3065 if (stats.numSegments == 0) {
3066 continue;
3067 }
3068 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3069 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3070 stats.totalTime;
3071 float doubleBufferRatio = static_cast<float>(
3072 stats.doubleBufferedTime) / stats.totalTime;
3073 float tripleBufferRatio = static_cast<float>(
3074 stats.tripleBufferedTime) / stats.totalTime;
3075 sorted.insert({activeTime, {name, twoBufferRatio,
3076 doubleBufferRatio, tripleBufferRatio}});
3077 }
3078 for (const auto& sortedPair : sorted) {
3079 float activeTime = sortedPair.first;
3080 const BufferTuple& values = sortedPair.second;
3081 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3082 std::get<0>(values).c_str(), activeTime,
3083 std::get<1>(values), std::get<2>(values),
3084 std::get<3>(values));
3085 }
3086 result.append("\n");
3087}
3088
3089void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3090 String8& result) const
3091{
3092 bool colorize = false;
3093 if (index < args.size()
3094 && (args[index] == String16("--color"))) {
3095 colorize = true;
3096 index++;
3097 }
3098
3099 Colorizer colorizer(colorize);
3100
3101 // figure out if we're stuck somewhere
3102 const nsecs_t now = systemTime();
3103 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3104 const nsecs_t inTransaction(mDebugInTransaction);
3105 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3106 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3107
3108 /*
3109 * Dump library configuration.
3110 */
3111
3112 colorizer.bold(result);
3113 result.append("Build configuration:");
3114 colorizer.reset(result);
3115 appendSfConfigString(result);
3116 appendUiConfigString(result);
3117 appendGuiConfigString(result);
3118 result.append("\n");
3119
3120 colorizer.bold(result);
3121 result.append("Sync configuration: ");
3122 colorizer.reset(result);
3123 result.append(SyncFeatures::getInstance().toString());
3124 result.append("\n");
3125
3126 colorizer.bold(result);
3127 result.append("DispSync configuration: ");
3128 colorizer.reset(result);
3129 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
3130 "present offset %d ns (refresh %" PRId64 " ns)",
3131 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, PRESENT_TIME_OFFSET_FROM_VSYNC_NS,
3132 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3133 result.append("\n");
3134
3135 // Dump static screen stats
3136 result.append("\n");
3137 dumpStaticScreenStats(result);
3138 result.append("\n");
3139
3140 dumpBufferingStats(result);
3141
3142 /*
3143 * Dump the visible layer list
3144 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003145 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003146 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003147 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003148 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003149 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003150 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003151
3152 /*
3153 * Dump Display state
3154 */
3155
3156 colorizer.bold(result);
3157 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3158 colorizer.reset(result);
3159 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3160 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3161 hw->dump(result);
3162 }
3163
3164 /*
3165 * Dump SurfaceFlinger global state
3166 */
3167
3168 colorizer.bold(result);
3169 result.append("SurfaceFlinger global state:\n");
3170 colorizer.reset(result);
3171
3172 HWComposer& hwc(getHwComposer());
3173 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3174
3175 colorizer.bold(result);
3176 result.appendFormat("EGL implementation : %s\n",
3177 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3178 colorizer.reset(result);
3179 result.appendFormat("%s\n",
3180 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3181
3182 mRenderEngine->dump(result);
3183
3184 hw->undefinedRegion.dump(result, "undefinedRegion");
3185 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3186 hw->getOrientation(), hw->isDisplayOn());
3187 result.appendFormat(
3188 " last eglSwapBuffers() time: %f us\n"
3189 " last transaction time : %f us\n"
3190 " transaction-flags : %08x\n"
3191 " refresh-rate : %f fps\n"
3192 " x-dpi : %f\n"
3193 " y-dpi : %f\n"
3194 " gpu_to_cpu_unsupported : %d\n"
3195 ,
3196 mLastSwapBufferTime/1000.0,
3197 mLastTransactionTime/1000.0,
3198 mTransactionFlags,
3199 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3200 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3201 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3202 !mGpuToCpuSupported);
3203
3204 result.appendFormat(" eglSwapBuffers time: %f us\n",
3205 inSwapBuffersDuration/1000.0);
3206
3207 result.appendFormat(" transaction time: %f us\n",
3208 inTransactionDuration/1000.0);
3209
3210 /*
3211 * VSYNC state
3212 */
3213 mEventThread->dump(result);
3214
3215 /*
3216 * Dump HWComposer state
3217 */
3218 colorizer.bold(result);
3219 result.append("h/w composer state:\n");
3220 colorizer.reset(result);
3221 result.appendFormat(" h/w composer %s and %s\n",
3222 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3223 (mDebugDisableHWC || mDebugRegion || mDaltonize
3224 || mHasColorMatrix) ? "disabled" : "enabled");
3225 hwc.dump(result);
3226
3227 /*
3228 * Dump gralloc state
3229 */
3230 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3231 alloc.dump(result);
3232}
3233
3234const Vector< sp<Layer> >&
3235SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3236 // Note: mStateLock is held here
3237 wp<IBinder> dpy;
3238 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3239 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3240 dpy = mDisplays.keyAt(i);
3241 break;
3242 }
3243 }
3244 if (dpy == NULL) {
3245 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3246 // Just use the primary display so we have something to return
3247 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3248 }
3249 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
3250}
3251
3252bool SurfaceFlinger::startDdmConnection()
3253{
3254 void* libddmconnection_dso =
3255 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3256 if (!libddmconnection_dso) {
3257 return false;
3258 }
3259 void (*DdmConnection_start)(const char* name);
3260 DdmConnection_start =
3261 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3262 if (!DdmConnection_start) {
3263 dlclose(libddmconnection_dso);
3264 return false;
3265 }
3266 (*DdmConnection_start)(getServiceName());
3267 return true;
3268}
3269
3270status_t SurfaceFlinger::onTransact(
3271 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3272{
3273 switch (code) {
3274 case CREATE_CONNECTION:
3275 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003276 case BOOT_FINISHED:
3277 case CLEAR_ANIMATION_FRAME_STATS:
3278 case GET_ANIMATION_FRAME_STATS:
3279 case SET_POWER_MODE:
3280 case GET_HDR_CAPABILITIES:
3281 {
3282 // codes that require permission check
3283 IPCThreadState* ipc = IPCThreadState::self();
3284 const int pid = ipc->getCallingPid();
3285 const int uid = ipc->getCallingUid();
3286 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3287 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3288 ALOGE("Permission Denial: "
3289 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3290 return PERMISSION_DENIED;
3291 }
3292 break;
3293 }
Robert Carr1db73f62016-12-21 12:58:51 -08003294 /*
3295 * Calling setTransactionState is safe, because you need to have been
3296 * granted a reference to Client* and Handle* to do anything with it.
3297 *
3298 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3299 */
3300 case SET_TRANSACTION_STATE:
3301 case CREATE_SCOPED_CONNECTION:
3302 {
3303 break;
3304 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003305 case CAPTURE_SCREEN:
3306 {
3307 // codes that require permission check
3308 IPCThreadState* ipc = IPCThreadState::self();
3309 const int pid = ipc->getCallingPid();
3310 const int uid = ipc->getCallingUid();
3311 if ((uid != AID_GRAPHICS) &&
3312 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3313 ALOGE("Permission Denial: "
3314 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3315 return PERMISSION_DENIED;
3316 }
3317 break;
3318 }
3319 }
3320
3321 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3322 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3323 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3324 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3325 IPCThreadState* ipc = IPCThreadState::self();
3326 const int pid = ipc->getCallingPid();
3327 const int uid = ipc->getCallingUid();
3328 ALOGE("Permission Denial: "
3329 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3330 return PERMISSION_DENIED;
3331 }
3332 int n;
3333 switch (code) {
3334 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3335 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3336 return NO_ERROR;
3337 case 1002: // SHOW_UPDATES
3338 n = data.readInt32();
3339 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3340 invalidateHwcGeometry();
3341 repaintEverything();
3342 return NO_ERROR;
3343 case 1004:{ // repaint everything
3344 repaintEverything();
3345 return NO_ERROR;
3346 }
3347 case 1005:{ // force transaction
3348 setTransactionFlags(
3349 eTransactionNeeded|
3350 eDisplayTransactionNeeded|
3351 eTraversalNeeded);
3352 return NO_ERROR;
3353 }
3354 case 1006:{ // send empty update
3355 signalRefresh();
3356 return NO_ERROR;
3357 }
3358 case 1008: // toggle use of hw composer
3359 n = data.readInt32();
3360 mDebugDisableHWC = n ? 1 : 0;
3361 invalidateHwcGeometry();
3362 repaintEverything();
3363 return NO_ERROR;
3364 case 1009: // toggle use of transform hint
3365 n = data.readInt32();
3366 mDebugDisableTransformHint = n ? 1 : 0;
3367 invalidateHwcGeometry();
3368 repaintEverything();
3369 return NO_ERROR;
3370 case 1010: // interrogate.
3371 reply->writeInt32(0);
3372 reply->writeInt32(0);
3373 reply->writeInt32(mDebugRegion);
3374 reply->writeInt32(0);
3375 reply->writeInt32(mDebugDisableHWC);
3376 return NO_ERROR;
3377 case 1013: {
3378 Mutex::Autolock _l(mStateLock);
3379 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3380 reply->writeInt32(hw->getPageFlipCount());
3381 return NO_ERROR;
3382 }
3383 case 1014: {
3384 // daltonize
3385 n = data.readInt32();
3386 switch (n % 10) {
3387 case 1:
3388 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3389 break;
3390 case 2:
3391 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3392 break;
3393 case 3:
3394 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3395 break;
3396 }
3397 if (n >= 10) {
3398 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3399 } else {
3400 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3401 }
3402 mDaltonize = n > 0;
3403 invalidateHwcGeometry();
3404 repaintEverything();
3405 return NO_ERROR;
3406 }
3407 case 1015: {
3408 // apply a color matrix
3409 n = data.readInt32();
3410 mHasColorMatrix = n ? 1 : 0;
3411 if (n) {
3412 // color matrix is sent as mat3 matrix followed by vec3
3413 // offset, then packed into a mat4 where the last row is
3414 // the offset and extra values are 0
3415 for (size_t i = 0 ; i < 4; i++) {
3416 for (size_t j = 0; j < 4; j++) {
3417 mColorMatrix[i][j] = data.readFloat();
3418 }
3419 }
3420 } else {
3421 mColorMatrix = mat4();
3422 }
3423 invalidateHwcGeometry();
3424 repaintEverything();
3425 return NO_ERROR;
3426 }
3427 // This is an experimental interface
3428 // Needs to be shifted to proper binder interface when we productize
3429 case 1016: {
3430 n = data.readInt32();
3431 mPrimaryDispSync.setRefreshSkipCount(n);
3432 return NO_ERROR;
3433 }
3434 case 1017: {
3435 n = data.readInt32();
3436 mForceFullDamage = static_cast<bool>(n);
3437 return NO_ERROR;
3438 }
3439 case 1018: { // Modify Choreographer's phase offset
3440 n = data.readInt32();
3441 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3442 return NO_ERROR;
3443 }
3444 case 1019: { // Modify SurfaceFlinger's phase offset
3445 n = data.readInt32();
3446 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3447 return NO_ERROR;
3448 }
3449 case 1020: { // Layer updates interceptor
3450 n = data.readInt32();
3451 if (n) {
3452 ALOGV("Interceptor enabled");
3453 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3454 }
3455 else{
3456 ALOGV("Interceptor disabled");
3457 mInterceptor.disable();
3458 }
3459 return NO_ERROR;
3460 }
3461 case 1021: { // Disable HWC virtual displays
3462 n = data.readInt32();
3463 mUseHwcVirtualDisplays = !n;
3464 return NO_ERROR;
3465 }
3466 }
3467 }
3468 return err;
3469}
3470
3471void SurfaceFlinger::repaintEverything() {
3472 android_atomic_or(1, &mRepaintEverything);
3473 signalTransaction();
3474}
3475
3476// ---------------------------------------------------------------------------
3477// Capture screen into an IGraphiBufferProducer
3478// ---------------------------------------------------------------------------
3479
3480/* The code below is here to handle b/8734824
3481 *
3482 * We create a IGraphicBufferProducer wrapper that forwards all calls
3483 * from the surfaceflinger thread to the calling binder thread, where they
3484 * are executed. This allows the calling thread in the calling process to be
3485 * reused and not depend on having "enough" binder threads to handle the
3486 * requests.
3487 */
3488class GraphicProducerWrapper : public BBinder, public MessageHandler {
3489 /* Parts of GraphicProducerWrapper are run on two different threads,
3490 * communicating by sending messages via Looper but also by shared member
3491 * data. Coherence maintenance is subtle and in places implicit (ugh).
3492 *
3493 * Don't rely on Looper's sendMessage/handleMessage providing
3494 * release/acquire semantics for any data not actually in the Message.
3495 * Data going from surfaceflinger to binder threads needs to be
3496 * synchronized explicitly.
3497 *
3498 * Barrier open/wait do provide release/acquire semantics. This provides
3499 * implicit synchronization for data coming back from binder to
3500 * surfaceflinger threads.
3501 */
3502
3503 sp<IGraphicBufferProducer> impl;
3504 sp<Looper> looper;
3505 status_t result;
3506 bool exitPending;
3507 bool exitRequested;
3508 Barrier barrier;
3509 uint32_t code;
3510 Parcel const* data;
3511 Parcel* reply;
3512
3513 enum {
3514 MSG_API_CALL,
3515 MSG_EXIT
3516 };
3517
3518 /*
3519 * Called on surfaceflinger thread. This is called by our "fake"
3520 * BpGraphicBufferProducer. We package the data and reply Parcel and
3521 * forward them to the binder thread.
3522 */
3523 virtual status_t transact(uint32_t code,
3524 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3525 this->code = code;
3526 this->data = &data;
3527 this->reply = reply;
3528 if (exitPending) {
3529 // if we've exited, we run the message synchronously right here.
3530 // note (JH): as far as I can tell from looking at the code, this
3531 // never actually happens. if it does, i'm not sure if it happens
3532 // on the surfaceflinger or binder thread.
3533 handleMessage(Message(MSG_API_CALL));
3534 } else {
3535 barrier.close();
3536 // Prevent stores to this->{code, data, reply} from being
3537 // reordered later than the construction of Message.
3538 atomic_thread_fence(memory_order_release);
3539 looper->sendMessage(this, Message(MSG_API_CALL));
3540 barrier.wait();
3541 }
3542 return result;
3543 }
3544
3545 /*
3546 * here we run on the binder thread. All we've got to do is
3547 * call the real BpGraphicBufferProducer.
3548 */
3549 virtual void handleMessage(const Message& message) {
3550 int what = message.what;
3551 // Prevent reads below from happening before the read from Message
3552 atomic_thread_fence(memory_order_acquire);
3553 if (what == MSG_API_CALL) {
3554 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3555 barrier.open();
3556 } else if (what == MSG_EXIT) {
3557 exitRequested = true;
3558 }
3559 }
3560
3561public:
3562 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3563 : impl(impl),
3564 looper(new Looper(true)),
3565 result(NO_ERROR),
3566 exitPending(false),
3567 exitRequested(false),
3568 code(0),
3569 data(NULL),
3570 reply(NULL)
3571 {}
3572
3573 // Binder thread
3574 status_t waitForResponse() {
3575 do {
3576 looper->pollOnce(-1);
3577 } while (!exitRequested);
3578 return result;
3579 }
3580
3581 // Client thread
3582 void exit(status_t result) {
3583 this->result = result;
3584 exitPending = true;
3585 // Ensure this->result is visible to the binder thread before it
3586 // handles the message.
3587 atomic_thread_fence(memory_order_release);
3588 looper->sendMessage(this, Message(MSG_EXIT));
3589 }
3590};
3591
3592
3593status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3594 const sp<IGraphicBufferProducer>& producer,
3595 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003596 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003597 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3598
3599 if (CC_UNLIKELY(display == 0))
3600 return BAD_VALUE;
3601
3602 if (CC_UNLIKELY(producer == 0))
3603 return BAD_VALUE;
3604
3605 // if we have secure windows on this display, never allow the screen capture
3606 // unless the producer interface is local (i.e.: we can take a screenshot for
3607 // ourselves).
3608 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3609
3610 // Convert to surfaceflinger's internal rotation type.
3611 Transform::orientation_flags rotationFlags;
3612 switch (rotation) {
3613 case ISurfaceComposer::eRotateNone:
3614 rotationFlags = Transform::ROT_0;
3615 break;
3616 case ISurfaceComposer::eRotate90:
3617 rotationFlags = Transform::ROT_90;
3618 break;
3619 case ISurfaceComposer::eRotate180:
3620 rotationFlags = Transform::ROT_180;
3621 break;
3622 case ISurfaceComposer::eRotate270:
3623 rotationFlags = Transform::ROT_270;
3624 break;
3625 default:
3626 rotationFlags = Transform::ROT_0;
3627 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3628 break;
3629 }
3630
3631 class MessageCaptureScreen : public MessageBase {
3632 SurfaceFlinger* flinger;
3633 sp<IBinder> display;
3634 sp<IGraphicBufferProducer> producer;
3635 Rect sourceCrop;
3636 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003637 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003638 bool useIdentityTransform;
3639 Transform::orientation_flags rotation;
3640 status_t result;
3641 bool isLocalScreenshot;
3642 public:
3643 MessageCaptureScreen(SurfaceFlinger* flinger,
3644 const sp<IBinder>& display,
3645 const sp<IGraphicBufferProducer>& producer,
3646 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003647 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003648 bool useIdentityTransform,
3649 Transform::orientation_flags rotation,
3650 bool isLocalScreenshot)
3651 : flinger(flinger), display(display), producer(producer),
3652 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3653 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3654 useIdentityTransform(useIdentityTransform),
3655 rotation(rotation), result(PERMISSION_DENIED),
3656 isLocalScreenshot(isLocalScreenshot)
3657 {
3658 }
3659 status_t getResult() const {
3660 return result;
3661 }
3662 virtual bool handler() {
3663 Mutex::Autolock _l(flinger->mStateLock);
3664 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3665 result = flinger->captureScreenImplLocked(hw, producer,
3666 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3667 useIdentityTransform, rotation, isLocalScreenshot);
3668 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3669 return true;
3670 }
3671 };
3672
3673 // this creates a "fake" BBinder which will serve as a "fake" remote
3674 // binder to receive the marshaled calls and forward them to the
3675 // real remote (a BpGraphicBufferProducer)
3676 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3677
3678 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3679 // which does the marshaling work forwards to our "fake remote" above.
3680 sp<MessageBase> msg = new MessageCaptureScreen(this,
3681 display, IGraphicBufferProducer::asInterface( wrapper ),
3682 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3683 useIdentityTransform, rotationFlags, isLocalScreenshot);
3684
3685 status_t res = postMessageAsync(msg);
3686 if (res == NO_ERROR) {
3687 res = wrapper->waitForResponse();
3688 }
3689 return res;
3690}
3691
3692
3693void SurfaceFlinger::renderScreenImplLocked(
3694 const sp<const DisplayDevice>& hw,
3695 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003696 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003697 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3698{
3699 ATRACE_CALL();
3700 RenderEngine& engine(getRenderEngine());
3701
3702 // get screen geometry
3703 const int32_t hw_w = hw->getWidth();
3704 const int32_t hw_h = hw->getHeight();
3705 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3706 static_cast<int32_t>(reqHeight) != hw_h;
3707
3708 // if a default or invalid sourceCrop is passed in, set reasonable values
3709 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3710 !sourceCrop.isValid()) {
3711 sourceCrop.setLeftTop(Point(0, 0));
3712 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3713 }
3714
3715 // ensure that sourceCrop is inside screen
3716 if (sourceCrop.left < 0) {
3717 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3718 }
3719 if (sourceCrop.right > hw_w) {
3720 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3721 }
3722 if (sourceCrop.top < 0) {
3723 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3724 }
3725 if (sourceCrop.bottom > hw_h) {
3726 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3727 }
3728
3729 // make sure to clear all GL error flags
3730 engine.checkErrors();
3731
3732 // set-up our viewport
3733 engine.setViewportAndProjection(
3734 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3735 engine.disableTexturing();
3736
3737 // redraw the screen entirely...
3738 engine.clearWithColor(0, 0, 0, 1);
3739
Robert Carr1f0a16a2016-10-24 16:27:39 -07003740 // We loop through the first level of layers without traversing,
3741 // as we need to interpret min/max layer Z in the top level Z space.
3742 for (const auto& layer : mDrawingState.layersSortedByZ) {
3743 if (layer->getLayerStack() != hw->getLayerStack()) {
3744 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003745 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003746 const Layer::State& state(layer->getDrawingState());
3747 if (state.z < minLayerZ || state.z > maxLayerZ) {
3748 continue;
3749 }
3750 layer->traverseInZOrder([&](Layer* layer) {
3751 if (!layer->isVisible()) {
3752 return;
3753 }
3754 if (filtering) layer->setFiltering(true);
3755 layer->draw(hw, useIdentityTransform);
3756 if (filtering) layer->setFiltering(false);
3757 });
3758 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003759
3760 // compositionComplete is needed for older driver
3761 hw->compositionComplete();
3762 hw->setViewportAndProjection();
3763}
3764
3765
3766status_t SurfaceFlinger::captureScreenImplLocked(
3767 const sp<const DisplayDevice>& hw,
3768 const sp<IGraphicBufferProducer>& producer,
3769 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003770 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003771 bool useIdentityTransform, Transform::orientation_flags rotation,
3772 bool isLocalScreenshot)
3773{
3774 ATRACE_CALL();
3775
3776 // get screen geometry
3777 uint32_t hw_w = hw->getWidth();
3778 uint32_t hw_h = hw->getHeight();
3779
3780 if (rotation & Transform::ROT_90) {
3781 std::swap(hw_w, hw_h);
3782 }
3783
3784 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3785 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3786 reqWidth, reqHeight, hw_w, hw_h);
3787 return BAD_VALUE;
3788 }
3789
3790 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3791 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3792
3793 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003794 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003795 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003796 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3797 (state.z < minLayerZ || state.z > maxLayerZ)) {
3798 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003799 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003800 layer->traverseInZOrder([&](Layer *layer) {
3801 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3802 layer->isSecure());
3803 });
3804 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003805
3806 if (!isLocalScreenshot && secureLayerIsVisible) {
3807 ALOGW("FB is protected: PERMISSION_DENIED");
3808 return PERMISSION_DENIED;
3809 }
3810
3811 // create a surface (because we're a producer, and we need to
3812 // dequeue/queue a buffer)
3813 sp<Surface> sur = new Surface(producer, false);
3814 ANativeWindow* window = sur.get();
3815
3816 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3817 if (result == NO_ERROR) {
3818 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3819 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3820
3821 int err = 0;
3822 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3823 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3824 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3825 err |= native_window_set_usage(window, usage);
3826
3827 if (err == NO_ERROR) {
3828 ANativeWindowBuffer* buffer;
3829 /* TODO: Once we have the sync framework everywhere this can use
3830 * server-side waits on the fence that dequeueBuffer returns.
3831 */
3832 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3833 if (result == NO_ERROR) {
3834 int syncFd = -1;
3835 // create an EGLImage from the buffer so we can later
3836 // turn it into a texture
3837 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3838 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3839 if (image != EGL_NO_IMAGE_KHR) {
3840 // this binds the given EGLImage as a framebuffer for the
3841 // duration of this scope.
3842 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3843 if (imageBond.getStatus() == NO_ERROR) {
3844 // this will in fact render into our dequeued buffer
3845 // via an FBO, which means we didn't have to create
3846 // an EGLSurface and therefore we're not
3847 // dependent on the context's EGLConfig.
3848 renderScreenImplLocked(
3849 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3850 useIdentityTransform, rotation);
3851
3852 // Attempt to create a sync khr object that can produce a sync point. If that
3853 // isn't available, create a non-dupable sync object in the fallback path and
3854 // wait on it directly.
3855 EGLSyncKHR sync;
3856 if (!DEBUG_SCREENSHOTS) {
3857 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3858 // native fence fd will not be populated until flush() is done.
3859 getRenderEngine().flush();
3860 } else {
3861 sync = EGL_NO_SYNC_KHR;
3862 }
3863 if (sync != EGL_NO_SYNC_KHR) {
3864 // get the sync fd
3865 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3866 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3867 ALOGW("captureScreen: failed to dup sync khr object");
3868 syncFd = -1;
3869 }
3870 eglDestroySyncKHR(mEGLDisplay, sync);
3871 } else {
3872 // fallback path
3873 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3874 if (sync != EGL_NO_SYNC_KHR) {
3875 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3876 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3877 EGLint eglErr = eglGetError();
3878 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3879 ALOGW("captureScreen: fence wait timed out");
3880 } else {
3881 ALOGW_IF(eglErr != EGL_SUCCESS,
3882 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3883 }
3884 eglDestroySyncKHR(mEGLDisplay, sync);
3885 } else {
3886 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3887 }
3888 }
3889 if (DEBUG_SCREENSHOTS) {
3890 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3891 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3892 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3893 hw, minLayerZ, maxLayerZ);
3894 delete [] pixels;
3895 }
3896
3897 } else {
3898 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3899 result = INVALID_OPERATION;
3900 window->cancelBuffer(window, buffer, syncFd);
3901 buffer = NULL;
3902 }
3903 // destroy our image
3904 eglDestroyImageKHR(mEGLDisplay, image);
3905 } else {
3906 result = BAD_VALUE;
3907 }
3908 if (buffer) {
3909 // queueBuffer takes ownership of syncFd
3910 result = window->queueBuffer(window, buffer, syncFd);
3911 }
3912 }
3913 } else {
3914 result = BAD_VALUE;
3915 }
3916 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3917 }
3918
3919 return result;
3920}
3921
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003922void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08003923 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003924 if (DEBUG_SCREENSHOTS) {
3925 for (size_t y=0 ; y<h ; y++) {
3926 uint32_t const * p = (uint32_t const *)vaddr + y*s;
3927 for (size_t x=0 ; x<w ; x++) {
3928 if (p[x] != 0xFF000000) return;
3929 }
3930 }
3931 ALOGE("*** we just took a black screenshot ***\n"
3932 "requested minz=%d, maxz=%d, layerStack=%d",
3933 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08003934 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003935 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003936 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003937 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
3938 state.z <= maxLayerZ) {
3939 layer->traverseInZOrder([&](Layer* layer) {
3940 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3941 layer->isVisible() ? '+' : '-',
3942 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003943 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003944 i++;
3945 });
3946 }
3947 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003948 }
3949}
3950
3951// ---------------------------------------------------------------------------
3952
Robert Carr2047fae2016-11-28 14:09:09 -08003953void SurfaceFlinger::State::traverseInZOrder(const std::function<void(Layer*)>& consume) const {
3954 layersSortedByZ.traverseInZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003955}
3956
Robert Carr2047fae2016-11-28 14:09:09 -08003957void SurfaceFlinger::State::traverseInReverseZOrder(const std::function<void(Layer*)>& consume) const {
3958 layersSortedByZ.traverseInReverseZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003959}
3960
3961}; // namespace android
3962
3963
3964#if defined(__gl_h_)
3965#error "don't include gl/gl.h in this file"
3966#endif
3967
3968#if defined(__gl2_h_)
3969#error "don't include gl2/gl2.h in this file"
3970#endif