diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c index 5948440b921..fc14da62ce2 100644 --- a/src/virtio/vulkan/vn_android.c +++ b/src/virtio/vulkan/vn_android.c @@ -11,6 +11,7 @@ #include "vn_android.h" #include "vn_common.h" +#include #include #include #include @@ -138,19 +139,6 @@ vn_image_from_anb(struct vn_device *dev, int dma_buf_fd = -1; int dup_fd = -1; - /* encoder will strip the Android specific pNext structs */ - result = vn_image_create(dev, image_info, alloc, &img); - if (result != VK_SUCCESS) - goto fail; - - image = vn_image_to_handle(img); - VkMemoryRequirements mem_req; - vn_GetImageMemoryRequirements(device, image, &mem_req); - if (!mem_req.memoryTypeBits) { - result = VK_ERROR_INVALID_EXTERNAL_HANDLE; - goto fail; - } - if (anb_info->handle->numFds != 1) { if (VN_DEBUG(WSI)) vn_log(dev->instance, "handle->numFds is %d, expected 1", @@ -165,6 +153,55 @@ vn_image_from_anb(struct vn_device *dev, goto fail; } + /* XXX fix this!!!!! */ + uint32_t offset = 0; + uint32_t bpp = 0; + switch (image_info->format) { + case VK_FORMAT_R8G8B8A8_UNORM: + case VK_FORMAT_R8G8B8A8_SRGB: + bpp = 4; + break; + case VK_FORMAT_R5G6B5_UNORM_PACK16: + bpp = 2; + break; + default: + result = VK_ERROR_INVALID_EXTERNAL_HANDLE; + goto fail; + }; + uint32_t stride = align(image_info->extent.width * bpp, 512); + uint64_t modifier = I915_FORMAT_MOD_X_TILED; + + const VkSubresourceLayout layout = { + .offset = offset, + .size = 0, + .rowPitch = stride, + .arrayPitch = 0, + .depthPitch = 0, + }; + const VkImageDrmFormatModifierExplicitCreateInfoEXT drm_mod_info = { + .sType = + VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT, + .pNext = image_info->pNext, + .drmFormatModifier = modifier, + .drmFormatModifierPlaneCount = 1, + .pPlaneLayouts = &layout, + }; + VkImageCreateInfo local_image_info = *image_info; + local_image_info.pNext = &drm_mod_info; + local_image_info.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT; + /* encoder will strip the Android specific pNext structs */ + result = vn_image_create(dev, &local_image_info, alloc, &img); + if (result != VK_SUCCESS) + goto fail; + + image = vn_image_to_handle(img); + VkMemoryRequirements mem_req; + vn_GetImageMemoryRequirements(device, image, &mem_req); + if (!mem_req.memoryTypeBits) { + result = VK_ERROR_INVALID_EXTERNAL_HANDLE; + goto fail; + } + VkMemoryFdPropertiesKHR fd_prop = { .sType = VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR, .pNext = NULL, diff --git a/src/virtio/vulkan/vn_device.c b/src/virtio/vulkan/vn_device.c index a45c72a2e85..c8135784c64 100644 --- a/src/virtio/vulkan/vn_device.c +++ b/src/virtio/vulkan/vn_device.c @@ -2967,8 +2967,12 @@ vn_device_fix_create_info(const struct vn_device *dev, uint32_t extra_count = 0; uint32_t block_count = 0; - if (dev->physical_device->wsi_device.supports_modifiers) - extra_exts[extra_count++] = "VK_EXT_image_drm_format_modifier"; +#if defined(VN_USE_WSI_PLATFORM) || defined(ANDROID) + if (dev->physical_device->base.base.supported_extensions + .EXT_image_drm_format_modifier) + extra_exts[extra_count++] = + VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME; +#endif if (dev->base.base.enabled_extensions.ANDROID_native_buffer) block_exts[block_count++] = VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME; diff --git a/src/virtio/vulkan/vn_device_memory.c b/src/virtio/vulkan/vn_device_memory.c index aca94999a4c..29dc4461907 100644 --- a/src/virtio/vulkan/vn_device_memory.c +++ b/src/virtio/vulkan/vn_device_memory.c @@ -225,6 +225,7 @@ vn_AllocateMemory(VkDevice device, } vn_instance_roundtrip(dev->instance); + /* XXX fix VkImportMemoryResourceInfoMESA to support memory planes */ const VkImportMemoryResourceInfoMESA import_memory_resource_info = { .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_RESOURCE_INFO_MESA, .pNext = pAllocateInfo->pNext,