diff options
author | Robert Foss <robert.foss@collabora.com> | 2017-09-27 19:28:15 +0200 |
---|---|---|
committer | Robert Foss <robert.foss@collabora.com> | 2017-09-28 18:31:57 +0200 |
commit | a1ade4e404430fc8d880f160cb8acf2c874b431f (patch) | |
tree | adb3b68bc13472250f8a78810a11e03c7bab1907 /drmdisplaycompositor.cpp | |
parent | 0690c1c8f9d86eef79a7884f8dbc40d661428699 (diff) |
drm_hwcomposer: Add out-fence support
Add support for out-fences through the OUT_FENCE_PTR property.
Out-fences signal when their associated buffer may be read by a device.
Signed-off-by: Robert Foss <robert.foss@collabora.com>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Diffstat (limited to 'drmdisplaycompositor.cpp')
-rw-r--r-- | drmdisplaycompositor.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drmdisplaycompositor.cpp b/drmdisplaycompositor.cpp index 75c1a7c..8936d08 100644 --- a/drmdisplaycompositor.cpp +++ b/drmdisplaycompositor.cpp @@ -602,6 +602,7 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp, display_comp->composition_planes(); std::vector<DrmCompositionRegion> &pre_comp_regions = display_comp->pre_comp_regions(); + uint64_t out_fences[drm_->crtcs().size()]; DrmConnector *connector = drm_->GetConnectorForDisplay(display_); if (!connector) { @@ -620,6 +621,16 @@ int DrmDisplayCompositor::CommitFrame(DrmDisplayComposition *display_comp, return -ENOMEM; } + if (crtc->out_fence_ptr_property().id() != 0) { + ret = drmModeAtomicAddProperty(pset, crtc->id(), crtc->out_fence_ptr_property().id(), + (uint64_t) &out_fences[crtc->pipe()]); + if (ret < 0) { + ALOGE("Failed to add OUT_FENCE_PTR property to pset: %d", ret); + drmModeAtomicFree(pset); + return ret; + } + } + if (mode_.needs_modeset) { ret = drmModeAtomicAddProperty(pset, crtc->id(), crtc->mode_property().id(), mode_.blob_id) < 0 || @@ -818,6 +829,10 @@ out: mode_.needs_modeset = false; } + if (crtc->out_fence_ptr_property().id()) { + display_comp->set_out_fence((int) out_fences[crtc->pipe()]); + } + return ret; } |