OSDN Git Service

libui: support GRALLOC1_CAPABILITY_RELEASE_IMPLY_DELETE
authorChia-I Wu <olv@google.com>
Tue, 11 Apr 2017 17:03:38 +0000 (10:03 -0700)
committerChia-I Wu <olv@google.com>
Tue, 11 Apr 2017 19:03:32 +0000 (12:03 -0700)
Honor GRALLOC1_CAPABILITY_RELEASE_IMPLY_DELETE in
GraphicBufferMapper and advertise the cap in the adapter.

Bug: 36355756
Test: boots on gralloc0 and gralloc1 devices
Change-Id: I54a4855883904255fba9a0821ff9d866d265d25a

libs/ui/Gralloc1On0Adapter.cpp
libs/ui/GraphicBufferMapper.cpp

index bd7c6a1..9ee9838 100644 (file)
@@ -20,6 +20,9 @@
 
 #include <ui/Gralloc1On0Adapter.h>
 
+#include <algorithm>
+#include <array>
+
 #include <grallocusage/GrallocUsageConversion.h>
 
 #include <hardware/gralloc.h>
@@ -67,13 +70,18 @@ Gralloc1On0Adapter::~Gralloc1On0Adapter()
 void Gralloc1On0Adapter::doGetCapabilities(uint32_t* outCount,
         int32_t* outCapabilities)
 {
+    constexpr std::array<int32_t, 2> supportedCapabilities = {{
+        GRALLOC1_CAPABILITY_ON_ADAPTER,
+        GRALLOC1_CAPABILITY_RELEASE_IMPLY_DELETE,
+    }};
+
     if (outCapabilities == nullptr) {
-        *outCount = 1;
-        return;
-    }
-    if (*outCount >= 1) {
-        *outCapabilities = GRALLOC1_CAPABILITY_ON_ADAPTER;
-        *outCount = 1;
+        *outCount = supportedCapabilities.size();
+    } else {
+        *outCount = std::min(*outCount, static_cast<uint32_t>(
+                    supportedCapabilities.size()));
+        std::copy_n(supportedCapabilities.begin(),
+                *outCount, outCapabilities);
     }
 }
 
@@ -325,6 +333,9 @@ gralloc1_error_t Gralloc1On0Adapter::release(
         if (result != 0) {
             ALOGE("gralloc0 unregister failed: %d", result);
         }
+
+        native_handle_close(handle);
+        native_handle_delete(const_cast<native_handle_t*>(handle));
     }
 
     mBuffers.erase(handle);
index 2f4d5fb..87519bf 100644 (file)
@@ -122,8 +122,10 @@ status_t GraphicBufferMapper::freeBuffer(buffer_handle_t handle)
         error = GRALLOC1_ERROR_NONE;
     } else {
         error = mDevice->release(handle);
-        native_handle_close(handle);
-        native_handle_delete(const_cast<native_handle_t*>(handle));
+        if (!mDevice->hasCapability(GRALLOC1_CAPABILITY_RELEASE_IMPLY_DELETE)) {
+            native_handle_close(handle);
+            native_handle_delete(const_cast<native_handle_t*>(handle));
+        }
     }
 
     ALOGW_IF(error != GRALLOC1_ERROR_NONE, "freeBuffer(%p): failed %d",