summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
authorYichi Chen <yichichen@google.com>2021-09-10 08:16:18 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-09-10 08:16:18 +0000
commiteb9b2354cb33d2c24fcda650ca4292ec862e70ee (patch)
treee992226c3292372a918b553d0f245d2fefb1e9e2 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
parent22cb9962052c2f84e767c1b4e9f2921de8ffbcc5 (diff)
parentf2d51fd11f45bedeae728b6d16fe9c241966833e (diff)
FBManager: check secure flag before freeing secure framebuffers am: b715d98f8f am: f2d51fd11f
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/google/graphics/common/+/15767851 Change-Id: I464d411e3487acb2f0425db296eaa24e9ee9d576
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 1a56246..147ac70 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;
+ }
+ }
}
}
}