blob: e8147cf292f99caa189f673e4f4e90608d864917 [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) {
Brian Andersond0010582017-03-07 13:20:31 -08001051 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001052 *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
Brian Andersond0010582017-03-07 13:20:31 -08001214 setCompositorTimingSnapped(
1215 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1216}
1217
1218void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1219 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001220 // Integer division and modulo round toward 0 not -inf, so we need to
1221 // treat negative and positive offsets differently.
Brian Andersond0010582017-03-07 13:20:31 -08001222 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001223 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1224 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1225
Brian Andersond0010582017-03-07 13:20:31 -08001226 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1227 if (idealLatency <= 0) {
1228 idealLatency = vsyncInterval;
1229 }
1230
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001231 // Snap the latency to a value that removes scheduling jitter from the
1232 // composition and present times, which often have >1ms of jitter.
1233 // Reducing jitter is important if an app attempts to extrapolate
1234 // something (such as user input) to an accurate diasplay time.
1235 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1236 // with (presentLatency % interval).
Brian Andersond0010582017-03-07 13:20:31 -08001237 nsecs_t bias = vsyncInterval / 2;
1238 int64_t extraVsyncs =
1239 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1240 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1241 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001242
Brian Andersond0010582017-03-07 13:20:31 -08001243 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001244 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1245 mCompositorTiming.interval = vsyncInterval;
Brian Andersond0010582017-03-07 13:20:31 -08001246 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001247}
1248
1249void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001250{
Brian Andersond6927fb2016-07-23 23:37:30 -07001251 const HWComposer& hwc = getHwComposer();
1252 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1253
Brian Anderson3d4039d2016-09-23 16:31:30 -07001254 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1255 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1256 glCompositionDoneFenceTime =
1257 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1258 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1259 } else {
1260 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1261 }
1262 mGlCompositionDoneTimeline.updateSignalTimes();
1263
1264 sp<Fence> displayFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1265 const std::shared_ptr<FenceTime>& presentFenceTime = FenceTime::NO_FENCE;
1266 auto retireFenceTime = std::make_shared<FenceTime>(displayFence);
1267 mDisplayTimeline.push(retireFenceTime);
1268 mDisplayTimeline.updateSignalTimes();
Brian Andersond6927fb2016-07-23 23:37:30 -07001269
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001270 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1271 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1272
1273 // We use the refreshStartTime which might be sampled a little later than
1274 // when we started doing work for this frame, but that should be okay
1275 // since updateCompositorTiming has snapping logic.
1276 updateCompositorTiming(
1277 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
Brian Andersond0010582017-03-07 13:20:31 -08001278 CompositorTiming compositorTiming;
1279 {
1280 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1281 compositorTiming = mCompositorTiming;
1282 }
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001283
Robert Carr2047fae2016-11-28 14:09:09 -08001284 mDrawingState.traverseInZOrder([&](Layer* layer) {
1285 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Andersond0010582017-03-07 13:20:31 -08001286 presentFenceTime, retireFenceTime, compositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001287 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001288 recordBufferingStats(layer->getName().string(),
1289 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001290 }
Robert Carr2047fae2016-11-28 14:09:09 -08001291 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001292
Brian Anderson3d4039d2016-09-23 16:31:30 -07001293 if (displayFence->isValid()) {
1294 if (mPrimaryDispSync.addPresentFence(displayFence)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001295 enableHardwareVsync();
1296 } else {
1297 disableHardwareVsync(false);
1298 }
1299 }
1300
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08001301 if (!hasSyncFramework) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001302 if (hw->isDisplayOn()) {
1303 enableHardwareVsync();
1304 }
1305 }
1306
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001307 if (mAnimCompositionPending) {
1308 mAnimCompositionPending = false;
1309
Brian Anderson3d4039d2016-09-23 16:31:30 -07001310 if (retireFenceTime->isValid()) {
1311 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001312 } else {
1313 // The HWC doesn't support present fences, so use the refresh
1314 // timestamp instead.
1315 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1316 mAnimFrameTracker.setActualPresentTime(presentTime);
1317 }
1318 mAnimFrameTracker.advanceFrame();
1319 }
1320
1321 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1322 return;
1323 }
1324
1325 nsecs_t currentTime = systemTime();
1326 if (mHasPoweredOff) {
1327 mHasPoweredOff = false;
1328 } else {
1329 nsecs_t period = mPrimaryDispSync.getPeriod();
1330 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1331 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1332 if (numPeriods < NUM_BUCKETS - 1) {
1333 mFrameBuckets[numPeriods] += elapsedTime;
1334 } else {
1335 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1336 }
1337 mTotalTime += elapsedTime;
1338 }
1339 mLastSwapTime = currentTime;
1340}
1341
1342void SurfaceFlinger::rebuildLayerStacks() {
1343 // rebuild the visible layer list per screen
1344 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1345 ATRACE_CALL();
1346 mVisibleRegionsDirty = false;
1347 invalidateHwcGeometry();
1348
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001349 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1350 Region opaqueRegion;
1351 Region dirtyRegion;
1352 Vector< sp<Layer> > layersSortedByZ;
1353 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1354 const Transform& tr(hw->getTransform());
1355 const Rect bounds(hw->getBounds());
1356 if (hw->isDisplayOn()) {
Robert Carr2047fae2016-11-28 14:09:09 -08001357 computeVisibleRegions(hw->getLayerStack(), dirtyRegion,
1358 opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001359
Robert Carr2047fae2016-11-28 14:09:09 -08001360 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001361 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001362 Region drawRegion(tr.transform(
1363 layer->visibleNonTransparentRegion));
1364 drawRegion.andSelf(bounds);
1365 if (!drawRegion.isEmpty()) {
1366 layersSortedByZ.add(layer);
1367 }
1368 }
Robert Carr2047fae2016-11-28 14:09:09 -08001369 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001370 }
1371 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1372 hw->undefinedRegion.set(bounds);
1373 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1374 hw->dirtyRegion.orSelf(dirtyRegion);
1375 }
1376 }
1377}
1378
1379void SurfaceFlinger::setUpHWComposer() {
1380 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1381 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1382 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1383 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1384
1385 // If nothing has changed (!dirty), don't recompose.
1386 // If something changed, but we don't currently have any visible layers,
1387 // and didn't when we last did a composition, then skip it this time.
1388 // The second rule does two things:
1389 // - When all layers are removed from a display, we'll emit one black
1390 // frame, then nothing more until we get new layers.
1391 // - When a display is created with a private layer stack, we won't
1392 // emit any black frames until a layer is added to the layer stack.
1393 bool mustRecompose = dirty && !(empty && wasEmpty);
1394
1395 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1396 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1397 mustRecompose ? "doing" : "skipping",
1398 dirty ? "+" : "-",
1399 empty ? "+" : "-",
1400 wasEmpty ? "+" : "-");
1401
1402 mDisplays[dpy]->beginFrame(mustRecompose);
1403
1404 if (mustRecompose) {
1405 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1406 }
1407 }
1408
1409 HWComposer& hwc(getHwComposer());
1410 if (hwc.initCheck() == NO_ERROR) {
1411 // build the h/w work list
1412 if (CC_UNLIKELY(mHwWorkListDirty)) {
1413 mHwWorkListDirty = false;
1414 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1415 sp<const DisplayDevice> hw(mDisplays[dpy]);
1416 const int32_t id = hw->getHwcDisplayId();
1417 if (id >= 0) {
1418 const Vector< sp<Layer> >& currentLayers(
1419 hw->getVisibleLayersSortedByZ());
1420 const size_t count = currentLayers.size();
1421 if (hwc.createWorkList(id, count) == NO_ERROR) {
1422 HWComposer::LayerListIterator cur = hwc.begin(id);
1423 const HWComposer::LayerListIterator end = hwc.end(id);
1424 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1425 const sp<Layer>& layer(currentLayers[i]);
1426 layer->setGeometry(hw, *cur);
1427 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1428 cur->setSkip(true);
1429 }
1430 }
1431 }
1432 }
1433 }
1434 }
1435
1436 // set the per-frame data
1437 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1438 sp<const DisplayDevice> hw(mDisplays[dpy]);
1439 const int32_t id = hw->getHwcDisplayId();
1440 if (id >= 0) {
1441 const Vector< sp<Layer> >& currentLayers(
1442 hw->getVisibleLayersSortedByZ());
1443 const size_t count = currentLayers.size();
1444 HWComposer::LayerListIterator cur = hwc.begin(id);
1445 const HWComposer::LayerListIterator end = hwc.end(id);
1446 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1447 /*
1448 * update the per-frame h/w composer data for each layer
1449 * and build the transparent region of the FB
1450 */
1451 const sp<Layer>& layer(currentLayers[i]);
1452 layer->setPerFrameData(hw, *cur);
1453 }
1454 }
1455 }
1456
1457 // If possible, attempt to use the cursor overlay on each display.
1458 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1459 sp<const DisplayDevice> hw(mDisplays[dpy]);
1460 const int32_t id = hw->getHwcDisplayId();
1461 if (id >= 0) {
1462 const Vector< sp<Layer> >& currentLayers(
1463 hw->getVisibleLayersSortedByZ());
1464 const size_t count = currentLayers.size();
1465 HWComposer::LayerListIterator cur = hwc.begin(id);
1466 const HWComposer::LayerListIterator end = hwc.end(id);
1467 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1468 const sp<Layer>& layer(currentLayers[i]);
1469 if (layer->isPotentialCursor()) {
1470 cur->setIsCursorLayerHint();
1471 break;
1472 }
1473 }
1474 }
1475 }
1476
1477 status_t err = hwc.prepare();
1478 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1479
1480 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1481 sp<const DisplayDevice> hw(mDisplays[dpy]);
1482 hw->prepareFrame(hwc);
1483 }
1484 }
1485}
1486
1487void SurfaceFlinger::doComposition() {
1488 ATRACE_CALL();
1489 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1490 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1491 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1492 if (hw->isDisplayOn()) {
1493 // transform the dirty region into this screen's coordinate space
1494 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1495
1496 // repaint the framebuffer (if needed)
1497 doDisplayComposition(hw, dirtyRegion);
1498
1499 hw->dirtyRegion.clear();
1500 hw->flip(hw->swapRegion);
1501 hw->swapRegion.clear();
1502 }
1503 // inform the h/w that we're done compositing
1504 hw->compositionComplete();
1505 }
1506 postFramebuffer();
1507}
1508
1509void SurfaceFlinger::postFramebuffer()
1510{
1511 ATRACE_CALL();
1512
1513 const nsecs_t now = systemTime();
1514 mDebugInSwapBuffers = now;
1515
1516 HWComposer& hwc(getHwComposer());
1517 if (hwc.initCheck() == NO_ERROR) {
1518 if (!hwc.supportsFramebufferTarget()) {
1519 // EGL spec says:
1520 // "surface must be bound to the calling thread's current context,
1521 // for the current rendering API."
1522 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1523 }
1524 hwc.commit();
1525 }
1526
1527 // make the default display current because the VirtualDisplayDevice code cannot
1528 // deal with dequeueBuffer() being called outside of the composition loop; however
1529 // the code below can call glFlush() which is allowed (and does in some case) call
1530 // dequeueBuffer().
1531 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1532
1533 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1534 sp<const DisplayDevice> hw(mDisplays[dpy]);
1535 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1536 hw->onSwapBuffersCompleted(hwc);
1537 const size_t count = currentLayers.size();
1538 int32_t id = hw->getHwcDisplayId();
1539 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1540 HWComposer::LayerListIterator cur = hwc.begin(id);
1541 const HWComposer::LayerListIterator end = hwc.end(id);
1542 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1543 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1544 }
1545 } else {
1546 for (size_t i = 0; i < count; i++) {
1547 currentLayers[i]->onLayerDisplayed(hw, NULL);
1548 }
1549 }
1550 }
1551
1552 mLastSwapBufferTime = systemTime() - now;
1553 mDebugInSwapBuffers = 0;
1554
1555 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1556 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1557 logFrameStats();
1558 }
1559}
1560
1561void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1562{
1563 ATRACE_CALL();
1564
1565 // here we keep a copy of the drawing state (that is the state that's
1566 // going to be overwritten by handleTransactionLocked()) outside of
1567 // mStateLock so that the side-effects of the State assignment
1568 // don't happen with mStateLock held (which can cause deadlocks).
1569 State drawingState(mDrawingState);
1570
1571 Mutex::Autolock _l(mStateLock);
1572 const nsecs_t now = systemTime();
1573 mDebugInTransaction = now;
1574
1575 // Here we're guaranteed that some transaction flags are set
1576 // so we can call handleTransactionLocked() unconditionally.
1577 // We call getTransactionFlags(), which will also clear the flags,
1578 // with mStateLock held to guarantee that mCurrentState won't change
1579 // until the transaction is committed.
1580
1581 transactionFlags = getTransactionFlags(eTransactionMask);
1582 handleTransactionLocked(transactionFlags);
1583
1584 mLastTransactionTime = systemTime() - now;
1585 mDebugInTransaction = 0;
1586 invalidateHwcGeometry();
1587 // here the transaction has been committed
1588}
1589
1590void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1591{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001592 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001593 mCurrentState.traverseInZOrder([](Layer* layer) {
1594 layer->notifyAvailableFrames();
1595 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001596
1597 /*
1598 * Traversal of the children
1599 * (perform the transaction for each of them if needed)
1600 */
1601
1602 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001603 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001604 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001605 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001606
1607 const uint32_t flags = layer->doTransaction(0);
1608 if (flags & Layer::eVisibleRegion)
1609 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001610 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001611 }
1612
1613 /*
1614 * Perform display own transactions if needed
1615 */
1616
1617 if (transactionFlags & eDisplayTransactionNeeded) {
1618 // here we take advantage of Vector's copy-on-write semantics to
1619 // improve performance by skipping the transaction entirely when
1620 // know that the lists are identical
1621 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1622 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1623 if (!curr.isIdenticalTo(draw)) {
1624 mVisibleRegionsDirty = true;
1625 const size_t cc = curr.size();
1626 size_t dc = draw.size();
1627
1628 // find the displays that were removed
1629 // (ie: in drawing state but not in current state)
1630 // also handle displays that changed
1631 // (ie: displays that are in both lists)
1632 for (size_t i=0 ; i<dc ; i++) {
1633 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1634 if (j < 0) {
1635 // in drawing state but not in current state
1636 if (!draw[i].isMainDisplay()) {
1637 // Call makeCurrent() on the primary display so we can
1638 // be sure that nothing associated with this display
1639 // is current.
1640 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1641 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1642 sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1643 if (hw != NULL)
1644 hw->disconnect(getHwComposer());
1645 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1646 mEventThread->onHotplugReceived(draw[i].type, false);
1647 mDisplays.removeItem(draw.keyAt(i));
1648 } else {
1649 ALOGW("trying to remove the main display");
1650 }
1651 } else {
1652 // this display is in both lists. see if something changed.
1653 const DisplayDeviceState& state(curr[j]);
1654 const wp<IBinder>& display(curr.keyAt(j));
1655 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1656 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1657 if (state_binder != draw_binder) {
1658 // changing the surface is like destroying and
1659 // recreating the DisplayDevice, so we just remove it
1660 // from the drawing state, so that it get re-added
1661 // below.
1662 sp<DisplayDevice> hw(getDisplayDevice(display));
1663 if (hw != NULL)
1664 hw->disconnect(getHwComposer());
1665 mDisplays.removeItem(display);
1666 mDrawingState.displays.removeItemsAt(i);
1667 dc--; i--;
1668 // at this point we must loop to the next item
1669 continue;
1670 }
1671
1672 const sp<DisplayDevice> disp(getDisplayDevice(display));
1673 if (disp != NULL) {
1674 if (state.layerStack != draw[i].layerStack) {
1675 disp->setLayerStack(state.layerStack);
1676 }
1677 if ((state.orientation != draw[i].orientation)
1678 || (state.viewport != draw[i].viewport)
1679 || (state.frame != draw[i].frame))
1680 {
1681 disp->setProjection(state.orientation,
1682 state.viewport, state.frame);
1683 }
1684 if (state.width != draw[i].width || state.height != draw[i].height) {
1685 disp->setDisplaySize(state.width, state.height);
1686 }
1687 }
1688 }
1689 }
1690
1691 // find displays that were added
1692 // (ie: in current state but not in drawing state)
1693 for (size_t i=0 ; i<cc ; i++) {
1694 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1695 const DisplayDeviceState& state(curr[i]);
1696
1697 sp<DisplaySurface> dispSurface;
1698 sp<IGraphicBufferProducer> producer;
1699 sp<IGraphicBufferProducer> bqProducer;
1700 sp<IGraphicBufferConsumer> bqConsumer;
Romain Guyf8b4ca52017-03-16 18:39:20 +00001701 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer,
1702 new GraphicBufferAlloc());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001703
1704 int32_t hwcDisplayId = -1;
1705 if (state.isVirtualDisplay()) {
1706 // Virtual displays without a surface are dormant:
1707 // they have external state (layer stack, projection,
1708 // etc.) but no internal state (i.e. a DisplayDevice).
1709 if (state.surface != NULL) {
1710
1711 int width = 0;
1712 int status = state.surface->query(
1713 NATIVE_WINDOW_WIDTH, &width);
1714 ALOGE_IF(status != NO_ERROR,
1715 "Unable to query width (%d)", status);
1716 int height = 0;
1717 status = state.surface->query(
1718 NATIVE_WINDOW_HEIGHT, &height);
1719 ALOGE_IF(status != NO_ERROR,
1720 "Unable to query height (%d)", status);
1721 if (mUseHwcVirtualDisplays &&
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08001722 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1723 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1724 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001725 hwcDisplayId = allocateHwcDisplayId(state.type);
1726 }
1727
1728 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1729 *mHwc, hwcDisplayId, state.surface,
1730 bqProducer, bqConsumer, state.displayName);
1731
1732 dispSurface = vds;
1733 producer = vds;
1734 }
1735 } else {
1736 ALOGE_IF(state.surface!=NULL,
1737 "adding a supported display, but rendering "
1738 "surface is provided (%p), ignoring it",
1739 state.surface.get());
1740 hwcDisplayId = allocateHwcDisplayId(state.type);
1741 // for supported (by hwc) displays we provide our
1742 // own rendering surface
1743 dispSurface = new FramebufferSurface(*mHwc, state.type,
1744 bqConsumer);
1745 producer = bqProducer;
1746 }
1747
1748 const wp<IBinder>& display(curr.keyAt(i));
1749 if (dispSurface != NULL) {
1750 sp<DisplayDevice> hw = new DisplayDevice(this,
1751 state.type, hwcDisplayId,
1752 mHwc->getFormat(hwcDisplayId), state.isSecure,
1753 display, dispSurface, producer,
1754 mRenderEngine->getEGLConfig());
1755 hw->setLayerStack(state.layerStack);
1756 hw->setProjection(state.orientation,
1757 state.viewport, state.frame);
1758 hw->setDisplayName(state.displayName);
1759 mDisplays.add(display, hw);
1760 if (state.isVirtualDisplay()) {
1761 if (hwcDisplayId >= 0) {
1762 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1763 hw->getWidth(), hw->getHeight(),
1764 hw->getFormat());
1765 }
1766 } else {
1767 mEventThread->onHotplugReceived(state.type, true);
1768 }
1769 }
1770 }
1771 }
1772 }
1773 }
1774
1775 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1776 // The transform hint might have changed for some layers
1777 // (either because a display has changed, or because a layer
1778 // as changed).
1779 //
1780 // Walk through all the layers in currentLayers,
1781 // and update their transform hint.
1782 //
1783 // If a layer is visible only on a single display, then that
1784 // display is used to calculate the hint, otherwise we use the
1785 // default display.
1786 //
1787 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1788 // the hint is set before we acquire a buffer from the surface texture.
1789 //
1790 // NOTE: layer transactions have taken place already, so we use their
1791 // drawing state. However, SurfaceFlinger's own transaction has not
1792 // happened yet, so we must use the current state layer list
1793 // (soon to become the drawing state list).
1794 //
1795 sp<const DisplayDevice> disp;
1796 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001797 bool first = true;
1798 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001799 // NOTE: we rely on the fact that layers are sorted by
1800 // layerStack first (so we don't have to traverse the list
1801 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001802 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001803 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001804 currentlayerStack = layerStack;
1805 // figure out if this layerstack is mirrored
1806 // (more than one display) if so, pick the default display,
1807 // if not, pick the only display it's on.
1808 disp.clear();
1809 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1810 sp<const DisplayDevice> hw(mDisplays[dpy]);
1811 if (hw->getLayerStack() == currentlayerStack) {
1812 if (disp == NULL) {
1813 disp = hw;
1814 } else {
1815 disp = NULL;
1816 break;
1817 }
1818 }
1819 }
1820 }
1821 if (disp == NULL) {
1822 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1823 // redraw after transform hint changes. See bug 8508397.
1824
1825 // could be null when this layer is using a layerStack
1826 // that is not visible on any display. Also can occur at
1827 // screen off/on times.
1828 disp = getDefaultDisplayDevice();
1829 }
1830 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001831
1832 first = false;
1833 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001834 }
1835
1836
1837 /*
1838 * Perform our own transaction if needed
1839 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001840
1841 if (mLayersAdded) {
1842 mLayersAdded = false;
1843 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001844 mVisibleRegionsDirty = true;
1845 }
1846
1847 // some layers might have been removed, so
1848 // we need to update the regions they're exposing.
1849 if (mLayersRemoved) {
1850 mLayersRemoved = false;
1851 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001852 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001853 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001854 // this layer is not visible anymore
1855 // TODO: we could traverse the tree from front to back and
1856 // compute the actual visible region
1857 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001858 Region visibleReg;
1859 visibleReg.set(layer->computeScreenBounds());
1860 invalidateLayerStack(layer->getLayerStack(), visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001861 }
Robert Carr2047fae2016-11-28 14:09:09 -08001862 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001863 }
1864
1865 commitTransaction();
1866
1867 updateCursorAsync();
1868}
1869
1870void SurfaceFlinger::updateCursorAsync()
1871{
1872 HWComposer& hwc(getHwComposer());
1873 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1874 sp<const DisplayDevice> hw(mDisplays[dpy]);
1875 const int32_t id = hw->getHwcDisplayId();
1876 if (id < 0) {
1877 continue;
1878 }
1879 const Vector< sp<Layer> >& currentLayers(
1880 hw->getVisibleLayersSortedByZ());
1881 const size_t count = currentLayers.size();
1882 HWComposer::LayerListIterator cur = hwc.begin(id);
1883 const HWComposer::LayerListIterator end = hwc.end(id);
1884 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1885 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1886 continue;
1887 }
1888 const sp<Layer>& layer(currentLayers[i]);
1889 Rect cursorPos = layer->getPosition(hw);
1890 hwc.setCursorPositionAsync(id, cursorPos);
1891 break;
1892 }
1893 }
1894}
1895
1896void SurfaceFlinger::commitTransaction()
1897{
1898 if (!mLayersPendingRemoval.isEmpty()) {
1899 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001900 for (const auto& l : mLayersPendingRemoval) {
1901 recordBufferingStats(l->getName().string(),
1902 l->getOccupancyHistory(true));
1903 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001904 }
1905 mLayersPendingRemoval.clear();
1906 }
1907
1908 // If this transaction is part of a window animation then the next frame
1909 // we composite should be considered an animation as well.
1910 mAnimCompositionPending = mAnimTransactionPending;
1911
1912 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001913 mDrawingState.traverseInZOrder([](Layer* layer) {
1914 layer->commitChildList();
1915 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001916 mTransactionPending = false;
1917 mAnimTransactionPending = false;
1918 mTransactionCV.broadcast();
1919}
1920
Robert Carr2047fae2016-11-28 14:09:09 -08001921void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001922 Region& outDirtyRegion, Region& outOpaqueRegion)
1923{
1924 ATRACE_CALL();
1925
1926 Region aboveOpaqueLayers;
1927 Region aboveCoveredLayers;
1928 Region dirty;
1929
1930 outDirtyRegion.clear();
1931
Robert Carr2047fae2016-11-28 14:09:09 -08001932 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001933 // start with the whole surface at its current location
1934 const Layer::State& s(layer->getDrawingState());
1935
1936 // only consider the layers on the given layer stack
Robert Carr1f0a16a2016-10-24 16:27:39 -07001937 if (layer->getLayerStack() != layerStack)
Robert Carr2047fae2016-11-28 14:09:09 -08001938 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001939
1940 /*
1941 * opaqueRegion: area of a surface that is fully opaque.
1942 */
1943 Region opaqueRegion;
1944
1945 /*
1946 * visibleRegion: area of a surface that is visible on screen
1947 * and not fully transparent. This is essentially the layer's
1948 * footprint minus the opaque regions above it.
1949 * Areas covered by a translucent surface are considered visible.
1950 */
1951 Region visibleRegion;
1952
1953 /*
1954 * coveredRegion: area of a surface that is covered by all
1955 * visible regions above it (which includes the translucent areas).
1956 */
1957 Region coveredRegion;
1958
1959 /*
1960 * transparentRegion: area of a surface that is hinted to be completely
1961 * transparent. This is only used to tell when the layer has no visible
1962 * non-transparent regions and can be removed from the layer list. It
1963 * does not affect the visibleRegion of this layer or any layers
1964 * beneath it. The hint may not be correct if apps don't respect the
1965 * SurfaceView restrictions (which, sadly, some don't).
1966 */
1967 Region transparentRegion;
1968
1969
1970 // handle hidden surfaces by setting the visible region to empty
1971 if (CC_LIKELY(layer->isVisible())) {
1972 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001973 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001974 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001975 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001976 if (!visibleRegion.isEmpty()) {
1977 // Remove the transparent area from the visible region
1978 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001979 if (tr.preserveRects()) {
1980 // transform the transparent region
1981 transparentRegion = tr.transform(s.activeTransparentRegion);
1982 } else {
1983 // transformation too complex, can't do the
1984 // transparent region optimization.
1985 transparentRegion.clear();
1986 }
1987 }
1988
1989 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001990 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001991 if (s.alpha==255 && !translucent &&
1992 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1993 // the opaque region is the layer's footprint
1994 opaqueRegion = visibleRegion;
1995 }
1996 }
1997 }
1998
1999 // Clip the covered region to the visible region
2000 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2001
2002 // Update aboveCoveredLayers for next (lower) layer
2003 aboveCoveredLayers.orSelf(visibleRegion);
2004
2005 // subtract the opaque region covered by the layers above us
2006 visibleRegion.subtractSelf(aboveOpaqueLayers);
2007
2008 // compute this layer's dirty region
2009 if (layer->contentDirty) {
2010 // we need to invalidate the whole region
2011 dirty = visibleRegion;
2012 // as well, as the old visible region
2013 dirty.orSelf(layer->visibleRegion);
2014 layer->contentDirty = false;
2015 } else {
2016 /* compute the exposed region:
2017 * the exposed region consists of two components:
2018 * 1) what's VISIBLE now and was COVERED before
2019 * 2) what's EXPOSED now less what was EXPOSED before
2020 *
2021 * note that (1) is conservative, we start with the whole
2022 * visible region but only keep what used to be covered by
2023 * something -- which mean it may have been exposed.
2024 *
2025 * (2) handles areas that were not covered by anything but got
2026 * exposed because of a resize.
2027 */
2028 const Region newExposed = visibleRegion - coveredRegion;
2029 const Region oldVisibleRegion = layer->visibleRegion;
2030 const Region oldCoveredRegion = layer->coveredRegion;
2031 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2032 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2033 }
2034 dirty.subtractSelf(aboveOpaqueLayers);
2035
2036 // accumulate to the screen dirty region
2037 outDirtyRegion.orSelf(dirty);
2038
2039 // Update aboveOpaqueLayers for next (lower) layer
2040 aboveOpaqueLayers.orSelf(opaqueRegion);
2041
2042 // Store the visible region in screen space
2043 layer->setVisibleRegion(visibleRegion);
2044 layer->setCoveredRegion(coveredRegion);
2045 layer->setVisibleNonTransparentRegion(
2046 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002047 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002048
2049 outOpaqueRegion = aboveOpaqueLayers;
2050}
2051
2052void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2053 const Region& dirty) {
2054 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2055 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2056 if (hw->getLayerStack() == layerStack) {
2057 hw->dirtyRegion.orSelf(dirty);
2058 }
2059 }
2060}
2061
2062bool SurfaceFlinger::handlePageFlip()
2063{
Brian Andersond6927fb2016-07-23 23:37:30 -07002064 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002065 Region dirtyRegion;
2066
2067 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002068 bool frameQueued = false;
2069
2070 // Store the set of layers that need updates. This set must not change as
2071 // buffers are being latched, as this could result in a deadlock.
2072 // Example: Two producers share the same command stream and:
2073 // 1.) Layer 0 is latched
2074 // 2.) Layer 0 gets a new frame
2075 // 2.) Layer 1 gets a new frame
2076 // 3.) Layer 1 is latched.
2077 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2078 // second frame. But layer 0's second frame could be waiting on display.
2079 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002080 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002081 if (layer->hasQueuedFrame()) {
2082 frameQueued = true;
2083 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002084 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002085 } else {
2086 layer->useEmptyDamage();
2087 }
2088 } else {
2089 layer->useEmptyDamage();
2090 }
Robert Carr2047fae2016-11-28 14:09:09 -08002091 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002092 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2093 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002094 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002095 layer->useSurfaceDamage();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002096 invalidateLayerStack(layer->getLayerStack(), dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002097 }
2098
2099 mVisibleRegionsDirty |= visibleRegions;
2100
2101 // If we will need to wake up at some time in the future to deal with a
2102 // queued frame that shouldn't be displayed during this vsync period, wake
2103 // up during the next vsync period to check again.
2104 if (frameQueued && layersWithQueuedFrames.empty()) {
2105 signalLayerUpdate();
2106 }
2107
2108 // Only continue with the refresh if there is actually new work to do
2109 return !layersWithQueuedFrames.empty();
2110}
2111
2112void SurfaceFlinger::invalidateHwcGeometry()
2113{
2114 mHwWorkListDirty = true;
2115}
2116
2117
2118void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2119 const Region& inDirtyRegion)
2120{
2121 // We only need to actually compose the display if:
2122 // 1) It is being handled by hardware composer, which may need this to
2123 // keep its virtual display state machine in sync, or
2124 // 2) There is work to be done (the dirty region isn't empty)
2125 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2126 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2127 return;
2128 }
2129
2130 Region dirtyRegion(inDirtyRegion);
2131
2132 // compute the invalid region
2133 hw->swapRegion.orSelf(dirtyRegion);
2134
2135 uint32_t flags = hw->getFlags();
2136 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2137 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2138 // takes a rectangle, we must make sure to update that whole
2139 // rectangle in that case
2140 dirtyRegion.set(hw->swapRegion.bounds());
2141 } else {
2142 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2143 // We need to redraw the rectangle that will be updated
2144 // (pushed to the framebuffer).
2145 // This is needed because PARTIAL_UPDATES only takes one
2146 // rectangle instead of a region (see DisplayDevice::flip())
2147 dirtyRegion.set(hw->swapRegion.bounds());
2148 } else {
2149 // we need to redraw everything (the whole screen)
2150 dirtyRegion.set(hw->bounds());
2151 hw->swapRegion = dirtyRegion;
2152 }
2153 }
2154
2155 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2156 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2157 } else {
2158 RenderEngine& engine(getRenderEngine());
2159 mat4 colorMatrix = mColorMatrix;
2160 if (mDaltonize) {
2161 colorMatrix = colorMatrix * mDaltonizer();
2162 }
2163 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2164 doComposeSurfaces(hw, dirtyRegion);
2165 engine.setupColorTransform(oldMatrix);
2166 }
2167
2168 // update the swap region and clear the dirty region
2169 hw->swapRegion.orSelf(dirtyRegion);
2170
2171 // swap buffers (presentation)
2172 hw->swapBuffers(getHwComposer());
2173}
2174
2175bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2176{
2177 RenderEngine& engine(getRenderEngine());
2178 const int32_t id = hw->getHwcDisplayId();
2179 HWComposer& hwc(getHwComposer());
2180 HWComposer::LayerListIterator cur = hwc.begin(id);
2181 const HWComposer::LayerListIterator end = hwc.end(id);
2182
2183 bool hasGlesComposition = hwc.hasGlesComposition(id);
2184 if (hasGlesComposition) {
2185 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2186 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2187 hw->getDisplayName().string());
2188 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2189 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2190 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2191 }
2192 return false;
2193 }
2194
2195 // Never touch the framebuffer if we don't have any framebuffer layers
2196 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2197 if (hasHwcComposition) {
2198 // when using overlays, we assume a fully transparent framebuffer
2199 // NOTE: we could reduce how much we need to clear, for instance
2200 // remove where there are opaque FB layers. however, on some
2201 // GPUs doing a "clean slate" clear might be more efficient.
2202 // We'll revisit later if needed.
2203 engine.clearWithColor(0, 0, 0, 0);
2204 } else {
2205 // we start with the whole screen area
2206 const Region bounds(hw->getBounds());
2207
2208 // we remove the scissor part
2209 // we're left with the letterbox region
2210 // (common case is that letterbox ends-up being empty)
2211 const Region letterbox(bounds.subtract(hw->getScissor()));
2212
2213 // compute the area to clear
2214 Region region(hw->undefinedRegion.merge(letterbox));
2215
2216 // but limit it to the dirty region
2217 region.andSelf(dirty);
2218
2219 // screen is already cleared here
2220 if (!region.isEmpty()) {
2221 // can happen with SurfaceView
2222 drawWormhole(hw, region);
2223 }
2224 }
2225
2226 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2227 // just to be on the safe side, we don't set the
2228 // scissor on the main display. It should never be needed
2229 // anyways (though in theory it could since the API allows it).
2230 const Rect& bounds(hw->getBounds());
2231 const Rect& scissor(hw->getScissor());
2232 if (scissor != bounds) {
2233 // scissor doesn't match the screen's dimensions, so we
2234 // need to clear everything outside of it and enable
2235 // the GL scissor so we don't draw anything where we shouldn't
2236
2237 // enable scissor for this frame
2238 const uint32_t height = hw->getHeight();
2239 engine.setScissor(scissor.left, height - scissor.bottom,
2240 scissor.getWidth(), scissor.getHeight());
2241 }
2242 }
2243 }
2244
2245 /*
2246 * and then, render the layers targeted at the framebuffer
2247 */
2248
2249 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2250 const size_t count = layers.size();
2251 const Transform& tr = hw->getTransform();
2252 if (cur != end) {
2253 // we're using h/w composer
2254 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2255 const sp<Layer>& layer(layers[i]);
2256 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2257 if (!clip.isEmpty()) {
2258 switch (cur->getCompositionType()) {
2259 case HWC_CURSOR_OVERLAY:
2260 case HWC_OVERLAY: {
2261 const Layer::State& state(layer->getDrawingState());
2262 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2263 && i
2264 && layer->isOpaque(state) && (state.alpha == 0xFF)
2265 && hasGlesComposition) {
2266 // never clear the very first layer since we're
2267 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002268 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002269 }
2270 break;
2271 }
2272 case HWC_FRAMEBUFFER: {
2273 layer->draw(hw, clip);
2274 break;
2275 }
2276 case HWC_FRAMEBUFFER_TARGET: {
2277 // this should not happen as the iterator shouldn't
2278 // let us get there.
2279 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2280 break;
2281 }
2282 }
2283 }
2284 layer->setAcquireFence(hw, *cur);
2285 }
2286 } else {
2287 // we're not using h/w composer
2288 for (size_t i=0 ; i<count ; ++i) {
2289 const sp<Layer>& layer(layers[i]);
2290 const Region clip(dirty.intersect(
2291 tr.transform(layer->visibleRegion)));
2292 if (!clip.isEmpty()) {
2293 layer->draw(hw, clip);
2294 }
2295 }
2296 }
2297
2298 // disable scissor at the end of the frame
2299 engine.disableScissor();
2300 return true;
2301}
2302
2303void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2304 const int32_t height = hw->getHeight();
2305 RenderEngine& engine(getRenderEngine());
2306 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2307}
2308
2309status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2310 const sp<IBinder>& handle,
2311 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002312 const sp<Layer>& lbc,
2313 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002314{
2315 // add this layer to the current state list
2316 {
2317 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002318 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002319 return NO_MEMORY;
2320 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002321 if (parent == nullptr) {
2322 mCurrentState.layersSortedByZ.add(lbc);
2323 } else {
2324 parent->addChild(lbc);
2325 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002326 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002327 mLayersAdded = true;
2328 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002329 }
2330
2331 // attach this layer to the client
2332 client->attachLayer(handle, lbc);
2333
2334 return NO_ERROR;
2335}
2336
Robert Carr9524cb32017-02-13 11:32:32 -08002337status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002338 Mutex::Autolock _l(mStateLock);
2339
Robert Carr1f0a16a2016-10-24 16:27:39 -07002340 const auto& p = layer->getParent();
2341 const ssize_t index = (p != nullptr) ? p->removeChild(layer) :
2342 mCurrentState.layersSortedByZ.remove(layer);
2343
Robert Carr136e2f62017-02-08 17:54:29 -08002344 // As a matter of normal operation, the LayerCleaner will produce a second
2345 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2346 // so we will succeed in promoting it, but it's already been removed
2347 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2348 // otherwise something has gone wrong and we are leaking the layer.
2349 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002350 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2351 layer->getName().string(),
2352 (p != nullptr) ? p->getName().string() : "no-parent");
2353 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002354 } else if (index < 0) {
2355 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002356 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002357
2358 mLayersPendingRemoval.add(layer);
2359 mLayersRemoved = true;
2360 mNumLayers--;
2361 setTransactionFlags(eTransactionNeeded);
2362 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002363}
2364
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002365uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002366 return android_atomic_release_load(&mTransactionFlags);
2367}
2368
2369uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2370 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2371}
2372
2373uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2374 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2375 if ((old & flags)==0) { // wake the server up
2376 signalTransaction();
2377 }
2378 return old;
2379}
2380
2381void SurfaceFlinger::setTransactionState(
2382 const Vector<ComposerState>& state,
2383 const Vector<DisplayState>& displays,
2384 uint32_t flags)
2385{
2386 ATRACE_CALL();
2387 Mutex::Autolock _l(mStateLock);
2388 uint32_t transactionFlags = 0;
2389
2390 if (flags & eAnimation) {
2391 // For window updates that are part of an animation we must wait for
2392 // previous animation "frames" to be handled.
2393 while (mAnimTransactionPending) {
2394 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2395 if (CC_UNLIKELY(err != NO_ERROR)) {
2396 // just in case something goes wrong in SF, return to the
2397 // caller after a few seconds.
2398 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2399 "waiting for previous animation frame");
2400 mAnimTransactionPending = false;
2401 break;
2402 }
2403 }
2404 }
2405
2406 size_t count = displays.size();
2407 for (size_t i=0 ; i<count ; i++) {
2408 const DisplayState& s(displays[i]);
2409 transactionFlags |= setDisplayStateLocked(s);
2410 }
2411
2412 count = state.size();
2413 for (size_t i=0 ; i<count ; i++) {
2414 const ComposerState& s(state[i]);
2415 // Here we need to check that the interface we're given is indeed
2416 // one of our own. A malicious client could give us a NULL
2417 // IInterface, or one of its own or even one of our own but a
2418 // different type. All these situations would cause us to crash.
2419 //
2420 // NOTE: it would be better to use RTTI as we could directly check
2421 // that we have a Client*. however, RTTI is disabled in Android.
2422 if (s.client != NULL) {
2423 sp<IBinder> binder = IInterface::asBinder(s.client);
2424 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002425 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002426 sp<Client> client( static_cast<Client *>(s.client.get()) );
2427 transactionFlags |= setClientStateLocked(client, s.state);
2428 }
2429 }
2430 }
2431 }
2432
2433 // If a synchronous transaction is explicitly requested without any changes,
2434 // force a transaction anyway. This can be used as a flush mechanism for
2435 // previous async transactions.
2436 if (transactionFlags == 0 && (flags & eSynchronous)) {
2437 transactionFlags = eTransactionNeeded;
2438 }
2439
2440 if (transactionFlags) {
2441 if (mInterceptor.isEnabled()) {
2442 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2443 }
2444
2445 // this triggers the transaction
2446 setTransactionFlags(transactionFlags);
2447
2448 // if this is a synchronous transaction, wait for it to take effect
2449 // before returning.
2450 if (flags & eSynchronous) {
2451 mTransactionPending = true;
2452 }
2453 if (flags & eAnimation) {
2454 mAnimTransactionPending = true;
2455 }
2456 while (mTransactionPending) {
2457 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2458 if (CC_UNLIKELY(err != NO_ERROR)) {
2459 // just in case something goes wrong in SF, return to the
2460 // called after a few seconds.
2461 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2462 mTransactionPending = false;
2463 break;
2464 }
2465 }
2466 }
2467}
2468
2469uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2470{
2471 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2472 if (dpyIdx < 0)
2473 return 0;
2474
2475 uint32_t flags = 0;
2476 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2477 if (disp.isValid()) {
2478 const uint32_t what = s.what;
2479 if (what & DisplayState::eSurfaceChanged) {
2480 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2481 disp.surface = s.surface;
2482 flags |= eDisplayTransactionNeeded;
2483 }
2484 }
2485 if (what & DisplayState::eLayerStackChanged) {
2486 if (disp.layerStack != s.layerStack) {
2487 disp.layerStack = s.layerStack;
2488 flags |= eDisplayTransactionNeeded;
2489 }
2490 }
2491 if (what & DisplayState::eDisplayProjectionChanged) {
2492 if (disp.orientation != s.orientation) {
2493 disp.orientation = s.orientation;
2494 flags |= eDisplayTransactionNeeded;
2495 }
2496 if (disp.frame != s.frame) {
2497 disp.frame = s.frame;
2498 flags |= eDisplayTransactionNeeded;
2499 }
2500 if (disp.viewport != s.viewport) {
2501 disp.viewport = s.viewport;
2502 flags |= eDisplayTransactionNeeded;
2503 }
2504 }
2505 if (what & DisplayState::eDisplaySizeChanged) {
2506 if (disp.width != s.width) {
2507 disp.width = s.width;
2508 flags |= eDisplayTransactionNeeded;
2509 }
2510 if (disp.height != s.height) {
2511 disp.height = s.height;
2512 flags |= eDisplayTransactionNeeded;
2513 }
2514 }
2515 }
2516 return flags;
2517}
2518
2519uint32_t SurfaceFlinger::setClientStateLocked(
2520 const sp<Client>& client,
2521 const layer_state_t& s)
2522{
2523 uint32_t flags = 0;
2524 sp<Layer> layer(client->getLayerUser(s.surface));
2525 if (layer != 0) {
2526 const uint32_t what = s.what;
2527 bool geometryAppliesWithResize =
2528 what & layer_state_t::eGeometryAppliesWithResize;
2529 if (what & layer_state_t::ePositionChanged) {
2530 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2531 flags |= eTraversalNeeded;
2532 }
2533 }
2534 if (what & layer_state_t::eLayerChanged) {
2535 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002536 const auto& p = layer->getParent();
2537 if (p == nullptr) {
2538 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2539 if (layer->setLayer(s.z) && idx >= 0) {
2540 mCurrentState.layersSortedByZ.removeAt(idx);
2541 mCurrentState.layersSortedByZ.add(layer);
2542 // we need traversal (state changed)
2543 // AND transaction (list changed)
2544 flags |= eTransactionNeeded|eTraversalNeeded;
2545 }
2546 } else {
2547 if (p->setChildLayer(layer, s.z)) {
2548 flags |= eTransactionNeeded|eTraversalNeeded;
2549 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002550 }
2551 }
2552 if (what & layer_state_t::eSizeChanged) {
2553 if (layer->setSize(s.w, s.h)) {
2554 flags |= eTraversalNeeded;
2555 }
2556 }
2557 if (what & layer_state_t::eAlphaChanged) {
2558 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2559 flags |= eTraversalNeeded;
2560 }
2561 if (what & layer_state_t::eMatrixChanged) {
2562 if (layer->setMatrix(s.matrix))
2563 flags |= eTraversalNeeded;
2564 }
2565 if (what & layer_state_t::eTransparentRegionChanged) {
2566 if (layer->setTransparentRegionHint(s.transparentRegion))
2567 flags |= eTraversalNeeded;
2568 }
2569 if (what & layer_state_t::eFlagsChanged) {
2570 if (layer->setFlags(s.flags, s.mask))
2571 flags |= eTraversalNeeded;
2572 }
2573 if (what & layer_state_t::eCropChanged) {
2574 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2575 flags |= eTraversalNeeded;
2576 }
2577 if (what & layer_state_t::eFinalCropChanged) {
2578 if (layer->setFinalCrop(s.finalCrop))
2579 flags |= eTraversalNeeded;
2580 }
2581 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002582 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002583 // We only allow setting layer stacks for top level layers,
2584 // everything else inherits layer stack from its parent.
2585 if (layer->hasParent()) {
2586 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2587 layer->getName().string());
2588 } else if (idx < 0) {
2589 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2590 "that also does not appear in the top level layer list. Something"
2591 " has gone wrong.", layer->getName().string());
2592 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002593 mCurrentState.layersSortedByZ.removeAt(idx);
2594 mCurrentState.layersSortedByZ.add(layer);
2595 // we need traversal (state changed)
2596 // AND transaction (list changed)
2597 flags |= eTransactionNeeded|eTraversalNeeded;
2598 }
2599 }
2600 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002601 if (s.barrierHandle != nullptr) {
2602 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2603 } else if (s.barrierGbp != nullptr) {
2604 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2605 if (authenticateSurfaceTextureLocked(gbp)) {
2606 const auto& otherLayer =
2607 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2608 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2609 } else {
2610 ALOGE("Attempt to defer transaction to to an"
2611 " unrecognized GraphicBufferProducer");
2612 }
2613 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002614 // We don't trigger a traversal here because if no other state is
2615 // changed, we don't want this to cause any more work
2616 }
Robert Carr1db73f62016-12-21 12:58:51 -08002617 if (what & layer_state_t::eReparentChildren) {
2618 if (layer->reparentChildren(s.reparentHandle)) {
2619 flags |= eTransactionNeeded|eTraversalNeeded;
2620 }
2621 }
Robert Carr9524cb32017-02-13 11:32:32 -08002622 if (what & layer_state_t::eDetachChildren) {
2623 layer->detachChildren();
2624 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002625 if (what & layer_state_t::eOverrideScalingModeChanged) {
2626 layer->setOverrideScalingMode(s.overrideScalingMode);
2627 // We don't trigger a traversal here because if no other state is
2628 // changed, we don't want this to cause any more work
2629 }
2630 }
2631 return flags;
2632}
2633
2634status_t SurfaceFlinger::createLayer(
2635 const String8& name,
2636 const sp<Client>& client,
2637 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002638 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2639 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002640{
2641 if (int32_t(w|h) < 0) {
2642 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2643 int(w), int(h));
2644 return BAD_VALUE;
2645 }
2646
2647 status_t result = NO_ERROR;
2648
2649 sp<Layer> layer;
2650
2651 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2652 case ISurfaceComposerClient::eFXSurfaceNormal:
2653 result = createNormalLayer(client,
2654 name, w, h, flags, format,
2655 handle, gbp, &layer);
2656 break;
2657 case ISurfaceComposerClient::eFXSurfaceDim:
2658 result = createDimLayer(client,
2659 name, w, h, flags,
2660 handle, gbp, &layer);
2661 break;
2662 default:
2663 result = BAD_VALUE;
2664 break;
2665 }
2666
2667 if (result != NO_ERROR) {
2668 return result;
2669 }
2670
Albert Chaulk479c60c2017-01-27 14:21:34 -05002671 layer->setInfo(windowType, ownerUid);
2672
Robert Carr1f0a16a2016-10-24 16:27:39 -07002673 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002674 if (result != NO_ERROR) {
2675 return result;
2676 }
2677 mInterceptor.saveSurfaceCreation(layer);
2678
2679 setTransactionFlags(eTransactionNeeded);
2680 return result;
2681}
2682
2683status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2684 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2685 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2686{
2687 // initialize the surfaces
2688 switch (format) {
2689 case PIXEL_FORMAT_TRANSPARENT:
2690 case PIXEL_FORMAT_TRANSLUCENT:
2691 format = PIXEL_FORMAT_RGBA_8888;
2692 break;
2693 case PIXEL_FORMAT_OPAQUE:
2694 format = PIXEL_FORMAT_RGBX_8888;
2695 break;
2696 }
2697
2698 *outLayer = new Layer(this, client, name, w, h, flags);
2699 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2700 if (err == NO_ERROR) {
2701 *handle = (*outLayer)->getHandle();
2702 *gbp = (*outLayer)->getProducer();
2703 }
2704
2705 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2706 return err;
2707}
2708
2709status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2710 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2711 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2712{
2713 *outLayer = new LayerDim(this, client, name, w, h, flags);
2714 *handle = (*outLayer)->getHandle();
2715 *gbp = (*outLayer)->getProducer();
2716 return NO_ERROR;
2717}
2718
2719status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2720{
Robert Carr9524cb32017-02-13 11:32:32 -08002721 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002722 status_t err = NO_ERROR;
2723 sp<Layer> l(client->getLayerUser(handle));
2724 if (l != NULL) {
2725 mInterceptor.saveSurfaceDeletion(l);
2726 err = removeLayer(l);
2727 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2728 "error removing layer=%p (%s)", l.get(), strerror(-err));
2729 }
2730 return err;
2731}
2732
2733status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2734{
2735 // called by ~LayerCleaner() when all references to the IBinder (handle)
2736 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002737 sp<Layer> l = layer.promote();
2738 if (l == nullptr) {
2739 // The layer has already been removed, carry on
2740 return NO_ERROR;
2741 } if (l->getParent() != nullptr) {
2742 // If we have a parent, then we can continue to live as long as it does.
2743 return NO_ERROR;
2744 }
2745 return removeLayer(l);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002746}
2747
2748// ---------------------------------------------------------------------------
2749
2750void SurfaceFlinger::onInitializeDisplays() {
2751 // reset screen orientation and use primary layer stack
2752 Vector<ComposerState> state;
2753 Vector<DisplayState> displays;
2754 DisplayState d;
2755 d.what = DisplayState::eDisplayProjectionChanged |
2756 DisplayState::eLayerStackChanged;
2757 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2758 d.layerStack = 0;
2759 d.orientation = DisplayState::eOrientationDefault;
2760 d.frame.makeInvalid();
2761 d.viewport.makeInvalid();
2762 d.width = 0;
2763 d.height = 0;
2764 displays.add(d);
2765 setTransactionState(state, displays, 0);
2766 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2767
2768 const nsecs_t period =
2769 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2770 mAnimFrameTracker.setDisplayRefreshPeriod(period);
Brian Andersond0010582017-03-07 13:20:31 -08002771
2772 // Use phase of 0 since phase is not known.
2773 // Use latency of 0, which will snap to the ideal latency.
2774 setCompositorTimingSnapped(0, period, 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002775}
2776
2777void SurfaceFlinger::initializeDisplays() {
2778 class MessageScreenInitialized : public MessageBase {
2779 SurfaceFlinger* flinger;
2780 public:
2781 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2782 virtual bool handler() {
2783 flinger->onInitializeDisplays();
2784 return true;
2785 }
2786 };
2787 sp<MessageBase> msg = new MessageScreenInitialized(this);
2788 postMessageAsync(msg); // we may be called from main thread, use async message
2789}
2790
2791void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2792 int mode) {
2793 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2794 this);
2795 int32_t type = hw->getDisplayType();
2796 int currentMode = hw->getPowerMode();
2797
2798 if (mode == currentMode) {
2799 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2800 return;
2801 }
2802
2803 hw->setPowerMode(mode);
2804 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2805 ALOGW("Trying to set power mode for virtual display");
2806 return;
2807 }
2808
2809 if (mInterceptor.isEnabled()) {
2810 Mutex::Autolock _l(mStateLock);
2811 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2812 if (idx < 0) {
2813 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2814 return;
2815 }
2816 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2817 }
2818
2819 if (currentMode == HWC_POWER_MODE_OFF) {
2820 // Turn on the display
2821 getHwComposer().setPowerMode(type, mode);
2822 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2823 // FIXME: eventthread only knows about the main display right now
2824 mEventThread->onScreenAcquired();
2825 resyncToHardwareVsync(true);
2826 }
2827
2828 mVisibleRegionsDirty = true;
2829 mHasPoweredOff = true;
2830 repaintEverything();
2831
2832 struct sched_param param = {0};
2833 param.sched_priority = 1;
2834 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2835 ALOGW("Couldn't set SCHED_FIFO on display on");
2836 }
2837 } else if (mode == HWC_POWER_MODE_OFF) {
2838 // Turn off the display
2839 struct sched_param param = {0};
2840 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2841 ALOGW("Couldn't set SCHED_OTHER on display off");
2842 }
2843
2844 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2845 disableHardwareVsync(true); // also cancels any in-progress resync
2846
2847 // FIXME: eventthread only knows about the main display right now
2848 mEventThread->onScreenReleased();
2849 }
2850
2851 getHwComposer().setPowerMode(type, mode);
2852 mVisibleRegionsDirty = true;
2853 // from this point on, SF will stop drawing on this display
2854 } else {
2855 getHwComposer().setPowerMode(type, mode);
2856 }
2857}
2858
2859void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2860 class MessageSetPowerMode: public MessageBase {
2861 SurfaceFlinger& mFlinger;
2862 sp<IBinder> mDisplay;
2863 int mMode;
2864 public:
2865 MessageSetPowerMode(SurfaceFlinger& flinger,
2866 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2867 mDisplay(disp) { mMode = mode; }
2868 virtual bool handler() {
2869 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2870 if (hw == NULL) {
2871 ALOGE("Attempt to set power mode = %d for null display %p",
2872 mMode, mDisplay.get());
2873 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2874 ALOGW("Attempt to set power mode = %d for virtual display",
2875 mMode);
2876 } else {
2877 mFlinger.setPowerModeInternal(hw, mMode);
2878 }
2879 return true;
2880 }
2881 };
2882 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2883 postMessageSync(msg);
2884}
2885
2886// ---------------------------------------------------------------------------
2887
2888status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2889{
2890 String8 result;
2891
2892 IPCThreadState* ipc = IPCThreadState::self();
2893 const int pid = ipc->getCallingPid();
2894 const int uid = ipc->getCallingUid();
2895 if ((uid != AID_SHELL) &&
2896 !PermissionCache::checkPermission(sDump, pid, uid)) {
2897 result.appendFormat("Permission Denial: "
2898 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2899 } else {
2900 // Try to get the main lock, but give up after one second
2901 // (this would indicate SF is stuck, but we want to be able to
2902 // print something in dumpsys).
2903 status_t err = mStateLock.timedLock(s2ns(1));
2904 bool locked = (err == NO_ERROR);
2905 if (!locked) {
2906 result.appendFormat(
2907 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2908 "dumping anyways (no locks held)\n", strerror(-err), err);
2909 }
2910
2911 bool dumpAll = true;
2912 size_t index = 0;
2913 size_t numArgs = args.size();
2914 if (numArgs) {
2915 if ((index < numArgs) &&
2916 (args[index] == String16("--list"))) {
2917 index++;
2918 listLayersLocked(args, index, result);
2919 dumpAll = false;
2920 }
2921
2922 if ((index < numArgs) &&
2923 (args[index] == String16("--latency"))) {
2924 index++;
2925 dumpStatsLocked(args, index, result);
2926 dumpAll = false;
2927 }
2928
2929 if ((index < numArgs) &&
2930 (args[index] == String16("--latency-clear"))) {
2931 index++;
2932 clearStatsLocked(args, index, result);
2933 dumpAll = false;
2934 }
2935
2936 if ((index < numArgs) &&
2937 (args[index] == String16("--dispsync"))) {
2938 index++;
2939 mPrimaryDispSync.dump(result);
2940 dumpAll = false;
2941 }
2942
2943 if ((index < numArgs) &&
2944 (args[index] == String16("--static-screen"))) {
2945 index++;
2946 dumpStaticScreenStats(result);
2947 dumpAll = false;
2948 }
2949
2950 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07002951 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002952 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07002953 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002954 dumpAll = false;
2955 }
2956 }
2957
2958 if (dumpAll) {
2959 dumpAllLocked(args, index, result);
2960 }
2961
2962 if (locked) {
2963 mStateLock.unlock();
2964 }
2965 }
2966 write(fd, result.string(), result.size());
2967 return NO_ERROR;
2968}
2969
2970void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2971 size_t& /* index */, String8& result) const
2972{
Robert Carr2047fae2016-11-28 14:09:09 -08002973 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002974 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08002975 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002976}
2977
2978void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2979 String8& result) const
2980{
2981 String8 name;
2982 if (index < args.size()) {
2983 name = String8(args[index]);
2984 index++;
2985 }
2986
2987 const nsecs_t period =
2988 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2989 result.appendFormat("%" PRId64 "\n", period);
2990
2991 if (name.isEmpty()) {
2992 mAnimFrameTracker.dumpStats(result);
2993 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08002994 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002995 if (name == layer->getName()) {
2996 layer->dumpFrameStats(result);
2997 }
Robert Carr2047fae2016-11-28 14:09:09 -08002998 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002999 }
3000}
3001
3002void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3003 String8& /* result */)
3004{
3005 String8 name;
3006 if (index < args.size()) {
3007 name = String8(args[index]);
3008 index++;
3009 }
3010
Robert Carr2047fae2016-11-28 14:09:09 -08003011 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003012 if (name.isEmpty() || (name == layer->getName())) {
3013 layer->clearFrameStats();
3014 }
Robert Carr2047fae2016-11-28 14:09:09 -08003015 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003016
3017 mAnimFrameTracker.clearStats();
3018}
3019
3020// This should only be called from the main thread. Otherwise it would need
3021// the lock and should use mCurrentState rather than mDrawingState.
3022void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003023 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003024 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003025 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003026
3027 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3028}
3029
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003030void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003031{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003032 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003033 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3034
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003035 if (isLayerTripleBufferingDisabled())
3036 result.append(" DISABLE_TRIPLE_BUFFERING");
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003037
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003038 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003039 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08003040 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08003041 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003042 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003043}
3044
3045void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3046{
3047 result.appendFormat("Static screen stats:\n");
3048 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3049 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3050 float percent = 100.0f *
3051 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3052 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3053 b + 1, bucketTimeSec, percent);
3054 }
3055 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3056 float percent = 100.0f *
3057 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3058 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3059 NUM_BUCKETS - 1, bucketTimeSec, percent);
3060}
3061
Brian Andersond6927fb2016-07-23 23:37:30 -07003062void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3063 result.appendFormat("Layer frame timestamps:\n");
3064
3065 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3066 const size_t count = currentLayers.size();
3067 for (size_t i=0 ; i<count ; i++) {
3068 currentLayers[i]->dumpFrameEvents(result);
3069 }
3070}
3071
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003072void SurfaceFlinger::recordBufferingStats(const char* layerName,
3073 std::vector<OccupancyTracker::Segment>&& history) {
3074 Mutex::Autolock lock(mBufferingStatsMutex);
3075 auto& stats = mBufferingStats[layerName];
3076 for (const auto& segment : history) {
3077 if (!segment.usedThirdBuffer) {
3078 stats.twoBufferTime += segment.totalTime;
3079 }
3080 if (segment.occupancyAverage < 1.0f) {
3081 stats.doubleBufferedTime += segment.totalTime;
3082 } else if (segment.occupancyAverage < 2.0f) {
3083 stats.tripleBufferedTime += segment.totalTime;
3084 }
3085 ++stats.numSegments;
3086 stats.totalTime += segment.totalTime;
3087 }
3088}
3089
3090void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3091 result.append("Buffering stats:\n");
3092 result.append(" [Layer name] <Active time> <Two buffer> "
3093 "<Double buffered> <Triple buffered>\n");
3094 Mutex::Autolock lock(mBufferingStatsMutex);
3095 typedef std::tuple<std::string, float, float, float> BufferTuple;
3096 std::map<float, BufferTuple, std::greater<float>> sorted;
3097 for (const auto& statsPair : mBufferingStats) {
3098 const char* name = statsPair.first.c_str();
3099 const BufferingStats& stats = statsPair.second;
3100 if (stats.numSegments == 0) {
3101 continue;
3102 }
3103 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3104 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3105 stats.totalTime;
3106 float doubleBufferRatio = static_cast<float>(
3107 stats.doubleBufferedTime) / stats.totalTime;
3108 float tripleBufferRatio = static_cast<float>(
3109 stats.tripleBufferedTime) / stats.totalTime;
3110 sorted.insert({activeTime, {name, twoBufferRatio,
3111 doubleBufferRatio, tripleBufferRatio}});
3112 }
3113 for (const auto& sortedPair : sorted) {
3114 float activeTime = sortedPair.first;
3115 const BufferTuple& values = sortedPair.second;
3116 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3117 std::get<0>(values).c_str(), activeTime,
3118 std::get<1>(values), std::get<2>(values),
3119 std::get<3>(values));
3120 }
3121 result.append("\n");
3122}
3123
3124void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3125 String8& result) const
3126{
3127 bool colorize = false;
3128 if (index < args.size()
3129 && (args[index] == String16("--color"))) {
3130 colorize = true;
3131 index++;
3132 }
3133
3134 Colorizer colorizer(colorize);
3135
3136 // figure out if we're stuck somewhere
3137 const nsecs_t now = systemTime();
3138 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3139 const nsecs_t inTransaction(mDebugInTransaction);
3140 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3141 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3142
3143 /*
3144 * Dump library configuration.
3145 */
3146
3147 colorizer.bold(result);
3148 result.append("Build configuration:");
3149 colorizer.reset(result);
3150 appendSfConfigString(result);
3151 appendUiConfigString(result);
3152 appendGuiConfigString(result);
3153 result.append("\n");
3154
3155 colorizer.bold(result);
3156 result.append("Sync configuration: ");
3157 colorizer.reset(result);
3158 result.append(SyncFeatures::getInstance().toString());
3159 result.append("\n");
3160
3161 colorizer.bold(result);
3162 result.append("DispSync configuration: ");
3163 colorizer.reset(result);
3164 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003165 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3166 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003167 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3168 result.append("\n");
3169
3170 // Dump static screen stats
3171 result.append("\n");
3172 dumpStaticScreenStats(result);
3173 result.append("\n");
3174
3175 dumpBufferingStats(result);
3176
3177 /*
3178 * Dump the visible layer list
3179 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003180 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003181 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003182 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003183 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003184 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003185 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003186
3187 /*
3188 * Dump Display state
3189 */
3190
3191 colorizer.bold(result);
3192 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3193 colorizer.reset(result);
3194 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3195 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3196 hw->dump(result);
3197 }
3198
3199 /*
3200 * Dump SurfaceFlinger global state
3201 */
3202
3203 colorizer.bold(result);
3204 result.append("SurfaceFlinger global state:\n");
3205 colorizer.reset(result);
3206
3207 HWComposer& hwc(getHwComposer());
3208 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3209
3210 colorizer.bold(result);
3211 result.appendFormat("EGL implementation : %s\n",
3212 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3213 colorizer.reset(result);
3214 result.appendFormat("%s\n",
3215 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3216
3217 mRenderEngine->dump(result);
3218
3219 hw->undefinedRegion.dump(result, "undefinedRegion");
3220 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3221 hw->getOrientation(), hw->isDisplayOn());
3222 result.appendFormat(
3223 " last eglSwapBuffers() time: %f us\n"
3224 " last transaction time : %f us\n"
3225 " transaction-flags : %08x\n"
3226 " refresh-rate : %f fps\n"
3227 " x-dpi : %f\n"
3228 " y-dpi : %f\n"
3229 " gpu_to_cpu_unsupported : %d\n"
3230 ,
3231 mLastSwapBufferTime/1000.0,
3232 mLastTransactionTime/1000.0,
3233 mTransactionFlags,
3234 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3235 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3236 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3237 !mGpuToCpuSupported);
3238
3239 result.appendFormat(" eglSwapBuffers time: %f us\n",
3240 inSwapBuffersDuration/1000.0);
3241
3242 result.appendFormat(" transaction time: %f us\n",
3243 inTransactionDuration/1000.0);
3244
3245 /*
3246 * VSYNC state
3247 */
3248 mEventThread->dump(result);
3249
3250 /*
3251 * Dump HWComposer state
3252 */
3253 colorizer.bold(result);
3254 result.append("h/w composer state:\n");
3255 colorizer.reset(result);
3256 result.appendFormat(" h/w composer %s and %s\n",
3257 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3258 (mDebugDisableHWC || mDebugRegion || mDaltonize
3259 || mHasColorMatrix) ? "disabled" : "enabled");
3260 hwc.dump(result);
3261
3262 /*
3263 * Dump gralloc state
3264 */
3265 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3266 alloc.dump(result);
3267}
3268
3269const Vector< sp<Layer> >&
3270SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3271 // Note: mStateLock is held here
3272 wp<IBinder> dpy;
3273 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3274 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3275 dpy = mDisplays.keyAt(i);
3276 break;
3277 }
3278 }
3279 if (dpy == NULL) {
3280 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3281 // Just use the primary display so we have something to return
3282 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3283 }
3284 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
3285}
3286
3287bool SurfaceFlinger::startDdmConnection()
3288{
3289 void* libddmconnection_dso =
3290 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3291 if (!libddmconnection_dso) {
3292 return false;
3293 }
3294 void (*DdmConnection_start)(const char* name);
3295 DdmConnection_start =
3296 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3297 if (!DdmConnection_start) {
3298 dlclose(libddmconnection_dso);
3299 return false;
3300 }
3301 (*DdmConnection_start)(getServiceName());
3302 return true;
3303}
3304
3305status_t SurfaceFlinger::onTransact(
3306 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3307{
3308 switch (code) {
3309 case CREATE_CONNECTION:
3310 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003311 case BOOT_FINISHED:
3312 case CLEAR_ANIMATION_FRAME_STATS:
3313 case GET_ANIMATION_FRAME_STATS:
3314 case SET_POWER_MODE:
3315 case GET_HDR_CAPABILITIES:
3316 {
3317 // codes that require permission check
3318 IPCThreadState* ipc = IPCThreadState::self();
3319 const int pid = ipc->getCallingPid();
3320 const int uid = ipc->getCallingUid();
3321 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3322 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3323 ALOGE("Permission Denial: "
3324 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3325 return PERMISSION_DENIED;
3326 }
3327 break;
3328 }
Robert Carr1db73f62016-12-21 12:58:51 -08003329 /*
3330 * Calling setTransactionState is safe, because you need to have been
3331 * granted a reference to Client* and Handle* to do anything with it.
3332 *
3333 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3334 */
3335 case SET_TRANSACTION_STATE:
3336 case CREATE_SCOPED_CONNECTION:
3337 {
3338 break;
3339 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003340 case CAPTURE_SCREEN:
3341 {
3342 // codes that require permission check
3343 IPCThreadState* ipc = IPCThreadState::self();
3344 const int pid = ipc->getCallingPid();
3345 const int uid = ipc->getCallingUid();
3346 if ((uid != AID_GRAPHICS) &&
3347 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3348 ALOGE("Permission Denial: "
3349 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3350 return PERMISSION_DENIED;
3351 }
3352 break;
3353 }
3354 }
3355
3356 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3357 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3358 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3359 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3360 IPCThreadState* ipc = IPCThreadState::self();
3361 const int pid = ipc->getCallingPid();
3362 const int uid = ipc->getCallingUid();
3363 ALOGE("Permission Denial: "
3364 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3365 return PERMISSION_DENIED;
3366 }
3367 int n;
3368 switch (code) {
3369 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3370 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3371 return NO_ERROR;
3372 case 1002: // SHOW_UPDATES
3373 n = data.readInt32();
3374 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3375 invalidateHwcGeometry();
3376 repaintEverything();
3377 return NO_ERROR;
3378 case 1004:{ // repaint everything
3379 repaintEverything();
3380 return NO_ERROR;
3381 }
3382 case 1005:{ // force transaction
3383 setTransactionFlags(
3384 eTransactionNeeded|
3385 eDisplayTransactionNeeded|
3386 eTraversalNeeded);
3387 return NO_ERROR;
3388 }
3389 case 1006:{ // send empty update
3390 signalRefresh();
3391 return NO_ERROR;
3392 }
3393 case 1008: // toggle use of hw composer
3394 n = data.readInt32();
3395 mDebugDisableHWC = n ? 1 : 0;
3396 invalidateHwcGeometry();
3397 repaintEverything();
3398 return NO_ERROR;
3399 case 1009: // toggle use of transform hint
3400 n = data.readInt32();
3401 mDebugDisableTransformHint = n ? 1 : 0;
3402 invalidateHwcGeometry();
3403 repaintEverything();
3404 return NO_ERROR;
3405 case 1010: // interrogate.
3406 reply->writeInt32(0);
3407 reply->writeInt32(0);
3408 reply->writeInt32(mDebugRegion);
3409 reply->writeInt32(0);
3410 reply->writeInt32(mDebugDisableHWC);
3411 return NO_ERROR;
3412 case 1013: {
3413 Mutex::Autolock _l(mStateLock);
3414 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3415 reply->writeInt32(hw->getPageFlipCount());
3416 return NO_ERROR;
3417 }
3418 case 1014: {
3419 // daltonize
3420 n = data.readInt32();
3421 switch (n % 10) {
3422 case 1:
3423 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3424 break;
3425 case 2:
3426 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3427 break;
3428 case 3:
3429 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3430 break;
3431 }
3432 if (n >= 10) {
3433 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3434 } else {
3435 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3436 }
3437 mDaltonize = n > 0;
3438 invalidateHwcGeometry();
3439 repaintEverything();
3440 return NO_ERROR;
3441 }
3442 case 1015: {
3443 // apply a color matrix
3444 n = data.readInt32();
3445 mHasColorMatrix = n ? 1 : 0;
3446 if (n) {
3447 // color matrix is sent as mat3 matrix followed by vec3
3448 // offset, then packed into a mat4 where the last row is
3449 // the offset and extra values are 0
3450 for (size_t i = 0 ; i < 4; i++) {
3451 for (size_t j = 0; j < 4; j++) {
3452 mColorMatrix[i][j] = data.readFloat();
3453 }
3454 }
3455 } else {
3456 mColorMatrix = mat4();
3457 }
3458 invalidateHwcGeometry();
3459 repaintEverything();
3460 return NO_ERROR;
3461 }
3462 // This is an experimental interface
3463 // Needs to be shifted to proper binder interface when we productize
3464 case 1016: {
3465 n = data.readInt32();
3466 mPrimaryDispSync.setRefreshSkipCount(n);
3467 return NO_ERROR;
3468 }
3469 case 1017: {
3470 n = data.readInt32();
3471 mForceFullDamage = static_cast<bool>(n);
3472 return NO_ERROR;
3473 }
3474 case 1018: { // Modify Choreographer's phase offset
3475 n = data.readInt32();
3476 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3477 return NO_ERROR;
3478 }
3479 case 1019: { // Modify SurfaceFlinger's phase offset
3480 n = data.readInt32();
3481 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3482 return NO_ERROR;
3483 }
3484 case 1020: { // Layer updates interceptor
3485 n = data.readInt32();
3486 if (n) {
3487 ALOGV("Interceptor enabled");
3488 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3489 }
3490 else{
3491 ALOGV("Interceptor disabled");
3492 mInterceptor.disable();
3493 }
3494 return NO_ERROR;
3495 }
3496 case 1021: { // Disable HWC virtual displays
3497 n = data.readInt32();
3498 mUseHwcVirtualDisplays = !n;
3499 return NO_ERROR;
3500 }
3501 }
3502 }
3503 return err;
3504}
3505
3506void SurfaceFlinger::repaintEverything() {
3507 android_atomic_or(1, &mRepaintEverything);
3508 signalTransaction();
3509}
3510
3511// ---------------------------------------------------------------------------
3512// Capture screen into an IGraphiBufferProducer
3513// ---------------------------------------------------------------------------
3514
3515/* The code below is here to handle b/8734824
3516 *
3517 * We create a IGraphicBufferProducer wrapper that forwards all calls
3518 * from the surfaceflinger thread to the calling binder thread, where they
3519 * are executed. This allows the calling thread in the calling process to be
3520 * reused and not depend on having "enough" binder threads to handle the
3521 * requests.
3522 */
3523class GraphicProducerWrapper : public BBinder, public MessageHandler {
3524 /* Parts of GraphicProducerWrapper are run on two different threads,
3525 * communicating by sending messages via Looper but also by shared member
3526 * data. Coherence maintenance is subtle and in places implicit (ugh).
3527 *
3528 * Don't rely on Looper's sendMessage/handleMessage providing
3529 * release/acquire semantics for any data not actually in the Message.
3530 * Data going from surfaceflinger to binder threads needs to be
3531 * synchronized explicitly.
3532 *
3533 * Barrier open/wait do provide release/acquire semantics. This provides
3534 * implicit synchronization for data coming back from binder to
3535 * surfaceflinger threads.
3536 */
3537
3538 sp<IGraphicBufferProducer> impl;
3539 sp<Looper> looper;
3540 status_t result;
3541 bool exitPending;
3542 bool exitRequested;
3543 Barrier barrier;
3544 uint32_t code;
3545 Parcel const* data;
3546 Parcel* reply;
3547
3548 enum {
3549 MSG_API_CALL,
3550 MSG_EXIT
3551 };
3552
3553 /*
3554 * Called on surfaceflinger thread. This is called by our "fake"
3555 * BpGraphicBufferProducer. We package the data and reply Parcel and
3556 * forward them to the binder thread.
3557 */
3558 virtual status_t transact(uint32_t code,
3559 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3560 this->code = code;
3561 this->data = &data;
3562 this->reply = reply;
3563 if (exitPending) {
3564 // if we've exited, we run the message synchronously right here.
3565 // note (JH): as far as I can tell from looking at the code, this
3566 // never actually happens. if it does, i'm not sure if it happens
3567 // on the surfaceflinger or binder thread.
3568 handleMessage(Message(MSG_API_CALL));
3569 } else {
3570 barrier.close();
3571 // Prevent stores to this->{code, data, reply} from being
3572 // reordered later than the construction of Message.
3573 atomic_thread_fence(memory_order_release);
3574 looper->sendMessage(this, Message(MSG_API_CALL));
3575 barrier.wait();
3576 }
3577 return result;
3578 }
3579
3580 /*
3581 * here we run on the binder thread. All we've got to do is
3582 * call the real BpGraphicBufferProducer.
3583 */
3584 virtual void handleMessage(const Message& message) {
3585 int what = message.what;
3586 // Prevent reads below from happening before the read from Message
3587 atomic_thread_fence(memory_order_acquire);
3588 if (what == MSG_API_CALL) {
3589 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3590 barrier.open();
3591 } else if (what == MSG_EXIT) {
3592 exitRequested = true;
3593 }
3594 }
3595
3596public:
3597 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3598 : impl(impl),
3599 looper(new Looper(true)),
3600 result(NO_ERROR),
3601 exitPending(false),
3602 exitRequested(false),
3603 code(0),
3604 data(NULL),
3605 reply(NULL)
3606 {}
3607
3608 // Binder thread
3609 status_t waitForResponse() {
3610 do {
3611 looper->pollOnce(-1);
3612 } while (!exitRequested);
3613 return result;
3614 }
3615
3616 // Client thread
3617 void exit(status_t result) {
3618 this->result = result;
3619 exitPending = true;
3620 // Ensure this->result is visible to the binder thread before it
3621 // handles the message.
3622 atomic_thread_fence(memory_order_release);
3623 looper->sendMessage(this, Message(MSG_EXIT));
3624 }
3625};
3626
3627
3628status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3629 const sp<IGraphicBufferProducer>& producer,
3630 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003631 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003632 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3633
3634 if (CC_UNLIKELY(display == 0))
3635 return BAD_VALUE;
3636
3637 if (CC_UNLIKELY(producer == 0))
3638 return BAD_VALUE;
3639
3640 // if we have secure windows on this display, never allow the screen capture
3641 // unless the producer interface is local (i.e.: we can take a screenshot for
3642 // ourselves).
3643 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3644
3645 // Convert to surfaceflinger's internal rotation type.
3646 Transform::orientation_flags rotationFlags;
3647 switch (rotation) {
3648 case ISurfaceComposer::eRotateNone:
3649 rotationFlags = Transform::ROT_0;
3650 break;
3651 case ISurfaceComposer::eRotate90:
3652 rotationFlags = Transform::ROT_90;
3653 break;
3654 case ISurfaceComposer::eRotate180:
3655 rotationFlags = Transform::ROT_180;
3656 break;
3657 case ISurfaceComposer::eRotate270:
3658 rotationFlags = Transform::ROT_270;
3659 break;
3660 default:
3661 rotationFlags = Transform::ROT_0;
3662 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3663 break;
3664 }
3665
3666 class MessageCaptureScreen : public MessageBase {
3667 SurfaceFlinger* flinger;
3668 sp<IBinder> display;
3669 sp<IGraphicBufferProducer> producer;
3670 Rect sourceCrop;
3671 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003672 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003673 bool useIdentityTransform;
3674 Transform::orientation_flags rotation;
3675 status_t result;
3676 bool isLocalScreenshot;
3677 public:
3678 MessageCaptureScreen(SurfaceFlinger* flinger,
3679 const sp<IBinder>& display,
3680 const sp<IGraphicBufferProducer>& producer,
3681 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003682 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003683 bool useIdentityTransform,
3684 Transform::orientation_flags rotation,
3685 bool isLocalScreenshot)
3686 : flinger(flinger), display(display), producer(producer),
3687 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3688 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3689 useIdentityTransform(useIdentityTransform),
3690 rotation(rotation), result(PERMISSION_DENIED),
3691 isLocalScreenshot(isLocalScreenshot)
3692 {
3693 }
3694 status_t getResult() const {
3695 return result;
3696 }
3697 virtual bool handler() {
3698 Mutex::Autolock _l(flinger->mStateLock);
3699 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3700 result = flinger->captureScreenImplLocked(hw, producer,
3701 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3702 useIdentityTransform, rotation, isLocalScreenshot);
3703 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3704 return true;
3705 }
3706 };
3707
3708 // this creates a "fake" BBinder which will serve as a "fake" remote
3709 // binder to receive the marshaled calls and forward them to the
3710 // real remote (a BpGraphicBufferProducer)
3711 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3712
3713 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3714 // which does the marshaling work forwards to our "fake remote" above.
3715 sp<MessageBase> msg = new MessageCaptureScreen(this,
3716 display, IGraphicBufferProducer::asInterface( wrapper ),
3717 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3718 useIdentityTransform, rotationFlags, isLocalScreenshot);
3719
3720 status_t res = postMessageAsync(msg);
3721 if (res == NO_ERROR) {
3722 res = wrapper->waitForResponse();
3723 }
3724 return res;
3725}
3726
3727
3728void SurfaceFlinger::renderScreenImplLocked(
3729 const sp<const DisplayDevice>& hw,
3730 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003731 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003732 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3733{
3734 ATRACE_CALL();
3735 RenderEngine& engine(getRenderEngine());
3736
3737 // get screen geometry
3738 const int32_t hw_w = hw->getWidth();
3739 const int32_t hw_h = hw->getHeight();
3740 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3741 static_cast<int32_t>(reqHeight) != hw_h;
3742
3743 // if a default or invalid sourceCrop is passed in, set reasonable values
3744 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3745 !sourceCrop.isValid()) {
3746 sourceCrop.setLeftTop(Point(0, 0));
3747 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3748 }
3749
3750 // ensure that sourceCrop is inside screen
3751 if (sourceCrop.left < 0) {
3752 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3753 }
3754 if (sourceCrop.right > hw_w) {
3755 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3756 }
3757 if (sourceCrop.top < 0) {
3758 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3759 }
3760 if (sourceCrop.bottom > hw_h) {
3761 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3762 }
3763
3764 // make sure to clear all GL error flags
3765 engine.checkErrors();
3766
3767 // set-up our viewport
3768 engine.setViewportAndProjection(
3769 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3770 engine.disableTexturing();
3771
3772 // redraw the screen entirely...
3773 engine.clearWithColor(0, 0, 0, 1);
3774
Robert Carr1f0a16a2016-10-24 16:27:39 -07003775 // We loop through the first level of layers without traversing,
3776 // as we need to interpret min/max layer Z in the top level Z space.
3777 for (const auto& layer : mDrawingState.layersSortedByZ) {
3778 if (layer->getLayerStack() != hw->getLayerStack()) {
3779 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003780 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003781 const Layer::State& state(layer->getDrawingState());
3782 if (state.z < minLayerZ || state.z > maxLayerZ) {
3783 continue;
3784 }
3785 layer->traverseInZOrder([&](Layer* layer) {
3786 if (!layer->isVisible()) {
3787 return;
3788 }
3789 if (filtering) layer->setFiltering(true);
3790 layer->draw(hw, useIdentityTransform);
3791 if (filtering) layer->setFiltering(false);
3792 });
3793 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003794
3795 // compositionComplete is needed for older driver
3796 hw->compositionComplete();
3797 hw->setViewportAndProjection();
3798}
3799
3800
3801status_t SurfaceFlinger::captureScreenImplLocked(
3802 const sp<const DisplayDevice>& hw,
3803 const sp<IGraphicBufferProducer>& producer,
3804 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003805 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003806 bool useIdentityTransform, Transform::orientation_flags rotation,
3807 bool isLocalScreenshot)
3808{
3809 ATRACE_CALL();
3810
3811 // get screen geometry
3812 uint32_t hw_w = hw->getWidth();
3813 uint32_t hw_h = hw->getHeight();
3814
3815 if (rotation & Transform::ROT_90) {
3816 std::swap(hw_w, hw_h);
3817 }
3818
3819 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3820 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3821 reqWidth, reqHeight, hw_w, hw_h);
3822 return BAD_VALUE;
3823 }
3824
3825 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3826 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3827
3828 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003829 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003830 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003831 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3832 (state.z < minLayerZ || state.z > maxLayerZ)) {
3833 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003834 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003835 layer->traverseInZOrder([&](Layer *layer) {
3836 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3837 layer->isSecure());
3838 });
3839 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003840
3841 if (!isLocalScreenshot && secureLayerIsVisible) {
3842 ALOGW("FB is protected: PERMISSION_DENIED");
3843 return PERMISSION_DENIED;
3844 }
3845
3846 // create a surface (because we're a producer, and we need to
3847 // dequeue/queue a buffer)
3848 sp<Surface> sur = new Surface(producer, false);
3849 ANativeWindow* window = sur.get();
3850
3851 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3852 if (result == NO_ERROR) {
3853 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3854 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3855
3856 int err = 0;
3857 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3858 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3859 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3860 err |= native_window_set_usage(window, usage);
3861
3862 if (err == NO_ERROR) {
3863 ANativeWindowBuffer* buffer;
3864 /* TODO: Once we have the sync framework everywhere this can use
3865 * server-side waits on the fence that dequeueBuffer returns.
3866 */
3867 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3868 if (result == NO_ERROR) {
3869 int syncFd = -1;
3870 // create an EGLImage from the buffer so we can later
3871 // turn it into a texture
3872 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3873 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3874 if (image != EGL_NO_IMAGE_KHR) {
3875 // this binds the given EGLImage as a framebuffer for the
3876 // duration of this scope.
3877 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3878 if (imageBond.getStatus() == NO_ERROR) {
3879 // this will in fact render into our dequeued buffer
3880 // via an FBO, which means we didn't have to create
3881 // an EGLSurface and therefore we're not
3882 // dependent on the context's EGLConfig.
3883 renderScreenImplLocked(
3884 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3885 useIdentityTransform, rotation);
3886
3887 // Attempt to create a sync khr object that can produce a sync point. If that
3888 // isn't available, create a non-dupable sync object in the fallback path and
3889 // wait on it directly.
3890 EGLSyncKHR sync;
3891 if (!DEBUG_SCREENSHOTS) {
3892 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3893 // native fence fd will not be populated until flush() is done.
3894 getRenderEngine().flush();
3895 } else {
3896 sync = EGL_NO_SYNC_KHR;
3897 }
3898 if (sync != EGL_NO_SYNC_KHR) {
3899 // get the sync fd
3900 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3901 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3902 ALOGW("captureScreen: failed to dup sync khr object");
3903 syncFd = -1;
3904 }
3905 eglDestroySyncKHR(mEGLDisplay, sync);
3906 } else {
3907 // fallback path
3908 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3909 if (sync != EGL_NO_SYNC_KHR) {
3910 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3911 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3912 EGLint eglErr = eglGetError();
3913 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3914 ALOGW("captureScreen: fence wait timed out");
3915 } else {
3916 ALOGW_IF(eglErr != EGL_SUCCESS,
3917 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3918 }
3919 eglDestroySyncKHR(mEGLDisplay, sync);
3920 } else {
3921 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3922 }
3923 }
3924 if (DEBUG_SCREENSHOTS) {
3925 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3926 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3927 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3928 hw, minLayerZ, maxLayerZ);
3929 delete [] pixels;
3930 }
3931
3932 } else {
3933 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3934 result = INVALID_OPERATION;
3935 window->cancelBuffer(window, buffer, syncFd);
3936 buffer = NULL;
3937 }
3938 // destroy our image
3939 eglDestroyImageKHR(mEGLDisplay, image);
3940 } else {
3941 result = BAD_VALUE;
3942 }
3943 if (buffer) {
3944 // queueBuffer takes ownership of syncFd
3945 result = window->queueBuffer(window, buffer, syncFd);
3946 }
3947 }
3948 } else {
3949 result = BAD_VALUE;
3950 }
3951 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3952 }
3953
3954 return result;
3955}
3956
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003957void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08003958 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003959 if (DEBUG_SCREENSHOTS) {
3960 for (size_t y=0 ; y<h ; y++) {
3961 uint32_t const * p = (uint32_t const *)vaddr + y*s;
3962 for (size_t x=0 ; x<w ; x++) {
3963 if (p[x] != 0xFF000000) return;
3964 }
3965 }
3966 ALOGE("*** we just took a black screenshot ***\n"
3967 "requested minz=%d, maxz=%d, layerStack=%d",
3968 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08003969 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003970 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003971 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003972 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
3973 state.z <= maxLayerZ) {
3974 layer->traverseInZOrder([&](Layer* layer) {
3975 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3976 layer->isVisible() ? '+' : '-',
3977 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003978 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003979 i++;
3980 });
3981 }
3982 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003983 }
3984}
3985
3986// ---------------------------------------------------------------------------
3987
Robert Carr2047fae2016-11-28 14:09:09 -08003988void SurfaceFlinger::State::traverseInZOrder(const std::function<void(Layer*)>& consume) const {
3989 layersSortedByZ.traverseInZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003990}
3991
Robert Carr2047fae2016-11-28 14:09:09 -08003992void SurfaceFlinger::State::traverseInReverseZOrder(const std::function<void(Layer*)>& consume) const {
3993 layersSortedByZ.traverseInReverseZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003994}
3995
3996}; // namespace android
3997
3998
3999#if defined(__gl_h_)
4000#error "don't include gl/gl.h in this file"
4001#endif
4002
4003#if defined(__gl2_h_)
4004#error "don't include gl2/gl2.h in this file"
4005#endif