[igt-dev] [PATCH i-g-t v26 13/35] lib/intel_bufops: Add init with handle and size function

Jason Ekstrand jason at jlekstrand.net
Wed Mar 17 21:36:54 UTC 2021


On Wed, Mar 17, 2021 at 9:46 AM Zbigniew Kempczyński
<zbigniew.kempczynski at intel.com> wrote:
>
> For some cases (fb with compression) fb size is bigger than calculated
> intel_buf what lead to execbuf failure when allocator is used
> along with EXEC_OBJECT_PINNED flag set for all objects.
>
> We need to create intel_buf with size equal to fb so new function
> in which we pass handle and size is required.
>
> Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> Cc: Dominik Grzegorzek <dominik.grzegorzek at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  lib/intel_bufops.c | 33 ++++++++++++++++++++++++++++-----
>  lib/intel_bufops.h |  7 +++++++
>  2 files changed, 35 insertions(+), 5 deletions(-)
>
> diff --git a/lib/intel_bufops.c b/lib/intel_bufops.c
> index eb5ac4dad..d8eb64e3a 100644
> --- a/lib/intel_bufops.c
> +++ b/lib/intel_bufops.c
> @@ -708,7 +708,8 @@ static void __intel_buf_init(struct buf_ops *bops,
>                              uint32_t handle,
>                              struct intel_buf *buf,
>                              int width, int height, int bpp, int alignment,
> -                            uint32_t req_tiling, uint32_t compression)
> +                            uint32_t req_tiling, uint32_t compression,
> +                            uint64_t bo_size)
>  {
>         uint32_t tiling = req_tiling;
>         uint64_t size;
> @@ -758,7 +759,7 @@ static void __intel_buf_init(struct buf_ops *bops,
>                 buf->ccs[0].offset = buf->surface[0].stride * ALIGN(height, 32);
>                 buf->ccs[0].stride = aux_width;
>
> -               size = buf->ccs[0].offset + aux_width * aux_height;
> +               size = max(bo_size, buf->ccs[0].offset + aux_width * aux_height);
>         } else {
>                 if (tiling) {
>                         devid =  intel_get_drm_devid(bops->fd);
> @@ -773,7 +774,7 @@ static void __intel_buf_init(struct buf_ops *bops,
>                 buf->tiling = tiling;
>                 buf->bpp = bpp;
>
> -               size = buf->surface[0].stride * ALIGN(height, align_h);
> +               size = max(bo_size, buf->surface[0].stride * ALIGN(height, align_h));

Do we want to take a max() here or do something like this afterwards:

if (bo_size > 0) {
    igt_assert(bo_size >= size);
    buf->size = bo_size;
} else {
    buf->size = size;
}

>         }
>
>         /* Store real bo size to avoid mistakes in calculating it again */
> @@ -809,7 +810,7 @@ void intel_buf_init(struct buf_ops *bops,
>                     uint32_t tiling, uint32_t compression)
>  {
>         __intel_buf_init(bops, 0, buf, width, height, bpp, alignment,
> -                        tiling, compression);
> +                        tiling, compression, 0);
>
>         intel_buf_set_ownership(buf, true);
>  }
> @@ -858,7 +859,7 @@ void intel_buf_init_using_handle(struct buf_ops *bops,
>                                  uint32_t req_tiling, uint32_t compression)
>  {
>         __intel_buf_init(bops, handle, buf, width, height, bpp, alignment,
> -                        req_tiling, compression);
> +                        req_tiling, compression, 0);
>  }
>
>  /**
> @@ -927,6 +928,28 @@ struct intel_buf *intel_buf_create_using_handle(struct buf_ops *bops,
>         return buf;
>  }
>
> +struct intel_buf *intel_buf_create_using_handle_and_size(struct buf_ops *bops,
> +                                                        uint32_t handle,
> +                                                        int width, int height,
> +                                                        int bpp, int alignment,
> +                                                        uint32_t req_tiling,
> +                                                        uint32_t compression,
> +                                                        uint64_t size)
> +{
> +       struct intel_buf *buf;
> +
> +       igt_assert(bops);
> +
> +       buf = calloc(1, sizeof(*buf));
> +       igt_assert(buf);
> +
> +       __intel_buf_init(bops, handle, buf, width, height, bpp, alignment,
> +                        req_tiling, compression, size);
> +
> +       return buf;
> +}
> +
> +
>  /**
>   * intel_buf_destroy
>   * @buf: intel_buf
> diff --git a/lib/intel_bufops.h b/lib/intel_bufops.h
> index 5619fc6fa..54480bff6 100644
> --- a/lib/intel_bufops.h
> +++ b/lib/intel_bufops.h
> @@ -139,6 +139,13 @@ struct intel_buf *intel_buf_create_using_handle(struct buf_ops *bops,
>                                                 uint32_t req_tiling,
>                                                 uint32_t compression);
>
> +struct intel_buf *intel_buf_create_using_handle_and_size(struct buf_ops *bops,
> +                                                        uint32_t handle,
> +                                                        int width, int height,
> +                                                        int bpp, int alignment,
> +                                                        uint32_t req_tiling,
> +                                                        uint32_t compression,
> +                                                        uint64_t size);
>  void intel_buf_destroy(struct intel_buf *buf);
>
>  void *intel_buf_cpu_map(struct intel_buf *buf, bool write);
> --
> 2.26.0
>


More information about the igt-dev mailing list