blob: 0002becb42506f4690775c3650147b2b8d0b2a9b [file] [log] [blame]
Jon West569c3122019-04-17 20:34:37 -04001From 8ee3c4eba65c42f02c13d5bb65dcce33e9c0260a Mon Sep 17 00:00:00 2001
2From: Pierre-Hugues Husson <phh@phh.me>
3Date: Fri, 5 Jan 2018 00:26:38 +0100
4Subject: [PATCH 4/4] [device] ::Huawei:: HWC doesn't understand 0,0,0,0 ==
5 fullscreen damage. Set it to the whole visible surface
6
7::Huawei:: Fix damage for Huawei compositor
8
9For Huawei compositor, the damage area is a region on the screen.
10But for SurfaceFlinger, this is a region on the source surface.
11On Huawei devices, do the plane conversion.
12
13This fixes several UI glitches, most notably GBoard.
14---
15 services/surfaceflinger/BufferLayer.cpp | 8 +++++++-
16 services/surfaceflinger/SurfaceFlinger.cpp | 8 ++++++++
17 services/surfaceflinger/SurfaceFlinger.h | 3 +++
18 3 files changed, 18 insertions(+), 1 deletion(-)
19
20diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp
21index 7ac143219..2646af0c9 100644
22--- a/services/surfaceflinger/BufferLayer.cpp
23+++ b/services/surfaceflinger/BufferLayer.cpp
24@@ -631,7 +631,13 @@ void BufferLayer::setPerFrameData(const sp<const DisplayDevice>& displayDevice)
25 visible.dump(LOG_TAG);
26 }
27
28- error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
29+ if(mFlinger->mDamageUsesScreenReference) {
30+ const auto& frame = hwcInfo.displayFrame;
31+ auto fullSource = Region(Rect(frame.left, frame.top, frame.right, frame.bottom));
32+ error = hwcLayer->setSurfaceDamage(fullSource);
33+ } else {
34+ error = hwcLayer->setSurfaceDamage(surfaceDamageRegion);
35+ }
36 if (error != HWC2::Error::None) {
37 ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(),
38 to_string(error).c_str(), static_cast<int32_t>(error));
39diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
40index 0580b4bfc..49e3b269a 100644
41--- a/services/surfaceflinger/SurfaceFlinger.cpp
42+++ b/services/surfaceflinger/SurfaceFlinger.cpp
43@@ -384,6 +384,14 @@ SurfaceFlinger::SurfaceFlinger() : SurfaceFlinger(SkipInitialization) {
44 // for production purposes later on.
45 setenv("TREBLE_TESTING_OVERRIDE", "true", true);
46 }
47+
48+ property_get("ro.hardware", value, "");
49+ if(strstr(value, "hi3660")||
50+ strstr(value, "hi6250") ||
51+ strstr(value, "hi3670") ||
52+ strstr(value, "kirin970")) {
53+ mDamageUsesScreenReference = true;
54+ }
55 }
56
57 void SurfaceFlinger::onFirstRef()
58diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
59index 0148ab675..367ea555a 100644
60--- a/services/surfaceflinger/SurfaceFlinger.h
61+++ b/services/surfaceflinger/SurfaceFlinger.h
62@@ -852,6 +852,9 @@ private:
63 // Restrict layers to use two buffers in their bufferqueues.
64 bool mLayerTripleBufferingDisabled = false;
65
66+ bool mDamageUsesScreenReference;
67+
68+
69 // these are thread safe
70 mutable std::unique_ptr<MessageQueue> mEventQueue{std::make_unique<impl::MessageQueue>()};
71 FrameTracker mAnimFrameTracker;
72--
732.17.1
74