[Mesa-dev] [PATCH 19/23] anv: Add flag NO_CLOSE_FD for anv_bo_cache_import()
Chad Versace
chadversary at chromium.org
Sat Sep 2 08:17:42 UTC 2017
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.
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
More information about the mesa-dev
mailing list