[Mesa-dev] [PATCH 19/23] anv: Add flag NO_CLOSE_FD for anv_bo_cache_import()
Jason Ekstrand
jason at jlekstrand.net
Sat Sep 2 17:03:23 UTC 2017
On Sat, Sep 2, 2017 at 1:17 AM, Chad Versace <chadversary at chromium.org>
wrote:
> This patch adds a flag param to anv_bo_cache_import() and defines
> exactly one flag, ANV_BO_CACHE_IMPORT_NO_CLOSE_FD. If set, the function
> will not close the fd.
>
The other option (which I think I like better) would be to move the call to
close(fd) to the two callers of anv_bo_cache_import. That puts Vulkan
extension API details with the extension implementation and not in the bo
cache.
> This prepares for implementing VK_ANDROID_native_buffer, which must not
> close the imported fd.
> ---
> src/intel/vulkan/anv_allocator.c | 26 +++++++++++++++-----------
> src/intel/vulkan/anv_device.c | 2 +-
> src/intel/vulkan/anv_intel.c | 2 +-
> src/intel/vulkan/anv_private.h | 10 +++++++++-
> src/intel/vulkan/anv_queue.c | 2 +-
> 5 files changed, 27 insertions(+), 15 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_
> allocator.c
> index 708b32b3452..28d00f4d0b2 100644
> --- a/src/intel/vulkan/anv_allocator.c
> +++ b/src/intel/vulkan/anv_allocator.c
> @@ -1270,7 +1270,9 @@ anv_bo_cache_alloc(struct anv_device *device,
> VkResult
> anv_bo_cache_import(struct anv_device *device,
> struct anv_bo_cache *cache,
> - int fd, uint64_t size, struct anv_bo **bo_out)
> + int fd, uint64_t size,
> + anv_bo_cache_import_flags_t flags,
> + struct anv_bo **bo_out)
> {
> pthread_mutex_lock(&cache->mutex);
>
> @@ -1323,16 +1325,18 @@ anv_bo_cache_import(struct anv_device *device,
>
> pthread_mutex_unlock(&cache->mutex);
>
> - /* From the Vulkan spec:
> - *
> - * "Importing memory from a file descriptor transfers ownership of
> - * the file descriptor from the application to the Vulkan
> - * implementation. The application must not perform any operations
> on
> - * the file descriptor after a successful import."
> - *
> - * If the import fails, we leave the file descriptor open.
> - */
> - close(fd);
> + if (!(flags & ANV_BO_CACHE_IMPORT_NO_CLOSE_FD)) {
> + /* From the Vulkan spec:
> + *
> + * "Importing memory from a file descriptor transfers ownership
> of
> + * the file descriptor from the application to the Vulkan
> + * implementation. The application must not perform any
> operations on
> + * the file descriptor after a successful import."
> + *
> + * If the import fails, we leave the file descriptor open.
> + */
> + close(fd);
> + }
>
> *bo_out = &bo->bo;
>
> diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
> index d026b541b01..095e18ebb95 100644
> --- a/src/intel/vulkan/anv_device.c
> +++ b/src/intel/vulkan/anv_device.c
> @@ -1482,7 +1482,7 @@ VkResult anv_AllocateMemory(
>
> result = anv_bo_cache_import(device, &device->bo_cache,
> fd_info->fd,
> pAllocateInfo->allocationSize,
> - &mem->bo);
> + 0, &mem->bo);
> if (result != VK_SUCCESS)
> goto fail;
> } else {
> diff --git a/src/intel/vulkan/anv_intel.c b/src/intel/vulkan/anv_intel.c
> index 172ae1dabf2..2653ff8e362 100644
> --- a/src/intel/vulkan/anv_intel.c
> +++ b/src/intel/vulkan/anv_intel.c
> @@ -52,7 +52,7 @@ VkResult anv_CreateDmaBufImageINTEL(
> uint64_t size = (uint64_t)pCreateInfo->strideInBytes *
> pCreateInfo->extent.height;
>
> result = anv_bo_cache_import(device, &device->bo_cache,
> - pCreateInfo->fd, size, &mem->bo);
> + pCreateInfo->fd, size, 0, &mem->bo);
> if (result != VK_SUCCESS)
> goto fail;
>
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_
> private.h
> index d1c3d743061..014848fcef2 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -586,6 +586,12 @@ struct anv_bo_cache {
> pthread_mutex_t mutex;
> };
>
> +enum anv_bo_cache_import_bits {
> + /** Do not close the fd after import. */
> + ANV_BO_CACHE_IMPORT_NO_CLOSE_FD = (1 << 0),
> +};
> +typedef uint32_t anv_bo_cache_import_flags_t;
> +
> VkResult anv_bo_cache_init(struct anv_bo_cache *cache);
> void anv_bo_cache_finish(struct anv_bo_cache *cache);
> VkResult anv_bo_cache_alloc(struct anv_device *device,
> @@ -593,7 +599,9 @@ VkResult anv_bo_cache_alloc(struct anv_device *device,
> uint64_t size, struct anv_bo **bo);
> VkResult anv_bo_cache_import(struct anv_device *device,
> struct anv_bo_cache *cache,
> - int fd, uint64_t size, struct anv_bo **bo);
> + int fd, uint64_t size,
> + anv_bo_cache_import_flags_t flags,
> + struct anv_bo **bo);
> VkResult anv_bo_cache_export(struct anv_device *device,
> struct anv_bo_cache *cache,
> struct anv_bo *bo_in, int *fd_out);
> diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c
> index 21ca66757e6..c68657b6f5e 100644
> --- a/src/intel/vulkan/anv_queue.c
> +++ b/src/intel/vulkan/anv_queue.c
> @@ -1031,7 +1031,7 @@ VkResult anv_ImportSemaphoreFdKHR(
> new_impl.type = ANV_SEMAPHORE_TYPE_BO;
>
> VkResult result = anv_bo_cache_import(device, &device->bo_cache,
> - fd, 4096, &new_impl.bo);
> + fd, 4096, 0, &new_impl.bo
> );
> if (result != VK_SUCCESS)
> return result;
>
> --
> 2.13.5
>
> _______________________________________________
> 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/20170902/670cb025/attachment.html>
More information about the mesa-dev
mailing list