diff options
author | Yichi Chen <yichichen@google.com> | 2021-09-10 08:16:18 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-09-10 08:16:18 +0000 |
commit | eb9b2354cb33d2c24fcda650ca4292ec862e70ee (patch) | |
tree | e992226c3292372a918b553d0f245d2fefb1e9e2 /libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | |
parent | 22cb9962052c2f84e767c1b4e9f2921de8ffbcc5 (diff) | |
parent | f2d51fd11f45bedeae728b6d16fe9c241966833e (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.cpp | 22 |
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; + } + } } } } |