diff --git a/src/nouveau/vulkan/nvk_device_memory.c b/src/nouveau/vulkan/nvk_device_memory.c index 3598398156f..f5b1cfcee7e 100644 --- a/src/nouveau/vulkan/nvk_device_memory.c +++ b/src/nouveau/vulkan/nvk_device_memory.c @@ -283,3 +283,22 @@ nvk_GetDeviceMemoryCommitment(VkDevice device, *pCommittedMemoryInBytes = mem->bo->size; } + +VKAPI_ATTR VkResult VKAPI_CALL +nvk_GetMemoryFdKHR(VkDevice _device, + const VkMemoryGetFdInfoKHR *pGetFdInfo, + int *pFD) +{ + VK_FROM_HANDLE(nvk_device, device, _device); + VK_FROM_HANDLE(nvk_device_memory, memory, pGetFdInfo->memory); + + switch (pGetFdInfo->handleType) { + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT: + if (nouveau_ws_bo_dma_buf(memory->bo, pFD)) + return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY); + return VK_SUCCESS; + default: + assert(!"unsupported handle type"); + return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT); + } +} diff --git a/src/nouveau/winsys/nouveau_bo.c b/src/nouveau/winsys/nouveau_bo.c index 150fd3fa297..1ee2bfee285 100644 --- a/src/nouveau/winsys/nouveau_bo.c +++ b/src/nouveau/winsys/nouveau_bo.c @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -121,3 +122,9 @@ nouveau_ws_bo_wait(struct nouveau_ws_bo *bo, enum nouveau_ws_bo_map_flags flags) return !drmCommandWrite(bo->fd, DRM_NOUVEAU_GEM_CPU_PREP, &req, sizeof(req)); } + +int +nouveau_ws_bo_dma_buf(struct nouveau_ws_bo *bo, int *fd) +{ + return drmPrimeHandleToFD(bo->fd, bo->handle, DRM_CLOEXEC, fd); +} diff --git a/src/nouveau/winsys/nouveau_bo.h b/src/nouveau/winsys/nouveau_bo.h index 218981c857c..53670cef3d1 100644 --- a/src/nouveau/winsys/nouveau_bo.h +++ b/src/nouveau/winsys/nouveau_bo.h @@ -57,6 +57,7 @@ struct nouveau_ws_bo *nouveau_ws_bo_new_tiled(struct nouveau_ws_device *, void nouveau_ws_bo_destroy(struct nouveau_ws_bo *); void *nouveau_ws_bo_map(struct nouveau_ws_bo *, enum nouveau_ws_bo_map_flags); bool nouveau_ws_bo_wait(struct nouveau_ws_bo *, enum nouveau_ws_bo_map_flags flags); +int nouveau_ws_bo_dma_buf(struct nouveau_ws_bo *, int *fd); static inline void nouveau_ws_bo_ref(struct nouveau_ws_bo *bo)