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