Only support buffers with layer count == 1
Multi-layered buffers are not something that makes sense for
SurfaceFlinger to ingest. Instead of weird rendering glitches
downstream, reject those proactively to inform clients of
their mistake
Bug: 392541013
Flag: EXEMPT bug fix
Test: build & boot, existing usages work as expected
Change-Id: I7f0581b8a76accf337b9dc3212de551832374e6f
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index ae11006..4008606 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -8553,6 +8553,19 @@
return nullptr;
}
+ if (bufferData.buffer && bufferData.buffer->getLayerCount() != 1) {
+ std::string errorMessage =
+ base::StringPrintf("Attempted to create an ExternalTexture with layer count (%u)"
+ " != 1 for layer %s",
+ bufferData.buffer->getLayerCount(), layerName);
+ ALOGD("%s", errorMessage.c_str());
+ if (bufferData.releaseBufferListener) {
+ bufferData.releaseBufferListener->onTransactionQueueStalled(
+ String8(errorMessage.c_str()));
+ }
+ return nullptr;
+ }
+
bool cachedBufferChanged =
bufferData.flags.test(BufferData::BufferDataChange::cachedBufferChanged);
if (cachedBufferChanged && bufferData.buffer) {