I followed your suggestions and changed the prototype, although the implementation only supports basic formats --- include/vulkan/vulkan_intel.h | 17 +++++++++++++++ src/intel/vulkan/anv_intel.c | 49 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+)
diff --git a/include/vulkan/vulkan_intel.h b/include/vulkan/vulkan_intel.h index 8ede61b..b483877 100644 --- a/include/vulkan/vulkan_intel.h +++ b/include/vulkan/vulkan_intel.h @@ -44,6 +44,17 @@ typedef struct VkDmaBufImageCreateInfo_ typedef VkResult (VKAPI_PTR *PFN_vkCreateDmaBufImageINTEL)(VkDevice device, const VkDmaBufImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMem, VkImage* pImage); +typedef struct VkDmaBufINTEL { + int fd; /* device fd */ + uint32_t format; /* fourcc code */ + uint32_t handles[4]; /* prime handles (not fd) */ + uint32_t pitches[4]; + uint32_t offsets[4]; + uint64_t modifiers[4]; /* tiling */ +} VkDmaBufINTEL; + +typedef VkResult (VKAPI_PTR *PFN_vkGetDmaBufINTEL)(VkDevice device, VkDeviceMemory mem, VkImage image, VkDmaBufINTEL *out); + #ifndef VK_NO_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateDmaBufImageINTEL( @@ -53,6 +64,12 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateDmaBufImageINTEL( VkDeviceMemory* pMem, VkImage* pImage); +VKAPI_ATTR VkResult VKAPI_CALL vkGetDmaBufINTEL( + VkDevice _device, + VkDeviceMemory _mem, + VkImage _image, + VkDmaBufINTEL* out); + #endif #ifdef __cplusplus diff --git a/src/intel/vulkan/anv_intel.c b/src/intel/vulkan/anv_intel.c index d95d9af..d8b95c7 100644 --- a/src/intel/vulkan/anv_intel.c +++ b/src/intel/vulkan/anv_intel.c @@ -26,6 +26,7 @@ #include <string.h> #include <unistd.h> #include <fcntl.h> +#include <drm_fourcc.h> #include "anv_private.h" @@ -98,3 +99,51 @@ VkResult anv_CreateDmaBufImageINTEL( return result; } + +static uint64_t isl_tiling_to_modifier(int tiling) +{ + switch (tiling) { + case ISL_TILING_LINEAR: + return 0; + case ISL_TILING_X: + return I915_FORMAT_MOD_X_TILED; + case ISL_TILING_Y0: + return I915_FORMAT_MOD_Y_TILED; + case ISL_TILING_Yf: + return I915_FORMAT_MOD_Yf_TILED; + } + assert(!"no isl_tiling -> modifier conversion"); +} + +static uint32_t isl_format_to_drm_format(int format) +{ + switch (format) { + case ISL_FORMAT_R8G8B8A8_UNORM: + return DRM_FORMAT_RGBA8888; + case ISL_FORMAT_B8G8R8A8_UNORM: + return DRM_FORMAT_BGRA8888; + } + assert(!"no isl_format -> drm_format conversion"); +} + +VkResult anv_GetDmaBufINTEL( + VkDevice _device, + VkDeviceMemory _mem, + VkImage _image, + VkDmaBufINTEL* out) +{ + 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; + + memset(out, 0, sizeof(*out)); + out->fd = device->fd; + out->format = isl_format_to_drm_format(surface->isl.format); + out->handles[0] = mem->bo.gem_handle; + out->pitches[0] = surface->isl.row_pitch; + out->modifiers[0] = isl_tiling_to_modifier(surface->isl.tiling); + + return VK_SUCCESS; +} -- 2.8.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev