counterpart to the CreateDmaBufImageINTEL function, but far more convenient
Signed-off-by: Jonathan <jonat...@marek.ca> --- include/vulkan/vulkan_intel.h | 9 +++++++++ src/intel/vulkan/anv_intel.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/include/vulkan/vulkan_intel.h b/include/vulkan/vulkan_intel.h index 8ede61b..da99a7e 100644 --- a/include/vulkan/vulkan_intel.h +++ b/include/vulkan/vulkan_intel.h @@ -44,6 +44,8 @@ typedef struct VkDmaBufImageCreateInfo_ typedef VkResult (VKAPI_PTR *PFN_vkCreateDmaBufImageINTEL)(VkDevice device, const VkDmaBufImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMem, VkImage* pImage); +typedef VkResult (VKAPI_PTR *PFN_vkGetDmaBufINTEL)(VkDevice device, VkDeviceMemory mem, VkImage image, int *fd, uint32_t *pitch); + #ifndef VK_NO_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateDmaBufImageINTEL( @@ -53,6 +55,13 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateDmaBufImageINTEL( VkDeviceMemory* pMem, VkImage* pImage); +VKAPI_ATTR VkResult VKAPI_CALL vkGetDmaBufINTEL( + VkDevice _device, + VkDeviceMemory _mem, + VkImage _image, + int* fd, + uint32_t* pitch); + #endif #ifdef __cplusplus diff --git a/src/intel/vulkan/anv_intel.c b/src/intel/vulkan/anv_intel.c index d95d9af..d276754 100644 --- a/src/intel/vulkan/anv_intel.c +++ b/src/intel/vulkan/anv_intel.c @@ -98,3 +98,33 @@ VkResult anv_CreateDmaBufImageINTEL( return result; } + +VkResult anv_GetDmaBufINTEL( + VkDevice _device, + VkDeviceMemory _mem, + VkImage _image, + int* fd, + uint32_t* pitch) +{ + ANV_FROM_HANDLE(anv_device, device, _device); + ANV_FROM_HANDLE(anv_device_memory, mem, _mem); + ANV_FROM_HANDLE(anv_image, image, _image); + + struct anv_surface *surface = &image->color_surface; + + int tiling = surface->isl.tiling == ISL_TILING_X ? I915_TILING_X : + surface->isl.tiling == ISL_TILING_Y0 ? I915_TILING_Y : + I915_TILING_NONE; + int ret = anv_gem_set_tiling(device, mem->bo.gem_handle, + surface->isl.row_pitch, tiling); + if (ret) + return VK_ERROR_OUT_OF_DEVICE_MEMORY; + + ret = anv_gem_handle_to_fd(device, mem->bo.gem_handle); + if (ret == -1) + return VK_ERROR_OUT_OF_DEVICE_MEMORY; + + *fd = ret; + *pitch = surface->isl.row_pitch; + return VK_SUCCESS; +} -- 2.8.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev