drm_hwcomposer: Rework UserPropertyBlob to use RAII

Makes code simpler and leak-free.

Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
diff --git a/compositor/DrmDisplayCompositor.cpp b/compositor/DrmDisplayCompositor.cpp
index 4539664..576c533 100644
--- a/compositor/DrmDisplayCompositor.cpp
+++ b/compositor/DrmDisplayCompositor.cpp
@@ -51,11 +51,6 @@
 DrmDisplayCompositor::~DrmDisplayCompositor() {
   if (!initialized_)
     return;
-  DrmDevice *drm = resource_manager_->GetDrmDevice(display_);
-  if (mode_.blob_id)
-    drm->DestroyPropertyBlob(mode_.blob_id);
-  if (mode_.old_blob_id)
-    drm->DestroyPropertyBlob(mode_.old_blob_id);
 
   active_composition_.reset();
 }
@@ -161,9 +156,9 @@
     return -EINVAL;
   }
 
-  if (mode_.needs_modeset &&
+  if (mode_.blob &&
       (!crtc->active_property().AtomicSet(*pset, 1) ||
-       !crtc->mode_property().AtomicSet(*pset, mode_.blob_id) ||
+       !crtc->mode_property().AtomicSet(*pset, *mode_.blob) ||
        !connector->crtc_id_property().AtomicSet(*pset, crtc->id()))) {
     return -EINVAL;
   }
@@ -210,14 +205,7 @@
     }
   }
 
-  if (!test_only && mode_.needs_modeset) {
-    ret = drm->DestroyPropertyBlob(mode_.old_blob_id);
-    if (ret) {
-      ALOGE("Failed to destroy old mode property blob %" PRIu32 "/%d",
-            mode_.old_blob_id, ret);
-      return ret;
-    }
-
+  if (!test_only && mode_.blob) {
     /* TODO: Add dpms to the pset when the kernel supports it */
     ret = ApplyDpms(display_comp);
     if (ret) {
@@ -226,9 +214,7 @@
     }
 
     connector->set_active_mode(mode_.mode);
-    mode_.old_blob_id = mode_.blob_id;
-    mode_.blob_id = 0;
-    mode_.needs_modeset = false;
+    mode_.old_blob = std::move(mode_.blob);
   }
 
   if (crtc->out_fence_ptr_property()) {
@@ -256,21 +242,14 @@
   return 0;
 }
 
-std::tuple<int, uint32_t> DrmDisplayCompositor::CreateModeBlob(
-    const DrmMode &mode) {
+auto DrmDisplayCompositor::CreateModeBlob(const DrmMode &mode)
+    -> DrmModeUserPropertyBlobUnique {
   struct drm_mode_modeinfo drm_mode {};
   mode.ToDrmModeModeInfo(&drm_mode);
 
-  uint32_t id = 0;
   DrmDevice *drm = resource_manager_->GetDrmDevice(display_);
-  int ret = drm->CreatePropertyBlob(&drm_mode, sizeof(struct drm_mode_modeinfo),
-                                    &id);
-  if (ret) {
-    ALOGE("Failed to create mode property blob %d", ret);
-    return std::make_tuple(ret, 0);
-  }
-  ALOGE("Create blob_id %" PRIu32 "\n", id);
-  return std::make_tuple(ret, id);
+  return drm->RegisterUserPropertyBlob(&drm_mode,
+                                       sizeof(struct drm_mode_modeinfo));
 }
 
 void DrmDisplayCompositor::ClearDisplay() {
@@ -327,15 +306,11 @@
       return ret;
     case DRM_COMPOSITION_TYPE_MODESET:
       mode_.mode = composition->display_mode();
-      if (mode_.blob_id)
-        resource_manager_->GetDrmDevice(display_)->DestroyPropertyBlob(
-            mode_.blob_id);
-      std::tie(ret, mode_.blob_id) = CreateModeBlob(mode_.mode);
-      if (ret) {
+      mode_.blob = CreateModeBlob(mode_.mode);
+      if (!mode_.blob) {
         ALOGE("Failed to create mode blob for display %d", display_);
-        return ret;
+        return -EINVAL;
       }
-      mode_.needs_modeset = true;
       return 0;
     default:
       ALOGE("Unknown composition type %d", composition->type());