blob: 31390aa21f9e86d87f74da3bf00a27af457caf94 [file] [log] [blame]
Pierre-Hugues Husson9685fef2018-08-24 13:38:12 +02001From 7a4b9b1613ee04fd71f3ed83e45ba0a5fd040dfb 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 3/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 fda7906..80c72d9 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 87baf8c..729671d 100644
41--- a/services/surfaceflinger/SurfaceFlinger.cpp
42+++ b/services/surfaceflinger/SurfaceFlinger.cpp
43@@ -350,6 +350,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 8566b03..9b29bef 100644
60--- a/services/surfaceflinger/SurfaceFlinger.h
61+++ b/services/surfaceflinger/SurfaceFlinger.h
62@@ -841,6 +841,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.7.4
74