summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
authorYichi Chen <yichichen@google.com>2021-09-10 08:04:00 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-09-10 08:04:00 +0000
commitf2d51fd11f45bedeae728b6d16fe9c241966833e (patch)
treed099fb242632210dfb46251c7ac28baf654573b3 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
parente201a60e5abcd46a200cbbac4d3287a696696fa5 (diff)
parentb715d98f8fc4a360f7a47384df360f778e567709 (diff)
FBManager: check secure flag before freeing secure framebuffers am: b715d98f8f
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/google/graphics/common/+/15767851 Change-Id: I1ce820c6d92e8d7b6c775ae4997481724d1385df
Diffstat (limited to 'libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp')
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index b3db3fc..e626dbc 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -180,7 +180,8 @@ int32_t FramebufferManager::getBuffer(const exynos_win_config_data &config, uint
}
fbId = findCachedFbId(config.layer,
- [bufferDesc = Framebuffer::BufferDesc{config.buffer_id, drmFormat}](
+ [bufferDesc = Framebuffer::BufferDesc{config.buffer_id, drmFormat,
+ config.protection}](
auto &buffer) { return buffer->bufferDesc == bufferDesc; });
if (fbId != 0) {
return NO_ERROR;
@@ -284,7 +285,8 @@ int32_t FramebufferManager::getBuffer(const exynos_win_config_data &config, uint
} else {
cachedBuffers.emplace_front(
new Framebuffer(mDrmFd, fbId,
- Framebuffer::BufferDesc{config.buffer_id, drmFormat}));
+ Framebuffer::BufferDesc{config.buffer_id, drmFormat,
+ config.protection}));
mHasSecureFramebuffer |= (isFramebuffer(config.layer) && config.protection);
}
} else {
@@ -300,7 +302,7 @@ void FramebufferManager::flip(bool hasSecureFrameBuffer) {
Mutex::Autolock lock(mMutex);
destroyUnusedLayersLocked();
if (!hasSecureFrameBuffer) {
- destroyFramebufferLocked();
+ destroySecureFramebufferLocked();
}
needCleanup = mCleanBuffers.size() > 0;
}
@@ -358,7 +360,7 @@ void FramebufferManager::destroyUnusedLayersLocked() {
mCachedLayersInuse.clear();
}
-void FramebufferManager::destroyFramebufferLocked() {
+void FramebufferManager::destroySecureFramebufferLocked() {
if (!mHasSecureFramebuffer) {
return;
}
@@ -367,8 +369,16 @@ void FramebufferManager::destroyFramebufferLocked() {
for (auto &layer : mCachedLayerBuffers) {
if (isFramebuffer(layer.first)) {
- mCleanBuffers.splice(mCleanBuffers.end(), std::move(layer.second));
- return;
+ auto &bufferList = layer.second;
+ for (auto it = bufferList.begin(); it != bufferList.end(); ++it) {
+ auto &buffer = *it;
+ if (buffer->bufferDesc.isSecure) {
+ // Assume the latest non-secure buffer in the front
+ // TODO: have a better way to keep in-used buffers
+ mCleanBuffers.splice(mCleanBuffers.end(), bufferList, it, bufferList.end());
+ return;
+ }
+ }
}
}
}