summaryrefslogtreecommitdiff
path: root/sdm/libs/hwc2/hwc_layers.cpp
diff options
context:
space:
mode:
authorRamkumar Radhakrishnan <ramkumar@codeaurora.org>2017-12-15 16:43:07 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2018-01-23 15:07:29 -0800
commit525e643511742465912d580ba359ab2dfd435f26 (patch)
tree4cdc9e6ea5e52fe3e3317747364ca19d6430222c /sdm/libs/hwc2/hwc_layers.cpp
parent24682bf12bf3dbfd48937996c000f9164cf5ab30 (diff)
downloaddisplay-525e643511742465912d580ba359ab2dfd435f26.tar.gz
hwc2: Dup buffer fd in SetLayerBuffer() to avoid fb_id failure
Buffer fd for layers/client target is getting closed in ComposerClient without hwcomposer knowledge, So creation of fb_id for that buffer failed during DP disconnect. Hence duplicate the buffer fd to avoid create fb id failures. Change-Id: I7fb04aff9605ac28a64dcd615fa4804caa923996 CRs-Fixed: 2157977
Diffstat (limited to 'sdm/libs/hwc2/hwc_layers.cpp')
-rw-r--r--sdm/libs/hwc2/hwc_layers.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index 0bcffc62..bd6aefa0 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright 2015 The Android Open Source Project
@@ -180,12 +180,15 @@ HWCLayer::HWCLayer(hwc2_display_t display_id, HWCBufferAllocator *buf_allocator)
HWCLayer::~HWCLayer() {
// Close any fences left for this layer
while (!release_fences_.empty()) {
- close(release_fences_.front());
+ ::close(release_fences_.front());
release_fences_.pop();
}
if (layer_) {
if (layer_->input_buffer.acquire_fence_fd >= 0) {
- close(layer_->input_buffer.acquire_fence_fd);
+ ::close(layer_->input_buffer.acquire_fence_fd);
+ }
+ if (buffer_fd_ >= 0) {
+ ::close(buffer_fd_);
}
delete layer_;
}
@@ -257,10 +260,14 @@ HWC2::Error HWCLayer::SetLayerBuffer(buffer_handle_t buffer, int32_t acquire_fen
layer_buffer->flags.secure_display = secure_display;
if (layer_buffer->acquire_fence_fd >= 0) {
- close(layer_buffer->acquire_fence_fd);
+ ::close(layer_buffer->acquire_fence_fd);
}
layer_buffer->acquire_fence_fd = acquire_fence;
- layer_buffer->planes[0].fd = handle->fd;
+ if (buffer_fd_ >= 0) {
+ ::close(buffer_fd_);
+ }
+ buffer_fd_ = ::dup(handle->fd);
+ layer_buffer->planes[0].fd = buffer_fd_;
layer_buffer->planes[0].offset = handle->offset;
layer_buffer->planes[0].stride = UINT32(handle->width);
layer_buffer->size = handle->size;