[Mesa-dev] [RFC v3 13/23] vulkan/wsi: Move linear alloc into radv

Dave Airlie airlied at gmail.com
Thu Sep 28 08:10:21 UTC 2017


If we get a nouveauv ever we would have to have this, so not really wanting
this.

Dave.

On 28 Sep. 2017 6:01 pm, "Louis-Francis Ratté-Boulianne" <lfrb at collabora.com>
wrote:

> From: Daniel Stone <daniels at collabora.com>
>
> This is pretty much radv-specific anyway.
>
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
>  src/amd/vulkan/radv_wsi.c           | 49 +++++++++++++++++++++++-------
> -------
>  src/intel/vulkan/anv_wsi.c          | 23 ++++++++---------
>  src/vulkan/wsi/wsi_common.h         |  4 ++-
>  src/vulkan/wsi/wsi_common_wayland.c |  1 -
>  src/vulkan/wsi/wsi_common_x11.c     | 44 ++++++++----------------------
> ---
>  5 files changed, 54 insertions(+), 67 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_wsi.c b/src/amd/vulkan/radv_wsi.c
> index cd2b36a57f..bcdbd7ffe9 100644
> --- a/src/amd/vulkan/radv_wsi.c
> +++ b/src/amd/vulkan/radv_wsi.c
> @@ -212,35 +212,40 @@ static VkResult
>  radv_wsi_image_create(VkDevice device_h,
>                       const VkSwapchainCreateInfoKHR *pCreateInfo,
>                       const VkAllocationCallbacks* pAllocator,
> -                     bool should_export,
>                       bool linear,
>                       struct wsi_image_base *wsi_image)
>  {
>         VkResult result = VK_SUCCESS;
>         struct radeon_surf *surface;
> -       VkImage image_h;
> -       VkDeviceMemory memory_h;
>         struct radv_image *image;
>
>         result = radv_wsi_image_alloc(device_h, pCreateInfo, pAllocator,
> -                                     linear, &image_h, &memory_h);
> +                                     false, &wsi_image->image,
> +                                     &wsi_image->memory);
>         if (result != VK_SUCCESS)
>                 return result;
>
> -       image = radv_image_from_handle(image_h);
> -       surface = &image->surface;
> -
> -       if (should_export) {
> -               RADV_FROM_HANDLE(radv_device, device, device_h);
> -               RADV_FROM_HANDLE(radv_device_memory, memory, memory_h);
> -               if (!radv_get_memory_fd(device, memory,
> &wsi_image->fds[0]))
> +       if (linear) {
> +               result = radv_wsi_image_alloc(device_h, pCreateInfo,
> pAllocator,
> +                                             true,
> &wsi_image->linear_image,
> +                                             &wsi_image->linear_memory);
> +               if (result != VK_SUCCESS)
>                         goto fail_alloc;
>         } else {
> -               wsi_image->fds[0] = -1;
> +               wsi_image->linear_image = VK_NULL_HANDLE;
> +               wsi_image->linear_memory = VK_NULL_HANDLE;
>         }
>
> -       wsi_image->image = image_h;
> -       wsi_image->memory = memory_h;
> +       RADV_FROM_HANDLE(radv_device_memory, memory,
> +                        linear ? wsi_image->linear_memory :
> wsi_image->memory);
> +       image = radv_image_from_handle(linear ? wsi_image->linear_image :
> +                                               wsi_image->image);
> +       surface = &image->surface;
> +
> +       RADV_FROM_HANDLE(radv_device, device, device_h);
> +       if (!radv_get_memory_fd(device, memory, &wsi_image->fds[0]))
> +               goto fail_linear;
> +
>         wsi_image->num_planes = 1;
>         wsi_image->sizes[0] = image->size;
>         wsi_image->offsets[0] = image->offset;
> @@ -253,9 +258,14 @@ radv_wsi_image_create(VkDevice device_h,
>
>         return VK_SUCCESS;
>
> - fail_alloc:
> -       radv_FreeMemory(device_h, memory_h, pAllocator);
> -       radv_DestroyImage(device_h, image_h, pAllocator);
> +fail_linear:
> +       if (wsi_image->linear_memory != VK_NULL_HANDLE)
> +               radv_FreeMemory(device_h, wsi_image->linear_memory,
> pAllocator);
> +       if (wsi_image->linear_image != VK_NULL_HANDLE)
> +               radv_DestroyImage(device_h, wsi_image->linear_image,
> pAllocator);
> +fail_alloc:
> +       radv_FreeMemory(device_h, wsi_image->memory, pAllocator);
> +       radv_DestroyImage(device_h, wsi_image->image, pAllocator);
>         return result;
>  }
>
> @@ -264,8 +274,11 @@ radv_wsi_image_free(VkDevice device,
>                     const VkAllocationCallbacks* pAllocator,
>                     struct wsi_image_base *wsi_image)
>  {
> +       if (wsi_image->linear_image != VK_NULL_HANDLE)
> +               radv_DestroyImage(device, wsi_image->linear_image,
> pAllocator);
> +       if (wsi_image->linear_memory != VK_NULL_HANDLE)
> +               radv_FreeMemory(device, wsi_image->linear_memory,
> pAllocator);
>         radv_DestroyImage(device, wsi_image->image, pAllocator);
> -
>         radv_FreeMemory(device, wsi_image->memory, pAllocator);
>  }
>
> diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c
> index 4454930d45..f59d349b50 100644
> --- a/src/intel/vulkan/anv_wsi.c
> +++ b/src/intel/vulkan/anv_wsi.c
> @@ -172,7 +172,6 @@ static VkResult
>  anv_wsi_image_create(VkDevice device_h,
>                       const VkSwapchainCreateInfoKHR *pCreateInfo,
>                       const VkAllocationCallbacks* pAllocator,
> -                     bool should_export,
>                       bool linear,
>                       struct wsi_image_base *wsi_image)
>  {
> @@ -249,22 +248,20 @@ anv_wsi_image_create(VkDevice device_h,
>        goto fail_alloc_memory;
>     }
>
> -   int fd;
> -   if (should_export) {
> -      fd = anv_gem_handle_to_fd(device, memory->bo->gem_handle);
> -      if (fd == -1) {
> -         /* FINISHME: Choose a better error. */
> -         result = vk_errorf(device->instance, device,
> -                            VK_ERROR_OUT_OF_DEVICE_MEMORY,
> -                            "handle_to_fd failed: %m");
> -         goto fail_alloc_memory;
> -      }
> -   } else {
> -      fd = -1;
> +   int fd = anv_gem_handle_to_fd(device, memory->bo->gem_handle);
> +   if (fd == -1) {
> +      /* FINISHME: Choose a better error. */
> +      result = vk_errorf(device->instance, device,
> +                         VK_ERROR_OUT_OF_DEVICE_MEMORY,
> +                         "handle_to_fd failed: %m");
> +      goto fail_alloc_memory;
>     }
>
>     wsi_image->image = image_h;
>     wsi_image->memory = memory_h;
> +   wsi_image->linear_image = VK_NULL_HANDLE;
> +   wsi_image->linear_memory = VK_NULL_HANDLE;
> +
>     wsi_image->num_planes = 1;
>     wsi_image->fds[0] = fd;
>     wsi_image->sizes[0] = image->size;
> diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h
> index b6c5a438b1..33fa8c2b0d 100644
> --- a/src/vulkan/wsi/wsi_common.h
> +++ b/src/vulkan/wsi/wsi_common.h
> @@ -33,6 +33,9 @@
>  struct wsi_image_base {
>     VkImage image;
>     VkDeviceMemory memory;
> +   VkImage linear_image;
> +   VkDeviceMemory linear_memory;
> +
>     int num_planes;
>     uint32_t sizes[4];
>     uint32_t offsets[4];
> @@ -45,7 +48,6 @@ struct wsi_image_fns {
>     VkResult (*create_wsi_image)(VkDevice device_h,
>                                  const VkSwapchainCreateInfoKHR
> *pCreateInfo,
>                                  const VkAllocationCallbacks *pAllocator,
> -                                bool should_export,
>                                  bool linear,
>                                  struct wsi_image_base *image_p);
>     void (*free_wsi_image)(VkDevice device,
> diff --git a/src/vulkan/wsi/wsi_common_wayland.c
> b/src/vulkan/wsi/wsi_common_wayland.c
> index a76e29d26e..8df30d993c 100644
> --- a/src/vulkan/wsi/wsi_common_wayland.c
> +++ b/src/vulkan/wsi/wsi_common_wayland.c
> @@ -730,7 +730,6 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
>     result = chain->base.image_fns->create_wsi_image(vk_device,
>                                                      pCreateInfo,
>                                                      pAllocator,
> -                                                    true,
>                                                      false,
>                                                      &image->base);
>     if (result != VK_SUCCESS)
> diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_
> x11.c
> index f9954d6e37..784d275dc5 100644
> --- a/src/vulkan/wsi/wsi_common_x11.c
> +++ b/src/vulkan/wsi/wsi_common_x11.c
> @@ -616,7 +616,6 @@ VkResult wsi_create_xlib_surface(const
> VkAllocationCallbacks *pAllocator,
>
>  struct x11_image {
>     struct wsi_image_base                     base;
> -   struct wsi_image_base                     linear_base;
>     xcb_pixmap_t                              pixmap;
>     bool                                      busy;
>     struct xshmfence *                        shm_fence;
> @@ -679,7 +678,7 @@ x11_get_image_and_linear(struct wsi_swapchain
> *drv_chain,
>  {
>     struct x11_swapchain *chain = (struct x11_swapchain *)drv_chain;
>     *image = chain->images[imageIndex].base.image;
> -   *linear_image = chain->images[imageIndex].linear_base.image;
> +   *linear_image = chain->images[imageIndex].base.linear_image;
>  }
>
>  static VkResult
> @@ -962,47 +961,32 @@ x11_image_init(VkDevice device_h, struct
> x11_swapchain *chain,
>     result = chain->base.image_fns->create_wsi_image(device_h,
>                                                      pCreateInfo,
>                                                      pAllocator,
> -
> !chain->base.needs_linear_copy,
> -                                                    false,
> +
> chain->base.needs_linear_copy,
>                                                      &image->base);
>     if (result != VK_SUCCESS)
>        return result;
>
> -   if (chain->base.needs_linear_copy) {
> -      result = chain->base.image_fns->create_wsi_image(device_h,
> -                                                       pCreateInfo,
> -                                                       pAllocator,
> -                                                       true,
> -                                                       true,
> -
>  &image->linear_base);
> -
> -      if (result != VK_SUCCESS) {
> -         chain->base.image_fns->free_wsi_image(device_h, pAllocator,
> -                                               &image->base);
> -         return result;
> -      }
> -   }
> +   /* The driver has decided to allocate a linear copy, for whatever
> reason. */
> +   if (image->base.linear_image != VK_NULL_HANDLE)
> +      chain->base.needs_linear_copy = true;
>
>     image->pixmap = xcb_generate_id(chain->conn);
>
> -   struct wsi_image_base *image_ws =
> -      chain->base.needs_linear_copy ? &image->linear_base : &image->base;
> -
>     /* Without passing modifiers, we can't have multi-plane RGB images. */
> -   assert(image_ws->num_planes == 1);
> +   assert(image->base.num_planes == 1);
>
>     cookie =
>        xcb_dri3_pixmap_from_buffer_checked(chain->conn,
>                                            image->pixmap,
>                                            chain->window,
> -                                          image_ws->sizes[0],
> +                                          image->base.sizes[0],
>                                            pCreateInfo->imageExtent.width,
>                                            pCreateInfo->imageExtent.
> height,
> -                                          image_ws->row_pitches[0],
> +                                          image->base.row_pitches[0],
>                                            chain->depth, bpp,
> -                                          image_ws->fds[0]);
> +                                          image->base.fds[0]);
>     xcb_discard_reply(chain->conn, cookie.sequence);
> -   image_ws->fds[0] = -1; /* XCB has now taken ownership of the FD */
> +   image->base.fds[0] = -1; /* XCB has now taken ownership of the FD */
>
>     int fence_fd = xshmfence_alloc_shm();
>     if (fence_fd < 0)
> @@ -1031,10 +1015,6 @@ fail_pixmap:
>     cookie = xcb_free_pixmap(chain->conn, image->pixmap);
>     xcb_discard_reply(chain->conn, cookie.sequence);
>
> -   if (chain->base.needs_linear_copy) {
> -      chain->base.image_fns->free_wsi_image(device_h, pAllocator,
> -                                            &image->linear_base);
> -   }
>     chain->base.image_fns->free_wsi_image(device_h, pAllocator,
> &image->base);
>
>     return result;
> @@ -1054,10 +1034,6 @@ x11_image_finish(struct x11_swapchain *chain,
>     cookie = xcb_free_pixmap(chain->conn, image->pixmap);
>     xcb_discard_reply(chain->conn, cookie.sequence);
>
> -   if (chain->base.needs_linear_copy) {
> -      chain->base.image_fns->free_wsi_image(chain->base.device,
> pAllocator,
> -                                            &image->linear_base);
> -   }
>     chain->base.image_fns->free_wsi_image(chain->base.device, pAllocator,
>                                           &image->base);
>  }
> --
> 2.13.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170928/5fd46caf/attachment-0001.html>


More information about the mesa-dev mailing list