diff options
author | Paul Howgego <paul.howgego@arm.com> | 2020-06-09 18:21:45 +0100 |
---|---|---|
committer | John Stultz <john.stultz@linaro.org> | 2020-06-26 22:57:10 +0000 |
commit | 3f17bc0953a6efae769c26ba116a7e936303315c (patch) | |
tree | 2daa323bafa9290dd55f0bb4307b4e07fc244bc3 | |
parent | a63d66c7bbb2b990e86040eb646540924bd20a23 (diff) |
drm_hwcomposer: Fix invalid buffer_handle_t pointer
In Android 11, at boot time, I see the following sequence of
calls from SurfaceFlinger that trigger this:
// Composition type for layer is saved in DRM HWC Layer validated_type_
validateDisplay()
// Layer composition type saved in DRM HWC Layer sf_type_
acceptDisplayChanges()
// Composition type in Layer sf_type_ is now "client" so DRM HWC doesn't
// update the Layer buffer pointer
setLayerBuffer()
// DRM HWC Layer sf_type_ is now changed back to "device"
setLayerCompositionType()
// DRM HWC iterates through the layers and finds that Layer composition
// type in sf_type_ is "device" so thinks it is fine to calls
// importBuffer() but this Layer now has an invalid pointer as the
// setLayerBuffer() was ignored.
validateDisplay()
Thus this patch, changes the logic to always update the
buffer_handle_t pointer in setLayerBuffer regardless of
composition type rather than keeping the invalid buffer_handle_t
in the Layer obect. The composition type may be changed back to
device composition by setLayerCompositionType at which point the
Layer object needs to have saved the buffer_handle_t.
Not sure how we could reproduce the same sequence of calls on
another Android version.
Signed-off-by: Paul Howgego <paul.howgego@arm.com>
[jstultz: Reword and add context from merge request to the commit message]
Signed-off-by: John Stultz <john.stultz@linaro.org>
Change-Id: I88a11ee2fee742d6154a482455a8532a95e681d3
-rw-r--r-- | drmhwctwo.cpp | 6 |
1 files changed, 0 insertions, 6 deletions
diff --git a/drmhwctwo.cpp b/drmhwctwo.cpp index 798e013..46071b9 100644 --- a/drmhwctwo.cpp +++ b/drmhwctwo.cpp @@ -1040,12 +1040,6 @@ HWC2::Error DrmHwcTwo::HwcLayer::SetLayerBuffer(buffer_handle_t buffer, supported(__func__); UniqueFd uf(acquire_fence); - // The buffer and acquire_fence are handled elsewhere - if (sf_type_ == HWC2::Composition::Client || - sf_type_ == HWC2::Composition::Sideband || - sf_type_ == HWC2::Composition::SolidColor) - return HWC2::Error::None; - set_buffer(buffer); set_acquire_fence(uf.get()); return HWC2::Error::None; |