aboutsummaryrefslogtreecommitdiff
path: root/drmdisplaycompositor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'drmdisplaycompositor.cpp')
-rw-r--r--drmdisplaycompositor.cpp86
1 files changed, 42 insertions, 44 deletions
diff --git a/drmdisplaycompositor.cpp b/drmdisplaycompositor.cpp
index 773b696..bcd1a14 100644
--- a/drmdisplaycompositor.cpp
+++ b/drmdisplaycompositor.cpp
@@ -241,7 +241,6 @@ DrmDisplayCompositor::DrmDisplayCompositor()
frame_worker_(this),
initialized_(false),
active_(false),
- needs_modeset_(false),
framebuffer_index_(0),
squash_framebuffer_index_(0),
dump_frames_composited_(0),
@@ -263,6 +262,11 @@ DrmDisplayCompositor::~DrmDisplayCompositor() {
if (ret)
ALOGE("Failed to acquire compositor lock %d", ret);
+ if (mode_.blob_id)
+ drm_->DestroyPropertyBlob(mode_.blob_id);
+ if (mode_.old_blob_id)
+ drm_->DestroyPropertyBlob(mode_.old_blob_id);
+
while (!composite_queue_.empty()) {
composite_queue_.front().reset();
composite_queue_.pop();
@@ -619,44 +623,14 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp) {
return -ENOMEM;
}
- uint32_t blob_id = 0;
- uint64_t old_blob_id;
- if (needs_modeset_) {
- DrmProperty old_mode;
- ret = drm_->GetCrtcProperty(*crtc, crtc->mode_property().name().c_str(),
- &old_mode);
- if (ret) {
- ALOGE("Failed to get old mode property from crtc %d", crtc->id());
- drmModePropertySetFree(pset);
- return ret;
- }
- ret = old_mode.value(&old_blob_id);
- if (ret) {
- ALOGE("Could not get old blob id value %d", ret);
- drmModePropertySetFree(pset);
- return ret;
- }
-
- struct drm_mode_modeinfo drm_mode;
- memset(&drm_mode, 0, sizeof(drm_mode));
- next_mode_.ToDrmModeModeInfo(&drm_mode);
-
- ret = drm_->CreatePropertyBlob(&drm_mode, sizeof(struct drm_mode_modeinfo),
- &blob_id);
- if (ret) {
- ALOGE("Failed to create mode property blob %d", ret);
- drmModePropertySetFree(pset);
- return ret;
- }
-
+ if (mode_.needs_modeset) {
ret = drmModePropertySetAdd(pset, crtc->id(), crtc->mode_property().id(),
- blob_id) ||
+ mode_.blob_id) ||
drmModePropertySetAdd(pset, connector->id(),
connector->crtc_id_property().id(), crtc->id());
if (ret) {
- ALOGE("Failed to add blob %d to pset", blob_id);
+ ALOGE("Failed to add blob %d to pset", mode_.blob_id);
drmModePropertySetFree(pset);
- drm_->DestroyPropertyBlob(blob_id);
return ret;
}
}
@@ -819,19 +793,17 @@ out:
if (ret) {
ALOGE("Failed to commit pset ret=%d\n", ret);
drmModePropertySetFree(pset);
- if (needs_modeset_)
- drm_->DestroyPropertyBlob(blob_id);
return ret;
}
}
if (pset)
drmModePropertySetFree(pset);
- if (needs_modeset_) {
- ret = drm_->DestroyPropertyBlob(old_blob_id);
+ if (mode_.needs_modeset) {
+ ret = drm_->DestroyPropertyBlob(mode_.old_blob_id);
if (ret) {
- ALOGE("Failed to destroy old mode property blob %lld/%d", old_blob_id,
- ret);
+ ALOGE("Failed to destroy old mode property blob %lld/%d",
+ mode_.old_blob_id, ret);
return ret;
}
@@ -842,8 +814,10 @@ out:
return ret;
}
- connector->set_active_mode(next_mode_);
- needs_modeset_ = false;
+ connector->set_active_mode(mode_.mode);
+ mode_.old_blob_id = mode_.blob_id;
+ mode_.blob_id = 0;
+ mode_.needs_modeset = false;
}
return ret;
@@ -866,6 +840,23 @@ int DrmDisplayCompositor::ApplyDpms(DrmDisplayComposition *display_comp) {
return 0;
}
+std::tuple<int, uint32_t> DrmDisplayCompositor::CreateModeBlob(
+ const DrmMode &mode) {
+ struct drm_mode_modeinfo drm_mode;
+ memset(&drm_mode, 0, sizeof(drm_mode));
+ mode.ToDrmModeModeInfo(&drm_mode);
+
+ uint32_t id = 0;
+ 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 %ld\n", id);
+ return std::make_tuple(ret, id);
+}
+
void DrmDisplayCompositor::ApplyFrame(
std::unique_ptr<DrmDisplayComposition> composition, int status) {
int ret = status;
@@ -944,8 +935,15 @@ int DrmDisplayCompositor::Composite() {
ALOGE("Failed to apply dpms for display %d", display_);
return ret;
case DRM_COMPOSITION_TYPE_MODESET:
- next_mode_ = composition->display_mode();
- needs_modeset_ = true;
+ mode_.mode = composition->display_mode();
+ if (mode_.blob_id)
+ drm_->DestroyPropertyBlob(mode_.blob_id);
+ std::tie(ret, mode_.blob_id) = CreateModeBlob(mode_.mode);
+ if (ret) {
+ ALOGE("Failed to create mode blob for display %d", display_);
+ return ret;
+ }
+ mode_.needs_modeset = true;
return 0;
default:
ALOGE("Unknown composition type %d", composition->type());