summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/SurfaceFlinger.cpp
diff options
context:
space:
mode:
author Alec Mouri <alecmouri@google.com> 2019-08-12 16:01:52 -0700
committer android-build-merger <android-build-merger@google.com> 2019-08-12 16:01:52 -0700
commita0fb6c30cdbb64c387808d3c070ad5db2fe81c1b (patch)
tree6e2bc2c1bfa41001ccc3dbb367995a2f6dcb978f /services/surfaceflinger/SurfaceFlinger.cpp
parent04b07cf876b6dc30344980f576ad258c69c71f3c (diff)
parent2778a9fcf33c8a9afa0c161a936faab70f60d4fd (diff)
Merge "[SurfaceFlinger] Callback to renderengine when erasing BLAST buffers" into qt-r1-dev am: 9939d091ec
am: 2778a9fcf3 Change-Id: I150aa5c7d08e7f5037f7886d0380d157f45c4534
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index d829337d3f..2b92ccb25f 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -3843,6 +3843,7 @@ void SurfaceFlinger::applyTransactionState(const Vector<ComposerState>& states,
if (uncacheBuffer.isValid()) {
ClientCache::getInstance().erase(uncacheBuffer);
+ getRenderEngine().unbindExternalTextureBuffer(uncacheBuffer.id);
}
// If a synchronous transaction is explicitly requested without any changes, force a transaction
@@ -4197,12 +4198,18 @@ uint32_t SurfaceFlinger::setClientStateLocked(
bool bufferChanged = what & layer_state_t::eBufferChanged;
bool cacheIdChanged = what & layer_state_t::eCachedBufferChanged;
sp<GraphicBuffer> buffer;
- if (bufferChanged && cacheIdChanged) {
- ClientCache::getInstance().add(s.cachedBuffer, s.buffer);
- ClientCache::getInstance().registerErasedRecipient(s.cachedBuffer,
- wp<ClientCache::ErasedRecipient>(layer));
- getRenderEngine().cacheExternalTextureBuffer(s.buffer);
+ if (bufferChanged && cacheIdChanged && s.buffer != nullptr) {
buffer = s.buffer;
+ bool success = ClientCache::getInstance().add(s.cachedBuffer, s.buffer);
+ if (success) {
+ getRenderEngine().cacheExternalTextureBuffer(s.buffer);
+ success = ClientCache::getInstance()
+ .registerErasedRecipient(s.cachedBuffer,
+ wp<ClientCache::ErasedRecipient>(this));
+ if (!success) {
+ getRenderEngine().unbindExternalTextureBuffer(s.buffer->getId());
+ }
+ }
} else if (cacheIdChanged) {
buffer = ClientCache::getInstance().get(s.cachedBuffer);
} else if (bufferChanged) {
@@ -6249,6 +6256,10 @@ sp<Layer> SurfaceFlinger::fromHandle(const sp<IBinder>& handle) {
return nullptr;
}
+void SurfaceFlinger::bufferErased(const client_cache_t& clientCacheId) {
+ getRenderEngine().unbindExternalTextureBuffer(clientCacheId.id);
+}
+
} // namespace android
#if defined(__gl_h_)