diff options
author | Ramkumar Radhakrishnan <ramkumar@codeaurora.org> | 2017-12-15 16:43:07 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2018-01-23 15:07:29 -0800 |
commit | 525e643511742465912d580ba359ab2dfd435f26 (patch) | |
tree | 4cdc9e6ea5e52fe3e3317747364ca19d6430222c /sdm/libs | |
parent | 24682bf12bf3dbfd48937996c000f9164cf5ab30 (diff) | |
download | display-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')
-rw-r--r-- | sdm/libs/hwc2/hwc_layers.cpp | 17 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_layers.h | 3 |
2 files changed, 14 insertions, 6 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; diff --git a/sdm/libs/hwc2/hwc_layers.h b/sdm/libs/hwc2/hwc_layers.h index 5f5792fa..ed03c50c 100644 --- a/sdm/libs/hwc2/hwc_layers.h +++ b/sdm/libs/hwc2/hwc_layers.h @@ -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 @@ -111,6 +111,7 @@ class HWCLayer { LayerRect dst_rect_ = {}; bool needs_validate_ = true; bool single_buffer_ = false; + int buffer_fd_ = -1; // Composition requested by client(SF) HWC2::Composition client_requested_ = HWC2::Composition::Device; |