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());