summaryrefslogtreecommitdiff
path: root/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
diff options
context:
space:
mode:
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;
+ }
+ }
}
}
}