summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Howgego <paul.howgego@arm.com>2020-06-09 18:21:45 +0100
committerJohn Stultz <john.stultz@linaro.org>2020-06-26 22:57:10 +0000
commit3f17bc0953a6efae769c26ba116a7e936303315c (patch)
tree2daa323bafa9290dd55f0bb4307b4e07fc244bc3
parenta63d66c7bbb2b990e86040eb646540924bd20a23 (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.cpp6
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;