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