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