Module: Mesa Branch: main Commit: a8b2cfe877929b2400d1b8a9231234e2c77144ad URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a8b2cfe877929b2400d1b8a9231234e2c77144ad
Author: Yiwei Zhang <zzyi...@chromium.org> Date: Wed Sep 6 23:36:46 2023 -0700 venus: avoid modifier prop query in vn_android_get_image_builder AHB prop query would check the memory plane count match instead. This reduces vn_android_get_image_builder overhead and simplifies the AHB import api to prepare for later common vk ahb adoption. Signed-off-by: Yiwei Zhang <zzyi...@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25184> --- src/virtio/vulkan/vn_android.c | 42 ++++++++++++++++++++---------------- src/virtio/vulkan/vn_android.h | 2 -- src/virtio/vulkan/vn_device_memory.c | 2 +- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c index d86d7388dd7..8738d14a78d 100644 --- a/src/virtio/vulkan/vn_android.c +++ b/src/virtio/vulkan/vn_android.c @@ -116,6 +116,7 @@ struct cros_gralloc0_buffer_info { struct vn_android_gralloc_buffer_properties { uint32_t drm_fourcc; + uint32_t num_planes; uint64_t modifier; /* plane order matches VkImageDrmFormatModifierExplicitCreateInfoEXT */ @@ -142,7 +143,12 @@ vn_android_gralloc_get_buffer_properties( } out_props->drm_fourcc = info.drm_fourcc; + out_props->num_planes = 4; for (uint32_t i = 0; i < 4; i++) { + if (!info.stride[i]) { + out_props->num_planes = i; + break; + } out_props->stride[i] = info.stride[i]; out_props->offset[i] = info.offset[i]; } @@ -426,15 +432,8 @@ static VkResult vn_android_get_image_builder(struct vn_device *dev, const VkImageCreateInfo *create_info, const native_handle_t *handle, - const VkAllocationCallbacks *alloc, struct vn_android_image_builder *out_builder) { - VkResult result = VK_SUCCESS; - struct vn_android_gralloc_buffer_properties buf_props; - VkDrmFormatModifierPropertiesEXT mod_props; - uint32_t vcount = 0; - const VkFormat *vformats = NULL; - /* Android image builder is only used by ANB or AHB. For ANB, Android * Vulkan loader will never pass the below structs. For AHB, struct * vn_image_create_deferred_info will never carry below either. @@ -445,21 +444,17 @@ vn_android_get_image_builder(struct vn_device *dev, assert(!vk_find_struct_const(create_info->pNext, EXTERNAL_MEMORY_IMAGE_CREATE_INFO)); + struct vn_android_gralloc_buffer_properties buf_props; if (!vn_android_gralloc_get_buffer_properties(handle, &buf_props)) return VK_ERROR_INVALID_EXTERNAL_HANDLE; - result = vn_android_get_modifier_properties( - dev, create_info->format, buf_props.modifier, alloc, &mod_props); - if (result != VK_SUCCESS) - return result; - /* fill VkImageCreateInfo */ memset(out_builder, 0, sizeof(*out_builder)); out_builder->create = *create_info; out_builder->create.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT; /* fill VkImageDrmFormatModifierExplicitCreateInfoEXT */ - for (uint32_t i = 0; i < mod_props.drmFormatModifierPlaneCount; i++) { + for (uint32_t i = 0; i < buf_props.num_planes; i++) { out_builder->layouts[i].offset = buf_props.offset[i]; out_builder->layouts[i].rowPitch = buf_props.stride[i]; } @@ -468,7 +463,7 @@ vn_android_get_image_builder(struct vn_device *dev, VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT, .pNext = out_builder->create.pNext, .drmFormatModifier = buf_props.modifier, - .drmFormatModifierPlaneCount = mod_props.drmFormatModifierPlaneCount, + .drmFormatModifierPlaneCount = buf_props.num_planes, .pPlaneLayouts = out_builder->layouts, }; out_builder->create.pNext = &out_builder->modifier; @@ -496,7 +491,8 @@ vn_android_get_image_builder(struct vn_device *dev, * must include a VkImageFormatListCreateInfo structure with non-zero * viewFormatCount. */ - vformats = + uint32_t vcount = 0; + const VkFormat *vformats = vn_android_format_to_view_formats(create_info->format, &vcount); if (!vformats) { /* image builder struct persists through the image creation call */ @@ -559,7 +555,7 @@ vn_android_image_from_anb(struct vn_device *dev, local_create_info = *create_info; local_create_info.pNext = NULL; result = vn_android_get_image_builder(dev, &local_create_info, - anb_info->handle, alloc, &builder); + anb_info->handle, &builder); if (result != VK_SUCCESS) goto fail; @@ -714,6 +710,15 @@ vn_android_get_ahb_format_properties( if (result != VK_SUCCESS) return result; + if (mod_props.drmFormatModifierPlaneCount != buf_props.num_planes) { + vn_log(dev->instance, + "drmFormatModifierPlaneCount(%u) != buf_props.num_planes(%u) " + "for DRM format modifier(%" PRIu64 ")", + mod_props.drmFormatModifierPlaneCount, buf_props.num_planes, + buf_props.modifier); + return VK_ERROR_INVALID_EXTERNAL_HANDLE; + } + /* The spec requires that formatFeatures must include at least one of * VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT or * VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT. @@ -913,7 +918,6 @@ VkResult vn_android_device_import_ahb(struct vn_device *dev, struct vn_device_memory *mem, const VkMemoryAllocateInfo *alloc_info, - const VkAllocationCallbacks *alloc, struct AHardwareBuffer *ahb, bool internal_ahb) { @@ -944,7 +948,7 @@ vn_android_device_import_ahb(struct vn_device *dev, struct vn_android_image_builder builder; result = vn_android_get_image_builder(dev, &img->deferred_info->create, - handle, alloc, &builder); + handle, &builder); if (result != VK_SUCCESS) return result; @@ -1088,7 +1092,7 @@ vn_android_device_allocate_ahb(struct vn_device *dev, return VK_ERROR_OUT_OF_HOST_MEMORY; VkResult result = - vn_android_device_import_ahb(dev, mem, alloc_info, alloc, ahb, true); + vn_android_device_import_ahb(dev, mem, alloc_info, ahb, true); /* ahb alloc has already acquired a ref and import will acquire another, * must release one here to avoid leak. diff --git a/src/virtio/vulkan/vn_android.h b/src/virtio/vulkan/vn_android.h index 3659a3b582a..187ca4d0f64 100644 --- a/src/virtio/vulkan/vn_android.h +++ b/src/virtio/vulkan/vn_android.h @@ -45,7 +45,6 @@ VkResult vn_android_device_import_ahb(struct vn_device *dev, struct vn_device_memory *mem, const VkMemoryAllocateInfo *alloc_info, - const VkAllocationCallbacks *alloc, struct AHardwareBuffer *ahb, bool internal_ahb); @@ -105,7 +104,6 @@ static inline VkResult vn_android_device_import_ahb(UNUSED struct vn_device *dev, UNUSED struct vn_device_memory *mem, UNUSED const VkMemoryAllocateInfo *alloc_info, - UNUSED const VkAllocationCallbacks *alloc, UNUSED struct AHardwareBuffer *ahb, UNUSED bool internal_ahb) { diff --git a/src/virtio/vulkan/vn_device_memory.c b/src/virtio/vulkan/vn_device_memory.c index da618afc526..3c444a90896 100644 --- a/src/virtio/vulkan/vn_device_memory.c +++ b/src/virtio/vulkan/vn_device_memory.c @@ -588,7 +588,7 @@ vn_AllocateMemory(VkDevice device, VkDeviceMemory mem_handle = vn_device_memory_to_handle(mem); VkResult result; if (import_ahb_info) { - result = vn_android_device_import_ahb(dev, mem, pAllocateInfo, alloc, + result = vn_android_device_import_ahb(dev, mem, pAllocateInfo, import_ahb_info->buffer, false); } else if (export_ahb) { result = vn_android_device_allocate_ahb(dev, mem, pAllocateInfo, alloc);