Mesa (master): venus: use VK_EXT_image_drm_format_modifier

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Apr 27 00:25:55 UTC 2021


Module: Mesa
Branch: master
Commit: 95844b0978eb378290e04a4c2dbef8227299ee89
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=95844b0978eb378290e04a4c2dbef8227299ee89

Author: Yiwei Zhang <zzyiwei at chromium.org>
Date:   Thu Apr 22 21:01:44 2021 +0000

venus: use VK_EXT_image_drm_format_modifier

This commit contains a hack to retrieve extended buffer info, which will
be fixed by moving the logic into gralloc HAL implementation.

With this hack, the rendering result is correct.

Signed-off-by: Yiwei Zhang <zzyiwei at chromium.org>
Reviewed-by: Chia-I Wu <olvaffe at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10259>

---

 src/virtio/vulkan/vn_android.c       | 63 ++++++++++++++++++++++++++++--------
 src/virtio/vulkan/vn_device.c        |  8 +++--
 src/virtio/vulkan/vn_device_memory.c |  1 +
 3 files changed, 57 insertions(+), 15 deletions(-)

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 <drm/drm_fourcc.h>
 #include <hardware/hwvulkan.h>
 #include <vndk/hardware_buffer.h>
 #include <vulkan/vk_icd.h>
@@ -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,



More information about the mesa-commit mailing list