[PATCH hwc v2 3/6] drm_hwcomposer: Submit in-fence to DRM

Sean Paul seanpaul at chromium.org
Wed Sep 27 18:55:21 UTC 2017


On Wed, Sep 27, 2017 at 7:58 AM, Robert Foss <robert.foss at collabora.com> 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>

> +        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