Fix NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS handling

Fixes: 123541940
Test: CTS HardwareRendererTests#testLotsOfBuffers
Change-Id: I5d96e615f552c4faa0e6dcaaaa828c871eaf6c8e
diff --git a/libs/hwui/renderthread/VulkanSurface.cpp b/libs/hwui/renderthread/VulkanSurface.cpp
index 1708d3c..3fed6b0 100644
--- a/libs/hwui/renderthread/VulkanSurface.cpp
+++ b/libs/hwui/renderthread/VulkanSurface.cpp
@@ -222,7 +222,17 @@
     const SkISize maxSize = SkISize::Make(caps.maxImageExtent.width, caps.maxImageExtent.height);
     ComputeWindowSizeAndTransform(&windowInfo, minSize, maxSize);
 
-    windowInfo.bufferCount = std::max<uint32_t>(VulkanSurface::sMaxBufferCount, caps.minImageCount);
+    int query_value;
+    int err = window->query(window, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &query_value);
+    if (err != 0 || query_value < 0) {
+        ALOGE("window->query failed: %s (%d) value=%d", strerror(-err), err,
+              query_value);
+        return nullptr;
+    }
+    auto min_undequeued_buffers = static_cast<uint32_t>(query_value);
+
+    windowInfo.bufferCount = min_undequeued_buffers
+            + std::max(VulkanSurface::sTargetBufferCount, caps.minImageCount);
     if (caps.maxImageCount > 0 && windowInfo.bufferCount > caps.maxImageCount) {
         // Application must settle for fewer images than desired:
         windowInfo.bufferCount = caps.maxImageCount;
@@ -357,10 +367,9 @@
         return false;
     }
 
-    // Lower layer insists that we have at least two buffers.
-    err = native_window_set_buffer_count(window, std::max(2, windowInfo.bufferCount));
+    err = native_window_set_buffer_count(window, windowInfo.bufferCount);
     if (err != 0) {
-        ALOGE("VulkanSurface::UpdateWindow() native_window_set_buffer_count(%d) failed: %s (%d)",
+        ALOGE("VulkanSurface::UpdateWindow() native_window_set_buffer_count(%zu) failed: %s (%d)",
               windowInfo.bufferCount, strerror(-err), err);
         return false;
     }
@@ -392,7 +401,7 @@
 }
 
 void VulkanSurface::releaseBuffers() {
-    for (uint32_t i = 0; i < VulkanSurface::sMaxBufferCount; i++) {
+    for (uint32_t i = 0; i < mWindowInfo.bufferCount; i++) {
         VulkanSurface::NativeBufferInfo& bufferInfo = mNativeBuffers[i];
 
         if (bufferInfo.buffer.get() != nullptr && bufferInfo.dequeued) {