[PATCH hwc v2 3/6] drm_hwcomposer: Submit in-fence to DRM
Robert Foss
robert.foss at collabora.com
Wed Sep 27 18:59:15 UTC 2017
Hey Sean,
On Wed, 2017-09-27 at 14:55 -0400, Sean Paul wrote:
> On Wed, Sep 27, 2017 at 7:58 AM, Robert Foss <robert.foss at collabora.c
> om> wrote:
> > Add support for in-fences through the IN_FENCE_FD property. In-
> > fences signal
> > when their associated buffer may be read by DRM/KMS.
> >
> > Signed-off-by: Robert Foss <robert.foss at collabora.com>
> > ---
> > drmdisplaycompositor.cpp | 35 ++++++++++++++++-------------------
> > 1 file changed, 16 insertions(+), 19 deletions(-)
> >
> > diff --git a/drmdisplaycompositor.cpp b/drmdisplaycompositor.cpp
> > index bd670cf..71c0451 100644
> > --- a/drmdisplaycompositor.cpp
> > +++ b/drmdisplaycompositor.cpp
> > @@ -529,6 +529,7 @@ int
> > DrmDisplayCompositor::CommitFrame(DrmDisplayComposition
> > *display_comp,
> > std::vector<size_t> &source_layers =
> > comp_plane.source_layers();
> >
> > int fb_id = -1;
> > + int fence_fd = -1;
> > DrmHwcRect<int> display_frame;
> > DrmHwcRect<float> source_crop;
> > uint64_t rotation = 0;
> > @@ -547,30 +548,12 @@ int
> > DrmDisplayCompositor::CommitFrame(DrmDisplayComposition
> > *display_comp,
> > break;
> > }
> > DrmHwcLayer &layer = layers[source_layers.front()];
> > - if (!test_only && layer.acquire_fence.get() >= 0) {
> > - int acquire_fence = layer.acquire_fence.get();
> > - int total_fence_timeout = 0;
> > - for (int i = 0; i < kAcquireWaitTries; ++i) {
> > - int fence_timeout = kAcquireWaitTimeoutMs * (1 << i);
> > - total_fence_timeout += fence_timeout;
> > - ret = sync_wait(acquire_fence, fence_timeout);
> > - if (ret)
> > - ALOGW("Acquire fence %d wait %d failed (%d). Total
> > time %d",
> > - acquire_fence, i, ret, total_fence_timeout);
> > - else
> > - break;
> > - }
> > - if (ret) {
> > - ALOGE("Failed to wait for acquire %d/%d", acquire_fence,
> > ret);
> > - break;
> > - }
> > - layer.acquire_fence.Close();
> > - }
> > if (!layer.buffer) {
> > ALOGE("Expected a valid framebuffer for pset");
> > break;
> > }
> > fb_id = layer.buffer->fb_id;
> > + fence_fd = layer.acquire_fence.get();
> > display_frame = layer.display_frame;
> > source_crop = layer.source_crop;
> > if (layer.blending == DrmHwcBlending::kPreMult)
> > @@ -587,7 +570,21 @@ int
> > DrmDisplayCompositor::CommitFrame(DrmDisplayComposition
> > *display_comp,
> > rotation |= 1 << DRM_ROTATE_180;
> > else if (layer.transform & DrmHwcTransform::kRotate270)
> > rotation |= 1 << DRM_ROTATE_270;
> > +
> > + if (fence_fd != -1) {
>
> nit: if (fence_fd < 0)
>
> With that fixed:
>
> Reviewed-by: Sean Paul <seanpaul at chromium.org>
Ack.
Submitting a fix in v3 tomorrow.
>
> > + int prop_id = plane->in_fence_fd_property().id();
> > + if (prop_id == 0) {
> > + ALOGE("Failed to get IN_FENCE_FD property id");
> > + break;
> > + }
> > + ret = drmModeAtomicAddProperty(pset, plane->id(), prop_id,
> > fence_fd);
> > + if (ret < 0) {
> > + ALOGE("Failed to add IN_FENCE_FD property to pset: %d",
> > ret);
> > + break;
> > + }
> > + }
> > }
> > +
> > // Disable the plane if there's no framebuffer
> > if (fb_id < 0) {
> > ret = drmModeAtomicAddProperty(pset, plane->id(),
> > --
> > 2.11.0
> >
More information about the dri-devel
mailing list